author | Matthew Wild <mwild1@gmail.com> |
Mon, 20 Feb 2023 18:10:15 +0000 | |
branch | 0.12 |
changeset 12898 | 0598d822614f |
parent 12315 | bc30e1b9ad89 |
child 12484 | 7e9ebdc75ce4 |
permissions | -rw-r--r-- |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 |
-- Prosody IM |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
-- Copyright (C) 2008-2010 Matthew Wild |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 |
-- Copyright (C) 2008-2010 Waqas Hussain |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
4 |
-- |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
-- This project is MIT/X11 licensed. Please see the |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 |
-- COPYING file in the source package for more information. |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
-- |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
module:set_global(); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
|
4548
e6e5c76ff009
sessionmanager, mod_c2s: Move timeout logic to mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
4543
diff
changeset
|
11 |
local add_task = require "util.timer".add_task; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 |
local new_xmpp_stream = require "util.xmppstream".new; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
local nameprep = require "util.encodings".stringprep.nameprep; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 |
local sessionmanager = require "core.sessionmanager"; |
11528
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
15 |
local statsmanager = require "core.statsmanager"; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
local st = require "util.stanza"; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 |
local sm_new_session, sm_destroy_session = sessionmanager.new_session, sessionmanager.destroy_session; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 |
local uuid_generate = require "util.uuid".generate; |
12305
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
19 |
local async = require "util.async"; |
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
20 |
local runner = async.runner; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 |
|
8047
e38e3300b955
mod_c2s: Remove unused locals [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7960
diff
changeset
|
22 |
local tostring, type = tostring, type; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 |
local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams"; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 |
local log = module._log; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 |
|
8391
9ee56e9ad47a
mod_c2s: Set a default value for c2s_timeout (fixes #1036)
Kim Alvefur <zash@zash.se>
parents:
8237
diff
changeset
|
28 |
local c2s_timeout = module:get_option_number("c2s_timeout", 300); |
4964
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
29 |
local stream_close_timeout = module:get_option_number("c2s_close_timeout", 5); |
5757
b5ba004beb0a
mod_c2s: Change default of tcp_keepalives to true, and make it individually configurable through c2s_tcp_keepalives
Kim Alvefur <zash@zash.se>
parents:
5571
diff
changeset
|
30 |
local opt_keepalives = module:get_option_boolean("c2s_tcp_keepalives", module:get_option_boolean("tcp_keepalives", true)); |
11544
1937b3c3efb5
mod_c2s, mod_s2s, mod_component, mod_bosh, mod_websockets: Set default stanza size limits
Matthew Wild <mwild1@gmail.com>
parents:
11515
diff
changeset
|
31 |
local stanza_size_limit = module:get_option_number("c2s_stanza_size_limit", 1024*256); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 |
|
11528
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
33 |
local measure_connections = module:metric("gauge", "connections", "", "Established c2s connections", {"host", "type", "ip_family"}); |
6633
6735e2d735d6
mod_c2s, mod_s2s: Collect statistics on number of connections
Kim Alvefur <zash@zash.se>
parents:
6382
diff
changeset
|
34 |
|
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 |
local sessions = module:shared("sessions"); |
5013
ab693eea0869
mod_admin_adhoc, mod_admin_telnet, mod_bosh, mod_c2s, mod_component, mod_pep, mod_presence, mod_roster, mod_s2s: Import core_post_stanza from the global prosody table.
Kim Alvefur <zash@zash.se>
parents:
4996
diff
changeset
|
36 |
local core_process_stanza = prosody.core_process_stanza; |
5370
7838acadb0fa
mod_announce, mod_auth_anonymous, mod_c2s, mod_c2s, mod_component, mod_iq, mod_message, mod_presence, mod_tls: Access prosody.{hosts,bare_sessions,full_sessions} instead of the old globals
Kim Alvefur <zash@zash.se>
parents:
5281
diff
changeset
|
37 |
local hosts = prosody.hosts; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 |
|
5773
c9a712673d8a
mod_c2s: Add session:sleep() and session:wake() to pause a session (e.g. while waiting for an external event). Needs a gallon or two of testing.
Matthew Wild <mwild1@gmail.com>
parents:
5764
diff
changeset
|
39 |
local stream_callbacks = { default_ns = "jabber:client" }; |
4625
325965bafae1
mod_c2s, mod_s2s: Drop default_port and default_mode from listener objects (default_port is deprecated, and default_mode already defaults to *a)
Matthew Wild <mwild1@gmail.com>
parents:
4620
diff
changeset
|
40 |
local listener = {}; |
7289 | 41 |
local runner_callbacks = {}; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 |
|
11612
b2610460d9ab
mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents:
11564
diff
changeset
|
43 |
local m_tls_params = module:metric( |
b2610460d9ab
mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents:
11564
diff
changeset
|
44 |
"counter", "encrypted", "", |
b2610460d9ab
mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents:
11564
diff
changeset
|
45 |
"Encrypted connections", |
b2610460d9ab
mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents:
11564
diff
changeset
|
46 |
{"protocol"; "cipher"} |
b2610460d9ab
mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents:
11564
diff
changeset
|
47 |
); |
b2610460d9ab
mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents:
11564
diff
changeset
|
48 |
|
7665
946871f6e3c8
mod_c2s, mod_s2s: Switch connection counting to 'amount' type and enumerate once per statistics interval
Kim Alvefur <zash@zash.se>
parents:
7543
diff
changeset
|
49 |
module:hook("stats-update", function () |
11528
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
50 |
-- for push backends, avoid sending out updates for each increment of |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
51 |
-- the metric below. |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
52 |
statsmanager.cork() |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
53 |
measure_connections:clear() |
8767
81d305bbe7bc
mod_c2s: Add a counter for IPv6.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8393
diff
changeset
|
54 |
for _, session in pairs(sessions) do |
11528
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
55 |
local host = session.host or "" |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
56 |
local type_ = session.type or "other" |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
57 |
|
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
58 |
-- we want to expose both v4 and v6 counters in all cases to make |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
59 |
-- queries smoother |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
60 |
local is_ipv6 = session.ip and session.ip:match(":") and 1 or 0 |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
61 |
local is_ipv4 = 1 - is_ipv6 |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
62 |
measure_connections:with_labels(host, type_, "ipv4"):add(is_ipv4) |
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
63 |
measure_connections:with_labels(host, type_, "ipv6"):add(is_ipv6) |
7469
f28fa742def3
mod_c2s, mod_s2s: Bootstrap connection count statistic on module load
Kim Alvefur <zash@zash.se>
parents:
7332
diff
changeset
|
64 |
end |
11528
6de302b53a3e
mod_c2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents:
11521
diff
changeset
|
65 |
statsmanager.uncork() |
7665
946871f6e3c8
mod_c2s, mod_s2s: Switch connection counting to 'amount' type and enumerate once per statistics interval
Kim Alvefur <zash@zash.se>
parents:
7543
diff
changeset
|
66 |
end); |
7469
f28fa742def3
mod_c2s, mod_s2s: Bootstrap connection count statistic on module load
Kim Alvefur <zash@zash.se>
parents:
7332
diff
changeset
|
67 |
|
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 |
--- Stream events handlers |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 |
local stream_xmlns_attr = {xmlns='urn:ietf:params:xml:ns:xmpp-streams'}; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 |
function stream_callbacks.streamopened(session, attr) |
10815
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
72 |
-- run _streamopened in async context |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
73 |
session.thread:run({ stream = "opened", attr = attr }); |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
74 |
end |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
75 |
|
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
76 |
function stream_callbacks._streamopened(session, attr) |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 |
local send = session.send; |
10383
b917602eac04
mod_c2s: Validate that a 'to' attribute exists at all
Kim Alvefur <zash@zash.se>
parents:
10230
diff
changeset
|
78 |
if not attr.to then |
b917602eac04
mod_c2s: Validate that a 'to' attribute exists at all
Kim Alvefur <zash@zash.se>
parents:
10230
diff
changeset
|
79 |
session:close{ condition = "improper-addressing", |
b917602eac04
mod_c2s: Validate that a 'to' attribute exists at all
Kim Alvefur <zash@zash.se>
parents:
10230
diff
changeset
|
80 |
text = "A 'to' attribute is required on stream headers" }; |
b917602eac04
mod_c2s: Validate that a 'to' attribute exists at all
Kim Alvefur <zash@zash.se>
parents:
10230
diff
changeset
|
81 |
return; |
b917602eac04
mod_c2s: Validate that a 'to' attribute exists at all
Kim Alvefur <zash@zash.se>
parents:
10230
diff
changeset
|
82 |
end |
8847
29c6d2681bad
mod_c2s: Do not allow the stream 'to' to change across stream restarts (fixes #1147)
Kim Alvefur <zash@zash.se>
parents:
8235
diff
changeset
|
83 |
local host = nameprep(attr.to); |
29c6d2681bad
mod_c2s: Do not allow the stream 'to' to change across stream restarts (fixes #1147)
Kim Alvefur <zash@zash.se>
parents:
8235
diff
changeset
|
84 |
if not host then |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 |
session:close{ condition = "improper-addressing", |
4551 | 86 |
text = "A valid 'to' attribute is required on stream headers" }; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 |
return; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 |
end |
8847
29c6d2681bad
mod_c2s: Do not allow the stream 'to' to change across stream restarts (fixes #1147)
Kim Alvefur <zash@zash.se>
parents:
8235
diff
changeset
|
89 |
if not session.host then |
29c6d2681bad
mod_c2s: Do not allow the stream 'to' to change across stream restarts (fixes #1147)
Kim Alvefur <zash@zash.se>
parents:
8235
diff
changeset
|
90 |
session.host = host; |
29c6d2681bad
mod_c2s: Do not allow the stream 'to' to change across stream restarts (fixes #1147)
Kim Alvefur <zash@zash.se>
parents:
8235
diff
changeset
|
91 |
elseif session.host ~= host then |
29c6d2681bad
mod_c2s: Do not allow the stream 'to' to change across stream restarts (fixes #1147)
Kim Alvefur <zash@zash.se>
parents:
8235
diff
changeset
|
92 |
session:close{ condition = "not-authorized", |
29c6d2681bad
mod_c2s: Do not allow the stream 'to' to change across stream restarts (fixes #1147)
Kim Alvefur <zash@zash.se>
parents:
8235
diff
changeset
|
93 |
text = "The 'to' attribute must remain the same across stream restarts" }; |
29c6d2681bad
mod_c2s: Do not allow the stream 'to' to change across stream restarts (fixes #1147)
Kim Alvefur <zash@zash.se>
parents:
8235
diff
changeset
|
94 |
return; |
29c6d2681bad
mod_c2s: Do not allow the stream 'to' to change across stream restarts (fixes #1147)
Kim Alvefur <zash@zash.se>
parents:
8235
diff
changeset
|
95 |
end |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 |
session.version = tonumber(attr.version) or 0; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 |
session.streamid = uuid_generate(); |
9493
6e4fbd12c11c
mod_c2s: Fix fallback for missing session logger
Kim Alvefur <zash@zash.se>
parents:
8850
diff
changeset
|
98 |
(session.log or log)("debug", "Client sent opening <stream:stream> to %s", session.host); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 |
|
5668
5a9318ac92f6
mod_c2s: Become a shared module and allow being disabled on some virtualhosts
Kim Alvefur <zash@zash.se>
parents:
5638
diff
changeset
|
100 |
if not hosts[session.host] or not hosts[session.host].modules.c2s then |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 |
-- We don't serve this host... |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 |
session:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)}; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 |
return; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 |
|
11363
db146bf7b120
mod_c2s: Reflect stream 'from' attribute back if set (fix #1625)
Kim Alvefur <zash@zash.se>
parents:
11124
diff
changeset
|
106 |
session:open_stream(host, attr.from); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 |
|
11521
f7275c2c58fa
mod_c2s: Fix traceback if session was destroyed while opening stream (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents:
11518
diff
changeset
|
108 |
-- Opening the stream can cause the stream to be closed |
f7275c2c58fa
mod_c2s: Fix traceback if session was destroyed while opening stream (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents:
11518
diff
changeset
|
109 |
if session.destroyed then return end |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 |
(session.log or log)("debug", "Sent reply <stream:stream> to client"); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 |
session.notopen = nil; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 |
-- If session.secure is *false* (not nil) then it means we /were/ encrypting |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 |
-- since we now have a new stream header, session is secured |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 |
if session.secure == false then |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 |
session.secure = true; |
5859
e327f2d4e09f
mod_c2s, mod_s2s: Set session.encrypted as session.secure does not allways mean encrypted (eg consider_bosh_secure)
Kim Alvefur <zash@zash.se>
parents:
5802
diff
changeset
|
118 |
session.encrypted = true; |
5228
edabb34417b7
mod_c2s: Check if TLS compression is used
Kim Alvefur <zash@zash.se>
parents:
5120
diff
changeset
|
119 |
|
edabb34417b7
mod_c2s: Check if TLS compression is used
Kim Alvefur <zash@zash.se>
parents:
5120
diff
changeset
|
120 |
local sock = session.conn:socket(); |
11626
a62146353528
mod_c2s: Guard against LuaSec not returning TLS info (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
11623
diff
changeset
|
121 |
local info = sock.info and sock:info(); |
a62146353528
mod_c2s: Guard against LuaSec not returning TLS info (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
11623
diff
changeset
|
122 |
if type(info) == "table" then |
5801
224644752bf4
mod_c2s, mod_s2s: Log cipher and encryption info in a more compact and (hopefully) less confusing way
Kim Alvefur <zash@zash.se>
parents:
5789
diff
changeset
|
123 |
(session.log or log)("info", "Stream encrypted (%s with %s)", info.protocol, info.cipher); |
5764
969e0a054795
mod_c2s, mod_s2s: Log a message that stream encryption has been enabled with some details
Kim Alvefur <zash@zash.se>
parents:
5759
diff
changeset
|
124 |
session.compressed = info.compression; |
11612
b2610460d9ab
mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents:
11564
diff
changeset
|
125 |
m_tls_params:with_labels(info.protocol, info.cipher):add(1) |
5764
969e0a054795
mod_c2s, mod_s2s: Log a message that stream encryption has been enabled with some details
Kim Alvefur <zash@zash.se>
parents:
5759
diff
changeset
|
126 |
else |
969e0a054795
mod_c2s, mod_s2s: Log a message that stream encryption has been enabled with some details
Kim Alvefur <zash@zash.se>
parents:
5759
diff
changeset
|
127 |
(session.log or log)("info", "Stream encrypted"); |
5228
edabb34417b7
mod_c2s: Check if TLS compression is used
Kim Alvefur <zash@zash.se>
parents:
5120
diff
changeset
|
128 |
end |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 |
local features = st.stanza("stream:features"); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 |
hosts[session.host].events.fire_event("stream-features", { origin = session, features = features }); |
6849
7eb166fa1f26
mod_c2s, mod_s2s: Close incoming connections if there are no features to offer on incomplete streams (fixes #285)
Kim Alvefur <zash@zash.se>
parents:
6633
diff
changeset
|
133 |
if features.tags[1] or session.full_jid then |
7eb166fa1f26
mod_c2s, mod_s2s: Close incoming connections if there are no features to offer on incomplete streams (fixes #285)
Kim Alvefur <zash@zash.se>
parents:
6633
diff
changeset
|
134 |
send(features); |
7eb166fa1f26
mod_c2s, mod_s2s: Close incoming connections if there are no features to offer on incomplete streams (fixes #285)
Kim Alvefur <zash@zash.se>
parents:
6633
diff
changeset
|
135 |
else |
9743
a74d78f79b23
mod_c2s: Improve log message in case there are no stream features on offer (thanks hexa)
Kim Alvefur <zash@zash.se>
parents:
9493
diff
changeset
|
136 |
if session.secure then |
10731 | 137 |
-- Here SASL should be offered |
9743
a74d78f79b23
mod_c2s: Improve log message in case there are no stream features on offer (thanks hexa)
Kim Alvefur <zash@zash.se>
parents:
9493
diff
changeset
|
138 |
(session.log or log)("warn", "No stream features to offer on secure session. Check authentication settings."); |
a74d78f79b23
mod_c2s: Improve log message in case there are no stream features on offer (thanks hexa)
Kim Alvefur <zash@zash.se>
parents:
9493
diff
changeset
|
139 |
else |
10731 | 140 |
-- Normally STARTTLS would be offered |
9743
a74d78f79b23
mod_c2s: Improve log message in case there are no stream features on offer (thanks hexa)
Kim Alvefur <zash@zash.se>
parents:
9493
diff
changeset
|
141 |
(session.log or log)("warn", "No stream features to offer on insecure session. Check encryption and security settings."); |
a74d78f79b23
mod_c2s: Improve log message in case there are no stream features on offer (thanks hexa)
Kim Alvefur <zash@zash.se>
parents:
9493
diff
changeset
|
142 |
end |
7865
f5cbbf69cac8
mod_c2s: Clarify that there were no *stream* features to offer
Kim Alvefur <zash@zash.se>
parents:
7665
diff
changeset
|
143 |
session:close{ condition = "undefined-condition", text = "No stream features to proceed with" }; |
6849
7eb166fa1f26
mod_c2s, mod_s2s: Close incoming connections if there are no features to offer on incomplete streams (fixes #285)
Kim Alvefur <zash@zash.se>
parents:
6633
diff
changeset
|
144 |
end |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 |
|
10815
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
147 |
function stream_callbacks.streamclosed(session, attr) |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
148 |
-- run _streamclosed in async context |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
149 |
session.thread:run({ stream = "closed", attr = attr }); |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
150 |
end |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
151 |
|
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
152 |
function stream_callbacks._streamclosed(session) |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 |
session.log("debug", "Received </stream:stream>"); |
4986
9da430b69f13
mod_c2s: Change 'reason' parameter of session:close() to take nil to mean 'graceful close initiated by us' and false for 'graceful close initiated by client'
Matthew Wild <mwild1@gmail.com>
parents:
4964
diff
changeset
|
154 |
session:close(false); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 |
function stream_callbacks.error(session, error, data) |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 |
if error == "no-stream" then |
6364
4e93e8768c36
mod_c2s, mod_s2s: Log received invalid stream headers
Matthew Wild <mwild1@gmail.com>
parents:
6279
diff
changeset
|
159 |
session.log("debug", "Invalid opening stream header (%s)", (data:gsub("^([^\1]+)\1", "{%1}"))); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 |
session:close("invalid-namespace"); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 |
elseif error == "parse-error" then |
10115
0f335815244f
plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents:
10021
diff
changeset
|
162 |
(session.log or log)("debug", "Client XML parse error: %s", data); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 |
session:close("not-well-formed"); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 |
elseif error == "stream-error" then |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 |
local condition, text = "undefined-condition"; |
8235
176b7f4e4ac9
mod_c2s: Iterate over child tags instead of child nodes in stream error (fixes traceback from #987)
Kim Alvefur <zash@zash.se>
parents:
7331
diff
changeset
|
166 |
for child in data:childtags(nil, xmlns_xmpp_streams) do |
176b7f4e4ac9
mod_c2s: Iterate over child tags instead of child nodes in stream error (fixes traceback from #987)
Kim Alvefur <zash@zash.se>
parents:
7331
diff
changeset
|
167 |
if child.name ~= "text" then |
176b7f4e4ac9
mod_c2s: Iterate over child tags instead of child nodes in stream error (fixes traceback from #987)
Kim Alvefur <zash@zash.se>
parents:
7331
diff
changeset
|
168 |
condition = child.name; |
176b7f4e4ac9
mod_c2s: Iterate over child tags instead of child nodes in stream error (fixes traceback from #987)
Kim Alvefur <zash@zash.se>
parents:
7331
diff
changeset
|
169 |
else |
176b7f4e4ac9
mod_c2s: Iterate over child tags instead of child nodes in stream error (fixes traceback from #987)
Kim Alvefur <zash@zash.se>
parents:
7331
diff
changeset
|
170 |
text = child:get_text(); |
176b7f4e4ac9
mod_c2s: Iterate over child tags instead of child nodes in stream error (fixes traceback from #987)
Kim Alvefur <zash@zash.se>
parents:
7331
diff
changeset
|
171 |
end |
176b7f4e4ac9
mod_c2s: Iterate over child tags instead of child nodes in stream error (fixes traceback from #987)
Kim Alvefur <zash@zash.se>
parents:
7331
diff
changeset
|
172 |
if condition ~= "undefined-condition" and text then |
176b7f4e4ac9
mod_c2s: Iterate over child tags instead of child nodes in stream error (fixes traceback from #987)
Kim Alvefur <zash@zash.se>
parents:
7331
diff
changeset
|
173 |
break; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 |
text = condition .. (text and (" ("..text..")") or ""); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 |
session.log("info", "Session closed by remote with error: %s", text); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 |
session:close(nil, text); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 |
function stream_callbacks.handlestanza(session, stanza) |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 |
stanza = session.filter("stanzas/in", stanza); |
7289 | 184 |
session.thread:run(stanza); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
187 |
--- Session methods |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
188 |
local function session_close(session, reason) |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
189 |
local log = session.log or log; |
12075
85c8fcb4192e
mod_c2s: Fire pre-closing event regardless of connected state
Kim Alvefur <zash@zash.se>
parents:
11978
diff
changeset
|
190 |
local close_event_payload = { session = session, reason = reason }; |
85c8fcb4192e
mod_c2s: Fire pre-closing event regardless of connected state
Kim Alvefur <zash@zash.se>
parents:
11978
diff
changeset
|
191 |
module:context(session.host):fire_event("pre-session-close", close_event_payload); |
85c8fcb4192e
mod_c2s: Fire pre-closing event regardless of connected state
Kim Alvefur <zash@zash.se>
parents:
11978
diff
changeset
|
192 |
reason = close_event_payload.reason; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
193 |
if session.conn then |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 |
if session.notopen then |
6005
98b768a41c9d
mod_c2s: Break out stream opening into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
5859
diff
changeset
|
195 |
session:open_stream(); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 |
end |
4986
9da430b69f13
mod_c2s: Change 'reason' parameter of session:close() to take nil to mean 'graceful close initiated by us' and false for 'graceful close initiated by client'
Matthew Wild <mwild1@gmail.com>
parents:
4964
diff
changeset
|
197 |
if reason then -- nil == no err, initiated by us, false == initiated by client |
5518
0220093e34fa
mod_c2s: Refactor <stream:error> building to allways tostring() it and only call send once
Kim Alvefur <zash@zash.se>
parents:
5505
diff
changeset
|
198 |
local stream_error = st.stanza("stream:error"); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 |
if type(reason) == "string" then -- assume stream error |
5518
0220093e34fa
mod_c2s: Refactor <stream:error> building to allways tostring() it and only call send once
Kim Alvefur <zash@zash.se>
parents:
5505
diff
changeset
|
200 |
stream_error:tag(reason, {xmlns = 'urn:ietf:params:xml:ns:xmpp-streams' }); |
11872
ae093c259da2
mod_c2s,etc: Identify stanza object with appropriate function
Kim Alvefur <zash@zash.se>
parents:
11782
diff
changeset
|
201 |
elseif st.is_stanza(reason) then |
ae093c259da2
mod_c2s,etc: Identify stanza object with appropriate function
Kim Alvefur <zash@zash.se>
parents:
11782
diff
changeset
|
202 |
stream_error = reason; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
203 |
elseif type(reason) == "table" then |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 |
if reason.condition then |
5518
0220093e34fa
mod_c2s: Refactor <stream:error> building to allways tostring() it and only call send once
Kim Alvefur <zash@zash.se>
parents:
5505
diff
changeset
|
205 |
stream_error:tag(reason.condition, stream_xmlns_attr):up(); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 |
if reason.text then |
5518
0220093e34fa
mod_c2s: Refactor <stream:error> building to allways tostring() it and only call send once
Kim Alvefur <zash@zash.se>
parents:
5505
diff
changeset
|
207 |
stream_error:tag("text", stream_xmlns_attr):text(reason.text):up(); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
208 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
209 |
if reason.extra then |
5518
0220093e34fa
mod_c2s: Refactor <stream:error> building to allways tostring() it and only call send once
Kim Alvefur <zash@zash.se>
parents:
5505
diff
changeset
|
210 |
stream_error:add_child(reason.extra); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 |
end |
5518
0220093e34fa
mod_c2s: Refactor <stream:error> building to allways tostring() it and only call send once
Kim Alvefur <zash@zash.se>
parents:
5505
diff
changeset
|
214 |
stream_error = tostring(stream_error); |
0220093e34fa
mod_c2s: Refactor <stream:error> building to allways tostring() it and only call send once
Kim Alvefur <zash@zash.se>
parents:
5505
diff
changeset
|
215 |
log("debug", "Disconnecting client, <stream:error> is: %s", stream_error); |
0220093e34fa
mod_c2s: Refactor <stream:error> building to allways tostring() it and only call send once
Kim Alvefur <zash@zash.se>
parents:
5505
diff
changeset
|
216 |
session.send(stream_error); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
217 |
end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
218 |
|
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
219 |
session.send("</stream:stream>"); |
4964
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
220 |
function session.send() return false; end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
221 |
|
7957
60b83f83f317
mod_c2s: Rename variable no avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7869
diff
changeset
|
222 |
local reason_text = (reason and (reason.name or reason.text or reason.condition)) or reason; |
8822
780d728f969f
mod_c2s: Avoid concatenating potential nil value (fixes #753)
Kim Alvefur <zash@zash.se>
parents:
8391
diff
changeset
|
223 |
session.log("debug", "c2s stream for %s closed: %s", session.full_jid or session.ip or "<unknown>", reason_text or "session closed"); |
4964
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
224 |
|
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
225 |
-- Authenticated incoming stream may still be sending us stanzas, so wait for </stream:stream> from remote |
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
226 |
local conn = session.conn; |
7957
60b83f83f317
mod_c2s: Rename variable no avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7869
diff
changeset
|
227 |
if reason_text == nil and not session.notopen and session.type == "c2s" then |
4964
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
228 |
-- Grace time to process data from authenticated cleanly-closed stream |
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
229 |
add_task(stream_close_timeout, function () |
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
230 |
if not session.destroyed then |
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
231 |
session.log("warn", "Failed to receive a stream close response, closing connection anyway..."); |
7957
60b83f83f317
mod_c2s: Rename variable no avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7869
diff
changeset
|
232 |
sm_destroy_session(session, reason_text); |
11513
dfdec3f9ccb1
mod_c2s: Fix traceback in session close when conn is nil
Kim Alvefur <zash@zash.se>
parents:
11511
diff
changeset
|
233 |
if conn then conn:close(); end |
4964
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
234 |
end |
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
235 |
end); |
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
236 |
else |
7957
60b83f83f317
mod_c2s: Rename variable no avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7869
diff
changeset
|
237 |
sm_destroy_session(session, reason_text); |
11513
dfdec3f9ccb1
mod_c2s: Fix traceback in session close when conn is nil
Kim Alvefur <zash@zash.se>
parents:
11511
diff
changeset
|
238 |
if conn then conn:close(); end |
4964
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
239 |
end |
7331
de76ded98b84
mod_c2s: Just destroy the session when it has no connection (see #641)
Kim Alvefur <zash@zash.se>
parents:
7224
diff
changeset
|
240 |
else |
7957
60b83f83f317
mod_c2s: Rename variable no avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7869
diff
changeset
|
241 |
local reason_text = (reason and (reason.name or reason.text or reason.condition)) or reason; |
60b83f83f317
mod_c2s: Rename variable no avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7869
diff
changeset
|
242 |
sm_destroy_session(session, reason_text); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
243 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
244 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
245 |
|
11903
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
246 |
-- Close all user sessions with the specified reason. If leave_resource is |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
247 |
-- true, the resource named by event.resource will not be closed. |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
248 |
local function disconnect_user_sessions(reason, leave_resource) |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
249 |
return function (event) |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
250 |
local username, host, resource = event.username, event.host, event.resource; |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
251 |
local user = hosts[host].sessions[username]; |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
252 |
if user and user.sessions then |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
253 |
for r, session in pairs(user.sessions) do |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
254 |
if not leave_resource or r ~= resource then |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
255 |
session:close(reason); |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
256 |
end |
8195
4354f556c5db
core.usermanager, various modules: Disconnect other resources on password change (thanks waqas) (fixes #512)
Kim Alvefur <zash@zash.se>
parents:
7958
diff
changeset
|
257 |
end |
4354f556c5db
core.usermanager, various modules: Disconnect other resources on password change (thanks waqas) (fixes #512)
Kim Alvefur <zash@zash.se>
parents:
7958
diff
changeset
|
258 |
end |
4354f556c5db
core.usermanager, various modules: Disconnect other resources on password change (thanks waqas) (fixes #512)
Kim Alvefur <zash@zash.se>
parents:
7958
diff
changeset
|
259 |
end |
11903
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
260 |
end |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
261 |
|
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
262 |
module:hook_global("user-password-changed", disconnect_user_sessions({ condition = "reset", text = "Password changed" }, true), 200); |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
263 |
module:hook_global("user-roles-changed", disconnect_user_sessions({ condition = "reset", text = "Roles changed" }), 200); |
6d06068363aa
mod_c2s: Disconnect user sessions on a role change event
Matthew Wild <mwild1@gmail.com>
parents:
11872
diff
changeset
|
264 |
module:hook_global("user-deleted", disconnect_user_sessions({ condition = "not-authorized", text = "Account deleted" }), 200); |
8195
4354f556c5db
core.usermanager, various modules: Disconnect other resources on password change (thanks waqas) (fixes #512)
Kim Alvefur <zash@zash.se>
parents:
7958
diff
changeset
|
265 |
|
7289 | 266 |
function runner_callbacks:ready() |
11514 | 267 |
if self.data.conn then |
268 |
self.data.conn:resume(); |
|
11515
cab64a0aad49
mod_c2s: Log about missing conn on async state changes
Kim Alvefur <zash@zash.se>
parents:
11514
diff
changeset
|
269 |
else |
cab64a0aad49
mod_c2s: Log about missing conn on async state changes
Kim Alvefur <zash@zash.se>
parents:
11514
diff
changeset
|
270 |
(self.data.log or log)("debug", "Session has no connection to resume"); |
11514 | 271 |
end |
7289 | 272 |
end |
273 |
||
274 |
function runner_callbacks:waiting() |
|
11514 | 275 |
if self.data.conn then |
276 |
self.data.conn:pause(); |
|
11515
cab64a0aad49
mod_c2s: Log about missing conn on async state changes
Kim Alvefur <zash@zash.se>
parents:
11514
diff
changeset
|
277 |
else |
cab64a0aad49
mod_c2s: Log about missing conn on async state changes
Kim Alvefur <zash@zash.se>
parents:
11514
diff
changeset
|
278 |
(self.data.log or log)("debug", "Session has no connection to pause while waiting"); |
11514 | 279 |
end |
7289 | 280 |
end |
281 |
||
282 |
function runner_callbacks:error(err) |
|
283 |
(self.data.log or log)("error", "Traceback[c2s]: %s", err); |
|
284 |
end |
|
285 |
||
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
286 |
--- Port listener |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
287 |
function listener.onconnect(conn) |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
288 |
local session = sm_new_session(conn); |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
289 |
|
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
290 |
session.log("info", "Client connected"); |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
291 |
|
11622
8f0fe74ede94
mod_c2s: Update a comment to reflect Direct TLS
Kim Alvefur <zash@zash.se>
parents:
11618
diff
changeset
|
292 |
-- Client is using Direct TLS or legacy SSL (otherwise mod_tls sets this flag) |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
293 |
if conn:ssl() then |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
294 |
session.secure = true; |
5859
e327f2d4e09f
mod_c2s, mod_s2s: Set session.encrypted as session.secure does not allways mean encrypted (eg consider_bosh_secure)
Kim Alvefur <zash@zash.se>
parents:
5802
diff
changeset
|
295 |
session.encrypted = true; |
5228
edabb34417b7
mod_c2s: Check if TLS compression is used
Kim Alvefur <zash@zash.se>
parents:
5120
diff
changeset
|
296 |
|
edabb34417b7
mod_c2s: Check if TLS compression is used
Kim Alvefur <zash@zash.se>
parents:
5120
diff
changeset
|
297 |
-- Check if TLS compression is used |
edabb34417b7
mod_c2s: Check if TLS compression is used
Kim Alvefur <zash@zash.se>
parents:
5120
diff
changeset
|
298 |
local sock = conn:socket(); |
11626
a62146353528
mod_c2s: Guard against LuaSec not returning TLS info (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
11623
diff
changeset
|
299 |
local info = sock.info and sock:info(); |
a62146353528
mod_c2s: Guard against LuaSec not returning TLS info (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
11623
diff
changeset
|
300 |
if type(info) == "table" then |
11623
d629135450ec
mod_c2s: Log the same messages for Direct TLS as with starttls
Kim Alvefur <zash@zash.se>
parents:
11622
diff
changeset
|
301 |
(session.log or log)("info", "Stream encrypted (%s with %s)", info.protocol, info.cipher); |
d629135450ec
mod_c2s: Log the same messages for Direct TLS as with starttls
Kim Alvefur <zash@zash.se>
parents:
11622
diff
changeset
|
302 |
session.compressed = info.compression; |
d629135450ec
mod_c2s: Log the same messages for Direct TLS as with starttls
Kim Alvefur <zash@zash.se>
parents:
11622
diff
changeset
|
303 |
m_tls_params:with_labels(info.protocol, info.cipher):add(1) |
d629135450ec
mod_c2s: Log the same messages for Direct TLS as with starttls
Kim Alvefur <zash@zash.se>
parents:
11622
diff
changeset
|
304 |
else |
d629135450ec
mod_c2s: Log the same messages for Direct TLS as with starttls
Kim Alvefur <zash@zash.se>
parents:
11622
diff
changeset
|
305 |
(session.log or log)("info", "Stream encrypted"); |
5228
edabb34417b7
mod_c2s: Check if TLS compression is used
Kim Alvefur <zash@zash.se>
parents:
5120
diff
changeset
|
306 |
end |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
307 |
end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
308 |
|
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
309 |
if opt_keepalives then |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
310 |
conn:setoption("keepalive", opt_keepalives); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
311 |
end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
312 |
|
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
313 |
session.close = session_close; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
314 |
|
11122
ece430d49809
mod_c2s,mod_s2s: Make stanza size limits configurable
Kim Alvefur <zash@zash.se>
parents:
10017
diff
changeset
|
315 |
local stream = new_xmpp_stream(session, stream_callbacks, stanza_size_limit); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
316 |
session.stream = stream; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
317 |
session.notopen = true; |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
318 |
|
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
319 |
function session.reset_stream() |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
320 |
session.notopen = true; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
321 |
session.stream:reset(); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
322 |
end |
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5773
diff
changeset
|
323 |
|
7289 | 324 |
session.thread = runner(function (stanza) |
10815
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
325 |
if st.is_stanza(stanza) then |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
326 |
core_process_stanza(session, stanza); |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
327 |
elseif stanza.stream == "opened" then |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
328 |
stream_callbacks._streamopened(session, stanza.attr); |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
329 |
elseif stanza.stream == "closed" then |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
330 |
stream_callbacks._streamclosed(session, stanza.attr); |
16bcbd574801
mod_c2s: Run stream open and close events in async thread, fixes #1103
Kim Alvefur <zash@zash.se>
parents:
10731
diff
changeset
|
331 |
end |
7289 | 332 |
end, runner_callbacks, session); |
333 |
||
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
334 |
local filter = session.filter; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
335 |
function session.data(data) |
5773
c9a712673d8a
mod_c2s: Add session:sleep() and session:wake() to pause a session (e.g. while waiting for an external event). Needs a gallon or two of testing.
Matthew Wild <mwild1@gmail.com>
parents:
5764
diff
changeset
|
336 |
-- Parse the data, which will store stanzas in session.pending_stanzas |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
337 |
if data then |
7542
366964dbddb1
mod_c2s: Fix whitespace (why does it keep getting messed up?)
Kim Alvefur <zash@zash.se>
parents:
7469
diff
changeset
|
338 |
data = filter("bytes/in", data); |
366964dbddb1
mod_c2s: Fix whitespace (why does it keep getting messed up?)
Kim Alvefur <zash@zash.se>
parents:
7469
diff
changeset
|
339 |
if data then |
366964dbddb1
mod_c2s: Fix whitespace (why does it keep getting messed up?)
Kim Alvefur <zash@zash.se>
parents:
7469
diff
changeset
|
340 |
local ok, err = stream:feed(data); |
5773
c9a712673d8a
mod_c2s: Add session:sleep() and session:wake() to pause a session (e.g. while waiting for an external event). Needs a gallon or two of testing.
Matthew Wild <mwild1@gmail.com>
parents:
5764
diff
changeset
|
341 |
if not ok then |
10115
0f335815244f
plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents:
10021
diff
changeset
|
342 |
log("debug", "Received invalid XML (%s) %d bytes: %q", err, #data, data:sub(1, 300)); |
10853
19e7092e062c
mod_c2s,mod_s2s: Use a distinct stream error for hitting stanza size limit
Kim Alvefur <zash@zash.se>
parents:
10815
diff
changeset
|
343 |
if err == "stanza-too-large" then |
11774
d2a9aa1c7ac8
mod_c2s,mod_s2s: Indicate stanza size violation with condition from XEP-0205 (thanks mjk)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
344 |
session:close({ |
d2a9aa1c7ac8
mod_c2s,mod_s2s: Indicate stanza size violation with condition from XEP-0205 (thanks mjk)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
345 |
condition = "policy-violation", |
d2a9aa1c7ac8
mod_c2s,mod_s2s: Indicate stanza size violation with condition from XEP-0205 (thanks mjk)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
346 |
text = "XML stanza is too big", |
d2a9aa1c7ac8
mod_c2s,mod_s2s: Indicate stanza size violation with condition from XEP-0205 (thanks mjk)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
347 |
extra = st.stanza("stanza-too-big", { xmlns = 'urn:xmpp:errors' }), |
d2a9aa1c7ac8
mod_c2s,mod_s2s: Indicate stanza size violation with condition from XEP-0205 (thanks mjk)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
348 |
}); |
10853
19e7092e062c
mod_c2s,mod_s2s: Use a distinct stream error for hitting stanza size limit
Kim Alvefur <zash@zash.se>
parents:
10815
diff
changeset
|
349 |
else |
19e7092e062c
mod_c2s,mod_s2s: Use a distinct stream error for hitting stanza size limit
Kim Alvefur <zash@zash.se>
parents:
10815
diff
changeset
|
350 |
session:close("not-well-formed"); |
19e7092e062c
mod_c2s,mod_s2s: Use a distinct stream error for hitting stanza size limit
Kim Alvefur <zash@zash.se>
parents:
10815
diff
changeset
|
351 |
end |
5773
c9a712673d8a
mod_c2s: Add session:sleep() and session:wake() to pause a session (e.g. while waiting for an external event). Needs a gallon or two of testing.
Matthew Wild <mwild1@gmail.com>
parents:
5764
diff
changeset
|
352 |
end |
c9a712673d8a
mod_c2s: Add session:sleep() and session:wake() to pause a session (e.g. while waiting for an external event). Needs a gallon or two of testing.
Matthew Wild <mwild1@gmail.com>
parents:
5764
diff
changeset
|
353 |
end |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
354 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
355 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
356 |
|
4548
e6e5c76ff009
sessionmanager, mod_c2s: Move timeout logic to mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
4543
diff
changeset
|
357 |
if c2s_timeout then |
e6e5c76ff009
sessionmanager, mod_c2s: Move timeout logic to mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
4543
diff
changeset
|
358 |
add_task(c2s_timeout, function () |
e6e5c76ff009
sessionmanager, mod_c2s: Move timeout logic to mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
4543
diff
changeset
|
359 |
if session.type == "c2s_unauthed" then |
11481
c90ef8745779
mod_c2s: Log a debug message before closing due to c2s_timeout
Kim Alvefur <zash@zash.se>
parents:
11363
diff
changeset
|
360 |
(session.log or log)("debug", "Connection still not authenticated after c2s_timeout=%gs, closing it", c2s_timeout); |
4548
e6e5c76ff009
sessionmanager, mod_c2s: Move timeout logic to mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
4543
diff
changeset
|
361 |
session:close("connection-timeout"); |
e6e5c76ff009
sessionmanager, mod_c2s: Move timeout logic to mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
4543
diff
changeset
|
362 |
end |
e6e5c76ff009
sessionmanager, mod_c2s: Move timeout logic to mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
4543
diff
changeset
|
363 |
end); |
e6e5c76ff009
sessionmanager, mod_c2s: Move timeout logic to mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
4543
diff
changeset
|
364 |
end |
e6e5c76ff009
sessionmanager, mod_c2s: Move timeout logic to mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
4543
diff
changeset
|
365 |
|
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
366 |
session.dispatch_stanza = stream_callbacks.handlestanza; |
10017
62d8689beafb
mod_c2s: Associate connection with session last (fixes #1313)
Kim Alvefur <zash@zash.se>
parents:
9493
diff
changeset
|
367 |
|
62d8689beafb
mod_c2s: Associate connection with session last (fixes #1313)
Kim Alvefur <zash@zash.se>
parents:
9493
diff
changeset
|
368 |
sessions[conn] = session; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
369 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
370 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
371 |
function listener.onincoming(conn, data) |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
372 |
local session = sessions[conn]; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
373 |
if session then |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
374 |
session.data(data); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
375 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
376 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
377 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
378 |
function listener.ondisconnect(conn, err) |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
379 |
local session = sessions[conn]; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
380 |
if session then |
4964
c9b8ec3eb1e9
mod_c2s: Don't call ondisconnect manually on close, it is now called by net.server. Replace with inline code for destroying the session, and also waiting for a reply </stream:stream> if there is a chance of further data sent by the client. session.send() on a half-closed stream returns false (and does not deliver the data).
Matthew Wild <mwild1@gmail.com>
parents:
4852
diff
changeset
|
381 |
(session.log or log)("info", "Client disconnected: %s", err or "connection closed"); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
382 |
sm_destroy_session(session, err); |
7224
56e65b1e54e8
mod_c2s: Remove connection object from session object when connection disconnected to prevent accidental use (see #590)
Kim Alvefur <zash@zash.se>
parents:
7103
diff
changeset
|
383 |
session.conn = nil; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
384 |
sessions[conn] = nil; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
385 |
end |
12305
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
386 |
module:fire_event("c2s-closed", { session = session; conn = conn }); |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
387 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
388 |
|
5638
c5b7f4858014
mod_c2s, mod_c2s: Send a whitespace on read timeout, to prod TCP into detecting if the connection died
Kim Alvefur <zash@zash.se>
parents:
5571
diff
changeset
|
389 |
function listener.onreadtimeout(conn) |
c5b7f4858014
mod_c2s, mod_c2s: Send a whitespace on read timeout, to prod TCP into detecting if the connection died
Kim Alvefur <zash@zash.se>
parents:
5571
diff
changeset
|
390 |
local session = sessions[conn]; |
c5b7f4858014
mod_c2s, mod_c2s: Send a whitespace on read timeout, to prod TCP into detecting if the connection died
Kim Alvefur <zash@zash.se>
parents:
5571
diff
changeset
|
391 |
if session then |
5669
9345c161481f
mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents:
5668
diff
changeset
|
392 |
return (hosts[session.host] or prosody).events.fire_event("c2s-read-timeout", { session = session }); |
5638
c5b7f4858014
mod_c2s, mod_c2s: Send a whitespace on read timeout, to prod TCP into detecting if the connection died
Kim Alvefur <zash@zash.se>
parents:
5571
diff
changeset
|
393 |
end |
c5b7f4858014
mod_c2s, mod_c2s: Send a whitespace on read timeout, to prod TCP into detecting if the connection died
Kim Alvefur <zash@zash.se>
parents:
5571
diff
changeset
|
394 |
end |
c5b7f4858014
mod_c2s, mod_c2s: Send a whitespace on read timeout, to prod TCP into detecting if the connection died
Kim Alvefur <zash@zash.se>
parents:
5571
diff
changeset
|
395 |
|
9914
7a703af90c9c
mod_c2s: Fire an event when outgoing buffers have been emptied
Kim Alvefur <zash@zash.se>
parents:
9788
diff
changeset
|
396 |
function listener.ondrain(conn) |
7a703af90c9c
mod_c2s: Fire an event when outgoing buffers have been emptied
Kim Alvefur <zash@zash.se>
parents:
9788
diff
changeset
|
397 |
local session = sessions[conn]; |
7a703af90c9c
mod_c2s: Fire an event when outgoing buffers have been emptied
Kim Alvefur <zash@zash.se>
parents:
9788
diff
changeset
|
398 |
if session then |
7a703af90c9c
mod_c2s: Fire an event when outgoing buffers have been emptied
Kim Alvefur <zash@zash.se>
parents:
9788
diff
changeset
|
399 |
return (hosts[session.host] or prosody).events.fire_event("c2s-ondrain", { session = session }); |
7a703af90c9c
mod_c2s: Fire an event when outgoing buffers have been emptied
Kim Alvefur <zash@zash.se>
parents:
9788
diff
changeset
|
400 |
end |
7a703af90c9c
mod_c2s: Fire an event when outgoing buffers have been emptied
Kim Alvefur <zash@zash.se>
parents:
9788
diff
changeset
|
401 |
end |
7a703af90c9c
mod_c2s: Fire an event when outgoing buffers have been emptied
Kim Alvefur <zash@zash.se>
parents:
9788
diff
changeset
|
402 |
|
11746
9c450185bac1
mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
403 |
function listener.onpredrain(conn) |
9c450185bac1
mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
404 |
local session = sessions[conn]; |
9c450185bac1
mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
405 |
if session then |
9c450185bac1
mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
406 |
return (hosts[session.host] or prosody).events.fire_event("c2s-pre-ondrain", { session = session }); |
9c450185bac1
mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
407 |
end |
9c450185bac1
mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
408 |
end |
9c450185bac1
mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
409 |
|
5669
9345c161481f
mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents:
5668
diff
changeset
|
410 |
local function keepalive(event) |
7543
e69df8093387
mod_c2s: Don't try to keep alive sessions where the stream is not (yet) open
Kim Alvefur <zash@zash.se>
parents:
7542
diff
changeset
|
411 |
local session = event.session; |
e69df8093387
mod_c2s: Don't try to keep alive sessions where the stream is not (yet) open
Kim Alvefur <zash@zash.se>
parents:
7542
diff
changeset
|
412 |
if not session.notopen then |
e69df8093387
mod_c2s: Don't try to keep alive sessions where the stream is not (yet) open
Kim Alvefur <zash@zash.se>
parents:
7542
diff
changeset
|
413 |
return event.session.send(' '); |
e69df8093387
mod_c2s: Don't try to keep alive sessions where the stream is not (yet) open
Kim Alvefur <zash@zash.se>
parents:
7542
diff
changeset
|
414 |
end |
5669
9345c161481f
mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents:
5668
diff
changeset
|
415 |
end |
9345c161481f
mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents:
5668
diff
changeset
|
416 |
|
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
417 |
function listener.associate_session(conn, session) |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
418 |
sessions[conn] = session; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
419 |
end |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
420 |
|
5669
9345c161481f
mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents:
5668
diff
changeset
|
421 |
function module.add_host(module) |
9345c161481f
mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents:
5668
diff
changeset
|
422 |
module:hook("c2s-read-timeout", keepalive, -1); |
6380
4220ffb87b22
net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents:
6364
diff
changeset
|
423 |
end |
4220ffb87b22
net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents:
6364
diff
changeset
|
424 |
|
5669
9345c161481f
mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents:
5668
diff
changeset
|
425 |
module:hook("c2s-read-timeout", keepalive, -1); |
5668
5a9318ac92f6
mod_c2s: Become a shared module and allow being disabled on some virtualhosts
Kim Alvefur <zash@zash.se>
parents:
5638
diff
changeset
|
426 |
|
12306
6a8c680b8677
mod_c2s: Ignore unused event payload [luacheck]
Kim Alvefur <zash@zash.se>
parents:
12305
diff
changeset
|
427 |
module:hook("server-stopping", function(event) -- luacheck: ignore 212/event |
12302
cb459f8fa740
mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents:
12075
diff
changeset
|
428 |
-- Close ports |
cb459f8fa740
mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents:
12075
diff
changeset
|
429 |
local pm = require "core.portmanager"; |
cb459f8fa740
mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents:
12075
diff
changeset
|
430 |
for _, netservice in pairs(module.items["net-provider"]) do |
cb459f8fa740
mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents:
12075
diff
changeset
|
431 |
pm.unregister_service(netservice.name, netservice); |
cb459f8fa740
mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents:
12075
diff
changeset
|
432 |
end |
12304
fb74ff16620c
mod_c2s: Close ports in a separate, earlier event from closing sessions
Kim Alvefur <zash@zash.se>
parents:
12302
diff
changeset
|
433 |
end, -80); |
12302
cb459f8fa740
mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents:
12075
diff
changeset
|
434 |
|
12304
fb74ff16620c
mod_c2s: Close ports in a separate, earlier event from closing sessions
Kim Alvefur <zash@zash.se>
parents:
12302
diff
changeset
|
435 |
module:hook("server-stopping", function(event) |
12315
bc30e1b9ad89
mod_c2s,mod_s2s: Fix error on shutdown (Thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
12313
diff
changeset
|
436 |
local wait, done = async.waiter(1, true); |
12305
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
437 |
module:hook("c2s-closed", function () |
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
438 |
if next(sessions) == nil then done(); end |
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
439 |
end) |
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
440 |
|
12302
cb459f8fa740
mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents:
12075
diff
changeset
|
441 |
-- Close sessions |
5281
815c689f85ad
prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents:
5228
diff
changeset
|
442 |
local reason = event.reason; |
815c689f85ad
prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents:
5228
diff
changeset
|
443 |
for _, session in pairs(sessions) do |
815c689f85ad
prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents:
5228
diff
changeset
|
444 |
session:close{ condition = "system-shutdown", text = reason }; |
815c689f85ad
prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents:
5228
diff
changeset
|
445 |
end |
12305
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
446 |
|
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
447 |
-- Wait for them to close properly if they haven't already |
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
448 |
if next(sessions) ~= nil then |
12313
926a6c5d13e7
mod_c2s,mod_s2s: Wrap callback to improve tracebacks
Kim Alvefur <zash@zash.se>
parents:
12306
diff
changeset
|
449 |
add_task(stream_close_timeout+1, function () done() end); |
12305
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
450 |
module:log("info", "Waiting for sessions to close"); |
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
451 |
wait(); |
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
452 |
end |
4f1fe6eb1ddb
mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents:
12304
diff
changeset
|
453 |
|
7103
301d58705667
mod_c2s, mod_s2s: Lower priority of session shutdown to negative, so that plugins hooking at the default priority run first (fixes #601)
Kim Alvefur <zash@zash.se>
parents:
6380
diff
changeset
|
454 |
end, -100); |
5281
815c689f85ad
prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents:
5228
diff
changeset
|
455 |
|
815c689f85ad
prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents:
5228
diff
changeset
|
456 |
|
815c689f85ad
prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents:
5228
diff
changeset
|
457 |
|
5120
bcabea740c00
mod_{admin_telnet,c2s,component,http,net_multiplex,s2s}: Use module:provides() instead of module:add_item().
Waqas Hussain <waqas20@gmail.com>
parents:
5097
diff
changeset
|
458 |
module:provides("net", { |
4610
171051f9dd00
mod_c2s: Use module:add_item() to add the net-provider for portmanager
Matthew Wild <mwild1@gmail.com>
parents:
4551
diff
changeset
|
459 |
name = "c2s"; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
460 |
listener = listener; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
461 |
default_port = 5222; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
462 |
encryption = "starttls"; |
4626
9df9e87d0339
mod_c2s: Add missing multiplexed service discovery pattern.
Kim Alvefur <zash@zash.se>
parents:
4625
diff
changeset
|
463 |
multiplex = { |
10469
09697a673015
mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents:
10383
diff
changeset
|
464 |
protocol = "xmpp-client"; |
4626
9df9e87d0339
mod_c2s: Add missing multiplexed service discovery pattern.
Kim Alvefur <zash@zash.se>
parents:
4625
diff
changeset
|
465 |
pattern = "^<.*:stream.*%sxmlns%s*=%s*(['\"])jabber:client%1.*>"; |
9df9e87d0339
mod_c2s: Add missing multiplexed service discovery pattern.
Kim Alvefur <zash@zash.se>
parents:
4625
diff
changeset
|
466 |
}; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
467 |
}); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
468 |
|
5120
bcabea740c00
mod_{admin_telnet,c2s,component,http,net_multiplex,s2s}: Use module:provides() instead of module:add_item().
Waqas Hussain <waqas20@gmail.com>
parents:
5097
diff
changeset
|
469 |
module:provides("net", { |
11782
f254fd16218a
mod_c2s: Rename Direct TLS listener 'c2s_direct_tls' for clarity
Kim Alvefur <zash@zash.se>
parents:
11774
diff
changeset
|
470 |
name = "c2s_direct_tls"; |
11618
1ac8976f09a9
mod_c2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents:
11612
diff
changeset
|
471 |
listener = listener; |
1ac8976f09a9
mod_c2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents:
11612
diff
changeset
|
472 |
encryption = "ssl"; |
1ac8976f09a9
mod_c2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents:
11612
diff
changeset
|
473 |
multiplex = { |
1ac8976f09a9
mod_c2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents:
11612
diff
changeset
|
474 |
pattern = "^<.*:stream.*%sxmlns%s*=%s*(['\"])jabber:client%1.*>"; |
1ac8976f09a9
mod_c2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents:
11612
diff
changeset
|
475 |
}; |
1ac8976f09a9
mod_c2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents:
11612
diff
changeset
|
476 |
}); |
1ac8976f09a9
mod_c2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents:
11612
diff
changeset
|
477 |
|
1ac8976f09a9
mod_c2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents:
11612
diff
changeset
|
478 |
-- COMPAT |
1ac8976f09a9
mod_c2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents:
11612
diff
changeset
|
479 |
module:provides("net", { |
4610
171051f9dd00
mod_c2s: Use module:add_item() to add the net-provider for portmanager
Matthew Wild <mwild1@gmail.com>
parents:
4551
diff
changeset
|
480 |
name = "legacy_ssl"; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
481 |
listener = listener; |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
482 |
encryption = "ssl"; |
4620
e9dc6ae68c69
mod_c2s, mod_s2s: Add multiplex support
Matthew Wild <mwild1@gmail.com>
parents:
4610
diff
changeset
|
483 |
multiplex = { |
e9dc6ae68c69
mod_c2s, mod_s2s: Add multiplex support
Matthew Wild <mwild1@gmail.com>
parents:
4610
diff
changeset
|
484 |
pattern = "^<.*:stream.*%sxmlns%s*=%s*(['\"])jabber:client%1.*>"; |
e9dc6ae68c69
mod_c2s, mod_s2s: Add multiplex support
Matthew Wild <mwild1@gmail.com>
parents:
4610
diff
changeset
|
485 |
}; |
4543
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
486 |
}); |
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
487 |
|
db27a4c18b6a
mod_c2s, sessionmanager, xmppclient_listener: Move all c2s network and stream logic into a new module, mod_c2s
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
488 |