Annotate

mod_anti_spam/mod_anti_spam.lua @ 6148:c90aab23fb9b

mod_persisthosts: Also skip defined Components (thanks gtech1) Thought Components also had `defined=true`, but apparently not.
author Kim Alvefur <zash@zash.se>
date Sat, 11 Jan 2025 12:12:18 +0100
parent 6134:00b55c7ef393
child 6152:5961e01dd963
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local ip = require "util.ip";
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 local jid_bare = require "util.jid".bare;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local jid_split = require "util.jid".split;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local set = require "util.set";
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local sha256 = require "util.hashes".sha256;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local st = require"util.stanza";
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local full_sessions = prosody.full_sessions;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local user_exists = require "core.usermanager".user_exists;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local new_rtbl_subscription = module:require("rtbl").new_rtbl_subscription;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local trie = module:require("trie");
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14
6134
00b55c7ef393 Backed out changeset ffec70ddbffc
Matthew Wild <mwild1@gmail.com>
parents: 6132
diff changeset
15 local spam_source_domains = set.new();
00b55c7ef393 Backed out changeset ffec70ddbffc
Matthew Wild <mwild1@gmail.com>
parents: 6132
diff changeset
16 local spam_source_ips = trie.new();
00b55c7ef393 Backed out changeset ffec70ddbffc
Matthew Wild <mwild1@gmail.com>
parents: 6132
diff changeset
17 local spam_source_jids = set.new();
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 local count_spam_blocked = module:metric("counter", "anti_spam_blocked", "stanzas", "Stanzas blocked as spam", {"reason"});
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20
6125
a54b94a3e994 mod_anti_spam: Fix luacheck warning
Matthew Wild <mwild1@gmail.com>
parents: 6124
diff changeset
21 local hosts = prosody.hosts;
a54b94a3e994 mod_anti_spam: Fix luacheck warning
Matthew Wild <mwild1@gmail.com>
parents: 6124
diff changeset
22
6126
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
23 local reason_messages = {
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
24 default = "Rejected as spam";
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
25 ["known-spam-source"] = "Rejected as spam. Your server is listed as a known source of spam. Please contact your server operator.";
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
26 };
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
27
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 function block_spam(event, reason, action)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 event.spam_reason = reason;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 event.spam_action = action;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 if module:fire_event("spam-blocked", event) == false then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 module:log("debug", "Spam allowed by another module");
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 return;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 count_spam_blocked:with_labels(reason):add(1);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 if action == "bounce" then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 module:log("debug", "Bouncing likely spam %s from %s (%s)", event.stanza.name, event.stanza.attr.from, reason);
6126
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
40 event.origin.send(st.error_reply("cancel", "policy-violation", reason_messages[reason] or reason_messages.default));
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 else
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 module:log("debug", "Discarding likely spam %s from %s (%s)", event.stanza.name, event.stanza.attr.from, reason);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 function is_from_stranger(from_jid, event)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 local stanza = event.stanza;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 local to_user, to_host, to_resource = jid_split(stanza.attr.to);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 if not to_user then return false; end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 local to_session = full_sessions[stanza.attr.to];
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 if to_session then return false; end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 if not is_contact_subscribed(to_user, to_host, from_jid) then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 -- Allow all messages from your own jid
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 if from_jid == to_user.."@"..to_host then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 return false; -- Pass through
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 if to_resource and stanza.attr.type == "groupchat" then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 return false; -- Pass through
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 return true; -- Stranger danger
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 function is_spammy_server(session)
6134
00b55c7ef393 Backed out changeset ffec70ddbffc
Matthew Wild <mwild1@gmail.com>
parents: 6132
diff changeset
70 if spam_source_domains:contains(session.from_host) then
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 end
6117
b4a4f4094337 mod_anti_spam: Fix traceback on missing/invalid session IP and log warning
Matthew Wild <mwild1@gmail.com>
parents: 6116
diff changeset
73 local raw_ip = session.ip;
b4a4f4094337 mod_anti_spam: Fix traceback on missing/invalid session IP and log warning
Matthew Wild <mwild1@gmail.com>
parents: 6116
diff changeset
74 local parsed_ip = raw_ip and ip.new_ip(session.ip);
6120
bd3ff802d883 mod_anti_spam: Fix another traceback for origin sessions without an IP
Matthew Wild <mwild1@gmail.com>
parents: 6117
diff changeset
75 -- Not every session has an ip - for example, stanzas sent from a
bd3ff802d883 mod_anti_spam: Fix another traceback for origin sessions without an IP
Matthew Wild <mwild1@gmail.com>
parents: 6117
diff changeset
76 -- local host session
6134
00b55c7ef393 Backed out changeset ffec70ddbffc
Matthew Wild <mwild1@gmail.com>
parents: 6132
diff changeset
77 if parsed_ip and spam_source_ips:contains_ip(parsed_ip) then
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 function is_spammy_sender(sender_jid)
6134
00b55c7ef393 Backed out changeset ffec70ddbffc
Matthew Wild <mwild1@gmail.com>
parents: 6132
diff changeset
83 return spam_source_jids:contains(sha256(sender_jid, true));
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 local spammy_strings = module:get_option_array("anti_spam_block_strings");
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 local spammy_patterns = module:get_option_array("anti_spam_block_patterns");
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 function is_spammy_content(stanza)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 -- Only support message content
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 if stanza.name ~= "message" then return; end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 if not (spammy_strings or spammy_patterns) then return; end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 local body = stanza:get_child_text("body");
6127
559648c7c8d6 mod_anti_spam: Skip content filtering for messages with no body (thanks Martin)
Matthew Wild <mwild1@gmail.com>
parents: 6126
diff changeset
95 if not body then return; end
559648c7c8d6 mod_anti_spam: Skip content filtering for messages with no body (thanks Martin)
Matthew Wild <mwild1@gmail.com>
parents: 6126
diff changeset
96
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 if spammy_strings then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 for _, s in ipairs(spammy_strings) do
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 if body:find(s, 1, true) then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 if spammy_patterns then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 for _, s in ipairs(spammy_patterns) do
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 if body:find(s) then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 -- Set up RTBLs
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114
6121
255ab0b81f14 mod_anti_spam: Fix traceback when no anti-spam services defined in config (thanks mirux)
Matthew Wild <mwild1@gmail.com>
parents: 6120
diff changeset
115 local anti_spam_services = module:get_option_array("anti_spam_services", {});
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 for _, rtbl_service_jid in ipairs(anti_spam_services) do
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 new_rtbl_subscription(rtbl_service_jid, "spam_source_domains", {
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 added = function (item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 spam_source_domains:add(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 removed = function (item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 spam_source_domains:remove(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 });
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 new_rtbl_subscription(rtbl_service_jid, "spam_source_ips", {
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 added = function (item)
6130
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
128 local subnet_ip, subnet_bits = ip.parse_cidr(item);
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
129 if not subnet_ip then
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
130 return;
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
131 end
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
132 spam_source_ips:add_subnet(subnet_ip, subnet_bits);
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 removed = function (item)
6130
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
135 local subnet_ip, subnet_bits = ip.parse_cidr(item);
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
136 if not subnet_ip then
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
137 return;
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
138 end
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
139 spam_source_ips:remove_subnet(subnet_ip, subnet_bits);
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 });
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 new_rtbl_subscription(rtbl_service_jid, "spam_source_jids_sha256", {
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 added = function (item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 spam_source_jids:add(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 removed = function (item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 spam_source_jids:remove(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 });
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 module:hook("message/bare", function (event)
6115
b644832a8290 mod_anti_spam: Fix syntax of user_exists() check (thanks Martin/Zash)
Matthew Wild <mwild1@gmail.com>
parents: 5883
diff changeset
153 local to_user, to_host = jid_split(event.stanza.attr.to);
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154
6122
15f6f1566bdb mod_anti_spam: Prevent traceback when processing a message to an unknown host
Matthew Wild <mwild1@gmail.com>
parents: 6121
diff changeset
155 if not hosts[to_host] then
15f6f1566bdb mod_anti_spam: Prevent traceback when processing a message to an unknown host
Matthew Wild <mwild1@gmail.com>
parents: 6121
diff changeset
156 module:log("warn", "Skipping filtering of message to unknown host <%s>", to_host);
15f6f1566bdb mod_anti_spam: Prevent traceback when processing a message to an unknown host
Matthew Wild <mwild1@gmail.com>
parents: 6121
diff changeset
157 return;
15f6f1566bdb mod_anti_spam: Prevent traceback when processing a message to an unknown host
Matthew Wild <mwild1@gmail.com>
parents: 6121
diff changeset
158 end
15f6f1566bdb mod_anti_spam: Prevent traceback when processing a message to an unknown host
Matthew Wild <mwild1@gmail.com>
parents: 6121
diff changeset
159
6115
b644832a8290 mod_anti_spam: Fix syntax of user_exists() check (thanks Martin/Zash)
Matthew Wild <mwild1@gmail.com>
parents: 5883
diff changeset
160 if not user_exists(to_user, to_host) then return; end
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 local from_bare = jid_bare(event.stanza.attr.from);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 if not is_from_stranger(from_bare, event) then return; end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
165 module:log("debug", "Processing message from stranger...");
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
166
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 if is_spammy_server(event.origin) then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 return block_spam(event, "known-spam-source", "drop");
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 if is_spammy_sender(from_bare) then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 return block_spam(event, "known-spam-jid", "drop");
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 if is_spammy_content(event.stanza) then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 return block_spam(event, "spam-content", "drop");
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 end
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
178
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
179 module:log("debug", "Allowing message through");
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 end, 500);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 module:hook("presence/bare", function (event)
6128
8ef4d825ad50 mod_anti_spam: Fix stanza type check in presence handler
Matthew Wild <mwild1@gmail.com>
parents: 6127
diff changeset
183 if event.stanza.attr.type ~= "subscribe" then
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 return;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
187 module:log("debug", "Processing subscription request...");
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
188
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 if is_spammy_server(event.origin) then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 return block_spam(event, "known-spam-source", "drop");
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
193 module:log("debug", "Not from known spam source server");
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
194
6129
64b4ede37da1 mod_anti_spam: Fix spam sender check in presence subscriptions (thanks mirux)
Matthew Wild <mwild1@gmail.com>
parents: 6128
diff changeset
195 if is_spammy_sender(jid_bare(event.stanza.attr.from)) then
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 return block_spam(event, "known-spam-jid", "drop");
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 end
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
198
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
199 module:log("debug", "Not from known spam source JID");
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
200
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
201 module:log("debug", "Allowing subscription request through");
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 end, 500);