mod_pubsub, util.pubsub: Implement the purge action
authorKim Alvefur <zash@zash.se>
Thu, 24 Jan 2013 00:58:03 +0100
changeset 5305 391b72fede9f
parent 5304 67a49d47ef39
child 5306 10bc0e2aa55e
mod_pubsub, util.pubsub: Implement the purge action
plugins/mod_pubsub.lua
util/pubsub.lua
--- a/plugins/mod_pubsub.lua	Wed Jan 23 22:41:18 2013 +0100
+++ b/plugins/mod_pubsub.lua	Thu Jan 24 00:58:03 2013 +0100
@@ -178,6 +178,10 @@
 	notify = (notify == "1") or (notify == "true");
 	local item = retract:get_child("item");
 	local id = item and item.attr.id
+	if not (node and id) then
+		origin.send(st.error_reply(stanza, "modify", "bad-request"));
+		return true;
+	end
 	local reply, notifier;
 	if notify then
 		notifier = st.stanza("retract", { id = id });
@@ -191,6 +195,26 @@
 	return origin.send(reply);
 end
 
+function handlers.set_purge(origin, stanza, purge)
+	local node, notify = purge.attr.node, purge.attr.notify;
+	notify = (notify == "1") or (notify == "true");
+	local reply, notifier;
+	if not node then
+		origin.send(st.error_reply(stanza, "modify", "bad-request"));
+		return true;
+	end
+	if notify then
+		notifier = st.stanza("purge");
+	end
+	local ok, ret = service:purge(node, stanza.attr.from, notifier);
+	if ok then
+		reply = st.reply(stanza);
+	else
+		reply = pubsub_error_reply(stanza, ret);
+	end
+	return origin.send(reply);
+end
+
 function simple_broadcast(node, jids, item)
 	item = st.clone(item);
 	item.attr.xmlns = nil; -- Clear the pubsub namespace
@@ -212,6 +236,7 @@
 local feature_map = {
 	create = { "create-nodes", "instant-nodes", "item-ids" };
 	retract = { "delete-items", "retract-items" };
+	purge = { "purge-nodes" };
 	publish = { "publish", autocreate_on_publish and "auto-create" };
 	get_items = { "retrieve-items" };
 	add_subscription = { "subscribe" };
--- a/util/pubsub.lua	Wed Jan 23 22:41:18 2013 +0100
+++ b/util/pubsub.lua	Thu Jan 24 00:58:03 2013 +0100
@@ -259,13 +259,21 @@
 	if (not node_obj) or (not node_obj.data[id]) then
 		return false, "item-not-found";
 	end
-	node_obj.data[id] = nil;
+	if id then
+		node_obj.data[id] = nil;
+	else
+		node_obj.data = {}; -- Purge
+	end
 	if retract then
 		self.config.broadcaster(node, node_obj.subscribers, retract);
 	end
 	return true
 end
 
+function service:purge(node, actor, purge)
+	return self:retract(node, actor, nil, purge);
+end
+
 function service:get_items(node, actor, id)
 	-- Access checking
 	if not self:may(node, actor, "get_items") then