Added options to limit the number of resources and for handling of resource conflicts

Thu, 27 Nov 2008 02:48:08 +0500

author
Waqas Hussain <waqas20@gmail.com>
date
Thu, 27 Nov 2008 02:48:08 +0500
changeset 429
b1d86f89fa27
parent 426
3d8778059e90
child 430
f9b43bb9d807

Added options to limit the number of resources and for handling of resource conflicts
- core.max_resources: defaults to 10
- core.conflict_resolve: can be "random", "increment", "kick_new" and "kick_old" (default)

core/sessionmanager.lua file | annotate | diff | comparison | revisions
--- a/core/sessionmanager.lua	Wed Nov 26 09:47:16 2008 +0500
+++ b/core/sessionmanager.lua	Thu Nov 27 02:48:08 2008 +0500
@@ -13,6 +13,7 @@
 local error = error;
 local uuid_generate = require "util.uuid".generate;
 local rm_load_roster = require "core.rostermanager".load_roster;
+local config_get = require "core.configmanager".get;
 
 local st = require "util.stanza";
 
@@ -88,9 +89,35 @@
 	if not hosts[session.host].sessions[session.username] then
 		hosts[session.host].sessions[session.username] = { sessions = {} };
 	else
-		if hosts[session.host].sessions[session.username].sessions[resource] then
+		local sessions = hosts[session.host].sessions[session.username].sessions;
+		local limit = config_get(session.host, "core", "max_resources") or 10;
+		if #sessions >= limit then
+			return nil, "cancel", "conflict", "Resource limit reached; only "..limit.." resources allowed";
+		end
+		if sessions[resource] then
 			-- Resource conflict
-			return nil, "cancel", "conflict", "Resource already exists"; -- TODO kick old resource
+			local policy = config_get(session.host, "core", "conflict_resolve");
+			local increment;
+			if policy == "random" then
+				resource = uuid_generate();
+				increment = true;
+			elseif policy == "increment" then
+				increment = true; -- TODO ping old resource
+			elseif policy == "kick_new" then
+				return nil, "cancel", "conflict", "Resource already exists";
+			else -- if policy == "kick_old" then
+				hosts[session.host].sessions[session.username].sessions[resource]:close {
+					condition = "conflict";
+					text = "Replaced by new connection";
+				};
+			end
+			if increment and sessions[resource] then
+				local count = 1;
+				while sessions[resource.."#"..count] do
+					count = count + 1;
+				end
+				resource = resource.."#"..count;
+			end
 		end
 	end
 	

mercurial