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
parents 25fd5e268f90
children 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