Annotate

mod_report_tracker/mod_report_tracker.lua @ 6310:30adcea825c3

mod_conversejs: Fix hostname set as default username (thanks roughnecks) In login mode, it seems jid is used as default value in the login field but it was only needed in anonymous mode.
author Kim Alvefur <zash@zash.se>
date Wed, 18 Jun 2025 14:28:38 +0200
parent 6064:765e0235c202
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);