Annotate

mod_anti_spam/mod_anti_spam.lua @ 6199:fe8222112cf4

mod_conversejs: Serve base app at / This makes things slightly less awkward for the browser to figure out which URLs belong to a PWA. The app's "start URL" was previously without the '/' and therefore was not considered within the scope of the PWA. Now the canonical app URL will always have a '/'. Prosody/mod_http should take care of redirecting existing links without the trailing / to the new URL. If you have an installation at https://prosody/conversejs then it is now at https://prosody/conversejs/ (the first URL will now redirect to the second URL if you use it). The alternative would be to make the PWA scope include the parent, i.e. the whole of https://prosody/ in this case. This might get messy if other PWAs are provided by the same site or Prosody installation, however.
author Matthew Wild <mwild1@gmail.com>
date Tue, 11 Feb 2025 13:18:38 +0000
parent 6192:76ae646563ea
child 6211:750d64c47ec6
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";
6157
ddb0fac151ac mod_anti_spam: Don't consider pre-approved contacts as strangers
Matthew Wild <mwild1@gmail.com>
parents: 6155
diff changeset
7 local rm = require "core.rostermanager";
5883
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
6192
76ae646563ea Backed out changeset 94399ad6b5ab
Matthew Wild <mwild1@gmail.com>
parents: 6191
diff changeset
15 local spam_source_domains = set.new();
76ae646563ea Backed out changeset 94399ad6b5ab
Matthew Wild <mwild1@gmail.com>
parents: 6191
diff changeset
16 local spam_source_ips = trie.new();
76ae646563ea Backed out changeset 94399ad6b5ab
Matthew Wild <mwild1@gmail.com>
parents: 6191
diff changeset
17 local spam_source_jids = set.new();
6152
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
18 local default_spam_action = module:get_option("anti_spam_default_action", "bounce");
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
19 local custom_spam_actions = module:get_option("anti_spam_actions", {});
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
20
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
21 local spam_actions = setmetatable({}, {
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
22 __index = function (t, reason)
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
23 local action = rawget(custom_spam_actions, reason) or default_spam_action;
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
24 rawset(t, reason, action);
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
25 return action;
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
26 end;
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
27 });
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 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
30
6125
a54b94a3e994 mod_anti_spam: Fix luacheck warning
Matthew Wild <mwild1@gmail.com>
parents: 6124
diff changeset
31 local hosts = prosody.hosts;
a54b94a3e994 mod_anti_spam: Fix luacheck warning
Matthew Wild <mwild1@gmail.com>
parents: 6124
diff changeset
32
6126
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
33 local reason_messages = {
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
34 default = "Rejected as spam";
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
35 ["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
36 };
4b1a4be43487 mod_anti_spam: Improve error bounce text with actionable info
Matthew Wild <mwild1@gmail.com>
parents: 6125
diff changeset
37
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 function block_spam(event, reason, action)
6152
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
39 if not action then
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
40 action = spam_actions[reason];
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
41 end
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 event.spam_reason = reason;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 event.spam_action = action;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 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
45 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
46 return;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 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
50
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 if action == "bounce" then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 module:log("debug", "Bouncing likely spam %s from %s (%s)", event.stanza.name, event.stanza.attr.from, reason);
6158
73c523248558 mod_anti_spam: Fix generation of error bounce stanzas
Matthew Wild <mwild1@gmail.com>
parents: 6157
diff changeset
53 event.origin.send(st.error_reply(event.stanza, "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
54 else
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 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
56 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 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
62 local stanza = event.stanza;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 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
64
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 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
66
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 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
68 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
69
6155
d80e398a2acc mod_anti_spam: Also consider not a stranger if we have a pending (out) sub request
Matthew Wild <mwild1@gmail.com>
parents: 6154
diff changeset
70 if not (
6157
ddb0fac151ac mod_anti_spam: Don't consider pre-approved contacts as strangers
Matthew Wild <mwild1@gmail.com>
parents: 6155
diff changeset
71 rm.is_contact_subscribed(to_user, to_host, from_jid) or
ddb0fac151ac mod_anti_spam: Don't consider pre-approved contacts as strangers
Matthew Wild <mwild1@gmail.com>
parents: 6155
diff changeset
72 rm.is_user_subscribed(to_user, to_host, from_jid) or
ddb0fac151ac mod_anti_spam: Don't consider pre-approved contacts as strangers
Matthew Wild <mwild1@gmail.com>
parents: 6155
diff changeset
73 rm.is_contact_pending_out(to_user, to_host, from_jid) or
ddb0fac151ac mod_anti_spam: Don't consider pre-approved contacts as strangers
Matthew Wild <mwild1@gmail.com>
parents: 6155
diff changeset
74 rm.is_contact_preapproved(to_user, to_host, from_jid)
6155
d80e398a2acc mod_anti_spam: Also consider not a stranger if we have a pending (out) sub request
Matthew Wild <mwild1@gmail.com>
parents: 6154
diff changeset
75 ) then
6153
ef7bf4215cb3 mod_anti_spam: Update definition of "stranger" to include sub to/from JID or domains
Matthew Wild <mwild1@gmail.com>
parents: 6152
diff changeset
76 local from_user, from_host = jid_split(from_jid);
ef7bf4215cb3 mod_anti_spam: Update definition of "stranger" to include sub to/from JID or domains
Matthew Wild <mwild1@gmail.com>
parents: 6152
diff changeset
77
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 -- Allow all messages from your own jid
6154
160d1bcfe341 mod_anti_spam: Optimization to avoid needless string concatenation
Matthew Wild <mwild1@gmail.com>
parents: 6153
diff changeset
79 if from_user == to_user and from_host == to_host then
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 return false; -- Pass through
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 if to_resource and stanza.attr.type == "groupchat" then
6153
ef7bf4215cb3 mod_anti_spam: Update definition of "stranger" to include sub to/from JID or domains
Matthew Wild <mwild1@gmail.com>
parents: 6152
diff changeset
83 return false; -- Pass through group chat messages
ef7bf4215cb3 mod_anti_spam: Update definition of "stranger" to include sub to/from JID or domains
Matthew Wild <mwild1@gmail.com>
parents: 6152
diff changeset
84 end
6157
ddb0fac151ac mod_anti_spam: Don't consider pre-approved contacts as strangers
Matthew Wild <mwild1@gmail.com>
parents: 6155
diff changeset
85 if rm.is_contact_subscribed(to_user, to_host, from_host) then
6153
ef7bf4215cb3 mod_anti_spam: Update definition of "stranger" to include sub to/from JID or domains
Matthew Wild <mwild1@gmail.com>
parents: 6152
diff changeset
86 -- If you have the sending domain in your roster,
ef7bf4215cb3 mod_anti_spam: Update definition of "stranger" to include sub to/from JID or domains
Matthew Wild <mwild1@gmail.com>
parents: 6152
diff changeset
87 -- allow through (probably a gateway)
ef7bf4215cb3 mod_anti_spam: Update definition of "stranger" to include sub to/from JID or domains
Matthew Wild <mwild1@gmail.com>
parents: 6152
diff changeset
88 return false;
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 return true; -- Stranger danger
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 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 function is_spammy_server(session)
6192
76ae646563ea Backed out changeset 94399ad6b5ab
Matthew Wild <mwild1@gmail.com>
parents: 6191
diff changeset
95 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
96 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 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
98 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
99 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
100 -- 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
101 -- local host session
6192
76ae646563ea Backed out changeset 94399ad6b5ab
Matthew Wild <mwild1@gmail.com>
parents: 6191
diff changeset
102 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
103 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 function is_spammy_sender(sender_jid)
6192
76ae646563ea Backed out changeset 94399ad6b5ab
Matthew Wild <mwild1@gmail.com>
parents: 6191
diff changeset
108 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
109 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 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
112 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
113
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 function is_spammy_content(stanza)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 -- Only support message content
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 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
117 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
118
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 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
120 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
121
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 if spammy_strings then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 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
124 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
125 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 if spammy_patterns then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 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
131 if body:find(s) then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 return true;
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 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 -- Set up RTBLs
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139
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
140 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
141
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 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
143 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
144 added = function (item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 spam_source_domains:add(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 removed = function (item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 spam_source_domains:remove(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 });
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 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
152 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
153 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
154 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
155 return;
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
156 end
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
157 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
158 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 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
160 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
161 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
162 return;
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
163 end
5a0e47ad7d6b mod_anti_spam: Gracefully handle failure to parse CIDR in IP RTBL
Matthew Wild <mwild1@gmail.com>
parents: 6129
diff changeset
164 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
165 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 });
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 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
168 added = function (item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 spam_source_jids:add(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 end;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 removed = function (item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 spam_source_jids:remove(item);
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 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 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
178 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
179
6122
15f6f1566bdb mod_anti_spam: Prevent traceback when processing a message to an unknown host
Matthew Wild <mwild1@gmail.com>
parents: 6121
diff changeset
180 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
181 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
182 return;
15f6f1566bdb mod_anti_spam: Prevent traceback when processing a message to an unknown host
Matthew Wild <mwild1@gmail.com>
parents: 6121
diff changeset
183 end
15f6f1566bdb mod_anti_spam: Prevent traceback when processing a message to an unknown host
Matthew Wild <mwild1@gmail.com>
parents: 6121
diff changeset
184
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 local from_bare = jid_bare(event.stanza.attr.from);
6152
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
186 if user_exists(to_user, to_host) then
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
187 if not is_from_stranger(from_bare, event) then
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
188 return;
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
189 end
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
190 end
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
192 module:log("debug", "Processing message from stranger...");
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
193
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 if is_spammy_server(event.origin) then
6152
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
195 return block_spam(event, "known-spam-source");
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 if is_spammy_sender(from_bare) then
6152
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
199 return block_spam(event, "known-spam-jid");
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 if is_spammy_content(event.stanza) then
6152
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
203 return block_spam(event, "spam-content");
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 end
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
205
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
206 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
207 end, 500);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 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
210 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
211 return;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213
6152
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
214
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
215 local to_user, to_host = jid_split(event.stanza.attr.to);
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
216 local from_bare = jid_bare(event.stanza.attr.from);
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
217
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
218 if user_exists(to_user, to_host) then
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
219 if not is_from_stranger(from_bare, event) then
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
220 return;
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
221 end
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
222 end
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
223
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
224 module:log("debug", "Processing subscription request from stranger...");
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
225
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226 if is_spammy_server(event.origin) then
6152
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
227 return block_spam(event, "known-spam-source");
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
230 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
231
6129
64b4ede37da1 mod_anti_spam: Fix spam sender check in presence subscriptions (thanks mirux)
Matthew Wild <mwild1@gmail.com>
parents: 6128
diff changeset
232 if is_spammy_sender(jid_bare(event.stanza.attr.from)) then
6152
5961e01dd963 mod_anti_spam: Allow customizing spam actions (drop/bounce), switching default to bounce
Matthew Wild <mwild1@gmail.com>
parents: 6134
diff changeset
233 return block_spam(event, "known-spam-jid");
5883
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 end
6124
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
235
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
236 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
237
bdbf12a2a854 mod_anti_spam: Add some debug logs
Matthew Wild <mwild1@gmail.com>
parents: 6122
diff changeset
238 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
239 end, 500);