core/sessionmanager.lua

changeset 429
b1d86f89fa27
parent 357
17bcecb06420
child 519
cccd610a0ef9
equal deleted inserted replaced
426:3d8778059e90 429:b1d86f89fa27
11 local modulemanager = require "core.modulemanager"; 11 local modulemanager = require "core.modulemanager";
12 local log = require "util.logger".init("sessionmanager"); 12 local log = require "util.logger".init("sessionmanager");
13 local error = error; 13 local error = error;
14 local uuid_generate = require "util.uuid".generate; 14 local uuid_generate = require "util.uuid".generate;
15 local rm_load_roster = require "core.rostermanager".load_roster; 15 local rm_load_roster = require "core.rostermanager".load_roster;
16 local config_get = require "core.configmanager".get;
16 17
17 local st = require "util.stanza"; 18 local st = require "util.stanza";
18 19
19 local newproxy = newproxy; 20 local newproxy = newproxy;
20 local getmetatable = getmetatable; 21 local getmetatable = getmetatable;
86 --FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing 87 --FIXME: Randomly-generated resources must be unique per-user, and never conflict with existing
87 88
88 if not hosts[session.host].sessions[session.username] then 89 if not hosts[session.host].sessions[session.username] then
89 hosts[session.host].sessions[session.username] = { sessions = {} }; 90 hosts[session.host].sessions[session.username] = { sessions = {} };
90 else 91 else
91 if hosts[session.host].sessions[session.username].sessions[resource] then 92 local sessions = hosts[session.host].sessions[session.username].sessions;
93 local limit = config_get(session.host, "core", "max_resources") or 10;
94 if #sessions >= limit then
95 return nil, "cancel", "conflict", "Resource limit reached; only "..limit.." resources allowed";
96 end
97 if sessions[resource] then
92 -- Resource conflict 98 -- Resource conflict
93 return nil, "cancel", "conflict", "Resource already exists"; -- TODO kick old resource 99 local policy = config_get(session.host, "core", "conflict_resolve");
100 local increment;
101 if policy == "random" then
102 resource = uuid_generate();
103 increment = true;
104 elseif policy == "increment" then
105 increment = true; -- TODO ping old resource
106 elseif policy == "kick_new" then
107 return nil, "cancel", "conflict", "Resource already exists";
108 else -- if policy == "kick_old" then
109 hosts[session.host].sessions[session.username].sessions[resource]:close {
110 condition = "conflict";
111 text = "Replaced by new connection";
112 };
113 end
114 if increment and sessions[resource] then
115 local count = 1;
116 while sessions[resource.."#"..count] do
117 count = count + 1;
118 end
119 resource = resource.."#"..count;
120 end
94 end 121 end
95 end 122 end
96 123
97 session.resource = resource; 124 session.resource = resource;
98 session.full_jid = session.username .. '@' .. session.host .. '/' .. resource; 125 session.full_jid = session.username .. '@' .. session.host .. '/' .. resource;

mercurial