Mercurial > prosody-modules
annotate mod_dnsbl/mod_dnsbl.lua @ 6556:7477e97a9045
mod_firewall: Apply pre-reload state before re-reading config
This change makes load/reload a bit more robust. module.load() runs before
module.restore() and it reads from the config and updates the state (if
needed).
However, after this, module.restore() could run and apply the old state again.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 24 May 2026 20:03:20 +0100 |
| 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 }); |
