Comparison

core/sessionmanager.lua @ 4797:e239668aa6d2

Merge 0.9->trunk
author Matthew Wild <mwild1@gmail.com>
date Sun, 29 Apr 2012 02:10:55 +0100
parent 4552:414d857ee125
child 4813:77da9671ac39
comparison
equal deleted inserted replaced
4796:04a34287dc12 4797:e239668aa6d2
4 -- 4 --
5 -- This project is MIT/X11 licensed. Please see the 5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information. 6 -- COPYING file in the source package for more information.
7 -- 7 --
8 8
9
10
11 local tonumber, tostring, setmetatable = tonumber, tostring, setmetatable; 9 local tonumber, tostring, setmetatable = tonumber, tostring, setmetatable;
12 local ipairs, pairs, print, next= ipairs, pairs, print, next; 10 local ipairs, pairs, print, next= ipairs, pairs, print, next;
13 local format = string.format;
14 11
15 local hosts = hosts; 12 local hosts = hosts;
16 local full_sessions = full_sessions; 13 local full_sessions = full_sessions;
17 local bare_sessions = bare_sessions; 14 local bare_sessions = bare_sessions;
18 15
19 local modulemanager = require "core.modulemanager";
20 local logger = require "util.logger"; 16 local logger = require "util.logger";
21 local log = logger.init("sessionmanager"); 17 local log = logger.init("sessionmanager");
22 local error = error; 18 local error = error;
23 local uuid_generate = require "util.uuid".generate;
24 local rm_load_roster = require "core.rostermanager".load_roster; 19 local rm_load_roster = require "core.rostermanager".load_roster;
25 local config_get = require "core.configmanager".get; 20 local config_get = require "core.configmanager".get;
26 local nameprep = require "util.encodings".stringprep.nameprep;
27 local resourceprep = require "util.encodings".stringprep.resourceprep; 21 local resourceprep = require "util.encodings".stringprep.resourceprep;
28 local nodeprep = require "util.encodings".stringprep.nodeprep; 22 local nodeprep = require "util.encodings".stringprep.nodeprep;
23 local uuid_generate = require "util.uuid".generate;
29 24
30 local initialize_filters = require "util.filters".initialize; 25 local initialize_filters = require "util.filters".initialize;
31 local fire_event = prosody.events.fire_event; 26 local fire_event = prosody.events.fire_event;
32 local add_task = require "util.timer".add_task; 27 local add_task = require "util.timer".add_task;
33 local gettime = require "socket".gettime; 28 local gettime = require "socket".gettime;
34 29
35 local st = require "util.stanza"; 30 local st = require "util.stanza";
36
37 local c2s_timeout = config_get("*", "core", "c2s_timeout");
38 31
39 local newproxy = newproxy; 32 local newproxy = newproxy;
40 local getmetatable = getmetatable; 33 local getmetatable = getmetatable;
41 34
42 module "sessionmanager" 35 module "sessionmanager"
66 end 59 end
67 end 60 end
68 session.ip = conn:ip(); 61 session.ip = conn:ip();
69 local conn_name = "c2s"..tostring(conn):match("[a-f0-9]+$"); 62 local conn_name = "c2s"..tostring(conn):match("[a-f0-9]+$");
70 session.log = logger.init(conn_name); 63 session.log = logger.init(conn_name);
71
72 if c2s_timeout then
73 add_task(c2s_timeout, function ()
74 if session.type == "c2s_unauthed" then
75 session:close("connection-timeout");
76 end
77 end);
78 end
79 64
80 return session; 65 return session;
81 end 66 end
82 67
83 local resting_session = { -- Resting, not dead 68 local resting_session = { -- Resting, not dead
215 hosts[session.host].events.fire_event("resource-bind", {session=session}); 200 hosts[session.host].events.fire_event("resource-bind", {session=session});
216 201
217 return true; 202 return true;
218 end 203 end
219 204
220 function streamopened(session, attr)
221 local send = session.send;
222 session.host = attr.to;
223 if not session.host then
224 session:close{ condition = "improper-addressing",
225 text = "A 'to' attribute is required on stream headers" };
226 return;
227 end
228 session.host = nameprep(session.host);
229 session.version = tonumber(attr.version) or 0;
230 session.streamid = uuid_generate();
231 (session.log or session)("debug", "Client sent opening <stream:stream> to %s", session.host);
232
233 if not hosts[session.host] then
234 -- We don't serve this host...
235 session:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)};
236 return;
237 end
238
239 send("<?xml version='1.0'?>");
240 send(format("<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='%s' from='%s' version='1.0' xml:lang='en'>", session.streamid, session.host));
241
242 (session.log or log)("debug", "Sent reply <stream:stream> to client");
243 session.notopen = nil;
244
245 -- If session.secure is *false* (not nil) then it means we /were/ encrypting
246 -- since we now have a new stream header, session is secured
247 if session.secure == false then
248 session.secure = true;
249 end
250
251 local features = st.stanza("stream:features");
252 hosts[session.host].events.fire_event("stream-features", { origin = session, features = features });
253 fire_event("stream-features", session, features);
254
255 send(features);
256
257 end
258
259 function streamclosed(session)
260 session.log("debug", "Received </stream:stream>");
261 session:close();
262 end
263
264 function send_to_available_resources(user, host, stanza) 205 function send_to_available_resources(user, host, stanza)
265 local jid = user.."@"..host; 206 local jid = user.."@"..host;
266 local count = 0; 207 local count = 0;
267 local user = bare_sessions[jid]; 208 local user = bare_sessions[jid];
268 if user then 209 if user then