From 9f6ac546e1dc284d5c25b9994534302e897d6484 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Mon, 4 Apr 2016 17:15:10 +0200 Subject: mod_presence, mod_roster: Move responsibility for sending presence on roster removal to mod_presence --- plugins/mod_presence.lua | 22 ++++++++++++++++++++++ plugins/mod_roster.lua | 10 +++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/plugins/mod_presence.lua b/plugins/mod_presence.lua index 64d5a47b..5562fecf 100644 --- a/plugins/mod_presence.lua +++ b/plugins/mod_presence.lua @@ -357,3 +357,25 @@ module:hook("resource-unbind", function(event) session.directed = nil; end end); + +module:hook("roster-item-removed", function (event) + local username = event.username; + local session = event.origin; + local roster = event.roster or session and session.roster; + local jid = event.jid; + local item = event.item; + + local subscription = item and item.subscription or "none"; + local ask = item and item.ask; + local pending = roster and roster[false].pending[jid]; + + if subscription == "both" or subscription == "from" or pending then + core_post_stanza(session, st.presence({type="unsubscribed", from=session.full_jid, to=jid})); + end + + if subscription == "both" or subscription == "to" or ask then + core_post_stanza(session, st.presence({type="unsubscribe", from=session.full_jid, to=jid})); + end + +end, -1); + diff --git a/plugins/mod_roster.lua b/plugins/mod_roster.lua index a674740c..0af088cb 100644 --- a/plugins/mod_roster.lua +++ b/plugins/mod_roster.lua @@ -75,13 +75,9 @@ module:hook("iq/self/jabber:iq:roster:query", function(event) local roster = session.roster; local r_item = roster[jid]; if r_item then - local to_bare = node and (node.."@"..host) or host; -- bare JID - if r_item.subscription == "both" or r_item.subscription == "from" or roster[false].pending[jid] then - core_post_stanza(session, st.presence({type="unsubscribed", from=session.full_jid, to=to_bare})); - end - if r_item.subscription == "both" or r_item.subscription == "to" or r_item.ask then - core_post_stanza(session, st.presence({type="unsubscribe", from=session.full_jid, to=to_bare})); - end + module:fire_event("roster-item-removed", { + username = node, jid = jid, item = r_item, origin = session, roster = roster, + }); local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, jid); if success then session.send(st.reply(stanza)); -- cgit v1.2.3 From 1e3a0dc5df58ff9e5d1f518e63dec18b3499bf46 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Mon, 4 Apr 2016 17:15:47 +0200 Subject: mod_presence: Send unavailable presence when roster items are removed (fixes #331) --- plugins/mod_presence.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/mod_presence.lua b/plugins/mod_presence.lua index 5562fecf..d4f2f28d 100644 --- a/plugins/mod_presence.lua +++ b/plugins/mod_presence.lua @@ -374,6 +374,7 @@ module:hook("roster-item-removed", function (event) end if subscription == "both" or subscription == "to" or ask then + send_presence_of_available_resources(username, module.host, jid, session, st.presence({type="unavailable"})); core_post_stanza(session, st.presence({type="unsubscribe", from=session.full_jid, to=jid})); end -- cgit v1.2.3 From cc487c8b9d4694e2474dc11b33555b1eaac17527 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Mon, 4 Apr 2016 17:18:27 +0200 Subject: mod_roster: Handle roster item removal with event on user deletion --- plugins/mod_roster.lua | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/mod_roster.lua b/plugins/mod_roster.lua index 0af088cb..0e3fdc4e 100644 --- a/plugins/mod_roster.lua +++ b/plugins/mod_roster.lua @@ -134,17 +134,15 @@ end); module:hook_global("user-deleted", function(event) local username, host = event.username, event.host; + local origin = event.origin or prosody.hosts[host]; if host ~= module.host then return end local bare = username .. "@" .. host; local roster = rm_load_roster(username, host); for jid, item in pairs(roster) do if jid then - if item.subscription == "both" or item.subscription == "from" or roster[false].pending[jid] then - module:send(st.presence({type="unsubscribed", from=bare, to=jid})); - end - if item.subscription == "both" or item.subscription == "to" or item.ask then - module:send(st.presence({type="unsubscribe", from=bare, to=jid})); - end + module:fire_event("roster-item-removed", { + username = username, jid = jid, item = item, roster = roster, origin = origin, + }); end end end, 300); -- cgit v1.2.3 From afcc8898695dd49b60998369e55be70d1a266a82 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Mon, 4 Apr 2016 21:48:42 +0200 Subject: mod_roster: Fire event for pending items for good measure --- plugins/mod_roster.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/mod_roster.lua b/plugins/mod_roster.lua index 0e3fdc4e..454acebb 100644 --- a/plugins/mod_roster.lua +++ b/plugins/mod_roster.lua @@ -143,6 +143,12 @@ module:hook_global("user-deleted", function(event) module:fire_event("roster-item-removed", { username = username, jid = jid, item = item, roster = roster, origin = origin, }); + else + for jid in pairs(item.pending) do + module:fire_event("roster-item-removed", { + username = username, jid = jid, roster = roster, origin = origin, + }); + end end end end, 300); -- cgit v1.2.3