aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd.cfg.example5
-rw-r--r--src/mod_offline.erl34
-rw-r--r--src/mod_offline_odbc.erl33
3 files changed, 45 insertions, 27 deletions
diff --git a/src/ejabberd.cfg.example b/src/ejabberd.cfg.example
index b0fcecadb..ebcd44ed0 100644
--- a/src/ejabberd.cfg.example
+++ b/src/ejabberd.cfg.example
@@ -379,6 +379,9 @@
%% Maximum number of simultaneous sessions allowed for a single user:
{access, max_user_sessions, [{10, all}]}.
+%% Maximum number of offline messages that users can have:
+{access, max_user_offline_messages, [{5000, admin}, {100, all}]},
+
%% This rule allows access only for local users:
{access, local, [{allow, local}]}.
@@ -481,7 +484,7 @@
{access_admin, muc_admin}
]},
%%{mod_muc_log,[]},
- {mod_offline, []},
+ {mod_offline, [{access_max_user_messages, max_user_offline_messages}]},
{mod_privacy, []},
{mod_private, []},
%%{mod_proxy65,[]},
diff --git a/src/mod_offline.erl b/src/mod_offline.erl
index e3898eb4f..c9fe276c1 100644
--- a/src/mod_offline.erl
+++ b/src/mod_offline.erl
@@ -30,7 +30,7 @@
-behaviour(gen_mod).
-export([start/2,
- init/1,
+ loop/1,
stop/1,
store_packet/3,
resend_offline_messages/2,
@@ -52,6 +52,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) ->
mnesia:create_table(offline_msg,
[{disc_only_copies, [node()]},
@@ -72,22 +75,18 @@ 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, [MaxOfflineMsgs])).
-
-%% MaxOfflineMsgs is either infinity of integer > 0
-init(infinity) ->
- loop(infinity);
-init(MaxOfflineMsgs)
- when is_integer(MaxOfflineMsgs), MaxOfflineMsgs > 0 ->
- loop(MaxOfflineMsgs).
+ spawn(?MODULE, loop, [AccessMaxOfflineMsgs])).
-loop(MaxOfflineMsgs) ->
+loop(AccessMaxOfflineMsgs) ->
receive
#offline_msg{us=US} = Msg ->
Msgs = receive_all(US, [Msg]),
Len = length(Msgs),
+ {User, Host} = US,
+ MaxOfflineMsgs = get_max_user_messages(AccessMaxOfflineMsgs,
+ User, Host),
F = fun() ->
%% Only count messages if needed:
Count = if MaxOfflineMsgs =/= infinity ->
@@ -113,9 +112,18 @@ loop(MaxOfflineMsgs) ->
end
end,
mnesia:transaction(F),
- loop(MaxOfflineMsgs);
+ loop(AccessMaxOfflineMsgs);
_ ->
- loop(MaxOfflineMsgs)
+ loop(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(US, Msgs) ->
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) ->