Mercurial > prosody-modules
comparison mod_delegation/mod_delegation.lua @ 1713:01e9465f8f80
mod_delegation: delegated features/identities removal for disco info requests on bare jid
| author | Goffi <goffi@goffi.org> |
|---|---|
| date | Fri, 17 Apr 2015 21:06:51 +0200 |
| parents | c1973605d096 |
| children | 3d83f5337a73 |
comparison
equal
deleted
inserted
replaced
| 1712:c1973605d096 | 1713:01e9465f8f80 |
|---|---|
| 253 | 253 |
| 254 -- disabling internal features/identities | 254 -- disabling internal features/identities |
| 255 | 255 |
| 256 -- modules whose features/identities are managed by delegation | 256 -- modules whose features/identities are managed by delegation |
| 257 local disabled_modules = set.new() | 257 local disabled_modules = set.new() |
| 258 local disabled_identities = set.new() | |
| 258 | 259 |
| 259 local function identity_added(event) | 260 local function identity_added(event) |
| 260 local source = event.source | 261 local source = event.source |
| 261 if disabled_modules:contains(source) then | 262 if disabled_modules:contains(source) then |
| 262 local item = event.item | 263 local item = event.item |
| 263 local category, type_, name = item.category, item.type, item.name | 264 local category, type_, name = item.category, item.type, item.name |
| 264 module:log("debug", "Removing (%s/%s%s) identity because of delegation", category, type_, name and "/"..name or "") | 265 module:log("debug", "Removing (%s/%s%s) identity because of delegation", category, type_, name and "/"..name or "") |
| 266 disabled_identities:add(item) | |
| 265 source:remove_item("identity", item) | 267 source:remove_item("identity", item) |
| 266 end | 268 end |
| 267 | |
| 268 end | 269 end |
| 269 | 270 |
| 270 local function feature_added(event) | 271 local function feature_added(event) |
| 271 local source, item = event.source, event.item | 272 local source, item = event.source, event.item |
| 272 for namespace, _ in pairs(ns_delegations) do | 273 for namespace, _ in pairs(ns_delegations) do |
| 349 | 350 |
| 350 module:hook("iq-result/host/"..iq_id, disco_main_result) | 351 module:hook("iq-result/host/"..iq_id, disco_main_result) |
| 351 module:hook("iq-error/host/"..iq_id, disco_main_error) | 352 module:hook("iq-error/host/"..iq_id, disco_main_error) |
| 352 module:send(iq) | 353 module:send(iq) |
| 353 end | 354 end |
| 355 | |
| 356 -- disco to bare jids special case | |
| 357 | |
| 358 module:hook("account-disco-info", function(event) | |
| 359 -- this event is called when a disco info request is done on a bare jid | |
| 360 -- we get the final reply and filter delegated features/identities | |
| 361 local reply = event.reply; | |
| 362 reply.tags[1]:maptags(function(child) | |
| 363 if child.name == 'feature' then | |
| 364 local feature_ns = child.attr.var | |
| 365 for namespace, _ in pairs(ns_delegations) do | |
| 366 if string.sub(feature_ns, 1, #namespace) == namespace then | |
| 367 module:log("debug", "Removing feature namespace %s which is delegated", feature_ns) | |
| 368 return nil | |
| 369 end | |
| 370 end | |
| 371 elseif child.name == 'identity' then | |
| 372 for item in disabled_identities:items() do | |
| 373 if item.category == child.attr.category | |
| 374 and item.type == child.attr.type | |
| 375 -- we don't check name, because mod_pep use a name for main disco, but not in account-disco-info hook | |
| 376 -- and item.name == child.attr.name | |
| 377 then | |
| 378 module:log("debug", "Removing (%s/%s%s) identity because of delegation", item.category, item.type, item.name and "/"..item.name or "") | |
| 379 return nil | |
| 380 end | |
| 381 end | |
| 382 end | |
| 383 return child | |
| 384 end) | |
| 385 end, -2^32); |
