Mercurial > prosody-modules
annotate mod_dnsbl/mod_dnsbl.lua @ 6514:668b1f0a4dc6
mod_c2s_limit_sessions: Fix check when it's the first connection
Creation of the sessions[username] entry happens after the
"pre-resource-bind" event, before the "resource-bind" event.
Thus, for a users first connection, it may not exist.
This led to an 'attempt to index a nil value' error, fixed here.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 08 Apr 2026 15:56:38 +0200 |
| parents | f61564e11d3b |
| children |
| rev | line source |
|---|---|
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 local lfs = require "lfs"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 local adns = require "net.adns"; |
|
6499
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
4 local async = require "util.async"; |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 local it = require "util.iterators"; |
|
6426
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
6 local hex = require "util.hex"; |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 local parse_cidr = require "util.ip".parse_cidr; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 local parse_ip = require "util.ip".new_ip; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 local promise = require "util.promise"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 local set = require "util.set"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 local st = require "util.stanza"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 local render_message = require "util.interpolation".new("%b{}", function (s) |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 return s; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 end); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 local trie = module:require("mod_anti_spam/trie"); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 local dnsbls_config_raw = module:get_option("dnsbls"); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 local default_dnsbl_flag = module:get_option_string("dnsbl_flag", "dnsbl_hit"); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 local default_dnsbl_message = module:get_option("dnsbl_message"); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 if not dnsbls_config_raw then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 module:log_status("error", "No 'dnsbls' in config file"); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 return; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 |
|
6499
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
28 local is_host_anonymous = module:get_option_string("authentication") == "anonymous"; |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
29 |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 local dnsbls = set.new(); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 local dnsbls_config = {}; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 for k, v in ipairs(dnsbls_config_raw) do |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 local dnsbl_name, dnsbl_config; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 if type(k) == "string" then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 dnsbl_name = k; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 dnsbl_config = v; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 else |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 dnsbl_name = v; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 dnsbl_config = {}; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 dnsbls:add(dnsbl_name); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 dnsbls_config[dnsbl_name] = dnsbl_config; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 local function read_dnsbl_file(filename) |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 local t = trie.new(); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 local f, err = io.open(filename); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 if not f then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 module:log("error", "Failed to read file: %s", err); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 return t; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 local n_line, n_added = 0, 0; |
|
6509
f61564e11d3b
various: Adjust for loop variables becoming constants in Lua 5.5
Kim Alvefur <zash@zash.se>
parents:
6499
diff
changeset
|
55 for rawline in f:lines() do |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 n_line = n_line + 1; |
|
6509
f61564e11d3b
various: Adjust for loop variables becoming constants in Lua 5.5
Kim Alvefur <zash@zash.se>
parents:
6499
diff
changeset
|
57 local line = rawline:gsub("#.+$", ""):match("^%s*(.-)%s*$"); |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 if line == "" then -- luacheck: ignore 542 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 -- Skip |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 else |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 local parsed_ip, parsed_bits = parse_cidr(line); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 if not parsed_ip then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 -- Skip |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 module:log("warn", "Failed to parse IP/CIDR on %s:%d", filename, n_line); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 else |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 if not parsed_bits then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 -- Default to full length of IP address |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 parsed_bits = #parsed_ip.packed * 8; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 t:add_subnet(parsed_ip, parsed_bits); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 n_added = n_added + 1; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 module:log("info", "Loaded %d entries from %s", n_added, filename); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 return t; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 local ipsets = {}; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 local ipsets_last_updated = {}; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 function reload_file_dnsbls() |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 for dnsbl in dnsbls do |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 if dnsbl:byte(1) == 64 then -- '@' |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 local filename = dnsbl:sub(2); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 local file_last_updated = lfs.attributes(filename, "change"); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 if (ipsets_last_updated[dnsbl] or 0) < file_last_updated then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 ipsets[dnsbl] = read_dnsbl_file(filename); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 ipsets_last_updated[dnsbl] = file_last_updated; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 module:hook_global("config-reloaded", reload_file_dnsbls); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 reload_file_dnsbls(); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 local mod_flags = module:depends("flags"); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 local function reverse(ip, suffix) |
|
6426
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
103 if ip.proto == "IPv4" then |
|
6492
b82fceda0abc
mod_dnsbl: Fix IPv4 lookups (double reverse)
Matthew Wild <mwild1@gmail.com>
parents:
6426
diff
changeset
|
104 local query_string = ip.packed; |
|
6493
ccbba57cacb5
mod_dnsbl: Optimize by reducing method calls (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6492
diff
changeset
|
105 local a, b, c, d = query_string:byte(1, 4); |
|
ccbba57cacb5
mod_dnsbl: Optimize by reducing method calls (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6492
diff
changeset
|
106 return ("%d.%d.%d.%d.%s"):format(d, c, b, a, suffix); |
|
6426
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
107 elseif ip.proto == "IPv6" then |
|
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
108 return hex.encode(ip.packed):reverse():gsub("%x", "%1.")..suffix; |
|
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
109 end |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 function check_dnsbl(ip_address, dnsbl, callback, ud) |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 if dnsbl:byte(1) == 64 then -- '@' |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 local parsed_ip = parse_ip(ip_address); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 if not parsed_ip then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 module:log("warn", "Failed to parse IP address: %s", ip_address); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 callback(ud, false, dnsbl); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 return; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 callback(ud, not not ipsets[dnsbl]:contains_ip(parsed_ip), dnsbl); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 return; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 else |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 if ip_address:sub(1,7):lower() == "::ffff:" then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 ip_address = ip_address:sub(8); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 |
|
6426
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
127 local parsed_ip = parse_ip(ip_address); |
|
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
128 |
|
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
129 local rbl_ip = reverse(parsed_ip, dnsbl); |
|
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
130 if not rbl_ip then |
|
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
131 module:log("warn", "Unable to query dnsbls for invalid IP: %s", parsed_ip.proto); |
|
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
132 return; |
|
bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
6425
diff
changeset
|
133 end |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 module:log("debug", "Sending DNSBL lookup for %s", ip_address); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 adns.lookup(function (reply) |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 local hit = not not (reply and reply[1]); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 module:log("debug", "Received DNSBL result for %s: %s", ip_address, hit and "present" or "absent"); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 callback(ud, hit, dnsbl); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 end, rbl_ip); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 local function handle_dnsbl_register_result(registration_event, hit, dnsbl) |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 if not hit then return; end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 if registration_event.dnsbl_match then return; end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 registration_event.dnsbl_match = true; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 local username = registration_event.username; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 local flag = dnsbls_config[dnsbl].flag or default_dnsbl_flag; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 module:log("info", "Flagging %s for user %s registered from %s matching %s", flag, username, registration_event.ip, dnsbl); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 mod_flags:add_flag(username, flag, "Matched "..dnsbl); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 local msg = dnsbls_config[dnsbl].message or default_dnsbl_message; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 if msg then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 module:log("debug", "Sending warning message to %s", username); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 local msg_stanza = st.message( |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 { |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 to = username.."@"..module.host; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 from = module.host; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 }, |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 render_message(msg, { registration = registration_event }) |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 ); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 module:send(msg_stanza); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 module:hook("user-registered", function (event) |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 local session = event.session; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 local ip = event.ip or (session and session.ip); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 if not ip then return; end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 if not event.ip then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 event.ip = ip; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 for dnsbl in dnsbls do |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 check_dnsbl(ip, dnsbl, handle_dnsbl_register_result, event); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 end); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 |
|
6499
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
186 if is_host_anonymous then |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
187 module:hook("resource-bind", function (event) |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
188 local session = event.session; |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
189 local username, ip = session.username, session.ip; |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
190 if not ip then return; end |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
191 |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
192 local queries = {}; |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
193 for dnsbl in dnsbls do |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
194 queries[dnsbl] = promise.new(function (resolve) |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
195 check_dnsbl(ip, dnsbl, function (_, hit) |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
196 resolve(hit); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
197 end); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
198 end); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
199 end |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
200 local results, err = async.wait_for(promise.all_settled(queries)); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
201 if not results then |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
202 module:log("warn", "Failed to query dnsbls: %s", err); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
203 return; |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
204 end |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
205 local any_match, any_error; |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
206 for dnsbl, result in pairs(results) do |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
207 if result.status == "fulfilled" and result.value == true then |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
208 local flag = dnsbls_config[dnsbl].flag or default_dnsbl_flag; |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
209 module:log("info", "Flagging %s for anonymous user %s connecting from %s matching %s", flag, username, ip, dnsbl); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
210 mod_flags:add_flag(username, flag, "Matched "..dnsbl); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
211 any_match = true; |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
212 elseif result.status == "rejected" then |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
213 any_error = true; |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
214 end |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
215 end |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
216 if not any_match then |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
217 if not any_error then |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
218 module:log("debug", "DNSBLs all clear for this IP address"); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
219 else |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
220 module:log("debug", "Errors were encountered while querying DNSBLs"); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
221 end |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
222 end |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
223 end); |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
224 end |
|
1213145e27fc
mod_dnsbl: Support for anonymous hosts
Matthew Wild <mwild1@gmail.com>
parents:
6493
diff
changeset
|
225 |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
226 module:add_item("account-trait", { |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
227 name = "register-dnsbl-hit"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
228 prob_bad_true = 0.6; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
229 prob_bad_false = 0.4; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
230 }); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
231 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
232 module:hook("get-account-traits", function (event) |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
233 event.traits["register-dnsbl-hit"] = mod_flags.has_flag(event.username, default_dnsbl_flag); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
234 end); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
235 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
236 module:add_item("shell-command", { |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
237 section = "dnsbl"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
238 section_desc = "Manage DNS blocklists"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
239 name = "lists"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
240 desc = "Show all lists currently in use on the specified host"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
241 args = { |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
242 { name = "host", type = "string" }; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
243 }; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
244 host_selector = "host"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
245 handler = function(self, host) --luacheck: ignore 212/self 212/host |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
246 local count = 0; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
247 for list in dnsbls do |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
248 count = count + 1; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
249 self.session.print(list); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
250 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
251 return true, ("%d lists"):format(count); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
252 end; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
253 }); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
254 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
255 module:add_item("shell-command", { |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
256 section = "dnsbl"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
257 section_desc = "Manage DNS blocklists"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
258 name = "check"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
259 desc = "Check an IP against the configured block lists"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
260 args = { |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
261 { name = "host", type = "string" }; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
262 { name = "ip_address", type = "string" }; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
263 }; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
264 host_selector = "host"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
265 handler = function(self, host, ip_address) --luacheck: ignore 212/self 212/host |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
266 local parsed_ip = parse_ip(ip_address); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
267 if not parsed_ip then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
268 return false, "Failed to parse IP address"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
269 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
270 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
271 local matches, total = 0, 0; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
272 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
273 local promises = {}; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
274 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
275 for dnsbl in dnsbls do |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
276 total = total + 1; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
277 promises[dnsbl] = promise.new(function (resolve) |
|
6425
987f0ee7d395
mod_dnsbl: Fix incorrect result from lookup
Matthew Wild <mwild1@gmail.com>
parents:
6424
diff
changeset
|
278 check_dnsbl(parsed_ip.normal, dnsbl, function (_, hit) |
|
987f0ee7d395
mod_dnsbl: Fix incorrect result from lookup
Matthew Wild <mwild1@gmail.com>
parents:
6424
diff
changeset
|
279 resolve(hit); |
|
987f0ee7d395
mod_dnsbl: Fix incorrect result from lookup
Matthew Wild <mwild1@gmail.com>
parents:
6424
diff
changeset
|
280 end); |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
281 end); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
282 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
283 |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
284 return promise.all_settled(promises):next(function (results) |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
285 for dnsbl, result in it.sorted_pairs(results) do |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
286 local msg; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
287 if result.status == "fulfilled" then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
288 if result.value then |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
289 msg = "[X]"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
290 matches = matches + 1; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
291 else |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
292 msg = "[ ]"; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
293 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
294 else |
|
6424
ec4a0e4d950e
mod_dnsbl: Fix result and error handling in shell command
Matthew Wild <mwild1@gmail.com>
parents:
6133
diff
changeset
|
295 msg = "[E]"; |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
296 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
297 |
|
6424
ec4a0e4d950e
mod_dnsbl: Fix result and error handling in shell command
Matthew Wild <mwild1@gmail.com>
parents:
6133
diff
changeset
|
298 self.session.print(msg, dnsbl); |
|
ec4a0e4d950e
mod_dnsbl: Fix result and error handling in shell command
Matthew Wild <mwild1@gmail.com>
parents:
6133
diff
changeset
|
299 if result.status == "rejected" then |
|
ec4a0e4d950e
mod_dnsbl: Fix result and error handling in shell command
Matthew Wild <mwild1@gmail.com>
parents:
6133
diff
changeset
|
300 self.session.print(" ", "Error checking list: "..(result.reason:gsub("\n", "\n \t"))); |
|
ec4a0e4d950e
mod_dnsbl: Fix result and error handling in shell command
Matthew Wild <mwild1@gmail.com>
parents:
6133
diff
changeset
|
301 end |
|
6133
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
302 end |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
303 return ("Found in %d of %d lists"):format(matches, total); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
304 end); |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
305 end; |
|
99860e1b817d
mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
306 }); |
