Mercurial > prosody-modules
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);