X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fpubsub.lua;h=e7fc86b10c23d706b1c6792bcb22eabd74ab3032;hb=6b40a91a2d8f894c8bbe6d6c9f4fc07f1872c9b1;hp=df055c7a5d744086266afc9d0bed934022b15a2f;hpb=85baf76401955a7adea22cc56b2dbb67fbc9ded2;p=prosody.git diff --git a/util/pubsub.lua b/util/pubsub.lua index df055c7a..e7fc86b1 100644 --- a/util/pubsub.lua +++ b/util/pubsub.lua @@ -172,20 +172,6 @@ function service:remove_subscription(node, actor, jid) end function service:remove_all_subscriptions(actor, jid) - -- Access checking - local cap; - if actor == true or jid == actor or self:jids_equal(actor, jid) then - cap = "unsubscribe"; - else - cap = "unsubscribe_other"; - end - if not self:may(node, actor, cap) then - return false, "forbidden"; - end - if not self:may(node, jid, "be_unsubscribed") then - return false, "forbidden"; - end - -- local normal_jid = self.config.normalize_jid(jid); local subs = self.subscriptions[normal_jid] subs = subs and subs[jid]; @@ -240,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 @@ -258,7 +256,8 @@ function service:publish(node, actor, id, item) node_obj = self.nodes[node]; end node_obj.data[id] = item; - self.config.broadcaster(node, node_obj.subscribers, item); + self.events.fire_event("item-published", { node = node, actor = actor, id = id, item = item }); + self.config.broadcaster("items", node, node_obj.subscribers, item); return true; end @@ -274,7 +273,24 @@ function service:retract(node, actor, id, retract) 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, 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 @@ -334,7 +350,7 @@ function service:get_subscriptions(node, actor, jid) if node then -- Return only subscriptions to this node if subscribed_nodes[node] then ret[#ret+1] = { - node = subscribed_node; + node = subscribed_nodes[node]; jid = jid; subscription = node_obj.subscribers[jid]; };