Annotate

core/sessionmanager.lua @ 40:2c0147bbd81a

Move stream opening handling from xmlhandlers to sessionmanager
author Matthew Wild <mwild1@gmail.com>
date Fri, 03 Oct 2008 22:18:08 +0100
parent 38:3fdfd6e0cb4e
child 41:68297fef35ff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1
40
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
2 local tonumber, tostring = tonumber, tostring;
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
3 local ipairs = ipairs;
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
4
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
5 local m_random = math.random;
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
6 local format = string.format;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
8 local print = print;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
9
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
10 local hosts = hosts;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
11
40
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
12 local modulemanager = require "core.modulemanager";
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local log = require "util.logger".init("sessionmanager");
40
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
14 local error = error;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 module "sessionmanager"
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 function new_session(conn)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" };
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 local w = conn.write;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 session.send = function (t) w(tostring(t)); end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 return session;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
25 function destroy_session(session)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
26 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
27
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 function send_to_session(session, data)
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
29 log("debug", "Sending: %s", tostring(data));
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 session.conn.write(tostring(data));
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
33 function make_authenticated(session, username)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
34 session.username = username;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
35 session.resource = resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
36 if session.type == "c2s_unauthed" then
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
37 session.type = "c2s";
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
38 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
39 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
40
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
41 function bind_resource(session, resource)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
42 if not session.username then return false, "auth"; end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
43 if session.resource then return false, "constraint"; end -- We don't support binding multiple resources
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
44 resource = resource or math.random(100000, 99999999); -- FIXME: Clearly we have issues :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
45 --FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
46
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
47 if not hosts[session.host].sessions[session.username] then
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
48 hosts[session.host].sessions[session.username] = { sessions = {} };
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
49 else
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
50 if hosts[session.host].sessions[session.username].sessions[resource] then
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
51 -- Resource conflict
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
52 return false, "conflict";
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
53 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
54 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
55
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
56 session.resource = resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
57 session.full_jid = session.username .. '@' .. session.host .. '/' .. resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
58 hosts[session.host].sessions[session.username].sessions[resource] = session;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
59
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
60 return true;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
61 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
62
40
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
63 function streamopened(session, attr)
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
64 local send = session.send;
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
65 session.host = attr.to or error("Client failed to specify destination hostname");
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
66 session.version = tonumber(attr.version) or 0;
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
67 session.streamid = m_random(1000000, 99999999);
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
68 print(session, session.host, "Client opened stream");
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
69 send("<?xml version='1.0'?>");
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
70 send(format("<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='%s' from='%s' version='1.0'>", session.streamid, session.host));
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
71
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
72 local features = {};
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
73 modulemanager.fire_event("stream-features", session, features);
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
74
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
75 send("<stream:features>");
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
76
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
77 for _, feature in ipairs(features) do
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
78 send_to_session(session, tostring(features));
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
79 end
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
80
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
81 send("</stream:features>");
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
82 log("info", "core", "Stream opened successfully");
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
83 session.notopen = nil;
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
84 end
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
85
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 return _M;