1 |
1 |
2 local tonumber, tostring = tonumber, tostring; |
2 local tonumber, tostring = tonumber, tostring; |
3 local ipairs, print= ipairs, print; |
3 local ipairs, pairs, print= ipairs, pairs, print; |
4 |
4 local collectgarbage = collectgarbage; |
5 local m_random = import("math", "random"); |
5 local m_random = import("math", "random"); |
6 local format = import("string", "format"); |
6 local format = import("string", "format"); |
7 |
7 |
8 local hosts = hosts; |
8 local hosts = hosts; |
|
9 local sessions = sessions; |
9 |
10 |
10 local modulemanager = require "core.modulemanager"; |
11 local modulemanager = require "core.modulemanager"; |
11 local log = require "util.logger".init("sessionmanager"); |
12 local log = require "util.logger".init("sessionmanager"); |
12 local error = error; |
13 local error = error; |
13 local uuid_generate = require "util.uuid".uuid_generate; |
14 local uuid_generate = require "util.uuid".uuid_generate; |
|
15 |
|
16 local newproxy = newproxy; |
|
17 local getmetatable = getmetatable; |
|
18 |
14 module "sessionmanager" |
19 module "sessionmanager" |
15 |
20 |
16 function new_session(conn) |
21 function new_session(conn) |
17 local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" }; |
22 local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" }; |
|
23 if true then |
|
24 session.trace = newproxy(true); |
|
25 getmetatable(session.trace).__gc = function () print("Session got collected") end; |
|
26 end |
18 local w = conn.write; |
27 local w = conn.write; |
19 session.send = function (t) w(tostring(t)); end |
28 session.send = function (t) w(tostring(t)); end |
20 return session; |
29 return session; |
21 end |
30 end |
22 |
31 |
23 function destroy_session(session) |
32 function destroy_session(session) |
|
33 if not (session and session.disconnect) then return; end |
|
34 log("debug", "Destroying session..."); |
|
35 session.disconnect(); |
|
36 if session.username then |
|
37 if session.resource then |
|
38 hosts[session.host].sessions[session.username].sessions[session.resource] = nil; |
|
39 end |
|
40 local nomore = true; |
|
41 for res, ssn in pairs(hosts[session.host].sessions[session.username]) do |
|
42 nomore = false; |
|
43 end |
|
44 if nomore then |
|
45 hosts[session.host].sessions[session.username] = nil; |
|
46 end |
|
47 end |
|
48 session.conn = nil; |
|
49 session.disconnect = nil; |
|
50 for k in pairs(session) do |
|
51 if k ~= "trace" then |
|
52 session[k] = nil; |
|
53 end |
|
54 end |
|
55 collectgarbage("collect"); |
|
56 collectgarbage("collect"); |
|
57 collectgarbage("collect"); |
|
58 collectgarbage("collect"); |
|
59 collectgarbage("collect"); |
24 end |
60 end |
25 |
61 |
26 function send_to_session(session, data) |
62 function send_to_session(session, data) |
27 log("debug", "Sending: %s", tostring(data)); |
63 log("debug", "Sending: %s", tostring(data)); |
28 session.conn.write(tostring(data)); |
64 session.conn.write(tostring(data)); |
32 session.username = username; |
68 session.username = username; |
33 session.resource = resource; |
69 session.resource = resource; |
34 if session.type == "c2s_unauthed" then |
70 if session.type == "c2s_unauthed" then |
35 session.type = "c2s"; |
71 session.type = "c2s"; |
36 end |
72 end |
|
73 return true; |
37 end |
74 end |
38 |
75 |
39 function bind_resource(session, resource) |
76 function bind_resource(session, resource) |
40 if not session.username then return false, "auth"; end |
77 if not session.username then return false, "auth"; end |
41 if session.resource then return false, "constraint"; end -- We don't support binding multiple resources |
78 if session.resource then return false, "constraint"; end -- We don't support binding multiple resources |