mod_pubsub, util.pubsub: Don't send purge notifications in an <items/> element
authorFlorian Zeitz <florob@babelmonkeys.de>
Fri, 25 Jan 2013 00:32:14 +0000 (01:32 +0100)
committerFlorian Zeitz <florob@babelmonkeys.de>
Fri, 25 Jan 2013 00:32:14 +0000 (01:32 +0100)
plugins/mod_pubsub.lua
util/pubsub.lua

index c840c7c2511ffb8c9774a07181108519a303fda3..56fabaec68dad24f8166447bc72f2ed8ca16d228 100644 (file)
@@ -6,6 +6,7 @@ local uuid_generate = require "util.uuid".generate;
 local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
 local xmlns_pubsub_errors = "http://jabber.org/protocol/pubsub#errors";
 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event";
+local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner";
 
 local autocreate_on_publish = module:get_option_boolean("autocreate_on_publish", false);
 local autocreate_on_subscribe = module:get_option_boolean("autocreate_on_subscribe", false);
@@ -201,15 +202,12 @@ 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;
+       local reply;
        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);
+       local ok, ret = service:purge(node, stanza.attr.from, notify);
        if ok then
                reply = st.reply(stanza);
        else
@@ -218,12 +216,14 @@ function handlers.set_purge(origin, stanza, purge)
        return origin.send(reply);
 end
 
-function simple_broadcast(node, jids, item)
-       item = st.clone(item);
-       item.attr.xmlns = nil; -- Clear the pubsub namespace
+function simple_broadcast(kind, node, jids, item)
+       if item then
+               item = st.clone(item);
+               item.attr.xmlns = nil; -- Clear the pubsub namespace
+       end
        local message = st.message({ from = module.host, type = "headline" })
                :tag("event", { xmlns = xmlns_pubsub_event })
-                       :tag("items", { node = node })
+                       :tag(kind, { node = node })
                                :add_child(item);
        for jid in pairs(jids) do
                module:log("debug", "Sending notification to %s", jid);
@@ -232,7 +232,8 @@ function simple_broadcast(node, jids, item)
        end
 end
 
-module:hook("iq/host/http://jabber.org/protocol/pubsub:pubsub", handle_pubsub_iq);
+module:hook("iq/host/"..xmlns_pubsub..":pubsub", handle_pubsub_iq);
+module:hook("iq/host/"..xmlns_pubsub_owner..":pubsub", handle_pubsub_iq);
 
 local disco_info;
 
index 17795cf1b566841be728045f339a0b18d2e19519..c77140b95b1185e0aee5cd51a9575d89f2e7d887 100644 (file)
@@ -245,7 +245,7 @@ function service:publish(node, actor, id, item)
        end
        node_obj.data[id] = item;
        self.events.fire_event("item-published", { node = node, actor = actor, id = id, item = item });
-       self.config.broadcaster(node, node_obj.subscribers, item);
+       self.config.broadcaster("items", node, node_obj.subscribers, item);
        return true;
 end
 
@@ -259,19 +259,28 @@ function service:retract(node, actor, id, retract)
        if (not node_obj) or (not node_obj.data[id]) then
                return false, "item-not-found";
        end
-       if id then
-               node_obj.data[id] = nil;
-       else
-               node_obj.data = {}; -- Purge
-       end
+       node_obj.data[id] = nil;
        if retract then
-               self.config.broadcaster(node, node_obj.subscribers, retract);
+               self.config.broadcaster("items", node, node_obj.subscribers, retract);
        end
        return true
 end
 
-function service:purge(node, actor, purge)
-       return self:retract(node, actor, nil, purge);
+function service:purge(node, actor, notify)
+       -- Access checking
+       if not self:may(node, actor, "retract") then
+               return false, "forbidden";
+       end
+       --
+       local node_obj = self.nodes[node];
+       if not node_obj then
+               return false, "item-not-found";
+       end
+       node_obj.data = {}; -- Purge
+       if notify then
+               self.config.broadcaster("purge", node, node_obj.subscribers);
+       end
+       return true
 end
 
 function service:get_items(node, actor, id)