aboutsummaryrefslogtreecommitdiff
path: root/src/mod_offline_odbc.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2009-06-15 17:43:18 +0000
committerBadlop <badlop@process-one.net>2009-06-15 17:43:18 +0000
commite0370d89b4564ef2b83ce02d12106a6ace6323ae (patch)
treeefb86192e403efbda9f79cd5cfa7f2e5c62fbc7e /src/mod_offline_odbc.erl
parentReplace 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.erl33
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) ->