core/s2smanager.lua

Sun, 09 Nov 2008 21:46:42 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 09 Nov 2008 21:46:42 +0000
changeset 233
23585c323daa
parent 231
24bcdaacc0bf
child 241
021ccf988f3b
permissions
-rw-r--r--

Move some code about so that we don't leave connections hanging if they hit the connection timeout

148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 local hosts = hosts;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local sessions = sessions;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local socket = require "socket";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local format = string.format;
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
6 local t_insert = table.insert;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 local tostring, pairs, ipairs, getmetatable, print, newproxy, error, tonumber
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 = tostring, pairs, ipairs, getmetatable, print, newproxy, error, tonumber;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local connlisteners_get = require "net.connlisteners".get;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local wraptlsclient = require "net.server".wraptlsclient;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local modulemanager = require "core.modulemanager";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 local uuid_gen = require "util.uuid".generate;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local logger_init = require "util.logger".init;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local log = logger_init("s2smanager");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 local md5_hash = require "util.hashes".md5;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local dialback_secret = "This is very secret!!! Ha!";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23
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
24 local srvmap = { ["gmail.com"] = "talk.google.com", ["identi.ca"] = "longlance.controlezvous.ca", ["cdr.se"] = "jabber.cdr.se" };
157
f4e9b6ec34b0 Hack until we get SRV resolving
Matthew Wild <mwild1@gmail.com>
parents: 148
diff changeset
25
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 module "s2smanager"
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 function connect_host(from_host, to_host)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 end
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 function send_to_host(from_host, to_host, 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
32 local host = hosts[to_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
33 if host then
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 -- Write to connection
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
35 if host.type == "s2sout_unauthed" and not host.notopen and not host.dialback_key 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
36 log("debug", "trying to send over unauthed s2sout to "..to_host..", authing it now...");
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
37 initiate_dialback(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
38 if not host.sendq then host.sendq = { data };
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
39 else t_insert(host.sendq, 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
40 else
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
41 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
42 -- FIXME
227
211c2e04c82b Fix some very misleading logging
Matthew Wild <mwild1@gmail.com>
parents: 225
diff changeset
43 if hosts[to_host].from_host ~= from_host then log("error", "WARNING! This might, possibly, be a bug, but it might not..."); end
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
44 hosts[to_host].sends2s(data);
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
45 log("debug", "stanza sent over "..hosts[to_host].type);
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
46 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 log("debug", "opening a new outgoing connection for this stanza");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 local host_session = new_outgoing(from_host, to_host);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 -- Store in buffer
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 host_session.sendq = { data };
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 function disconnect_host(host)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 local open_sessions = 0;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 function new_incoming(conn)
199
eccf66b42bd7 Added resource priority handling, etc
Waqas Hussain <waqas20@gmail.com>
parents: 191
diff changeset
62 local session = { conn = conn, type = "s2sin_unauthed", direction = "incoming" };
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 if true then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 session.trace = newproxy(true);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 getmetatable(session.trace).__gc = function () open_sessions = open_sessions - 1; print("s2s session got collected, now "..open_sessions.." s2s sessions are allocated") end;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 open_sessions = open_sessions + 1;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 local w = conn.write;
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
69 session.sends2s = function (t) w(tostring(t)); end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 return session;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 function new_outgoing(from_host, to_host)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 local host_session = { to_host = to_host, from_host = from_host, notopen = true, type = "s2sout_unauthed", direction = "outgoing" };
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 hosts[to_host] = host_session;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 local cl = connlisteners_get("xmppserver");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 local conn, handler = socket.tcp()
233
23585c323daa Move some code about so that we don't leave connections hanging if they hit the connection timeout
Matthew Wild <mwild1@gmail.com>
parents: 231
diff changeset
79
23585c323daa Move some code about so that we don't leave connections hanging if they hit the connection timeout
Matthew Wild <mwild1@gmail.com>
parents: 231
diff changeset
80
23585c323daa Move some code about so that we don't leave connections hanging if they hit the connection timeout
Matthew Wild <mwild1@gmail.com>
parents: 231
diff changeset
81 -- Register this outgoing connection so that xmppserver_listener knows about it
23585c323daa Move some code about so that we don't leave connections hanging if they hit the connection timeout
Matthew Wild <mwild1@gmail.com>
parents: 231
diff changeset
82 -- otherwise it will assume it is a new incoming connection
23585c323daa Move some code about so that we don't leave connections hanging if they hit the connection timeout
Matthew Wild <mwild1@gmail.com>
parents: 231
diff changeset
83 cl.register_outgoing(conn, host_session);
23585c323daa Move some code about so that we don't leave connections hanging if they hit the connection timeout
Matthew Wild <mwild1@gmail.com>
parents: 231
diff changeset
84
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 --FIXME: Below parameters (ports/ip) are incorrect (use SRV)
157
f4e9b6ec34b0 Hack until we get SRV resolving
Matthew Wild <mwild1@gmail.com>
parents: 148
diff changeset
86 to_host = srvmap[to_host] or to_host;
231
24bcdaacc0bf Prevent slow connects for s2s from blocking for so long
Matthew Wild <mwild1@gmail.com>
parents: 227
diff changeset
87 conn:settimeout(0.1);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 conn:connect(to_host, 5269);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 conn = wraptlsclient(cl, conn, to_host, 5269, 0, 1, hosts[from_host].ssl_ctx );
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 host_session.conn = conn;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 do
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 local conn_name = "s2sout"..tostring(conn):match("[a-f0-9]*$");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 host_session.log = logger_init(conn_name);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 local w = conn.write;
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
98 host_session.sends2s = function (t) w(tostring(t)); end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 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));
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 return host_session;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 function streamopened(session, attr)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 session.log("debug", "s2s stream opened");
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
107 local send = session.sends2s;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 session.version = tonumber(attr.version) or 0;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 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
111 print("to: "..tostring(attr.to).." from: "..tostring(attr.from));
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 --error(session.to_host.." failed to specify 'to' or 'from' hostname as per RFC");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 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
114 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 if session.direction == "incoming" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 -- Send a reply stream header
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 for k,v in pairs(attr) do print("", tostring(k), ":::", tostring(v)); 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 session.to_host = attr.to;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 session.from_host = attr.from;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 session.streamid = uuid_gen();
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 print(session, session.from_host, "incoming s2s stream opened");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 send("<?xml version='1.0'?>");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 send(format("<stream:stream xmlns='jabber:server' xmlns:db='jabber:server:dialback' xmlns:stream='http://etherx.jabber.org/streams' id='%s' from='%s'>", session.streamid, session.to_host));
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 elseif session.direction == "outgoing" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 -- 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
130 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
131 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
132
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 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
134 initiate_dialback(session);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 mark_connected(session);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 --[[
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 local features = {};
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 modulemanager.fire_event("stream-features-s2s", session, features);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 send("<stream:features>");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 for _, feature in ipairs(features) do
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 send(tostring(feature));
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 send("</stream:features>");]]
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 log("info", "s2s stream opened successfully");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 session.notopen = nil;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153
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
154 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
155 -- 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
156 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
157 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
158 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
159 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
160
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 function generate_dialback(id, to, from)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 return md5_hash(id..to..from..dialback_secret); -- FIXME: See XEP-185 and XEP-220
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 function verify_dialback(id, to, from, key)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 return key == generate_dialback(id, to, from);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 function make_authenticated(session)
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 if session.type == "s2sout_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 session.type = "s2sout";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 elseif session.type == "s2sin_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 session.type = "s2sin";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 return false;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 session.log("info", "connection is now authenticated");
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 mark_connected(session);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 return true;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 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
185 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
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
187 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
188
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
189 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
190
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
191 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
192 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
193
186
bfa8a30ea488 sends2s -> s2s_session.send(), s2s_session.send() -> s2s_session.sends2s()
Matthew Wild <mwild1@gmail.com>
parents: 179
diff changeset
194
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
195 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
196 if sendq 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
197 session.log("debug", "sending queued stanzas across new outgoing connection to "..session.to_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
198 for i, data in ipairs(sendq) do
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
199 send(data);
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
200 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
201 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
202 session.sendq = nil;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 end
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
207 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
208 (session.log or log)("info", "Destroying "..tostring(session.direction).." session "..tostring(session.from_host).."->"..tostring(session.to_host));
164
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
209 if session.direction == "outgoing" then
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
210 hosts[session.to_host] = nil;
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
211 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
212 session.conn = nil;
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
213 session.disconnect = nil;
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
214 for k in pairs(session) do
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
215 if k ~= "trace" then
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
216 session[k] = nil;
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
217 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
218 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
219 end
8dc1faa5b1df other half of previous commit
Matthew Wild <mwild1@gmail.com>
parents: 162
diff changeset
220
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
221 return _M;

mercurial