aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/mod_pubsub.lua25
-rw-r--r--util/pubsub.lua10
2 files changed, 34 insertions, 1 deletions
diff --git a/plugins/mod_pubsub.lua b/plugins/mod_pubsub.lua
index f0aa4e4f..687e38f1 100644
--- a/plugins/mod_pubsub.lua
+++ b/plugins/mod_pubsub.lua
@@ -178,6 +178,10 @@ function handlers.set_retract(origin, stanza, retract)
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 @@ function handlers.set_retract(origin, stanza, retract)
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 disco_info;
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" };
diff --git a/util/pubsub.lua b/util/pubsub.lua
index 8ff458e7..17795cf1 100644
--- a/util/pubsub.lua
+++ b/util/pubsub.lua
@@ -259,13 +259,21 @@ function service:retract(node, actor, id, retract)
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