Software /
code /
prosody-modules
Changeset
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 (2021-10-15) |
parents | 4708:25fd5e268f90 |
children | 4710:099dcdb732b1 |
files | mod_delegation/README.markdown mod_delegation/mod_delegation.lua |
diffstat | 2 files changed, 68 insertions(+), 40 deletions(-) [+] |
line wrap: on
line diff
--- a/mod_delegation/README.markdown Fri Oct 15 11:30:44 2021 +0200 +++ b/mod_delegation/README.markdown Fri Oct 15 15:10:36 2021 +0200 @@ -7,25 +7,24 @@ Introduction ============ -Namespace Delegation is an extension which allows server to delegate -some features handling to an entity/component. Typical use case is an -external PEP service, but it can be used more generally when your -preferred server lack one internal feature and you found an external -component which can do it. +Namespace Delegation is an extension which allows server to delegate some +features handling to an entity/component. Typical use case is an external PEP +service, but it can be used more generally when your preferred server lack one +internal feature, and you found an external component which can do it. Details ======= You can have all the details by reading the -[XEP-0355](http://xmpp.org/extensions/xep-0355.html). Only the admin -mode is implemented so far. +[XEP-0355](http://xmpp.org/extensions/xep-0355.html). Only the admin mode is +implemented so far. Usage ===== -To use the module, like usual add **"delegation"** to your -modules\_enabled. Note that if you use it with a local component, you -also need to activate the module in your component section: +To use the module, like usual add **"delegation"** to your *modules\_enabled*. +Note that if you use it with a local component, you also need to activate the +module in your component section: modules_enabled = { [...] @@ -44,47 +43,57 @@ VirtualHost "yourdomain.tld" delegations = { - ["urn:xmpp:mam:0"] = { + ["urn:xmpp:mam:2"] = { filtering = {"node"}; jid = "pubsub.yourdomain.tld"; }, ["http://jabber.org/protocol/pubsub"] = { jid = "pubsub.yourdomain.tld"; }, + ["http://jabber.org/protocol/pubsub#owner"] = { + jid = "pubsub.yourdomain.tld"; + }, + ["urn:xmpp:delegation:2:bare:disco#info:*"] = { + jid = "pubsub.yourdomain.tld"; + }, + ["urn:xmpp:delegation:2:bare:disco#items:*"] = { + jid = "pubsub.yourdomain.tld"; + }, + } -Here all MAM requests with a "node" attribute (i.e. all MAM pubsub -request) will be delegated to pubsub.yourdomain.tld. Similarly, all -pubsub request to the host (i.e. the PEP requests) will be delegated to -pubsub.yourdomain.tld. +Here all MAM requests with a "node" attribute (i.e. all MAM pubsub request) will +be delegated to pubsub.yourdomain.tld. Similarly, all pubsub request to the host +(i.e. the PEP requests) will be delegated to pubsub.yourdomain.tld. Check the +XEP for the meaning of "urn:xmpp:delegation:2:bare:disco#info:*" and +"urn:xmpp:delegation:2:bare:disco#items:*". -**/!\ Be extra careful when you give a delegation to an entity/component, -it's a powerful access, only do it if you absoly trust the -component/entity, and you know where the software is coming from** +**/!\ Be extra careful when you give a delegation to an entity/component, it's a +powerful access, only do it if you absolutely trust the component/entity, and +you know where the software is coming from** Configuration ============= The configuration is done with a table which map delegated namespace to namespace data. Namespace data MUST have a **jid** (in the form **jid = -"delegated@domain.tld"**) and MAY have an additional **filtering** -array. If filtering is present, request with attributes in the array -will be delegated, other will be treated normally (i.e. by Prosody). +"delegated@domain.tld"**) and MAY have an additional **filtering** array. If +filtering is present, request with attributes in the array will be delegated, +others will be treated normally (i.e. by Prosody). -If your are not a developper, the delegated namespace(s)/attribute(s) -are most probably specified with the external component/entity you want -to use. +If you are not a developer, the delegated namespace(s)/attribute(s) are most +probably specified with the external component/entity you want to use. -The pseudo-namespace `http://jabber.org/protocol/disco#items:*` is used -to delegate remaining disco#items (i.e. items nodes not already handled -by Prosody itself). +The pseudo-namespace `http://jabber.org/protocol/disco#items:*` is used to +delegate remaining disco#items (i.e. items nodes not already handled by Prosody +itself). Compatibility ============= If you use it with Prosody 0.9 and a component, you need to patch -core/mod\_component.lua to fire a new signal. To do it, copy the -following patch in a, for example, /tmp/component.patch file: +core/mod\_component.lua to fire a new signal. To do it, copy the following patch +in a, for example, /tmp/component.patch file: diff --git a/plugins/mod_component.lua b/plugins/mod_component.lua --- a/plugins/mod_component.lua @@ -103,6 +112,7 @@ `patch -p1 < /tmp/component.patch` ----- ---------------------------------------------------- + 0.11 Works 0.10 Works 0.9 Need a patched core/mod\_component.lua (see above) ----- ---------------------------------------------------- @@ -110,5 +120,4 @@ Note ==== -This module is often used with mod\_privilege (c.f. XEP for more -details) +This module is often used with mod\_privilege (c.f. XEP for more details)
--- 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