core/sessionmanager.lua
author Matthew Wild <mwild1@gmail.com>
Thu, 02 Oct 2008 01:08:58 +0100
changeset 38 3fdfd6e0cb4e
parent 30 bcf539295f2d
child 40 2c0147bbd81a
permissions -rw-r--r--
SASL! (but before you get too excited, no resource binding yet. And yes, there are still plenty of rough edges to the code...) ((eg. must move <stream:features> out of xmlhandlers.lua o_O ))
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
local tostring = tostring;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
     4
local print = print;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
     5
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
     6
local hosts = hosts;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
     7
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
local log = require "util.logger".init("sessionmanager");
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
module "sessionmanager"
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
function new_session(conn)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
	local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" };
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
	local w = conn.write;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
	session.send = function (t) w(tostring(t)); end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
	return session;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    19
function destroy_session(session)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    20
end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    21
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
function send_to_session(session, data)
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    23
	log("debug", "Sending: %s", tostring(data));
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
	session.conn.write(tostring(data));
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    27
function make_authenticated(session, username)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    28
	session.username = username;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    29
	session.resource = resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    30
	if session.type == "c2s_unauthed" then
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    31
		session.type = "c2s";
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    32
	end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    33
end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    34
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    35
function bind_resource(session, resource)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    36
	if not session.username then return false, "auth"; end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    37
	if session.resource then return false, "constraint"; end -- We don't support binding multiple resources
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    38
	resource = resource or math.random(100000, 99999999); -- FIXME: Clearly we have issues :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    39
	--FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    40
	
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    41
	if not hosts[session.host].sessions[session.username] then
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    42
		hosts[session.host].sessions[session.username] = { sessions = {} };
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    43
	else
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    44
		if hosts[session.host].sessions[session.username].sessions[resource] then
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    45
			-- Resource conflict
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    46
			return false, "conflict";
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    47
		end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    48
	end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    49
	
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    50
	session.resource = resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    51
	session.full_jid = session.username .. '@' .. session.host .. '/' .. resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    52
	hosts[session.host].sessions[session.username].sessions[resource] = session;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    53
	
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    54
	return true;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    55
end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
    56
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
return _M;