Software /
code /
prosody
Annotate
core/stanza_router.lua @ 11245:43b43e7156b8
MUC: Add support for presence probes (fixes #1535)
The following patch allows Prosody to respond to `probe` presences and send out the probed occupant's current presence.
This is based on line 17.3 in XEP-0045:
A MUC service MAY handle presence probes sent to the room JID <room@service> or an occupant JID <room@service/nick>
(e.g, these might be sent by an occupant's home server to determine if the room is still online or to synchronize
presence information if the user or the user's server has gone offline temporarily or has started sharing presence again,
as for instance when Stanza Interception and Filtering Technology (XEP-0273) is used).
author | JC Brand <jc@opkode.com> |
---|---|
date | Sun, 19 Apr 2020 21:49:45 +0200 |
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; |