Wed, 08 Oct 2008 19:30:35 +0500
Load roster on resource bind
30 | 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; |
53
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
3 | local ipairs, pairs, print= ipairs, pairs, print; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
4 | local collectgarbage = collectgarbage; |
49
1cd2a8db392d
New "import" module to help tidy up all the local declarations at the top of modules
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
5 | local m_random = import("math", "random"); |
1cd2a8db392d
New "import" module to help tidy up all the local declarations at the top of modules
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
6 | local format = import("string", "format"); |
38 | 7 | |
8 | local hosts = hosts; | |
53
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
9 | local sessions = sessions; |
38 | 10 | |
40
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
11 | local modulemanager = require "core.modulemanager"; |
30 | 12 | 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
|
13 | local error = error; |
44
80d2ade0fd69
Add "uuid" library and make sessionmanager use this.
Matthew Wild <mwild1@gmail.com>
parents:
41
diff
changeset
|
14 | local uuid_generate = require "util.uuid".uuid_generate; |
77
531b981f2d17
Load roster on resource bind
Waqas Hussain <waqas20@gmail.com>
parents:
57
diff
changeset
|
15 | local rm_getroster = require "core.rostermanager".getroster |
53
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
16 | |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
17 | local newproxy = newproxy; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
18 | local getmetatable = getmetatable; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
19 | |
30 | 20 | module "sessionmanager" |
21 | ||
22 | function new_session(conn) | |
23 | local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" }; | |
53
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
24 | if true then |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
25 | session.trace = newproxy(true); |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
26 | getmetatable(session.trace).__gc = function () print("Session got collected") end; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
27 | end |
30 | 28 | local w = conn.write; |
29 | session.send = function (t) w(tostring(t)); end | |
30 | return session; | |
31 | end | |
32 | ||
38 | 33 | function destroy_session(session) |
53
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
34 | if not (session and session.disconnect) then return; end |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
35 | log("debug", "Destroying session..."); |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
36 | session.disconnect(); |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
37 | if session.username then |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
38 | if session.resource then |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
39 | hosts[session.host].sessions[session.username].sessions[session.resource] = nil; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
40 | end |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
41 | local nomore = true; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
42 | for res, ssn in pairs(hosts[session.host].sessions[session.username]) do |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
43 | nomore = false; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
44 | end |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
45 | if nomore then |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
46 | hosts[session.host].sessions[session.username] = nil; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
47 | end |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
48 | end |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
49 | session.conn = nil; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
50 | session.disconnect = nil; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
51 | for k in pairs(session) do |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
52 | if k ~= "trace" then |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
53 | session[k] = nil; |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
54 | end |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
55 | end |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
56 | collectgarbage("collect"); |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
57 | collectgarbage("collect"); |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
58 | collectgarbage("collect"); |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
59 | collectgarbage("collect"); |
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
60 | collectgarbage("collect"); |
38 | 61 | end |
62 | ||
30 | 63 | function send_to_session(session, data) |
38 | 64 | log("debug", "Sending: %s", tostring(data)); |
30 | 65 | session.conn.write(tostring(data)); |
66 | end | |
67 | ||
38 | 68 | function make_authenticated(session, username) |
69 | session.username = username; | |
70 | if session.type == "c2s_unauthed" then | |
71 | session.type = "c2s"; | |
72 | end | |
53
14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
Matthew Wild <mwild1@gmail.com>
parents:
49
diff
changeset
|
73 | return true; |
38 | 74 | end |
75 | ||
76 | function bind_resource(session, resource) | |
77 | if not session.username then return false, "auth"; end | |
78 | if session.resource then return false, "constraint"; end -- We don't support binding multiple resources | |
44
80d2ade0fd69
Add "uuid" library and make sessionmanager use this.
Matthew Wild <mwild1@gmail.com>
parents:
41
diff
changeset
|
79 | resource = resource or uuid_generate(); |
38 | 80 | --FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing |
81 | ||
82 | if not hosts[session.host].sessions[session.username] then | |
83 | hosts[session.host].sessions[session.username] = { sessions = {} }; | |
84 | else | |
85 | if hosts[session.host].sessions[session.username].sessions[resource] then | |
86 | -- Resource conflict | |
87 | return false, "conflict"; | |
88 | end | |
89 | end | |
90 | ||
91 | session.resource = resource; | |
92 | session.full_jid = session.username .. '@' .. session.host .. '/' .. resource; | |
93 | hosts[session.host].sessions[session.username].sessions[resource] = session; | |
94 | ||
77
531b981f2d17
Load roster on resource bind
Waqas Hussain <waqas20@gmail.com>
parents:
57
diff
changeset
|
95 | session.roster = rm_getroster(session.username, session.host); |
531b981f2d17
Load roster on resource bind
Waqas Hussain <waqas20@gmail.com>
parents:
57
diff
changeset
|
96 | |
38 | 97 | return true; |
98 | end | |
99 | ||
40
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
100 | function streamopened(session, attr) |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
101 | local send = session.send; |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
102 | 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
|
103 | 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
|
104 | session.streamid = m_random(1000000, 99999999); |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
105 | 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
|
106 | send("<?xml version='1.0'?>"); |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
107 | 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
|
108 | |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
109 | local features = {}; |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
110 | 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
|
111 | |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
112 | send("<stream:features>"); |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
113 | |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
114 | for _, feature in ipairs(features) do |
41
68297fef35ff
An oops in sessionmanager stream:features code :)
Matthew Wild <mwild1@gmail.com>
parents:
40
diff
changeset
|
115 | send_to_session(session, tostring(feature)); |
40
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
116 | end |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
117 | |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
118 | send("</stream:features>"); |
49
1cd2a8db392d
New "import" module to help tidy up all the local declarations at the top of modules
Matthew Wild <mwild1@gmail.com>
parents:
44
diff
changeset
|
119 | log("info", "Stream opened successfully"); |
40
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
120 | session.notopen = nil; |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
121 | end |
2c0147bbd81a
Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents:
38
diff
changeset
|
122 | |
30 | 123 | return _M; |