aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2018-05-23 20:02:52 +0200
committerHolger Weiss <holger@zedat.fu-berlin.de>2018-05-23 20:02:52 +0200
commit508f3ef88d1ddd4c18c3d618ad405dc0b3769f83 (patch)
tree56da8701024ab9483029a3790a93a83e7d88acfd
parentHandle "Expect: 100-continue" request header in ejabberd_http (diff)
mod_push_sql: Check 'max_user_sessions' limit
Remove the oldest push session(s) of a user if the number of enabled sessions exceeds the 'max_user_sessions' limit.
-rw-r--r--src/mod_push_sql.erl20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/mod_push_sql.erl b/src/mod_push_sql.erl
index 9fbb55123..5879e163a 100644
--- a/src/mod_push_sql.erl
+++ b/src/mod_push_sql.erl
@@ -48,6 +48,8 @@ store_session(LUser, LServer, NowTS, PushJID, Node, XData) ->
TS = misc:now_to_usec(NowTS),
PushLJID = jid:tolower(PushJID),
Service = jid:encode(PushLJID),
+ MaxSessions = ejabberd_sm:get_max_user_sessions(LUser, LServer),
+ enforce_max_sessions(LUser, LServer, MaxSessions),
case ?SQL_UPSERT(LServer, "push_session",
["!username=%(LUser)s",
"!server_host=%(LServer)s",
@@ -207,6 +209,24 @@ export(_Server) ->
%%%===================================================================
%%% Internal functions
%%%===================================================================
+enforce_max_sessions(_LUser, _LServer, infinity) ->
+ ok;
+enforce_max_sessions(LUser, LServer, MaxSessions) ->
+ case lookup_sessions(LUser, LServer) of
+ {ok, Sessions} when length(Sessions) >= MaxSessions ->
+ ?INFO_MSG("Disabling old push session(s) of ~s@~s",
+ [LUser, LServer]),
+ Sessions1 = lists:sort(fun({TS1, _, _, _}, {TS2, _, _, _}) ->
+ TS1 >= TS2
+ end, Sessions),
+ OldSessions = lists:nthtail(MaxSessions - 1, Sessions1),
+ lists:foreach(fun({TS, _, _, _}) ->
+ delete_session(LUser, LServer, TS)
+ end, OldSessions);
+ _ ->
+ ok
+ end.
+
decode_xdata(<<>>, _LUser, _LServer) ->
undefined;
decode_xdata(XML, LUser, LServer) ->