diff options
author | Badlop <badlop@process-one.net> | 2011-08-17 19:42:11 +0200 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2011-08-17 19:44:39 +0200 |
commit | a0f8a2c3a4f5d30a4a48adc18e252cfcc47d6ea0 (patch) | |
tree | 41402c6d9c90585044ec3f025392e3b2caf783a4 /src/ejabberd_sm.erl | |
parent | Fix 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.erl | 19 |
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 |