mod_pubsub, util.pubsub: Add delete action
authorKim Alvefur <zash@zash.se>
Thu, 31 Jan 2013 17:41:01 +0000 (18:41 +0100)
committerKim Alvefur <zash@zash.se>
Thu, 31 Jan 2013 17:41:01 +0000 (18:41 +0100)
plugins/mod_pubsub.lua
util/pubsub.lua

index 96a9eaaeb65bb10dc20b81e38db98a5044c38480..fe6c0b0aba176306ef8ad0a33cbc910243f7e34b 100644 (file)
@@ -119,6 +119,22 @@ function handlers.set_create(origin, stanza, create)
        return origin.send(reply);
 end
 
+function handlers.set_delete(origin, stanza, delete)
+       local node = delete.attr.node;
+
+       local reply, notifier;
+       if not node then
+               return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+       end
+       local ok, ret = service:delete(node, stanza.attr.from);
+       if ok then
+               reply = st.reply(stanza);
+       else
+               reply = pubsub_error_reply(stanza, ret);
+       end
+       return origin.send(reply);
+end
+
 function handlers.set_subscribe(origin, stanza, subscribe)
        local node, jid = subscribe.attr.node, subscribe.attr.jid;
        if not (node and jid) then
@@ -258,6 +274,7 @@ local feature_map = {
        retract = { "delete-items", "retract-items" };
        purge = { "purge-nodes" };
        publish = { "publish", autocreate_on_publish and "auto-create" };
+       delete = { "delete-nodes" };
        get_items = { "retrieve-items" };
        add_subscription = { "subscribe" };
        get_subscriptions = { "retrieve-subscriptions" };
@@ -418,6 +435,7 @@ set_service(pubsub.new({
                        create = true;
                        publish = true;
                        retract = true;
+                       delete = true;
                        get_nodes = true;
                        
                        subscribe = true;
index 3d97d4ed0a8e60927484c6a1208154a10afb309f..e7fc86b10c23d706b1c6792bcb22eabd74ab3032 100644 (file)
@@ -226,6 +226,18 @@ function service:create(node, actor)
        return ok, err;
 end
 
+function service:delete(node, actor)
+       -- Access checking
+       if not self:may(node, actor, "delete") then
+               return false, "forbidden";
+       end
+       --
+       local node_obj = self.nodes[node];
+       self.nodes[node] = nil;
+       self.config.broadcaster("delete", node, node_obj.subscribers);
+       return true;
+end
+
 function service:publish(node, actor, id, item)
        -- Access checking
        if not self:may(node, actor, "publish") then