annotate mod_delegation/mod_delegation.lua @ 2712:d89ab70808f6

mod_cloud_notify: fix bug when multiple resources are used This bug was triggered under the rare circumstances that a message arrived and one resource was smacks hibernated while the other one(s) were offline. Then only the hibernated resource but not the offline one(s) (or the other way round) got notified.
author tmolitor <thilo@eightysoft.de>
date Mon, 08 May 2017 18:24:29 +0200
parents cf9cd666ba00
children d0e75bf21d30
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
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
16 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
17
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
18 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
19 -- 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
20 -- 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
21 -- other hosts
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
22 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
23 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
24 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
25
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
26 local _DELEGATION_NS = 'urn:xmpp:delegation:1'
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
27 local _FORWARDED_NS = 'urn:xmpp:forward:0'
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
28 local _DISCO_NS = 'http://jabber.org/protocol/disco#info'
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
29 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
30
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
31 local _MAIN_SEP = '::'
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
32 local _BARE_SEP = ':bare:'
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
33 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
34 local _BARE_PREFIX = _DELEGATION_NS.._BARE_SEP
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
35 local _PREFIXES = {_MAIN_PREFIX, _BARE_PREFIX}
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
36
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
37 local disco_nest
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
38
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
39 module:log("debug", "Loading namespace delegation module ");
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
40
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
41 --> Configuration management <--
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
42
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
43 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
44
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
45 local jid2ns = {}
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
46 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
47 -- "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
48 ns_data.connected = nil
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
49 if ns_data.jid then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
50 if jid2ns[ns_data.jid] == nil then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
51 jid2ns[ns_data.jid] = {}
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
52 end
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
53 jid2ns[ns_data.jid][namespace] = ns_data
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
54 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
55 else
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
56 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
57 ns_delegations[namespace] = nil
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
58 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
59 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
60
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
61
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
62 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
63 -- 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
64 -- as expained in § 4.2
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
65 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
66 :tag("delegation", {xmlns=_DELEGATION_NS})
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
67
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
68 -- 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
69 -- 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
70 -- 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
71 local have_delegation = false
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
72
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
73 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
74 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
75 have_delegation = true
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
76 message:tag("delegated", {namespace=namespace})
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
77 if type(ns_data.filtering) == "table" then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
78 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
79 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
80 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
81 message:up()
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
82 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
83 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
84 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
85
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
86 if have_delegation then
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
87 session.send(message)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
88 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
89 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
90
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
91 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
92 -- 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
93 -- 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
94 local function set_config(jid_)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
95 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
96 if ns_data.connected == nil then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
97 ns_data.connected = entity_jid
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
98 disco_nest(namespace, entity_jid)
1709
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 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
102 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
103 set_config(bare_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
104 -- 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
105 -- 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
106 -- 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
107 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
108 set_config(entity_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
109 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
110 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
111 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
112
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
113 local function on_presence(event)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
114 local session = event.origin
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
115 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
116
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
117 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
118 set_connected(session.full_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
119 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
120 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
121 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
122
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
123 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
124 -- 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
125 -- /!\ 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
126 -- 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
127 local session = event.session
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
128 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
129
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
130 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
131 if jid_delegations ~= nil then
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
132 set_connected(bare_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
133 advertise_delegations(session, bare_jid)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
134 end
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
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
137 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
138 -- 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
139 -- 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
140 -- 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
141 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
142 callback(event)
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
143 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
144 end
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
145
1776
e7b5ab44339c mod_delegation: fixed bad calling of on_auth for components
Goffi <goffi@goffi.org>
parents: 1774
diff changeset
146 if module:get_host_type() ~= "component" then
e7b5ab44339c mod_delegation: fixed bad calling of on_auth for components
Goffi <goffi@goffi.org>
parents: 1774
diff changeset
147 connected_cb:add(on_component_connected)
e7b5ab44339c mod_delegation: fixed bad calling of on_auth for components
Goffi <goffi@goffi.org>
parents: 1774
diff changeset
148 end
1709
59ba224bf145 mod_delegation: XEP-0355 implementation, first draft (configuration management + delegations advertising)
Goffi <goffi@goffi.org>
parents:
diff changeset
149 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
150 module:hook('presence/initial', on_presence)
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
151
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
152
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
153 --> delegated namespaces hook <--
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
154
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
155 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
156 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
157
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
158 local function managing_ent_result(event)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
159 -- 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
160 -- 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
161 -- result to the managed entity
1719
3938496cd4f8 mod_delegation: removed invalid error replies to iq result.
Goffi <goffi@goffi.org>
parents: 1718
diff changeset
162 local stanza = event.stanza
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
163 if stanza.attr.to ~= module.host then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
164 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
165 return
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
166 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
167 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
168 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
169
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
170 -- lot of checks to do...
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
171 local delegation = stanza.tags[1]
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
172 if #stanza ~= 1 or delegation.name ~= "delegation" or
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
173 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
174 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
175 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
176 return true
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
177 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
178
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
179 local forwarded = delegation.tags[1]
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
180 if #delegation ~= 1 or forwarded.name ~= "forwarded" or
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
181 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
182 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
183 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
184 return true
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
185 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
186
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
187 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
188 if #forwarded ~= 1 or iq.name ~= "iq" or
1724
2440a75e868f mod_delegation: managing_ent_* now stop event propagation + forwarded <iq/> xmlns check
Goffi <goffi@goffi.org>
parents: 1723
diff changeset
189 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
190 (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
191 (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
192 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
193 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
194 return true
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
1724
2440a75e868f mod_delegation: managing_ent_* now stop event propagation + forwarded <iq/> xmlns check
Goffi <goffi@goffi.org>
parents: 1723
diff changeset
197 iq.attr.xmlns = nil
2440a75e868f mod_delegation: managing_ent_* now stop event propagation + forwarded <iq/> xmlns check
Goffi <goffi@goffi.org>
parents: 1723
diff changeset
198
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
199 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
200 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
201 -- 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
202 -- 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
203 local namespace = original.tags[1].attr.xmlns
ef85c42ad977 mod_delegation: fixed bad handling of error replies from managing entity
Goffi <goffi@goffi.org>
parents: 1722
diff changeset
204 local ns_data = ns_delegations[namespace]
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
205
1723
ef85c42ad977 mod_delegation: fixed bad handling of error replies from managing entity
Goffi <goffi@goffi.org>
parents: 1722
diff changeset
206 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
207 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
208 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
209 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
210 return true
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
211 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
212
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
213 -- at this point eveything is checked,
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
214 -- 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
215 module:send(iq)
1724
2440a75e868f mod_delegation: managing_ent_* now stop event propagation + forwarded <iq/> xmlns check
Goffi <goffi@goffi.org>
parents: 1723
diff changeset
216 return true
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
217 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
218
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
219 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
220 local stanza = event.stanza
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
221 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
222 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
223 return
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
224 end
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
225 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
226 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
227 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
228 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
229 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
230 module:send(st.error_reply(original, 'cancel', 'service-unavailable'))
1724
2440a75e868f mod_delegation: managing_ent_* now stop event propagation + forwarded <iq/> xmlns check
Goffi <goffi@goffi.org>
parents: 1723
diff changeset
231 return true
1721
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
232 end
f49359330493 mod_delegation: handling of error replies from managing entities after forward.
Goffi <goffi@goffi.org>
parents: 1720
diff changeset
233
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
234 local function forward_iq(stanza, ns_data)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
235 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
236 stanza.attr.xmlns = 'jabber:client'
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
237 local iq_stanza = st.iq({ from=module.host, to=to_jid, type="set" })
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
238 :tag("delegation", { xmlns=_DELEGATION_NS })
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
239 :tag("forwarded", { xmlns=_FORWARDED_NS })
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
240 :add_child(stanza)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
241 local iq_id = iq_stanza.attr.id
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
242 -- 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
243 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
244 stanza_cache[to_jid][iq_id] = stanza
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
245 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
246 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
247 module:log("debug", "stanza forwarded")
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
248 module:send(iq_stanza)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
249 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
250
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
251 local function iq_hook(event)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
252 -- 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
253 -- 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
254 -- 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
255 -- 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
256 local session, stanza = event.origin, event.stanza
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
257 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
258 local namespace = stanza.tags[1].attr.xmlns
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
259 local ns_data = ns_delegations[namespace]
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
260
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
261 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
262 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
263 -- 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
264 return
241c061bb953 mod_delegation: we don't forward stanzas from managing entity itself
Goffi <goffi@goffi.org>
parents: 1714
diff changeset
265 end
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
266 if ns_data.filtering then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
267 local first_child = stanza.tags[1]
1988
d7c1daaf2dea mod_delegation: fixed attribute filtering
Goffi <goffi@goffi.org>
parents: 1776
diff changeset
268 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
269 -- if any filtered attribute if not present,
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
270 -- we must continue the normal bahaviour
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
271 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
272 -- Filtered attribute is not present, we do normal workflow
1710
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
273 return;
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
274 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
275 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
276 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
277 if not ns_data.connected then
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
278 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
279 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
280 else
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
281 forward_iq(stanza, ns_data)
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
282 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
283 return true
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
284 else
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
285 -- we have no delegation, we continue normal behaviour
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
286 return
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
287 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
288 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
289 end
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
290
b68eed25b880 mod_delegation: iq forwarding to managing entity
Goffi <goffi@goffi.org>
parents: 1709
diff changeset
291 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
292 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
293 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
294
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
295
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
296 --> discovery nesting <--
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
297
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
298 -- disabling internal features/identities
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
299
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
300 local function find_form_type(stanza)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
301 local form_type = nil
2069
cf9cd666ba00 mod_delegation: fixed bad use of period instead of colon
Goffi <goffi@goffi.org>
parents: 2067
diff changeset
302 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
303 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
304 local value = field:get_child('value')
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
305 if not value then
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
306 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
307 else
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
308 form_type=value.get_text()
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
309 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
310 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
311 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
312 return form_type
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
313 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
314
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
315 -- 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
316 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
317 local disabled_identities = set.new()
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
318
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
319 local function identity_added(event)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
320 local source = event.source
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
321 if disabled_modules:contains(source) then
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
322 local item = event.item
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
323 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
324 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
325 disabled_identities:add(item)
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
326 source:remove_item("identity", item)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
327 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
328 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
329
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
330 local function feature_added(event)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
331 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
332 for namespace, _ in pairs(ns_delegations) do
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
333 if source ~= module and string.sub(item, 1, #namespace) == namespace then
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
334 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
335 source:remove_item("feature", item)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
336 disabled_modules:add(source)
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
337 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
338 -- 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
339 -- 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
340 -- 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
341 -- FIXME: any better way ?
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
342 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
343 identity_added({source=source, item=identity})
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
344 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
345 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
346 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
347 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
348 end
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
349
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
350 local function extension_added(event)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
351 local source, stanza = event.source, event.item
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
352 local form_type = find_form_type(stanza)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
353 if not form_type then return; end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
354
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
355 for namespace, _ in pairs(ns_delegations) do
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
356 if source ~= module and 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
357 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
358 source:remove_item("extension", stanza)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
359 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
360 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
361 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
362
1711
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
363 -- for disco nesting (see § 7.2) we need to remove internal features
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
364 -- we use handle_items as it allow to remove already added features
55b9ac807ac9 mod_delegation: delegated features/identities are removed from disco.
Goffi <goffi@goffi.org>
parents: 1710
diff changeset
365 -- 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
366 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
367 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
368 module:handle_items("extension", extension_added, function(_) end)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
369
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
370
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
371 -- managing entity features/identities collection
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
372
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
373 local disco_error
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
374 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
375 local bare_identities = {}
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
376 local bare_extensions = {}
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
377
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
378 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
379 -- 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
380 -- 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
381 local session, stanza = event.origin, event.stanza
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
382 if stanza.attr.to ~= module.host then
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
383 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
384 return
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
385 end
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
386 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
387 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
388 local query = stanza:get_child("query", _DISCO_NS)
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
389 if not query or not query.attr.node then
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
390 session.send(st.error_reply(stanza, 'modify', 'not-acceptable'))
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
391 return true
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
392 end
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
393
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
394 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
395 local main
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
396
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
397 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
398 main=true
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
399 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
400 main=false
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
401 else
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
402 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
403 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
404 return true
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
405 end
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
406
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
407 for feature in query:childtags("feature") do
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
408 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
409 if main then
1717
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
410 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
411 else
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
412 bare_features:add(namespace)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
413 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
414 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
415 for identity in query:childtags("identity") do
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
416 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
417 if main then
1717
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
418 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
419 else
1717
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
420 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
421 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
422 end
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
423 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
424 if main then
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
425 module:add_extension(extension)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
426 else
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
427 table.insert(bare_extensions, extension)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
428 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
429 end
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
430 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
431
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
432 function disco_error(event)
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
433 local stanza = event.stanza
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
434 if stanza.attr.to ~= module.host then
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
435 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
436 return
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
437 end
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
438 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
439 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
440 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
441 module:log("warn", "Ignoring disco nesting")
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
442 end
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
443
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
444 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
445 -- 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
446
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
447 -- 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
448 if module.items then
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
449 module.items['feature'] = nil
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
450 module.items['identity'] = nil
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
451 module.items['extension'] = nil
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
452 bare_features = set.new()
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
453 bare_identities = {}
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
454 bare_extensions = {}
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
455 end
e22cd2205fc1 mod_delegation: reset features/identities/extensions before doing a disco nesting
Goffi <goffi@goffi.org>
parents: 1716
diff changeset
456
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
457 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
458 local node = prefix..namespace
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
459
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
460 local iq = st.iq({from=module.host, to=entity_jid, type='get'})
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
461 :tag('query', {xmlns=_DISCO_NS, node=node})
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
462
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
463 local iq_id = iq.attr.id
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
464
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
465 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
466 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
467 module:send(iq)
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
468 end
1712
c1973605d096 mod_delegation: disco nesting for host
Goffi <goffi@goffi.org>
parents: 1711
diff changeset
469 end
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
470
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
471 -- disco to bare jids special case
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
472
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
473 module:hook("account-disco-info", function(event)
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
474 -- 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
475 -- we get the final reply and filter delegated features/identities/extensions
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
476 local reply = event.reply;
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
477 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
478 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
479 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
480 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
481 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
482 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
483 return nil
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
484 end
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
485 end
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
486 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
487 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
488 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
489 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
490 -- 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
491 -- 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
492 then
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
493 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
494 return nil
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
495 end
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
496 end
1716
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
497 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
498 local form_type = find_form_type(child)
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
499 if form_type then
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
500 for namespace, _ in pairs(ns_delegations) do
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
501 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
502 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
503 return nil
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
504 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
505 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
506 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
507
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
508 end
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
509 return child
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
510 end)
1714
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
511 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
512 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
513 end
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
514 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
515 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
516 end
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
517 for _, stanza in ipairs(bare_extensions) do
29dfdfc767b4 mod_delegation: service discovery extensions (xep-0128) management
Goffi <goffi@goffi.org>
parents: 1715
diff changeset
518 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
519 end
3d83f5337a73 mod_delegation: disco info request on bare jid is now managed
Goffi <goffi@goffi.org>
parents: 1713
diff changeset
520
1713
01e9465f8f80 mod_delegation: delegated features/identities removal for disco info requests on bare jid
Goffi <goffi@goffi.org>
parents: 1712
diff changeset
521 end, -2^32);