mod_presence, rostermanager: Bring outbound subscription cancellation in line with...
authorWaqas Hussain <waqas20@gmail.com>
Tue, 31 Jul 2012 20:36:16 +0000 (01:36 +0500)
committerWaqas Hussain <waqas20@gmail.com>
Tue, 31 Jul 2012 20:36:16 +0000 (01:36 +0500)
core/rostermanager.lua
plugins/mod_presence.lua

index ac4f4e3d3e0fb7f0602347b5ce6f3c7b72033505..fdb890f96b5002a9278e3488b304b5d0bd8fa03a 100644 (file)
@@ -278,23 +278,21 @@ function unsubscribed(username, host, jid)
        local roster = load_roster(username, host);
        local item = roster[jid];
        local pending = is_contact_pending_in(username, host, jid);
-       local changed = nil;
-       if is_contact_pending_in(username, host, jid) then
+       if pending then
                roster.pending[jid] = nil; -- TODO maybe delete roster.pending if empty?
-               changed = true;
        end
+       local subscribed;
        if item then
                if item.subscription == "from" then
                        item.subscription = "none";
-                       changed = true;
+                       subscribed = true;
                elseif item.subscription == "both" then
                        item.subscription = "to";
-                       changed = true;
+                       subscribed = true;
                end
        end
-       if changed then
-               return save_roster(username, host, roster);
-       end
+       local success = (pending or subscribed) and save_roster(username, host, roster);
+       return success, pending, subscribed;
 end
 
 function process_outbound_subscription_request(username, host, jid)
index dac86ae6c5688a48528572c6fd5e86a4789b3b86..077bc31fa6cd520f346abd04bc558d6974df802a 100644 (file)
@@ -198,12 +198,19 @@ function handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_
                core_post_stanza(origin, stanza);
                send_presence_of_available_resources(node, host, to_bare, origin);
        elseif stanza.attr.type == "unsubscribed" then
-               -- 1. route stanza
-               -- 2. roster push (subscription = none or to)
-               if rostermanager.unsubscribed(node, host, to_bare) then
-                       rostermanager.roster_push(node, host, to_bare);
+               -- 1. send unavailable
+               -- 2. route stanza
+               -- 3. roster push (subscription = from or both)
+               local success, pending_in, subscribed = rostermanager.unsubscribed(node, host, to_bare);
+               if success then
+                       if subscribed then
+                               rostermanager.roster_push(node, host, to_bare);
+                       end
+                       core_post_stanza(origin, stanza);
+                       if subscribed then
+                               send_presence_of_available_resources(node, host, to_bare, origin, st.presence({ type = "unavailable" }));
+                       end
                end
-               core_post_stanza(origin, stanza);
        else
                origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid presence type"));
        end