Mercurial > prosody-modules
comparison mod_delegation/mod_delegation.lua @ 1712:c1973605d096
mod_delegation: disco nesting for host
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 17 Apr 2015 21:06:30 +0200 |
parents | 55b9ac807ac9 |
children | 01e9465f8f80 |
comparison
equal
deleted
inserted
replaced
1711:55b9ac807ac9 | 1712:c1973605d096 |
---|---|
23 end | 23 end |
24 local connected_cb = delegation_session.connected_cb | 24 local connected_cb = delegation_session.connected_cb |
25 | 25 |
26 local _DELEGATION_NS = 'urn:xmpp:delegation:1' | 26 local _DELEGATION_NS = 'urn:xmpp:delegation:1' |
27 local _FORWARDED_NS = 'urn:xmpp:forward:0' | 27 local _FORWARDED_NS = 'urn:xmpp:forward:0' |
28 local _DISCO_NS = 'http://jabber.org/protocol/disco#info' | |
28 local _ORI_ID_PREFIX = "IQ_RESULT_" | 29 local _ORI_ID_PREFIX = "IQ_RESULT_" |
30 | |
31 local _MAIN_SEP = '::' | |
32 --local _BARE_SEP = ':bare:' | |
33 | |
34 local disco_nest | |
29 | 35 |
30 module:log("debug", "Loading namespace delegation module "); | 36 module:log("debug", "Loading namespace delegation module "); |
31 | 37 |
32 | 38 |
33 --> Configuration management <-- | 39 --> Configuration management <-- |
82 | 88 |
83 local function set_connected(entity_jid) | 89 local function set_connected(entity_jid) |
84 -- set the "connected" key for all namespace managed by entity_jid | 90 -- set the "connected" key for all namespace managed by entity_jid |
85 -- if the namespace has already a connected entity, ignore the new one | 91 -- if the namespace has already a connected entity, ignore the new one |
86 local function set_config(jid_) | 92 local function set_config(jid_) |
87 for _, ns_data in pairs(jid2ns[jid_]) do | 93 for namespace, ns_data in pairs(jid2ns[jid_]) do |
88 if ns_data.connected == nil then | 94 if ns_data.connected == nil then |
89 ns_data.connected = entity_jid | 95 ns_data.connected = entity_jid |
96 disco_nest(namespace, entity_jid) | |
90 end | 97 end |
91 end | 98 end |
92 end | 99 end |
93 local bare_jid = jid.bare(entity_jid) | 100 local bare_jid = jid.bare(entity_jid) |
94 set_config(bare_jid) | 101 set_config(bare_jid) |
241 module:hook("iq/self", iq_hook, 2^32) | 248 module:hook("iq/self", iq_hook, 2^32) |
242 module:hook("iq/host", iq_hook, 2^32) | 249 module:hook("iq/host", iq_hook, 2^32) |
243 | 250 |
244 | 251 |
245 --> discovery nesting <-- | 252 --> discovery nesting <-- |
253 | |
254 -- disabling internal features/identities | |
246 | 255 |
247 -- modules whose features/identities are managed by delegation | 256 -- modules whose features/identities are managed by delegation |
248 local disabled_modules = set.new() | 257 local disabled_modules = set.new() |
249 | 258 |
250 local function identity_added(event) | 259 local function identity_added(event) |
281 -- for disco nesting (see § 7.2) we need to remove internal features | 290 -- for disco nesting (see § 7.2) we need to remove internal features |
282 -- we use handle_items as it allow to remove already added features | 291 -- we use handle_items as it allow to remove already added features |
283 -- and catch the ones which can come later | 292 -- and catch the ones which can come later |
284 module:handle_items("feature", feature_added, function(_) end) | 293 module:handle_items("feature", feature_added, function(_) end) |
285 module:handle_items("identity", identity_added, function(_) end, false) | 294 module:handle_items("identity", identity_added, function(_) end, false) |
295 | |
296 | |
297 -- managing entity features/identities collection | |
298 | |
299 local disco_main_error | |
300 | |
301 local function disco_main_result(event) | |
302 local session, stanza = event.origin, event.stanza | |
303 if stanza.attr.to ~= module.host then | |
304 module:log("warn", 'Stanza result has "to" attribute not addressed to current host, id conflict ?') | |
305 return | |
306 end | |
307 module:unhook("iq-result/host/"..stanza.attr.id, disco_main_result) | |
308 module:unhook("iq-error/host/"..stanza.attr.id, disco_main_error) | |
309 local query = stanza:get_child("query", _DISCO_NS) | |
310 if not query or not query.attr.node then | |
311 session.send(st.error_reply(stanza, 'modify', 'not-acceptable')) | |
312 return true | |
313 end | |
314 -- local node = query.attr.node | |
315 for feature in query:childtags("feature") do | |
316 local namespace = feature.attr.var | |
317 if not module:has_feature(namespace) then -- we avoid doubling features in case of disconnection/reconnexion | |
318 module:add_feature(namespace) | |
319 end | |
320 end | |
321 for identity in query:childtags("identity") do | |
322 local category, type_, name = identity.attr.category, identity.attr.type, identity.attr.name | |
323 if not module:has_identity(category, type_, name) then | |
324 module:add_identity(category, type_, name) | |
325 end | |
326 end | |
327 end | |
328 | |
329 function disco_main_error(event) | |
330 local stanza = event.stanza | |
331 if stanza.attr.to ~= module.host then | |
332 module:log("warn", 'Stanza result has "to" attribute not addressed to current host, id conflict ?') | |
333 return | |
334 end | |
335 module:unhook("iq-result/host/"..stanza.attr.id, disco_main_result) | |
336 module:unhook("iq-error/host/"..stanza.attr.id, disco_main_error) | |
337 module:log("warn", "Got an error while requesting disco for nesting to "..stanza.attr.from) | |
338 module:log("warn", "Ignoring disco nesting") | |
339 end | |
340 | |
341 function disco_nest(namespace, entity_jid) | |
342 local main_node = _DELEGATION_NS.._MAIN_SEP..namespace | |
343 -- local bare_node = _DELEGATION_NS.._BARE_SEP..namespace | |
344 | |
345 local iq = st.iq({from=module.host, to=entity_jid, type='get'}) | |
346 :tag('query', {xmlns=_DISCO_NS, node=main_node}) | |
347 | |
348 local iq_id = iq.attr.id | |
349 | |
350 module:hook("iq-result/host/"..iq_id, disco_main_result) | |
351 module:hook("iq-error/host/"..iq_id, disco_main_error) | |
352 module:send(iq) | |
353 end |