File

mod_report_tracker/mod_report_tracker.lua @ 6305:1c62edeb9147

mod_pastebin: Update Readme diff --git a/mod_pastebin/README.md b/mod_pastebin/README.md --- a/mod_pastebin/README.md +++ b/mod_pastebin/README.md @@ -37,12 +37,14 @@ For example: Pastes will be available by default at `http://<your-prosody>:5280/pastebin/` by default. -In Prosody 0.9 and later this can be changed with [HTTP -settings](https://prosody.im/doc/http). +Ports and path can be changed with [HTTP +settings](https://prosody.im/doc/http), for example like: -In 0.8 and older this can be changed with `pastebin_ports` (see below), -or you can forward another external URL from your web server to Prosody, -use `pastebin_url` to set that URL. +``` {.lua} + http_paths = { + pastebin = "/$host-paste"; + } +``` # Discovery @@ -82,27 +84,16 @@ The line and character tresholds are adv pastebin_line_threshold The maximum number of lines a message may have before it is sent to the pastebin. (default 4 lines) pastebin_trigger A string of characters (e.g. "!paste ") which if detected at the start of a message, always sends the message to the pastebin, regardless of length. (default: not set) pastebin_expire_after Number of hours after which to expire (remove) a paste, defaults to 24. Set to 0 to store pastes permanently on disk. - pastebin_ports List of ports to run the HTTP server on, same format as mod_httpserver's http_ports[^1] - pastebin_url Base URL to display for pastebin links, must end with / and redirect to Prosody's built-in HTTP server[^2] # Compatibility - ------ ------- - trunk Works + ------ --------------------- + trunk Works as of 25-06-13 + 13 Works 0.12 Works - 0.11 Works - 0.10 Works - 0.9 Works - 0.8 Works - ------ ------- + ------ --------------------- # Todo - Maximum paste length - Web interface to submit pastes? - -[^1]: As of Prosody 0.9, `pastebin_ports` is replaced by `http_ports`, - see [Prosody HTTP server documentation](https://prosody.im/doc/http) - -[^2]: See also - [http_external_url](https://prosody.im/doc/http#external_url)
author Menel <menel@snikket.de>
date Fri, 13 Jun 2025 11:39:58 +0200
parent 6064:765e0235c202
line wrap: on
line source

local um = require "core.usermanager";
local cache = require "util.cache";
local jid = require "util.jid";
local trusted_reporters = module:get_option_inherited_set("trusted_reporters", {});

local reports_received = module:open_store("reports_received");

local xmlns_reporting = "urn:xmpp:reporting:1";

local reported_users = cache.new(256);

local function is_trusted_reporter(reporter_jid)
	return trusted_reporters:contains(reporter_jid);
end

function handle_report(event)
	local stanza = event.stanza;
	local report = stanza:get_child("report", xmlns_reporting);
	if not report then
		return;
	end
	local reported_jid = report:get_child_text("jid", "urn:xmpp:jid:0")
		or stanza:find("{urn:xmpp:forward:0}forwarded/{jabber:client}message@from");
	if not reported_jid then
		module:log("debug", "Discarding report with no JID");
		return;
	elseif jid.host(reported_jid) ~= module.host then
		module:log("debug", "Discarding report about non-local user");
		return;
	end

	local reporter_jid = stanza.attr.from;
	if jid.node(reporter_jid) then
		module:log("debug", "Discarding report from non-server JID");
		return;
	end

	local reported_user = jid.node(reported_jid);
	if not um.user_exists(reported_user, module.host) then
		module:log("debug", "Discarding report about non-existent user");
		return;
	end

	if is_trusted_reporter(reporter_jid) then
		local current_reports = reports_received:get(reported_user, reporter_jid);

		if not current_reports then
			current_reports = {
				first = os.time();
				last = os.time();
				count = 1;
			};
		else
			current_reports.last = os.time();
			current_reports.count = current_reports.count + 1;
		end

		reports_received:set(reported_user, reporter_jid, current_reports);
		reported_users:set(reported_user, true);

		module:log("info", "Received abuse report about <%s> from <%s>", reported_jid, reporter_jid);

		module:fire_event(module.name.."/account-reported", {
			report_from = reporter_jid;
			reported_user = reported_user;
			report = report;
		});
	else
		module:log("warn", "Discarding abuse report about <%s> from untrusted source <%s>", reported_jid, reporter_jid);
	end

	-- Message was handled
	return true;
end

module:hook("message/host", handle_report);

module:add_item("account-trait", {
	name = "reported-by-trusted-server";
	prob_bad_true = 0.80;
	prob_bad_false = 0.50;
});

module:hook("get-account-traits", function (event)
	local username = event.username;
	local reported = reported_users:get(username);
	if reported == nil then
		-- Check storage, update cache
		reported = not not reports_received:get(username);
		reported_users:set(username, reported);
	end
	event.traits["reported-by-trusted-server"] = reported;
end);