annotate mod_delegation/mod_delegation.lua @ 5342:e28ba69b5307

mod_rest: Implement use of refresh tokens in rest.sh example Because having access tokens expire daily was becoming annoying. Now this is starting to be in dire need of refactoring.
author Kim Alvefur <zash@zash.se>
date Wed, 12 Apr 2023 11:24:50 +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)