view mod_auto_accept_subscriptions/mod_auto_accept_subscriptions.lua @ 5185:09d6bbd6c8a4

mod_http_oauth2: Fix treatment of 'redirect_uri' parameter in code flow It's optional and the one stored in the client registration should really be used instead. RFC 6749 says an URI provided as parameter MUST be validated against the stored one but does not say how. Given that the client needs their secret to proceed, it seems fine to leave this for later.
author Kim Alvefur <zash@zash.se>
date Thu, 02 Mar 2023 22:00:42 +0100
parents 6d2ec330fbcf
children
line wrap: on
line source

local rostermanager = require "core.rostermanager";
local jid = require "util.jid";
local st = require "util.stanza";
local core_post_stanza = prosody.core_post_stanza;

local function handle_inbound_subscription_request(origin, stanza)
	local to_bare, from_bare = jid.bare(stanza.attr.to), jid.bare(stanza.attr.from);
	local node, host = jid.split(to_bare);
	stanza.attr.from, stanza.attr.to = from_bare, to_bare;
	module:log("info", "Auto-accepting inbound subscription request from %s to %s", tostring(from_bare), tostring(to_bare));

	if not rostermanager.is_contact_subscribed(node, host, from_bare) then
		core_post_stanza(hosts[host], st.presence({from=to_bare, to=from_bare, type="unavailable"}), true); -- acknowledging receipt
		module:log("debug", "receipt acknowledged");
		if rostermanager.set_contact_pending_in(node, host, from_bare) then
			module:log("debug", "set pending in");
			if rostermanager.subscribed(node, host, from_bare) then
				module:log("debug", "set subscribed");
				rostermanager.roster_push(node, host, to_bare);
				module:log("debug", "pushed roster item");
				local subscribed_stanza = st.reply(stanza);
				subscribed_stanza.attr.type = "subscribed";
				core_post_stanza(hosts[host], subscribed_stanza);
				module:log("debug", "sent subscribed");
				hosts[host].modules.presence.send_presence_of_available_resources(node, host, to_bare, origin);
				module:log("debug", "sent available presence of all resources");
				-- Add return subscription from user to contact
				local subscribe_stanza = st.reply(stanza);
				subscribe_stanza.attr.type = "subscribe";
				if rostermanager.set_contact_pending_out(node, host, from_bare) then
					rostermanager.roster_push(node, host, from_bare);
				end
				core_post_stanza(hosts[host], subscribe_stanza);
				return true;
			end
		end
	end
	module:log("warn", "Failed to auto-accept subscription request from %s to %s", tostring(from_bare), tostring(to_bare));
end

module:hook("presence/bare", function (event)
	local stanza = event.stanza;
	if stanza.attr.type == "subscribe" then
		handle_inbound_subscription_request(event.origin, stanza);
		return true;
	end
end, 0.1);