aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2014-05-01 20:58:14 +0400
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2014-05-02 17:42:13 +0400
commit8e2bc8d19ea279d661f3944a9a7f91af7d648a93 (patch)
treeb26d879b0348b20048dd6b733eb8e24f287ae41f
parentProcess gen_server timeouts correctly (diff)
Check for 'max_user_sessions' option
-rw-r--r--src/ejabberd_sm.erl1
-rw-r--r--src/mod_sip_registrar.erl17
2 files changed, 13 insertions, 5 deletions
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
index 58debf0c1..3ef21ade4 100644
--- a/src/ejabberd_sm.erl
+++ b/src/ejabberd_sm.erl
@@ -56,6 +56,7 @@
get_session_pid/3,
get_user_info/3,
get_user_ip/3,
+ get_max_user_sessions/2,
is_existing_resource/3
]).
diff --git a/src/mod_sip_registrar.erl b/src/mod_sip_registrar.erl
index 386391327..602ef5bb3 100644
--- a/src/mod_sip_registrar.erl
+++ b/src/mod_sip_registrar.erl
@@ -198,7 +198,7 @@ unregister_session(US, SIPSocket, CallID, CSeq) ->
Msg = {delete, US, SIPSocket, CallID, CSeq},
call(Msg).
-write_session(#sip_session{us = US,
+write_session(#sip_session{us = {U, S} = US,
bindings = [#binding{socket = SIPSocket,
call_id = CallID,
expires = Expires,
@@ -216,10 +216,15 @@ write_session(#sip_session{us = US,
mnesia:dirty_write(
#sip_session{us = US, bindings = NewBindings});
{error, notfound} ->
- NewTRef = erlang:start_timer(Expires * 1000, self(), US),
- NewBindings = [Binding#binding{tref = NewTRef}|Bindings],
- mnesia:dirty_write(
- #sip_session{us = US, bindings = NewBindings})
+ MaxSessions = ejabberd_sm:get_max_user_sessions(U, S),
+ if length(Bindings) < MaxSessions ->
+ NewTRef = erlang:start_timer(Expires * 1000, self(), US),
+ NewBindings = [Binding#binding{tref = NewTRef}|Bindings],
+ mnesia:dirty_write(
+ #sip_session{us = US, bindings = NewBindings});
+ true ->
+ {error, too_many_sessions}
+ end
end;
[] ->
NewTRef = erlang:start_timer(Expires * 1000, self(), US),
@@ -307,5 +312,7 @@ make_status(cseq_out_of_order) ->
{500, <<"CSeq is Out of Order">>};
make_status(timeout) ->
{408, esip:reason(408)};
+make_status(too_many_sessions) ->
+ {503, <<"Too Many Registered Sessions">>};
make_status(_) ->
{500, esip:reason(500)}.