core/s2smanager.lua

Sun, 27 Sep 2009 12:10:50 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 27 Sep 2009 12:10:50 +0100
changeset 1832
5ae3209fefa2
parent 1825
48cb27e2716e
child 1833
f4c88dd32724
permissions
-rw-r--r--

Merge with waqas

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: 894
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
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 local uuid_gen = require "util.uuid".generate;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 local logger_init = require "util.logger".init;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 local log = logger_init("s2smanager");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35
448
2623519b25b0 Switched from md5 to sha256 for dialback key generation
Waqas Hussain <waqas20@gmail.com>
parents: 435
diff changeset
36 local sha256_hash = require "util.hashes".sha256;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37
1308
7b20a3d87244 s2smanager: Use a UUID as the dialback secret
Waqas Hussain <waqas20@gmail.com>
parents: 1204
diff changeset
38 local dialback_secret = uuid_gen();
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39
1793
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
40 local adns, dns = require "net.adns", require "net.dns";
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
41
1796
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
42 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
43 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
44 local max_dns_depth = config.get("*", "core", "dns_max_depth") or 3;
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 = {};
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
47 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
48
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 module "s2smanager"
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
51 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
52
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
53 local function bounce_sendq(session)
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
54 local sendq = session.sendq;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
55 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: 1013
diff changeset
56 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
57 local dummy = {
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
58 type = "s2sin";
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
59 send = function(s)
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
60 (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
61 end;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
62 dummy = true;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
63 };
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
64 for i, data in ipairs(sendq) do
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
65 local reply = data[2];
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
66 local xmlns = reply.attr.xmlns;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
67 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
68 reply.attr.type = "error";
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
69 reply:tag("error", {type = "cancel"})
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
70 :tag("remote-server-not-found", {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"}):up();
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
71 core_process_stanza(dummy, reply);
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
72 end
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
73 sendq[i] = nil;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
74 end
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
75 session.sendq = nil;
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 end
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
78
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 function send_to_host(from_host, to_host, data)
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
80 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
81 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
82 -- We have a connection to this host already
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
83 if host.type == "s2sout_unauthed" and data.name ~= "db:verify" 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
84 (host.log or log)("debug", "trying to send over unauthed s2sout to "..to_host);
995
a007d85b4045 core.s2smanager: Don't initiate dialback if we don't have a connection yet
Matthew Wild <mwild1@gmail.com>
parents: 977
diff changeset
85 if not host.notopen and not host.dialback_key and host.sends2s 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
86 host.log("debug", "dialback had not been initiated");
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
87 initiate_dialback(host);
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
88 end
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
89
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 -- 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
91 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
92 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
93 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
94 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
95 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
96 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
97 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
98 else
253
f2869ded1d37 Another small fix, for logging in s2smanager
Matthew Wild <mwild1@gmail.com>
parents: 252
diff changeset
99 (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
100 -- FIXME
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
101 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
102 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
103 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
104 end
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
105 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
106 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
107 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 log("debug", "opening a new outgoing connection for this stanza");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 local host_session = new_outgoing(from_host, to_host);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 -- Store in buffer
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
112 host_session.sendq = { {tostring(data), st.reply(data)} };
1012
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
113 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
114 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
115 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
116 destroy_session(host_session);
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
117 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 local open_sessions = 0;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 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
124 local session = { conn = conn, type = "s2sin_unauthed", direction = "incoming", hosts = {} };
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 if true then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 session.trace = newproxy(true);
583
5821eaa80baa Remove print()s from sessionmanager and s2smanager
Matthew Wild <mwild1@gmail.com>
parents: 559
diff changeset
127 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
128 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 open_sessions = open_sessions + 1;
343
cae2178b5623 Log sent s2s stanzas
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
130 local w, log = conn.write, logger_init("s2sin"..tostring(conn):match("[a-f0-9]+$"));
cae2178b5623 Log sent s2s stanzas
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
131 session.sends2s = function (t) log("debug", "sending: %s", tostring(t)); w(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
132 incoming_s2s[session] = true;
1796
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
133 add_task(connect_timeout, function ()
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
134 if session.conn ~= conn or
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
135 session.type == "s2sin" then
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
136 return; -- Ok, we're connect[ed|ing]
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
137 end
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
138 -- Not connected, need to close session and clean up
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
139 (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
140 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
141 session:close("connection-timeout");
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
142 end);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 return session;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 function new_outgoing(from_host, to_host)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 local host_session = { to_host = to_host, from_host = from_host, notopen = true, type = "s2sout_unauthed", direction = "outgoing" };
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
148 hosts[from_host].s2sout[to_host] = host_session;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
150 local log;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
151 do
543
cf6e19ea1cbc Fix logger ids for c2s and s2sout
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
152 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
153 log = logger_init(conn_name);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
154 host_session.log = log;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
155 end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
156
1492
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
157 -- This is the first call, can't fail (the first step is DNS lookup)
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
158 attempt_connection(host_session);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
159
1013
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
160 if not host_session.sends2s then
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
161 -- A sends2s which buffers data (until the stream is opened)
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
162 -- 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: 1012
diff changeset
163 -- 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: 1012
diff changeset
164 local buffer;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
165 function host_session.sends2s(data)
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
166 if not buffer then
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
167 buffer = {};
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
168 host_session.send_buffer = buffer;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
169 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
170 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: 1012
diff changeset
171 buffer[#buffer+1] = data;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
172 log("debug", "Buffered item %d: %s", #buffer, tostring(data));
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
173 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
174
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
175 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
176
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
177 return host_session;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
178 end
353
e7d776b5ebb9 Remove an old FIXME comment
Matthew Wild <mwild1@gmail.com>
parents: 351
diff changeset
179
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
180
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
181 function attempt_connection(host_session, err)
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
182 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
183 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
184
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
185 if not err then -- This is our first attempt
1012
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
186 log("debug", "First attempt to connect to %s, starting with SRV lookup...", to_host);
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
187 host_session.connecting = true;
1791
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
188 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
189 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
190 handle = nil;
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
191 host_session.connecting = nil;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
192 if answer then
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
193 log("debug", to_host.." has SRV records, handling...");
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
194 local srv_hosts = {};
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
195 host_session.srv_hosts = srv_hosts;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
196 for _, record in ipairs(answer) do
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
197 t_insert(srv_hosts, record.srv);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
198 end
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
199 t_sort(srv_hosts, compare_srv_priorities);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
200
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
201 local srv_choice = srv_hosts[1];
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
202 host_session.srv_choice = 1;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
203 if srv_choice then
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
204 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
205 log("debug", "Best record found, will connect to %s:%d", connect_host, connect_port);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
206 end
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
207 else
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
208 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
209 end
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
210 -- 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
211 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
212 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
213 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
214 -- 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
215 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
216 end
aaeccebad0f3 s2smanager: Fix to correctly bounce stanzas if first connection attempt fails instantly
Matthew Wild <mwild1@gmail.com>
parents: 1468
diff changeset
217 end
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
218 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
219
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
220 -- 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
221 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
222 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
223 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
224 end
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
225 end);
dea89234e545 s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
Matthew Wild <mwild1@gmail.com>
parents: 1199
diff changeset
226
1012
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
227 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
228 return true; -- Attempt in progress
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
229 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
230 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
231 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
232 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: 1013
diff changeset
233 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
234 else
1075
831c84cbf5fa s2smanager: Miscellaneous logging improvements, changing levels, improving messages and using session loggers where possible
Matthew Wild <mwild1@gmail.com>
parents: 1013
diff changeset
235 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
236 -- We're out of options
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
237 return false;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
238 end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
239
960
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
240 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
241 -- Likely we couldn't resolve DNS
1012
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
242 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
243 return false;
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
244 end
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
245
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
246 return try_connect(host_session, connect_host, connect_port);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
247 end
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
248
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
249 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
250 host_session.connecting = true;
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
251 local handle;
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
252 handle = adns.lookup(function (reply)
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
253 handle = nil;
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
254 host_session.connecting = nil;
1793
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
255
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
256 -- COMPAT: This is a compromise for all you CNAME-(ab)users :)
1825
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
257 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
258 local count = max_dns_depth;
1793
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
259 reply = dns.peek(connect_host, "CNAME", "IN");
1825
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
260 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
261 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
262 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
263 count = count - 1;
1793
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
264 end
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
265 end
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
266 -- end of CNAME resolving
1fc6c2822e6b s2smanager: Compatibility with domains which use CNAMEs
Matthew Wild <mwild1@gmail.com>
parents: 1791
diff changeset
267
1825
48cb27e2716e core.s2smanager: Always use last record in the DNS cache
Matthew Wild <mwild1@gmail.com>
parents: 1805
diff changeset
268 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
269 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
270 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
271 else
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
272 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
273 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
274 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
275 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
276 end
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
277 end
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
278 end, connect_host, "A", "IN");
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
279
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
280 -- Set handler for DNS timeout
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
281 add_task(dns_timeout, function ()
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
282 if handle then
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
283 adns.cancel(handle, true);
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
284 end
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
285 end);
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
286
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
287 return true;
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
42d0b68a1efd s2smanager: Pass A-record lookups through adns module
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
290 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: 1013
diff changeset
291 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
292 -- Ok, we're going to try to connect
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
293
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
294 local from_host, to_host = host_session.from_host, host_session.to_host;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
295
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
296 local conn, handler = socket.tcp()
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
297
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
298 conn:settimeout(0);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
299 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
300 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
301 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
302 return false, err;
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
303 end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
304
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
305 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
306 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
307 host_session.conn = conn;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
308
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
309 -- 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
310 -- 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
311 cl.register_outgoing(conn, host_session);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
312
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
313 local w = conn.write;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
314 host_session.sends2s = function (t) log("debug", "sending: %s", tostring(t)); w(tostring(t)); end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
315
1450
c1c7b27b983b Send xml:lang in stream headers, fixes #78
Matthew Wild <mwild1@gmail.com>
parents: 1345
diff changeset
316 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
317 log("debug", "Connection attempt in progress...");
1796
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
318 add_task(connect_timeout, function ()
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
319 if host_session.conn ~= conn or
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
320 host_session.type == "s2sout" or
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
321 host_session.connecting then
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
322 return; -- Ok, we're connect[ed|ing]
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
323 end
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
324 -- Not connected, need to close session and clean up
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
325 (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
326 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
327 host_session:close("connection-timeout");
5f7b2f940816 s2smanager: Timeout unauthed s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 1793
diff changeset
328 end);
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
329 return true;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 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
333 local send = session.sends2s;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334
544
efde848869c5 Don't send stream:features to incoming s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 543
diff changeset
335 -- TODO: #29: SASL/TLS on s2s streams
efde848869c5 Don't send stream:features to incoming s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 543
diff changeset
336 session.version = 0; --tonumber(attr.version) or 0;
efde848869c5 Don't send stream:features to incoming s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 543
diff changeset
337
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 if session.version >= 1.0 and not (attr.to and attr.from) then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 log("warn", (session.to_host or "(unknown)").." failed to specify 'to' or 'from' hostname as per RFC");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 if session.direction == "incoming" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 -- Send a reply stream header
938
663f75dd7b42 Fixed: Some nil access bugs
Waqas Hussain <waqas20@gmail.com>
parents: 931
diff changeset
344 session.to_host = attr.to and nameprep(attr.to);
663f75dd7b42 Fixed: Some nil access bugs
Waqas Hussain <waqas20@gmail.com>
parents: 931
diff changeset
345 session.from_host = attr.from and nameprep(attr.from);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347 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
348 (session.log or log)("debug", "incoming s2s received <stream:stream>");
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349 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
350 send(stanza("stream:stream", { xmlns='jabber:server', ["xmlns:db"]='jabber:server:dialback',
3c2d99ba1dc2 core.s2smanager: Remove some old commented code, break a long line in 2
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
351 ["xmlns:stream"]='http://etherx.jabber.org/streams', id=session.streamid, from=session.to_host }):top_tag());
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
352 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
353 -- 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
354 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
355 return;
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
356 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
357 if session.version >= 1.0 then
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
358 send(st.stanza("stream:features")
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
359 :tag("dialback", { xmlns='urn:xmpp:features:dialback' }):tag("optional"):up():up());
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
360 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 elseif session.direction == "outgoing" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362 -- 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
363 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
364 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
365
1013
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
366 -- Send unauthed buffer
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
367 -- (stanzas which are fine to send before dialback)
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
368 -- Note that this is *not* the stanza queue (which
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
369 -- we can only send if auth succeeds) :)
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
370 local send_buffer = session.send_buffer;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
371 if send_buffer and #send_buffer > 0 then
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
372 log("debug", "Sending s2s send_buffer now...");
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
373 for i, data in ipairs(send_buffer) do
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
374 session.sends2s(tostring(data));
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
375 send_buffer[i] = nil;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
376 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
377 end
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
378 session.send_buffer = nil;
c500d4cb7855 core.s2smanager: Buffer data sent before connection
Matthew Wild <mwild1@gmail.com>
parents: 1012
diff changeset
379
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 if not session.dialback_verifying then
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
381 initiate_dialback(session);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 mark_connected(session);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385 end
259
1485d272400d Some more logging fixes
Matthew Wild <mwild1@gmail.com>
parents: 258
diff changeset
386
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 session.notopen = nil;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389
959
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
390 function streamclosed(session)
1012
9166d7a8c3c0 core.s2smanager: Logging improvements
Matthew Wild <mwild1@gmail.com>
parents: 995
diff changeset
391 (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
392 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
393 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
394 end
959
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
395 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
396 end
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
397
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
398 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
399 -- 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
400 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
401 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
402 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
403 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
404
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 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
406 return sha256_hash(id..to..from..dialback_secret, true);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
407 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
409 function verify_dialback(id, to, from, key)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
410 return key == generate_dialback(id, to, from);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
411 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
412
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
413 function make_authenticated(session, host)
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
414 if session.type == "s2sout_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
415 session.type = "s2sout";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
416 elseif session.type == "s2sin_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
417 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
418 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
419 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
420 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
421 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
422 session.hosts[host].authed = true;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424 return false;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425 end
1075
831c84cbf5fa s2smanager: Miscellaneous logging improvements, changing levels, improving messages and using session loggers where possible
Matthew Wild <mwild1@gmail.com>
parents: 1013
diff changeset
426 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
427
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
428 mark_connected(session);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
429
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
430 return true;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
431 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
432
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
433 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
434 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
435
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
436 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
437
1075
831c84cbf5fa s2smanager: Miscellaneous logging improvements, changing levels, improving messages and using session loggers where possible
Matthew Wild <mwild1@gmail.com>
parents: 1013
diff changeset
438 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
439
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
440 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
441 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
442
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
443
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
444 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
445 if sendq then
269
3cfac0e5e6ca Log how many queued stanzas we send
Waqas Hussain <waqas20@gmail.com>
parents: 266
diff changeset
446 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
447 for i, data in ipairs(sendq) do
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
448 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
449 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
450 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
451 session.sendq = nil;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452 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
453
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
454 session.srv_hosts = nil;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
456 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
457
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
458 function destroy_session(session)
169
92768120b717 Little tweak for more useful logging of closed s2s sessions
Matthew Wild <mwild1@gmail.com>
parents: 167
diff changeset
459 (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
460
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
461 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
462 hosts[session.from_host].s2sout[session.to_host] = nil;
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
463 bounce_sendq(session);
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
464 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
465 incoming_s2s[session] = nil;
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
466 end
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
467
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
468 for k in pairs(session) do
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
469 if k ~= "trace" then
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
470 session[k] = nil;
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
471 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
472 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
473 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
474
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
475 return _M;

mercurial