annotate mod_delegation/mod_delegation.lua @ 5626:a44af1b646f5

mod_http_oauth2: Optionally enforce authentication on revocation endpoint But why do OAuth require this? If a token leaks, why couldn't anyone revoke it?
author Kim Alvefur <zash@zash.se>
date Mon, 31 Jul 2023 02:07:58 +0200
parents 7d6ae8bb95dc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
1 -- XEP-0355 (Namespace Delegation)
2067
107147ca77f7 mod_delegation: date update
Goffi <goffi@goffi.org>
parents: 1991
diff changeset
2 -- Copyright (C) 2015-2016 Jérôme Poisson
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
3 --
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
4 -- This module is MIT/X11 licensed. Please see the
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
5 -- COPYING file in the source package for more information.
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
6
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
7 -- This module manage namespace delegation, a way to delegate server features
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
8 -- to an external entity/component. Only the admin mode is implemented so far
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
9
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
10 -- TODO: client mode
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
11
1991
a1d5214bd369 mod_delegation: fixed imports, using "/" instead of "." was causing caching issues
Goffi <goffi@goffi.org>
parents: 1988
diff changeset
12 local jid = require("util.jid")
a1d5214bd369 mod_delegation: fixed imports, using "/" instead of "." was causing caching issues
Goffi <goffi@goffi.org>
parents: 1988
diff changeset
13 local st = require("util.stanza")
a1d5214bd369 mod_delegation: fixed imports, using "/" instead of "." was causing caching issues
Goffi <goffi@goffi.org>
parents: 1988
diff changeset
14 local set = require("util.set")
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
15
3317
36a9170352b5 mod_delegation: Update to generate own iq ids
Matthew Wild <mwild1@gmail.com>
parents: 3271
diff changeset
16 local new_id = require("util.id").short;
36a9170352b5 mod_delegation: Update to generate own iq ids
Matthew Wild <mwild1@gmail.com>
parents: 3271
diff changeset
17
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
18 local delegation_session = module:shared("/*/delegation/session")
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
19
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
20 -- FIXME: temporarily needed for disco_items_hook, to be removed when clean implementation is done
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
21 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
22 local jid_split = require "util.jid".split;
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
23 local jid_bare = require "util.jid".bare;
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
24
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
25 if delegation_session.connected_cb == nil then
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
26 -- set used to have connected event listeners
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
27 -- which allow a host to react on events from
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
28 -- other hosts
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
29 delegation_session.connected_cb = set.new()
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
30 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
31 local connected_cb = delegation_session.connected_cb
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
32
4709
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
33 local _DELEGATION_NS = 'urn:xmpp:delegation:2'
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
34 local _FORWARDED_NS = 'urn:xmpp:forward:0'
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
35 local _DISCO_INFO_NS = 'http://jabber.org/protocol/disco#info'
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
36 local _DISCO_ITEMS_NS = 'http://jabber.org/protocol/disco#items'
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
37 local _DATA_NS = 'jabber:x:data'
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
38
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
39 local _MAIN_SEP = '::'
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
40 local _BARE_SEP = ':bare:'
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
41 local _REMAINING = ':*'
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
42 local _MAIN_PREFIX = _DELEGATION_NS.._MAIN_SEP
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
43 local _BARE_PREFIX = _DELEGATION_NS.._BARE_SEP
4709
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
44 local _DISCO_REMAINING = _BARE_PREFIX.."disco#info".._REMAINING
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
45 local _DISCO_ITEMS_REMAINING = _BARE_PREFIX.."disco#items".._REMAINING
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
46 local _PREFIXES = {_MAIN_PREFIX, _BARE_PREFIX}
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
47
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
48 local disco_nest
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
49
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
50 module:log("debug", "Loading namespace delegation module ")
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
51
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
52 --> Configuration management <--
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
53
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
54 local ns_delegations = module:get_option("delegations", {})
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
55
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
56 local jid2ns = {}
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
57 for namespace, ns_data in pairs(ns_delegations) do
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
58 -- "connected" contain the full jid of connected managing entity
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
59 ns_data.connected = nil
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
60 if ns_data.jid then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
61 if jid2ns[ns_data.jid] == nil then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
62 jid2ns[ns_data.jid] = {}
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
63 end
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
64 jid2ns[ns_data.jid][namespace] = ns_data
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
65 module:log("debug", "Namespace %s is delegated%s to %s", namespace, ns_data.filtering and " (with filtering)" or "", ns_data.jid)
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
66 else
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
67 module:log("warn", "Ignoring delegation for %s: no jid specified", tostring(namespace))
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
68 ns_delegations[namespace] = nil
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
69 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
70 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
71
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
72
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
73 local function advertise_delegations(session, to_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
74 -- send <message/> stanza to advertise delegations
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
75 -- as expained in § 4.2
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
76 local message = st.message({from=module.host, to=to_jid})
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
77 :tag("delegation", {xmlns=_DELEGATION_NS})
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
78
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
79 -- we need to check if a delegation is granted because the configuration
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
80 -- can be complicated if some delegations are granted to bare jid
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
81 -- and other to full jids, and several resources are connected.
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
82 local have_delegation = false
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
83
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
84 for namespace, ns_data in pairs(jid2ns[to_jid]) do
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
85 if ns_data.connected == to_jid then
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
86 have_delegation = true
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
87 message:tag("delegated", {namespace=namespace})
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
88 if type(ns_data.filtering) == "table" then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
89 for _, attribute in pairs(ns_data.filtering) do
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
90 message:tag("attribute", {name=attribute}):up()
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
91 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
92 end
2758
82109d8eca41 mod_delegation: fixed misplaced up() in <message> stanza generation
Goffi <goffi@goffi.org>
parents: 2752
diff changeset
93 message:up()
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
94 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
95 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
96
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
97 if have_delegation then
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
98 session.send(message)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
99 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
100 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
101
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
102 local function set_connected(entity_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
103 -- set the "connected" key for all namespace managed by entity_jid
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
104 -- if the namespace has already a connected entity, ignore the new one
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
105 local function set_config(jid_)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
106 for namespace, ns_data in pairs(jid2ns[jid_]) do
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
107 if ns_data.connected == nil then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
108 ns_data.connected = entity_jid
4709
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
109 -- disco remaining and disco items remaining are special namespaces
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
110 -- there is no disco nesting for them
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
111 if namespace ~= _DISCO_ITEMS_REMAINING and namespace ~= _DISCO_REMAINING then
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
112 disco_nest(namespace, entity_jid)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
113 end
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
114 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
115 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
116 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
117 local bare_jid = jid.bare(entity_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
118 set_config(bare_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
119 -- We can have a bare jid of a full jid specified in configuration
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
120 -- so we try our luck with both (first connected resource will
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
121 -- manage the namespaces in case of bare jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
122 if bare_jid ~= entity_jid then
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
123 set_config(entity_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
124 jid2ns[entity_jid] = jid2ns[bare_jid]
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
125 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
126 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
127
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
128 local function on_presence(event)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
129 local session = event.origin
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
130 local bare_jid = jid.bare(session.full_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
131
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
132 if jid2ns[bare_jid] or jid2ns[session.full_jid] then
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
133 set_connected(session.full_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
134 advertise_delegations(session, session.full_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
135 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
136 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
137
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
138 local function on_component_connected(event)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
139 -- method called by the module loaded by the component
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
140 -- /!\ the event come from the component host,
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
141 -- not from the host of this module
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
142 local session = event.session
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
143 local bare_jid = jid.join(session.username, session.host)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
144
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
145 local jid_delegations = jid2ns[bare_jid]
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
146 if jid_delegations ~= nil then
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
147 set_connected(bare_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
148 advertise_delegations(session, bare_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
149 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
150 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
151
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
152 local function on_component_auth(event)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
153 -- react to component-authenticated event from this host
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
154 -- and call the on_connected methods from all other hosts
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
155 -- needed for the component to get delegations advertising
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
156 for callback in connected_cb:items() do
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
157 callback(event)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
158 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
159 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
160
1776
e7b5ab44339c mod_delegation: fixed bad calling of on_auth for components
Goffi <goffi@goffi.org>
parents: 1774
diff changeset
161 if module:get_host_type() ~= "component" then
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
162 connected_cb:add(on_component_connected)
1776
e7b5ab44339c mod_delegation: fixed bad calling of on_auth for components
Goffi <goffi@goffi.org>
parents: 1774
diff changeset
163 end
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
164 module:hook('component-authenticated', on_component_auth)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
165 module:hook('presence/initial', on_presence)
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
166
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
167
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
168 --> delegated namespaces hook <--
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
169
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
170 local managing_ent_error
1720
48b7e8021afa mod_delegation: original stanza is now cached outside of ns_data, so it can be accessed without knowing the namespace.
Goffi <goffi@goffi.org>
parents: 1719
diff changeset
171 local stanza_cache = {} -- we cache original stanza to build reply
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
172
4939
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
173 local function clean_xmlns(node)
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
174 -- Recursively remove "jabber:client" attribute from node.
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
175 -- In Prosody internal routing, xmlns should not be set.
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
176 -- Keeping xmlns would lead to issues like mod_smacks ignoring the outgoing stanza,
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
177 -- so we remove all xmlns attributes with a value of "jabber:client"
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
178 -- note: this function comes from mod_privilege
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
179 if node.attr.xmlns == 'jabber:client' then
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
180 for childnode in node:childtags() do
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
181 clean_xmlns(childnode)
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
182 end
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
183 node.attr.xmlns = nil
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
184 end
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
185 end
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
186
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
187 local function managing_ent_result(event)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
188 -- this function manage iq results from the managing entity
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
189 -- it do a couple of security check before sending the
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
190 -- result to the managed entity
1719
3938496cd4f8 mod_delegation: removed invalid error replies to iq result.
Goffi <goffi@goffi.org>
parents: 1718
diff changeset
191 local stanza = event.stanza
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
192 if stanza.attr.to ~= module.host then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
193 module:log("warn", 'forwarded stanza result has "to" attribute not addressed to current host, id conflict ?')
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
194 return
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
195 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
196 module:unhook("iq-result/host/"..stanza.attr.id, managing_ent_result)
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
197 module:unhook("iq-error/host/"..stanza.attr.id, managing_ent_error)
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
198
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
199 -- lot of checks to do...
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
200 local delegation = stanza.tags[1]
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
201 if #stanza ~= 1 or delegation.name ~= "delegation" or
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
202 delegation.attr.xmlns ~= _DELEGATION_NS then
1719
3938496cd4f8 mod_delegation: removed invalid error replies to iq result.
Goffi <goffi@goffi.org>
parents: 1718
diff changeset
203 module:log("warn", "ignoring invalid iq result from managing entity %s", stanza.attr.from)
1720
48b7e8021afa mod_delegation: original stanza is now cached outside of ns_data, so it can be accessed without knowing the namespace.
Goffi <goffi@goffi.org>
parents: 1719
diff changeset
204 stanza_cache[stanza.attr.from][stanza.attr.id] = nil
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
205 return true
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
206 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
207
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
208 local forwarded = delegation.tags[1]
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
209 if #delegation ~= 1 or forwarded.name ~= "forwarded" or
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
210 forwarded.attr.xmlns ~= _FORWARDED_NS then
1719
3938496cd4f8 mod_delegation: removed invalid error replies to iq result.
Goffi <goffi@goffi.org>
parents: 1718
diff changeset
211 module:log("warn", "ignoring invalid iq result from managing entity %s", stanza.attr.from)
1720
48b7e8021afa mod_delegation: original stanza is now cached outside of ns_data, so it can be accessed without knowing the namespace.
Goffi <goffi@goffi.org>
parents: 1719
diff changeset
212 stanza_cache[stanza.attr.from][stanza.attr.id] = nil
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
213 return true
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
214 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
215
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
216 local iq = forwarded.tags[1]
1723
ef85c42ad977 mod_delegation: fixed bad handling of error replies from managing entity
Goffi <goffi@goffi.org>
parents: 1722
diff changeset
217 if #forwarded ~= 1 or iq.name ~= "iq" or
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
218 iq.attr.xmlns ~= 'jabber:client' or
1774
7bfc23b2c038 mod_delegation: fixed handling of <iq> results without children
Goffi <goffi@goffi.org>
parents: 1724
diff changeset
219 (iq.attr.type =='result' and #iq > 1) or
1723
ef85c42ad977 mod_delegation: fixed bad handling of error replies from managing entity
Goffi <goffi@goffi.org>
parents: 1722
diff changeset
220 (iq.attr.type == 'error' and #iq > 2) then
1719
3938496cd4f8 mod_delegation: removed invalid error replies to iq result.
Goffi <goffi@goffi.org>
parents: 1718
diff changeset
221 module:log("warn", "ignoring invalid iq result from managing entity %s", stanza.attr.from)
1720
48b7e8021afa mod_delegation: original stanza is now cached outside of ns_data, so it can be accessed without knowing the namespace.
Goffi <goffi@goffi.org>
parents: 1719
diff changeset
222 stanza_cache[stanza.attr.from][stanza.attr.id] = nil
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
223 return true
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
224 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
225
4939
7d6ae8bb95dc mod_delegation: use clean_xmlns to remove jabber:client namespace from node:
Goffi <goffi@goffi.org>
parents: 4709
diff changeset
226 clean_xmlns(iq)
1724
2440a75e868f mod_delegation: managing_ent_* now stop event propagation + forwarded <iq/> xmlns check
Goffi <goffi@goffi.org>
parents: 1723
diff changeset
227
1720
48b7e8021afa mod_delegation: original stanza is now cached outside of ns_data, so it can be accessed without knowing the namespace.
Goffi <goffi@goffi.org>
parents: 1719
diff changeset
228 local original = stanza_cache[stanza.attr.from][stanza.attr.id]
48b7e8021afa mod_delegation: original stanza is now cached outside of ns_data, so it can be accessed without knowing the namespace.
Goffi <goffi@goffi.org>
parents: 1719
diff changeset
229 stanza_cache[stanza.attr.from][stanza.attr.id] = nil
1723
ef85c42ad977 mod_delegation: fixed bad handling of error replies from managing entity
Goffi <goffi@goffi.org>
parents: 1722
diff changeset
230 -- we get namespace from original and not iq
ef85c42ad977 mod_delegation: fixed bad handling of error replies from managing entity
Goffi <goffi@goffi.org>
parents: 1722
diff changeset
231 -- because the namespace can be lacking in case of error
ef85c42ad977 mod_delegation: fixed bad handling of error replies from managing entity
Goffi <goffi@goffi.org>
parents: 1722
diff changeset
232 local namespace = original.tags[1].attr.xmlns
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
233
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
234 -- small hack for disco remaining feat
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
235 if namespace == _DISCO_ITEMS_NS then
4709
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
236 namespace = _DISCO_ITEMS_REMAINING
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
237 elseif namespace == _DISCO_INFO_NS then
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
238 namespace = _DISCO_REMAINING
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
239 end
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
240
1723
ef85c42ad977 mod_delegation: fixed bad handling of error replies from managing entity
Goffi <goffi@goffi.org>
parents: 1722
diff changeset
241 local ns_data = ns_delegations[namespace]
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
242
1723
ef85c42ad977 mod_delegation: fixed bad handling of error replies from managing entity
Goffi <goffi@goffi.org>
parents: 1722
diff changeset
243 if stanza.attr.from ~= ns_data.connected or (iq.attr.type ~= "result" and iq.attr.type ~= "error") or
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
244 iq.attr.id ~= original.attr.id or iq.attr.to ~= original.attr.from then
1719
3938496cd4f8 mod_delegation: removed invalid error replies to iq result.
Goffi <goffi@goffi.org>
parents: 1718
diff changeset
245 module:log("warn", "ignoring forbidden iq result from managing entity %s, please check that the component is no trying to do something bad (stanza: %s)", stanza.attr.from, tostring(stanza))
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
246 module:send(st.error_reply(original, 'cancel', 'service-unavailable'))
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
247 return true
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
248 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
249
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
250 -- at this point eveything is checked,
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
251 -- and we (hopefully) can send the the result safely
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
252 module:send(iq)
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
253 return true
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
254 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
255
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
256 function managing_ent_error(event)
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
257 local stanza = event.stanza
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
258 if stanza.attr.to ~= module.host then
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
259 module:log("warn", 'Stanza result has "to" attribute not addressed to current host, id conflict ?')
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
260 return
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
261 end
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
262 module:unhook("iq-result/host/"..stanza.attr.id, managing_ent_result)
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
263 module:unhook("iq-error/host/"..stanza.attr.id, managing_ent_error)
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
264 local original = stanza_cache[stanza.attr.from][stanza.attr.id]
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
265 stanza_cache[stanza.attr.from][stanza.attr.id] = nil
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
266 module:log("warn", "Got an error after forwarding stanza to "..stanza.attr.from)
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
267 module:send(st.error_reply(original, 'cancel', 'service-unavailable'))
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
268 return true
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
269 end
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
270
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
271 local function forward_iq(stanza, ns_data)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
272 local to_jid = ns_data.connected
1722
c48c7f948cfb mod_delegation: fixed namespace of <forwarded/> child element, as specified in XEP-0297
Goffi <goffi@goffi.org>
parents: 1721
diff changeset
273 stanza.attr.xmlns = 'jabber:client'
3317
36a9170352b5 mod_delegation: Update to generate own iq ids
Matthew Wild <mwild1@gmail.com>
parents: 3271
diff changeset
274 local iq_id = new_id();
36a9170352b5 mod_delegation: Update to generate own iq ids
Matthew Wild <mwild1@gmail.com>
parents: 3271
diff changeset
275 local iq_stanza = st.iq({ from=module.host, to=to_jid, type="set", id = iq_id })
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
276 :tag("delegation", { xmlns=_DELEGATION_NS })
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
277 :tag("forwarded", { xmlns=_FORWARDED_NS })
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
278 :add_child(stanza)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
279 -- we save the original stanza to check the managing entity result
1720
48b7e8021afa mod_delegation: original stanza is now cached outside of ns_data, so it can be accessed without knowing the namespace.
Goffi <goffi@goffi.org>
parents: 1719
diff changeset
280 if not stanza_cache[to_jid] then stanza_cache[to_jid] = {} end
48b7e8021afa mod_delegation: original stanza is now cached outside of ns_data, so it can be accessed without knowing the namespace.
Goffi <goffi@goffi.org>
parents: 1719
diff changeset
281 stanza_cache[to_jid][iq_id] = stanza
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
282 module:hook("iq-result/host/"..iq_id, managing_ent_result)
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
283 module:hook("iq-error/host/"..iq_id, managing_ent_error)
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
284 module:log("debug", "stanza forwarded")
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
285 module:send(iq_stanza)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
286 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
287
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
288 local function iq_hook(event)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
289 -- general hook for all the iq which forward delegated ones
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
290 -- and continue normal behaviour else. If a namespace is
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
291 -- delegated but managing entity is offline, a service-unavailable
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
292 -- error will be sent, as requested by the XEP
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
293 local session, stanza = event.origin, event.stanza
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
294 if #stanza == 1 and stanza.attr.type == 'get' or stanza.attr.type == 'set' then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
295 local namespace = stanza.tags[1].attr.xmlns
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
296 local ns_data = ns_delegations[namespace]
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
297
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
298 if ns_data then
1715
241c061bb953 mod_delegation: we don't forward stanzas from managing entity itself
Goffi <goffi@goffi.org>
parents: 1714
diff changeset
299 if stanza.attr.from == ns_data.connected then
241c061bb953 mod_delegation: we don't forward stanzas from managing entity itself
Goffi <goffi@goffi.org>
parents: 1714
diff changeset
300 -- we don't forward stanzas from managing entity itself
241c061bb953 mod_delegation: we don't forward stanzas from managing entity itself
Goffi <goffi@goffi.org>
parents: 1714
diff changeset
301 return
241c061bb953 mod_delegation: we don't forward stanzas from managing entity itself
Goffi <goffi@goffi.org>
parents: 1714
diff changeset
302 end
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
303 if ns_data.filtering then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
304 local first_child = stanza.tags[1]
1988
d7c1daaf2dea mod_delegation: fixed attribute filtering
Goffi <goffi@goffi.org>
parents: 1776
diff changeset
305 for _, attribute in pairs(ns_data.filtering) do
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
306 -- if any filtered attribute if not present,
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
307 -- we must continue the normal bahaviour
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
308 if not first_child.attr[attribute] then
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
309 -- Filtered attribute is not present, we do normal workflow
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
310 return
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
311 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
312 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
313 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
314 if not ns_data.connected then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
315 module:log("warn", "No connected entity to manage "..namespace)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
316 session.send(st.error_reply(stanza, 'cancel', 'service-unavailable'))
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
317 else
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
318 forward_iq(stanza, ns_data)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
319 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
320 return true
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
321 else
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
322 -- we have no delegation, we continue normal behaviour
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
323 return
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
324 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
325 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
326 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
327
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
328 module:hook("iq/self", iq_hook, 2^32)
1718
48be6e7efbe8 mod_delegation: added 'iq/bare' to hooked events.
Goffi <goffi@goffi.org>
parents: 1717
diff changeset
329 module:hook("iq/bare", iq_hook, 2^32)
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
330 module:hook("iq/host", iq_hook, 2^32)
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
331
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
332
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
333 --> discovery nesting <--
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
334
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
335 -- disabling internal features/identities
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
336
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
337 local function find_form_type(stanza)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
338 local form_type = nil
2069
cf9cd666ba00 mod_delegation: fixed bad use of period instead of colon
Goffi <goffi@goffi.org>
parents: 2067
diff changeset
339 for field in stanza:childtags('field', 'jabber:x:data') do
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
340 if field.attr.var=='FORM_TYPE' and field.attr.type=='hidden' then
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
341 local value = field:get_child('value')
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
342 if not value then
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
343 module:log("warn", "No value found in FORM_TYPE field: "..tostring(stanza))
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
344 else
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
345 form_type=value.get_text()
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
346 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
347 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
348 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
349 return form_type
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
350 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
351
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
352 -- modules whose features/identities are managed by delegation
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
353 local disabled_modules = set.new()
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
354 local disabled_identities = set.new()
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
355
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
356 local function identity_added(event)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
357 local source = event.source
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
358 if disabled_modules:contains(source) then
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
359 local item = event.item
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
360 local category, type_, name = item.category, item.type, item.name
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
361 module:log("debug", "Removing (%s/%s%s) identity because of delegation", category, type_, name and "/"..name or "")
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
362 disabled_identities:add(item)
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
363 source:remove_item("identity", item)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
364 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
365 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
366
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
367 local function feature_added(event)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
368 local source, item = event.source, event.item
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
369 for namespace, _ in pairs(ns_delegations) do
3387
c5e8042b174c mod_delegation: avoid crash on recent prosody versions
Goffi <goffi@goffi.org>
parents: 3317
diff changeset
370 if source ~= nil and source ~= module and string.sub(item, 1, #namespace) == namespace then
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
371 module:log("debug", "Removing %s feature which is delegated", item)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
372 source:remove_item("feature", item)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
373 disabled_modules:add(source)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
374 if source.items and source.items.identity then
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
375 -- we remove all identities added by the source module
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
376 -- that can cause issues if the module manages several features/identities
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
377 -- but this case is probably rare (or doesn't happen at all)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
378 -- FIXME: any better way ?
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
379 for _, identity in pairs(source.items.identity) do
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
380 identity_added({source=source, item=identity})
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
381 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
382 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
383 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
384 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
385 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
386
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
387 local function extension_added(event)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
388 local source, stanza = event.source, event.item
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
389 local form_type = find_form_type(stanza)
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
390 if not form_type then return end
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
391
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
392 for namespace, _ in pairs(ns_delegations) do
3387
c5e8042b174c mod_delegation: avoid crash on recent prosody versions
Goffi <goffi@goffi.org>
parents: 3317
diff changeset
393 if source ~= nil and source ~= module and string.sub(form_type, 1, #namespace) == namespace then
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
394 module:log("debug", "Removing extension which is delegated: %s", tostring(stanza))
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
395 source:remove_item("extension", stanza)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
396 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
397 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
398 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
399
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
400 -- for disco nesting (see § 7.2) we need to remove internal features
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
401 -- we use handle_items as it allows to remove already added features
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
402 -- and catch the ones which can come later
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
403 module:handle_items("feature", feature_added, function(_) end)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
404 module:handle_items("identity", identity_added, function(_) end, false)
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
405 module:handle_items("extension", extension_added, function(_) end)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
406
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
407
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
408 -- managing entity features/identities collection
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
409
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
410 local disco_error
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
411 local bare_features = set.new()
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
412 local bare_identities = {}
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
413 local bare_extensions = {}
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
414
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
415 local function disco_result(event)
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
416 -- parse result from disco nesting request
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
417 -- and fill module features/identities and bare_features/bare_identities accordingly
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
418 local session, stanza = event.origin, event.stanza
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
419 if stanza.attr.to ~= module.host then
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
420 module:log("warn", 'Stanza result has "to" attribute not addressed to current host, id conflict ?')
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
421 return
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
422 end
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
423 module:unhook("iq-result/host/"..stanza.attr.id, disco_result)
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
424 module:unhook("iq-error/host/"..stanza.attr.id, disco_error)
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
425 local query = stanza:get_child("query", _DISCO_INFO_NS)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
426 if not query or not query.attr.node then
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
427 session.send(st.error_reply(stanza, 'modify', 'not-acceptable'))
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
428 return true
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
429 end
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
430
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
431 local node = query.attr.node
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
432 local main
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
433
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
434 if string.sub(node, 1, #_MAIN_PREFIX) == _MAIN_PREFIX then
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
435 main=true
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
436 elseif string.sub(node, 1, #_BARE_PREFIX) == _BARE_PREFIX then
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
437 main=false
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
438 else
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
439 module:log("warn", "Unexpected node: "..node)
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
440 session.send(st.error_reply(stanza, 'modify', 'not-acceptable'))
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
441 return true
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
442 end
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
443
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
444 for feature in query:childtags("feature") do
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
445 local namespace = feature.attr.var
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
446 if main then
1717
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
447 module:add_feature(namespace)
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
448 else
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
449 bare_features:add(namespace)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
450 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
451 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
452 for identity in query:childtags("identity") do
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
453 local category, type_, name = identity.attr.category, identity.attr.type, identity.attr.name
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
454 if main then
1717
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
455 module:add_identity(category, type_, name)
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
456 else
1717
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
457 table.insert(bare_identities, {category=category, type=type_, name=name})
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
458 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
459 end
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
460 for extension in query:childtags("x", _DATA_NS) do
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
461 if main then
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
462 module:add_extension(extension)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
463 else
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
464 table.insert(bare_extensions, extension)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
465 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
466 end
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
467 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
468
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
469 function disco_error(event)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
470 local stanza = event.stanza
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
471 if stanza.attr.to ~= module.host then
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
472 module:log("warn", 'Stanza result has "to" attribute not addressed to current host, id conflict ?')
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
473 return
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
474 end
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
475 module:unhook("iq-result/host/"..stanza.attr.id, disco_result)
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
476 module:unhook("iq-error/host/"..stanza.attr.id, disco_error)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
477 module:log("warn", "Got an error while requesting disco for nesting to "..stanza.attr.from)
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
478 module:log("warn", "Ignoring disco nesting")
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
479 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
480
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
481 function disco_nest(namespace, entity_jid)
1717
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
482 -- manage discovery nesting (see § 7.2)
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
483
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
484 -- first we reset the current values
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
485 if module.items then
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
486 module.items['feature'] = nil
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
487 module.items['identity'] = nil
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
488 module.items['extension'] = nil
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
489 bare_features = set.new()
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
490 bare_identities = {}
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
491 bare_extensions = {}
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
492 end
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
493
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
494 for _, prefix in ipairs(_PREFIXES) do
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
495 local node = prefix..namespace
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
496
3317
36a9170352b5 mod_delegation: Update to generate own iq ids
Matthew Wild <mwild1@gmail.com>
parents: 3271
diff changeset
497 local iq_id = new_id();
36a9170352b5 mod_delegation: Update to generate own iq ids
Matthew Wild <mwild1@gmail.com>
parents: 3271
diff changeset
498 local iq = st.iq({from=module.host, to=entity_jid, type='get', id = iq_id })
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
499 :tag('query', {xmlns=_DISCO_INFO_NS, node=node})
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
500
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
501 module:hook("iq-result/host/"..iq_id, disco_result)
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
502 module:hook("iq-error/host/"..iq_id, disco_error)
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
503 module:send(iq)
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
504 end
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
505 end
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
506
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
507 -- disco to bare jids special cases
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
508
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
509 -- disco#info
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
510
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
511 local function disco_hook(event)
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
512 -- this event is called when a disco info request is done on a bare jid
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
513 -- we get the final reply and filter delegated features/identities/extensions
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
514 local reply = event.reply
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
515 reply.tags[1]:maptags(function(child)
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
516 if child.name == 'feature' then
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
517 local feature_ns = child.attr.var
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
518 for namespace, _ in pairs(ns_delegations) do
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
519 if string.sub(feature_ns, 1, #namespace) == namespace then
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
520 module:log("debug", "Removing feature namespace %s which is delegated", feature_ns)
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
521 return nil
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
522 end
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
523 end
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
524 elseif child.name == 'identity' then
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
525 for item in disabled_identities:items() do
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
526 if item.category == child.attr.category
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
527 and item.type == child.attr.type
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
528 -- we don't check name, because mod_pep use a name for main disco, but not in account-disco-info hook
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
529 -- and item.name == child.attr.name
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
530 then
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
531 module:log("debug", "Removing (%s/%s%s) identity because of delegation", item.category, item.type, item.name and "/"..item.name or "")
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
532 return nil
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
533 end
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
534 end
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
535 elseif child.name == 'x' and child.attr.xmlns == _DATA_NS then
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
536 local form_type = find_form_type(child)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
537 if form_type then
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
538 for namespace, _ in pairs(ns_delegations) do
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
539 if string.sub(form_type, 1, #namespace) == namespace then
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
540 module:log("debug", "Removing extension which is delegated: %s", tostring(child))
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
541 return nil
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
542 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
543 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
544 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
545
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
546 end
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
547 return child
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
548 end)
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
549 for feature in bare_features:items() do
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
550 reply:tag('feature', {var=feature}):up()
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
551 end
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
552 for _, item in ipairs(bare_identities) do
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
553 reply:tag('identity', {category=item.category, type=item.type, name=item.name}):up()
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
554 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
555 for _, stanza in ipairs(bare_extensions) do
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
556 reply:add_child(stanza)
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
557 end
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
558
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
559 end
4616
377546ab50f9 mod_delegation: fix bare jid disco nesting
Goffi <goffi@goffi.org>
parents: 3387
diff changeset
560 module:hook("account-disco-info", disco_hook, -2^32)
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
561
4709
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
562 local function disco_node_hook(event)
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
563 -- we reach this hook if a disco node on account has not been found
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
564 -- we then forward the request to managing entity
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
565 if not event.exists then
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
566 -- this node is not handled by the server
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
567 local ns_data = ns_delegations[_DISCO_REMAINING]
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
568 if ns_data ~= nil then
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
569 -- remaining delegation is requested, we forward
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
570 forward_iq(event.stanza, ns_data)
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
571 -- and stop normal event handling
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
572 return true
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
573 end
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
574 end
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
575 end
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
576 module:hook("account-disco-info-node", disco_node_hook, -2^32)
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
577
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
578 -- disco#items
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
579
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
580 local function disco_items_node_hook(event)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
581 -- check if node is not handled by server
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
582 -- and forward the disco request to suitable entity
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
583 if not event.exists then
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
584 -- this node is not handled by the server
4709
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
585 local ns_data = ns_delegations[_DISCO_ITEMS_REMAINING]
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
586 if ns_data ~= nil then
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
587 -- remaining delegation is requested, we forward
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
588 forward_iq(event.stanza, ns_data)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
589 -- and stop normal event handling
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
590 return true
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
591 end
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
592 end
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
593 end
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
594 module:hook("account-disco-items-node", disco_items_node_hook, -2^32)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
595
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
596 local function disco_items_hook(event)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
597 -- FIXME: we forward all bare-jid disco-items requests (without node) which will replace any Prosody reply
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
598 -- for now it's OK because Prosody is not returning anything on request on bare jid
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
599 -- but to be properly done, any Prosody reply should be kept and managing entities items should be added (merged) to it.
4709
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
600 -- account-disco-items can't be cancelled (return value of hooks are not checked in mod_disco), so coroutine needs
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
601 -- to be used with util.async (to get the IQ result, merge items then return from the event)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
602 local origin, stanza = event.origin, event.stanza;
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
603 local node = stanza.tags[1].attr.node;
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
604 local username = jid_split(stanza.attr.to) or origin.username;
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
605 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
606 if node == nil or node == "" then
4709
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
607 local ns_data = ns_delegations[_DISCO_ITEMS_REMAINING]
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
608 if ns_data ~= nil then
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
609 forward_iq(event.stanza, ns_data)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
610 return true
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
611 end
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
612 end
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
613 end
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
614 end
3271
7504f765e767 mod_delegation: Simplify iq handling by hooking on iq-get/ instead of iq/.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2758
diff changeset
615 module:hook("iq-get/bare/http://jabber.org/protocol/disco#items:query", disco_items_hook, 100)
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
616
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
617 local function disco_items_raw_hook(event)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
618 -- this method is called when account-disco-items-* event are not called
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
619 -- notably when a disco-item is done by an unsubscibed entity
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
620 -- (i.e. an entity doing a disco#item on an entity without having
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
621 -- presence subscription)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
622 -- we forward the request to managing entity
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
623 -- it's the responsability of the managing entity to filter the items
4709
679f1834dbdb mod_delegation: update to XEP-0355 v0.5
Goffi <goffi@goffi.org>
parents: 4616
diff changeset
624 local ns_data = ns_delegations[_DISCO_ITEMS_REMAINING]
2752
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
625 if ns_data ~= nil then
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
626 forward_iq(event.stanza, ns_data)
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
627 return true
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
628 end
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
629 end
d0e75bf21d30 mod_delegation: added disco#items support
Goffi <goffi@goffi.org>
parents: 2069
diff changeset
630 module:hook("iq-get/bare/http://jabber.org/protocol/disco#items:query", disco_items_raw_hook, -2^32)