Mercurial > prosody-hg
comparison util/pubsub.lua @ 3938:a3ecaf46bd82
util.pubsub: Add service-wide subscription tracking, and add :get_subscriptions()
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 22 Dec 2010 03:46:32 +0000 |
| parents | 843ee23cc91a |
| children | 0323beb7183c |
comparison
equal
deleted
inserted
replaced
| 3937:843ee23cc91a | 3938:a3ecaf46bd82 |
|---|---|
| 12 function new(config) | 12 function new(config) |
| 13 config = config or {}; | 13 config = config or {}; |
| 14 return setmetatable({ | 14 return setmetatable({ |
| 15 config = setmetatable(config, { __index = default_config }); | 15 config = setmetatable(config, { __index = default_config }); |
| 16 affiliations = {}; | 16 affiliations = {}; |
| 17 subscriptions = {}; | |
| 17 nodes = {}; | 18 nodes = {}; |
| 18 }, service_mt); | 19 }, service_mt); |
| 19 end | 20 end |
| 20 | 21 |
| 21 function service:jids_equal(jid1, jid2) | 22 function service:jids_equal(jid1, jid2) |
| 110 end | 111 end |
| 111 node_obj = self.nodes[node]; | 112 node_obj = self.nodes[node]; |
| 112 end | 113 end |
| 113 end | 114 end |
| 114 node_obj.subscribers[jid] = options or true; | 115 node_obj.subscribers[jid] = options or true; |
| 116 local normal_jid = self.config.normalize_jid(jid); | |
| 117 local subs = self.subscriptions[normal_jid]; | |
| 118 if subs then | |
| 119 if not subs[jid] then | |
| 120 subs[jid] = { [node] = true }; | |
| 121 else | |
| 122 subs[jid][node] = true; | |
| 123 end | |
| 124 else | |
| 125 self.subscriptions[normal_jid] = { [jid] = { [node] = true } }; | |
| 126 end | |
| 115 return true; | 127 return true; |
| 116 end | 128 end |
| 117 | 129 |
| 118 function service:remove_subscription(node, actor, jid) | 130 function service:remove_subscription(node, actor, jid) |
| 119 -- Access checking | 131 -- Access checking |
| 136 end | 148 end |
| 137 if not node_obj.subscribers[jid] then | 149 if not node_obj.subscribers[jid] then |
| 138 return false, "not-subscribed"; | 150 return false, "not-subscribed"; |
| 139 end | 151 end |
| 140 node_obj.subscribers[jid] = nil; | 152 node_obj.subscribers[jid] = nil; |
| 153 local normal_jid = self.config.normalize_jid(jid); | |
| 154 local subs = self.subscriptions[normal_jid]; | |
| 155 if subs then | |
| 156 local jid_subs = subs[jid]; | |
| 157 if jid_subs then | |
| 158 jid_subs[node] = nil; | |
| 159 if next(jid_subs) == nil then | |
| 160 subs[jid] = nil; | |
| 161 end | |
| 162 end | |
| 163 if next(subs) == nil then | |
| 164 self.subscriptions[normal_jid] = nil; | |
| 165 end | |
| 166 end | |
| 141 return true; | 167 return true; |
| 142 end | 168 end |
| 143 | 169 |
| 144 function service:get_subscription(node, actor, jid) | 170 function service:get_subscription(node, actor, jid) |
| 145 -- Access checking | 171 -- Access checking |
| 247 end | 273 end |
| 248 -- | 274 -- |
| 249 return true, self.nodes; | 275 return true, self.nodes; |
| 250 end | 276 end |
| 251 | 277 |
| 278 function service:get_subscriptions(node, actor, jid) | |
| 279 -- Access checking | |
| 280 local cap; | |
| 281 if jid == actor or self:jids_equal(actor, jid) then | |
| 282 cap = "get_subscriptions"; | |
| 283 else | |
| 284 cap = "get_subscriptions_other"; | |
| 285 end | |
| 286 if not self:may(node, actor, cap) then | |
| 287 return false, "forbidden"; | |
| 288 end | |
| 289 -- | |
| 290 local node_obj; | |
| 291 if node then | |
| 292 node_obj = self.nodes[node]; | |
| 293 if not node_obj then | |
| 294 return false, "item-not-found"; | |
| 295 end | |
| 296 end | |
| 297 local normal_jid = self.config.normalize_jid(jid); | |
| 298 local subs = self.subscriptions[normal_jid]; | |
| 299 -- We return the subscription object from the node to save | |
| 300 -- a get_subscription() call for each node. | |
| 301 local ret = {}; | |
| 302 if subs then | |
| 303 for jid, subscribed_nodes in pairs(subs) do | |
| 304 if node then -- Return only subscriptions to this node | |
| 305 if subscribed_nodes[node] then | |
| 306 ret[#ret+1] = { | |
| 307 node = node; | |
| 308 jid = jid; | |
| 309 subscription = node_obj.subscribers[jid]; | |
| 310 }; | |
| 311 end | |
| 312 else -- Return subscriptions to all nodes | |
| 313 local nodes = self.nodes; | |
| 314 for subscribed_node in pairs(subscribed_nodes) do | |
| 315 ret[#ret+1] = { | |
| 316 node = node; | |
| 317 jid = jid; | |
| 318 subscription = nodes[subscribed_node].subscribers[jid]; | |
| 319 }; | |
| 320 end | |
| 321 end | |
| 322 end | |
| 323 end | |
| 324 return true, ret; | |
| 325 end | |
| 326 | |
| 252 -- Access models only affect 'none' affiliation caps, service/default access level... | 327 -- Access models only affect 'none' affiliation caps, service/default access level... |
| 253 function service:set_node_capabilities(node, actor, capabilities) | 328 function service:set_node_capabilities(node, actor, capabilities) |
| 254 -- Access checking | 329 -- Access checking |
| 255 if not self:may(node, actor, "configure") then | 330 if not self:may(node, actor, "configure") then |
| 256 return false, "forbidden"; | 331 return false, "forbidden"; |
