Mercurial > prosody-modules
annotate mod_delegation/mod_delegation.lua @ 2608:362ca94192ee
mod_smacks: Add resumed session to event "smacks-hibernation-end"
Older versions of this event only have the "intermediate" session
in event.session (the one used to resume the existing session),
but not the resumed one.
This adds event.resumed which contains the resumed one alongside
to event.session.
author | tmolitor <thilo@eightysoft.de> |
---|---|
date | Sat, 11 Mar 2017 01:37:28 +0100 |
parents | cf9cd666ba00 |
children | d0e75bf21d30 |
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 | 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); |