Software /
code /
prosody
Annotate
core/stanza_router.lua @ 8791:8da11142fabf
muc: Allow clients to change multiple affiliations or roles at once (#345)
According to XEP-0045 sections 9.2, 9.5 and 9.8 affiliation lists and role
lists should allow mass-modification. Prosody however would just use the
first entry of the list and ignore the rest. This is fixed by introducing
a `for` loop to `set` stanzas of the respective `muc#admin` namespace.
In order for this loop to work, the error handling was changed a little.
Prosody no longer returns after the first error. Instead, an error reply
is sent for each malformed or otherwise wrong entry, but the loop keeps
going over the other entries. This may lead to multiple error messages
being sent for one client request. A notable exception from this is when
the XML Schema for `muc#admin` requests is violated. In that case the loop
is aborted with an error message to the client.
The change is a bit bigger than that in order to have the loop only for
`set` stanzas without changing the behaviour of the `get` stanzas. This is
now more in line with trunk, where there are separate methods for each
stanza type.
References: #345
author | Lennart Sauerbeck <devel@lennart.sauerbeck.org> |
---|---|
date | Sat, 18 Mar 2017 18:47:28 +0100 |
parent | 8347:c72db8047440 |
child | 8676:39ab6a296419 |
child | 9067:89e1bf37ff64 |
rev | line source |
---|---|
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1521
diff
changeset
|
1 -- Prosody IM |
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2876
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2876
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5012
diff
changeset
|
4 -- |
758 | 5 -- This project is MIT/X11 licensed. Please see the |
6 -- COPYING file in the source package for more information. | |
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
468
diff
changeset
|
7 -- |
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
468
diff
changeset
|
8 |
30 | 9 local log = require "util.logger".init("stanzarouter") |
10 | |
1971
91420df04d5b
stanza_router: Localize hosts, full_sessions and bare_sessions, and take from the prosody object instead of _G
Matthew Wild <mwild1@gmail.com>
parents:
1900
diff
changeset
|
11 local hosts = _G.prosody.hosts; |
1413
b7e17efe433e
stanza_router: Remove unused variables and code
Waqas Hussain <waqas20@gmail.com>
parents:
1412
diff
changeset
|
12 local tostring = tostring; |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
13 local st = require "util.stanza"; |
105
b099f0f80775
Removed an unnecessary line
Waqas Hussain <waqas20@gmail.com>
parents:
83
diff
changeset
|
14 local jid_split = require "util.jid".split; |
718 | 15 local jid_prepped_split = require "util.jid".prepped_split; |
30 | 16 |
1971
91420df04d5b
stanza_router: Localize hosts, full_sessions and bare_sessions, and take from the prosody object instead of _G
Matthew Wild <mwild1@gmail.com>
parents:
1900
diff
changeset
|
17 local full_sessions = _G.prosody.full_sessions; |
91420df04d5b
stanza_router: Localize hosts, full_sessions and bare_sessions, and take from the prosody object instead of _G
Matthew Wild <mwild1@gmail.com>
parents:
1900
diff
changeset
|
18 local bare_sessions = _G.prosody.bare_sessions; |
91420df04d5b
stanza_router: Localize hosts, full_sessions and bare_sessions, and take from the prosody object instead of _G
Matthew Wild <mwild1@gmail.com>
parents:
1900
diff
changeset
|
19 |
5012
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
20 local core_post_stanza, core_process_stanza, core_route_stanza; |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
21 |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
22 function deprecated_warning(f) |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
23 _G[f] = function(...) |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
24 log("warn", "Using the global %s() is deprecated, use module:send() or prosody.%s(). %s", f, f, debug.traceback()); |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
25 return prosody[f](...); |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
26 end |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
27 end |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
28 deprecated_warning"core_post_stanza"; |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
29 deprecated_warning"core_process_stanza"; |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
30 deprecated_warning"core_route_stanza"; |
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
31 |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
32 local valid_stanzas = { message = true, presence = true, iq = true }; |
6663
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6559
diff
changeset
|
33 local function handle_unhandled_stanza(host, origin, stanza) --luacheck: ignore 212/host |
3539
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
34 local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns or "jabber:client", origin.type; |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
35 if xmlns == "jabber:client" and valid_stanzas[name] then |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
36 -- A normal stanza |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
37 local st_type = stanza.attr.type; |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
38 if st_type == "error" or (name == "iq" and st_type == "result") then |
7648
d91ef1e6afc2
stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents:
7448
diff
changeset
|
39 if st_type == "error" then |
d91ef1e6afc2
stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents:
7448
diff
changeset
|
40 local err_type, err_condition, err_message = stanza:get_error(); |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
41 log("debug", "Discarding unhandled error %s (%s, %s) from %s: %s", |
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
42 name, err_type, err_condition or "unknown condition", origin_type, stanza:top_tag()); |
7648
d91ef1e6afc2
stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents:
7448
diff
changeset
|
43 else |
d91ef1e6afc2
stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents:
7448
diff
changeset
|
44 log("debug", "Discarding %s from %s of type: %s", name, origin_type, st_type or '<nil>'); |
d91ef1e6afc2
stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents:
7448
diff
changeset
|
45 end |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
46 return; |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
47 end |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
48 if name == "iq" and (st_type == "get" or st_type == "set") and stanza.tags[1] then |
3539
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
49 xmlns = stanza.tags[1].attr.xmlns or "jabber:client"; |
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
50 end |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
51 log("debug", "Unhandled %s stanza: %s; xmlns=%s", origin_type, name, xmlns); |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
52 if origin.send then |
3539
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
53 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
54 end |
6403
166d1bd8fc38
core.stanza_router, mod_s2s: Move handling of S2S features to mod_s2s from stanza_router
Kim Alvefur <zash@zash.se>
parents:
6402
diff
changeset
|
55 else |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
56 log("warn", "Unhandled %s stream element or stanza: %s; xmlns=%s: %s", |
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
57 origin_type, name, xmlns, tostring(stanza)); -- we didn't handle it |
3539
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
58 origin:close("unsupported-stanza-type"); |
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
59 end |
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
60 end |
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
61 |
4130
c3508071af47
stanza_router: Return a <bad-request/> error on invalid IQ type.
Waqas Hussain <waqas20@gmail.com>
parents:
3586
diff
changeset
|
62 local iq_types = { set=true, get=true, result=true, error=true }; |
30 | 63 function core_process_stanza(origin, stanza) |
726
68a776711ba9
stanza_router: That'll teach me to not commit at this time of night. Or not.
Matthew Wild <mwild1@gmail.com>
parents:
725
diff
changeset
|
64 (origin.log or log)("debug", "Received[%s]: %s", origin.type, stanza:top_tag()) |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
65 |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
66 if origin.type == "c2s" and not stanza.attr.xmlns then |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
67 local name, st_type = stanza.name, stanza.attr.type; |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
68 if st_type == "error" and #stanza.tags == 0 then |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
69 return handle_unhandled_stanza(origin.host, origin, stanza); |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
70 end |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
71 if name == "iq" then |
7740
26a7186a40c6
core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents:
7739
diff
changeset
|
72 if not iq_types[st_type] then |
26a7186a40c6
core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents:
7739
diff
changeset
|
73 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid IQ type")); |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
74 return; |
7739
0356216c474c
core.stanza_router: Require 'id' attribute on iq stanzas (fixes #785)
Kim Alvefur <zash@zash.se>
parents:
7648
diff
changeset
|
75 elseif not stanza.attr.id then |
0356216c474c
core.stanza_router: Require 'id' attribute on iq stanzas (fixes #785)
Kim Alvefur <zash@zash.se>
parents:
7648
diff
changeset
|
76 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing required 'id' attribute")); |
0356216c474c
core.stanza_router: Require 'id' attribute on iq stanzas (fixes #785)
Kim Alvefur <zash@zash.se>
parents:
7648
diff
changeset
|
77 return; |
7740
26a7186a40c6
core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents:
7739
diff
changeset
|
78 elseif (st_type == "set" or st_type == "get") and (#stanza.tags ~= 1) then |
7802 | 79 origin.send(st.error_reply(stanza, "modify", "bad-request", "Incorrect number of children for IQ stanza")); |
7740
26a7186a40c6
core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents:
7739
diff
changeset
|
80 return; |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
81 end |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
82 end |
78
972e31cc91e8
Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents:
73
diff
changeset
|
83 |
1367
e4d660e58dfc
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1358
diff
changeset
|
84 -- TODO also, stanzas should be returned to their original state before the function ends |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
85 stanza.attr.from = origin.full_jid; |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
86 end |
621
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
87 local to, xmlns = stanza.attr.to, stanza.attr.xmlns; |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
88 local from = stanza.attr.from; |
718 | 89 local node, host, resource; |
90 local from_node, from_host, from_resource; | |
91 local to_bare, from_bare; | |
92 if to then | |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
93 if full_sessions[to] or bare_sessions[to] or hosts[to] then |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
94 node, host = jid_split(to); -- TODO only the host is needed, optimize |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
95 else |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
96 node, host, resource = jid_prepped_split(to); |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
97 if not host then |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
98 log("warn", "Received stanza with invalid destination JID: %s", to); |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
99 if stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
100 origin.send(st.error_reply(stanza, "modify", "jid-malformed", "The destination address is invalid: "..to)); |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
101 end |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
102 return; |
1270
0e700e2041ef
stanza_router: Don't reply with an error on invalid JIDs in error or result stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1269
diff
changeset
|
103 end |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
104 to_bare = node and (node.."@"..host) or host; -- bare JID |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
105 if resource then to = to_bare.."/"..resource; else to = to_bare; end |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
106 stanza.attr.to = to; |
718 | 107 end |
108 end | |
1369
633e032a3b4b
stanza_router: Skip prepping 'from' on c2s origins - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1368
diff
changeset
|
109 if from and not origin.full_jid then |
1143
5bab3eb566ad
stanza_router: Bounce stanzas to/from invalid JIDs with a jid-malformed error
Matthew Wild <mwild1@gmail.com>
parents:
967
diff
changeset
|
110 -- We only stamp the 'from' on c2s stanzas, so we still need to check validity |
718 | 111 from_node, from_host, from_resource = jid_prepped_split(from); |
112 if not from_host then | |
1143
5bab3eb566ad
stanza_router: Bounce stanzas to/from invalid JIDs with a jid-malformed error
Matthew Wild <mwild1@gmail.com>
parents:
967
diff
changeset
|
113 log("warn", "Received stanza with invalid source JID: %s", from); |
1270
0e700e2041ef
stanza_router: Don't reply with an error on invalid JIDs in error or result stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1269
diff
changeset
|
114 if stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then |
0e700e2041ef
stanza_router: Don't reply with an error on invalid JIDs in error or result stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1269
diff
changeset
|
115 origin.send(st.error_reply(stanza, "modify", "jid-malformed", "The source address is invalid: "..from)); |
0e700e2041ef
stanza_router: Don't reply with an error on invalid JIDs in error or result stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1269
diff
changeset
|
116 end |
1143
5bab3eb566ad
stanza_router: Bounce stanzas to/from invalid JIDs with a jid-malformed error
Matthew Wild <mwild1@gmail.com>
parents:
967
diff
changeset
|
117 return; |
718 | 118 end |
119 from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID | |
120 if from_resource then from = from_bare.."/"..from_resource; else from = from_bare; end | |
121 stanza.attr.from = from; | |
122 end | |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
123 |
2949
ef19faa7d106
stanza_router, s2smanager, modulemanager: Fix for handling of the default namespace on stanzas, causing sometimes jabber:client to be sent over s2s, and accepted
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
124 if (origin.type == "s2sin" or origin.type == "c2s" or origin.type == "component") and xmlns == nil then |
631
6957fe7b0313
Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents:
621
diff
changeset
|
125 if origin.type == "s2sin" and not origin.dummy then |
621
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
126 local host_status = origin.hosts[from_host]; |
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
127 if not host_status or not host_status.authed then -- remote server trying to impersonate some other server? |
1179
503d68e7e18a
stanza_router: s/conn/stream/ in log message
Matthew Wild <mwild1@gmail.com>
parents:
1178
diff
changeset
|
128 log("warn", "Received a stanza claiming to be from %s, over a stream authed for %s!", from_host, origin.from_host); |
4863
8974a9b7363f
stanza_router: Remove FIXME comment and close stream with not-authorized for s2s stanzas from unauthed domains
Matthew Wild <mwild1@gmail.com>
parents:
4862
diff
changeset
|
129 origin:close("not-authorized"); |
8974a9b7363f
stanza_router: Remove FIXME comment and close stream with not-authorized for s2s stanzas from unauthed domains
Matthew Wild <mwild1@gmail.com>
parents:
4862
diff
changeset
|
130 return; |
4867
b4219d987d05
stanza_router: Fix variable name
Matthew Wild <mwild1@gmail.com>
parents:
4864
diff
changeset
|
131 elseif not hosts[host] then |
b4219d987d05
stanza_router: Fix variable name
Matthew Wild <mwild1@gmail.com>
parents:
4864
diff
changeset
|
132 log("warn", "Remote server %s sent us a stanza for %s, closing stream", origin.from_host, host); |
4862
d1cfdb137b03
stanza_router: Catch s2s stanzas to hosts we don't serve earlier, and close with host-unknown (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents:
4817
diff
changeset
|
133 origin:close("host-unknown"); |
d1cfdb137b03
stanza_router: Catch s2s stanzas to hosts we don't serve earlier, and close with host-unknown (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents:
4817
diff
changeset
|
134 return; |
621
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
135 end |
cd2cab5400fc
Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents:
615
diff
changeset
|
136 end |
2842
298d0ed3f40d
stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents:
2833
diff
changeset
|
137 core_post_stanza(origin, stanza, origin.full_jid); |
222
6153462397d8
Redirecting all stanzas not from origin of type s2sin and c2s to core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
221
diff
changeset
|
138 else |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
139 local h = hosts[stanza.attr.to or origin.host or origin.to_host]; |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
140 if h then |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
141 local event; |
2949
ef19faa7d106
stanza_router, s2smanager, modulemanager: Fix for handling of the default namespace on stanzas, causing sometimes jabber:client to be sent over s2s, and accepted
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
142 if xmlns == nil then |
8347
c72db8047440
core.stanza_router: Verify that xmlns exists for firing stanza/iq/xmlns/name events (fixes #1022) (thanks SamWhited)
Kim Alvefur <zash@zash.se>
parents:
7947
diff
changeset
|
143 if stanza.name == "iq" and (stanza.attr.type == "set" or stanza.attr.type == "get") |
c72db8047440
core.stanza_router: Verify that xmlns exists for firing stanza/iq/xmlns/name events (fixes #1022) (thanks SamWhited)
Kim Alvefur <zash@zash.se>
parents:
7947
diff
changeset
|
144 and stanza.tags[1] and stanza.tags[1].attr.xmlns then |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
145 event = "stanza/iq/"..stanza.tags[1].attr.xmlns..":"..stanza.tags[1].name; |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
146 else |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
147 event = "stanza/"..stanza.name; |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
148 end |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
149 else |
2949
ef19faa7d106
stanza_router, s2smanager, modulemanager: Fix for handling of the default namespace on stanzas, causing sometimes jabber:client to be sent over s2s, and accepted
Matthew Wild <mwild1@gmail.com>
parents:
2923
diff
changeset
|
150 event = "stanza/"..xmlns..":"..stanza.name; |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
151 end |
1262
0d94c57555d9
Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents:
1256
diff
changeset
|
152 if h.events.fire_event(event, {origin = origin, stanza = stanza}) then return; end |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
153 end |
1887
e3c790060c03
stanza_router: Add COMPAT comment for Pidgin workaround
Matthew Wild <mwild1@gmail.com>
parents:
1609
diff
changeset
|
154 if host and not hosts[host] then host = nil; end -- COMPAT: workaround for a Pidgin bug which sets 'to' to the SRV result |
3539
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
155 handle_unhandled_stanza(host or origin.host or origin.to_host, origin, stanza); |
119
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
156 end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
157 end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
158 |
2842
298d0ed3f40d
stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents:
2833
diff
changeset
|
159 function core_post_stanza(origin, stanza, preevents) |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
160 local to = stanza.attr.to; |
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
161 local node, host, resource = jid_split(to); |
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
162 local to_bare = node and (node.."@"..host) or host; -- bare JID |
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
163 |
2624
99b60dc15174
stanza_router: Fire /self events for stanzas users send to their own bare JID.
Waqas Hussain <waqas20@gmail.com>
parents:
2530
diff
changeset
|
164 local to_type, to_self; |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
165 if node then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
166 if resource then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
167 to_type = '/full'; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
168 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
169 to_type = '/bare'; |
1292
b18c1ad7fcb6
stanza_router: Remove the 'to' attribute when it's value is the bare JID of the local user sending the stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1273
diff
changeset
|
170 if node == origin.username and host == origin.host then |
b18c1ad7fcb6
stanza_router: Remove the 'to' attribute when it's value is the bare JID of the local user sending the stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1273
diff
changeset
|
171 stanza.attr.to = nil; |
2624
99b60dc15174
stanza_router: Fire /self events for stanzas users send to their own bare JID.
Waqas Hussain <waqas20@gmail.com>
parents:
2530
diff
changeset
|
172 to_self = true; |
1292
b18c1ad7fcb6
stanza_router: Remove the 'to' attribute when it's value is the bare JID of the local user sending the stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1273
diff
changeset
|
173 end |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
174 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
175 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
176 if host then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
177 to_type = '/host'; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
178 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
179 to_type = '/bare'; |
2685
f9bc95aadc26
stanza_router: Make sure /self events are fired when the 'to' attribute is missing.
Waqas Hussain <waqas20@gmail.com>
parents:
2624
diff
changeset
|
180 to_self = true; |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
181 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
182 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
183 |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
184 local event_data = {origin=origin, stanza=stanza}; |
2842
298d0ed3f40d
stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents:
2833
diff
changeset
|
185 if preevents then -- c2s connection |
1262
0d94c57555d9
Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents:
1256
diff
changeset
|
186 if hosts[origin.host].events.fire_event('pre-'..stanza.name..to_type, event_data) then return; end -- do preprocessing |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
187 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
188 local h = hosts[to_bare] or hosts[host or origin.host]; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
189 if h then |
1419
1ac8bcc63a9d
stanza_router: Fire events also for stanzas to components
Matthew Wild <mwild1@gmail.com>
parents:
1413
diff
changeset
|
190 if h.events.fire_event(stanza.name..to_type, event_data) then return; end -- do processing |
2624
99b60dc15174
stanza_router: Fire /self events for stanzas users send to their own bare JID.
Waqas Hussain <waqas20@gmail.com>
parents:
2530
diff
changeset
|
191 if to_self and h.events.fire_event(stanza.name..'/self', event_data) then return; end -- do processing |
3539
8bbd965267b2
modulemanager, stanza_router: Moved modulemanager.handle_stanza to stanza_router, as a local function handle_unhandled_stanza. modulemanager is no longer a dependency of stanza_router.
Waqas Hussain <waqas20@gmail.com>
parents:
2951
diff
changeset
|
192 handle_unhandled_stanza(h.host, origin, stanza); |
145 | 193 else |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
194 core_route_stanza(origin, stanza); |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
195 end |
30 | 196 end |
197 | |
198 function core_route_stanza(origin, stanza) | |
1411
b12096b69f36
stanza_router: Remove unused variables
Waqas Hussain <waqas20@gmail.com>
parents:
1410
diff
changeset
|
199 local node, host, resource = jid_split(stanza.attr.to); |
b12096b69f36
stanza_router: Remove unused variables
Waqas Hussain <waqas20@gmail.com>
parents:
1410
diff
changeset
|
200 local from_node, from_host, from_resource = jid_split(stanza.attr.from); |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
201 |
372
e7c1e30d06d5
Now possible to specify nil origin to core_route_stanza. Origin will be chosen as the host of the 'from' attribute on the stanza. Returns false on no such host.
Matthew Wild <mwild1@gmail.com>
parents:
360
diff
changeset
|
202 -- Auto-detect origin if not specified |
e7c1e30d06d5
Now possible to specify nil origin to core_route_stanza. Origin will be chosen as the host of the 'from' attribute on the stanza. Returns false on no such host.
Matthew Wild <mwild1@gmail.com>
parents:
360
diff
changeset
|
203 origin = origin or hosts[from_host]; |
e7c1e30d06d5
Now possible to specify nil origin to core_route_stanza. Origin will be chosen as the host of the 'from' attribute on the stanza. Returns false on no such host.
Matthew Wild <mwild1@gmail.com>
parents:
360
diff
changeset
|
204 if not origin then return false; end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5012
diff
changeset
|
205 |
1412
6cfcab7cd4e7
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1411
diff
changeset
|
206 if hosts[host] then |
1406
83c6fb3d9e73
stanza_router: Removed old routing code
Waqas Hussain <waqas20@gmail.com>
parents:
1370
diff
changeset
|
207 -- old stanza routing code removed |
1408
9b745496b953
stanza_router: Call core_post_stanza from core_route_stanza in place of old routing code
Waqas Hussain <waqas20@gmail.com>
parents:
1407
diff
changeset
|
208 core_post_stanza(origin, stanza); |
4554
6ceabde7af91
stanza_router: Replace s2s send logic with firing of a 'route/remote' event
Matthew Wild <mwild1@gmail.com>
parents:
4553
diff
changeset
|
209 else |
6ceabde7af91
stanza_router: Replace s2s send logic with firing of a 'route/remote' event
Matthew Wild <mwild1@gmail.com>
parents:
4553
diff
changeset
|
210 log("debug", "Routing to remote..."); |
4817
9cc1d3e49f19
stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents:
4816
diff
changeset
|
211 local host_session = hosts[from_host]; |
9cc1d3e49f19
stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents:
4816
diff
changeset
|
212 if not host_session then |
1521
cee81a5ae949
stanza_router: Catch and log an error case which I don't think should happen (but sometimes seems to)
Matthew Wild <mwild1@gmail.com>
parents:
1466
diff
changeset
|
213 log("error", "No hosts[from_host] (please report): %s", tostring(stanza)); |
4554
6ceabde7af91
stanza_router: Replace s2s send logic with firing of a 'route/remote' event
Matthew Wild <mwild1@gmail.com>
parents:
4553
diff
changeset
|
214 else |
1466
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
215 local xmlns = stanza.attr.xmlns; |
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
216 stanza.attr.xmlns = nil; |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
217 local routed = host_session.events.fire_event("route/remote", { |
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
218 origin = origin, stanza = stanza, from_host = from_host, to_host = host }); |
1466
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
219 stanza.attr.xmlns = xmlns; -- reset |
4816
897ec7dcdaa6
stanza_router: Allow route/remote handlers to return false to block a stanza
Matthew Wild <mwild1@gmail.com>
parents:
4554
diff
changeset
|
220 if not routed then |
4918
98a8db95de8c
stanza_router: Don't bounce type=error stanzas
Kim Alvefur <zash@zash.se>
parents:
4877
diff
changeset
|
221 log("debug", "... no, just kidding."); |
4919
6cbc35cdefaf
stanza_router: Also don't bounce <iq type='result'>
Matthew Wild <mwild1@gmail.com>
parents:
4918
diff
changeset
|
222 if stanza.attr.type == "error" or (stanza.name == "iq" and stanza.attr.type == "result") then return; end |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
223 core_route_stanza(host_session, st.error_reply(stanza, "cancel", "not-allowed", |
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
224 "Communication with remote domains is not enabled")); |
4554
6ceabde7af91
stanza_router: Replace s2s send logic with firing of a 'route/remote' event
Matthew Wild <mwild1@gmail.com>
parents:
4553
diff
changeset
|
225 end |
1466
95f8024c77fc
stanza_router: Check host.disallow_s2s before routing over s2sout. you can haz no s2s.
Matthew Wild <mwild1@gmail.com>
parents:
1445
diff
changeset
|
226 end |
68
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
227 end |
30 | 228 end |
6663
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6559
diff
changeset
|
229 |
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6559
diff
changeset
|
230 --luacheck: ignore 122/prosody |
4877
6f5b53cb3565
prosody, stanza_router: Load stanza_router earlier. Put routing functions in the global prosody table. Fixes module:send()
Kim Alvefur <zash@zash.se>
parents:
4867
diff
changeset
|
231 prosody.core_process_stanza = core_process_stanza; |
6f5b53cb3565
prosody, stanza_router: Load stanza_router earlier. Put routing functions in the global prosody table. Fixes module:send()
Kim Alvefur <zash@zash.se>
parents:
4867
diff
changeset
|
232 prosody.core_post_stanza = core_post_stanza; |
6f5b53cb3565
prosody, stanza_router: Load stanza_router earlier. Put routing functions in the global prosody table. Fixes module:send()
Kim Alvefur <zash@zash.se>
parents:
4867
diff
changeset
|
233 prosody.core_route_stanza = core_route_stanza; |