Mercurial > prosody-modules
comparison mod_delegation/mod_delegation.lua @ 1717:e22cd2205fc1
mod_delegation: reset features/identities/extensions before doing a disco nesting
| author | Goffi <goffi@goffi.org> |
|---|---|
| date | Sat, 18 Apr 2015 00:13:10 +0200 |
| parents | 29dfdfc767b4 |
| children | 48be6e7efbe8 |
comparison
equal
deleted
inserted
replaced
| 1716:29dfdfc767b4 | 1717:e22cd2205fc1 |
|---|---|
| 368 end | 368 end |
| 369 | 369 |
| 370 for feature in query:childtags("feature") do | 370 for feature in query:childtags("feature") do |
| 371 local namespace = feature.attr.var | 371 local namespace = feature.attr.var |
| 372 if main then | 372 if main then |
| 373 if not module:has_feature(namespace) then -- we avoid doubling features in case of disconnection/reconnexion | 373 module:add_feature(namespace) |
| 374 module:add_feature(namespace) | |
| 375 end | |
| 376 else | 374 else |
| 377 bare_features:add(namespace) | 375 bare_features:add(namespace) |
| 378 end | 376 end |
| 379 end | 377 end |
| 380 for identity in query:childtags("identity") do | 378 for identity in query:childtags("identity") do |
| 381 local category, type_, name = identity.attr.category, identity.attr.type, identity.attr.name | 379 local category, type_, name = identity.attr.category, identity.attr.type, identity.attr.name |
| 382 if main then | 380 if main then |
| 383 if not module:has_identity(category, type_, name) then | 381 module:add_identity(category, type_, name) |
| 384 module:add_identity(category, type_, name) | |
| 385 end | |
| 386 else | 382 else |
| 387 local found=false | 383 table.insert(bare_identities, {category=category, type=type_, name=name}) |
| 388 for _, item in ipairs(bare_identities) do | |
| 389 if item.category == category and item.type == type_ and item.name == name then | |
| 390 found=true | |
| 391 break | |
| 392 end | |
| 393 end | |
| 394 if not found then | |
| 395 table.insert(bare_identities, {category=category, type=type_, name=name}) | |
| 396 end | |
| 397 end | 384 end |
| 398 end | 385 end |
| 399 for extension in query:childtags("x", _DATA_NS) do | 386 for extension in query:childtags("x", _DATA_NS) do |
| 400 if main then | 387 if main then |
| 401 module:add_extension(extension) | 388 module:add_extension(extension) |
| 416 module:log("warn", "Got an error while requesting disco for nesting to "..stanza.attr.from) | 403 module:log("warn", "Got an error while requesting disco for nesting to "..stanza.attr.from) |
| 417 module:log("warn", "Ignoring disco nesting") | 404 module:log("warn", "Ignoring disco nesting") |
| 418 end | 405 end |
| 419 | 406 |
| 420 function disco_nest(namespace, entity_jid) | 407 function disco_nest(namespace, entity_jid) |
| 408 -- manage discovery nesting (see ยง 7.2) | |
| 409 | |
| 410 -- first we reset the current values | |
| 411 if module.items then | |
| 412 module.items['feature'] = nil | |
| 413 module.items['identity'] = nil | |
| 414 module.items['extension'] = nil | |
| 415 bare_features = set.new() | |
| 416 bare_identities = {} | |
| 417 bare_extensions = {} | |
| 418 end | |
| 419 | |
| 421 for _, prefix in ipairs(_PREFIXES) do | 420 for _, prefix in ipairs(_PREFIXES) do |
| 422 local node = prefix..namespace | 421 local node = prefix..namespace |
| 423 | 422 |
| 424 local iq = st.iq({from=module.host, to=entity_jid, type='get'}) | 423 local iq = st.iq({from=module.host, to=entity_jid, type='get'}) |
| 425 :tag('query', {xmlns=_DISCO_NS, node=node}) | 424 :tag('query', {xmlns=_DISCO_NS, node=node}) |
