comparison mod_delegation/mod_delegation.lua @ 4709:679f1834dbdb

mod_delegation: update to XEP-0355 v0.5 - namespace bump to "urn:xmpp:delegation:2" - disco remaining infos now uses the XEP defined "urn:xmpp:delegation:2:bare:disco#info:*" namespace - complemeted disco remaining infos implementation for requests made on nodes not already managed by the server - bare JID disco items now uses the XEP defined "urn:xmpp:delegation:2:bare:disco#items:*'" namespace
author Goffi <goffi@goffi.org>
date Fri, 15 Oct 2021 15:10:36 +0200
parents 377546ab50f9
children 7d6ae8bb95dc
comparison
equal deleted inserted replaced
4708:25fd5e268f90 4709:679f1834dbdb
28 -- other hosts 28 -- other hosts
29 delegation_session.connected_cb = set.new() 29 delegation_session.connected_cb = set.new()
30 end 30 end
31 local connected_cb = delegation_session.connected_cb 31 local connected_cb = delegation_session.connected_cb
32 32
33 local _DELEGATION_NS = 'urn:xmpp:delegation:1' 33 local _DELEGATION_NS = 'urn:xmpp:delegation:2'
34 local _FORWARDED_NS = 'urn:xmpp:forward:0' 34 local _FORWARDED_NS = 'urn:xmpp:forward:0'
35 local _DISCO_INFO_NS = 'http://jabber.org/protocol/disco#info' 35 local _DISCO_INFO_NS = 'http://jabber.org/protocol/disco#info'
36 local _DISCO_ITEMS_NS = 'http://jabber.org/protocol/disco#items' 36 local _DISCO_ITEMS_NS = 'http://jabber.org/protocol/disco#items'
37 local _DATA_NS = 'jabber:x:data' 37 local _DATA_NS = 'jabber:x:data'
38 38
39 local _MAIN_SEP = '::' 39 local _MAIN_SEP = '::'
40 local _BARE_SEP = ':bare:' 40 local _BARE_SEP = ':bare:'
41 local _REMAINING = ':*' 41 local _REMAINING = ':*'
42 local _MAIN_PREFIX = _DELEGATION_NS.._MAIN_SEP 42 local _MAIN_PREFIX = _DELEGATION_NS.._MAIN_SEP
43 local _BARE_PREFIX = _DELEGATION_NS.._BARE_SEP 43 local _BARE_PREFIX = _DELEGATION_NS.._BARE_SEP
44 local _DISCO_REMAINING = _DISCO_ITEMS_NS.._REMAINING 44 local _DISCO_REMAINING = _BARE_PREFIX.."disco#info".._REMAINING
45 local _DISCO_ITEMS_REMAINING = _BARE_PREFIX.."disco#items".._REMAINING
45 local _PREFIXES = {_MAIN_PREFIX, _BARE_PREFIX} 46 local _PREFIXES = {_MAIN_PREFIX, _BARE_PREFIX}
46 47
47 local disco_nest 48 local disco_nest
48 49
49 module:log("debug", "Loading namespace delegation module ") 50 module:log("debug", "Loading namespace delegation module ")
103 -- if the namespace has already a connected entity, ignore the new one 104 -- if the namespace has already a connected entity, ignore the new one
104 local function set_config(jid_) 105 local function set_config(jid_)
105 for namespace, ns_data in pairs(jid2ns[jid_]) do 106 for namespace, ns_data in pairs(jid2ns[jid_]) do
106 if ns_data.connected == nil then 107 if ns_data.connected == nil then
107 ns_data.connected = entity_jid 108 ns_data.connected = entity_jid
108 -- disco remaining is a special namespace 109 -- disco remaining and disco items remaining are special namespaces
109 -- there is no disco nesting for it 110 -- there is no disco nesting for them
110 if namespace ~= _DISCO_REMAINING then 111 if namespace ~= _DISCO_ITEMS_REMAINING and namespace ~= _DISCO_REMAINING then
111 disco_nest(namespace, entity_jid) 112 disco_nest(namespace, entity_jid)
112 end 113 end
113 end 114 end
114 end 115 end
115 end 116 end
216 -- because the namespace can be lacking in case of error 217 -- because the namespace can be lacking in case of error
217 local namespace = original.tags[1].attr.xmlns 218 local namespace = original.tags[1].attr.xmlns
218 219
219 -- small hack for disco remaining feat 220 -- small hack for disco remaining feat
220 if namespace == _DISCO_ITEMS_NS then 221 if namespace == _DISCO_ITEMS_NS then
222 namespace = _DISCO_ITEMS_REMAINING
223 elseif namespace == _DISCO_INFO_NS then
221 namespace = _DISCO_REMAINING 224 namespace = _DISCO_REMAINING
222 end 225 end
223 226
224 local ns_data = ns_delegations[namespace] 227 local ns_data = ns_delegations[namespace]
225 228
540 end 543 end
541 544
542 end 545 end
543 module:hook("account-disco-info", disco_hook, -2^32) 546 module:hook("account-disco-info", disco_hook, -2^32)
544 547
545 -- disco#items 548 local function disco_node_hook(event)
546 549 -- we reach this hook if a disco node on account has not been found
547 local function disco_items_node_hook(event) 550 -- we then forward the request to managing entity
548 -- check if node is not handled by server
549 -- and forward the disco request to suitable entity
550 if not event.exists then 551 if not event.exists then
551 -- this node is not handled by the server 552 -- this node is not handled by the server
552 local ns_data = ns_delegations[_DISCO_REMAINING] 553 local ns_data = ns_delegations[_DISCO_REMAINING]
553 if ns_data ~= nil then 554 if ns_data ~= nil then
554 -- remaining delegation is requested, we forward 555 -- remaining delegation is requested, we forward
556 -- and stop normal event handling 557 -- and stop normal event handling
557 return true 558 return true
558 end 559 end
559 end 560 end
560 end 561 end
562 module:hook("account-disco-info-node", disco_node_hook, -2^32)
563
564 -- disco#items
565
566 local function disco_items_node_hook(event)
567 -- check if node is not handled by server
568 -- and forward the disco request to suitable entity
569 if not event.exists then
570 -- this node is not handled by the server
571 local ns_data = ns_delegations[_DISCO_ITEMS_REMAINING]
572 if ns_data ~= nil then
573 -- remaining delegation is requested, we forward
574 forward_iq(event.stanza, ns_data)
575 -- and stop normal event handling
576 return true
577 end
578 end
579 end
561 module:hook("account-disco-items-node", disco_items_node_hook, -2^32) 580 module:hook("account-disco-items-node", disco_items_node_hook, -2^32)
562 581
563 local function disco_items_hook(event) 582 local function disco_items_hook(event)
564 -- FIXME: we forward all bare-jid disco-items requests (without node) which will replace any Prosody reply 583 -- FIXME: we forward all bare-jid disco-items requests (without node) which will replace any Prosody reply
565 -- for now it's OK because Prosody is not returning anything on request on bare jid 584 -- for now it's OK because Prosody is not returning anything on request on bare jid
566 -- but to be properly done, any Prosody reply should be kept and managing entities items should be added (merged) to it. 585 -- but to be properly done, any Prosody reply should be kept and managing entities items should be added (merged) to it.
567 -- account-disco-items can't be cancelled (return value of hooks are not checked in mod_disco), so corountine needs 586 -- account-disco-items can't be cancelled (return value of hooks are not checked in mod_disco), so coroutine needs
568 -- to be used with util.async (to get the IQ result, merge items then return from the event) 587 -- to be used with util.async (to get the IQ result, merge items then return from the event)
569 local origin, stanza = event.origin, event.stanza; 588 local origin, stanza = event.origin, event.stanza;
570 local node = stanza.tags[1].attr.node; 589 local node = stanza.tags[1].attr.node;
571 local username = jid_split(stanza.attr.to) or origin.username; 590 local username = jid_split(stanza.attr.to) or origin.username;
572 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then 591 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then
573 if node == nil or node == "" then 592 if node == nil or node == "" then
574 local ns_data = ns_delegations[_DISCO_REMAINING] 593 local ns_data = ns_delegations[_DISCO_ITEMS_REMAINING]
575 if ns_data ~= nil then 594 if ns_data ~= nil then
576 forward_iq(event.stanza, ns_data) 595 forward_iq(event.stanza, ns_data)
577 return true 596 return true
578 end 597 end
579 end 598 end
586 -- notably when a disco-item is done by an unsubscibed entity 605 -- notably when a disco-item is done by an unsubscibed entity
587 -- (i.e. an entity doing a disco#item on an entity without having 606 -- (i.e. an entity doing a disco#item on an entity without having
588 -- presence subscription) 607 -- presence subscription)
589 -- we forward the request to managing entity 608 -- we forward the request to managing entity
590 -- it's the responsability of the managing entity to filter the items 609 -- it's the responsability of the managing entity to filter the items
591 local ns_data = ns_delegations[_DISCO_REMAINING] 610 local ns_data = ns_delegations[_DISCO_ITEMS_REMAINING]
592 if ns_data ~= nil then 611 if ns_data ~= nil then
593 forward_iq(event.stanza, ns_data) 612 forward_iq(event.stanza, ns_data)
594 return true 613 return true
595 end 614 end
596 end 615 end