Annotate

core/sessionmanager.lua @ 357:17bcecb06420

Use a stanza for c2s stream features instead of an array of strings. Removes a FIXME.
author Matthew Wild <mwild1@gmail.com>
date Thu, 20 Nov 2008 01:33:25 +0000
parent 356:8ff322b550a3
child 429:b1d86f89fa27
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;
126
63863534b1f1 Final fix for marking user offline when all resources are gone :)
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
3 local ipairs, pairs, print, next= ipairs, pairs, print, next;
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
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
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
7
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
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
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
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
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
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;
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 126
diff changeset
14 local uuid_generate = require "util.uuid".generate;
101
c690fa382743 Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents: 77
diff changeset
15 local rm_load_roster = require "core.rostermanager".load_roster;
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
339
c6446bbfe40c Fix sending of unavailable presence on disconnect
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
17 local st = require "util.stanza";
c6446bbfe40c Fix sending of unavailable presence on disconnect
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
18
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
19 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
20 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
21
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 module "sessionmanager"
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23
123
ebd65feb188c Fix for not destroying sessions when connection closed.
Matthew Wild <mwild1@gmail.com>
parents: 118
diff changeset
24 local open_sessions = 0;
ebd65feb188c Fix for not destroying sessions when connection closed.
Matthew Wild <mwild1@gmail.com>
parents: 118
diff changeset
25
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 function new_session(conn)
99
ba08b8a4eeef Abstract connections with "connection listeners"
Matthew Wild <mwild1@gmail.com>
parents: 77
diff changeset
27 local session = { conn = conn, 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
28 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
29 session.trace = newproxy(true);
123
ebd65feb188c Fix for not destroying sessions when connection closed.
Matthew Wild <mwild1@gmail.com>
parents: 118
diff changeset
30 getmetatable(session.trace).__gc = function () open_sessions = open_sessions - 1; print("Session got collected, now "..open_sessions.." sessions are allocated") 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
31 end
123
ebd65feb188c Fix for not destroying sessions when connection closed.
Matthew Wild <mwild1@gmail.com>
parents: 118
diff changeset
32 open_sessions = open_sessions + 1;
356
8ff322b550a3 Log number of open sessions on session creation
Matthew Wild <mwild1@gmail.com>
parents: 339
diff changeset
33 log("info", "open sessions now: ".. open_sessions);
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 local w = conn.write;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 session.send = function (t) w(tostring(t)); end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 return session;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
339
c6446bbfe40c Fix sending of unavailable presence on disconnect
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
39 function destroy_session(session, err)
156
884c43c7028a Fix for sessionmanager to not throw error when session doesn't have a private logger
Matthew Wild <mwild1@gmail.com>
parents: 150
diff changeset
40 (session.log or log)("info", "Destroying session");
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
41
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
42 -- Send unavailable presence
332
51e130b5c8de Remove useless check for unavailable presence (which never exists)
Matthew Wild <mwild1@gmail.com>
parents: 331
diff changeset
43 if session.presence then
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
44 local pres = st.presence{ type = "unavailable" };
339
c6446bbfe40c Fix sending of unavailable presence on disconnect
Matthew Wild <mwild1@gmail.com>
parents: 333
diff changeset
45 if (not err) or err == "closed" then err = "connection closed"; end
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
46 pres:tag("status"):text("Disconnected: "..err);
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
47 session.stanza_dispatch(pres);
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
48 end
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
49
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
50 -- Remove session/resource from user's session list
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
51 if session.host and session.username then
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
52 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
53 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
54 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
55 if hosts[session.host] and hosts[session.host].sessions[session.username] then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
56 if not next(hosts[session.host].sessions[session.username].sessions) then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
57 log("debug", "All resources of %s are now offline", session.username);
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
58 hosts[session.host].sessions[session.username] = nil;
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
59 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
60 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
61 end
331
830fd67f9378 Quite some changes, to:
Matthew Wild <mwild1@gmail.com>
parents: 329
diff changeset
62
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
63 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
64 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
65 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
66 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
67 end
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
68 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
69
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
70 function make_authenticated(session, username)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
71 session.username = username;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
72 if session.type == "c2s_unauthed" then
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
73 session.type = "c2s";
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
74 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
75 return true;
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
76 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
77
304
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
78 -- returns true, nil on success
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
79 -- returns nil, err_type, err, err_message on failure
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
80 function bind_resource(session, resource)
304
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
81 if not session.username then return nil, "auth", "not-authorized", "Cannot bind resource before authentication"; end
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
82 if session.resource then return nil, "cancel", "already-bound", "Cannot bind multiple resources on a single connection"; end
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
83 -- We don't support binding multiple resources
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
84
44
80d2ade0fd69 Add "uuid" library and make sessionmanager use this.
Matthew Wild <mwild1@gmail.com>
parents: 41
diff changeset
85 resource = resource or uuid_generate();
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
86 --FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
87
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
88 if not hosts[session.host].sessions[session.username] then
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
89 hosts[session.host].sessions[session.username] = { sessions = {} };
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
90 else
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
91 if hosts[session.host].sessions[session.username].sessions[resource] then
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
92 -- Resource conflict
304
7b28fa8bbfe5 Code cleanup for resource binding
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
93 return nil, "cancel", "conflict", "Resource already exists"; -- TODO kick old resource
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
94 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
95 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
96
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
97 session.resource = resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
98 session.full_jid = session.username .. '@' .. session.host .. '/' .. resource;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
99 hosts[session.host].sessions[session.username].sessions[resource] = session;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
100
101
c690fa382743 Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents: 77
diff changeset
101 session.roster = rm_load_roster(session.username, session.host);
77
531b981f2d17 Load roster on resource bind
Waqas Hussain <waqas20@gmail.com>
parents: 57
diff changeset
102
38
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
103 return true;
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
104 end
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
105
40
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
106 function streamopened(session, attr)
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
107 local send = session.send;
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
108 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
109 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
110 session.streamid = m_random(1000000, 99999999);
329
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
111 (session.log or session)("debug", "Client sent opening <stream:stream> to %s", session.host);
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
112
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
113
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
114 send("<?xml version='1.0'?>");
40
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
115 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
116
329
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
117 if not hosts[session.host] then
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
118 -- We don't serve this host...
333
8d15b073fdbe session:disconnect() -> session:close() for consistency with other Lua APIs
Matthew Wild <mwild1@gmail.com>
parents: 332
diff changeset
119 session:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)};
329
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
120 return;
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
121 end
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
122
3be63719428e Allow us to close client connections, with or without a stream error. Partially fixes #8, we still need the same for s2s (though it should be almost a straight copy of the code, I'm too tired atm)
Matthew Wild <mwild1@gmail.com>
parents: 317
diff changeset
123
357
17bcecb06420 Use a stanza for c2s stream features instead of an array of strings. Removes a FIXME.
Matthew Wild <mwild1@gmail.com>
parents: 356
diff changeset
124 local features = st.stanza("stream:features");
40
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
125 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
126
357
17bcecb06420 Use a stanza for c2s stream features instead of an array of strings. Removes a FIXME.
Matthew Wild <mwild1@gmail.com>
parents: 356
diff changeset
127 send(features);
40
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
128
357
17bcecb06420 Use a stanza for c2s stream features instead of an array of strings. Removes a FIXME.
Matthew Wild <mwild1@gmail.com>
parents: 356
diff changeset
129 (session.log or log)("info", "Sent reply <stream:stream> to client");
40
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
130 session.notopen = nil;
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
131 end
2c0147bbd81a Move stream opening handling from xmlhandlers to sessionmanager
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
132
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
133 function send_to_available_resources(user, host, stanza)
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
134 local count = 0;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
135 local to = stanza.attr.to;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
136 stanza.attr.to = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
137 local h = hosts[host];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
138 if h and h.type == "local" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
139 local u = h.sessions[user];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
140 if u then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
141 for k, session in pairs(u.sessions) do
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
142 if session.presence then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
143 session.send(stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
144 count = count + 1;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
145 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
146 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
147 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
148 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
149 stanza.attr.to = to;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
150 return count;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
151 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 156
diff changeset
152
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 return _M;