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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 });