aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_sm.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2011-08-17 19:42:11 +0200
committerBadlop <badlop@process-one.net>2011-08-17 19:44:39 +0200
commita0f8a2c3a4f5d30a4a48adc18e252cfcc47d6ea0 (patch)
tree41402c6d9c90585044ec3f025392e3b2caf783a4 /src/ejabberd_sm.erl
parentFix bug in scram is_alpha (diff)
New option resource_conflict defines server action (thanks to Lee Boynton)(EJAB-650)
Diffstat (limited to 'src/ejabberd_sm.erl')
-rw-r--r--src/ejabberd_sm.erl19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
index 950b551a3..80076db52 100644
--- a/src/ejabberd_sm.erl
+++ b/src/ejabberd_sm.erl
@@ -53,7 +53,8 @@
user_resources/2,
get_session_pid/3,
get_user_info/3,
- get_user_ip/3
+ get_user_ip/3,
+ is_existing_resource/3
]).
%% gen_server callbacks
@@ -639,14 +640,11 @@ check_for_sessions_to_replace(User, Server, Resource) ->
check_max_sessions(LUser, LServer).
check_existing_resources(LUser, LServer, LResource) ->
- USR = {LUser, LServer, LResource},
- %% A connection exist with the same resource. We replace it:
- SIDs = mnesia:dirty_select(
- session,
- [{#session{sid = '$1', usr = USR, _ = '_'}, [], ['$1']}]),
+ SIDs = get_resource_sessions(LUser, LServer, LResource),
if
SIDs == [] -> ok;
true ->
+ %% A connection exist with the same resource. We replace it:
MaxSID = lists:max(SIDs),
lists:foreach(
fun({_, Pid} = S) when S /= MaxSID ->
@@ -655,6 +653,15 @@ check_existing_resources(LUser, LServer, LResource) ->
end, SIDs)
end.
+is_existing_resource(LUser, LServer, LResource) ->
+ [] /= get_resource_sessions(LUser, LServer, LResource).
+
+get_resource_sessions(User, Server, Resource) ->
+ USR = {jlib:nodeprep(User), jlib:nameprep(Server), jlib:resourceprep(Resource)},
+ mnesia:dirty_select(
+ session,
+ [{#session{sid = '$1', usr = USR, _ = '_'}, [], ['$1']}]).
+
check_max_sessions(LUser, LServer) ->
%% If the max number of sessions for a given is reached, we replace the
%% first one