diff options
author | Badlop <badlop@process-one.net> | 2009-06-15 17:43:18 +0000 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2009-06-15 17:43:18 +0000 |
commit | e0370d89b4564ef2b83ce02d12106a6ace6323ae (patch) | |
tree | efb86192e403efbda9f79cd5cfa7f2e5c62fbc7e /src/mod_offline_odbc.erl | |
parent | Replace TYPE/1 with is_TYPE/1 (EJAB-922) (diff) |
Add option to restrict max offline messages by Access and ACL (EJAB-951)
New option for mod_offline: access_max_user_messages.
The old option user_max_messages is no longer supported.
SVN Revision: 2162
Diffstat (limited to '')
-rw-r--r-- | src/mod_offline_odbc.erl | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/src/mod_offline_odbc.erl b/src/mod_offline_odbc.erl index 3a61374dc..507da1f11 100644 --- a/src/mod_offline_odbc.erl +++ b/src/mod_offline_odbc.erl @@ -32,7 +32,7 @@ -export([count_offline_messages/2]). -export([start/2, - init/2, + loop/2, stop/1, store_packet/3, pop_offline_messages/3, @@ -51,6 +51,9 @@ -define(PROCNAME, ejabberd_offline). -define(OFFLINE_TABLE_LOCK_THRESHOLD, 1000). +%% default value for the maximum number of user messages +-define(MAX_USER_MESSAGES, infinity). + start(Host, Opts) -> ejabberd_hooks:add(offline_message_hook, Host, ?MODULE, store_packet, 50), @@ -66,22 +69,17 @@ start(Host, Opts) -> ?MODULE, webadmin_user, 50), ejabberd_hooks:add(webadmin_user_parse_query, Host, ?MODULE, webadmin_user_parse_query, 50), - MaxOfflineMsgs = gen_mod:get_opt(user_max_messages, Opts, infinity), + AccessMaxOfflineMsgs = gen_mod:get_opt(access_max_user_messages, Opts, max_user_offline_messages), register(gen_mod:get_module_proc(Host, ?PROCNAME), - spawn(?MODULE, init, [Host, MaxOfflineMsgs])). - -%% MaxOfflineMsgs is either infinity of integer > 0 -init(Host, infinity) -> - loop(Host, infinity); -init(Host, MaxOfflineMsgs) - when is_integer(MaxOfflineMsgs), MaxOfflineMsgs > 0 -> - loop(Host, MaxOfflineMsgs). + spawn(?MODULE, loop, [Host, AccessMaxOfflineMsgs])). -loop(Host, MaxOfflineMsgs) -> +loop(Host, AccessMaxOfflineMsgs) -> receive #offline_msg{user = User} = Msg -> Msgs = receive_all(User, [Msg]), Len = length(Msgs), + MaxOfflineMsgs = get_max_user_messages(AccessMaxOfflineMsgs, + User, Host), %% Only count existing messages if needed: Count = if MaxOfflineMsgs =/= infinity -> @@ -125,9 +123,18 @@ loop(Host, MaxOfflineMsgs) -> ok end end, - loop(Host, MaxOfflineMsgs); + loop(Host, AccessMaxOfflineMsgs); _ -> - loop(Host, MaxOfflineMsgs) + loop(Host, AccessMaxOfflineMsgs) + end. + +%% Function copied from ejabberd_sm.erl: +get_max_user_messages(AccessRule, LUser, Host) -> + case acl:match_rule( + Host, AccessRule, jlib:make_jid(LUser, Host, "")) of + Max when is_integer(Max) -> Max; + infinity -> infinity; + _ -> ?MAX_USER_MESSAGES end. receive_all(Username, Msgs) -> |