Annotate

core/s2smanager.lua @ 982:dbbeb73952e6

componentmanager: Improve default component stanza handler
author Matthew Wild <mwild1@gmail.com>
date Sat, 11 Apr 2009 22:23:49 +0100
parent 977:6f0bdf9e4dfb
child 995:a007d85b4045
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
896
2c0b9e3c11c3 0.3->0.4
Matthew Wild <mwild1@gmail.com>
parents: 852
diff changeset
1 -- Prosody IM v0.4
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
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 local socket = require "socket";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local format = string.format;
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
16 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
17 local get_traceback = debug.traceback;
976
17af9851c81d core.s2smanager: Remove some debugging
Matthew Wild <mwild1@gmail.com>
parents: 974
diff changeset
18 local tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber
17af9851c81d core.s2smanager: Remove some debugging
Matthew Wild <mwild1@gmail.com>
parents: 974
diff changeset
19 = tostring, pairs, ipairs, getmetatable, newproxy, error, tonumber;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
21 local idna_to_ascii = require "util.encodings".idna.to_ascii;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 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
23 local wrapclient = require "net.server".wrapclient;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 local modulemanager = require "core.modulemanager";
244
0e3bda34f958 Missed importing a function in last commit
Matthew Wild <mwild1@gmail.com>
parents: 243
diff changeset
25 local st = require "stanza";
0e3bda34f958 Missed importing a function in last commit
Matthew Wild <mwild1@gmail.com>
parents: 243
diff changeset
26 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
27 local nameprep = require "util.encodings".stringprep.nameprep;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 local uuid_gen = require "util.uuid".generate;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 local logger_init = require "util.logger".init;
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 log = logger_init("s2smanager");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34
448
2623519b25b0 Switched from md5 to sha256 for dialback key generation
Waqas Hussain <waqas20@gmail.com>
parents: 435
diff changeset
35 local sha256_hash = require "util.hashes".sha256;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36
593
121d82243023 Slightly more secure dialback secret generation
Matthew Wild <mwild1@gmail.com>
parents: 583
diff changeset
37 local dialback_secret = sha256_hash(tostring{} .. math.random() .. socket.gettime(), true);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
39 local adns = require "net.adns";
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
40
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
41 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
42 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
43
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 module "s2smanager"
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45
337
4a1dd1c2c219 We have SRV resolving \o/
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
46 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
47
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
48 local function bounce_sendq(session)
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
49 local sendq = session.sendq;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
50 if sendq then
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
51 session.log("debug", "sending error replies for "..#sendq.." queued stanzas because of failed outgoing connection to "..tostring(session.to_host));
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
52 local dummy = {
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
53 type = "s2sin";
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
54 send = function(s)
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
55 (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
56 end;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
57 dummy = true;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
58 };
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
59 for i, data in ipairs(sendq) do
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
60 local reply = data[2];
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
61 local xmlns = reply.attr.xmlns;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
62 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
63 reply.attr.type = "error";
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
64 reply:tag("error", {type = "cancel"})
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
65 :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
66 core_process_stanza(dummy, reply);
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
67 end
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
68 sendq[i] = nil;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
69 end
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
70 session.sendq = nil;
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
71 end
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
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 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
75 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
76 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
77 -- 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
78 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
79 (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
80 if not host.notopen and not host.dialback_key then
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
81 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
82 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
83 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
84
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
85 -- 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
86 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
87 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
88 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
89 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
90 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
91 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
92 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
93 else
253
f2869ded1d37 Another small fix, for logging in s2smanager
Matthew Wild <mwild1@gmail.com>
parents: 252
diff changeset
94 (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
95 -- FIXME
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
96 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
97 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
98 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
99 end
260
182f0c895676 Now outgoing s2s sessions are associated with their from_host, fixes #15
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
100 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
101 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
102 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 log("debug", "opening a new outgoing connection for this stanza");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 local host_session = new_outgoing(from_host, to_host);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 -- Store in buffer
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
107 host_session.sendq = { {tostring(data), st.reply(data)} };
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
108 if (not host_session.connecting) and (not host_session.conn) then destroy_session(host_session); end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 local open_sessions = 0;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 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
115 local session = { conn = conn, type = "s2sin_unauthed", direction = "incoming", hosts = {} };
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 if true then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 session.trace = newproxy(true);
583
5821eaa80baa Remove print()s from sessionmanager and s2smanager
Matthew Wild <mwild1@gmail.com>
parents: 559
diff changeset
118 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
119 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 open_sessions = open_sessions + 1;
343
cae2178b5623 Log sent s2s stanzas
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
121 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
122 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
123 incoming_s2s[session] = true;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 return session;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 function new_outgoing(from_host, to_host)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 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
129 hosts[from_host].s2sout[to_host] = host_session;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
131 local log;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
132 do
543
cf6e19ea1cbc Fix logger ids for c2s and s2sout
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
133 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
134 log = logger_init(conn_name);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
135 host_session.log = log;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
136 end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
137
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
138 attempt_connection(host_session);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
139
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
140 return host_session;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
141 end
353
e7d776b5ebb9 Remove an old FIXME comment
Matthew Wild <mwild1@gmail.com>
parents: 351
diff changeset
142
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
143
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
144 function attempt_connection(host_session, err)
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
145 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
146 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
147
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
148 if not err then -- This is our first attempt
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
149 host_session.connecting = true;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
150 local answer =
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
151 adns.lookup(function (answer)
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
152 host_session.connecting = nil;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
153 if answer then
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
154 log("debug", to_host.." has SRV records, handling...");
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
155 local srv_hosts = {};
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
156 host_session.srv_hosts = srv_hosts;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
157 for _, record in ipairs(answer) do
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
158 t_insert(srv_hosts, record.srv);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
159 end
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
160 t_sort(srv_hosts, compare_srv_priorities);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
161
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
162 local srv_choice = srv_hosts[1];
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
163 host_session.srv_choice = 1;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
164 if srv_choice then
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
165 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
166 log("debug", "Best record found, will connect to %s:%d", connect_host, connect_port);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
167 end
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
168 else
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
169 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
170 end
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
171 -- Try with SRV, or just the plain hostname if no SRV
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
172 return try_connect(host_session, connect_host, connect_port);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
173 end, "_xmpp-server._tcp."..connect_host..".", "SRV");
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
174 return true; -- Attempt in progress
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
175 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
176 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
177 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
178 connect_host, connect_port = srv_choice.target or to_host, srv_choice.port or connect_port;
435
4087aa611de2 Log reason for connection failure
Matthew Wild <mwild1@gmail.com>
parents: 434
diff changeset
179 host_session.log("debug", "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
180 else
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
181 host_session.log("debug", "Out of connection options, can't connect to %s", tostring(host_session.to_host));
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
182 -- We're out of options
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
183 return false;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
184 end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
185
960
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
186 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
187 -- Likely we couldn't resolve DNS
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
188 return false;
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
189 end
6bc16062da6c core.s2smanager: Check for valid host and port before attempting connection
Matthew Wild <mwild1@gmail.com>
parents: 959
diff changeset
190
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
191 return try_connect(host_session, connect_host, connect_port);
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
192 end
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
193
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
194 function try_connect(host_session, connect_host, connect_port)
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
195 log("debug", "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
196 -- Ok, we're going to try to connect
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
197
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
198 local from_host, to_host = host_session.from_host, host_session.to_host;
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
199
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
200 local conn, handler = socket.tcp()
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
201
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
202 conn:settimeout(0);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
203 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
204 if not success and err ~= "timeout" then
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
205 log("warn", "s2s connect() failed: %s", err);
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
206 return false;
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
207 end
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
208
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
209 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
210 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
211 host_session.conn = conn;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
212
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
213 -- 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
214 -- 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
215 cl.register_outgoing(conn, host_session);
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
216
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
217 local w = conn.write;
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
218 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
219
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
220 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'>]], from_host, to_host));
974
Matthew Wild <mwild1@gmail.com>
parents: 963
diff changeset
221 log("debug", "Connection attempt in progress...");
434
0d7ba3742f7a (Basic) IDNA and SRV fallback support
Matthew Wild <mwild1@gmail.com>
parents: 360
diff changeset
222 return true;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 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
226 local send = session.sends2s;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227
544
efde848869c5 Don't send stream:features to incoming s2s connections
Matthew Wild <mwild1@gmail.com>
parents: 543
diff changeset
228 -- 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
229 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
230
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 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
232 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
233 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 if session.direction == "incoming" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 -- Send a reply stream header
938
663f75dd7b42 Fixed: Some nil access bugs
Waqas Hussain <waqas20@gmail.com>
parents: 931
diff changeset
237 session.to_host = attr.to and nameprep(attr.to);
663f75dd7b42 Fixed: Some nil access bugs
Waqas Hussain <waqas20@gmail.com>
parents: 931
diff changeset
238 session.from_host = attr.from and nameprep(attr.from);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 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
241 (session.log or log)("debug", "incoming s2s received <stream:stream>");
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 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
243 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
244 ["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
245 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
246 -- 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
247 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
248 return;
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
249 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
250 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
251 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
252 :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
253 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 elseif session.direction == "outgoing" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 -- 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
256 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
257 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
258
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 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
260 initiate_dialback(session);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262 mark_connected(session);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 end
259
1485d272400d Some more logging fixes
Matthew Wild <mwild1@gmail.com>
parents: 258
diff changeset
265
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 session.notopen = nil;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268
959
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
269 function streamclosed(session)
963
43b140edfd84 core.s2smanager: Look away... wait for it... now! Hopefully s2s should be back to normal.
Matthew Wild <mwild1@gmail.com>
parents: 960
diff changeset
270 session.sends2s("</stream:stream>");
959
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
271 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
272 end
e3db909065f2 sessionmanager, s2smanager, mod_component: Send reply </stream:stream> when client closes stream
Matthew Wild <mwild1@gmail.com>
parents: 938
diff changeset
273
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
274 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
275 -- 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
276 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
277 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
278 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
279 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
280
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 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
282 return sha256_hash(id..to..from..dialback_secret, true);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285 function verify_dialback(id, to, from, key)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 return key == generate_dialback(id, to, from);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288
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
289 function make_authenticated(session, host)
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290 if session.type == "s2sout_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291 session.type = "s2sout";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 elseif session.type == "s2sin_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 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
294 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
295 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
296 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
297 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
298 session.hosts[host].authed = true;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 return false;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 session.log("info", "connection is now authenticated");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 mark_connected(session);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 return true;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 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
310 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
311
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
312 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
313
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
314 session.log("debug", session.direction.." s2s connection "..from.."->"..to.." is now complete");
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
315
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
316 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
317 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
318
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
319
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
320 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
321 if sendq then
269
3cfac0e5e6ca Log how many queued stanzas we send
Waqas Hussain <waqas20@gmail.com>
parents: 266
diff changeset
322 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
323 for i, data in ipairs(sendq) do
631
6957fe7b0313 Bounce stanza errors on failed s2s
Waqas Hussain <waqas20@gmail.com>
parents: 621
diff changeset
324 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
325 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
326 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
327 session.sendq = nil;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 end
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
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
332 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
333 (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
334
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
335 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
336 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
337 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
338 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
339 incoming_s2s[session] = nil;
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
340 end
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 327
diff changeset
341
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
342 for k in pairs(session) do
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
343 if k ~= "trace" then
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
344 session[k] = nil;
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
345 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
346 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
347 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
348
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
349 return _M;