view mod_smacks_noerror/mod_smacks_noerror.lua @ 3503:882180b459a0

mod_pubsub_post: Restructure authentication and authorization (BC) This deprecates the default "superuser" actor model and makes the default equivalent to the previous "request.id". A single actor and secret per node is supported because HTTP and WebHooks don't normally include any authorization identity. Allowing authentication bypass when no secret is given should be relatively safe when the actor is unprivileged, as will be unless explicitly configured otherwise.
author Kim Alvefur <zash@zash.se>
date Sat, 30 Mar 2019 21:16:13 +0100
parents f35b2b76df6d
children e7dc25e54d02
line wrap: on
line source

local t_insert = table.insert;

local mod_smacks = module:depends"smacks"

-- ignore offline messages and don't return any error (the message will be already in MAM at this point)
-- this is *only* triggered if mod_offline is *not* loaded and completely ignored otherwise
module:hook("message/offline/handle", function(event)
	event.origin.log("debug", "Ignoring offline message (mod_offline seems to be *not* loaded)...");
	return true;
end, -100);

local function discard_unacked_messages(session)
	local queue = session.outgoing_stanza_queue;
	local replacement_queue = {};
	session.outgoing_stanza_queue = replacement_queue;

	for _, stanza in ipairs(queue) do
		if stanza.name == "message" and stanza.attr.xmlns == nil and
				( stanza.attr.type == "chat" or ( stanza.attr.type or "normal" ) == "normal" ) then
			-- do nothing here for normal messages and don't send out "message delivery errors",
			-- because messages are already in MAM at this point (no need to frighten users)
		else
			t_insert(replacement_queue, stanza);
		end
	end
end

local handle_unacked_stanzas = mod_smacks.handle_unacked_stanzas;

mod_smacks.handle_unacked_stanzas = function (session)
	-- Only deal with authenticated (c2s) sessions
	if session.username then
		discard_unacked_messages(session)
	end
	return handle_unacked_stanzas(session);
end

function module.unload()
	mod_smacks.handle_unacked_stanzas = handle_unacked_stanzas;
end