Software /
code /
prosody
Annotate
core/stanza_router.lua @ 8025:8a7c4497569a
MUC: Only create rooms in a locked state when they are created by someone joining (fixes timed deletion of all rooms on startup)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 31 Mar 2017 18:52:53 +0200 |
parent | 7947:24170d74b00b |
child | 8347:c72db8047440 |
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 |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
143 if stanza.name == "iq" and (stanza.attr.type == "set" or stanza.attr.type == "get") then |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
144 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
|
145 else |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
146 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
|
147 end |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
148 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
|
149 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
|
150 end |
1262
0d94c57555d9
Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents:
1256
diff
changeset
|
151 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
|
152 end |
1887
e3c790060c03
stanza_router: Add COMPAT comment for Pidgin workaround
Matthew Wild <mwild1@gmail.com>
parents:
1609
diff
changeset
|
153 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
|
154 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
|
155 end |
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 |
2842
298d0ed3f40d
stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents:
2833
diff
changeset
|
158 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
|
159 local to = stanza.attr.to; |
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
160 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
|
161 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
|
162 |
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
|
163 local to_type, to_self; |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
164 if node then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
165 if resource then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
166 to_type = '/full'; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
167 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
168 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
|
169 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
|
170 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
|
171 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
|
172 end |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
173 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
174 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
175 if host then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
176 to_type = '/host'; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
177 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
178 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
|
179 to_self = true; |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
180 end |
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 |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
183 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
|
184 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
|
185 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
|
186 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
187 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
|
188 if h then |
1419
1ac8bcc63a9d
stanza_router: Fire events also for stanzas to components
Matthew Wild <mwild1@gmail.com>
parents:
1413
diff
changeset
|
189 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
|
190 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
|
191 handle_unhandled_stanza(h.host, origin, stanza); |
145 | 192 else |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
193 core_route_stanza(origin, stanza); |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
194 end |
30 | 195 end |
196 | |
197 function core_route_stanza(origin, stanza) | |
1411
b12096b69f36
stanza_router: Remove unused variables
Waqas Hussain <waqas20@gmail.com>
parents:
1410
diff
changeset
|
198 local node, host, resource = jid_split(stanza.attr.to); |
b12096b69f36
stanza_router: Remove unused variables
Waqas Hussain <waqas20@gmail.com>
parents:
1410
diff
changeset
|
199 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
|
200 |
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
|
201 -- 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
|
202 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
|
203 if not origin then return false; end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5012
diff
changeset
|
204 |
1412
6cfcab7cd4e7
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1411
diff
changeset
|
205 if hosts[host] then |
1406
83c6fb3d9e73
stanza_router: Removed old routing code
Waqas Hussain <waqas20@gmail.com>
parents:
1370
diff
changeset
|
206 -- 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
|
207 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
|
208 else |
6ceabde7af91
stanza_router: Replace s2s send logic with firing of a 'route/remote' event
Matthew Wild <mwild1@gmail.com>
parents:
4553
diff
changeset
|
209 log("debug", "Routing to remote..."); |
4817
9cc1d3e49f19
stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents:
4816
diff
changeset
|
210 local host_session = hosts[from_host]; |
9cc1d3e49f19
stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents:
4816
diff
changeset
|
211 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
|
212 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
|
213 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
|
214 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
|
215 stanza.attr.xmlns = nil; |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
216 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
|
217 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
|
218 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
|
219 if not routed then |
4918
98a8db95de8c
stanza_router: Don't bounce type=error stanzas
Kim Alvefur <zash@zash.se>
parents:
4877
diff
changeset
|
220 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
|
221 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
|
222 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
|
223 "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
|
224 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
|
225 end |
68
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
226 end |
30 | 227 end |
6663
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6559
diff
changeset
|
228 |
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6559
diff
changeset
|
229 --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
|
230 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
|
231 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
|
232 prosody.core_route_stanza = core_route_stanza; |