Software /
code /
prosody
Annotate
core/stanza_router.lua @ 11222:4b39691a274e
util.error: rename is_err() -> is_error()
More descriptive and consistent with e.g. is_promise().
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 09 Dec 2020 13:59:51 +0000 |
parent | 10645:067ada779ea5 |
child | 11629:e6e56e2dd996 |
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; |
10528
48300484a124
core.stanza_router: Extract host part of JIDs directly [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10362
diff
changeset
|
15 local jid_host = require "util.jid".host; |
718 | 16 local jid_prepped_split = require "util.jid".prepped_split; |
30 | 17 |
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
|
18 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
|
19 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
|
20 |
5012
d59c842fe38e
stanza_router: Warn if the global core_*_stanza() functions are called
Kim Alvefur <zash@zash.se>
parents:
4919
diff
changeset
|
21 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
|
22 |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
23 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
|
24 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
|
25 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
|
26 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
|
27 -- A normal stanza |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
28 local st_type = stanza.attr.type; |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
29 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
|
30 if st_type == "error" then |
10529
854586ac7c96
core.stanza_router: Silence warning about unused err_message [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10528
diff
changeset
|
31 local err_type, err_condition, err_message = stanza:get_error(); -- luacheck: ignore 211/err_message |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
32 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
|
33 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
|
34 else |
d91ef1e6afc2
stanza_router: Make 'unhandled stanza' errors more informative
Matthew Wild <mwild1@gmail.com>
parents:
7448
diff
changeset
|
35 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
|
36 end |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
37 return; |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
38 end |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
39 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
|
40 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
|
41 end |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
42 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
|
43 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
|
44 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
|
45 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
|
46 else |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
47 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
|
48 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
|
49 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
|
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 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
|
52 |
4130
c3508071af47
stanza_router: Return a <bad-request/> error on invalid IQ type.
Waqas Hussain <waqas20@gmail.com>
parents:
3586
diff
changeset
|
53 local iq_types = { set=true, get=true, result=true, error=true }; |
30 | 54 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
|
55 (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
|
56 |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
57 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
|
58 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
|
59 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
|
60 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
|
61 end |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
62 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
|
63 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
|
64 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
|
65 return; |
7739
0356216c474c
core.stanza_router: Require 'id' attribute on iq stanzas (fixes #785)
Kim Alvefur <zash@zash.se>
parents:
7648
diff
changeset
|
66 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
|
67 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
|
68 return; |
7740
26a7186a40c6
core.stanza_router: Separate iq type check from child count check
Kim Alvefur <zash@zash.se>
parents:
7739
diff
changeset
|
69 elseif (st_type == "set" or st_type == "get") and (#stanza.tags ~= 1) then |
7802 | 70 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
|
71 return; |
6401
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
72 end |
e3de64f7c44d
core.stanza_router: Stricter validation of stanzas
Kim Alvefur <zash@zash.se>
parents:
5012
diff
changeset
|
73 end |
78
972e31cc91e8
Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents:
73
diff
changeset
|
74 |
1367
e4d660e58dfc
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1358
diff
changeset
|
75 -- 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
|
76 stanza.attr.from = origin.full_jid; |
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
77 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
|
78 local to, xmlns = stanza.attr.to, stanza.attr.xmlns; |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
79 local from = stanza.attr.from; |
718 | 80 local node, host, resource; |
81 local from_node, from_host, from_resource; | |
82 local to_bare, from_bare; | |
83 if to then | |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
84 if full_sessions[to] or bare_sessions[to] or hosts[to] then |
10528
48300484a124
core.stanza_router: Extract host part of JIDs directly [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10362
diff
changeset
|
85 host = jid_host(to); |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
86 else |
10362
c05444119e9e
Backed out changeset 64ddcbc9a328 as it would prevent communicating with valid remote JIDs that aren't valid under STRINGPREP / Unicode 3.2
Kim Alvefur <zash@zash.se>
parents:
10360
diff
changeset
|
87 node, host, resource = jid_prepped_split(to); |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
88 if not host then |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
89 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
|
90 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
|
91 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
|
92 end |
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
93 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
|
94 end |
1370
3a467e6885f0
stanza_router: Skip prepping 'to' in many common cases - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1369
diff
changeset
|
95 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
|
96 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
|
97 stanza.attr.to = to; |
718 | 98 end |
99 end | |
1369
633e032a3b4b
stanza_router: Skip prepping 'from' on c2s origins - #optimization
Waqas Hussain <waqas20@gmail.com>
parents:
1368
diff
changeset
|
100 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
|
101 -- We only stamp the 'from' on c2s stanzas, so we still need to check validity |
718 | 102 from_node, from_host, from_resource = jid_prepped_split(from); |
103 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
|
104 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
|
105 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
|
106 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
|
107 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
|
108 return; |
718 | 109 end |
110 from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID | |
111 if from_resource then from = from_bare.."/"..from_resource; else from = from_bare; end | |
112 stanza.attr.from = from; | |
113 end | |
212
9d6da9ed9063
Internal component support
Waqas Hussain <waqas20@gmail.com>
parents:
207
diff
changeset
|
114 |
10245
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" 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
|
116 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
|
117 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
|
118 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
|
119 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
|
120 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
|
121 return; |
4867
b4219d987d05
stanza_router: Fix variable name
Matthew Wild <mwild1@gmail.com>
parents:
4864
diff
changeset
|
122 elseif not hosts[host] then |
b4219d987d05
stanza_router: Fix variable name
Matthew Wild <mwild1@gmail.com>
parents:
4864
diff
changeset
|
123 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
|
124 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
|
125 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
|
126 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
|
127 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
|
128 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
|
129 else |
1254
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
130 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
|
131 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
|
132 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
|
133 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
|
134 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
|
135 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
|
136 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
|
137 else |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
138 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
|
139 end |
c199be608546
stanza_router: Fire events for non-jabber:client and pre-auth stanzas
Waqas Hussain <waqas20@gmail.com>
parents:
1244
diff
changeset
|
140 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
|
141 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
|
142 end |
1262
0d94c57555d9
Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents:
1256
diff
changeset
|
143 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
|
144 end |
1887
e3c790060c03
stanza_router: Add COMPAT comment for Pidgin workaround
Matthew Wild <mwild1@gmail.com>
parents:
1609
diff
changeset
|
145 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
|
146 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
|
147 end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
148 end |
b48a573608e8
Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents:
113
diff
changeset
|
149 |
2842
298d0ed3f40d
stanza_router: Added third parameter to core_post_stanza, to control pre-events.
Waqas Hussain <waqas20@gmail.com>
parents:
2833
diff
changeset
|
150 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
|
151 local to = stanza.attr.to; |
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
152 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
|
153 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
|
154 |
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
|
155 local to_type, to_self; |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
156 if node then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
157 if resource then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
158 to_type = '/full'; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
159 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
160 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
|
161 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
|
162 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
|
163 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
|
164 end |
1228
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
165 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
166 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
167 if host then |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
168 to_type = '/host'; |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
169 else |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
170 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
|
171 to_self = true; |
1228
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 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
174 |
10639
08e3063eb1ac
stanza_router: Add once-per-routed-stanza event, pre-stanza
Matthew Wild <mwild1@gmail.com>
parents:
10529
diff
changeset
|
175 local event_data = {origin=origin, stanza=stanza, to_self=to_self}; |
08e3063eb1ac
stanza_router: Add once-per-routed-stanza event, pre-stanza
Matthew Wild <mwild1@gmail.com>
parents:
10529
diff
changeset
|
176 |
10645
067ada779ea5
stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents:
10639
diff
changeset
|
177 if preevents then -- c2s connection |
067ada779ea5
stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents:
10639
diff
changeset
|
178 local result = hosts[origin.host].events.fire_event("pre-stanza", event_data); |
067ada779ea5
stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents:
10639
diff
changeset
|
179 if result ~= nil then |
067ada779ea5
stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents:
10639
diff
changeset
|
180 log("debug", "Stanza rejected by pre-stanza handler: %s", event_data.reason or "unknown reason"); |
067ada779ea5
stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents:
10639
diff
changeset
|
181 return; |
067ada779ea5
stanza_router: only fire pre-stanza if firing other preevents (e.g. for c2s sessions)
Matthew Wild <mwild1@gmail.com>
parents:
10639
diff
changeset
|
182 end |
10639
08e3063eb1ac
stanza_router: Add once-per-routed-stanza event, pre-stanza
Matthew Wild <mwild1@gmail.com>
parents:
10529
diff
changeset
|
183 |
1262
0d94c57555d9
Backed out changeset 98f0e9eadf3b (better fix on the way)
Matthew Wild <mwild1@gmail.com>
parents:
1256
diff
changeset
|
184 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
|
185 end |
853d3d76ba94
stanza_router: Fire per-host stanza events
Waqas Hussain <waqas20@gmail.com>
parents:
1212
diff
changeset
|
186 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
|
187 if h then |
1419
1ac8bcc63a9d
stanza_router: Fire events also for stanzas to components
Matthew Wild <mwild1@gmail.com>
parents:
1413
diff
changeset
|
188 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
|
189 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
|
190 handle_unhandled_stanza(h.host, origin, stanza); |
145 | 191 else |
1172
490ff24d0ac5
stanza_router: Added global function core_post_stanza
Waqas Hussain <waqas20@gmail.com>
parents:
1169
diff
changeset
|
192 core_route_stanza(origin, stanza); |
71
fbb4ef1da82e
Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents:
68
diff
changeset
|
193 end |
30 | 194 end |
195 | |
196 function core_route_stanza(origin, stanza) | |
10528
48300484a124
core.stanza_router: Extract host part of JIDs directly [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10362
diff
changeset
|
197 local host = jid_host(stanza.attr.to); |
48300484a124
core.stanza_router: Extract host part of JIDs directly [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10362
diff
changeset
|
198 local from_host = jid_host(stanza.attr.from); |
113
9026fdad1531
Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents:
106
diff
changeset
|
199 |
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
|
200 -- 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
|
201 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
|
202 if not origin then return false; end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5012
diff
changeset
|
203 |
1412
6cfcab7cd4e7
stanza_router: A little refactoring
Waqas Hussain <waqas20@gmail.com>
parents:
1411
diff
changeset
|
204 if hosts[host] then |
1406
83c6fb3d9e73
stanza_router: Removed old routing code
Waqas Hussain <waqas20@gmail.com>
parents:
1370
diff
changeset
|
205 -- 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
|
206 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
|
207 else |
4817
9cc1d3e49f19
stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents:
4816
diff
changeset
|
208 local host_session = hosts[from_host]; |
9cc1d3e49f19
stanza_router: Fire route/remote per-host
Matthew Wild <mwild1@gmail.com>
parents:
4816
diff
changeset
|
209 if not host_session then |
10104
3965081809ba
core.stanza_router: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents:
9527
diff
changeset
|
210 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
|
211 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
|
212 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
|
213 stanza.attr.xmlns = nil; |
7947
24170d74b00b
core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7802
diff
changeset
|
214 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
|
215 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
|
216 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
|
217 if not routed then |
9067
89e1bf37ff64
core.stanza_router: Reduce logging of common routing (#776)
Kim Alvefur <zash@zash.se>
parents:
8347
diff
changeset
|
218 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
|
219 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
|
220 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
|
221 "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
|
222 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
|
223 end |
68
ceb7a55676a4
Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents:
66
diff
changeset
|
224 end |
30 | 225 end |
6663
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6559
diff
changeset
|
226 |
d3023dd07cb6
portmanager, s2smanager, sessionmanager, stanza_router, storagemanager, usermanager, util.xml: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents:
6559
diff
changeset
|
227 --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
|
228 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
|
229 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
|
230 prosody.core_route_stanza = core_route_stanza; |