annotate plugins/mod_s2s.lua @ 13987:4067a95336dd

mod_s2s, s2smanager: Experimental s2s_block_immediate_retries option Currently, if Prosody fails to connect to a remote domain, any pending stanzas are bounced back to the sender. If the code processing these stanzas responds to the error, we will begin a new outgoing connection before we've even finished processing the last one. This generally hasn't been a problem, Prosody handles it fine. However, it is questionable whether this is sensible behaviour (if we *just* failed to connect, will an immediate retry even work most of the time?). It can also lead to some awkward traffic patterns, e.g. when combined with MUC. For example, when a MUC receives an error from a remote user, it may kick that user from the MUC. This will cause a stanza to be sent to everyone else in the MUC. If other users from the same domain are present, the notification will be sent to the remote domain, triggering a new connection attempt for no reason (the user was likely about to be kicked anyway after the sendq had finished being bounced). This new option enables an alternative strategy, where attempts to send to the remote domain that failed will be rejected until the sendq has finished being processed. To enable the new behaviour, set the global option: s2s_block_immediate_retries = true
author Matthew Wild <mwild1@gmail.com>
date Thu, 16 Oct 2025 18:29:03 +0100
parents e3ef3e684855
children d4a7cc295363
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Prosody IM
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
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: 5770
diff changeset
4 --
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 --
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 module:set_global();
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
4755
844019f369a5 mod_s2s: Fix imports and remove some unused variables
Matthew Wild <mwild1@gmail.com>
parents: 4752
diff changeset
11 local prosody = prosody;
844019f369a5 mod_s2s: Fix imports and remove some unused variables
Matthew Wild <mwild1@gmail.com>
parents: 4752
diff changeset
12 local hosts = prosody.hosts;
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: 4997
diff changeset
13 local core_process_stanza = prosody.core_process_stanza;
4755
844019f369a5 mod_s2s: Fix imports and remove some unused variables
Matthew Wild <mwild1@gmail.com>
parents: 4752
diff changeset
14
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local tostring, type = tostring, type;
8461
0f05d6535dfa mod_s2s: Remove unused local [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8268
diff changeset
16 local traceback = debug.traceback;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
18 local add_task = require "prosody.util.timer".add_task;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
19 local stop_timer = require "prosody.util.timer".stop;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
20 local st = require "prosody.util.stanza";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
21 local initialize_filters = require "prosody.util.filters".initialize;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
22 local nameprep = require "prosody.util.encodings".stringprep.nameprep;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
23 local new_xmpp_stream = require "prosody.util.xmppstream".new;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
24 local s2s_new_incoming = require "prosody.core.s2smanager".new_incoming;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
25 local s2s_new_outgoing = require "prosody.core.s2smanager".new_outgoing;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
26 local s2s_destroy_session = require "prosody.core.s2smanager".destroy_session;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
27 local uuid_gen = require "prosody.util.uuid".generate;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
28 local async = require "prosody.util.async";
12301
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
29 local runner = async.runner;
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
30 local connect = require "prosody.net.connect".connect;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
31 local service = require "prosody.net.resolvers.service";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
32 local resolver_chain = require "prosody.net.resolvers.chain";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
33 local errors = require "prosody.util.error";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
34 local set = require "prosody.util.set";
13554
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
35 local queue = require "prosody.util.queue";
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36
13209
c8d949cf6b09 plugins: Switch to :get_option_period() for time range options
Kim Alvefur <zash@zash.se>
parents: 13111
diff changeset
37 local connect_timeout = module:get_option_period("s2s_timeout", 90);
c8d949cf6b09 plugins: Switch to :get_option_period() for time range options
Kim Alvefur <zash@zash.se>
parents: 13111
diff changeset
38 local stream_close_timeout = module:get_option_period("s2s_close_timeout", 5);
5522
3912c9264ef0 mod_s2s: Obey tcp_keepalives option for s2s too, and make it individually configurable through s2s_tcp_keepalives (thanks yeled)
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
39 local opt_keepalives = module:get_option_boolean("s2s_tcp_keepalives", module:get_option_boolean("tcp_keepalives", true));
5363
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
40 local secure_auth = module:get_option_boolean("s2s_secure_auth", false); -- One day...
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
41 local secure_domains, insecure_domains =
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
42 module:get_option_set("s2s_secure_domains", {})._items, module:get_option_set("s2s_insecure_domains", {})._items;
12330
38b5b05407be various: Require encryption by default for real
Kim Alvefur <zash@zash.se>
parents: 12301
diff changeset
43 local require_encryption = module:get_option_boolean("s2s_require_encryption", true);
13213
50324f66ca2a plugins: Use integer config API with interval specification where sensible
Kim Alvefur <zash@zash.se>
parents: 13209
diff changeset
44 local stanza_size_limit = module:get_option_integer("s2s_stanza_size_limit", 1024*512, 10000);
13554
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
45 local sendq_size = module:get_option_integer("s2s_send_queue_size", 1024*32, 1);
13987
4067a95336dd mod_s2s, s2smanager: Experimental s2s_block_immediate_retries option
Matthew Wild <mwild1@gmail.com>
parents: 13985
diff changeset
46 local block_retries = module:get_option_boolean("s2s_block_immediate_retries", false);
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
47
13504
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
48 local advertised_idle_timeout = 14*60; -- default in all net.server implementations
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
49 local network_settings = module:get_option("network_settings");
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
50 if type(network_settings) == "table" and type(network_settings.read_timeout) == "number" then
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
51 advertised_idle_timeout = network_settings.read_timeout;
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
52 end
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
53
11525
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
54 local measure_connections_inbound = module:metric(
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
55 "gauge", "connections_inbound", "",
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
56 "Established incoming s2s connections",
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
57 {"host", "type", "ip_family"}
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
58 );
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
59 local measure_connections_outbound = module:metric(
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
60 "gauge", "connections_outbound", "",
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
61 "Established outgoing s2s connections",
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
62 {"host", "type", "ip_family"}
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
63 );
6630
6735e2d735d6 mod_c2s, mod_s2s: Collect statistics on number of connections
Kim Alvefur <zash@zash.se>
parents: 6608
diff changeset
64
11526
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
65 local m_accepted_tcp_connections = module:metric(
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
66 "counter", "accepted_tcp", "",
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
67 "Accepted incoming connections on the TCP layer"
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
68 );
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
69 local m_authn_connections = module:metric(
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
70 "counter", "authenticated", "",
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
71 "Authenticated incoming connections",
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
72 {"host", "direction", "mechanism"}
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
73 );
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
74 local m_initiated_connections = module:metric(
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
75 "counter", "initiated", "",
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
76 "Initiated outbound connections",
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
77 {"host"}
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
78 );
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
79 local m_closed_connections = module:metric(
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
80 "counter", "closed", "",
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
81 "Closed connections",
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
82 {"host", "direction", "error"}
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
83 );
11608
b2610460d9ab mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents: 11560
diff changeset
84 local m_tls_params = module:metric(
b2610460d9ab mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents: 11560
diff changeset
85 "counter", "encrypted", "",
b2610460d9ab mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents: 11560
diff changeset
86 "Encrypted connections",
b2610460d9ab mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents: 11560
diff changeset
87 {"protocol"; "cipher"}
b2610460d9ab mod_c2s,mod_s2s: Collect stats on TLS versions and ciphers
Kim Alvefur <zash@zash.se>
parents: 11560
diff changeset
88 );
11526
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
89
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 local sessions = module:shared("sessions");
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91
7451
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
92 local runner_callbacks = {};
13575
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
93 local session_events = {};
7451
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
94
10120
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
95 local listener = {};
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
96
4752
27b724a698f8 mod_s2s: Add log() import
Matthew Wild <mwild1@gmail.com>
parents: 4630
diff changeset
97 local log = module._log;
27b724a698f8 mod_s2s: Add log() import
Matthew Wild <mwild1@gmail.com>
parents: 4630
diff changeset
98
10625
3bfb20be844c mod_s2s: Pass use_ipv4/use_ipv6 from config to service resolver
Matthew Wild <mwild1@gmail.com>
parents: 10622
diff changeset
99 local s2s_service_options = {
3bfb20be844c mod_s2s: Pass use_ipv4/use_ipv6 from config to service resolver
Matthew Wild <mwild1@gmail.com>
parents: 10622
diff changeset
100 default_port = 5269;
3bfb20be844c mod_s2s: Pass use_ipv4/use_ipv6 from config to service resolver
Matthew Wild <mwild1@gmail.com>
parents: 10622
diff changeset
101 use_ipv4 = module:get_option_boolean("use_ipv4", true);
3bfb20be844c mod_s2s: Pass use_ipv4/use_ipv6 from config to service resolver
Matthew Wild <mwild1@gmail.com>
parents: 10622
diff changeset
102 use_ipv6 = module:get_option_boolean("use_ipv6", true);
11415
a38f9e09ca31 mod_s2s: Add config setting to enable DANE
Kim Alvefur <zash@zash.se>
parents: 11367
diff changeset
103 use_dane = module:get_option_boolean("use_dane", false);
10625
3bfb20be844c mod_s2s: Pass use_ipv4/use_ipv6 from config to service resolver
Matthew Wild <mwild1@gmail.com>
parents: 10622
diff changeset
104 };
11707
61759372be26 mod_s2s: Clone 'extra' data to let resolvers add more to it
Kim Alvefur <zash@zash.se>
parents: 11705
diff changeset
105 local s2s_service_options_mt = { __index = s2s_service_options }
10625
3bfb20be844c mod_s2s: Pass use_ipv4/use_ipv6 from config to service resolver
Matthew Wild <mwild1@gmail.com>
parents: 10622
diff changeset
106
13298
b7c08f32112c mod_s2s: Automagically enable DANE for s2sin if 'use_dane' is enabled
Kim Alvefur <zash@zash.se>
parents: 13253
diff changeset
107 if module:get_option_boolean("use_dane", false) then
b7c08f32112c mod_s2s: Automagically enable DANE for s2sin if 'use_dane' is enabled
Kim Alvefur <zash@zash.se>
parents: 13253
diff changeset
108 -- DANE is supported in net.connect but only for outgoing connections,
b7c08f32112c mod_s2s: Automagically enable DANE for s2sin if 'use_dane' is enabled
Kim Alvefur <zash@zash.se>
parents: 13253
diff changeset
109 -- to authenticate incoming connections with DANE we need
b7c08f32112c mod_s2s: Automagically enable DANE for s2sin if 'use_dane' is enabled
Kim Alvefur <zash@zash.se>
parents: 13253
diff changeset
110 module:depends("s2s_auth_dane_in");
b7c08f32112c mod_s2s: Automagically enable DANE for s2sin if 'use_dane' is enabled
Kim Alvefur <zash@zash.se>
parents: 13253
diff changeset
111 end
b7c08f32112c mod_s2s: Automagically enable DANE for s2sin if 'use_dane' is enabled
Kim Alvefur <zash@zash.se>
parents: 13253
diff changeset
112
7662
946871f6e3c8 mod_c2s, mod_s2s: Switch connection counting to 'amount' type and enumerate once per statistics interval
Kim Alvefur <zash@zash.se>
parents: 7642
diff changeset
113 module:hook("stats-update", function ()
11525
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
114 measure_connections_inbound:clear()
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
115 measure_connections_outbound:clear()
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
116 -- TODO: init all expected metrics once?
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
117 -- or maybe create/delete them in host-activate/host-deactivate? requires
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
118 -- extra API in openmetrics.lua tho
8763
67ecff7be011 mod_s2s: Add a counter for IPv6.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8545
diff changeset
119 for _, session in pairs(sessions) do
11525
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
120 local is_inbound = string.sub(session.type, 4, 5) == "in"
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
121 local metric_family = is_inbound and measure_connections_inbound or measure_connections_outbound
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
122 local host = is_inbound and session.to_host or session.from_host or ""
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
123 local type_ = session.type or "other"
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
124
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
125 -- we want to expose both v4 and v6 counters in all cases to make
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
126 -- queries smoother
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
127 local is_ipv6 = session.ip and session.ip:match(":") and 1 or 0
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
128 local is_ipv4 = 1 - is_ipv6
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
129 metric_family:with_labels(host, type_, "ipv4"):add(is_ipv4)
5f99fcc43938 mod_s2s: Port to new OpenMetrics API
Jonas Schäfer <jonas@wielicki.name>
parents: 11419
diff changeset
130 metric_family:with_labels(host, type_, "ipv6"):add(is_ipv6)
7466
f28fa742def3 mod_c2s, mod_s2s: Bootstrap connection count statistic on module load
Kim Alvefur <zash@zash.se>
parents: 7449
diff changeset
131 end
7662
946871f6e3c8 mod_c2s, mod_s2s: Switch connection counting to 'amount' type and enumerate once per statistics interval
Kim Alvefur <zash@zash.se>
parents: 7642
diff changeset
132 end);
7466
f28fa742def3 mod_c2s, mod_s2s: Bootstrap connection count statistic on module load
Kim Alvefur <zash@zash.se>
parents: 7449
diff changeset
133
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 --- Handle stanzas to remote domains
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 local bouncy_stanzas = { message = true, presence = true, iq = true };
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 local function bounce_sendq(session, reason)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 local sendq = session.sendq;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 if not sendq then return; end
13557
63492b6e7fb6 mod_s2s: Really fix logging of outgoing stanza queue counts
Kim Alvefur <zash@zash.se>
parents: 13556
diff changeset
140 session.log("info", "Sending error replies for %d queued stanzas because of failed outgoing connection to %s", sendq.count(), session.to_host);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 local dummy = {
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 type = "s2sin";
8462
60d508f411a1 mod_s2s: Remove unused argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8461
diff changeset
143 send = function ()
4755
844019f369a5 mod_s2s: Fix imports and remove some unused variables
Matthew Wild <mwild1@gmail.com>
parents: 4752
diff changeset
144 (session.log or log)("error", "Replying to to an s2s error reply, please report this! Traceback: %s", traceback());
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 end;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 dummy = true;
6626
071611bc4f1d mod_s2s: Catch attempt to close dummy origin of s2s error replies (fixes a top level error)
Kim Alvefur <zash@zash.se>
parents: 6608
diff changeset
147 close = function ()
071611bc4f1d mod_s2s: Catch attempt to close dummy origin of s2s error replies (fixes a top level error)
Kim Alvefur <zash@zash.se>
parents: 6608
diff changeset
148 (session.log or log)("error", "Attempting to close the dummy origin of s2s error replies, please report this! Traceback: %s", traceback());
071611bc4f1d mod_s2s: Catch attempt to close dummy origin of s2s error replies (fixes a top level error)
Kim Alvefur <zash@zash.se>
parents: 6608
diff changeset
149 end;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 };
10115
c0bd5daa9c7f mod_s2s: Distinguish between high and low level errors in bounces
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
151 -- FIXME Allow for more specific error conditions
c0bd5daa9c7f mod_s2s: Distinguish between high and low level errors in bounces
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
152 -- TODO use util.error ?
c0bd5daa9c7f mod_s2s: Distinguish between high and low level errors in bounces
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
153 local error_type = "cancel";
c0bd5daa9c7f mod_s2s: Distinguish between high and low level errors in bounces
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
154 local condition = "remote-server-not-found";
10403
3b82e9df5a7a mod_s2s: Allow passing bounce reason as an util.error object (see #770)
Kim Alvefur <zash@zash.se>
parents: 10381
diff changeset
155 local reason_text;
10115
c0bd5daa9c7f mod_s2s: Distinguish between high and low level errors in bounces
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
156 if session.had_stream then -- set when a stream is opened by the remote
c0bd5daa9c7f mod_s2s: Distinguish between high and low level errors in bounces
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
157 error_type, condition = "wait", "remote-server-timeout";
c0bd5daa9c7f mod_s2s: Distinguish between high and low level errors in bounces
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
158 end
13534
d532176d4334 util.error: Use is_error() instead of is_err() everywhere
Kim Alvefur <zash@zash.se>
parents: 13516
diff changeset
159 if errors.is_error(reason) then
10403
3b82e9df5a7a mod_s2s: Allow passing bounce reason as an util.error object (see #770)
Kim Alvefur <zash@zash.se>
parents: 10381
diff changeset
160 error_type, condition, reason_text = reason.type, reason.condition, reason.text;
3b82e9df5a7a mod_s2s: Allow passing bounce reason as an util.error object (see #770)
Kim Alvefur <zash@zash.se>
parents: 10381
diff changeset
161 elseif type(reason) == "string" then
3b82e9df5a7a mod_s2s: Allow passing bounce reason as an util.error object (see #770)
Kim Alvefur <zash@zash.se>
parents: 10381
diff changeset
162 reason_text = reason;
3b82e9df5a7a mod_s2s: Allow passing bounce reason as an util.error object (see #770)
Kim Alvefur <zash@zash.se>
parents: 10381
diff changeset
163 end
13554
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
164 for stanza in sendq:consume() do
12493
e9ea5c88def0 mod_s2s: Don't bounce queued error stanzas (thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 12480
diff changeset
165 if not stanza.attr.xmlns and bouncy_stanzas[stanza.name] and stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then
12462
11765f0605ec mod_s2s: Store real stanzas in session.sendq, rather than strings
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
166 local reply = st.error_reply(
11765f0605ec mod_s2s: Store real stanzas in session.sendq, rather than strings
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
167 stanza,
11765f0605ec mod_s2s: Store real stanzas in session.sendq, rather than strings
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
168 error_type,
11765f0605ec mod_s2s: Store real stanzas in session.sendq, rather than strings
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
169 condition,
11765f0605ec mod_s2s: Store real stanzas in session.sendq, rather than strings
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
170 reason_text and ("Server-to-server connection failed: "..reason_text) or nil
11765f0605ec mod_s2s: Store real stanzas in session.sendq, rather than strings
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
171 );
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 core_process_stanza(dummy, reply);
12494
65316782862f mod_s2s: Log queued stanzas for which no error reply is produced
Kim Alvefur <zash@zash.se>
parents: 12493
diff changeset
173 else
65316782862f mod_s2s: Log queued stanzas for which no error reply is produced
Kim Alvefur <zash@zash.se>
parents: 12493
diff changeset
174 (session.log or log)("debug", "Not eligible for bouncing, discarding %s", stanza:top_tag());
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 session.sendq = nil;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179
4818
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
180 -- Handles stanzas to existing s2s sessions
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
181 function route_to_existing_session(event)
4580
351936a8de4a mod_s2s: Split send_to_host() into two route/remote hooks, one for already exsisting sessions and one for non-existent.
Kim Alvefur <zash@zash.se>
parents: 4578
diff changeset
182 local from_host, to_host, stanza = event.from_host, event.to_host, event.stanza;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 if not hosts[from_host] then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 log("warn", "Attempt to send stanza from %s - a host we don't serve", from_host);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 return false;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 end
5390
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
187 if hosts[to_host] then
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
188 log("warn", "Attempt to route stanza to a remote %s - a host we do serve?!", from_host);
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
189 return false;
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
190 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 local host = hosts[from_host].s2sout[to_host];
10483
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
192 if not host then return end
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
193
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
194 -- We have a connection to this host already
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
195 if host.type == "s2sout_unauthed" and (stanza.name ~= "db:verify" or not host.dialback_key) then
13886
cbb8dc92daa9 mod_s2s: Fix log to use formatting instead of concatenation (fixes #1461)
Kim Alvefur <zash@zash.se>
parents: 13804
diff changeset
196 (host.log or log)("debug", "trying to send over unauthed s2sout to %s", to_host);
4580
351936a8de4a mod_s2s: Split send_to_host() into two route/remote hooks, one for already exsisting sessions and one for non-existent.
Kim Alvefur <zash@zash.se>
parents: 4578
diff changeset
197
10483
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
198 -- Queue stanza until we are able to send it
13554
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
199 if not host.sendq then
10483
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
200 -- luacheck: ignore 122
13554
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
201 host.sendq = queue.new(sendq_size);
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
202 end
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
203 if not host.sendq:push(st.clone(stanza)) then
13957
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
204 -- We shouldn't get here, because the last stanza
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
205 -- should have triggered the 'full?' check.
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
206 host.log("warn", "Pending connection %s->%s has full queue - unable to queue %s stanza", from_host, to_host, stanza.name);
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
207 return false;
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
208 else
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
209 host.log("debug", "stanza [%s] queued ", stanza.name);
10483
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
210 end
13957
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
211
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
212 if host.sendq:full() then
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
213 -- A pending connection with a full queue could indicate
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
214 -- a stalled connection (trouble authenticating, etc.).
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
215 -- Our choice is to keep it open, and discard any additional stanzas
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
216 -- (which could cause inconsistencies, e.g. in MUC joins) or
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
217 -- force-close the connection.
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
218 host.log("warn", "Pending connection %s->%s has full queue - closing connection and bouncing stanzas", from_host, to_host);
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
219 host:close({
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
220 condition = "resource-constraint",
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
221 text = "Too many pending stanzas for this connection",
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
222 }, nil, "Too many pending stanzas for this connection");
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
223 end
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
224
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
225 -- Although in some cases the stanza was not delivered, it
8e6baa66f828 mod_s2s: Close outgoing pre-auth s2s sessions when their stanza queue is full
Matthew Wild <mwild1@gmail.com>
parents: 13886
diff changeset
226 -- was processed (queued or bounced), so we return true
10483
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
227 return true;
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
228 elseif host.type == "local" or host.type == "component" then
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
229 log("error", "Trying to send a stanza to ourselves??")
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
230 log("error", "Traceback: %s", traceback());
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
231 log("error", "Stanza: %s", stanza);
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
232 return false;
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
233 else
c12a24f0a385 mod_s2s: Invert condition to return early and reduce indentation
Kim Alvefur <zash@zash.se>
parents: 10482
diff changeset
234 if host.sends2s(stanza) then
4630
9502c0224caf mod_s2s: Queuing a stanza constitutes handling it.
Paul Aurich <paul@darkrain42.org>
parents: 4625
diff changeset
235 return true;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 end
4818
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
238 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239
4818
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
240 -- Create a new outgoing session for a stanza
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
241 function route_to_new_session(event)
4580
351936a8de4a mod_s2s: Split send_to_host() into two route/remote hooks, one for already exsisting sessions and one for non-existent.
Kim Alvefur <zash@zash.se>
parents: 4578
diff changeset
242 local from_host, to_host, stanza = event.from_host, event.to_host, event.stanza;
351936a8de4a mod_s2s: Split send_to_host() into two route/remote hooks, one for already exsisting sessions and one for non-existent.
Kim Alvefur <zash@zash.se>
parents: 4578
diff changeset
243 log("debug", "opening a new outgoing connection for this stanza");
351936a8de4a mod_s2s: Split send_to_host() into two route/remote hooks, one for already exsisting sessions and one for non-existent.
Kim Alvefur <zash@zash.se>
parents: 4578
diff changeset
244 local host_session = s2s_new_outgoing(from_host, to_host);
13987
4067a95336dd mod_s2s, s2smanager: Experimental s2s_block_immediate_retries option
Matthew Wild <mwild1@gmail.com>
parents: 13985
diff changeset
245 if block_retries then
4067a95336dd mod_s2s, s2smanager: Experimental s2s_block_immediate_retries option
Matthew Wild <mwild1@gmail.com>
parents: 13985
diff changeset
246 host_session.block_retries = true;
4067a95336dd mod_s2s, s2smanager: Experimental s2s_block_immediate_retries option
Matthew Wild <mwild1@gmail.com>
parents: 13985
diff changeset
247 end
10120
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
248 host_session.version = 1;
4580
351936a8de4a mod_s2s: Split send_to_host() into two route/remote hooks, one for already exsisting sessions and one for non-existent.
Kim Alvefur <zash@zash.se>
parents: 4578
diff changeset
249
351936a8de4a mod_s2s: Split send_to_host() into two route/remote hooks, one for already exsisting sessions and one for non-existent.
Kim Alvefur <zash@zash.se>
parents: 4578
diff changeset
250 -- Store in buffer
351936a8de4a mod_s2s: Split send_to_host() into two route/remote hooks, one for already exsisting sessions and one for non-existent.
Kim Alvefur <zash@zash.se>
parents: 4578
diff changeset
251 host_session.bounce_sendq = bounce_sendq;
13554
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
252 host_session.sendq = queue.new(sendq_size);
13556
d3649ae194ab mod_s2s: Clone queued outgoing stanzas to prevent changes
Kim Alvefur <zash@zash.se>
parents: 13555
diff changeset
253 host_session.sendq:push(st.clone(stanza));
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9854
diff changeset
254 log("debug", "stanza [%s] queued until connection complete", stanza.name);
11707
61759372be26 mod_s2s: Clone 'extra' data to let resolvers add more to it
Kim Alvefur <zash@zash.se>
parents: 11705
diff changeset
255 -- FIXME Cleaner solution to passing extra data from resolvers to net.server
61759372be26 mod_s2s: Clone 'extra' data to let resolvers add more to it
Kim Alvefur <zash@zash.se>
parents: 11705
diff changeset
256 -- This mt-clone allows resolvers to add extra data, currently used for DANE TLSA records
12207
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
257 module:context(from_host):fire_event("s2sout-created", { session = host_session });
12206
77ac0d96ac24 mod_s2s: Enable outgoing Direct TLS connections
Kim Alvefur <zash@zash.se>
parents: 11867
diff changeset
258 local xmpp_extra = setmetatable({}, s2s_service_options_mt);
12207
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
259 local resolver = service.new(to_host, "xmpp-server", "tcp", xmpp_extra);
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
260 if host_session.ssl_ctx then
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
261 local sslctx = host_session.ssl_ctx;
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
262 local xmpps_extra = setmetatable({ default_port = false; servername = to_host; sslctx = sslctx }, s2s_service_options_mt);
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
263 resolver = resolver_chain.new({
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
264 service.new(to_host, "xmpps-server", "tcp", xmpps_extra);
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
265 resolver;
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
266 });
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
267 end
13110
d5f322dd424b mod_s2s: Add event where resolver for s2sout can be tweaked
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
268
d5f322dd424b mod_s2s: Add event where resolver for s2sout can be tweaked
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
269 local pre_event = { session = host_session; resolver = resolver };
d5f322dd424b mod_s2s: Add event where resolver for s2sout can be tweaked
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
270 module:context(from_host):fire_event("s2sout-pre-connect", pre_event);
d5f322dd424b mod_s2s: Add event where resolver for s2sout can be tweaked
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
271 resolver = pre_event.resolver;
12207
65e252940337 mod_s2s: Retrieve TLS context for outgoing Direct TLS connections from mod_tls
Kim Alvefur <zash@zash.se>
parents: 12206
diff changeset
272 connect(resolver, listener, nil, { session = host_session });
11526
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
273 m_initiated_connections:with_labels(from_host):add(1)
4581
d2eb5962d235 mod_s2s: return true when we sent the stanza, or initiated a new s2sout
Kim Alvefur <zash@zash.se>
parents: 4580
diff changeset
274 return true;
4818
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
275 end
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
276
5669
9345c161481f mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents: 5661
diff changeset
277 local function keepalive(event)
11226
b3ae48362f78 mod_s2s: Prevent whitespace keepalives the stream has been opened
Kim Alvefur <zash@zash.se>
parents: 11118
diff changeset
278 local session = event.session;
b3ae48362f78 mod_s2s: Prevent whitespace keepalives the stream has been opened
Kim Alvefur <zash@zash.se>
parents: 11118
diff changeset
279 if not session.notopen then
11237
49aeae836ad1 mod_s2s: Fix copypaste mistake in b3ae48362f78
Kim Alvefur <zash@zash.se>
parents: 11226
diff changeset
280 return event.session.sends2s(' ');
11226
b3ae48362f78 mod_s2s: Prevent whitespace keepalives the stream has been opened
Kim Alvefur <zash@zash.se>
parents: 11118
diff changeset
281 end
5669
9345c161481f mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents: 5661
diff changeset
282 end
9345c161481f mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents: 5661
diff changeset
283
5713
5cf6dedf36f4 mod_s2s: Add missing global hook for read-timeout
Kim Alvefur <zash@zash.se>
parents: 5669
diff changeset
284 module:hook("s2s-read-timeout", keepalive, -1);
5cf6dedf36f4 mod_s2s: Add missing global hook for read-timeout
Kim Alvefur <zash@zash.se>
parents: 5669
diff changeset
285
4818
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
286 function module.add_host(module)
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
287 if module:get_option_boolean("disallow_s2s", false) then
7359
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7278
diff changeset
288 module:log("warn", "The 'disallow_s2s' config option is deprecated, please see https://prosody.im/doc/s2s#disabling");
4818
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
289 return nil, "This host has disallow_s2s set";
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
290 end
5454
5f69fddf6fb9 mod_s2s: Adjust priority of route/remote hooks to negative values (like most other internal hooks)
Kim Alvefur <zash@zash.se>
parents: 5423
diff changeset
291 module:hook("route/remote", route_to_existing_session, -1);
5f69fddf6fb9 mod_s2s: Adjust priority of route/remote hooks to negative values (like most other internal hooks)
Kim Alvefur <zash@zash.se>
parents: 5423
diff changeset
292 module:hook("route/remote", route_to_new_session, -10);
12810
871d2c95b403 mod_s2s: Advertise stream features on bidi connections
Kim Alvefur <zash@zash.se>
parents: 12808
diff changeset
293 module:hook("s2sout-stream-features", function (event)
13504
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
294 if not (stanza_size_limit or advertised_idle_timeout) then return end
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
295 local limits = event.features:tag("limits", { xmlns = "urn:xmpp:stream-limits:0" })
12810
871d2c95b403 mod_s2s: Advertise stream features on bidi connections
Kim Alvefur <zash@zash.se>
parents: 12808
diff changeset
296 if stanza_size_limit then
13504
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
297 limits:text_tag("max-bytes", string.format("%d", stanza_size_limit));
12810
871d2c95b403 mod_s2s: Advertise stream features on bidi connections
Kim Alvefur <zash@zash.se>
parents: 12808
diff changeset
298 end
13504
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
299 if advertised_idle_timeout then
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
300 limits:text_tag("idle-seconds", string.format("%d", advertised_idle_timeout));
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
301 end
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
302 limits:up();
12810
871d2c95b403 mod_s2s: Advertise stream features on bidi connections
Kim Alvefur <zash@zash.se>
parents: 12808
diff changeset
303 end);
12811
ccc0bdad82cc mod_s2s: Retrieve stanza size limit from peer for bidi connections
Kim Alvefur <zash@zash.se>
parents: 12810
diff changeset
304 module:hook_tag("urn:xmpp:bidi", "bidi", function(session, stanza)
ccc0bdad82cc mod_s2s: Retrieve stanza size limit from peer for bidi connections
Kim Alvefur <zash@zash.se>
parents: 12810
diff changeset
305 -- Advertising features on bidi connections where no <stream:features> is sent in the other direction
ccc0bdad82cc mod_s2s: Retrieve stanza size limit from peer for bidi connections
Kim Alvefur <zash@zash.se>
parents: 12810
diff changeset
306 local limits = stanza:get_child("limits", "urn:xmpp:stream-limits:0");
ccc0bdad82cc mod_s2s: Retrieve stanza size limit from peer for bidi connections
Kim Alvefur <zash@zash.se>
parents: 12810
diff changeset
307 if limits then
13093
93c68c454cb8 mod_c2s,mod_s2s: Fix tag name for SLA (thanks mjk)
Kim Alvefur <zash@zash.se>
parents: 12977
diff changeset
308 session.outgoing_stanza_size_limit = tonumber(limits:get_child_text("max-bytes"));
12811
ccc0bdad82cc mod_s2s: Retrieve stanza size limit from peer for bidi connections
Kim Alvefur <zash@zash.se>
parents: 12810
diff changeset
309 end
ccc0bdad82cc mod_s2s: Retrieve stanza size limit from peer for bidi connections
Kim Alvefur <zash@zash.se>
parents: 12810
diff changeset
310 end, 100);
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
311 module:hook("s2s-authenticated", make_authenticated, -1);
5669
9345c161481f mod_c2s, mod_s2s: Fire an event on read timeouts
Kim Alvefur <zash@zash.se>
parents: 5661
diff changeset
312 module:hook("s2s-read-timeout", keepalive, -1);
13382
f70311588c77 mod_s2s: Close connection on smacks timeout
Kim Alvefur <zash@zash.se>
parents: 13298
diff changeset
313 module:hook("smacks-ack-delayed", function (event)
f70311588c77 mod_s2s: Close connection on smacks timeout
Kim Alvefur <zash@zash.se>
parents: 13298
diff changeset
314 if event.origin.type == "s2sin" or event.origin.type == "s2sout" then
f70311588c77 mod_s2s: Close connection on smacks timeout
Kim Alvefur <zash@zash.se>
parents: 13298
diff changeset
315 event.origin:close("connection-timeout");
f70311588c77 mod_s2s: Close connection on smacks timeout
Kim Alvefur <zash@zash.se>
parents: 13298
diff changeset
316 return true;
f70311588c77 mod_s2s: Close connection on smacks timeout
Kim Alvefur <zash@zash.se>
parents: 13298
diff changeset
317 end
f70311588c77 mod_s2s: Close connection on smacks timeout
Kim Alvefur <zash@zash.se>
parents: 13298
diff changeset
318 end, -1);
9412
063977461363 mod_s2s: Silence all warnings instead of ignoring the entire module
Kim Alvefur <zash@zash.se>
parents: 9070
diff changeset
319 module:hook_stanza("http://etherx.jabber.org/streams", "features", function (session, stanza) -- luacheck: ignore 212/stanza
12808
12bd40b8e105 mod_c2s,mod_s2s: Adapt to XEP-xxxx: Stream Limits Advertisement
Kim Alvefur <zash@zash.se>
parents: 12807
diff changeset
320 local limits = stanza:get_child("limits", "urn:xmpp:stream-limits:0");
12806
751bdd412915 mod_s2s: Record stanza size limit advertised by other servers
Kim Alvefur <zash@zash.se>
parents: 12805
diff changeset
321 if limits then
13093
93c68c454cb8 mod_c2s,mod_s2s: Fix tag name for SLA (thanks mjk)
Kim Alvefur <zash@zash.se>
parents: 12977
diff changeset
322 session.outgoing_stanza_size_limit = tonumber(limits:get_child_text("max-bytes"));
12806
751bdd412915 mod_s2s: Record stanza size limit advertised by other servers
Kim Alvefur <zash@zash.se>
parents: 12805
diff changeset
323 end
6146
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
324 if session.type == "s2sout" then
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
325 -- Stream is authenticated and we are seem to be done with feature negotiation,
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
326 -- so the stream is ready for stanzas. RFC 6120 Section 4.3
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
327 mark_connected(session);
6403
166d1bd8fc38 core.stanza_router, mod_s2s: Move handling of S2S features to mod_s2s from stanza_router
Kim Alvefur <zash@zash.se>
parents: 6382
diff changeset
328 return true;
10457
0c44090cb168 mod_s2s: Abort outgoing connections earlier when TLS requirement isn't satisfied
Kim Alvefur <zash@zash.se>
parents: 10456
diff changeset
329 elseif require_encryption and not session.secure then
0c44090cb168 mod_s2s: Abort outgoing connections earlier when TLS requirement isn't satisfied
Kim Alvefur <zash@zash.se>
parents: 10456
diff changeset
330 session.log("warn", "Encrypted server-to-server communication is required but was not offered by %s", session.to_host);
0c44090cb168 mod_s2s: Abort outgoing connections earlier when TLS requirement isn't satisfied
Kim Alvefur <zash@zash.se>
parents: 10456
diff changeset
331 session:close({
0c44090cb168 mod_s2s: Abort outgoing connections earlier when TLS requirement isn't satisfied
Kim Alvefur <zash@zash.se>
parents: 10456
diff changeset
332 condition = "policy-violation",
0c44090cb168 mod_s2s: Abort outgoing connections earlier when TLS requirement isn't satisfied
Kim Alvefur <zash@zash.se>
parents: 10456
diff changeset
333 text = "Encrypted server-to-server communication is required but was not offered",
0c44090cb168 mod_s2s: Abort outgoing connections earlier when TLS requirement isn't satisfied
Kim Alvefur <zash@zash.se>
parents: 10456
diff changeset
334 }, nil, "Could not establish encrypted connection to remote server");
10459
7456eaa83b15 mod_s2s: Prevent unhandled stanza handler from complaining about stream features on aborted connections
Kim Alvefur <zash@zash.se>
parents: 10457
diff changeset
335 return true;
6426
e5945fb5b71f mod_s2s: Close s2s connections that can not proceed due to mod_dialback not being present
Kim Alvefur <zash@zash.se>
parents: 6403
diff changeset
336 elseif not session.dialback_verifying then
e5945fb5b71f mod_s2s: Close s2s connections that can not proceed due to mod_dialback not being present
Kim Alvefur <zash@zash.se>
parents: 6403
diff changeset
337 session.log("warn", "No SASL EXTERNAL offer and Dialback doesn't seem to be enabled, giving up");
10311
1bb1e16f24b0 mod_s2s: Close with a stream error in case neither SASL or Dialback are available
Kim Alvefur <zash@zash.se>
parents: 10249
diff changeset
338 session:close({
1bb1e16f24b0 mod_s2s: Close with a stream error in case neither SASL or Dialback are available
Kim Alvefur <zash@zash.se>
parents: 10249
diff changeset
339 condition = "unsupported-feature",
1bb1e16f24b0 mod_s2s: Close with a stream error in case neither SASL or Dialback are available
Kim Alvefur <zash@zash.se>
parents: 10249
diff changeset
340 text = "No viable authentication method offered",
10426
dd4eb84d92a8 mod_s2s: Add error text for error replies on some s2s failures (#770)
Kim Alvefur <zash@zash.se>
parents: 10425
diff changeset
341 }, nil, "No viable authentication method offered by remote server");
10459
7456eaa83b15 mod_s2s: Prevent unhandled stanza handler from complaining about stream features on aborted connections
Kim Alvefur <zash@zash.se>
parents: 10457
diff changeset
342 return true;
6146
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
343 end
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
344 end, -1);
11683
41b144a93897 mod_s2s: Close connections attached to a host being deactivated
Kim Alvefur <zash@zash.se>
parents: 11682
diff changeset
345
41b144a93897 mod_s2s: Close connections attached to a host being deactivated
Kim Alvefur <zash@zash.se>
parents: 11682
diff changeset
346 function module.unload()
11684
8b0baf3003fb mod_s2s: Don't close connections on reload
Kim Alvefur <zash@zash.se>
parents: 11683
diff changeset
347 if module.reloading then return end
11683
41b144a93897 mod_s2s: Close connections attached to a host being deactivated
Kim Alvefur <zash@zash.se>
parents: 11682
diff changeset
348 for _, session in pairs(sessions) do
12681
16ea01745dbe mod_s2s: Simplify conditionals since all sessions should have .host now
Kim Alvefur <zash@zash.se>
parents: 12680
diff changeset
349 if session.host == module.host then
11683
41b144a93897 mod_s2s: Close connections attached to a host being deactivated
Kim Alvefur <zash@zash.se>
parents: 11682
diff changeset
350 session:close("host-gone");
41b144a93897 mod_s2s: Close connections attached to a host being deactivated
Kim Alvefur <zash@zash.se>
parents: 11682
diff changeset
351 end
41b144a93897 mod_s2s: Close connections attached to a host being deactivated
Kim Alvefur <zash@zash.se>
parents: 11682
diff changeset
352 end
41b144a93897 mod_s2s: Close connections attached to a host being deactivated
Kim Alvefur <zash@zash.se>
parents: 11682
diff changeset
353 end
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
354 end
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
355
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
356 -- Stream is authorised, and ready for normal stanzas
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
357 function mark_connected(session)
8267
42fad8465537 mod_s2s: Use a separate resolver object for each outgoing session
Matthew Wild <mwild1@gmail.com>
parents: 8234
diff changeset
358
6683
873ad1023eb0 mod_s2s: Don't cache session.sends2s (or do it later), prevents sending data after session was closed
Kim Alvefur <zash@zash.se>
parents: 6600
diff changeset
359 local sendq = session.sendq;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
360
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
361 local from, to = session.from_host, session.to_host;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
362
5800
3a48acbcb7f3 mod_s2s: Captitalize log messages that begin with a stream direction
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
363 session.log("info", "%s s2s connection %s->%s complete", session.direction:gsub("^.", string.upper), from, to);
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
364
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
365 local event_data = { session = session };
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
366 if session.type == "s2sout" then
11668
f18fbae6d9fe mod_s2s: Use module API to fire events
Kim Alvefur <zash@zash.se>
parents: 11624
diff changeset
367 module:fire_event("s2sout-established", event_data);
f18fbae6d9fe mod_s2s: Use module API to fire events
Kim Alvefur <zash@zash.se>
parents: 11624
diff changeset
368 module:context(from):fire_event("s2sout-established", event_data);
10247
5de65f30fe5e mod_s2s: Add function to send replies on s2sout connections that support incoming traffic
Kim Alvefur <zash@zash.se>
parents: 10246
diff changeset
369
5de65f30fe5e mod_s2s: Add function to send replies on s2sout connections that support incoming traffic
Kim Alvefur <zash@zash.se>
parents: 10246
diff changeset
370 if session.incoming then
5de65f30fe5e mod_s2s: Add function to send replies on s2sout connections that support incoming traffic
Kim Alvefur <zash@zash.se>
parents: 10246
diff changeset
371 session.send = function(stanza)
11668
f18fbae6d9fe mod_s2s: Use module API to fire events
Kim Alvefur <zash@zash.se>
parents: 11624
diff changeset
372 return module:context(from):fire_event("route/remote", { from_host = from, to_host = to, stanza = stanza });
10247
5de65f30fe5e mod_s2s: Add function to send replies on s2sout connections that support incoming traffic
Kim Alvefur <zash@zash.se>
parents: 10246
diff changeset
373 end;
5de65f30fe5e mod_s2s: Add function to send replies on s2sout connections that support incoming traffic
Kim Alvefur <zash@zash.se>
parents: 10246
diff changeset
374 end
5de65f30fe5e mod_s2s: Add function to send replies on s2sout connections that support incoming traffic
Kim Alvefur <zash@zash.se>
parents: 10246
diff changeset
375
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
376 else
13985
e3ef3e684855 mod_s2s: Optimize order of table accesses
Kim Alvefur <zash@zash.se>
parents: 13957
diff changeset
377 local host_session = hosts[to];
e3ef3e684855 mod_s2s: Optimize order of table accesses
Kim Alvefur <zash@zash.se>
parents: 13957
diff changeset
378 if session.outgoing and not host_session.s2sout[from] then
10248
d7cadd118053 mod_s2s: Insert s2sin into outgoing routing table when bidirectional
Kim Alvefur <zash@zash.se>
parents: 10247
diff changeset
379 session.log("debug", "Setting up to handle route from %s to %s", to, from);
13985
e3ef3e684855 mod_s2s: Optimize order of table accesses
Kim Alvefur <zash@zash.se>
parents: 13957
diff changeset
380 host_session.s2sout[from] = session; -- luacheck: ignore 122
10248
d7cadd118053 mod_s2s: Insert s2sin into outgoing routing table when bidirectional
Kim Alvefur <zash@zash.se>
parents: 10247
diff changeset
381 end
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
382 session.send = function(stanza)
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
383 return host_session.events.fire_event("route/remote", { from_host = to, to_host = from, stanza = stanza });
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
384 end;
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
385
11668
f18fbae6d9fe mod_s2s: Use module API to fire events
Kim Alvefur <zash@zash.se>
parents: 11624
diff changeset
386 module:fire_event("s2sin-established", event_data);
f18fbae6d9fe mod_s2s: Use module API to fire events
Kim Alvefur <zash@zash.se>
parents: 11624
diff changeset
387 module:context(to):fire_event("s2sin-established", event_data);
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
388 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
389
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
390 if session.direction == "outgoing" then
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
391 if sendq then
13557
63492b6e7fb6 mod_s2s: Really fix logging of outgoing stanza queue counts
Kim Alvefur <zash@zash.se>
parents: 13556
diff changeset
392 session.log("debug", "sending %d queued stanzas across new outgoing connection to %s", sendq.count(), session.to_host);
6683
873ad1023eb0 mod_s2s: Don't cache session.sends2s (or do it later), prevents sending data after session was closed
Kim Alvefur <zash@zash.se>
parents: 6600
diff changeset
393 local send = session.sends2s;
13554
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
394 for stanza in sendq:consume() do
902d25cd0557 mod_s2s: Limit size of outgoing stanza queue
Kim Alvefur <zash@zash.se>
parents: 13534
diff changeset
395 -- TODO check send success
12462
11765f0605ec mod_s2s: Store real stanzas in session.sendq, rather than strings
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
396 send(stanza);
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
397 end
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
398 session.sendq = nil;
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
399 end
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
400 end
11678
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
401
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
402 if session.connect_timeout then
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
403 stop_timer(session.connect_timeout);
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
404 session.connect_timeout = nil;
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
405 end
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
406 end
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
407
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
408 function make_authenticated(event)
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
409 local session, host = event.session, event.host;
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
410 if not session.secure then
5594
ad66ee47b674 mod_s2s: Fix interaction between s2s_secure_auth and s2s_require_encryption, in particular ensure that when s2s_require_encryption is NOT set, do not require encryption on s2s_insecure_domains.
Matthew Wild <mwild1@gmail.com>
parents: 5533
diff changeset
411 if require_encryption or (secure_auth and not(insecure_domains[host])) or secure_domains[host] then
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
412 session:close({
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
413 condition = "policy-violation",
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
414 text = "Encrypted server-to-server communication is required but was not "
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
415 ..((session.direction == "outgoing" and "offered") or "used")
10426
dd4eb84d92a8 mod_s2s: Add error text for error replies on some s2s failures (#770)
Kim Alvefur <zash@zash.se>
parents: 10425
diff changeset
416 }, nil, "Could not establish encrypted connection to remote server");
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
417 end
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
418 end
12474
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
419
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
420 if session.type == "s2sout_unauthed" and not session.authenticated_remote and secure_auth and not insecure_domains[host] then
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
421 session:close({
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
422 condition = "policy-violation";
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
423 text = "Failed to verify certificate (internal error)";
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
424 });
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
425 return;
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
426 end
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
427
5390
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
428 if hosts[host] then
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
429 session:close({ condition = "undefined-condition", text = "Attempt to authenticate as a host we serve" });
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
430 end
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
431 if session.type == "s2sout_unauthed" then
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
432 session.type = "s2sout";
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
433 elseif session.type == "s2sin_unauthed" then
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
434 session.type = "s2sin";
10246
19d7a2e7b9c4 mod_s2s: Handle authentication of s2sin and s2sout the same way
Kim Alvefur <zash@zash.se>
parents: 10240
diff changeset
435 elseif session.type ~= "s2sin" and session.type ~= "s2sout" then
19d7a2e7b9c4 mod_s2s: Handle authentication of s2sin and s2sout the same way
Kim Alvefur <zash@zash.se>
parents: 10240
diff changeset
436 return false;
19d7a2e7b9c4 mod_s2s: Handle authentication of s2sin and s2sout the same way
Kim Alvefur <zash@zash.se>
parents: 10240
diff changeset
437 end
19d7a2e7b9c4 mod_s2s: Handle authentication of s2sin and s2sout the same way
Kim Alvefur <zash@zash.se>
parents: 10240
diff changeset
438
19d7a2e7b9c4 mod_s2s: Handle authentication of s2sin and s2sout the same way
Kim Alvefur <zash@zash.se>
parents: 10240
diff changeset
439 if session.incoming and host then
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
440 if not session.hosts[host] then session.hosts[host] = {}; end
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
441 session.hosts[host].authed = true;
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
442 end
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
443 session.log("debug", "connection %s->%s is now authenticated for %s", session.from_host, session.to_host, host);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
444
11526
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
445 local local_host = session.direction == "incoming" and session.to_host or session.from_host
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
446 m_authn_connections:with_labels(local_host, session.direction, event.mechanism or "other"):add(1)
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
447
6146
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
448 if (session.type == "s2sout" and session.external_auth ~= "succeeded") or session.type == "s2sin" then
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
449 -- Stream either used dialback for authentication or is an incoming stream.
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
450 mark_connected(session);
ac4f8770d9aa mod_s2s: Follow XMPP Core on when a stream is to be considered ready
Kim Alvefur <zash@zash.se>
parents: 6085
diff changeset
451 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
452
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
453 return true;
4818
3bda6fc02652 mod_s2s: Become a shared module (yay)
Matthew Wild <mwild1@gmail.com>
parents: 4814
diff changeset
454 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
456 --- Helper to check that a session peer's certificate is valid
11558
d0e9ffccdef9 mod_dialback: Remove d-w-d feature
Kim Alvefur <zash@zash.se>
parents: 11540
diff changeset
457 local function check_cert_status(session)
5387
1130887e0d41 mod_s2s: session.from_host does not allways exist on incoming connections, true and nil or "our hostname" does not evaluate to what we want here
Kim Alvefur <zash@zash.se>
parents: 5368
diff changeset
458 local host = session.direction == "outgoing" and session.to_host or session.from_host
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12476
diff changeset
459 local conn = session.conn
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
460 local cert
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12476
diff changeset
461 if conn.ssl_peercertificate then
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12476
diff changeset
462 cert = conn:ssl_peercertificate()
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
463 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
464
5363
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
465 return module:fire_event("s2s-check-certificate", { host = host, session = session, cert = cert });
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
466 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
467
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
468 --- XMPP stream event handlers
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
469
11772
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
470 local function session_secure(session)
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
471 session.secure = true;
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
472 session.encrypted = true;
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
473
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12476
diff changeset
474 local info = session.conn:ssl_info();
11772
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
475 if type(info) == "table" then
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
476 (session.log or log)("info", "Stream encrypted (%s with %s)", info.protocol, info.cipher);
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
477 session.compressed = info.compression;
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
478 m_tls_params:with_labels(info.protocol, info.cipher):add(1)
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
479 else
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
480 (session.log or log)("info", "Stream encrypted");
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
481 end
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
482 end
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
483
7451
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
484 local stream_callbacks = { default_ns = "jabber:server" };
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
485
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
486 function stream_callbacks.handlestanza(session, stanza)
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
487 stanza = session.filter("stanzas/in", stanza);
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
488 session.thread:run(stanza);
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
489 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
490
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
491 local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams";
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
492
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
493 function stream_callbacks.streamopened(session, attr)
7451
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
494 -- run _streamopened in async context
13575
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
495 session.thread:run({ event = "streamopened", attr = attr });
7451
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
496 end
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
497
13575
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
498 function session_events.streamopened(session, event)
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
499 local attr = event.attr;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
500 session.version = tonumber(attr.version) or 0;
10115
c0bd5daa9c7f mod_s2s: Distinguish between high and low level errors in bounces
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
501 session.had_stream = true; -- Had a stream opened at least once
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
502
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
503 -- TODO: Rename session.secure to session.encrypted
12602
9184fe3d489a mod_tls: Record STARTTLS state so it can be shown in Shell
Kim Alvefur <zash@zash.se>
parents: 12494
diff changeset
504 if session.secure == false then -- Set by mod_tls during STARTTLS handshake
9184fe3d489a mod_tls: Record STARTTLS state so it can be shown in Shell
Kim Alvefur <zash@zash.se>
parents: 12494
diff changeset
505 session.starttls = "completed";
11772
e2155e2703dd mod_s2s: Factor out procedure for newly encrypted sessions
Kim Alvefur <zash@zash.se>
parents: 11770
diff changeset
506 session_secure(session);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
507 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
508
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
509 if session.direction == "incoming" then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
510 -- Send a reply stream header
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
511
4589
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
512 -- Validate to/from
10381
66fa45d24481 mod_s2s: Only nameprep stream to/from addresses if they are present
Kim Alvefur <zash@zash.se>
parents: 10311
diff changeset
513 local to, from = attr.to, attr.from;
66fa45d24481 mod_s2s: Only nameprep stream to/from addresses if they are present
Kim Alvefur <zash@zash.se>
parents: 10311
diff changeset
514 if to then to = nameprep(attr.to); end
66fa45d24481 mod_s2s: Only nameprep stream to/from addresses if they are present
Kim Alvefur <zash@zash.se>
parents: 10311
diff changeset
515 if from then from = nameprep(attr.from); end
4589
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
516 if not to and attr.to then -- COMPAT: Some servers do not reliably set 'to' (especially on stream restarts)
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
517 session:close({ condition = "improper-addressing", text = "Invalid 'to' address" });
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
518 return;
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
519 end
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
520 if not from and attr.from then -- COMPAT: Some servers do not reliably set 'from' (especially on stream restarts)
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
521 session:close({ condition = "improper-addressing", text = "Invalid 'from' address" });
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
522 return;
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
523 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
524
4589
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
525 -- Set session.[from/to]_host if they have not been set already and if
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
526 -- this session isn't already authenticated
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
527 if session.type == "s2sin_unauthed" and from and not session.from_host then
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
528 session.from_host = from;
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
529 elseif from ~= session.from_host then
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
530 session:close({ condition = "improper-addressing", text = "New stream 'from' attribute does not match original" });
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
531 return;
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
532 end
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
533 if session.type == "s2sin_unauthed" and to and not session.to_host then
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
534 session.to_host = to;
12679
7d4a95ba9b6c mod_s2s: Fix firing buffer drain events
Kim Alvefur <zash@zash.se>
parents: 12474
diff changeset
535 session.host = to;
4589
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
536 elseif to ~= session.to_host then
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
537 session:close({ condition = "improper-addressing", text = "New stream 'to' attribute does not match original" });
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
538 return;
8553d822f417 mod_s2s: streamopened(): Tighter validation around stream 'to' and 'from' attributes, and only set to_host and from_host if they aren't set already and if the session hasn't already been authenticated
Matthew Wild <mwild1@gmail.com>
parents: 4587
diff changeset
539 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
540
4820
c65edd3bb334 mod_s2s: Cache to_host and from_host in local variables, and use these instead of repeated lookups
Matthew Wild <mwild1@gmail.com>
parents: 4819
diff changeset
541 -- For convenience we'll put the sanitised values into these variables
c65edd3bb334 mod_s2s: Cache to_host and from_host in local variables, and use these instead of repeated lookups
Matthew Wild <mwild1@gmail.com>
parents: 4819
diff changeset
542 to, from = session.to_host, session.from_host;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
543
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
544 session.streamid = uuid_gen();
4590
883611842d3a mod_s2s: Log the entire stream header.
Kim Alvefur <zash@zash.se>
parents: 4587
diff changeset
545 (session.log or log)("debug", "Incoming s2s received %s", st.stanza("stream:stream", attr):top_tag());
4820
c65edd3bb334 mod_s2s: Cache to_host and from_host in local variables, and use these instead of repeated lookups
Matthew Wild <mwild1@gmail.com>
parents: 4819
diff changeset
546 if to then
c65edd3bb334 mod_s2s: Cache to_host and from_host in local variables, and use these instead of repeated lookups
Matthew Wild <mwild1@gmail.com>
parents: 4819
diff changeset
547 if not hosts[to] then
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
548 -- Attempting to connect to a host we don't serve
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
549 session:close({
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
550 condition = "host-unknown";
4820
c65edd3bb334 mod_s2s: Cache to_host and from_host in local variables, and use these instead of repeated lookups
Matthew Wild <mwild1@gmail.com>
parents: 4819
diff changeset
551 text = "This host does not serve "..to
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
552 });
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
553 return;
4834
878f75ccc4fb mod_s2s, mod_auth_anonymous, hostmanager: Remove disallow_s2s flag, deprecate the config option of the same name (disable mod_s2s instead), and add 'allow_anonymous_s2s' to separately control s2s for anonymous users
Matthew Wild <mwild1@gmail.com>
parents: 4822
diff changeset
554 elseif not hosts[to].modules.s2s then
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
555 -- Attempting to connect to a host that disallows s2s
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
556 session:close({
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
557 condition = "policy-violation";
4834
878f75ccc4fb mod_s2s, mod_auth_anonymous, hostmanager: Remove disallow_s2s flag, deprecate the config option of the same name (disable mod_s2s instead), and add 'allow_anonymous_s2s' to separately control s2s for anonymous users
Matthew Wild <mwild1@gmail.com>
parents: 4822
diff changeset
558 text = "Server-to-server communication is disabled for this host";
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
559 });
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
560 return;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
561 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
562 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
563
5390
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
564 if hosts[from] then
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
565 session:close({ condition = "undefined-condition", text = "Attempt to connect from a host we serve" });
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
566 return;
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
567 end
b3c8757ee4f4 mod_s2s: Prevent s2s to and from hosts we serve locally
Kim Alvefur <zash@zash.se>
parents: 5389
diff changeset
568
5363
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
569 if session.secure and not session.cert_chain_status then
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
570 if check_cert_status(session) == false then
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
571 return;
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
572 end
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
573 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
574
5533
df3c78221f26 mod_s2s: Ensure that to/from on stream headers are always correct, fixes #338
Matthew Wild <mwild1@gmail.com>
parents: 5522
diff changeset
575 session:open_stream(session.to_host, session.from_host)
11609
6dcc45a2e3bc mod_s2s: Bail if connection is destroyed after attempting to open stream
Kim Alvefur <zash@zash.se>
parents: 11608
diff changeset
576 if session.destroyed then
6dcc45a2e3bc mod_s2s: Bail if connection is destroyed after attempting to open stream
Kim Alvefur <zash@zash.se>
parents: 11608
diff changeset
577 -- sending the stream opening could have failed during an opportunistic write
6dcc45a2e3bc mod_s2s: Bail if connection is destroyed after attempting to open stream
Kim Alvefur <zash@zash.se>
parents: 11608
diff changeset
578 return
6dcc45a2e3bc mod_s2s: Bail if connection is destroyed after attempting to open stream
Kim Alvefur <zash@zash.se>
parents: 11608
diff changeset
579 end
6dcc45a2e3bc mod_s2s: Bail if connection is destroyed after attempting to open stream
Kim Alvefur <zash@zash.se>
parents: 11608
diff changeset
580
6684
53635a91c95c mod_s2s: Mark stream as opened directly after opening stream, prevents session.close opening it again
Kim Alvefur <zash@zash.se>
parents: 6683
diff changeset
581 session.notopen = nil;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
582 if session.version >= 1.0 then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
583 local features = st.stanza("stream:features");
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
584
4820
c65edd3bb334 mod_s2s: Cache to_host and from_host in local variables, and use these instead of repeated lookups
Matthew Wild <mwild1@gmail.com>
parents: 4819
diff changeset
585 if to then
11668
f18fbae6d9fe mod_s2s: Use module API to fire events
Kim Alvefur <zash@zash.se>
parents: 11624
diff changeset
586 module:context(to):fire_event("s2s-stream-features", { origin = session, features = features });
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
587 else
5975
0d219631d47b mod_s2s: Include IP in log messages, if host is unavailable
Florian Zeitz <florob@babelmonkeys.de>
parents: 5769
diff changeset
588 (session.log or log)("warn", "No 'to' on stream header from %s means we can't offer any features", from or session.ip or "unknown host");
11668
f18fbae6d9fe mod_s2s: Use module API to fire events
Kim Alvefur <zash@zash.se>
parents: 11624
diff changeset
589 module:fire_event("s2s-stream-features-legacy", { origin = session, features = features });
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
590 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
591
6846
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: 6685
diff changeset
592 if ( session.type == "s2sin" or session.type == "s2sout" ) or features.tags[1] then
13504
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
593 if stanza_size_limit or advertised_idle_timeout then
12805
d96e24bd54e1 mod_s2s: Advertise stanza size limit to other servers
Kim Alvefur <zash@zash.se>
parents: 12681
diff changeset
594 features:reset();
13504
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
595 local limits = features:tag("limits", { xmlns = "urn:xmpp:stream-limits:0" });
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
596 if stanza_size_limit then
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
597 limits:text_tag("max-bytes", string.format("%d", stanza_size_limit));
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
598 end
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
599 if advertised_idle_timeout then
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
600 limits:text_tag("idle-seconds", string.format("%d", advertised_idle_timeout));
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
601 end
2159a206684e mod_c2s,mod_s2s: Advertise idle-seconds per XEP-0478
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
602 features:reset();
12805
d96e24bd54e1 mod_s2s: Advertise stanza size limit to other servers
Kim Alvefur <zash@zash.se>
parents: 12681
diff changeset
603 end
d96e24bd54e1 mod_s2s: Advertise stanza size limit to other servers
Kim Alvefur <zash@zash.se>
parents: 12681
diff changeset
604
8483
6d47b74926dd mod_s2s: Remove tostring() in logging since this is handled by util.format now
Kim Alvefur <zash@zash.se>
parents: 8463
diff changeset
605 log("debug", "Sending stream features: %s", features);
6846
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: 6685
diff changeset
606 session.sends2s(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: 6685
diff changeset
607 else
7865
a8cc495a65dc mod_s2s: Clarify that it is stream features that can't be offered (here too)
Kim Alvefur <zash@zash.se>
parents: 7679
diff changeset
608 (session.log or log)("warn", "No stream features to offer, giving up");
a8cc495a65dc mod_s2s: Clarify that it is stream features that can't be offered (here too)
Kim Alvefur <zash@zash.se>
parents: 7679
diff changeset
609 session:close({ condition = "undefined-condition", text = "No stream features to offer" });
6846
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: 6685
diff changeset
610 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
611 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
612 elseif session.direction == "outgoing" then
6359
c74670b3be53 mod_s2s: Mark stream as opened earlier for outgoing connections, fixes double stream headers on policy failures
Kim Alvefur <zash@zash.se>
parents: 5975
diff changeset
613 session.notopen = nil;
6378
3cec0eef0b70 mod_s2s: Close offending s2s streams missing an 'id' attribute with a stream error instead of throwing an unhandled error
Kim Alvefur <zash@zash.se>
parents: 6364
diff changeset
614 if not attr.id then
7677
8613086779fa mod_s2s: Lower log message to 'warn' level, standard for remotely-triggered protocol issues
Matthew Wild <mwild1@gmail.com>
parents: 7100
diff changeset
615 log("warn", "Stream response did not give us a stream id!");
6378
3cec0eef0b70 mod_s2s: Close offending s2s streams missing an 'id' attribute with a stream error instead of throwing an unhandled error
Kim Alvefur <zash@zash.se>
parents: 6364
diff changeset
616 session:close({ condition = "undefined-condition", text = "Missing stream ID" });
3cec0eef0b70 mod_s2s: Close offending s2s streams missing an 'id' attribute with a stream error instead of throwing an unhandled error
Kim Alvefur <zash@zash.se>
parents: 6364
diff changeset
617 return;
3cec0eef0b70 mod_s2s: Close offending s2s streams missing an 'id' attribute with a stream error instead of throwing an unhandled error
Kim Alvefur <zash@zash.se>
parents: 6364
diff changeset
618 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
619 session.streamid = attr.id;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
620
5363
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
621 if session.secure and not session.cert_chain_status then
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
622 if check_cert_status(session) == false then
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
623 return;
12474
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
624 else
8fac32810144 mod_s2s: Improve robustness of outgoing s2s certificate verification
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
625 session.authenticated_remote = true;
5363
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
626 end
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
627 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
628
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
629 -- If server is pre-1.0, don't wait for features, just do dialback
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
630 if session.version < 1.0 then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
631 if not session.dialback_verifying then
11668
f18fbae6d9fe mod_s2s: Use module API to fire events
Kim Alvefur <zash@zash.se>
parents: 11624
diff changeset
632 module:context(session.from_host):fire_event("s2sout-authenticate-legacy", { origin = session });
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
633 else
5362
612467e263af s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
Matthew Wild <mwild1@gmail.com>
parents: 5351
diff changeset
634 mark_connected(session);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
635 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
636 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
637 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
638 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
639
13575
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
640 function session_events.streamclosed(session)
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
641 (session.log or log)("debug", "Received </stream:stream>");
4988
29bdf68ad142 mod_s2s: Adjust session:close() in line with mod_c2s's - fixes waiting for </stream:stream> if it has already been sent by the peer
Matthew Wild <mwild1@gmail.com>
parents: 4969
diff changeset
642 session:close(false);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
643 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
644
13575
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
645 function session_events.callback(session, event)
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
646 session.log("debug", "Running session callback %s", event.name);
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
647 event.callback(session, event);
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
648 end
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
649
10810
8a0a923e1ced mod_s2s: Run stream close in async context
Kim Alvefur <zash@zash.se>
parents: 10809
diff changeset
650 function stream_callbacks.streamclosed(session, attr)
8a0a923e1ced mod_s2s: Run stream close in async context
Kim Alvefur <zash@zash.se>
parents: 10809
diff changeset
651 -- run _streamclosed in async context
13575
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
652 session.thread:run({ event = "streamclosed", attr = attr });
10810
8a0a923e1ced mod_s2s: Run stream close in async context
Kim Alvefur <zash@zash.se>
parents: 10809
diff changeset
653 end
8a0a923e1ced mod_s2s: Run stream close in async context
Kim Alvefur <zash@zash.se>
parents: 10809
diff changeset
654
11682
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
655 -- Some stream conditions indicate a problem on our end, e.g. that we sent
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
656 -- something invalid. Those should be investigated. Others are problems or
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
657 -- events in the remote host that don't affect us, or simply that the
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
658 -- connection was closed for being idle.
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
659 local stream_condition_severity = {
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
660 ["bad-format"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
661 ["bad-namespace-prefix"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
662 ["conflict"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
663 ["connection-timeout"] = "debug";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
664 ["host-gone"] = "info";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
665 ["host-unknown"] = "info";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
666 ["improper-addressing"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
667 ["internal-server-error"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
668 ["invalid-from"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
669 ["invalid-namespace"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
670 ["invalid-xml"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
671 ["not-authorized"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
672 ["not-well-formed"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
673 ["policy-violation"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
674 ["remote-connection-failed"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
675 ["reset"] = "info";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
676 ["resource-constraint"] = "info";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
677 ["restricted-xml"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
678 ["see-other-host"] = "info";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
679 ["system-shutdown"] = "info";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
680 ["undefined-condition"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
681 ["unsupported-encoding"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
682 ["unsupported-feature"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
683 ["unsupported-stanza-type"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
684 ["unsupported-version"] = "warn";
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
685 }
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
686
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
687 function stream_callbacks.error(session, error, data)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
688 if error == "no-stream" then
6364
4e93e8768c36 mod_c2s, mod_s2s: Log received invalid stream headers
Matthew Wild <mwild1@gmail.com>
parents: 6362
diff changeset
689 session.log("debug", "Invalid opening stream header (%s)", (data:gsub("^([^\1]+)\1", "{%1}")));
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
690 session:close("invalid-namespace");
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
691 elseif error == "parse-error" then
8483
6d47b74926dd mod_s2s: Remove tostring() in logging since this is handled by util.format now
Kim Alvefur <zash@zash.se>
parents: 8463
diff changeset
692 session.log("debug", "Server-to-server XML parse error: %s", error);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
693 session:close("not-well-formed");
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
694 elseif error == "stream-error" then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
695 local condition, text = "undefined-condition";
8233
4e7269c53659 mod_component, mod_s2s: Iterate over child tags instead of child nodes (can include text) in stream error (same as 176b7f4e4ac9)
Kim Alvefur <zash@zash.se>
parents: 7677
diff changeset
696 for child in data:childtags(nil, xmlns_xmpp_streams) do
4e7269c53659 mod_component, mod_s2s: Iterate over child tags instead of child nodes (can include text) in stream error (same as 176b7f4e4ac9)
Kim Alvefur <zash@zash.se>
parents: 7677
diff changeset
697 if child.name ~= "text" then
4e7269c53659 mod_component, mod_s2s: Iterate over child tags instead of child nodes (can include text) in stream error (same as 176b7f4e4ac9)
Kim Alvefur <zash@zash.se>
parents: 7677
diff changeset
698 condition = child.name;
4e7269c53659 mod_component, mod_s2s: Iterate over child tags instead of child nodes (can include text) in stream error (same as 176b7f4e4ac9)
Kim Alvefur <zash@zash.se>
parents: 7677
diff changeset
699 else
4e7269c53659 mod_component, mod_s2s: Iterate over child tags instead of child nodes (can include text) in stream error (same as 176b7f4e4ac9)
Kim Alvefur <zash@zash.se>
parents: 7677
diff changeset
700 text = child:get_text();
4e7269c53659 mod_component, mod_s2s: Iterate over child tags instead of child nodes (can include text) in stream error (same as 176b7f4e4ac9)
Kim Alvefur <zash@zash.se>
parents: 7677
diff changeset
701 end
4e7269c53659 mod_component, mod_s2s: Iterate over child tags instead of child nodes (can include text) in stream error (same as 176b7f4e4ac9)
Kim Alvefur <zash@zash.se>
parents: 7677
diff changeset
702 if condition ~= "undefined-condition" and text then
4e7269c53659 mod_component, mod_s2s: Iterate over child tags instead of child nodes (can include text) in stream error (same as 176b7f4e4ac9)
Kim Alvefur <zash@zash.se>
parents: 7677
diff changeset
703 break;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
704 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
705 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
706 text = condition .. (text and (" ("..text..")") or "");
11682
7843f1ca3b33 mod_s2s: Vary log level by remote stream error
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
707 session.log(stream_condition_severity[condition] or "info", "Session closed by remote with error: %s", text);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
708 session:close(nil, text);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
709 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
710 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
711
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
712 --- Session methods
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
713 local stream_xmlns_attr = {xmlns='urn:ietf:params:xml:ns:xmpp-streams'};
10632
c9de8275aaf2 mod_s2s: Comment on the various 'reason' arguments passed to :close
Kim Alvefur <zash@zash.se>
parents: 10625
diff changeset
714 -- reason: stream error to send to the remote server
c9de8275aaf2 mod_s2s: Comment on the various 'reason' arguments passed to :close
Kim Alvefur <zash@zash.se>
parents: 10625
diff changeset
715 -- remote_reason: stream error received from the remote server
10648
2bd17e043275 mod_s2s: Fix typo in comment [codespell]
Kim Alvefur <zash@zash.se>
parents: 10632
diff changeset
716 -- bounce_reason: stanza error to pass to bounce_sendq because stream- and stanza errors are different
10425
42cf93ff4618 s2s: Allow passing a custom error for bouncing queued stanzas (#770)
Kim Alvefur <zash@zash.se>
parents: 10421
diff changeset
717 local function session_close(session, reason, remote_reason, bounce_reason)
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
718 local log = session.log or log;
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
719 if not session.conn then
11670
7f6c816a2c09 mod_s2s: Log debug message on attempted close of an connectionless session
Kim Alvefur <zash@zash.se>
parents: 11669
diff changeset
720 log("debug", "Attempt to close without associated connection with reason %q", reason);
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
721 return
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
722 end
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
723
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
724 local conn = session.conn;
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
725 conn:pause_writes(); -- until :close
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
726 if session.notopen then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
727 if session.direction == "incoming" then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
728 session:open_stream(session.to_host, session.from_host);
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
729 else
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
730 session:open_stream(session.from_host, session.to_host);
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
731 end
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
732 end
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
733
11704
0a8671f32424 mod_s2s: Guard against missing 'to' on incoming stream
Kim Alvefur <zash@zash.se>
parents: 11684
diff changeset
734 local this_host = session.direction == "outgoing" and session.from_host or session.to_host
11859
14cf34d35c30 mod_s2s: Don't pass unknown hostnames as stats label
Kim Alvefur <zash@zash.se>
parents: 11775
diff changeset
735 if not hosts[this_host] then this_host = ":unknown"; end
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
736
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
737 if reason then -- nil == no err, initiated by us, false == initiated by remote
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
738 local stream_error;
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
739 local condition, text, extra
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
740 if type(reason) == "string" then -- assume stream error
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
741 condition = reason
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
742 elseif type(reason) == "table" and not st.is_stanza(reason) then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
743 condition = reason.condition or "undefined-condition"
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
744 text = reason.text
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
745 extra = reason.extra
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
746 end
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
747 if condition then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
748 stream_error = st.stanza("stream:error"):tag(condition, stream_xmlns_attr):up();
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
749 if text then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
750 stream_error:tag("text", stream_xmlns_attr):text(text):up();
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
751 end
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
752 if extra then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
753 stream_error:add_child(extra);
5533
df3c78221f26 mod_s2s: Ensure that to/from on stream headers are always correct, fixes #338
Matthew Wild <mwild1@gmail.com>
parents: 5522
diff changeset
754 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
755 end
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
756 if this_host and condition then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
757 m_closed_connections:with_labels(this_host, session.direction, condition):add(1)
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
758 end
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
759 if st.is_stanza(stream_error) then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
760 -- to and from are never unknown on outgoing connections
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
761 log("debug", "Disconnecting %s->%s[%s], <stream:error> is: %s",
11867
bb20cfd4884f mod_s2s: Fix logging of <stream:error> consistency with other mods
Kim Alvefur <zash@zash.se>
parents: 11859
diff changeset
762 session.from_host or "(unknown host)" or session.ip, session.to_host or "(unknown host)", session.type, stream_error);
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
763 session.sends2s(stream_error);
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
764 end
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
765 else
11705
7132acfd287e mod_s2s: Handle measurement where the local host is unknown
Kim Alvefur <zash@zash.se>
parents: 11704
diff changeset
766 m_closed_connections:with_labels(this_host or ":unknown", session.direction, reason == false and ":remote-choice" or ":local-choice"):add(1)
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
767 end
11526
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
768
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
769 session.sends2s("</stream:stream>");
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
770 function session.sends2s() return false; end
11526
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
771
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
772 -- luacheck: ignore 422/reason 412/reason
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
773 -- FIXME reason should be managed in a place common to c2s, s2s, bosh, component etc
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
774 local reason = remote_reason or (reason and (reason.text or reason.condition)) or reason;
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
775 session.log("info", "%s s2s stream %s->%s closed: %s", session.direction:gsub("^.", string.upper),
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
776 session.from_host or "(unknown host)", session.to_host or "(unknown host)", reason or "stream closed");
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
777
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
778 conn:resume_writes();
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
779
11678
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
780 if session.connect_timeout then
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
781 stop_timer(session.connect_timeout);
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
782 session.connect_timeout = nil;
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
783 end
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
784
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
785 -- Authenticated incoming stream may still be sending us stanzas, so wait for </stream:stream> from remote
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
786 if reason == nil and not session.notopen and session.direction == "incoming" then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
787 add_task(stream_close_timeout, function ()
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
788 if not session.destroyed then
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
789 session.log("warn", "Failed to receive a stream close response, closing connection anyway...");
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
790 s2s_destroy_session(session, reason, bounce_reason);
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
791 conn:close();
11526
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
792 end
11669
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
793 end);
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
794 else
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
795 s2s_destroy_session(session, reason, bounce_reason);
bca75f34d374 mod_s2s: Drop level of indentation by inverting a condition and early return
Kim Alvefur <zash@zash.se>
parents: 11668
diff changeset
796 conn:close(); -- Close immediately, as this is an outgoing connection or is not authed
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
797 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
798 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
799
9412
063977461363 mod_s2s: Silence all warnings instead of ignoring the entire module
Kim Alvefur <zash@zash.se>
parents: 9070
diff changeset
800 function session_stream_attrs(session, from, to, attr) -- luacheck: ignore 212/session
5533
df3c78221f26 mod_s2s: Ensure that to/from on stream headers are always correct, fixes #338
Matthew Wild <mwild1@gmail.com>
parents: 5522
diff changeset
801 if not from or (hosts[from] and hosts[from].modules.dialback) then
5351
901ed253bbf7 mod_s2s, mod_saslauth, mod_compression: Refactor to have common code for opening streams
Kim Alvefur <zash@zash.se>
parents: 5345
diff changeset
802 attr["xmlns:db"] = 'jabber:server:dialback';
901ed253bbf7 mod_s2s, mod_saslauth, mod_compression: Refactor to have common code for opening streams
Kim Alvefur <zash@zash.se>
parents: 5345
diff changeset
803 end
6602
61b6a4fc65f1 Merge 0.9->0.10
Matthew Wild <mwild1@gmail.com>
parents: 6473 6600
diff changeset
804 if not from then
61b6a4fc65f1 Merge 0.9->0.10
Matthew Wild <mwild1@gmail.com>
parents: 6473 6600
diff changeset
805 attr.from = '';
61b6a4fc65f1 Merge 0.9->0.10
Matthew Wild <mwild1@gmail.com>
parents: 6473 6600
diff changeset
806 end
61b6a4fc65f1 Merge 0.9->0.10
Matthew Wild <mwild1@gmail.com>
parents: 6473 6600
diff changeset
807 if not to then
61b6a4fc65f1 Merge 0.9->0.10
Matthew Wild <mwild1@gmail.com>
parents: 6473 6600
diff changeset
808 attr.to = '';
61b6a4fc65f1 Merge 0.9->0.10
Matthew Wild <mwild1@gmail.com>
parents: 6473 6600
diff changeset
809 end
5351
901ed253bbf7 mod_s2s, mod_saslauth, mod_compression: Refactor to have common code for opening streams
Kim Alvefur <zash@zash.se>
parents: 5345
diff changeset
810 end
901ed253bbf7 mod_s2s, mod_saslauth, mod_compression: Refactor to have common code for opening streams
Kim Alvefur <zash@zash.se>
parents: 5345
diff changeset
811
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
812 -- Session initialization logic shared by incoming and outgoing
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
813 local function initialize_session(session)
10850
bd2814f900dd mod_c2s,mod_s2s: Make stanza size limits configurable
Kim Alvefur <zash@zash.se>
parents: 10849
diff changeset
814 local stream = new_xmpp_stream(session, stream_callbacks, stanza_size_limit);
7451
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
815
13575
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
816 session.thread = runner(function (item)
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
817 if st.is_stanza(item) then
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
818 core_process_stanza(session, item);
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
819 else
750ff9f579e2 mod_c2s, mod_s2s: Support for queuing callbacks to run in session thread
Matthew Wild <mwild1@gmail.com>
parents: 13557
diff changeset
820 session_events[item.event](session, item);
7451
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
821 end
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
822 end, runner_callbacks, session);
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
823
6255
6167f8bc5a6b mod_s2s: Decide on log function once
Kim Alvefur <zash@zash.se>
parents: 6146
diff changeset
824 local log = session.log or log;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
825 session.stream = stream;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
826
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
827 session.notopen = true;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
828
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
829 function session.reset_stream()
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
830 session.notopen = true;
6362
f5f44504e18b mod_s2s: Reset stream ID when resetting stream [compliance]
Kim Alvefur <zash@zash.se>
parents: 6359
diff changeset
831 session.streamid = nil;
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
832 session.stream:reset();
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
833 end
5351
901ed253bbf7 mod_s2s, mod_saslauth, mod_compression: Refactor to have common code for opening streams
Kim Alvefur <zash@zash.se>
parents: 5345
diff changeset
834
6085
2f911644f527 mod_s2s: Replace open_stream() with function that only adds s2s/dialback attributes to stream header
Kim Alvefur <zash@zash.se>
parents: 6069
diff changeset
835 session.stream_attrs = session_stream_attrs;
6069
446148cad35e mod_s2s: Revert e626ee2fe106 change, it broke Dialback
Kim Alvefur <zash@zash.se>
parents: 6063
diff changeset
836
6256
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
837 local filter = initialize_filters(session);
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
838 local conn = session.conn;
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
839 local w = conn.write;
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
840
11773
c5f2b63cf6ff mod_s2s: Handle connections having TLS from the start
Kim Alvefur <zash@zash.se>
parents: 11772
diff changeset
841 if conn:ssl() then
12602
9184fe3d489a mod_tls: Record STARTTLS state so it can be shown in Shell
Kim Alvefur <zash@zash.se>
parents: 12494
diff changeset
842 -- Direct TLS was used
11773
c5f2b63cf6ff mod_s2s: Handle connections having TLS from the start
Kim Alvefur <zash@zash.se>
parents: 11772
diff changeset
843 session_secure(session);
c5f2b63cf6ff mod_s2s: Handle connections having TLS from the start
Kim Alvefur <zash@zash.se>
parents: 11772
diff changeset
844 end
c5f2b63cf6ff mod_s2s: Handle connections having TLS from the start
Kim Alvefur <zash@zash.se>
parents: 11772
diff changeset
845
6256
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
846 function session.sends2s(t)
9069
22e5f11c778a sessionmanager, mod_s2s: Bring debug line for outgoing stanzas in line with that for incoming
Kim Alvefur <zash@zash.se>
parents: 9068
diff changeset
847 log("debug", "Sending[%s]: %s", session.type, t.top_tag and t:top_tag() or t:match("^[^>]*>?"));
6256
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
848 if t.name then
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
849 t = filter("stanzas/out", t);
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
850 end
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
851 if t then
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
852 t = filter("bytes/out", tostring(t));
12807
f0f7b0c61465 mod_s2s: Avoid sending too large stanzas
Kim Alvefur <zash@zash.se>
parents: 12806
diff changeset
853 if session.outgoing_stanza_size_limit and #t > session.outgoing_stanza_size_limit then
f0f7b0c61465 mod_s2s: Avoid sending too large stanzas
Kim Alvefur <zash@zash.se>
parents: 12806
diff changeset
854 log("warn", "Attempt to send a stanza exceeding session limit of %dB (%dB)!", session.outgoing_stanza_size_limit, #t);
f0f7b0c61465 mod_s2s: Avoid sending too large stanzas
Kim Alvefur <zash@zash.se>
parents: 12806
diff changeset
855 -- TODO Pass identifiable error condition back to allow appropriate handling
f0f7b0c61465 mod_s2s: Avoid sending too large stanzas
Kim Alvefur <zash@zash.se>
parents: 12806
diff changeset
856 return false
f0f7b0c61465 mod_s2s: Avoid sending too large stanzas
Kim Alvefur <zash@zash.se>
parents: 12806
diff changeset
857 end
6256
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
858 if t then
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
859 return w(conn, t);
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
860 end
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
861 end
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
862 end
d05627c89c99 mod_s2s: Move filter initialization to common place
Kim Alvefur <zash@zash.se>
parents: 6255
diff changeset
863
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
864 function session.data(data)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
865 data = filter("bytes/in", data);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
866 if data then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
867 local ok, err = stream:feed(data);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
868 if ok then return; end
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9854
diff changeset
869 log("debug", "Received invalid XML (%s) %d bytes: %q", err, #data, data:sub(1, 300));
10849
19e7092e062c mod_c2s,mod_s2s: Use a distinct stream error for hitting stanza size limit
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
870 if err == "stanza-too-large" then
11770
d2a9aa1c7ac8 mod_c2s,mod_s2s: Indicate stanza size violation with condition from XEP-0205 (thanks mjk)
Kim Alvefur <zash@zash.se>
parents: 11742
diff changeset
871 session:close({
d2a9aa1c7ac8 mod_c2s,mod_s2s: Indicate stanza size violation with condition from XEP-0205 (thanks mjk)
Kim Alvefur <zash@zash.se>
parents: 11742
diff changeset
872 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: 11742
diff changeset
873 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: 11742
diff changeset
874 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: 11742
diff changeset
875 }, nil, "Received invalid XML from remote server");
10849
19e7092e062c mod_c2s,mod_s2s: Use a distinct stream error for hitting stanza size limit
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
876 else
19e7092e062c mod_c2s,mod_s2s: Use a distinct stream error for hitting stanza size limit
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
877 session:close("not-well-formed", nil, "Received invalid XML from remote server");
19e7092e062c mod_c2s,mod_s2s: Use a distinct stream error for hitting stanza size limit
Kim Alvefur <zash@zash.se>
parents: 10810
diff changeset
878 end
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
879 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
880 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
881
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
882 session.close = session_close;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
883
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
884 local handlestanza = stream_callbacks.handlestanza;
9412
063977461363 mod_s2s: Silence all warnings instead of ignoring the entire module
Kim Alvefur <zash@zash.se>
parents: 9070
diff changeset
885 function session.dispatch_stanza(session, stanza) -- luacheck: ignore 432/session
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
886 return handlestanza(session, stanza);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
887 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
888
6259
36f611624987 mod_s2s: Fire a 's2s-created' event when new s2s connections are initialized
Kim Alvefur <zash@zash.se>
parents: 6257
diff changeset
889 module:fire_event("s2s-created", { session = session });
36f611624987 mod_s2s: Fire a 's2s-created' event when new s2s connections are initialized
Kim Alvefur <zash@zash.se>
parents: 6257
diff changeset
890
11678
f90a337d81a8 mod_s2s: Remove connection timeout once it's no longer needed
Kim Alvefur <zash@zash.se>
parents: 11670
diff changeset
891 session.connect_timeout = add_task(connect_timeout, function ()
4960
8950510ddb2e mod_s2s: Make unauthed session timeout a little more aggressive... otherwise it's possible for sessions to slip under the net and never get killed off
Matthew Wild <mwild1@gmail.com>
parents: 4906
diff changeset
892 if session.type == "s2sin" or session.type == "s2sout" then
8950510ddb2e mod_s2s: Make unauthed session timeout a little more aggressive... otherwise it's possible for sessions to slip under the net and never get killed off
Matthew Wild <mwild1@gmail.com>
parents: 4906
diff changeset
893 return; -- Ok, we're connected
5307
d80e56d8805c mod_s2s: Don't try to close sessions that were destroyed before timeout
Kim Alvefur <zash@zash.se>
parents: 5281
diff changeset
894 elseif session.type == "s2s_destroyed" then
d80e56d8805c mod_s2s: Don't try to close sessions that were destroyed before timeout
Kim Alvefur <zash@zash.se>
parents: 5281
diff changeset
895 return; -- Session already destroyed
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
896 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
897 -- Not connected, need to close session and clean up
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
898 (session.log or log)("debug", "Destroying incomplete session %s->%s due to inactivity",
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
899 session.from_host or "(unknown)", session.to_host or "(unknown)");
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
900 session:close("connection-timeout");
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
901 end);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
902 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
903
7451
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
904 function runner_callbacks:ready()
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
905 self.data.log("debug", "Runner %s ready (%s)", self.thread, coroutine.status(self.thread));
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
906 self.data.conn:resume();
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
907 end
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
908
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
909 function runner_callbacks:waiting()
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
910 self.data.log("debug", "Runner %s waiting (%s)", self.thread, coroutine.status(self.thread));
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
911 self.data.conn:pause();
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
912 end
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
913
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
914 function runner_callbacks:error(err)
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
915 (self.data.log or log)("error", "Traceback[s2s]: %s", err);
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
916 end
464a8a8de625 mod_s2s: Add util.async support
Kim Alvefur <zash@zash.se>
parents: 7450
diff changeset
917
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
918 function listener.onconnect(conn)
5522
3912c9264ef0 mod_s2s: Obey tcp_keepalives option for s2s too, and make it individually configurable through s2s_tcp_keepalives (thanks yeled)
Matthew Wild <mwild1@gmail.com>
parents: 5505
diff changeset
919 conn:setoption("keepalive", opt_keepalives);
4906
89df1f03546a mod_s2s, s2sout.lib: Send stream header in onconnect()
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
920 local session = sessions[conn];
89df1f03546a mod_s2s, s2sout.lib: Send stream header in onconnect()
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
921 if not session then -- New incoming connection
89df1f03546a mod_s2s, s2sout.lib: Send stream header in onconnect()
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
922 session = s2s_new_incoming(conn);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
923 sessions[conn] = session;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
924 session.log("debug", "Incoming s2s connection");
12280
74f8739b967a mod_s2s: Add new early s2s-connected events
Kim Alvefur <zash@zash.se>
parents: 12207
diff changeset
925 module:fire_event("s2sin-connected", { session = session })
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
926 initialize_session(session);
11526
15a3db955ad3 s2s et al.: Add counters for connection state transitions
Jonas Schäfer <jonas@wielicki.name>
parents: 11525
diff changeset
927 m_accepted_tcp_connections:with_labels():add(1)
4906
89df1f03546a mod_s2s, s2sout.lib: Send stream header in onconnect()
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
928 else -- Outgoing session connected
12280
74f8739b967a mod_s2s: Add new early s2s-connected events
Kim Alvefur <zash@zash.se>
parents: 12207
diff changeset
929 module:fire_event("s2sout-connected", { session = session })
4906
89df1f03546a mod_s2s, s2sout.lib: Send stream header in onconnect()
Matthew Wild <mwild1@gmail.com>
parents: 4873
diff changeset
930 session:open_stream(session.from_host, session.to_host);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
931 end
12280
74f8739b967a mod_s2s: Add new early s2s-connected events
Kim Alvefur <zash@zash.se>
parents: 12207
diff changeset
932 module:fire_event("s2s-connected", { session = session })
5661
f226a0d23e85 mod_s2s: Set s2s_session.ip
Kim Alvefur <zash@zash.se>
parents: 5638
diff changeset
933 session.ip = conn:ip();
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
934 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
935
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
936 function listener.onincoming(conn, data)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
937 local session = sessions[conn];
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
938 if session then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
939 session.data(data);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
940 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
941 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
942
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
943 function listener.onstatus(conn, status)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
944 if status == "ssl-handshake-complete" then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
945 local session = sessions[conn];
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
946 if session and session.direction == "outgoing" then
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
947 session.log("debug", "Sending stream header...");
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
948 session:open_stream(session.from_host, session.to_host);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
949 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
950 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
951 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
952
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
953 function listener.ondisconnect(conn, err)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
954 local session = sessions[conn];
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
955 if session then
5274
0d08c0965824 mod_s2s: Remove connection from sessions table as soon as we learn it is disconnected. Fixes a connection/session leak.
Matthew Wild <mwild1@gmail.com>
parents: 5173
diff changeset
956 sessions[conn] = nil;
10120
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
957 (session.log or log)("debug", "s2s disconnected: %s->%s (%s)", session.from_host, session.to_host, err or "connection closed");
10473
b2dd1219a321 mod_s2s: Improve TLS handshake error messages
Kim Alvefur <zash@zash.se>
parents: 10472
diff changeset
958 if session.secure == false and err then
b2dd1219a321 mod_s2s: Improve TLS handshake error messages
Kim Alvefur <zash@zash.se>
parents: 10472
diff changeset
959 -- TODO util.error-ify this
b2dd1219a321 mod_s2s: Improve TLS handshake error messages
Kim Alvefur <zash@zash.se>
parents: 10472
diff changeset
960 err = "Error during negotiation of encrypted connection: "..err;
b2dd1219a321 mod_s2s: Improve TLS handshake error messages
Kim Alvefur <zash@zash.se>
parents: 10472
diff changeset
961 end
10120
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
962 s2s_destroy_session(session, err);
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
963 end
12301
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
964 module:fire_event("s2s-closed", { session = session; conn = conn });
10120
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
965 end
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
966
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
967 function listener.onfail(data, err)
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
968 local session = data and data.session;
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
969 if session then
4969
15183193c6a6 mod_s2s: Don't call ondisconnect manually, don't call conn:close() 3 times (!) and merge its logic and streamdisconnected into session_close - including now waiting for a reply </stream:stream> if there is the chance of further stanzas requiring delivery arriving. session.sends2s() on a half-closed stream returns false.
Matthew Wild <mwild1@gmail.com>
parents: 4968
diff changeset
970 if err and session.direction == "outgoing" and session.notopen then
15183193c6a6 mod_s2s: Don't call ondisconnect manually, don't call conn:close() 3 times (!) and merge its logic and streamdisconnected into session_close - including now waiting for a reply </stream:stream> if there is the chance of further stanzas requiring delivery arriving. session.sends2s() on a half-closed stream returns false.
Matthew Wild <mwild1@gmail.com>
parents: 4968
diff changeset
971 (session.log or log)("debug", "s2s connection attempt failed: %s", err);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
972 end
8483
6d47b74926dd mod_s2s: Remove tostring() in logging since this is handled by util.format now
Kim Alvefur <zash@zash.se>
parents: 8463
diff changeset
973 (session.log or log)("debug", "s2s disconnected: %s->%s (%s)", session.from_host, session.to_host, err or "connection closed");
4969
15183193c6a6 mod_s2s: Don't call ondisconnect manually, don't call conn:close() 3 times (!) and merge its logic and streamdisconnected into session_close - including now waiting for a reply </stream:stream> if there is the chance of further stanzas requiring delivery arriving. session.sends2s() on a half-closed stream returns false.
Matthew Wild <mwild1@gmail.com>
parents: 4968
diff changeset
974 s2s_destroy_session(session, err);
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
975 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
976 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
977
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: 5636
diff changeset
978 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: 5636
diff changeset
979 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: 5636
diff changeset
980 if session then
12679
7d4a95ba9b6c mod_s2s: Fix firing buffer drain events
Kim Alvefur <zash@zash.se>
parents: 12474
diff changeset
981 return (hosts[session.host] or prosody).events.fire_event("s2s-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: 5636
diff changeset
982 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: 5636
diff changeset
983 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: 5636
diff changeset
984
11740
b92f2abe0bda mod_s2s: Fire 's2s-ondrain' event, mirroring mod_c2s
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
985 function listener.ondrain(conn)
b92f2abe0bda mod_s2s: Fire 's2s-ondrain' event, mirroring mod_c2s
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
986 local session = sessions[conn];
b92f2abe0bda mod_s2s: Fire 's2s-ondrain' event, mirroring mod_c2s
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
987 if session then
b92f2abe0bda mod_s2s: Fire 's2s-ondrain' event, mirroring mod_c2s
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
988 return (hosts[session.host] or prosody).events.fire_event("s2s-ondrain", { session = session });
b92f2abe0bda mod_s2s: Fire 's2s-ondrain' event, mirroring mod_c2s
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
989 end
b92f2abe0bda mod_s2s: Fire 's2s-ondrain' event, mirroring mod_c2s
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
990 end
b92f2abe0bda mod_s2s: Fire 's2s-ondrain' event, mirroring mod_c2s
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
991
11742
9c450185bac1 mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents: 11740
diff changeset
992 function listener.onpredrain(conn)
9c450185bac1 mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents: 11740
diff changeset
993 local session = sessions[conn];
9c450185bac1 mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents: 11740
diff changeset
994 if session then
9c450185bac1 mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents: 11740
diff changeset
995 return (hosts[session.host] or prosody).events.fire_event("s2s-pre-ondrain", { session = session });
9c450185bac1 mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents: 11740
diff changeset
996 end
9c450185bac1 mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents: 11740
diff changeset
997 end
9c450185bac1 mod_c2s,mod_s2s: Fire event just before writes
Kim Alvefur <zash@zash.se>
parents: 11740
diff changeset
998
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
999 function listener.register_outgoing(conn, session)
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1000 sessions[conn] = session;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1001 initialize_session(session);
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1002 end
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1003
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: 6378
diff changeset
1004 function listener.ondetach(conn)
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: 6378
diff changeset
1005 sessions[conn] = nil;
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: 6378
diff changeset
1006 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: 6378
diff changeset
1007
10120
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
1008 function listener.onattach(conn, data)
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
1009 local session = data and data.session;
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
1010 if session then
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
1011 session.conn = conn;
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
1012 sessions[conn] = session;
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
1013 initialize_session(session);
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
1014 end
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
1015 end
756b8821007a mod_s2s: Use net.connect instead of s2sout.lib for outgoing s2s connections
Kim Alvefur <zash@zash.se>
parents: 10115
diff changeset
1016
10455
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1017 -- Complete the sentence "Your certificate " with what's wrong
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1018 local function friendly_cert_error(session) --> string
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1019 if session.cert_chain_status == "invalid" then
13804
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1020 local cert_errors = set.new();
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1021
13516
078780f262d5 mod_s2s: Fix traceback due to type confusion (Thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 13504
diff changeset
1022 if type(session.cert_chain_errors) == "table" then
13804
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1023 cert_errors:add_list(session.cert_chain_errors[1]);
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1024 elseif type(session.cert_chain_errors) == "string" then
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1025 cert_errors:add(session.cert_chain_errors);
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1026 end
12472
48121960983e mod_s2s: Recognise and report errors with CA or intermediate certs
Kim Alvefur <zash@zash.se>
parents: 12462
diff changeset
1027
13804
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1028 if cert_errors:contains("certificate has expired") then
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1029 return "has expired";
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1030 elseif cert_errors:contains("self signed certificate") or cert_errors:contains("self-signed certificate") then
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1031 return "is self-signed";
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1032 elseif cert_errors:contains("no matching DANE TLSA records") then
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1033 return "does not match any DANE TLSA records";
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1034 end
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1035
e128ed4494f3 mod_s2s: Handle single message from chain validation
Kim Alvefur <zash@zash.se>
parents: 13802
diff changeset
1036 if type(session.cert_chain_errors) == "table" then
12472
48121960983e mod_s2s: Recognise and report errors with CA or intermediate certs
Kim Alvefur <zash@zash.se>
parents: 12462
diff changeset
1037 local chain_errors = set.new(session.cert_chain_errors[2]);
48121960983e mod_s2s: Recognise and report errors with CA or intermediate certs
Kim Alvefur <zash@zash.se>
parents: 12462
diff changeset
1038 for i, e in pairs(session.cert_chain_errors) do
48121960983e mod_s2s: Recognise and report errors with CA or intermediate certs
Kim Alvefur <zash@zash.se>
parents: 12462
diff changeset
1039 if i > 2 then chain_errors:add_list(e); end
48121960983e mod_s2s: Recognise and report errors with CA or intermediate certs
Kim Alvefur <zash@zash.se>
parents: 12462
diff changeset
1040 end
48121960983e mod_s2s: Recognise and report errors with CA or intermediate certs
Kim Alvefur <zash@zash.se>
parents: 12462
diff changeset
1041 if chain_errors:contains("certificate has expired") then
48121960983e mod_s2s: Recognise and report errors with CA or intermediate certs
Kim Alvefur <zash@zash.se>
parents: 12462
diff changeset
1042 return "has an expired certificate chain";
13253
68d540df46b8 mod_s2s: Fix reporting of DANE mismatch
Kim Alvefur <zash@zash.se>
parents: 13213
diff changeset
1043 elseif chain_errors:contains("no matching DANE TLSA records") then
12473
bb85be686a01 mod_s2s: Distinguish DANE TLSA errors from generic cert chain errors
Kim Alvefur <zash@zash.se>
parents: 12472
diff changeset
1044 return "does not match any DANE TLSA records";
12472
48121960983e mod_s2s: Recognise and report errors with CA or intermediate certs
Kim Alvefur <zash@zash.se>
parents: 12462
diff changeset
1045 end
10455
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1046 end
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1047 return "is not trusted"; -- for some other reason
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1048 elseif session.cert_identity_status == "invalid" then
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1049 return "is not valid for this name";
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1050 end
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1051 -- this should normally be unreachable except if no s2s auth module was loaded
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1052 return "could not be validated";
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1053 end
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1054
5363
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
1055 function check_auth_policy(event)
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
1056 local host, session = event.host, event.session;
5368
ab31dbb3a415 mod_s2s: Fix variable usage in check_auth_policy (thanks Florob)
Matthew Wild <mwild1@gmail.com>
parents: 5365
diff changeset
1057 local must_secure = secure_auth;
ab31dbb3a415 mod_s2s: Fix variable usage in check_auth_policy (thanks Florob)
Matthew Wild <mwild1@gmail.com>
parents: 5365
diff changeset
1058
ab31dbb3a415 mod_s2s: Fix variable usage in check_auth_policy (thanks Florob)
Matthew Wild <mwild1@gmail.com>
parents: 5365
diff changeset
1059 if not must_secure and secure_domains[host] then
ab31dbb3a415 mod_s2s: Fix variable usage in check_auth_policy (thanks Florob)
Matthew Wild <mwild1@gmail.com>
parents: 5365
diff changeset
1060 must_secure = true;
ab31dbb3a415 mod_s2s: Fix variable usage in check_auth_policy (thanks Florob)
Matthew Wild <mwild1@gmail.com>
parents: 5365
diff changeset
1061 elseif must_secure and insecure_domains[host] then
ab31dbb3a415 mod_s2s: Fix variable usage in check_auth_policy (thanks Florob)
Matthew Wild <mwild1@gmail.com>
parents: 5365
diff changeset
1062 must_secure = false;
5363
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
1063 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5770
diff changeset
1064
5767
3a30ad76a86a mod_s2s: Improve policy check
Kim Alvefur <zash@zash.se>
parents: 5766
diff changeset
1065 if must_secure and (session.cert_chain_status ~= "valid" or session.cert_identity_status ~= "valid") then
10455
698ff3610e57 mod_s2s: Improve error in bounces due to cert validation problems
Kim Alvefur <zash@zash.se>
parents: 10426
diff changeset
1066 local reason = friendly_cert_error(session);
10472
676e6a1b23d4 mod_s2s: Log from session logger
Kim Alvefur <zash@zash.se>
parents: 10471
diff changeset
1067 session.log("warn", "Forbidding insecure connection to/from %s because its certificate %s", host or session.ip or "(unknown host)", reason);
10456
2ab1cbb1c6b0 mod_s2s: Send stream errors for cert problems on outgoing connections
Kim Alvefur <zash@zash.se>
parents: 10455
diff changeset
1068 -- XEP-0178 recommends closing outgoing connections without warning
2ab1cbb1c6b0 mod_s2s: Send stream errors for cert problems on outgoing connections
Kim Alvefur <zash@zash.se>
parents: 10455
diff changeset
1069 -- but does not give a rationale for this.
2ab1cbb1c6b0 mod_s2s: Send stream errors for cert problems on outgoing connections
Kim Alvefur <zash@zash.se>
parents: 10455
diff changeset
1070 -- In practice most cases are configuration mistakes or forgotten
2ab1cbb1c6b0 mod_s2s: Send stream errors for cert problems on outgoing connections
Kim Alvefur <zash@zash.se>
parents: 10455
diff changeset
1071 -- certificate renewals. We think it's better to let the other party
2ab1cbb1c6b0 mod_s2s: Send stream errors for cert problems on outgoing connections
Kim Alvefur <zash@zash.se>
parents: 10455
diff changeset
1072 -- know about the problem so that they can fix it.
13444
783706350faa mod_s2s: Comment on why we avoid hostnames in stanza bounce messages
Kim Alvefur <zash@zash.se>
parents: 13382
diff changeset
1073 --
783706350faa mod_s2s: Comment on why we avoid hostnames in stanza bounce messages
Kim Alvefur <zash@zash.se>
parents: 13382
diff changeset
1074 -- Note: Bounce message must not include name of server, as it may leak half your JID in semi-anon MUCs.
10456
2ab1cbb1c6b0 mod_s2s: Send stream errors for cert problems on outgoing connections
Kim Alvefur <zash@zash.se>
parents: 10455
diff changeset
1075 session:close({ condition = "not-authorized", text = "Your server's certificate "..reason },
2ab1cbb1c6b0 mod_s2s: Send stream errors for cert problems on outgoing connections
Kim Alvefur <zash@zash.se>
parents: 10455
diff changeset
1076 nil, "Remote server's certificate "..reason);
5363
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
1077 return false;
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
1078 end
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
1079 end
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
1080
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
1081 module:hook("s2s-check-certificate", check_auth_policy, -1);
f29c26da7ecc mod_s2s: Add controls for certificate validation via the s2s_secure_auth option. Plugins can now return false from handling s2s-check-certificate to prevent connection establishment (s2sin+s2sout)
Matthew Wild <mwild1@gmail.com>
parents: 5362
diff changeset
1082
5281
815c689f85ad prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents: 5274
diff changeset
1083 module:hook("server-stopping", function(event)
12298
cb459f8fa740 mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents: 12280
diff changeset
1084 -- Close ports
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12811
diff changeset
1085 local pm = require "prosody.core.portmanager";
12298
cb459f8fa740 mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents: 12280
diff changeset
1086 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: 12280
diff changeset
1087 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: 12280
diff changeset
1088 end
cb459f8fa740 mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents: 12280
diff changeset
1089
12299
ff36ac5c7d2b mod_s2s: Disable creation of new outgoing connections during shutdown
Kim Alvefur <zash@zash.se>
parents: 12298
diff changeset
1090 -- Stop opening new connections
ff36ac5c7d2b mod_s2s: Disable creation of new outgoing connections during shutdown
Kim Alvefur <zash@zash.se>
parents: 12298
diff changeset
1091 for host in pairs(prosody.hosts) do
ff36ac5c7d2b mod_s2s: Disable creation of new outgoing connections during shutdown
Kim Alvefur <zash@zash.se>
parents: 12298
diff changeset
1092 if prosody.hosts[host].modules.s2s then
ff36ac5c7d2b mod_s2s: Disable creation of new outgoing connections during shutdown
Kim Alvefur <zash@zash.se>
parents: 12298
diff changeset
1093 module:context(host):unhook("route/remote", route_to_new_session);
ff36ac5c7d2b mod_s2s: Disable creation of new outgoing connections during shutdown
Kim Alvefur <zash@zash.se>
parents: 12298
diff changeset
1094 end
ff36ac5c7d2b mod_s2s: Disable creation of new outgoing connections during shutdown
Kim Alvefur <zash@zash.se>
parents: 12298
diff changeset
1095 end
ff36ac5c7d2b mod_s2s: Disable creation of new outgoing connections during shutdown
Kim Alvefur <zash@zash.se>
parents: 12298
diff changeset
1096
12311
bc30e1b9ad89 mod_c2s,mod_s2s: Fix error on shutdown (Thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 12309
diff changeset
1097 local wait, done = async.waiter(1, true);
12301
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
1098 module:hook("s2s-closed", function ()
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
1099 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: 12299
diff changeset
1100 end, 1)
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
1101
12298
cb459f8fa740 mod_c2s,mod_s2s: Disable and close port listeners before closing sessions
Kim Alvefur <zash@zash.se>
parents: 12280
diff changeset
1102 -- 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: 5274
diff changeset
1103 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: 5274
diff changeset
1104 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: 5274
diff changeset
1105 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: 5274
diff changeset
1106 end
12301
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
1107
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
1108 -- 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: 12299
diff changeset
1109 if next(sessions) ~= nil then
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
1110 module:log("info", "Waiting for sessions to close");
12309
926a6c5d13e7 mod_c2s,mod_s2s: Wrap callback to improve tracebacks
Kim Alvefur <zash@zash.se>
parents: 12301
diff changeset
1111 add_task(stream_close_timeout + 1, function () done() end);
12301
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
1112 wait();
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
1113 end
4f1fe6eb1ddb mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12299
diff changeset
1114
7100
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: 6684
diff changeset
1115 end, -200);
5281
815c689f85ad prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents: 5274
diff changeset
1116
815c689f85ad prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents: 5274
diff changeset
1117
815c689f85ad prosody, mod_c2s, mod_s2s: Move closing of c2s and s2s sessions to respective plugins
Kim Alvefur <zash@zash.se>
parents: 5274
diff changeset
1118
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: 5013
diff changeset
1119 module:provides("net", {
4610
171051f9dd00 mod_c2s: Use module:add_item() to add the net-provider for portmanager
Matthew Wild <mwild1@gmail.com>
parents: 4601
diff changeset
1120 name = "s2s";
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1121 listener = listener;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1122 default_port = 5269;
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1123 encryption = "starttls";
11367
9525c4b4e5de mod_s2s: Clarify comment about unused TLS settings
Kim Alvefur <zash@zash.se>
parents: 11238
diff changeset
1124 ssl_config = {
9525c4b4e5de mod_s2s: Clarify comment about unused TLS settings
Kim Alvefur <zash@zash.se>
parents: 11238
diff changeset
1125 -- FIXME This only applies to Direct TLS, which we don't use yet.
9525c4b4e5de mod_s2s: Clarify comment about unused TLS settings
Kim Alvefur <zash@zash.se>
parents: 11238
diff changeset
1126 -- This gets applied for real in mod_tls
9852
6ea3cafb6ac3 core.certmanager: Do not ask for client certificates by default
Kim Alvefur <zash@zash.se>
parents: 9784
diff changeset
1127 verify = { "peer", "client_once", };
13703
99d2100d2918 core.certmanager: Move LuaSec verification tweaks to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 13575
diff changeset
1128 verifyext = {
99d2100d2918 core.certmanager: Move LuaSec verification tweaks to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 13575
diff changeset
1129 "lsec_continue", -- Continue past certificate verification errors
99d2100d2918 core.certmanager: Move LuaSec verification tweaks to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 13575
diff changeset
1130 "lsec_ignore_purpose", -- Validate client certificates as if they were server certificates
99d2100d2918 core.certmanager: Move LuaSec verification tweaks to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 13575
diff changeset
1131 };
9852
6ea3cafb6ac3 core.certmanager: Do not ask for client certificates by default
Kim Alvefur <zash@zash.se>
parents: 9784
diff changeset
1132 };
4620
e9dc6ae68c69 mod_c2s, mod_s2s: Add multiplex support
Matthew Wild <mwild1@gmail.com>
parents: 4610
diff changeset
1133 multiplex = {
10465
09697a673015 mod_net_multiplex: Add support for using ALPN
Kim Alvefur <zash@zash.se>
parents: 10459
diff changeset
1134 protocol = "xmpp-server";
4620
e9dc6ae68c69 mod_c2s, mod_s2s: Add multiplex support
Matthew Wild <mwild1@gmail.com>
parents: 4610
diff changeset
1135 pattern = "^<.*:stream.*%sxmlns%s*=%s*(['\"])jabber:server%1.*>";
e9dc6ae68c69 mod_c2s, mod_s2s: Add multiplex support
Matthew Wild <mwild1@gmail.com>
parents: 4610
diff changeset
1136 };
4555
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1137 });
3dce04129693 s2smanager, mod_s2s, mod_s2s/s2sout: Split connection handling out of s2smanager into mod_s2s, and further split connection logic for s2sout to a module lib, s2sout.lib.lua
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1138
11774
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1139
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1140 module:provides("net", {
11775
af9c7f3f4735 mod_s2s: Rename Direct TLS listener 's2s_direct_tls'
Kim Alvefur <zash@zash.se>
parents: 11774
diff changeset
1141 name = "s2s_direct_tls";
11774
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1142 listener = listener;
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1143 encryption = "ssl";
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1144 ssl_config = {
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1145 verify = { "peer", "client_once", };
13703
99d2100d2918 core.certmanager: Move LuaSec verification tweaks to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 13575
diff changeset
1146 verifyext = {
99d2100d2918 core.certmanager: Move LuaSec verification tweaks to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 13575
diff changeset
1147 "lsec_continue", -- Continue past certificate verification errors
99d2100d2918 core.certmanager: Move LuaSec verification tweaks to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 13575
diff changeset
1148 "lsec_ignore_purpose", -- Validate client certificates as if they were server certificates
99d2100d2918 core.certmanager: Move LuaSec verification tweaks to mod_s2s
Kim Alvefur <zash@zash.se>
parents: 13575
diff changeset
1149 };
11774
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1150 };
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1151 multiplex = {
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1152 protocol = "xmpp-server";
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1153 pattern = "^<.*:stream.*%sxmlns%s*=%s*(['\"])jabber:server%1.*>";
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1154 };
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1155 });
4625093b0768 mod_s2s: Add a Direct TLS listener
Kim Alvefur <zash@zash.se>
parents: 11773
diff changeset
1156