Annotate

mod_dnsbl/mod_dnsbl.lua @ 6195:886c985ece61

mod_lastlog2: Skip initializing internal API (and storage) in prosodyctl Initializing storage in the global context under prosodyctl causes the module.command to fail to execute because the storage module has already been loaded. Introduced in 7b722955c59b
author Kim Alvefur <zash@zash.se>
date Sat, 08 Feb 2025 14:12:18 +0100
parent 6161:99860e1b817d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6161
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";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local it = require "util.iterators";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 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
6 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
7 local promise = require "util.promise";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local set = require "util.set";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local st = require "util.stanza";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 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
12 return s;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 end);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 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
16
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 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
18 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
19 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
20
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 if not dnsbls_config_raw then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 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
23 return;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 local dnsbls = set.new();
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 local dnsbls_config = {};
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 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
30 local dnsbl_name, dnsbl_config;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 if type(k) == "string" then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 dnsbl_name = k;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 dnsbl_config = v;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 else
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 dnsbl_name = v;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 dnsbl_config = {};
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 dnsbls:add(dnsbl_name);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 dnsbls_config[dnsbl_name] = dnsbl_config;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local function read_dnsbl_file(filename)
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 local t = trie.new();
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 local f, err = io.open(filename);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 if not f then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 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
47 return t;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 local n_line, n_added = 0, 0;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 for line in f:lines() do
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 n_line = n_line + 1;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 line = line:gsub("#.+$", ""):match("^%s*(.-)%s*$");
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 if line == "" then -- luacheck: ignore 542
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 -- Skip
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 else
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 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
58 if not parsed_ip then
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 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
61 else
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 if not parsed_bits then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 -- 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
64 parsed_bits = #parsed_ip.packed * 8;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 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
67 n_added = n_added + 1;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 end
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 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 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
73
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 return t;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 local ipsets = {};
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 local ipsets_last_updated = {};
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 function reload_file_dnsbls()
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 for dnsbl in dnsbls do
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 if dnsbl:byte(1) == 64 then -- '@'
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 local filename = dnsbl:sub(2);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 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
85 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
86 ipsets[dnsbl] = read_dnsbl_file(filename);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 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
88 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 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
94 reload_file_dnsbls();
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 local mod_flags = module:depends("flags");
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 local function reverse(ip, suffix)
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 local a,b,c,d = ip:match("^(%d+).(%d+).(%d+).(%d+)$");
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 if not a then return end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 return ("%d.%d.%d.%d.%s"):format(d,c,b,a, suffix);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 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
105 if dnsbl:byte(1) == 64 then -- '@'
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 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
107 if not parsed_ip then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 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
109 callback(ud, false, dnsbl);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 return;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 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
113 return;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 else
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 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
116 ip_address = ip_address:sub(8);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 local rbl_ip = reverse(ip_address, dnsbl);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 if not rbl_ip then return; end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 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
123 adns.lookup(function (reply)
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 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
125 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
126 callback(ud, hit, dnsbl);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 end, rbl_ip);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 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
132 if not hit then return; end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 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
135 registration_event.dnsbl_match = true;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 local username = registration_event.username;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 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
139
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 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
141
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 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
143
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 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
145
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 if msg then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 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
148 local msg_stanza = st.message(
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 to = username.."@"..module.host;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 from = module.host;
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 render_message(msg, { registration = registration_event })
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 module:send(msg_stanza);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 end
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 module:hook("user-registered", function (event)
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 local session = event.session;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 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
162 if not ip then return; end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 if not event.ip then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 event.ip = ip;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 end
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 for dnsbl in dnsbls do
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 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
170 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 end);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 module:add_item("account-trait", {
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 name = "register-dnsbl-hit";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 prob_bad_true = 0.6;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 prob_bad_false = 0.4;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 });
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 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
180 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
181 end);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 module:add_item("shell-command", {
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 section = "dnsbl";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 section_desc = "Manage DNS blocklists";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 name = "lists";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 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
188 args = {
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 { name = "host", type = "string" };
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 };
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 host_selector = "host";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 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
193 local count = 0;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 for list in dnsbls do
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195 count = count + 1;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 self.session.print(list);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 return true, ("%d lists"):format(count);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 end;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 });
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 module:add_item("shell-command", {
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203 section = "dnsbl";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 section_desc = "Manage DNS blocklists";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 name = "check";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 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
207 args = {
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 { name = "host", type = "string" };
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 { name = "ip_address", type = "string" };
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 };
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 host_selector = "host";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 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
213 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
214 if not parsed_ip then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 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
216 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218 local matches, total = 0, 0;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 local promises = {};
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 for dnsbl in dnsbls do
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 total = total + 1;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 promises[dnsbl] = promise.new(function (resolve)
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 check_dnsbl(parsed_ip, dnsbl, resolve, true);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 end);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229 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
230 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
231 local msg;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 if result.status == "fulfilled" then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 if result.value then
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 msg = "[X]";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 matches = matches + 1;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 else
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 msg = "[ ]";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 else
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 msg = "[?]";
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 print(msg, dnsbl);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 end
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 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
246 end);
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 end;
99860e1b817d mod_dnsbl: Flag accounts registered by IPs matching blocklists
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 });