Annotate

core/s2smanager.lua @ 2783:57611584e27d

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