Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2016-01-13 23:38:08 +0300
committerHolger Weiss <holger@zedat.fu-berlin.de>2016-01-13 23:38:08 +0300
commita61b0c303d919fb8e1850518b0f0b6ae7ced6850 (patch)
tree384c3dabae0975eb4818933a53b075f039a82359 /src/mod_mam.erl
parent0183b2487e4e5cc0033eb7ad0c8a6f0165c495a5 (diff)
mod_mam: Add "request_activates_archiving" option
Enabling "request_activates_archiving" tells mod_mam not to store any messages for a user until his client issued a MAM request, regardless of mod_mam's "default" option. Once a MAM request is issued, messages are archived as usual.
Diffstat (limited to 'src/mod_mam.erl')
-rw-r--r--src/mod_mam.erl62
1 files changed, 53 insertions, 9 deletions
diff --git a/src/mod_mam.erl b/src/mod_mam.erl
index ae6ab3d4d..1bcb5bc18 100644
--- a/src/mod_mam.erl
+++ b/src/mod_mam.erl
@@ -360,7 +360,13 @@ process_iq(#jid{luser = LUser, lserver = LServer},
process_iq(_, _, #iq{sub_el = SubEl} = IQ) ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}.
-process_iq(LServer, From, To, IQ, SubEl, Fs, MsgType) ->
+process_iq(LServer, #jid{luser = LUser} = From, To, IQ, SubEl, Fs, MsgType) ->
+ case MsgType of
+ chat ->
+ maybe_activate_mam(LUser, LServer);
+ {groupchat, _Role, _MUCState} ->
+ ok
+ end,
case catch lists:foldl(
fun({<<"start">>, [Data|_]}, {_, End, With, RSM}) ->
{{_, _, _} = jlib:datetime_string_to_timestamp(Data),
@@ -620,13 +626,21 @@ get_prefs(LUser, LServer) ->
{ok, Prefs} ->
Prefs;
error ->
- Default = gen_mod:get_module_opt(
- LServer, ?MODULE, default,
- fun(always) -> always;
- (never) -> never;
- (roster) -> roster
- end, never),
- #archive_prefs{us = {LUser, LServer}, default = Default}
+ ActivateOpt = gen_mod:get_module_opt(
+ LServer, ?MODULE, request_activates_archiving,
+ fun(B) when is_boolean(B) -> B end, false),
+ case ActivateOpt of
+ true ->
+ #archive_prefs{us = {LUser, LServer}, default = never};
+ false ->
+ Default = gen_mod:get_module_opt(
+ LServer, ?MODULE, default,
+ fun(always) -> always;
+ (never) -> never;
+ (roster) -> roster
+ end, never),
+ #archive_prefs{us = {LUser, LServer}, default = Default}
+ end
end.
get_prefs(LUser, LServer, mnesia) ->
@@ -654,6 +668,34 @@ get_prefs(LUser, LServer, odbc) ->
error
end.
+maybe_activate_mam(LUser, LServer) ->
+ ActivateOpt = gen_mod:get_module_opt(LServer, ?MODULE,
+ request_activates_archiving,
+ fun(B) when is_boolean(B) -> B end,
+ false),
+ case ActivateOpt of
+ true ->
+ Res = cache_tab:lookup(archive_prefs, {LUser, LServer},
+ fun() ->
+ get_prefs(LUser, LServer,
+ gen_mod:db_type(LServer,
+ ?MODULE))
+ end),
+ case Res of
+ {ok, _Prefs} ->
+ ok;
+ error ->
+ Default = gen_mod:get_module_opt(LServer, ?MODULE, default,
+ fun(always) -> always;
+ (never) -> never;
+ (roster) -> roster
+ end, never),
+ write_prefs(LUser, LServer, LServer, Default, [], [])
+ end;
+ false ->
+ ok
+ end.
+
select_and_send(LServer, From, To, Start, End, With, RSM, IQ, MsgType) ->
DBType = case gen_mod:db_type(LServer, ?MODULE) of
odbc -> {odbc, LServer};
@@ -1131,8 +1173,10 @@ mod_opt_type(default) ->
(roster) -> roster
end;
mod_opt_type(iqdisc) -> fun gen_iq_handler:check_type/1;
+mod_opt_type(request_activates_archiving) ->
+ fun (B) when is_boolean(B) -> B end;
mod_opt_type(store_body_only) ->
fun (B) when is_boolean(B) -> B end;
mod_opt_type(_) ->
[cache_life_time, cache_size, db_type, default, iqdisc,
- store_body_only].
+ request_activates_archiving, store_body_only].