Software /
code /
prosody
Annotate
core/stanza_router.lua @ 10360:64ddcbc9a328
core.stanza_router: Do strict jidprep on c2s
Be conservative in what you let your clients send, be liberal in what
you let in via s2s.
Being strict on s2s leads to interop problems and poor experiences, ie
users being ejected from MUCs if something invalid enters. By starting
with tightening up input into the network, we may be able to gradually
approach a point where no invalid JIDs are allowed.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 09 Sep 2019 22:32:01 +0200 |
parent | 10245:88efdfb0a126 |
child | 10362:c05444119e9e |
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 |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
22 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
|
23 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
|
24 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
|
25 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
|
26 -- A normal stanza |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
27 local st_type = stanza.attr.type; |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
28 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
|
29 if st_type == "error" then |
d91ef1e6afc2
stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents:
7448
diff
changeset
|
30 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
|
31 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
|
32 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
|
33 else |
d91ef1e6afc2
stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents:
7448
diff
changeset
|
34 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
|
35 end |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
36 return; |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
37 end |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
38 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
|
39 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
|
40 end |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
41 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
|
42 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
|
43 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
|
44 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
|
45 else |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
46 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
|
47 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
|
48 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
|
49 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
|
50 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
|
51 |
4130
c3508071af47
stanza_router: Return a <bad-request/> error on invalid IQ type.
Waqas Hussain <waqas20@gmail.com>
parents:
3586
diff
changeset
|
52 local iq_types = { set=true, get=true, result=true, error=true }; |
30 | 53 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
|
54 (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
|
55 |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
56 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
|
57 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
|
58 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
|
59 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
|
60 end |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
61 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
|
62 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
|
63 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
|
64 return; |
7739
0356216c474c
core.stanza_router: Require 'id' attribute on iq stanzas (fixes #785)
Kim Alvefur <zash@zash.se>
parents:
7648
diff
changeset
|
65 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
|
66 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
|
67 return; |
7740
26a7186a40c6
core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents:
7739
diff
changeset
|
68 elseif (st_type == "set" or st_type == "get") and (#stanza.tags ~= 1) then |
7802 | 69 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
|
70 return; |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
71 end |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
72 end |
78
972e31cc91e8
Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents:
73
diff
changeset
|
73 |
1367
e4d660e58dfc
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1358
diff
changeset
|
74 -- 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
|
75 stanza.attr.from = origin.full_jid; |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
76 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
|
77 local to, xmlns = stanza.attr.to, stanza.attr.xmlns; |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
78 local from = stanza.attr.from; |
718 | 79 local node, host, resource; |
80 local from_node, from_host, from_resource; | |
81 local to_bare, from_bare; | |
82 if to then | |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
83 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
|
84 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
|
85 else |
10360
64ddcbc9a328
core.stanza_router: Do strict jidprep on c2s
Kim Alvefur <zash@zash.se>
parents:
10245
diff
changeset
|
86 node, host, resource = jid_prepped_split(to, origin.type == "c2s"); |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
87 if not host then |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
88 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
|
89 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
|
90 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
|
91 end |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
92 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
|
93 end |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
94 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
|
95 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
|
96 stanza.attr.to = to; |
718 | 97 end |
98 end | |
1369
633e032a3b4b
stanza_router: Skip prepping 'from' on c2s origins - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1368
diff
changeset
|
99 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
|
100 -- We only stamp the 'from' on c2s stanzas, so we still need to check validity |
718 | 101 from_node, from_host, from_resource = jid_prepped_split(from); |
102 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
|
103 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
|
104 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
|
105 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
|
106 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
|
107 return; |
718 | 108 end |
109 from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID | |
110 if from_resource then from = from_bare.."/"..from_resource; else from = from_bare; end | |
111 stanza.attr.from = from; | |
112 end | |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
113 |
10245
88efdfb0a126
core.stanza_router: Handle s2s in more direction-agnostic way
Kim Alvefur <zash@zash.se>
parents:
10104
diff
changeset
|
114 if (origin.type == "s2sin" or origin.type == "s2sout" or origin.type == "c2s" or origin.type == "component") and xmlns == nil then |
88efdfb0a126
core.stanza_router: Handle s2s in more direction-agnostic way
Kim Alvefur <zash@zash.se>
parents:
10104
diff
changeset
|
115 if (origin.type == "s2sin" or origin.type == "s2sout") 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
|
116 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
|
117 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
|
118 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
|
119 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
|
120 return; |
4867
b4219d987d05
stanza_router: Fix variable name
Matthew Wild <mwild1@gmail.com>
parents:
4864
diff
changeset
|
121 elseif not hosts[host] then |
b4219d987d05
stanza_router: Fix variable name
Matthew Wild <mwild1@gmail.com>
parents:
4864
diff
changeset
|
122 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
|
123 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
|
124 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
|
125 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
|
126 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
|
127 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
|
128 else |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
129 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
|
130 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
|
131 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
|
132 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
|
133 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
|
134 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
|
135 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
|
136 else |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
137 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
|
138 end |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
139 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
|
140 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
|
141 end |
1262
0d94c57555d9
Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents:
1256
diff
changeset
|
142 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
|
143 end |
1887
e3c790060c03
stanza_router: Add COMPAT comment for Pidgin workaround
Matthew Wild <mwild1@gmail.com>
parents:
1609
diff
changeset
|
144 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
|
145 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
|
146 end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
147 end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
148 |
2842
298d0ed3f40d
stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents:
2833
diff
changeset
|
149 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
|
150 local to = stanza.attr.to; |
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
151 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
|
152 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
|
153 |
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
|
154 local to_type, to_self; |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
155 if node then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
156 if resource then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
157 to_type = '/full'; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
158 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
159 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
|
160 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
|
161 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
|
162 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
|
163 end |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
164 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
165 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
166 if host then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
167 to_type = '/host'; |
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'; |
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
|
170 to_self = true; |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
171 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
172 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
173 |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
174 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
|
175 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
|
176 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
|
177 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
178 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
|
179 if h then |
1419
1ac8bcc63a9d
stanza_router: Fire events also for stanzas to components
Matthew Wild <mwild1@gmail.com>
parents:
1413
diff
changeset
|
180 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
|
181 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
|
182 handle_unhandled_stanza(h.host, origin, stanza); |
145 | 183 else |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
184 core_route_stanza(origin, stanza); |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
185 end |
30 | 186 end |
187 | |
188 function core_route_stanza(origin, stanza) | |
1411
b12096b69f36
stanza_router: Remove unused variables
Waqas Hussain <waqas20@gmail.com>
parents:
1410
diff
changeset
|
189 local node, host, resource = jid_split(stanza.attr.to); |
b12096b69f36
stanza_router: Remove unused variables
Waqas Hussain <waqas20@gmail.com>
parents:
1410
diff
changeset
|
190 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
|
191 |
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
|
192 -- 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
|
193 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
|
194 if not origin then return false; end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5012
diff
changeset
|
195 |
1412
6cfcab7cd4e7
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1411
diff
changeset
|
196 if hosts[host] then |
1406
83c6fb3d9e73
stanza_router: Removed old routing code
Waqas Hussain <waqas20@gmail.com>
parents:
1370
diff
changeset
|
197 -- 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
|
198 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
|
199 else |
4817
9cc1d3e49f19
stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents:
4816
diff
changeset
|
200 local host_session = hosts[from_host]; |
9cc1d3e49f19
stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents:
4816
diff
changeset
|
201 if not host_session then |
10104
3965081809ba
core.stanza_router: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents:
9527
diff
changeset
|
202 log("error", "No hosts[from_host] (please report): %s", 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
|
203 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
|
204 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
|
205 stanza.attr.xmlns = nil; |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
206 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
|
207 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
|
208 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
|
209 if not routed then |
9067
89e1bf37ff64
core.stanza_router: Reduce logging of common routing (#776)
Kim Alvefur <zash@zash.se>
parents:
8347
diff
changeset
|
210 log("debug", "Could not route stanza to remote"); |
4919
6cbc35cdefaf
stanza_router: Also don't bounce <iq type='result'>
Matthew Wild <mwild1@gmail.com>
parents:
4918
diff
changeset
|
211 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
|
212 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
|
213 "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
|
214 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
|
215 end |
68
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
216 end |
30 | 217 end |
6663
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6559
diff
changeset
|
218 |
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6559
diff
changeset
|
219 --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
|
220 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
|
221 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
|
222 prosody.core_route_stanza = core_route_stanza; |