mod_pubsub, util.pubsub: Support for unsubscribing
authorFlorian Zeitz <florob@babelmonkeys.de>
Sun, 5 Dec 2010 01:46:08 +0000 (02:46 +0100)
committerFlorian Zeitz <florob@babelmonkeys.de>
Sun, 5 Dec 2010 01:46:08 +0000 (02:46 +0100)
plugins/mod_pubsub.lua
util/pubsub.lua

index 83ce0ad96a4315c34ce5843cd46a34fd1b0e947e..0475ea1d709b2b951eadd47f3017fcfcf87ff2dc 100644 (file)
@@ -28,6 +28,7 @@ local pubsub_errors = {
        ["conflict"] = { "cancel", "conflict" };
        ["invalid-jid"] = { "modify", "bad-request", nil, "invalid-jid" };
        ["item-not-found"] = { "cancel", "item-not-found" };
+       ["not-subscribed"] = { "modify", "unexpected-request", nil, "not-subscribed" };
 };
 function pubsub_error_reply(stanza, error)
        local e = pubsub_errors[error];
@@ -99,6 +100,21 @@ function handlers.set_subscribe(origin, stanza, subscribe)
        return origin.send(reply);
 end
 
+function handlers.set_unsubscribe(origin, stanza, unsubscribe)
+       local node, jid = unsubscribe.attr.node, unsubscribe.attr.jid;
+       if jid_bare(jid) ~= jid_bare(stanza.attr.from) then
+               return origin.send(pubsub_error_reply(stanza, "invalid-jid"));
+       end
+       local ok, ret = service:remove_subscription(node, stanza.attr.from, jid);
+       local reply;
+       if ok then
+               reply = st.reply(stanza);
+       else
+               reply = pubsub_error_reply(stanza, ret);
+       end
+       return origin.send(reply);
+end
+
 function handlers.set_publish(origin, stanza, publish)
        local node = publish.attr.node;
        local item = publish:get_child("item");
index dc3f3432f4ace195db2a500925c35c5249c81237..4789dff95960547f648dadd12e1d5c83a4aa1046 100644 (file)
@@ -17,7 +17,14 @@ function service:add_subscription(node, actor, jid)
 end
 
 function service:remove_subscription(node, actor, jid)
-       self.nodes[node].subscribers[jid] = nil;
+       local node_obj = self.nodes[node];
+       if not node_obj then
+               return false, "item-not-found";
+       end
+       if not node_obj.subscribers[jid] then
+               return false, "not-subscribed";
+       end
+       node_obj.subscribers[jid] = nil;
        return true;
 end