Mercurial > prosody-modules
diff 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 |
line wrap: on
line diff
--- a/mod_delegation/mod_delegation.lua Fri Oct 15 11:30:44 2021 +0200 +++ b/mod_delegation/mod_delegation.lua Fri Oct 15 15:10:36 2021 +0200 @@ -30,7 +30,7 @@ end local connected_cb = delegation_session.connected_cb -local _DELEGATION_NS = 'urn:xmpp:delegation:1' +local _DELEGATION_NS = 'urn:xmpp:delegation:2' local _FORWARDED_NS = 'urn:xmpp:forward:0' local _DISCO_INFO_NS = 'http://jabber.org/protocol/disco#info' local _DISCO_ITEMS_NS = 'http://jabber.org/protocol/disco#items' @@ -41,7 +41,8 @@ local _REMAINING = ':*' local _MAIN_PREFIX = _DELEGATION_NS.._MAIN_SEP local _BARE_PREFIX = _DELEGATION_NS.._BARE_SEP -local _DISCO_REMAINING = _DISCO_ITEMS_NS.._REMAINING +local _DISCO_REMAINING = _BARE_PREFIX.."disco#info".._REMAINING +local _DISCO_ITEMS_REMAINING = _BARE_PREFIX.."disco#items".._REMAINING local _PREFIXES = {_MAIN_PREFIX, _BARE_PREFIX} local disco_nest @@ -105,9 +106,9 @@ for namespace, ns_data in pairs(jid2ns[jid_]) do if ns_data.connected == nil then ns_data.connected = entity_jid - -- disco remaining is a special namespace - -- there is no disco nesting for it - if namespace ~= _DISCO_REMAINING then + -- disco remaining and disco items remaining are special namespaces + -- there is no disco nesting for them + if namespace ~= _DISCO_ITEMS_REMAINING and namespace ~= _DISCO_REMAINING then disco_nest(namespace, entity_jid) end end @@ -218,6 +219,8 @@ -- small hack for disco remaining feat if namespace == _DISCO_ITEMS_NS then + namespace = _DISCO_ITEMS_REMAINING + elseif namespace == _DISCO_INFO_NS then namespace = _DISCO_REMAINING end @@ -542,6 +545,22 @@ end module:hook("account-disco-info", disco_hook, -2^32) +local function disco_node_hook(event) + -- we reach this hook if a disco node on account has not been found + -- we then forward the request to managing entity + if not event.exists then + -- this node is not handled by the server + local ns_data = ns_delegations[_DISCO_REMAINING] + if ns_data ~= nil then + -- remaining delegation is requested, we forward + forward_iq(event.stanza, ns_data) + -- and stop normal event handling + return true + end + end +end +module:hook("account-disco-info-node", disco_node_hook, -2^32) + -- disco#items local function disco_items_node_hook(event) @@ -549,7 +568,7 @@ -- and forward the disco request to suitable entity if not event.exists then -- this node is not handled by the server - local ns_data = ns_delegations[_DISCO_REMAINING] + local ns_data = ns_delegations[_DISCO_ITEMS_REMAINING] if ns_data ~= nil then -- remaining delegation is requested, we forward forward_iq(event.stanza, ns_data) @@ -564,14 +583,14 @@ -- FIXME: we forward all bare-jid disco-items requests (without node) which will replace any Prosody reply -- for now it's OK because Prosody is not returning anything on request on bare jid -- but to be properly done, any Prosody reply should be kept and managing entities items should be added (merged) to it. - -- account-disco-items can't be cancelled (return value of hooks are not checked in mod_disco), so corountine needs + -- account-disco-items can't be cancelled (return value of hooks are not checked in mod_disco), so coroutine needs -- to be used with util.async (to get the IQ result, merge items then return from the event) local origin, stanza = event.origin, event.stanza; local node = stanza.tags[1].attr.node; local username = jid_split(stanza.attr.to) or origin.username; if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then if node == nil or node == "" then - local ns_data = ns_delegations[_DISCO_REMAINING] + local ns_data = ns_delegations[_DISCO_ITEMS_REMAINING] if ns_data ~= nil then forward_iq(event.stanza, ns_data) return true @@ -588,7 +607,7 @@ -- presence subscription) -- we forward the request to managing entity -- it's the responsability of the managing entity to filter the items - local ns_data = ns_delegations[_DISCO_REMAINING] + local ns_data = ns_delegations[_DISCO_ITEMS_REMAINING] if ns_data ~= nil then forward_iq(event.stanza, ns_data) return true