Annotate

core/s2smanager.lua @ 2377:78c5cb163ea9

s2smanager: Mark stream as opened sooner, this prevents a duplicated stream header on host-unknown errors (thanks darkrain and his mail server)
author Matthew Wild <mwild1@gmail.com>
date Thu, 17 Dec 2009 21:17:47 +0000
parent 2376:c5faafa89f50
child 2378:bc1ae371ad54
child 2379:66ba153d3f09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1492
diff changeset
1 -- Prosody IM
760
90ce865eebd8 Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
2 -- Copyright (C) 2008-2009 Matthew Wild
90ce865eebd8 Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
3 -- Copyright (C) 2008-2009 Waqas Hussain
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 451
diff changeset
4 --
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
6 -- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 451
diff changeset
7 --
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 451
diff changeset
8
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 451
diff changeset
9
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local hosts = hosts;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local sessions = sessions;
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
13 local core_process_stanza = function(a, b) core_process_stanza(a, b); end
1204
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
14 local add_task = require "util.timer".add_task;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local socket = require "socket";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local format = string.format;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
17 local t_insert, t_sort = table.insert, table.sort;
255
43a9683bcd19 Fix for detecting when we are routing a stanza to ourself (I'm sure this has something to do with you, waqas...)
Matthew Wild <mwild1@gmail.com>
parents: 254
diff changeset
18 local get_traceback = debug.traceback;
976
17af9851c81d core.s2smanager: Remove some debugging
Matthew Wild <mwild1@gmail.com>
parents: 974
diff changeset
19 local tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber
17af9851c81d core.s2smanager: Remove some debugging
Matthew Wild <mwild1@gmail.com>
parents: 974
diff changeset
20 = tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
22 local idna_to_ascii = require "util.encodings".idna.to_ascii;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 local connlisteners_get = require "net.connlisteners".get;
739
1def06cd9311 Port to new server.lua, quite some changes, but I believe everything to be working
Matthew Wild <mwild1@gmail.com>
parents: 631
diff changeset
24 local wrapclient = require "net.server".wrapclient;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 local modulemanager = require "core.modulemanager";
244
0e3bda34f958 Missed importing a function in last commit
Matthew Wild <mwild1@gmail.com>
parents: 243
diff changeset
26 local st = require "stanza";
0e3bda34f958 Missed importing a function in last commit
Matthew Wild <mwild1@gmail.com>
parents: 243
diff changeset
27 local stanza = st.stanza;
931
4514ed5ee943 Fixed: s2smanager: Apply nameprep on hostnames passed in stream tag (part of issue #57)
Waqas Hussain <waqas20@gmail.com>
parents: 896
diff changeset
28 local nameprep = require "util.encodings".stringprep.nameprep;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29
1889
e875833ae08e s2smanager: Send stream:features for incoming s2s connections which support XMPP 1.0
Matthew Wild <mwild1@gmail.com>
parents: 1888
diff changeset
30 local fire_event = require "core.eventmanager".fire_event;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 local uuid_gen = require "util.uuid".generate;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 local logger_init = require "util.logger".init;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 local log = logger_init("s2smanager");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36
448
2623519b25b0 Switched from md5 to sha256 for dialback key generation
Waqas Hussain <waqas20@gmail.com>
parents: 435
diff changeset
37 local sha256_hash = require "util.hashes".sha256;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
1793
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
39 local adns, dns = require "net.adns", require "net.dns";
1962
3e7231c6d6a9 s2smanager: Fix access of 'config' global without requiring configmanager
Matthew Wild <mwild1@gmail.com>
parents: 1936
diff changeset
40 local config = require "core.configmanager";
1796
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
41 local connect_timeout = config.get("*", "core", "s2s_timeout") or 60;
1204
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
42 local dns_timeout = config.get("*", "core", "dns_timeout") or 60;
1805
7e41ad68fe3c core.s2smanager: Don't recurse CNAMEs infinitely :)
Matthew Wild <mwild1@gmail.com>
parents: 1796
diff changeset
43 local max_dns_depth = config.get("*", "core", "dns_max_depth") or 3;
2231
288832cdec52 s2smanager: Allow configuration of the dialback_secret in the config
Matthew Wild <mwild1@gmail.com>
parents: 2166
diff changeset
44 local dialback_secret = config.get("*", "core", "dialback_secret") or uuid_gen();
1204
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
45
621
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
46 incoming_s2s = {};
1976
5f3eaab987c3 s2smanager: Add incoming_s2s to the prosody object
Matthew Wild <mwild1@gmail.com>
parents: 1962
diff changeset
47 _G.prosody.incoming_s2s = incoming_s2s;
621
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
48 local incoming_s2s = incoming_s2s;
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
49
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 module "s2smanager"
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
52 local function compare_srv_priorities(a,b) return a.priority < b.priority or a.weight < b.weight; end
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
53
2368
4726cd9a6318 s2smanager: Have both destroy_session and bounce_sendq accept a reason string to include in bounced stanzas
Matthew Wild <mwild1@gmail.com>
parents: 2231
diff changeset
54 local function bounce_sendq(session, reason)
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
55 local sendq = session.sendq;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
56 if sendq then
1075
831c84cbf5fa s2smanager: Miscellaneous logging improvements, changing levels, improving messages and using session loggers where possible
Matthew Wild <mwild1@gmail.com>
parents: 1007
diff changeset
57 session.log("info", "sending error replies for "..#sendq.." queued stanzas because of failed outgoing connection to "..tostring(session.to_host));
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
58 local dummy = {
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
59 type = "s2sin";
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
60 send = function(s)
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
61 (session.log or log)("error", "Replying to to an s2s error reply, please report this! Traceback: %s", get_traceback());
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
62 end;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
63 dummy = true;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
64 };
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
65 for i, data in ipairs(sendq) do
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
66 local reply = data[2];
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
67 local xmlns = reply.attr.xmlns;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
68 if not xmlns or xmlns == "jabber:client" or xmlns == "jabber:server" then
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
69 reply.attr.type = "error";
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
70 reply:tag("error", {type = "cancel"})
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
71 :tag("remote-server-not-found", {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"}):up();
2368
4726cd9a6318 s2smanager: Have both destroy_session and bounce_sendq accept a reason string to include in bounced stanzas
Matthew Wild <mwild1@gmail.com>
parents: 2231
diff changeset
72 if reason then
4726cd9a6318 s2smanager: Have both destroy_session and bounce_sendq accept a reason string to include in bounced stanzas
Matthew Wild <mwild1@gmail.com>
parents: 2231
diff changeset
73 reply:tag("text", {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"}):text("Connection failed: "..reason):up();
4726cd9a6318 s2smanager: Have both destroy_session and bounce_sendq accept a reason string to include in bounced stanzas
Matthew Wild <mwild1@gmail.com>
parents: 2231
diff changeset
74 end
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
75 core_process_stanza(dummy, reply);
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
76 end
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
77 sendq[i] = nil;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
78 end
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
79 session.sendq = nil;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
80 end
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
81 end
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
82
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 function send_to_host(from_host, to_host, data)
2165
529af807ba1a s2smanager: Log warning when trying to send a stanza from a host we don't serve, instead of a traceback (thanks stpeter)
Matthew Wild <mwild1@gmail.com>
parents: 2090
diff changeset
84 if not hosts[from_host] then
529af807ba1a s2smanager: Log warning when trying to send a stanza from a host we don't serve, instead of a traceback (thanks stpeter)
Matthew Wild <mwild1@gmail.com>
parents: 2090
diff changeset
85 log("warn", "Attempt to send stanza from %s - a host we don't serve", from_host);
529af807ba1a s2smanager: Log warning when trying to send a stanza from a host we don't serve, instead of a traceback (thanks stpeter)
Matthew Wild <mwild1@gmail.com>
parents: 2090
diff changeset
86 return false;
529af807ba1a s2smanager: Log warning when trying to send a stanza from a host we don't serve, instead of a traceback (thanks stpeter)
Matthew Wild <mwild1@gmail.com>
parents: 2090
diff changeset
87 end
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
88 local host = hosts[from_host].s2sout[to_host];
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
89 if host then
241
021ccf988f3b Some s2s fixes. Now connect() does not block, and stanzas are not lost when connection is slow
Matthew Wild <mwild1@gmail.com>
parents: 233
diff changeset
90 -- We have a connection to this host already
2089
fdd7280c4621 s2smanager: Queue db:verify unless we already sent a db:result (if we had then it can could a dialback deadlock). Also remove some redundant code which could cause a db:result to be sent while still negotiating features (e.g. TLS) and break things. Collectively these fix a 'random' s2s failure (usually with ejabberd for some reason) - resulting in an 'unbound prefix' XML error, or 'ssl handshake failure'. Was this commit message long enough? I think so.
Matthew Wild <mwild1@gmail.com>
parents: 2019
diff changeset
91 if host.type == "s2sout_unauthed" and (data.name ~= "db:verify" or not host.dialback_key) and ((not data.xmlns) or data.xmlns == "jabber:client" or data.xmlns == "jabber:server") then
558
ab3960421356 Fix for s2s with jabberd2 (we weren't routing db:verify's over s2sout_unauthed)
Matthew Wild <mwild1@gmail.com>
parents: 544
diff changeset
92 (host.log or log)("debug", "trying to send over unauthed s2sout to "..to_host);
241
021ccf988f3b Some s2s fixes. Now connect() does not block, and stanzas are not lost when connection is slow
Matthew Wild <mwild1@gmail.com>
parents: 233
diff changeset
93
021ccf988f3b Some s2s fixes. Now connect() does not block, and stanzas are not lost when connection is slow
Matthew Wild <mwild1@gmail.com>
parents: 233
diff changeset
94 -- Queue stanza until we are able to send it
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
95 if host.sendq then t_insert(host.sendq, {tostring(data), st.reply(data)});
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
96 else host.sendq = { {tostring(data), st.reply(data)} }; end
559
fa4a51fe6442 Remove an incorrect line which I didn't add, and fix the proper way. Corrects the sending of stanzas over unauthed s2sout's. Also fixes mod_dialback to send stanzas and not strings.
Matthew Wild <mwild1@gmail.com>
parents: 558
diff changeset
97 host.log("debug", "stanza [%s] queued ", data.name);
255
43a9683bcd19 Fix for detecting when we are routing a stanza to ourself (I'm sure this has something to do with you, waqas...)
Matthew Wild <mwild1@gmail.com>
parents: 254
diff changeset
98 elseif host.type == "local" or host.type == "component" then
43a9683bcd19 Fix for detecting when we are routing a stanza to ourself (I'm sure this has something to do with you, waqas...)
Matthew Wild <mwild1@gmail.com>
parents: 254
diff changeset
99 log("error", "Trying to send a stanza to ourselves??")
256
c14ddd0912a2 Print out the stanza also
Matthew Wild <mwild1@gmail.com>
parents: 255
diff changeset
100 log("error", "Traceback: %s", get_traceback());
258
a93ccd84db83 Yep, s2s definitely works now. This is just a small fix for logging...
Matthew Wild <mwild1@gmail.com>
parents: 257
diff changeset
101 log("error", "Stanza: %s", tostring(data));
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
102 else
253
f2869ded1d37 Another small fix, for logging in s2smanager
Matthew Wild <mwild1@gmail.com>
parents: 252
diff changeset
103 (host.log or log)("debug", "going to send stanza to "..to_host.." from "..from_host);
225
bbbd169b326b Just committing this warning, because I want to know if the problem really affects us
Matthew Wild <mwild1@gmail.com>
parents: 199
diff changeset
104 -- FIXME
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
105 if host.from_host ~= from_host then
254
6eb3dea1d68b Another small fix, for logging in s2smanager
Matthew Wild <mwild1@gmail.com>
parents: 253
diff changeset
106 log("error", "WARNING! This might, possibly, be a bug, but it might not...");
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
107 log("error", "We are going to send from %s instead of %s", tostring(host.from_host), tostring(from_host));
254
6eb3dea1d68b Another small fix, for logging in s2smanager
Matthew Wild <mwild1@gmail.com>
parents: 253
diff changeset
108 end
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
109 host.sends2s(data);
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
110 host.log("debug", "stanza sent over "..host.type);
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
111 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 log("debug", "opening a new outgoing connection for this stanza");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 local host_session = new_outgoing(from_host, to_host);
2090
7810648ea26d s2smanager: Fail outgoing s2s connection if hostname does not pass idna_to_ascii(), thanks Flo + waqas
Matthew Wild <mwild1@gmail.com>
parents: 2089
diff changeset
115
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 -- Store in buffer
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
117 host_session.sendq = { {tostring(data), st.reply(data)} };
1006
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
118 log("debug", "stanza [%s] queued until connection complete", tostring(data.name));
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
119 if (not host_session.connecting) and (not host_session.conn) then
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
120 log("warn", "Connection to %s failed already, destroying session...", to_host);
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
121 destroy_session(host_session);
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
122 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 local open_sessions = 0;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 function new_incoming(conn)
621
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
129 local session = { conn = conn, type = "s2sin_unauthed", direction = "incoming", hosts = {} };
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 if true then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 session.trace = newproxy(true);
583
5821eaa80baa Remove print()s from sessionmanager and s2smanager
Matthew Wild <mwild1@gmail.com>
parents: 559
diff changeset
132 getmetatable(session.trace).__gc = function () open_sessions = open_sessions - 1; end;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 open_sessions = open_sessions + 1;
343
cae2178b5623 Log sent s2s stanzas
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
135 local w, log = conn.write, logger_init("s2sin"..tostring(conn):match("[a-f0-9]+$"));
1686
232c2bf155c7 core.s2smanager, xmppserver_listener: Move the responsibility of setting session.log from the latter to the former for incoming sessions (outgoing are already like this)
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
136 session.log = log;
2134
9044e7cfefc2 s2smanager: Fix syntax error introduced in merge
Matthew Wild <mwild1@gmail.com>
parents: 2133
diff changeset
137 session.sends2s = function (t) log("debug", "sending: %s", t.top_tag and t:top_tag() or t:match("^([^>]*>?)")); w(conn, tostring(t)); end
621
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
138 incoming_s2s[session] = true;
1796
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
139 add_task(connect_timeout, function ()
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
140 if session.conn ~= conn or
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
141 session.type == "s2sin" then
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
142 return; -- Ok, we're connect[ed|ing]
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
143 end
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
144 -- Not connected, need to close session and clean up
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
145 (session.log or log)("warn", "Destroying incomplete session %s->%s due to inactivity",
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
146 session.from_host or "(unknown)", session.to_host or "(unknown)");
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
147 session:close("connection-timeout");
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
148 end);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 return session;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 function new_outgoing(from_host, to_host)
1888
562635baad36 s2smanager: Give outgoing sessions a host field (the local one)
Matthew Wild <mwild1@gmail.com>
parents: 1836
diff changeset
153 local host_session = { to_host = to_host, from_host = from_host, host = from_host,
562635baad36 s2smanager: Give outgoing sessions a host field (the local one)
Matthew Wild <mwild1@gmail.com>
parents: 1836
diff changeset
154 notopen = true, type = "s2sout_unauthed", direction = "outgoing" };
562635baad36 s2smanager: Give outgoing sessions a host field (the local one)
Matthew Wild <mwild1@gmail.com>
parents: 1836
diff changeset
155
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
156 hosts[from_host].s2sout[to_host] = host_session;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
158 local log;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
159 do
543
cf6e19ea1cbc Fix logger ids for c2s and s2sout
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
160 local conn_name = "s2sout"..tostring(host_session):match("[a-f0-9]*$");
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
161 log = logger_init(conn_name);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
162 host_session.log = log;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
163 end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
164
2090
7810648ea26d s2smanager: Fail outgoing s2s connection if hostname does not pass idna_to_ascii(), thanks Flo + waqas
Matthew Wild <mwild1@gmail.com>
parents: 2089
diff changeset
165 -- Kick the connection attempting machine
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
166 attempt_connection(host_session);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
167
1007
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
168 if not host_session.sends2s then
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
169 -- A sends2s which buffers data (until the stream is opened)
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
170 -- note that data in this buffer will be sent before the stream is authed
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
171 -- and will not be ack'd in any way, successful or otherwise
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
172 local buffer;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
173 function host_session.sends2s(data)
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
174 if not buffer then
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
175 buffer = {};
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
176 host_session.send_buffer = buffer;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
177 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
178 log("debug", "Buffering data on unconnected s2sout to %s", to_host);
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
179 buffer[#buffer+1] = data;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
180 log("debug", "Buffered item %d: %s", #buffer, tostring(data));
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
181 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
182
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
183 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
184
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
185 return host_session;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
186 end
353
e7d776b5ebb9 Remove an old FIXME comment
Matthew Wild <mwild1@gmail.com>
parents: 351
diff changeset
187
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
188
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
189 function attempt_connection(host_session, err)
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
190 local from_host, to_host = host_session.from_host, host_session.to_host;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
191 local connect_host, connect_port = idna_to_ascii(to_host), 5269;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
192
2090
7810648ea26d s2smanager: Fail outgoing s2s connection if hostname does not pass idna_to_ascii(), thanks Flo + waqas
Matthew Wild <mwild1@gmail.com>
parents: 2089
diff changeset
193 if not connect_host then
7810648ea26d s2smanager: Fail outgoing s2s connection if hostname does not pass idna_to_ascii(), thanks Flo + waqas
Matthew Wild <mwild1@gmail.com>
parents: 2089
diff changeset
194 return false;
7810648ea26d s2smanager: Fail outgoing s2s connection if hostname does not pass idna_to_ascii(), thanks Flo + waqas
Matthew Wild <mwild1@gmail.com>
parents: 2089
diff changeset
195 end
7810648ea26d s2smanager: Fail outgoing s2s connection if hostname does not pass idna_to_ascii(), thanks Flo + waqas
Matthew Wild <mwild1@gmail.com>
parents: 2089
diff changeset
196
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
197 if not err then -- This is our first attempt
1006
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
198 log("debug", "First attempt to connect to %s, starting with SRV lookup...", to_host);
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
199 host_session.connecting = true;
1791
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
200 local handle;
1204
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
201 handle = adns.lookup(function (answer)
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
202 handle = nil;
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
203 host_session.connecting = nil;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
204 if answer then
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
205 log("debug", to_host.." has SRV records, handling...");
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
206 local srv_hosts = {};
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
207 host_session.srv_hosts = srv_hosts;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
208 for _, record in ipairs(answer) do
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
209 t_insert(srv_hosts, record.srv);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
210 end
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
211 t_sort(srv_hosts, compare_srv_priorities);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
212
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
213 local srv_choice = srv_hosts[1];
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
214 host_session.srv_choice = 1;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
215 if srv_choice then
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
216 connect_host, connect_port = srv_choice.target or to_host, srv_choice.port or connect_port;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
217 log("debug", "Best record found, will connect to %s:%d", connect_host, connect_port);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
218 end
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
219 else
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
220 log("debug", to_host.." has no SRV records, falling back to A");
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
221 end
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
222 -- Try with SRV, or just the plain hostname if no SRV
1492
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
223 local ok, err = try_connect(host_session, connect_host, connect_port);
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
224 if not ok then
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
225 if not attempt_connection(host_session, err) then
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
226 -- No more attempts will be made
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
227 destroy_session(host_session);
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
228 end
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
229 end
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
230 end, "_xmpp-server._tcp."..connect_host..".", "SRV");
1204
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
231
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
232 -- Set handler for DNS timeout
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
233 add_task(dns_timeout, function ()
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
234 if handle then
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
235 adns.cancel(handle, true);
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
236 end
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
237 end);
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
238
1006
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
239 log("debug", "DNS lookup for %s sent, waiting for response before we can connect", to_host);
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
240 return true; -- Attempt in progress
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
241 elseif host_session.srv_hosts and #host_session.srv_hosts > host_session.srv_choice then -- Not our first attempt, and we also have SRV
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
242 host_session.srv_choice = host_session.srv_choice + 1;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
243 local srv_choice = host_session.srv_hosts[host_session.srv_choice];
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
244 connect_host, connect_port = srv_choice.target or to_host, srv_choice.port or connect_port;
1075
831c84cbf5fa s2smanager: Miscellaneous logging improvements, changing levels, improving messages and using session loggers where possible
Matthew Wild <mwild1@gmail.com>
parents: 1007
diff changeset
245 host_session.log("info", "Connection failed (%s). Attempt #%d: This time to %s:%d", tostring(err), host_session.srv_choice, connect_host, connect_port);
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
246 else
1075
831c84cbf5fa s2smanager: Miscellaneous logging improvements, changing levels, improving messages and using session loggers where possible
Matthew Wild <mwild1@gmail.com>
parents: 1007
diff changeset
247 host_session.log("info", "Out of connection options, can't connect to %s", tostring(host_session.to_host));
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
248 -- We're out of options
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
249 return false;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
250 end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
251
960
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
252 if not (connect_host and connect_port) then
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
253 -- Likely we couldn't resolve DNS
1006
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
254 log("warn", "Hmm, we're without a host (%s) and port (%s) to connect to for %s, giving up :(", tostring(connect_host), tostring(connect_port), tostring(to_host));
960
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
255 return false;
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
256 end
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
257
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
258 return try_connect(host_session, connect_host, connect_port);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
259 end
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
260
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
261 function try_connect(host_session, connect_host, connect_port)
1791
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
262 host_session.connecting = true;
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
263 local handle;
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
264 handle = adns.lookup(function (reply)
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
265 handle = nil;
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
266 host_session.connecting = nil;
1793
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
267
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
268 -- COMPAT: This is a compromise for all you CNAME-(ab)users :)
1828
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
269 if not (reply and reply[#reply] and reply[#reply].a) then
1805
7e41ad68fe3c core.s2smanager: Don't recurse CNAMEs infinitely :)
Matthew Wild <mwild1@gmail.com>
parents: 1796
diff changeset
270 local count = max_dns_depth;
1793
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
271 reply = dns.peek(connect_host, "CNAME", "IN");
1828
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
272 while count > 0 and reply and reply[#reply] and not reply[#reply].a and reply[#reply].cname do
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
273 log("debug", "Looking up %s (DNS depth is %d)", tostring(reply[#reply].cname), count);
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
274 reply = dns.peek(reply[#reply].cname, "A", "IN") or dns.peek(reply[#reply].cname, "CNAME", "IN");
1805
7e41ad68fe3c core.s2smanager: Don't recurse CNAMEs infinitely :)
Matthew Wild <mwild1@gmail.com>
parents: 1796
diff changeset
275 count = count - 1;
1793
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
276 end
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
277 end
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
278 -- end of CNAME resolving
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
279
1828
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
280 if reply and reply[#reply] and reply[#reply].a then
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
281 log("debug", "DNS reply for %s gives us %s", connect_host, reply[#reply].a);
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
282 return make_connect(host_session, reply[#reply].a, connect_port);
1791
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
283 else
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
284 log("debug", "DNS lookup failed to get a response for %s", connect_host);
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
285 if not attempt_connection(host_session, "name resolution failed") then -- Retry if we can
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
286 log("debug", "No other records to try for %s - destroying", host_session.to_host);
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
287 destroy_session(host_session); -- End of the line, we can't
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
288 end
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
289 end
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
290 end, connect_host, "A", "IN");
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
291
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
292 -- Set handler for DNS timeout
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
293 add_task(dns_timeout, function ()
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
294 if handle then
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
295 adns.cancel(handle, true);
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
296 end
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
297 end);
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
298
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
299 return true;
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
300 end
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
301
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
302 function make_connect(host_session, connect_host, connect_port)
1075
831c84cbf5fa s2smanager: Miscellaneous logging improvements, changing levels, improving messages and using session loggers where possible
Matthew Wild <mwild1@gmail.com>
parents: 1007
diff changeset
303 host_session.log("info", "Beginning new connection attempt to %s (%s:%d)", host_session.to_host, connect_host, connect_port);
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
304 -- Ok, we're going to try to connect
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
305
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
306 local from_host, to_host = host_session.from_host, host_session.to_host;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
307
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
308 local conn, handler = socket.tcp()
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
309
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
310 conn:settimeout(0);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
311 local success, err = conn:connect(connect_host, connect_port);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
312 if not success and err ~= "timeout" then
1468
83b297a412a2 s2smanager: Log the hostname and address when s2s connection fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1450
diff changeset
313 log("warn", "s2s connect() to %s (%s:%d) failed: %s", host_session.to_host, connect_host, connect_port, err);
1492
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
314 return false, err;
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
315 end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
316
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
317 local cl = connlisteners_get("xmppserver");
739
1def06cd9311 Port to new server.lua, quite some changes, but I believe everything to be working
Matthew Wild <mwild1@gmail.com>
parents: 631
diff changeset
318 conn = wrapclient(conn, connect_host, connect_port, cl, cl.default_mode or 1, hosts[from_host].ssl_ctx, false );
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
319 host_session.conn = conn;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
320
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
321 -- Register this outgoing connection so that xmppserver_listener knows about it
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
322 -- otherwise it will assume it is a new incoming connection
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
323 cl.register_outgoing(conn, host_session);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
324
2019
c712ea57b877 s2smanager: Use session-specific logger to log outgoing data on outgoing s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1976
diff changeset
325 local w, log = conn.write, host_session.log;
2133
5c1758ccf8b9 Merge with trunk
Matthew Wild <mwild1@gmail.com>
parents: 2127 2101
diff changeset
326 host_session.sends2s = function (t) log("debug", "sending: %s", (t.top_tag and t:top_tag()) or t:match("^[^>]*>?")); w(conn, tostring(t)); end
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
327
2127
be3c906f4770 s2smanager: Update for new net.server API (s2s still doesn't work with libevent for other reasons)
Matthew Wild <mwild1@gmail.com>
parents: 2090
diff changeset
328 conn:write(format([[<stream:stream xmlns='jabber:server' xmlns:db='jabber:server:dialback' xmlns:stream='http://etherx.jabber.org/streams' from='%s' to='%s' version='1.0' xml:lang='en'>]], from_host, to_host));
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
329 log("debug", "Connection attempt in progress...");
1796
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
330 add_task(connect_timeout, function ()
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
331 if host_session.conn ~= conn or
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
332 host_session.type == "s2sout" or
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
333 host_session.connecting then
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
334 return; -- Ok, we're connect[ed|ing]
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
335 end
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
336 -- Not connected, need to close session and clean up
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
337 (host_session.log or log)("warn", "Destroying incomplete session %s->%s due to inactivity",
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
338 host_session.from_host or "(unknown)", host_session.to_host or "(unknown)");
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
339 host_session:close("connection-timeout");
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
340 end);
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
341 return true;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 function streamopened(session, attr)
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
345 local send = session.sends2s;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346
544
efde848869c5 Don't send stream:features to incoming s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 543
diff changeset
347 -- TODO: #29: SASL/TLS on s2s streams
1894
53f34ba6f6d6 Minor changes; outgoing TLS works.
Paul Aurich <paul@darkrain42.org>
parents: 1891
diff changeset
348 session.version = tonumber(attr.version) or 0;
544
efde848869c5 Don't send stream:features to incoming s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 543
diff changeset
349
1909
84027581c995 s2smanager: Mark session as secure if it was negotiating TLS and opens a new stream
Matthew Wild <mwild1@gmail.com>
parents: 1895
diff changeset
350 if session.secure == false then
84027581c995 s2smanager: Mark session as secure if it was negotiating TLS and opens a new stream
Matthew Wild <mwild1@gmail.com>
parents: 1895
diff changeset
351 session.secure = true;
84027581c995 s2smanager: Mark session as secure if it was negotiating TLS and opens a new stream
Matthew Wild <mwild1@gmail.com>
parents: 1895
diff changeset
352 end
84027581c995 s2smanager: Mark session as secure if it was negotiating TLS and opens a new stream
Matthew Wild <mwild1@gmail.com>
parents: 1895
diff changeset
353
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
354 if session.version >= 1.0 and not (attr.to and attr.from) then
1928
d11f07ca0b75 s2smanager: Improve log message on missing to/from in stream header
Matthew Wild <mwild1@gmail.com>
parents: 1909
diff changeset
355 (session.log or log)("warn", "Remote of stream "..(session.from_host or "(unknown)").."->"..(session.to_host or "(unknown)")
d11f07ca0b75 s2smanager: Improve log message on missing to/from in stream header
Matthew Wild <mwild1@gmail.com>
parents: 1909
diff changeset
356 .." failed to specify to (%s) and/or from (%s) hostname as per RFC", tostring(attr.to), tostring(attr.from));
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359 if session.direction == "incoming" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 -- Send a reply stream header
938
663f75dd7b42 Fixed: Some nil access bugs
Waqas Hussain <waqas20@gmail.com>
parents: 931
diff changeset
361 session.to_host = attr.to and nameprep(attr.to);
663f75dd7b42 Fixed: Some nil access bugs
Waqas Hussain <waqas20@gmail.com>
parents: 931
diff changeset
362 session.from_host = attr.from and nameprep(attr.from);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 session.streamid = uuid_gen();
360
e918c979ad1a Remove or comment useless prints, or change them to log()
Matthew Wild <mwild1@gmail.com>
parents: 354
diff changeset
365 (session.log or log)("debug", "incoming s2s received <stream:stream>");
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 send("<?xml version='1.0'?>");
852
3c2d99ba1dc2 core.s2smanager: Remove some old commented code, break a long line in 2
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
367 send(stanza("stream:stream", { xmlns='jabber:server', ["xmlns:db"]='jabber:server:dialback',
1930
92b78dd346ca s2smanager: Don't send version=1.0 in reply to incoming stream tag if they didn't advertise 1.0 (makes happy some old ejabberd versions)
Matthew Wild <mwild1@gmail.com>
parents: 1928
diff changeset
368 ["xmlns:stream"]='http://etherx.jabber.org/streams', id=session.streamid, from=session.to_host, version=(session.version > 0 and "1.0" or nil) }):top_tag());
2377
78c5cb163ea9 s2smanager: Mark stream as opened sooner, this prevents a duplicated stream header on host-unknown errors (thanks darkrain and his mail server)
Matthew Wild <mwild1@gmail.com>
parents: 2376
diff changeset
369 session.notopen = nil;
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
370 if session.to_host and not hosts[session.to_host] then
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
371 -- Attempting to connect to a host we don't serve
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
372 session:close({ condition = "host-unknown"; text = "This host does not serve "..session.to_host });
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
373 return;
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
374 end
345
6a7acfc1c933 Send version=1.0 in s2s stream header. Send s2s stream:features when in 1.0 mode.
Matthew Wild <mwild1@gmail.com>
parents: 344
diff changeset
375 if session.version >= 1.0 then
1889
e875833ae08e s2smanager: Send stream:features for incoming s2s connections which support XMPP 1.0
Matthew Wild <mwild1@gmail.com>
parents: 1888
diff changeset
376 local features = st.stanza("stream:features");
1936
a6ca0dcc7b83 s2smanager: Make s2s-stream-features a per-host event
Matthew Wild <mwild1@gmail.com>
parents: 1930
diff changeset
377
a6ca0dcc7b83 s2smanager: Make s2s-stream-features a per-host event
Matthew Wild <mwild1@gmail.com>
parents: 1930
diff changeset
378 if session.to_host then
a6ca0dcc7b83 s2smanager: Make s2s-stream-features a per-host event
Matthew Wild <mwild1@gmail.com>
parents: 1930
diff changeset
379 hosts[session.to_host].events.fire_event("s2s-stream-features", { session = session, features = features });
a6ca0dcc7b83 s2smanager: Make s2s-stream-features a per-host event
Matthew Wild <mwild1@gmail.com>
parents: 1930
diff changeset
380 else
a6ca0dcc7b83 s2smanager: Make s2s-stream-features a per-host event
Matthew Wild <mwild1@gmail.com>
parents: 1930
diff changeset
381 (session.log or log)("warn", "No 'to' on stream header from %s means we can't offer any features", session.from_host or "unknown host");
a6ca0dcc7b83 s2smanager: Make s2s-stream-features a per-host event
Matthew Wild <mwild1@gmail.com>
parents: 1930
diff changeset
382 end
1889
e875833ae08e s2smanager: Send stream:features for incoming s2s connections which support XMPP 1.0
Matthew Wild <mwild1@gmail.com>
parents: 1888
diff changeset
383
e875833ae08e s2smanager: Send stream:features for incoming s2s connections which support XMPP 1.0
Matthew Wild <mwild1@gmail.com>
parents: 1888
diff changeset
384 log("debug", "Sending stream features: %s", tostring(features));
e875833ae08e s2smanager: Send stream:features for incoming s2s connections which support XMPP 1.0
Matthew Wild <mwild1@gmail.com>
parents: 1888
diff changeset
385 send(features);
345
6a7acfc1c933 Send version=1.0 in s2s stream header. Send s2s stream:features when in 1.0 mode.
Matthew Wild <mwild1@gmail.com>
parents: 344
diff changeset
386 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 elseif session.direction == "outgoing" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388 -- If we are just using the connection for verifying dialback keys, we won't try and auth it
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
389 if not attr.id then error("stream response did not give us a streamid!!!"); end
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
390 session.streamid = attr.id;
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
391
1007
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
392 -- Send unauthed buffer
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
393 -- (stanzas which are fine to send before dialback)
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
394 -- Note that this is *not* the stanza queue (which
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
395 -- we can only send if auth succeeds) :)
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
396 local send_buffer = session.send_buffer;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
397 if send_buffer and #send_buffer > 0 then
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
398 log("debug", "Sending s2s send_buffer now...");
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
399 for i, data in ipairs(send_buffer) do
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
400 session.sends2s(tostring(data));
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
401 send_buffer[i] = nil;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
402 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
403 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
404 session.send_buffer = nil;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1006
diff changeset
405
1890
aed0d8a0cca8 s2smanager: Don't wait for stream:features from non-XMPP-1.0 hosts
Matthew Wild <mwild1@gmail.com>
parents: 1889
diff changeset
406 -- If server is pre-1.0, don't wait for features, just do dialback
aed0d8a0cca8 s2smanager: Don't wait for stream:features from non-XMPP-1.0 hosts
Matthew Wild <mwild1@gmail.com>
parents: 1889
diff changeset
407 if session.version < 1.0 then
aed0d8a0cca8 s2smanager: Don't wait for stream:features from non-XMPP-1.0 hosts
Matthew Wild <mwild1@gmail.com>
parents: 1889
diff changeset
408 if not session.dialback_verifying then
1894
53f34ba6f6d6 Minor changes; outgoing TLS works.
Paul Aurich <paul@darkrain42.org>
parents: 1891
diff changeset
409 log("debug", "Initiating dialback...");
1890
aed0d8a0cca8 s2smanager: Don't wait for stream:features from non-XMPP-1.0 hosts
Matthew Wild <mwild1@gmail.com>
parents: 1889
diff changeset
410 initiate_dialback(session);
aed0d8a0cca8 s2smanager: Don't wait for stream:features from non-XMPP-1.0 hosts
Matthew Wild <mwild1@gmail.com>
parents: 1889
diff changeset
411 else
aed0d8a0cca8 s2smanager: Don't wait for stream:features from non-XMPP-1.0 hosts
Matthew Wild <mwild1@gmail.com>
parents: 1889
diff changeset
412 mark_connected(session);
aed0d8a0cca8 s2smanager: Don't wait for stream:features from non-XMPP-1.0 hosts
Matthew Wild <mwild1@gmail.com>
parents: 1889
diff changeset
413 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
414 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
415 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
416 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
417
959
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
418 function streamclosed(session)
1006
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
419 (session.log or log)("debug", "</stream:stream>");
1199
db2a55fe94f2 s2smanager: Only send reply </stream:stream> when connection is still open
Matthew Wild <mwild1@gmail.com>
parents: 1075
diff changeset
420 if session.sends2s then
db2a55fe94f2 s2smanager: Only send reply </stream:stream> when connection is still open
Matthew Wild <mwild1@gmail.com>
parents: 1075
diff changeset
421 session.sends2s("</stream:stream>");
db2a55fe94f2 s2smanager: Only send reply </stream:stream> when connection is still open
Matthew Wild <mwild1@gmail.com>
parents: 1075
diff changeset
422 end
959
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
423 session.notopen = true;
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
424 end
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
425
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
426 function initiate_dialback(session)
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
427 -- generate dialback key
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
428 session.dialback_key = generate_dialback(session.streamid, session.to_host, session.from_host);
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
429 session.sends2s(format("<db:result from='%s' to='%s'>%s</db:result>", session.from_host, session.to_host, session.dialback_key));
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
430 session.log("info", "sent dialback key on outgoing s2s stream");
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
431 end
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
432
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
433 function generate_dialback(id, to, from)
448
2623519b25b0 Switched from md5 to sha256 for dialback key generation
Waqas Hussain <waqas20@gmail.com>
parents: 435
diff changeset
434 return sha256_hash(id..to..from..dialback_secret, true);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
435 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
436
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
437 function verify_dialback(id, to, from, key)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
438 return key == generate_dialback(id, to, from);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
439 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
440
621
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
441 function make_authenticated(session, host)
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
442 if session.type == "s2sout_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
443 session.type = "s2sout";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
444 elseif session.type == "s2sin_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
445 session.type = "s2sin";
621
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
446 if host then
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
447 session.hosts[host].authed = true;
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
448 end
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
449 elseif session.type == "s2sin" and host then
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
450 session.hosts[host].authed = true;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
451 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452 return false;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
453 end
1075
831c84cbf5fa s2smanager: Miscellaneous logging improvements, changing levels, improving messages and using session loggers where possible
Matthew Wild <mwild1@gmail.com>
parents: 1007
diff changeset
454 session.log("debug", "connection %s->%s is now authenticated", session.from_host or "(unknown)", session.to_host or "(unknown)");
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
456 mark_connected(session);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
457
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
458 return true;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
459 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
460
1891
fd725a28141d s2smanager: Small comment
Matthew Wild <mwild1@gmail.com>
parents: 1890
diff changeset
461 -- Stream is authorised, and ready for normal stanzas
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
462 function mark_connected(session)
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
463 local sendq, send = session.sendq, session.sends2s;
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
464
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
465 local from, to = session.from_host, session.to_host;
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
466
1075
831c84cbf5fa s2smanager: Miscellaneous logging improvements, changing levels, improving messages and using session loggers where possible
Matthew Wild <mwild1@gmail.com>
parents: 1007
diff changeset
467 session.log("info", session.direction.." s2s connection "..from.."->"..to.." complete");
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
468
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
469 local send_to_host = send_to_host;
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
470 function session.send(data) send_to_host(to, from, data); end
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
471
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
472
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
473 if session.direction == "outgoing" then
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
474 if sendq then
269
3cfac0e5e6ca Log how many queued stanzas we send
Waqas Hussain <waqas20@gmail.com>
parents: 266
diff changeset
475 session.log("debug", "sending "..#sendq.." queued stanzas across new outgoing connection to "..session.to_host);
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
476 for i, data in ipairs(sendq) do
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
477 send(data[1]);
190
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
478 sendq[i] = nil;
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
479 end
1e993b7deae7 General fixes for s2s, to make it more robust (I hope), sending data to remote hosts sane (s2ssession.send() works as expected), recycle outgoing dialback connections, etc.
Matthew Wild <mwild1@gmail.com>
parents: 186
diff changeset
480 session.sendq = nil;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
481 end
1345
35b5686d73ea s2smanager: Remove srv_hosts from session when connected, this fixes attempting to reconnect s2s sessions when they are closed during shutdown
Matthew Wild <mwild1@gmail.com>
parents: 1308
diff changeset
482
35b5686d73ea s2smanager: Remove srv_hosts from session when connected, this fixes attempting to reconnect s2s sessions when they are closed during shutdown
Matthew Wild <mwild1@gmail.com>
parents: 1308
diff changeset
483 session.srv_hosts = nil;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
484 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
485 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
486
2368
4726cd9a6318 s2smanager: Have both destroy_session and bounce_sendq accept a reason string to include in bounced stanzas
Matthew Wild <mwild1@gmail.com>
parents: 2231
diff changeset
487 function destroy_session(session, reason)
169
92768120b717 Little tweak for more useful logging of closed s2s sessions
Matthew Wild <mwild1@gmail.com>
parents: 167
diff changeset
488 (session.log or log)("info", "Destroying "..tostring(session.direction).." session "..tostring(session.from_host).."->"..tostring(session.to_host));
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
489
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
490 if session.direction == "outgoing" then
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
491 hosts[session.from_host].s2sout[session.to_host] = nil;
2368
4726cd9a6318 s2smanager: Have both destroy_session and bounce_sendq accept a reason string to include in bounced stanzas
Matthew Wild <mwild1@gmail.com>
parents: 2231
diff changeset
492 bounce_sendq(session, reason);
621
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
493 elseif session.direction == "incoming" then
cd2cab5400fc Add support for dialback piggy-backing. Fixes #37. Thanks to CShadowRun for helping me test :)
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
494 incoming_s2s[session] = nil;
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
495 end
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
496
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
497 for k in pairs(session) do
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
498 if k ~= "trace" then
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
499 session[k] = nil;
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
500 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
501 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
502 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
503
225
bbbd169b326b Just committing this warning, because I want to know if the problem really affects us
Matthew Wild <mwild1@gmail.com>
parents: 199
diff changeset
504 return _M;