mod_pubsub, util.pubsub: Support for unsubscribing

Sun, 05 Dec 2010 02:46:08 +0100

author
Florian Zeitz <florob@babelmonkeys.de>
date
Sun, 05 Dec 2010 02:46:08 +0100
changeset 3698
77171fd1dc3c
parent 3697
67c01f75af97
child 3699
150e58d69e60

mod_pubsub, util.pubsub: Support for unsubscribing

plugins/mod_pubsub.lua file | annotate | diff | comparison | revisions
util/pubsub.lua file | annotate | diff | comparison | revisions
--- a/plugins/mod_pubsub.lua	Fri Dec 03 16:36:13 2010 +0100
+++ b/plugins/mod_pubsub.lua	Sun Dec 05 02:46:08 2010 +0100
@@ -28,6 +28,7 @@
 	["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 @@
 	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");
--- a/util/pubsub.lua	Fri Dec 03 16:36:13 2010 +0100
+++ b/util/pubsub.lua	Sun Dec 05 02:46:08 2010 +0100
@@ -17,7 +17,14 @@
 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
 

mercurial