Software / code / prosody-modules
Annotate
mod_report_tracker/mod_report_tracker.lua @ 6319:63ef69b2f046
mod_http_oauth2: Assume Prosody 13.0+ roles are available
Per the README, 0.12 is not supported, so we should not need to worry
about this. Plus it is assumed to be present elsewhere and that would
throw errors.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 02 Jul 2025 16:15:32 +0200 |
| parent | 6064:765e0235c202 |
| rev | line source |
|---|---|
|
6063
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 local um = require "core.usermanager"; |
|
6064
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
2 local cache = require "util.cache"; |
|
6063
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 local jid = require "util.jid"; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 local trusted_reporters = module:get_option_inherited_set("trusted_reporters", {}); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 local reports_received = module:open_store("reports_received"); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 local xmlns_reporting = "urn:xmpp:reporting:1"; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
|
6064
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
10 local reported_users = cache.new(256); |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
11 |
|
6063
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 local function is_trusted_reporter(reporter_jid) |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 return trusted_reporters:contains(reporter_jid); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 end |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 function handle_report(event) |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 local stanza = event.stanza; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 local report = stanza:get_child("report", xmlns_reporting); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 if not report then |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 return; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 end |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 local reported_jid = report:get_child_text("jid", "urn:xmpp:jid:0") |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 or stanza:find("{urn:xmpp:forward:0}forwarded/{jabber:client}message@from"); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 if not reported_jid then |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 module:log("debug", "Discarding report with no JID"); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 return; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 elseif jid.host(reported_jid) ~= module.host then |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 module:log("debug", "Discarding report about non-local user"); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 return; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 end |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 local reporter_jid = stanza.attr.from; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 if jid.node(reporter_jid) then |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 module:log("debug", "Discarding report from non-server JID"); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 return; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 end |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 local reported_user = jid.node(reported_jid); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 if not um.user_exists(reported_user, module.host) then |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 module:log("debug", "Discarding report about non-existent user"); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 return; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 end |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 if is_trusted_reporter(reporter_jid) then |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 local current_reports = reports_received:get(reported_user, reporter_jid); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 if not current_reports then |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 current_reports = { |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 first = os.time(); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 last = os.time(); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 count = 1; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 }; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 else |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 current_reports.last = os.time(); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 current_reports.count = current_reports.count + 1; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 end |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 reports_received:set(reported_user, reporter_jid, current_reports); |
|
6064
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
59 reported_users:set(reported_user, true); |
|
6063
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 module:log("info", "Received abuse report about <%s> from <%s>", reported_jid, reporter_jid); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 module:fire_event(module.name.."/account-reported", { |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 report_from = reporter_jid; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 reported_user = reported_user; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 report = report; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 }); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 else |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 module:log("warn", "Discarding abuse report about <%s> from untrusted source <%s>", reported_jid, reporter_jid); |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 end |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 -- Message was handled |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 return true; |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 end |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 |
|
b04518fa0987
mod_report_tracker: Keep track of spam/abuse reports about local JIDs
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 module:hook("message/host", handle_report); |
|
6064
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
77 |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
78 module:add_item("account-trait", { |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
79 name = "reported-by-trusted-server"; |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
80 prob_bad_true = 0.80; |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
81 prob_bad_false = 0.50; |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
82 }); |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
83 |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
84 module:hook("get-account-traits", function (event) |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
85 local username = event.username; |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
86 local reported = reported_users:get(username); |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
87 if reported == nil then |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
88 -- Check storage, update cache |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
89 reported = not not reports_received:get(username); |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
90 reported_users:set(username, reported); |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
91 end |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
92 event.traits["reported-by-trusted-server"] = reported; |
|
765e0235c202
mod_report_tracker: Add trait for reported accounts, for mod_report_affiliations
Matthew Wild <mwild1@gmail.com>
parents:
6063
diff
changeset
|
93 end); |