changeset 596:b1d82ae063e1

mod_auto_accept_subscriptions: New module to automatically accept incoming subscription requests on behalf of users
author Matthew Wild <mwild1@gmail.com>
date Tue, 14 Feb 2012 15:16:38 +0000
parents 7693724881b3
children b5a8e8492570
files mod_auto_accept_subscriptions/mod_auto_accept_subscriptions.lua
diffstat 1 files changed, 46 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_auto_accept_subscriptions/mod_auto_accept_subscriptions.lua	Tue Feb 14 15:16:38 2012 +0000
@@ -0,0 +1,46 @@
+local rostermanager = require "core.rostermanager";
+local jid = require "util.jid";
+local st = require "util.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", from_bare, 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);
+				subscribed_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", from_bare, 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);