From 508f3ef88d1ddd4c18c3d618ad405dc0b3769f83 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 23 May 2018 20:02:52 +0200 Subject: [PATCH] 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. --- src/mod_push_sql.erl | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) 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) ->