From a61b0c303d919fb8e1850518b0f0b6ae7ced6850 Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Wed, 13 Jan 2016 21:38:08 +0100 Subject: [PATCH] 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. --- src/mod_mam.erl | 62 ++++++++++++++++++++++++++++++++++++++++++------- 1 file 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].