diff --git a/big_tests/tests/amp_big_SUITE.erl b/big_tests/tests/amp_big_SUITE.erl index 59b35b18654..ec66748682f 100644 --- a/big_tests/tests/amp_big_SUITE.erl +++ b/big_tests/tests/amp_big_SUITE.erl @@ -152,7 +152,7 @@ setup_meck(suite) -> ok = rpc(mim(), meck, new, [ejabberd_socket, [passthrough, no_link]]), ok = rpc(mim(), amp_test_helper, setup_meck, []); setup_meck(mam_failure) -> - ok = rpc(mim(), meck, expect, [mod_mam_rdbms_arch, archive_message, 3, {error, simulated}]); + ok = rpc(mim(), meck, expect, [mod_mam_rdbms_arch, archive_message, 3, {ok, {error, simulated}}]); setup_meck(offline_failure) -> ok = rpc(mim(), meck, expect, [mod_offline_mnesia, write_messages, 4, {error, simulated}]); setup_meck(_) -> ok. diff --git a/big_tests/tests/mam_send_message_SUITE_data/mam_send_message_example.erl b/big_tests/tests/mam_send_message_SUITE_data/mam_send_message_example.erl index ea536cdc78c..fcdfe959fd4 100644 --- a/big_tests/tests/mam_send_message_SUITE_data/mam_send_message_example.erl +++ b/big_tests/tests/mam_send_message_SUITE_data/mam_send_message_example.erl @@ -16,27 +16,28 @@ start(HostType, _Opts) -> - ejabberd_hooks:add(hooks(HostType)). + gen_hook:add_handlers(hooks(HostType)). stop(HostType) -> - ejabberd_hooks:delete(hooks(HostType)). + gen_hook:delete_handlers(hooks(HostType)). supported_features() -> [dynamic_domains]. hooks(HostType) -> - [{mam_lookup_messages, HostType, ?MODULE, lookup_messages, 60}, - {mam_muc_lookup_messages, HostType, ?MODULE, lookup_messages, 60}]. + [{mam_lookup_messages, HostType, fun ?MODULE:lookup_messages/3, #{}, 60}, + {mam_muc_lookup_messages, HostType, fun ?MODULE:lookup_messages/3, #{}, 60}]. %% caller_jid could be used for privacy checking or per-user customization -lookup_messages({error, _Reason} = Result, _Host, _Params) -> - Result; +lookup_messages({error, _Reason} = Result, _Params, _Extra) -> + {ok, Result}; lookup_messages({ok, {TotalCount, Offset, MessageRows}}, - Host, _Params = #{owner_jid := ArcJID, caller_jid := _CallerJID}) -> - MessageRows2 = [extend_message(Host, ArcJID, Row) || Row <- MessageRows], - {ok, {TotalCount, Offset, MessageRows2}}. + #{owner_jid := ArcJID, caller_jid := _CallerJID} = _Params, + #{host_type := HostType}) -> + MessageRows2 = [extend_message(HostType, ArcJID, Row) || Row <- MessageRows], + {ok, {ok, {TotalCount, Offset, MessageRows2}}}. -extend_message(_Host, _ArcJID, Row = #{}) -> +extend_message(_HostType, _ArcJID, Row = #{}) -> %% Extend a message with a new field %% Usually extracted from a DB Row#{some_hash => erlang:phash2(Row, 32)}. diff --git a/src/event_pusher/mod_event_pusher_hook_translator.erl b/src/event_pusher/mod_event_pusher_hook_translator.erl index 5bcfabda6a1..ec724dfc748 100644 --- a/src/event_pusher/mod_event_pusher_hook_translator.erl +++ b/src/event_pusher/mod_event_pusher_hook_translator.erl @@ -58,7 +58,7 @@ filter_local_packet({From, To, Acc0, Packet}, _, _) -> -spec user_send_packet(Acc, Args, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Args :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). user_send_packet(Acc, _, _) -> Packet = mongoose_acc:packet(Acc), ChatType = chat_type(Acc), @@ -72,7 +72,7 @@ user_send_packet(Acc, _, _) -> -spec user_present(Acc, Args, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Args :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). user_present(Acc, #{jid := UserJID = #jid{}}, _) -> Event = #user_status_event{jid = UserJID, status = online}, NewAcc = mod_event_pusher:push_event(Acc, Event), @@ -81,7 +81,7 @@ user_present(Acc, #{jid := UserJID = #jid{}}, _) -> -spec user_not_present(Acc, Args, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Args :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). user_not_present(Acc, #{jid := UserJID}, _) -> Event = #user_status_event{jid = UserJID, status = offline}, NewAcc = mod_event_pusher:push_event(Acc, Event), @@ -90,7 +90,7 @@ user_not_present(Acc, #{jid := UserJID}, _) -> -spec unacknowledged_message(Acc, Args, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Args :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). unacknowledged_message(Acc, #{jid := Jid}, _) -> Event = #unack_msg_event{to = Jid}, NewAcc = mod_event_pusher:push_event(Acc, Event), diff --git a/src/gen_hook.erl b/src/gen_hook.erl index f157e189291..fedb7ba1d4e 100644 --- a/src/gen_hook.erl +++ b/src/gen_hook.erl @@ -37,11 +37,12 @@ host_type => mongooseim:host_type(), _ => _}. --type hook_fn_ret_value() :: {ok | stop, NewAccumulator :: hook_acc()}. +-type hook_fn_ret() :: hook_fn_ret(hook_acc()). +-type hook_fn_ret(Acc) :: {ok | stop, Acc}. -type hook_fn() :: %% see run_fold/4 documentation fun((Accumulator :: hook_acc(), ExecutionParameters :: hook_params(), - ExtraParameters :: extra()) -> hook_fn_ret_value()). + ExtraParameters :: extra()) -> hook_fn_ret()). -type key() :: {HookName :: atom(), Tag :: any()}. @@ -54,7 +55,7 @@ -type hook_list() :: [hook_tuple()]. --export_type([hook_fn/0, hook_list/0]). +-export_type([hook_fn/0, hook_list/0, hook_fn_ret/0, hook_fn_ret/1]). -record(hook_handler, {prio :: pos_integer(), hook_fn :: hook_fn(), @@ -122,7 +123,7 @@ delete_handler({HookName, Tag, _, _, _} = HookTuple) -> -spec run_fold(HookName :: hook_name(), Tag :: hook_tag(), Acc :: hook_acc(), - Params :: hook_params()) -> hook_fn_ret_value(). + Params :: hook_params()) -> hook_fn_ret(). run_fold(HookName, Tag, Acc, Params) -> Key = hook_key(HookName, Tag), case ets:lookup(?TABLE, Key) of @@ -200,7 +201,7 @@ code_change(_OldVsn, State, _Extra) -> %%%---------------------------------------------------------------------- %%% Internal functions %%%---------------------------------------------------------------------- --spec run_hook([#hook_handler{}], hook_acc(), hook_params(), key()) -> hook_fn_ret_value(). +-spec run_hook([#hook_handler{}], hook_acc(), hook_params(), key()) -> hook_fn_ret(). run_hook([], Acc, _Params, _Key) -> {ok, Acc}; run_hook([Handler | Ls], Acc, Params, Key) -> @@ -215,7 +216,7 @@ run_hook([Handler | Ls], Acc, Params, Key) -> end. -spec apply_hook_function(#hook_handler{}, hook_acc(), hook_params()) -> - hook_fn_ret_value() | {'EXIT', Reason :: any()}. + hook_fn_ret() | {'EXIT', Reason :: any()}. apply_hook_function(#hook_handler{hook_fn = HookFn, extra = Extra}, Acc, Params) -> safely:apply(HookFn, [Acc, Params, Extra]). diff --git a/src/global_distrib/mod_global_distrib_mapping.erl b/src/global_distrib/mod_global_distrib_mapping.erl index 8a224e60f2b..4a4c1378b3c 100644 --- a/src/global_distrib/mod_global_distrib_mapping.erl +++ b/src/global_distrib/mod_global_distrib_mapping.erl @@ -172,7 +172,7 @@ deps(_HostType, Opts) -> -spec session_opened(Acc, Params, Extra) -> {ok, Acc} when Acc :: any(), Params :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). session_opened(Acc, #{jid := UserJid}, _) -> insert_for_jid(UserJid), {ok, Acc}. @@ -180,7 +180,7 @@ session_opened(Acc, #{jid := UserJid}, _) -> -spec session_closed(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). session_closed(Acc, #{jid := UserJid}, _) -> delete_for_jid(UserJid), {ok, Acc}. @@ -188,7 +188,7 @@ session_closed(Acc, #{jid := UserJid}, _) -> -spec packet_to_component(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{from := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). packet_to_component(Acc, #{from := From}, _) -> mod_global_distrib_utils:maybe_update_mapping(From, Acc), {ok, Acc}. @@ -196,7 +196,7 @@ packet_to_component(Acc, #{from := From}, _) -> -spec register_subhost(Acc, Params, Extra) -> {ok, ok} when Acc :: any(), Params :: #{ldomain := binary(), is_hidden := boolean()}, - Extra :: map(). + Extra :: gen_hook:extra(). register_subhost(_, #{ldomain := SubHost, is_hidden := IsHidden}, _) -> IsSubhostOf = fun(Host) -> @@ -216,7 +216,7 @@ register_subhost(_, #{ldomain := SubHost, is_hidden := IsHidden}, _) -> -spec unregister_subhost(Acc, Params, Extra) -> {ok, ok} when Acc :: any(), Params :: #{ldomain := binary()}, - Extra :: map(). + Extra :: gen_hook:extra(). unregister_subhost(_, #{ldomain := SubHost}, _) -> {ok, delete_for_domain(SubHost)}. diff --git a/src/http_upload/mod_http_upload.erl b/src/http_upload/mod_http_upload.erl index 7d1e8be5dcf..bb063aaf1cc 100644 --- a/src/http_upload/mod_http_upload.erl +++ b/src/http_upload/mod_http_upload.erl @@ -184,7 +184,7 @@ process_disco_iq(Acc, _From, _To, #iq{type = get, lang = Lang, sub_el = SubEl} = -spec disco_local_items(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:item_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_local_items(Acc = #{host_type := HostType, to_jid := #jid{lserver = Domain}, node := <<>>, lang := Lang}, _, _) -> {ok, mongoose_disco:add_items([#{jid => subdomain(HostType, Domain), name => my_disco_name(Lang)}], Acc)}; disco_local_items(Acc, _, _) -> diff --git a/src/inbox/mod_inbox.erl b/src/inbox/mod_inbox.erl index 6b032a9cd60..2eaf1c1b49d 100644 --- a/src/inbox/mod_inbox.erl +++ b/src/inbox/mod_inbox.erl @@ -180,7 +180,7 @@ stop_cleaner(HostType) -> From :: jid:jid(), To :: jid:jid(), IQ :: jlib:iq(), - Extra :: map()) -> {stop, mongoose_acc:t()} | {mongoose_acc:t(), jlib:iq()}. + Extra :: gen_hook:extra()) -> {stop, mongoose_acc:t()} | {mongoose_acc:t(), jlib:iq()}. process_iq(Acc, _From, _To, #iq{type = get, sub_el = SubEl} = IQ, #{host_type := HostType}) -> Form = build_inbox_form(HostType), SubElWithForm = SubEl#xmlel{ children = [Form] }, @@ -232,7 +232,7 @@ send_message(Acc, To = #jid{lserver = LServer}, Msg) -> -spec user_send_packet(Acc, Args, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Args :: #{from := jid:jid(), to := jid:jid(), packet := exml:element()}, - Extra :: map(). + Extra :: gen_hook:extra(). user_send_packet(Acc, _, _) -> {From, To, Msg} = mongoose_acc:packet(Acc), NewAcc = case Msg of @@ -244,7 +244,7 @@ user_send_packet(Acc, _, _) -> -spec inbox_unread_count(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{user := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). inbox_unread_count(Acc, #{user := User}, _) -> Res = mongoose_acc:get(inbox, unread_count, undefined, Acc), NewAcc = get_inbox_unread(Res, Acc, User), @@ -254,7 +254,7 @@ inbox_unread_count(Acc, #{user := User}, _) -> (FPacketAcc, Params, Extra) -> {ok, FPacketAcc} when FPacketAcc :: mongoose_hooks:filter_packet_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). filter_local_packet({From, To, Acc, Msg = #xmlel{name = <<"message">>}}, _, _) -> Acc0 = maybe_process_message(Acc, From, To, Msg, incoming), {ok, {From, To, Acc0, Msg}}; @@ -264,7 +264,7 @@ filter_local_packet(FPacketAcc, _, _) -> -spec remove_user(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). remove_user(Acc, #{jid := #jid{luser = User, lserver = Server}}, _) -> HostType = mongoose_acc:host_type(Acc), mod_inbox_utils:clear_inbox(HostType, User, Server), @@ -284,7 +284,7 @@ remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> -spec disco_local_features(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:feature_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_local_features(Acc = #{node := <<>>}, _, _) -> {ok, mongoose_disco:add_features([?NS_ESL_INBOX], Acc)}; disco_local_features(Acc, _, _) -> diff --git a/src/inbox/mod_inbox_muc.erl b/src/inbox/mod_inbox_muc.erl index 828a6b6c549..a58aa8a2fc0 100644 --- a/src/inbox/mod_inbox_muc.erl +++ b/src/inbox/mod_inbox_muc.erl @@ -35,7 +35,7 @@ hooks(HostType) -> -spec update_inbox_for_muc(Acc, Params, Extra) -> {ok, Acc} when Acc :: mod_muc_room:update_inbox_for_muc_payload(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). update_inbox_for_muc( #{host_type := HostType, room_jid := Room, diff --git a/src/jingle_sip/mod_jingle_sip.erl b/src/jingle_sip/mod_jingle_sip.erl index ba8a49630ca..f397cdac598 100644 --- a/src/jingle_sip/mod_jingle_sip.erl +++ b/src/jingle_sip/mod_jingle_sip.erl @@ -126,7 +126,7 @@ hooks(Host) -> -spec intercept_jingle_stanza(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). intercept_jingle_stanza(Acc, _, _) -> NewAcc = case mongoose_acc:get(hook, result, undefined, Acc) of drop -> diff --git a/src/mam/ejabberd_gen_mam_archive.erl b/src/mam/ejabberd_gen_mam_archive.erl index a02dbcc873a..f30ab34cb2c 100644 --- a/src/mam/ejabberd_gen_mam_archive.erl +++ b/src/mam/ejabberd_gen_mam_archive.erl @@ -1,30 +1,40 @@ -module(ejabberd_gen_mam_archive). --ignore_xref([behaviour_info/1]). - --callback archive_size(Size :: integer(), Host :: jid:server(), - ArchiveID :: mod_mam:archive_id(), ArchiveJID :: jid:jid()) - -> integer(). - --callback archive_message(Result :: any(), Host :: jid:server(), - Params :: mod_mam:archive_message_params()) -> ok | {error, timeout}. - --callback lookup_messages(Result :: any(), Host :: jid:server(), - Params :: map()) -> Result when - Result :: {ok, mod_mam:lookup_result()} | {error, 'policy-violation'}. - --callback get_mam_pm_gdpr_data(mam_pm_gdpr_data(), mongooseim:host_type(), jid:jid()) -> mam_pm_gdpr_data(). - --callback get_mam_muc_gdpr_data(mam_muc_gdpr_data(), mongooseim:host_type(), jid:jid()) -> mam_muc_gdpr_data(). +-callback archive_size(Acc, Params, Extra) -> gen_hook:hook_fn_ret(Acc) when + Acc :: integer(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner => jid:jid(), room => jid:jid()}, + Extra :: gen_hook:extra(). + +-callback archive_message(Acc, Params, Extra) -> gen_hook:hook_fn_ret(Acc) when + Acc :: ok | {error, term()}, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). + +-callback lookup_messages(Acc, Params, Extra) -> gen_hook:hook_fn_ret(Acc) when + Acc :: {ok, mod_mam:lookup_result()} | {error, term()}, + Params :: mam_iq:lookup_params(), + Extra :: gen_hook:extra(). + +-callback get_mam_pm_gdpr_data(Acc, Params, Extra) -> gen_hook:hook_fn_ret(Acc) when + Acc :: mam_pm_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). + +-callback get_mam_muc_gdpr_data(Acc, Params, Extra) -> gen_hook:hook_fn_ret(Acc) when + Acc :: mam_muc_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). -optional_callbacks([get_mam_pm_gdpr_data/3, get_mam_muc_gdpr_data/3, - archive_size/4, + archive_size/3, lookup_messages/3]). --type mam_pm_gdpr_data() :: [{MessageID :: bitstring(), FromJID :: bitstring(), Message :: bitstring()}]. +-type mam_pm_gdpr_data() :: [{MessageID :: bitstring(), + FromJID :: bitstring(), + Message :: bitstring()}]. --type mam_muc_gdpr_data() :: [{MessageID :: bitstring(), Message :: bitstring()}]. +-type mam_muc_gdpr_data() :: [{MessageID :: bitstring(), + Message :: bitstring()}]. -export_type([mam_pm_gdpr_data/0, mam_muc_gdpr_data/0]). - diff --git a/src/mam/ejabberd_gen_mam_prefs.erl b/src/mam/ejabberd_gen_mam_prefs.erl index d0fafb2a5f0..3abf277efca 100644 --- a/src/mam/ejabberd_gen_mam_prefs.erl +++ b/src/mam/ejabberd_gen_mam_prefs.erl @@ -1,18 +1,32 @@ -module(ejabberd_gen_mam_prefs). --ignore_xref([behaviour_info/1]). +-type set_prefs_params() :: #{archive_id := undefined | mod_mam:archive_id(), + owner := jid:jid(), + default_mode := mod_mam:archive_behaviour(), + always_jids := [jid:literal_jid()], + never_jids := [jid:literal_jid()]}. --callback get_behaviour(Default :: mod_mam:archive_behaviour(), - Host :: jid:server(), ArcID :: mod_mam:archive_id(), - LocJID :: jid:jid(), RemJID :: jid:jid()) -> any(). +-type get_prefs_params() :: #{archive_id := undefined | mod_mam:archive_id(), + owner := jid:jid()}. --callback set_prefs(Result :: any(), Host :: jid:server(), - ArcID :: mod_mam:archive_id(), ArcJID :: jid:jid(), - DefaultMode :: mod_mam:archive_behaviour(), - AlwaysJIDs :: [jid:literal_jid()], - NeverJIDs :: [jid:literal_jid()]) -> any(). +-type get_behaviour_params() :: #{archive_id := undefined | mod_mam:archive_id(), + owner => jid:jid(), + room => jid:jid(), + remote := jid:jid()}. --callback get_prefs(mod_mam:preference(), _Host :: jid:server(), - ArcId :: mod_mam:archive_id(), ArcJID :: jid:jid()) - -> mod_mam:preference(). +-export_type([set_prefs_params/0, get_prefs_params/0, get_behaviour_params/0]). +-callback get_behaviour(Acc, Params, Extra) -> gen_hook:hook_fn_ret(Acc) when + Acc :: mod_mam:archive_behaviour(), + Params :: get_behaviour_params(), + Extra :: map(). + +-callback set_prefs(Acc, Params, Extra) -> gen_hook:hook_fn_ret(Acc) when + Acc :: term(), + Params :: set_prefs_params(), + Extra :: map(). + +-callback get_prefs(Acc, Params, Extra) -> gen_hook:hook_fn_ret(Acc) when + Acc :: mod_mam:preference() | {error, Reason :: term()}, + Params :: get_prefs_params(), + Extra :: map(). diff --git a/src/mam/mod_mam_cache_user.erl b/src/mam/mod_mam_cache_user.erl index c0b7b28ef93..fcceea34763 100644 --- a/src/mam/mod_mam_cache_user.erl +++ b/src/mam/mod_mam_cache_user.erl @@ -12,6 +12,7 @@ -module(mod_mam_cache_user). -behaviour(mongoose_module_metrics). +-behaviour(gen_mod). %% gen_mod handlers -export([start/2, stop/1, supported_features/0]). @@ -19,10 +20,7 @@ %% ejabberd handlers -export([cached_archive_id/3, store_archive_id/3, - remove_archive/4]). - --ignore_xref([start/2, stop/1, supported_features/0, - cached_archive_id/3, store_archive_id/3, remove_archive/4]). + remove_archive/3]). %%==================================================================== %% gen_mod callbacks @@ -31,12 +29,12 @@ -spec start(mongooseim:host_type(), gen_mod:module_opts()) -> ok. start(HostType, Opts) -> start_cache(HostType, Opts), - ejabberd_hooks:add(hooks(HostType, Opts)), + gen_hook:add_handlers(hooks(HostType, Opts)), ok. -spec stop(HostType :: mongooseim:host_type()) -> ok. stop(HostType) -> - ejabberd_hooks:delete(hooks(HostType)), + gen_hook:delete_handlers(hooks(HostType)), stop_cache(HostType), ok. @@ -44,7 +42,7 @@ stop(HostType) -> supported_features() -> [dynamic_domains]. --spec hooks(mongooseim:host_type()) -> [ejabberd_hooks:hook()]. +-spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). hooks(HostType) -> Opts = gen_mod:get_module_opts(HostType, ?MODULE), hooks(HostType, Opts). @@ -62,44 +60,54 @@ maybe_muc_hooks(true, HostType) -> muc_hooks(HostType); maybe_muc_hooks(false, _HostType) -> []. pm_hooks(HostType) -> - [{mam_archive_id, HostType, ?MODULE, cached_archive_id, 30}, - {mam_archive_id, HostType, ?MODULE, store_archive_id, 70}, - {mam_remove_archive, HostType, ?MODULE, remove_archive, 100}]. + [{mam_archive_id, HostType, fun ?MODULE:cached_archive_id/3, #{}, 30}, + {mam_archive_id, HostType, fun ?MODULE:store_archive_id/3, #{}, 70}, + {mam_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 100}]. muc_hooks(HostType) -> - [{mam_muc_archive_id, HostType, ?MODULE, cached_archive_id, 30}, - {mam_muc_archive_id, HostType, ?MODULE, store_archive_id, 70}, - {mam_muc_remove_archive, HostType, ?MODULE, remove_archive, 100}]. + [{mam_muc_archive_id, HostType, fun ?MODULE:cached_archive_id/3, #{}, 30}, + {mam_muc_archive_id, HostType, fun ?MODULE:store_archive_id/3, #{}, 70}, + {mam_muc_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 100}]. %%==================================================================== %% API %%==================================================================== --spec cached_archive_id(undefined, mongooseim:host_type(), jid:jid()) -> - mod_mam:archive_id(). -cached_archive_id(undefined, HostType, ArcJid) -> +-spec cached_archive_id(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mod_mam:archive_id() | undefined, + Params :: #{owner := jid:jid()}, + Extra :: gen_hook:extra(). +cached_archive_id(undefined, #{owner := ArcJid}, #{host_type := HostType}) -> case mongoose_user_cache:get_entry(HostType, ?MODULE, ArcJid) of - #{id := ArchId} -> ArchId; + #{id := ArchId} -> + {ok, ArchId}; _ -> put(mam_not_cached_flag, true), - undefined + {ok, undefined} end. --spec store_archive_id(mod_mam:archive_id(), mongooseim:host_type(), jid:jid()) - -> mod_mam:archive_id(). -store_archive_id(ArchId, HostType, ArcJid) -> +-spec store_archive_id(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mod_mam:archive_id() | undefined, + Params :: #{owner := jid:jid()}, + Extra :: gen_hook:extra(). +store_archive_id(ArchId, #{owner := ArcJid}, #{host_type := HostType}) -> case erase(mam_not_cached_flag) of undefined -> - ArchId; + {ok, ArchId}; true -> mongoose_user_cache:merge_entry(HostType, ?MODULE, ArcJid, #{id => ArchId}), - ArchId + {ok, ArchId} end. --spec remove_archive(Acc :: map(), HostType :: mongooseim:host_type(), - ArchId :: mod_mam:archive_id(), ArcJid :: jid:jid()) -> map(). -remove_archive(Acc, HostType, _UserID, ArcJid) -> +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner => jid:jid(), room => jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{owner := ArcJid}, #{host_type := HostType}) -> + mongoose_user_cache:delete_user(HostType, ?MODULE, ArcJid), + {ok, Acc}; +remove_archive(Acc, #{room := ArcJid}, #{host_type := HostType}) -> mongoose_user_cache:delete_user(HostType, ?MODULE, ArcJid), - Acc. + {ok, Acc}. %%==================================================================== %% internal diff --git a/src/mam/mod_mam_cassandra_arch.erl b/src/mam/mod_mam_cassandra_arch.erl index f228a820b6c..a46a98273ff 100644 --- a/src/mam/mod_mam_cassandra_arch.erl +++ b/src/mam/mod_mam_cassandra_arch.erl @@ -17,10 +17,10 @@ -export([start/2, stop/1]). %% MAM hook handlers --export([archive_size/4, +-export([archive_size/3, archive_message/3, lookup_messages/3, - remove_archive/4]). + remove_archive/3]). %% mongoose_cassandra callbacks -export([prepared_queries/0]). @@ -28,10 +28,6 @@ %gdpr -export([get_mam_pm_gdpr_data/3]). --ignore_xref([ - behaviour_info/1, remove_archive/4 -]). - %% ---------------------------------------------------------------------- %% Imports @@ -79,22 +75,22 @@ -spec start(host_type(), gen_mod:module_opts()) -> ok. start(HostType, _Opts) -> - ejabberd_hooks:add(hooks(HostType)). + gen_hook:add_handlers(hooks(HostType)). -spec stop(host_type()) -> ok. stop(HostType) -> - ejabberd_hooks:delete(hooks(HostType)). + gen_hook:delete_handlers(hooks(HostType)). %% ---------------------------------------------------------------------- %% Add hooks for mod_mam_pm --spec hooks(host_type()) -> [ejabberd_hooks:hook()]. +-spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). hooks(HostType) -> - [{mam_archive_message, HostType, ?MODULE, archive_message, 50}, - {mam_archive_size, HostType, ?MODULE, archive_size, 50}, - {mam_lookup_messages, HostType, ?MODULE, lookup_messages, 50}, - {mam_remove_archive, HostType, ?MODULE, remove_archive, 50}, - {get_mam_pm_gdpr_data, HostType, ?MODULE, get_mam_pm_gdpr_data, 50}]. + [{mam_archive_message, HostType, fun ?MODULE:archive_message/3, #{}, 50}, + {mam_archive_size, HostType, fun ?MODULE:archive_size/3, #{}, 50}, + {mam_lookup_messages, HostType, fun ?MODULE:lookup_messages/3, #{}, 50}, + {mam_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}, + {get_mam_pm_gdpr_data, HostType, fun ?MODULE:get_mam_pm_gdpr_data/3, #{}, 50}]. %% ---------------------------------------------------------------------- %% mongoose_cassandra_worker callbacks @@ -117,10 +113,14 @@ prepared_queries() -> %% ---------------------------------------------------------------------- %% Internal functions and callbacks -archive_size(Size, HostType, _UserID, UserJID) when is_integer(Size) -> +-spec archive_size(Acc, Params, Extra) -> {ok, Acc} when + Acc :: integer(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner := jid:jid()}, + Extra :: gen_hook:extra(). +archive_size(Size, #{owner := UserJID}, #{host_type := HostType}) when is_integer(Size) -> Borders = Start = End = WithJID = undefined, Filter = prepare_filter(UserJID, Borders, Start, End, WithJID), - calc_count(pool_name(HostType), UserJID, HostType, Filter). + {ok, calc_count(pool_name(HostType), UserJID, HostType, Filter)}. %% ---------------------------------------------------------------------- @@ -131,11 +131,15 @@ insert_query_cql() -> "(id, user_jid, from_jid, remote_jid, with_jid, message) " "VALUES (?, ?, ?, ?, ?, ?)". -archive_message(_Result, HostType, Params) -> +-spec archive_message(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). +archive_message(_Result, Params, #{host_type := HostType}) -> try - archive_message2(Params, HostType) + {ok, archive_message2(Params, HostType)} catch _Type:Reason -> - {error, Reason} + {ok, {error, Reason}} end. archive_message2(#{message_id := MessID, @@ -187,9 +191,13 @@ remove_archive_offsets_query_cql() -> select_for_removal_query_cql() -> "SELECT DISTINCT user_jid, with_jid FROM mam_message WHERE user_jid = ?". -remove_archive(Acc, HostType, _UserID, UserJID) -> +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner := jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{owner := UserJID}, #{host_type := HostType}) -> remove_archive(HostType, UserJID), - Acc. + {ok, Acc}. remove_archive(HostType, UserJID) -> PoolName = pool_name(HostType), @@ -209,24 +217,27 @@ remove_archive(HostType, UserJID) -> %% ---------------------------------------------------------------------- %% SELECT MESSAGES --spec lookup_messages(Result :: any(), HostType :: host_type(), Params :: map()) -> - {ok, mod_mam:lookup_result()}. -lookup_messages({error, _Reason} = Result, _HostType, _Params) -> - Result; -lookup_messages(_Result, _HostType, #{search_text := <<_/binary>>}) -> - {error, 'not-supported'}; -lookup_messages(_Result, HostType, +-spec lookup_messages(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()} | {error, term()}, + Params :: mam_iq:lookup_params(), + Extra :: gen_hook:extra(). +lookup_messages({error, _Reason} = Result, _Params, _Extra) -> + {ok, Result}; +lookup_messages(_Result, #{search_text := <<_/binary>>}, _Extra) -> + {ok, {error, 'not-supported'}}; +lookup_messages(_Result, #{owner_jid := UserJID, rsm := RSM, borders := Borders, start_ts := Start, end_ts := End, with_jid := WithJID, search_text := undefined, page_size := PageSize, - is_simple := IsSimple}) -> + is_simple := IsSimple}, + #{host_type := HostType}) -> try - lookup_messages2(pool_name(HostType), HostType, - UserJID, RSM, Borders, - Start, End, WithJID, - PageSize, IsSimple) + {ok, lookup_messages2(pool_name(HostType), HostType, + UserJID, RSM, Borders, + Start, End, WithJID, + PageSize, IsSimple)} catch _Type:Reason:S -> - {error, {Reason, S}} + {ok, {error, {Reason, S}}} end. lookup_messages2(PoolName, HostType, @@ -415,15 +426,16 @@ row_to_uniform_format(HostType, #{from_jid := FromJID, message := Msg, id := Msg row_to_message_id(#{id := MsgID}) -> MsgID. --spec get_mam_pm_gdpr_data(ejabberd_gen_mam_archive:mam_pm_gdpr_data(), - host_type(), jid:jid()) -> - ejabberd_gen_mam_archive:mam_pm_gdpr_data(). -get_mam_pm_gdpr_data(Acc, HostType, JID) -> +-spec get_mam_pm_gdpr_data(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ejabberd_gen_mam_archive:mam_pm_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). +get_mam_pm_gdpr_data(Acc, #{jid := JID}, #{host_type := HostType}) -> BinJID = jid:to_binary(jid:to_lower(JID)), FilterMap = #{user_jid => BinJID, with_jid => <<"">>}, Rows = fetch_user_messages(pool_name(HostType), JID, FilterMap), Messages = [rows_to_gdpr_mam_message(HostType, Row) || Row <- Rows], - Messages ++ Acc. + {ok, Messages ++ Acc}. rows_to_gdpr_mam_message(HostType, #{message := Data, id:= Id, from_jid:=FromJid}) -> {Id, FromJid, exml:to_binary(stored_binary_to_packet(HostType, Data))}. diff --git a/src/mam/mod_mam_cassandra_prefs.erl b/src/mam/mod_mam_cassandra_prefs.erl index a3ec8e119a9..ac894604e0f 100644 --- a/src/mam/mod_mam_cassandra_prefs.erl +++ b/src/mam/mod_mam_cassandra_prefs.erl @@ -6,6 +6,7 @@ %%%------------------------------------------------------------------- -module(mod_mam_cassandra_prefs). -behaviour(mongoose_cassandra). +-behaviour(gen_mod). %% ---------------------------------------------------------------------- %% Exports @@ -15,15 +16,13 @@ %% MAM hook handlers -behaviour(ejabberd_gen_mam_prefs). --export([get_behaviour/5, - get_prefs/4, - set_prefs/7, - remove_archive/4]). +-export([get_behaviour/3, + get_prefs/3, + set_prefs/3, + remove_archive/3]). -export([prepared_queries/0]). --ignore_xref([remove_archive/4, start/2, stop/1]). - -include("mongoose.hrl"). -include("jlib.hrl"). -include_lib("exml/include/exml.hrl"). @@ -36,12 +35,12 @@ -spec start(host_type(), gen_mod:module_opts()) -> ok. start(HostType, Opts) -> - ejabberd_hooks:add(hooks(HostType, Opts)). + gen_hook:add_handlers(hooks(HostType, Opts)). -spec stop(host_type()) -> ok. stop(HostType) -> Opts = gen_mod:get_loaded_module_opts(HostType, ?MODULE), - ejabberd_hooks:delete(hooks(HostType, Opts)). + gen_hook:delete_handlers(hooks(HostType, Opts)). %% ---------------------------------------------------------------------- %% Hooks @@ -50,15 +49,15 @@ hooks(HostType, Opts) -> lists:flatmap(fun(Type) -> hooks(HostType, Type, Opts) end, [pm, muc]). hooks(HostType, pm, #{pm := true}) -> - [{mam_get_behaviour, HostType, ?MODULE, get_behaviour, 50}, - {mam_get_prefs, HostType, ?MODULE, get_prefs, 50}, - {mam_set_prefs, HostType, ?MODULE, set_prefs, 50}, - {mam_remove_archive, HostType, ?MODULE, remove_archive, 50}]; + [{mam_get_behaviour, HostType, fun ?MODULE:get_behaviour/3, #{}, 50}, + {mam_get_prefs, HostType, fun ?MODULE:get_prefs/3, #{}, 50}, + {mam_set_prefs, HostType, fun ?MODULE:set_prefs/3, #{}, 50}, + {mam_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}]; hooks(HostType, muc, #{muc := true}) -> - [{mam_muc_get_behaviour, HostType, ?MODULE, get_behaviour, 50}, - {mam_muc_get_prefs, HostType, ?MODULE, get_prefs, 50}, - {mam_muc_set_prefs, HostType, ?MODULE, set_prefs, 50}, - {mam_muc_remove_archive, HostType, ?MODULE, remove_archive, 50}]; + [{mam_muc_get_behaviour, HostType, fun ?MODULE:get_behaviour/3, #{}, 50}, + {mam_muc_get_prefs, HostType, fun ?MODULE:get_prefs/3, #{}, 50}, + {mam_muc_set_prefs, HostType, fun ?MODULE:set_prefs/3, #{}, 50}, + {mam_muc_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}]; hooks(_HostType, _Opt, _Opts) -> []. @@ -82,16 +81,26 @@ prepared_queries() -> %% ---------------------------------------------------------------------- %% Internal functions and callbacks --spec get_behaviour(Default :: mod_mam:archive_behaviour(), - HostType :: host_type(), ArchiveID :: mod_mam:archive_id(), - LocJID :: jid:jid(), RemJID :: jid:jid()) -> any(). -get_behaviour(DefaultBehaviour, HostType, _UserID, LocJID, RemJID) -> +-spec get_behaviour(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mod_mam:archive_behaviour(), + Params :: ejabberd_gen_mam_prefs:get_behaviour_params(), + Extra :: gen_hook:extra(). +get_behaviour(DefaultBehaviour, + #{owner := LocJID, remote := RemJID}, + #{host_type := HostType}) -> + get_behaviour2(DefaultBehaviour, LocJID, RemJID, HostType); +get_behaviour(DefaultBehaviour, + #{room := LocJID, remote := RemJID}, + #{host_type := HostType}) -> + get_behaviour2(DefaultBehaviour, LocJID, RemJID, HostType). + +get_behaviour2(DefaultBehaviour, LocJID, RemJID, HostType) -> BUserJID = mod_mam_utils:bare_jid(LocJID), BRemBareJID = mod_mam_utils:bare_jid(RemJID), BRemJID = mod_mam_utils:full_jid(RemJID), case query_behaviour(HostType, LocJID, BUserJID, BRemJID, BRemBareJID) of {ok, []} -> - DefaultBehaviour; + {ok, DefaultBehaviour}; {ok, [_ | _] = Rows} -> %% After sort <<>>, <<"a">>, <<"a/b">> SortedRows = lists:sort( @@ -100,24 +109,26 @@ get_behaviour(DefaultBehaviour, HostType, _UserID, LocJID, RemJID) -> {JID1, B1} < {JID2, B2} end, Rows), #{behaviour := Behaviour} = lists:last(SortedRows), - decode_behaviour(Behaviour) + {ok, decode_behaviour(Behaviour)} end. --spec set_prefs(Result :: any(), HostType :: host_type(), - ArchiveID :: mod_mam:archive_id(), ArchiveJID :: jid:jid(), - DefaultMode :: mod_mam:archive_behaviour(), - AlwaysJIDs :: [jid:literal_jid()], - NeverJIDs :: [jid:literal_jid()]) -> any(). -set_prefs(_Result, HostType, _UserID, UserJID, DefaultMode, AlwaysJIDs, NeverJIDs) -> +-spec set_prefs(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: ejabberd_gen_mam_prefs:set_prefs_params(), + Extra :: gen_hook:extra(). +set_prefs(_Result, + #{owner := UserJID, default_mode := DefaultMode, always_jids := AlwaysJIDs, + never_jids := NeverJIDs}, + #{host_type := HostType}) -> try - set_prefs1(HostType, UserJID, DefaultMode, AlwaysJIDs, NeverJIDs) + {ok, set_prefs1(HostType, UserJID, DefaultMode, AlwaysJIDs, NeverJIDs)} catch Type:Error:StackTrace -> ?LOG_ERROR(#{what => mam_set_prefs_failed, user_jid => UserJID, default_mode => DefaultMode, always_jids => AlwaysJIDs, never_jids => NeverJIDs, class => Type, reason => Error, stacktrace => StackTrace}), - {error, Error} + {ok, {error, Error}} end. set_prefs1(HostType, UserJID, DefaultMode, AlwaysJIDs, NeverJIDs) -> @@ -144,22 +155,28 @@ encode_row(BUserJID, BRemoteJID, Behaviour, Timestamp) -> behaviour => Behaviour, '[timestamp]' => Timestamp}. --spec get_prefs(mod_mam:preference(), _HostType :: host_type(), - ArchiveID :: mod_mam:archive_id(), ArchiveJID :: jid:jid()) - -> mod_mam:preference(). -get_prefs({GlobalDefaultMode, _, _}, HostType, _UserID, UserJID) -> +-spec get_prefs(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mod_mam:preference(), + Params :: ejabberd_gen_mam_prefs:get_prefs_params(), + Extra :: gen_hook:extra(). +get_prefs({GlobalDefaultMode, _, _}, #{owner := UserJID}, #{host_type := HostType}) -> BUserJID = mod_mam_utils:bare_jid(UserJID), Params = #{user_jid => BUserJID}, {ok, Rows} = mongoose_cassandra:cql_read(pool_name(HostType), UserJID, ?MODULE, get_prefs_query, Params), - decode_prefs_rows(Rows, GlobalDefaultMode, [], []). + {ok, decode_prefs_rows(Rows, GlobalDefaultMode, [], [])}. --spec remove_archive(mongoose_acc:t(), host_type(), mod_mam:archive_id(), jid:jid()) -> - mongoose_acc:t(). -remove_archive(Acc, HostType, _UserID, UserJID) -> +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner => jid:jid(), room => jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{owner := UserJID}, #{host_type := HostType}) -> + remove_archive(HostType, UserJID), + {ok, Acc}; +remove_archive(Acc, #{room := UserJID}, #{host_type := HostType}) -> remove_archive(HostType, UserJID), - Acc. + {ok, Acc}. remove_archive(HostType, UserJID) -> BUserJID = mod_mam_utils:bare_jid(UserJID), diff --git a/src/mam/mod_mam_elasticsearch_arch.erl b/src/mam/mod_mam_elasticsearch_arch.erl index 85a83b3a80f..82fe182bd62 100644 --- a/src/mam/mod_mam_elasticsearch_arch.erl +++ b/src/mam/mod_mam_elasticsearch_arch.erl @@ -29,13 +29,10 @@ %% ejabberd_gen_mam_archive callbacks -export([archive_message/3]). -export([lookup_messages/3]). --export([remove_archive/4]). --export([archive_size/4]). - +-export([remove_archive/3]). +-export([archive_size/3]). -export([get_mam_pm_gdpr_data/3]). --ignore_xref([remove_archive/4]). - -include("mongoose.hrl"). -include("mongoose_rsm.hrl"). -include("mod_mam.hrl"). @@ -50,18 +47,19 @@ -spec start(mongooseim:host_type(), gen_mod:module_opts()) -> ok. start(HostType, _Opts) -> - ejabberd_hooks:add(hooks(HostType)), + gen_hook:add_handlers(hooks(HostType)), ok. -spec stop(mongooseim:host_type()) -> ok. stop(HostType) -> - ejabberd_hooks:delete(hooks(HostType)), + gen_hook:delete_handlers(hooks(HostType)), ok. --spec get_mam_pm_gdpr_data(ejabberd_gen_mam_archive:mam_pm_gdpr_data(), - mongooseim:host_type(), jid:jid()) -> - ejabberd_gen_mam_archive:mam_pm_gdpr_data(). -get_mam_pm_gdpr_data(Acc, _HostType, Owner) -> +-spec get_mam_pm_gdpr_data(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ejabberd_gen_mam_archive:mam_pm_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). +get_mam_pm_gdpr_data(Acc, #{jid := Owner}, _Extra) -> BinOwner = mod_mam_utils:bare_jid(Owner), Filter = #{term => #{owner => BinOwner}}, Sorting = #{mam_id => #{order => asc}}, @@ -69,17 +67,23 @@ get_mam_pm_gdpr_data(Acc, _HostType, Owner) -> {ok, #{<<"hits">> := #{<<"hits">> := Hits}}} = mongoose_elasticsearch:search(?INDEX_NAME, ?TYPE_NAME, SearchQuery), Messages = lists:map(fun hit_to_gdpr_mam_message/1, Hits), - Messages ++ Acc. + {ok, Messages ++ Acc}. %%------------------------------------------------------------------- %% ejabberd_gen_mam_archive callbacks %%------------------------------------------------------------------- -archive_message(_Result, Host, #{message_id := MessageId, - local_jid := LocalJid, - remote_jid := RemoteJid, - source_jid := SourceJid, - packet := Packet}) -> +-spec archive_message(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok | {error, term()}, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). +archive_message(_Result, + #{message_id := MessageId, + local_jid := LocalJid, + remote_jid := RemoteJid, + source_jid := SourceJid, + packet := Packet}, + #{host_type := Host}) -> Owner = mod_mam_utils:bare_jid(LocalJid), Remote = mod_mam_utils:bare_jid(RemoteJid), SourceBinJid = mod_mam_utils:full_jid(SourceJid), @@ -87,23 +91,31 @@ archive_message(_Result, Host, #{message_id := MessageId, Doc = make_document(MessageId, Owner, Remote, SourceBinJid, Packet), case mongoose_elasticsearch:insert_document(?INDEX_NAME, ?TYPE_NAME, DocId, Doc) of {ok, _} -> - ok; + {ok, ok}; {error, Reason} = Err -> ?LOG_ERROR(#{what => archive_message_failed, user => Owner, server => Host, remote => Remote, message_id => MessageId, reason => Reason}), mongoose_metrics:update(Host, modMamDropped, 1), - Err + {ok, Err} end. -lookup_messages(Result, Host, #{rsm := #rsm_in{direction = before, id = ID} = RSM} = Params) +-spec lookup_messages(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()} | {error, term()}, + Params :: mam_iq:lookup_params(), + Extra :: gen_hook:extra(). +lookup_messages(Result, + #{rsm := #rsm_in{direction = before, id = ID} = RSM} = Params, + #{host_type := HostType}) when ID =/= undefined -> - lookup_message_page(Result, Host, RSM, Params); -lookup_messages(Result, Host, #{rsm := #rsm_in{direction = aft, id = ID} = RSM} = Params) + {ok, lookup_message_page(Result, HostType, RSM, Params)}; +lookup_messages(Result, + #{rsm := #rsm_in{direction = aft, id = ID} = RSM} = Params, + #{host_type := HostType}) when ID =/= undefined -> - lookup_message_page(Result, Host, RSM, Params); -lookup_messages(Result, Host, Params) -> - do_lookup_messages(Result, Host, Params). + {ok, lookup_message_page(Result, HostType, RSM, Params)}; +lookup_messages(Result, Params, #{host_type := HostType}) -> + {ok, do_lookup_messages(Result, HostType, Params)}. lookup_message_page(AccResult, Host, #rsm_in{id = _ID} = RSM, Params) -> PageSize = maps:get(page_size, Params), @@ -130,21 +142,21 @@ do_lookup_messages(_Result, Host, Params) -> Err end. --spec archive_size(Size :: integer(), - Host :: jid:server(), - _ArchiveId, - OwnerJid :: jid:jid()) -> non_neg_integer(). -archive_size(_Size, _Host, _ArchiveId, OwnerJid) -> +-spec archive_size(Acc, Params, Extra) -> {ok, Acc} when + Acc :: integer(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner := jid:jid()}, + Extra :: gen_hook:extra(). +archive_size(_Size, #{owner := OwnerJid}, _Extra)-> SearchQuery = build_search_query(#{owner_jid => OwnerJid}), - archive_size(SearchQuery). + {ok, archive_size(SearchQuery)}. --spec remove_archive(Acc :: mongoose_acc:t(), - Host :: jid:server(), - ArchiveId :: mod_mam:archive_id(), - OwnerJid :: jid:jid()) -> Acc when Acc :: map(). -remove_archive(Acc, Host, _ArchiveId, OwnerJid) -> - remove_archive(Host, OwnerJid), - Acc. +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner := jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{owner := OwnerJid}, #{host_type := HostType}) -> + remove_archive(HostType, OwnerJid), + {ok, Acc}. remove_archive(Host, OwnerJid) -> SearchQuery = build_search_query(#{owner_jid => OwnerJid}), @@ -161,13 +173,13 @@ remove_archive(Host, OwnerJid) -> %% Helpers %%------------------------------------------------------------------- --spec hooks(jid:lserver()) -> [ejabberd_hooks:hook()]. +-spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). hooks(Host) -> - [{mam_archive_message, Host, ?MODULE, archive_message, 50}, - {mam_lookup_messages, Host, ?MODULE, lookup_messages, 50}, - {mam_archive_size, Host, ?MODULE, archive_size, 50}, - {mam_remove_archive, Host, ?MODULE, remove_archive, 50}, - {get_mam_pm_gdpr_data, Host, ?MODULE, get_mam_pm_gdpr_data, 50}]. + [{mam_archive_message, Host, fun ?MODULE:archive_message/3, #{}, 50}, + {mam_lookup_messages, Host, fun ?MODULE:lookup_messages/3, #{}, 50}, + {mam_archive_size, Host, fun ?MODULE:archive_size/3, #{}, 50}, + {mam_remove_archive, Host, fun ?MODULE:remove_archive/3, #{}, 50}, + {get_mam_pm_gdpr_data, Host, fun ?MODULE:get_mam_pm_gdpr_data/3, #{}, 50}]. -spec make_document_id(binary(), mod_mam:message_id()) -> binary(). make_document_id(Owner, MessageId) -> diff --git a/src/mam/mod_mam_mnesia_prefs.erl b/src/mam/mod_mam_mnesia_prefs.erl index 76161df3ee0..218422eca89 100644 --- a/src/mam/mod_mam_mnesia_prefs.erl +++ b/src/mam/mod_mam_mnesia_prefs.erl @@ -13,16 +13,15 @@ %% Exports %% gen_mod handlers +-behaviour(gen_mod). -export([start/2, stop/1, supported_features/0]). %% MAM hook handlers -behaviour(ejabberd_gen_mam_prefs). --export([get_behaviour/5, - get_prefs/4, - set_prefs/7, - remove_archive/4]). - --ignore_xref([remove_archive/4, start/2, stop/1, supported_features/0]). +-export([get_behaviour/3, + get_prefs/3, + set_prefs/3, + remove_archive/3]). -include("mongoose.hrl"). -include("jlib.hrl"). @@ -46,12 +45,12 @@ start(HostType, Opts) -> [{disc_copies, [node()]}, {attributes, record_info(fields, mam_prefs)}]), mnesia:add_table_copy(mam_prefs, node(), disc_copies), - ejabberd_hooks:add(hooks(HostType, Opts)). + gen_hook:add_handlers(hooks(HostType, Opts)). -spec stop(mongooseim:host_type()) -> ok. stop(HostType) -> Opts = gen_mod:get_loaded_module_opts(HostType, ?MODULE), - ejabberd_hooks:delete(hooks(HostType, Opts)). + gen_hook:delete_handlers(hooks(HostType, Opts)). -spec supported_features() -> [atom()]. supported_features() -> @@ -64,51 +63,59 @@ hooks(HostType, Opts) -> lists:flatmap(fun(Type) -> hooks(HostType, Type, Opts) end, [pm, muc]). hooks(HostType, pm, #{pm := true}) -> - [{mam_get_behaviour, HostType, ?MODULE, get_behaviour, 50}, - {mam_get_prefs, HostType, ?MODULE, get_prefs, 50}, - {mam_set_prefs, HostType, ?MODULE, set_prefs, 50}, - {mam_remove_archive, HostType, ?MODULE, remove_archive, 50}]; + [{mam_get_behaviour, HostType, fun ?MODULE:get_behaviour/3, #{}, 50}, + {mam_get_prefs, HostType, fun ?MODULE:get_prefs/3, #{}, 50}, + {mam_set_prefs, HostType, fun ?MODULE:set_prefs/3, #{}, 50}, + {mam_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}]; hooks(HostType, muc, #{muc := true}) -> - [{mam_muc_get_behaviour, HostType, ?MODULE, get_behaviour, 50}, - {mam_muc_get_prefs, HostType, ?MODULE, get_prefs, 50}, - {mam_muc_set_prefs, HostType, ?MODULE, set_prefs, 50}, - {mam_muc_remove_archive, HostType, ?MODULE, remove_archive, 50}]; + [{mam_muc_get_behaviour, HostType, fun ?MODULE:get_behaviour/3, #{}, 50}, + {mam_muc_get_prefs, HostType, fun ?MODULE:get_prefs/3, #{}, 50}, + {mam_muc_set_prefs, HostType, fun ?MODULE:set_prefs/3, #{}, 50}, + {mam_muc_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}]; hooks(_HostType, _Opt, _Opts) -> []. %% ---------------------------------------------------------------------- %% Internal functions and callbacks --spec get_behaviour(Default :: behaviour(), Host :: jid:server(), - ArcID :: mod_mam:archive_id(), LocJID :: jid:jid(), - RemJID :: jid:jid()) -> any(). -get_behaviour(DefaultBehaviour, _Host, - _ArcID, - LocJID=#jid{}, - RemJID=#jid{}) -> +-spec get_behaviour(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mod_mam:archive_behaviour(), + Params :: ejabberd_gen_mam_prefs:get_behaviour_params(), + Extra :: gen_hook:extra(). +get_behaviour(DefaultBehaviour, + #{owner := LocJID, remote := RemJID}, + _Extra) -> + get_behaviour2(DefaultBehaviour, LocJID, RemJID); +get_behaviour(DefaultBehaviour, + #{room := LocJID, remote := RemJID}, + _Extra) -> + get_behaviour2(DefaultBehaviour, LocJID, RemJID). + +get_behaviour2(DefaultBehaviour, LocJID, RemJID) -> SU = su_key(LocJID), case mnesia:dirty_read(mam_prefs, SU) of - [] -> DefaultBehaviour; - [User] -> get_behaviour(User, LocJID, RemJID) + [] -> {ok, DefaultBehaviour}; + [User] -> {ok, get_behaviour3(User, LocJID, RemJID)} end. --spec get_behaviour(mam_prefs(), LocJID :: jid:jid(), +-spec get_behaviour3(mam_prefs(), LocJID :: jid:jid(), RemJID :: jid:jid()) -> behaviour(). -get_behaviour(#mam_prefs{default_mode = always, never_rules=NeverJIDs}, LocJID, RemJID) -> +get_behaviour3(#mam_prefs{default_mode = always, never_rules = NeverJIDs}, LocJID, RemJID) -> IsNever = match_jid(LocJID, RemJID, NeverJIDs), case IsNever of true -> never; false -> always end; -get_behaviour(#mam_prefs{default_mode = never, always_rules=AlwaysJIDs}, LocJID, RemJID) -> +get_behaviour3(#mam_prefs{default_mode = never, always_rules = AlwaysJIDs}, LocJID, RemJID) -> IsAlways = match_jid(LocJID, RemJID, AlwaysJIDs), case IsAlways of true -> always; false -> never end; -get_behaviour(#mam_prefs{default_mode = roster, - never_rules=NeverJIDs, always_rules=AlwaysJIDs}, LocJID, RemJID) -> +get_behaviour3(#mam_prefs{default_mode = roster, + never_rules = NeverJIDs, + always_rules = AlwaysJIDs}, LocJID, RemJID) -> IsNever = match_jid(LocJID, RemJID, NeverJIDs), case IsNever of true -> never; @@ -120,17 +127,18 @@ get_behaviour(#mam_prefs{default_mode = roster, end end. - --spec set_prefs(Result :: any(), Host :: jid:server(), - ArcID :: mod_mam:archive_id(), ArcJID :: jid:jid(), - DefaultMode :: mod_mam:archive_behaviour(), - AlwaysJIDs :: [jid:literal_jid()], - NeverJIDs :: [jid:literal_jid()]) -> any(). -set_prefs(_Result, _Host, ArcID, ArcJID, DefaultMode, AlwaysJIDs, NeverJIDs) -> +-spec set_prefs(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: ejabberd_gen_mam_prefs:set_prefs_params(), + Extra :: gen_hook:extra(). +set_prefs(_Result, + #{archive_id := ArcID, owner := ArcJID, default_mode := DefaultMode, + always_jids := AlwaysJIDs, never_jids := NeverJIDs}, + _Extra) -> try - set_prefs1(ArcID, ArcJID, DefaultMode, AlwaysJIDs, NeverJIDs) + {ok, set_prefs1(ArcID, ArcJID, DefaultMode, AlwaysJIDs, NeverJIDs)} catch _Type:Error -> - {error, Error} + {ok, {error, Error}} end. set_prefs1(_ArcID, ArcJID, DefaultMode, AlwaysJIDs, NeverJIDs) -> @@ -149,24 +157,33 @@ set_prefs1(_ArcID, ArcJID, DefaultMode, AlwaysJIDs, NeverJIDs) -> ok. --spec get_prefs(mod_mam:preference(), _Host :: jid:server(), - _ArcId :: mod_mam:archive_id(), ArcJID :: jid:jid() - ) -> mod_mam:preference(). -get_prefs({GlobalDefaultMode, _, _}, _Host, _ArcID, ArcJID) -> +-spec get_prefs(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mod_mam:preference(), + Params :: ejabberd_gen_mam_prefs:get_prefs_params(), + Extra :: gen_hook:extra(). +get_prefs({GlobalDefaultMode, _, _}, #{owner := ArcJID}, _Extra) -> + SU = su_key(ArcJID), case mnesia:dirty_read(mam_prefs, SU) of [] -> - {GlobalDefaultMode, [], []}; + {ok, {GlobalDefaultMode, [], []}}; [#mam_prefs{default_mode=DefaultMode, always_rules=ARules, never_rules=NRules}] -> AlwaysJIDs = jids(ArcJID, ARules), NeverJIDs = jids(ArcJID, NRules), - {DefaultMode, AlwaysJIDs, NeverJIDs} + {ok, {DefaultMode, AlwaysJIDs, NeverJIDs}} end. -remove_archive(Acc, _Host, _ArcID, ArcJID) -> +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner => jid:jid(), room => jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{owner := ArcJID}, _Extra) -> + remove_archive(ArcJID), + {ok, Acc}; +remove_archive(Acc, #{room := ArcJID}, _Extra) -> remove_archive(ArcJID), - Acc. + {ok, Acc}. remove_archive(ArcJID) -> SU = su_key(ArcJID), diff --git a/src/mam/mod_mam_muc.erl b/src/mam/mod_mam_muc.erl index 49901a5f454..06160e707fa 100644 --- a/src/mam/mod_mam_muc.erl +++ b/src/mam/mod_mam_muc.erl @@ -43,10 +43,11 @@ -export([start/2, stop/1, supported_features/0]). %% ejabberd room handlers --export([disco_muc_features/1, +-export([disco_muc_features/3, filter_room_packet/3, - room_process_mam_iq/5, - forget_room/4]). + forget_room/3]). + +-export([room_process_mam_iq/5]). %% gdpr callback -export([get_personal_data/3]). @@ -56,9 +57,8 @@ -export([lookup_messages/2]). -export([archive_id_int/2]). --ignore_xref([archive_id/2, archive_message_for_ct/1, archive_size/2, behaviour_info/1, - delete_archive/2, disco_muc_features/1, filter_room_packet/3, - forget_room/4, get_personal_data/3, start/2, stop/1, supported_features/0]). +-ignore_xref([archive_id/2, archive_message_for_ct/1, archive_size/2, delete_archive/2, + start/2, stop/1, supported_features/0]). -include_lib("mongoose.hrl"). -include_lib("jlib.hrl"). @@ -82,12 +82,14 @@ %% ---------------------------------------------------------------------- %% API --spec get_personal_data(gdpr:personal_data(), mongooseim:host_type(), jid:jid()) -> - gdpr:personal_data(). -get_personal_data(Acc, HostType, ArcJID) -> +-spec get_personal_data(Acc, Params, Extra) -> {ok, Acc} when + Acc :: gdpr:personal_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). +get_personal_data(Acc, #{jid := ArcJID}, #{host_type := HostType}) -> Schema = ["id", "message"], Entries = mongoose_hooks:get_mam_muc_gdpr_data(HostType, ArcJID), - [{mam_muc, Schema, Entries} | Acc]. + {ok, [{mam_muc, Schema, Entries} | Acc]}. -spec delete_archive(jid:server(), jid:user()) -> ok. delete_archive(MucHost, RoomName) when is_binary(MucHost), is_binary(RoomName) -> @@ -119,7 +121,6 @@ archive_id(MucHost, RoomName) when is_binary(MucHost), is_binary(RoomName) -> start(HostType, Opts) -> ?LOG_DEBUG(#{what => mam_muc_starting}), ensure_metrics(HostType), - ejabberd_hooks:add(legacy_hooks(HostType)), gen_hook:add_handlers(hooks(HostType)), add_iq_handlers(HostType, Opts), ok. @@ -127,7 +128,6 @@ start(HostType, Opts) -> -spec stop(host_type()) -> any(). stop(HostType) -> ?LOG_DEBUG(#{what => mam_muc_stopping}), - ejabberd_hooks:delete(legacy_hooks(HostType)), gen_hook:delete_handlers(hooks(HostType)), remove_iq_handlers(HostType), ok. @@ -139,16 +139,21 @@ supported_features() -> %% ---------------------------------------------------------------------- %% hooks and handlers for MUC --spec disco_muc_features(mongoose_disco:feature_acc()) -> mongoose_disco:feature_acc(). -disco_muc_features(Acc = #{host_type := HostType, node := <<>>}) -> - mongoose_disco:add_features(mod_mam_utils:features(?MODULE, HostType), Acc); -disco_muc_features(Acc) -> - Acc. +-spec disco_muc_features(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mongoose_disco:feature_acc(), + Params :: map(), + Extra :: gen_hook:extra(). +disco_muc_features(Acc = #{host_type := HostType, node := <<>>}, _Params, _Extra) -> + {ok, mongoose_disco:add_features(mod_mam_utils:features(?MODULE, HostType), Acc)}; +disco_muc_features(Acc, _Params, _Extra) -> + {ok, Acc}. %% @doc Handle public MUC-message. --spec filter_room_packet(Packet :: packet(), HostType :: host_type(), - EventData :: mod_muc:room_event_data()) -> packet(). -filter_room_packet(Packet, HostType, EventData = #{}) -> +-spec filter_room_packet(Acc, Params, Extra) -> {ok, Acc} when + Acc :: exml:element(), + Params :: map(), + Extra :: gen_hook:extra(). +filter_room_packet(Packet, #{event_data := #{} = EventData}, #{host_type := HostType}) -> ?LOG_DEBUG(#{what => mam_room_packet, text => <<"Incoming room packet">>, packet => Packet, event_data => EventData}), IsArchivable = is_archivable_message(HostType, incoming, Packet), @@ -156,9 +161,10 @@ filter_room_packet(Packet, HostType, EventData = #{}) -> true -> #{from_nick := FromNick, from_jid := FromJID, room_jid := RoomJID, role := Role, affiliation := Affiliation, timestamp := TS} = EventData, - archive_room_packet(HostType, Packet, FromNick, FromJID, - RoomJID, Role, Affiliation, TS); - false -> Packet + {ok, archive_room_packet(HostType, Packet, FromNick, FromJID, + RoomJID, Role, Affiliation, TS)}; + false -> + {ok, Packet} end. %% @doc Archive without validation. @@ -213,7 +219,7 @@ archive_room_packet(HostType, Packet, FromNick, FromJID = #jid{}, From :: jid:jid(), To :: jid:jid(), IQ :: jlib:iq(), - Extra :: map()) -> {mongoose_acc:t(), jlib:iq() | ignore}. + Extra :: gen_hook:extra()) -> {mongoose_acc:t(), jlib:iq() | ignore}. room_process_mam_iq(Acc, From, To, IQ, #{host_type := HostType}) -> mod_mam_utils:maybe_log_deprecation(IQ), Action = mam_iq:action(IQ), @@ -235,10 +241,13 @@ room_process_mam_iq(Acc, From, To, IQ, #{host_type := HostType}) -> {Acc, return_action_not_allowed_error_iq(Reason, IQ)} end. --spec forget_room(map(), host_type(), jid:lserver(), binary()) -> map(). -forget_room(Acc, _HostType, MucServer, RoomName) -> +-spec forget_room(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{muc_host := jid:server(), room := jid:luser()}, + Extra :: gen_hook:extra(). +forget_room(Acc, #{muc_host := MucServer, room := RoomName}, _Extra) -> delete_archive(MucServer, RoomName), - Acc. + {ok, Acc}. %% ---------------------------------------------------------------------- %% Internal functions @@ -618,16 +627,13 @@ is_archivable_message(HostType, Dir, Packet) -> ArchiveChatMarkers = mod_mam_params:archive_chat_markers(?MODULE, HostType), erlang:apply(M, is_archivable_message, [?MODULE, Dir, Packet, ArchiveChatMarkers]). --spec legacy_hooks(host_type()) -> [ejabberd_hooks:hook()]. -legacy_hooks(HostType) -> - [{disco_muc_features, HostType, ?MODULE, disco_muc_features, 99}, - {filter_room_packet, HostType, ?MODULE, filter_room_packet, 60}, - {forget_room, HostType, ?MODULE, forget_room, 90}, - {get_personal_data, HostType, ?MODULE, get_personal_data, 50}]. - -spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). hooks(HostType) -> - mongoose_metrics_mam_hooks:get_mam_muc_hooks(HostType). + [{disco_muc_features, HostType, fun ?MODULE:disco_muc_features/3, #{}, 99}, + {filter_room_packet, HostType, fun ?MODULE:filter_room_packet/3, #{}, 60}, + {forget_room, HostType, fun ?MODULE:forget_room/3, #{}, 90}, + {get_personal_data, HostType, fun ?MODULE:get_personal_data/3, #{}, 50} + | mongoose_metrics_mam_hooks:get_mam_muc_hooks(HostType)]. add_iq_handlers(HostType, Opts) -> IQDisc = gen_mod:get_opt(iqdisc, Opts, parallel), diff --git a/src/mam/mod_mam_muc_cassandra_arch.erl b/src/mam/mod_mam_muc_cassandra_arch.erl index 29da664ff62..15fe4d3f1be 100644 --- a/src/mam/mod_mam_muc_cassandra_arch.erl +++ b/src/mam/mod_mam_muc_cassandra_arch.erl @@ -7,22 +7,20 @@ -module(mod_mam_muc_cassandra_arch). -behaviour(mongoose_cassandra). -behaviour(ejabberd_gen_mam_archive). +-behaviour(gen_mod). %% gen_mod handlers -export([start/2, stop/1]). %% MAM hook handlers --export([archive_size/4, +-export([archive_size/3, archive_message/3, lookup_messages/3, - remove_archive/4]). + remove_archive/3, + get_mam_muc_gdpr_data/3]). %% mongoose_cassandra callbacks --export([prepared_queries/0, get_mam_muc_gdpr_data/3]). - --ignore_xref([ - behaviour_info/1, remove_archive/4, start/2, stop/1 -]). +-export([prepared_queries/0]). %% ---------------------------------------------------------------------- %% Imports @@ -74,21 +72,22 @@ -spec start(host_type(), gen_mod:module_opts()) -> ok. start(HostType, _Opts) -> - ejabberd_hooks:add(hooks(HostType)). + gen_hook:add_handlers(hooks(HostType)). -spec stop(host_type()) -> ok. stop(HostType) -> - ejabberd_hooks:delete(hooks(HostType)). + gen_hook:delete_handlers(hooks(HostType)). %% ---------------------------------------------------------------------- %% Add hooks for mod_mam_muc +-spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). hooks(HostType) -> - [{mam_muc_archive_message, HostType, ?MODULE, archive_message, 50}, - {mam_muc_archive_size, HostType, ?MODULE, archive_size, 50}, - {mam_muc_lookup_messages, HostType, ?MODULE, lookup_messages, 50}, - {mam_muc_remove_archive, HostType, ?MODULE, remove_archive, 50}, - {get_mam_muc_gdpr_data, HostType, ?MODULE, get_mam_muc_gdpr_data, 50}]. + [{mam_muc_archive_message, HostType, fun ?MODULE:archive_message/3, #{}, 50}, + {mam_muc_archive_size, HostType, fun ?MODULE:archive_size/3, #{}, 50}, + {mam_muc_lookup_messages, HostType, fun ?MODULE:lookup_messages/3, #{}, 50}, + {mam_muc_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}, + {get_mam_muc_gdpr_data, HostType, fun ?MODULE:get_mam_muc_gdpr_data/3, #{}, 50}]. %% ---------------------------------------------------------------------- %% mongoose_cassandra_worker callbacks @@ -114,11 +113,15 @@ prepared_queries() -> %% ---------------------------------------------------------------------- %% Internal functions and callbacks -archive_size(Size, HostType, _RoomID, RoomJID) when is_integer(Size) -> +-spec archive_size(Acc, Params, Extra) -> {ok, Acc} when + Acc :: integer(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, room := jid:jid()}, + Extra :: gen_hook:extra(). +archive_size(Size, #{room := RoomJID}, #{host_type := HostType}) when is_integer(Size) -> PoolName = pool_name(HostType), Borders = Start = End = WithNick = undefined, Filter = prepare_filter(RoomJID, Borders, Start, End, WithNick), - calc_count(PoolName, RoomJID, HostType, Filter). + {ok, calc_count(PoolName, RoomJID, HostType, Filter)}. %% ---------------------------------------------------------------------- @@ -129,11 +132,15 @@ insert_query_cql() -> "(id, room_jid, from_jid, nick_name, with_nick, message) " "VALUES (?, ?, ?, ?, ?, ?)". -archive_message(_Result, HostType, Params) -> +-spec archive_message(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok | {error, term()}, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). +archive_message(_Result, Params, #{host_type := HostType}) -> try - archive_message2(Params, HostType) + {ok, archive_message2(Params, HostType)} catch _Type:Reason -> - {error, Reason} + {ok, {error, Reason}} end. archive_message2(#{message_id := MessID, @@ -184,7 +191,11 @@ remove_archive_offsets_query_cql() -> select_for_removal_query_cql() -> "SELECT DISTINCT room_jid, with_nick FROM mam_muc_message WHERE room_jid = ?". -remove_archive(Acc, HostType, _RoomID, RoomJID) -> +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, room := jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{room := RoomJID}, #{host_type := HostType}) -> BRoomJID = mod_mam_utils:bare_jid(RoomJID), PoolName = pool_name(HostType), Params = #{room_jid => BRoomJID}, @@ -200,31 +211,34 @@ remove_archive(Acc, HostType, _RoomID, RoomJID) -> mongoose_cassandra:cql_foldl(PoolName, RoomJID, ?MODULE, select_for_removal_query, Params, DeleteFun, []), - Acc. + {ok, Acc}. %% ---------------------------------------------------------------------- %% SELECT MESSAGES --spec lookup_messages(Result :: any(), HostType :: host_type(), Params :: map()) -> - {ok, mod_mam:lookup_result()}. -lookup_messages({error, _Reason} = Result, _HostType, _Params) -> - Result; -lookup_messages(_Result, _HostType, #{search_text := <<_/binary>>}) -> - {error, 'not-supported'}; -lookup_messages(_Result, HostType, +-spec lookup_messages(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()}, + Params :: mam_iq:lookup_params(), + Extra :: gen_hook:extra(). +lookup_messages({error, _Reason} = Result, _Params, _Extra) -> + {ok, Result}; +lookup_messages(_Result, #{search_text := <<_/binary>>}, _Extra) -> + {ok, {error, 'not-supported'}}; +lookup_messages(_Result, #{owner_jid := RoomJID, rsm := RSM, borders := Borders, start_ts := Start, end_ts := End, with_jid := WithJID, search_text := undefined, page_size := PageSize, - is_simple := IsSimple}) -> + is_simple := IsSimple}, + #{host_type := HostType}) -> try WithNick = maybe_jid_to_nick(WithJID), PoolName = pool_name(HostType), - lookup_messages2(PoolName, HostType, + {ok, lookup_messages2(PoolName, HostType, RoomJID, RSM, Borders, Start, End, WithNick, - PageSize, IsSimple) - catch _Type:Reason:S -> - {error, {Reason, {stacktrace, S}}} + PageSize, IsSimple)} + catch _Type:Reason:Stacktrace -> + {ok, {error, {Reason, {stacktrace, Stacktrace}}}} end. maybe_jid_to_nick(#jid{lresource = BNick}) -> BNick; @@ -421,17 +435,18 @@ row_to_uniform_format(#{nick_name := BNick, message := Data, id := MessID}, row_to_message_id(#{id := MsgID}) -> MsgID. --spec get_mam_muc_gdpr_data(ejabberd_gen_mam_archive:mam_muc_gdpr_data(), - host_type(), jid:jid()) -> - ejabberd_gen_mam_archive:mam_muc_gdpr_data(). -get_mam_muc_gdpr_data(Acc, HostType, Jid) -> +-spec get_mam_muc_gdpr_data(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ejabberd_gen_mam_archive:mam_muc_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). +get_mam_muc_gdpr_data(Acc, #{jid := Jid}, #{host_type := HostType}) -> BinJid = jid:to_binary(jid:to_lower(Jid)), PoolName = pool_name(HostType), FilterMap = #{from_jid => BinJid}, Rows = fetch_user_messages(PoolName, Jid, FilterMap), Messages = [{Id, exml:to_binary(stored_binary_to_packet(HostType, Data))} || #{message := Data, id:= Id} <- Rows], - Messages ++ Acc. + {ok, Messages ++ Acc}. %% Offset is not supported %% Each record is a tuple of form diff --git a/src/mam/mod_mam_muc_elasticsearch_arch.erl b/src/mam/mod_mam_muc_elasticsearch_arch.erl index af41199f603..e852b0ea23c 100644 --- a/src/mam/mod_mam_muc_elasticsearch_arch.erl +++ b/src/mam/mod_mam_muc_elasticsearch_arch.erl @@ -28,14 +28,10 @@ %% ejabberd_gen_mam_archive callbacks -export([archive_message/3]). -export([lookup_messages/3]). --export([remove_archive/4]). --export([archive_size/4]). - -%gdpr +-export([remove_archive/3]). +-export([archive_size/3]). -export([get_mam_muc_gdpr_data/3]). --ignore_xref([remove_archive/4]). - -include("mongoose.hrl"). -include("mongoose_rsm.hrl"). -include("mod_mam.hrl"). @@ -50,21 +46,22 @@ -spec start(mongooseim:host_type(), gen_mod:module_opts()) -> ok. start(HostType, _Opts) -> - ejabberd_hooks:add(hooks(HostType)), + gen_hook:add_handlers(hooks(HostType)), ok. -spec stop(mongooseim:host_type()) -> ok. stop(HostType) -> - ejabberd_hooks:delete(hooks(HostType)), + gen_hook:delete_handlers(hooks(HostType)), ok. %%------------------------------------------------------------------- %% ejabberd_gen_mam_archive callbacks %%------------------------------------------------------------------- --spec get_mam_muc_gdpr_data(ejabberd_gen_mam_archive:mam_muc_gdpr_data(), - mongooseim:host_type(), jid:jid()) -> - ejabberd_gen_mam_archive:mam_muc_gdpr_data(). -get_mam_muc_gdpr_data(Acc, _HostType, Source) -> +-spec get_mam_muc_gdpr_data(Acc, Params, Extra) -> {ok | stop, Acc} when + Acc :: ejabberd_gen_mam_archive:mam_muc_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). +get_mam_muc_gdpr_data(Acc, #{jid := Source}, _Extra) -> BinSource = mod_mam_utils:bare_jid(Source), Filter = #{term => #{from_jid => BinSource}}, Sorting = #{mam_id => #{order => asc}}, @@ -73,16 +70,21 @@ get_mam_muc_gdpr_data(Acc, _HostType, Source) -> case mongoose_elasticsearch:search(?INDEX_NAME, ?TYPE_NAME, SearchQuery) of {ok, #{<<"hits">> := #{<<"hits">> := Hits}}} -> Messages = lists:map(fun hit_to_gdpr_mam_message/1, Hits), - Messages ++ Acc; + {ok, Messages ++ Acc}; {error, _} -> - Acc + {ok, Acc} end. -archive_message(_Result, Host, #{message_id := MessageId, - local_jid := RoomJid, - remote_jid := FromJID, - source_jid := SourceJid, - packet := Packet} = Params) -> +-spec archive_message(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok | {error, term()}, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). +archive_message(_Result, Params, #{host_type := HostType}) -> + #{message_id := MessageId, + local_jid := RoomJid, + remote_jid := FromJID, + source_jid := SourceJid, + packet := Packet} = Params, Room = mod_mam_utils:bare_jid(RoomJid), SourceBinJid = mod_mam_utils:full_jid(SourceJid), From = mod_mam_utils:bare_jid(FromJID), @@ -90,29 +92,38 @@ archive_message(_Result, Host, #{message_id := MessageId, Doc = make_document(MessageId, Room, SourceBinJid, Packet, From), case mongoose_elasticsearch:insert_document(?INDEX_NAME, ?TYPE_NAME, DocId, Doc) of {ok, _} -> - ok; + {ok, ok}; {error, Reason} = Err -> ?LOG_ERROR(maps:merge(Params, #{what => archive_muc_message_failed, reason => Reason, - server => Host, room => Room, source => SourceBinJid, + server => HostType, room => Room, source => SourceBinJid, message_id => MessageId})), - mongoose_metrics:update(Host, modMamDropped, 1), - Err + mongoose_metrics:update(HostType, modMamDropped, 1), + {ok, Err} end. -lookup_messages(Result, Host, #{rsm := #rsm_in{direction = before, id = ID} = RSM} = Params) +-spec lookup_messages(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()} | {error, term()}, + Params :: mam_iq:lookup_params(), + Extra :: gen_hook:extra(). +lookup_messages(Result, + #{rsm := #rsm_in{direction = before, id = ID} = RSM} = Params, + #{host_type := HostType}) when ID =/= undefined -> - lookup_message_page(Result, Host, RSM, Params); -lookup_messages(Result, Host, #{rsm := #rsm_in{direction = aft, id = ID} = RSM} = Params) + {ok, lookup_message_page(Result, HostType, RSM, Params)}; +lookup_messages(Result, + #{rsm := #rsm_in{direction = aft, id = ID} = RSM} = Params, + #{host_type := HostType}) when ID =/= undefined -> - lookup_message_page(Result, Host, RSM, Params); -lookup_messages(Result, Host, Params) -> - do_lookup_messages(Result, Host, Params). + {ok, lookup_message_page(Result, HostType, RSM, Params)}; +lookup_messages(Result, Params, #{host_type := HostType}) -> + {ok, do_lookup_messages(Result, HostType, Params)}. lookup_message_page(AccResult, Host, RSM, Params) -> PageSize = maps:get(page_size, Params), case do_lookup_messages(AccResult, Host, Params#{page_size := 1 + PageSize}) of - {error, _} = Err -> Err; + {error, _} = Err -> + Err; {ok, LookupResult} -> mod_mam_utils:check_for_item_not_found(RSM, PageSize, LookupResult) end. @@ -134,41 +145,41 @@ do_lookup_messages(_Result, Host, Params) -> Err end. --spec archive_size(Size :: integer(), - Host :: jid:server(), - _ArchiveId, - RoomJid :: jid:jid()) -> non_neg_integer(). -archive_size(_Size, _Host, _ArchiveId, RoomJid) -> +-spec archive_size(Acc, Params, Extra) -> {ok, Acc} when + Acc :: integer(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, room := jid:jid()}, + Extra :: gen_hook:extra(). +archive_size(_Size, #{room := RoomJid}, _Extra) -> SearchQuery = build_search_query(#{owner_jid => RoomJid}), - archive_size(SearchQuery). + {ok, archive_size(SearchQuery)}. --spec remove_archive(Acc :: mongoose_acc:t(), - Host :: jid:server(), - ArchiveId :: mod_mam:archive_id(), - RoomJid :: jid:jid()) -> Acc when Acc :: map(). -remove_archive(Acc, Host, _ArchiveId, RoomJid) -> +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok, + Params :: #{archive_id := mod_mam:archive_id() | undefined, room := jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{room := RoomJid}, #{host_type := HostType}) -> SearchQuery = build_search_query(#{owner_jid => RoomJid}), case mongoose_elasticsearch:delete_by_query(?INDEX_NAME, ?TYPE_NAME, SearchQuery) of ok -> ok; {error, Reason} -> ?LOG_ERROR(#{what => remove_muc_archive_failed, - server => Host, room_jid => RoomJid, reason => Reason}), + server => HostType, room_jid => RoomJid, reason => Reason}), ok end, - Acc. + {ok, Acc}. %%------------------------------------------------------------------- %% Helpers %%------------------------------------------------------------------- --spec hooks(jid:lserver()) -> [ejabberd_hooks:hook()]. +-spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). hooks(Host) -> - [{mam_muc_archive_message, Host, ?MODULE, archive_message, 50}, - {mam_muc_lookup_messages, Host, ?MODULE, lookup_messages, 50}, - {mam_muc_archive_size, Host, ?MODULE, archive_size, 50}, - {mam_muc_remove_archive, Host, ?MODULE, remove_archive, 50}, - {get_mam_muc_gdpr_data, Host, ?MODULE, get_mam_muc_gdpr_data, 50}]. + [{mam_muc_archive_message, Host, fun ?MODULE:archive_message/3, #{}, 50}, + {mam_muc_lookup_messages, Host, fun ?MODULE:lookup_messages/3, #{}, 50}, + {mam_muc_archive_size, Host, fun ?MODULE:archive_size/3, #{}, 50}, + {mam_muc_remove_archive, Host, fun ?MODULE:remove_archive/3, #{}, 50}, + {get_mam_muc_gdpr_data, Host, fun ?MODULE:get_mam_muc_gdpr_data/3, #{}, 50}]. -spec make_document_id(binary(), mod_mam:message_id()) -> binary(). make_document_id(Room, MessageId) -> diff --git a/src/mam/mod_mam_muc_rdbms_arch.erl b/src/mam/mod_mam_muc_rdbms_arch.erl index 5106ea33888..4d396cec3fb 100644 --- a/src/mam/mod_mam_muc_rdbms_arch.erl +++ b/src/mam/mod_mam_muc_rdbms_arch.erl @@ -20,20 +20,17 @@ -callback encode(term()) -> binary(). -callback decode(binary()) -> term(). --export([archive_size/4, +-export([archive_size/3, archive_message/3, lookup_messages/3, - remove_archive/4, - remove_domain/3]). - --export([get_mam_muc_gdpr_data/3]). + remove_archive/3, + remove_domain/3, + get_mam_muc_gdpr_data/3]). %% Called from mod_mam_muc_rdbms_async_pool_writer -export([prepare_message/2, retract_message/2, prepare_insert/2]). -export([extend_params_with_sender_id/2]). --ignore_xref([behaviour_info/1, remove_archive/4]). - %% ---------------------------------------------------------------------- %% Imports @@ -65,18 +62,19 @@ stop(HostType) -> supported_features() -> [dynamic_domains]. --spec get_mam_muc_gdpr_data(ejabberd_gen_mam_archive:mam_pm_gdpr_data(), - host_type(), jid:jid()) -> - ejabberd_gen_mam_archive:mam_muc_gdpr_data(). -get_mam_muc_gdpr_data(Acc, HostType, #jid{luser = LUser, lserver = LServer} = _UserJID) -> +-spec get_mam_muc_gdpr_data(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ejabberd_gen_mam_archive:mam_muc_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). +get_mam_muc_gdpr_data(Acc, #{jid := #jid{luser = LUser, lserver = LServer}}, #{host_type := HostType}) -> case mod_mam_pm:archive_id(LServer, LUser) of undefined -> - Acc; + {ok, Acc}; SenderID -> %% We don't know the real room JID here, use FakeEnv FakeEnv = env_vars(HostType, jid:make(<<>>, <<>>, <<>>)), {selected, Rows} = extract_gdpr_messages(HostType, SenderID), - [mam_decoder:decode_muc_gdpr_row(Row, FakeEnv) || Row <- Rows] ++ Acc + {ok, [mam_decoder:decode_muc_gdpr_row(Row, FakeEnv) || Row <- Rows] ++ Acc} end. %% ---------------------------------------------------------------------- @@ -84,30 +82,26 @@ get_mam_muc_gdpr_data(Acc, HostType, #jid{luser = LUser, lserver = LServer} = _U -spec start_hooks(host_type()) -> ok. start_hooks(HostType) -> - ejabberd_hooks:add(legacy_hooks(HostType)), gen_hook:add_handlers(hooks(HostType)). -spec stop_hooks(host_type()) -> ok. stop_hooks(HostType) -> - ejabberd_hooks:delete(legacy_hooks(HostType)), gen_hook:delete_handlers(hooks(HostType)). -legacy_hooks(HostType) -> +-spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). +hooks(HostType) -> case gen_mod:get_module_opt(HostType, ?MODULE, no_writer) of true -> []; false -> - [{mam_muc_archive_message, HostType, ?MODULE, archive_message, 50}] + [{mam_muc_archive_message, HostType, fun ?MODULE:archive_message/3, #{}, 50}] end ++ - [{mam_muc_archive_size, HostType, ?MODULE, archive_size, 50}, - {mam_muc_lookup_messages, HostType, ?MODULE, lookup_messages, 50}, - {mam_muc_remove_archive, HostType, ?MODULE, remove_archive, 50}, - {get_mam_muc_gdpr_data, HostType, ?MODULE, get_mam_muc_gdpr_data, 50}]. - --spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). -hooks(HostType) -> [ - {remove_domain, HostType, fun ?MODULE:remove_domain/3, #{}, 50} + {remove_domain, HostType, fun ?MODULE:remove_domain/3, #{}, 50}, + {mam_muc_archive_size, HostType, fun ?MODULE:archive_size/3, #{}, 50}, + {mam_muc_lookup_messages, HostType, fun ?MODULE:lookup_messages/3, #{}, 50}, + {mam_muc_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}, + {get_mam_muc_gdpr_data, HostType, fun ?MODULE:get_mam_muc_gdpr_data/3, #{}, 50} ]. %% ---------------------------------------------------------------------- @@ -217,33 +211,37 @@ get_retract_id(Packet, #{has_message_retraction := Enabled}) -> %% ---------------------------------------------------------------------- %% Internal functions and callbacks --spec archive_size(Size :: integer(), HostType :: mongooseim:host_type(), - ArcId :: mod_mam:archive_id(), ArcJID :: jid:jid()) -> integer(). -archive_size(Size, HostType, ArcID, ArcJID) when is_integer(Size) -> +-spec archive_size(Acc, Params, Extra) -> {ok, Acc} when + Acc :: integer(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, room := jid:jid()}, + Extra :: gen_hook:extra(). +archive_size(Size, #{archive_id := ArcID, room := ArcJID}, #{host_type := HostType}) when is_integer(Size) -> Filter = [{equal, room_id, ArcID}], Env = env_vars(HostType, ArcJID), Result = lookup_query(count, Env, Filter, unordered, all), - mongoose_rdbms:selected_to_integer(Result). + {ok, mongoose_rdbms:selected_to_integer(Result)}. extend_params_with_sender_id(HostType, Params = #{remote_jid := SenderJID}) -> BareSenderJID = jid:to_bare(SenderJID), SenderID = mod_mam_pm:archive_id_int(HostType, BareSenderJID), Params#{sender_id => SenderID}. --spec archive_message(_Result, HostType :: mongooseim:host_type(), - mod_mam:archive_message_params()) -> ok. -archive_message(_Result, HostType, Params0 = #{local_jid := ArcJID}) -> +-spec archive_message(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). +archive_message(_Result, #{local_jid := ArcJID} = Params0, #{host_type := HostType}) -> try Params = extend_params_with_sender_id(HostType, Params0), Env = env_vars(HostType, ArcJID), do_archive_message(HostType, Params, Env), retract_message(HostType, Params, Env), - ok + {ok, ok} catch error:Reason:StackTrace -> - ?LOG_ERROR(#{what => archive_message_failed, - host_type => HostType, mam_params => Params0, - reason => Reason, stacktrace => StackTrace}), - erlang:raise(error, Reason, StackTrace) + ?LOG_ERROR(#{what => archive_message_failed, + host_type => HostType, mam_params => Params0, + reason => Reason, stacktrace => StackTrace}), + erlang:raise(error, Reason, StackTrace) end. do_archive_message(HostType, Params, Env) -> @@ -311,17 +309,18 @@ prepare_insert(Name, NumRows) -> ok. %% Removal logic --spec remove_archive(Acc :: mongoose_acc:t(), HostType :: mongooseim:host_type(), - ArcID :: mod_mam:archive_id(), - ArcJID :: jid:jid()) -> mongoose_acc:t(). -remove_archive(Acc, HostType, ArcID, _ArcJID) -> +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mongoose_acc:t(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, room := jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{archive_id := ArcID}, #{host_type := HostType}) -> mongoose_rdbms:execute_successfully(HostType, mam_muc_archive_remove, [ArcID]), - Acc. + {ok, Acc}. -spec remove_domain(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_domain_api:remove_domain_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> F = fun() -> case gen_mod:get_module_opt(HostType, ?MODULE, delete_domain_limit) of @@ -371,15 +370,17 @@ extract_gdpr_messages(HostType, SenderID) -> mongoose_rdbms:execute_successfully(HostType, mam_muc_extract_gdpr_messages, [SenderID]). %% Lookup logic --spec lookup_messages(Result :: any(), HostType :: mongooseim:host_type(), Params :: map()) -> - {ok, mod_mam:lookup_result()}. -lookup_messages({error, _Reason} = Result, _HostType, _Params) -> - Result; -lookup_messages(_Result, HostType, Params = #{owner_jid := ArcJID}) -> +-spec lookup_messages(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()}, + Params :: mam_iq:lookup_params(), + Extra :: gen_hook:extra(). +lookup_messages({error, _Reason} = Result, _Params, _Extra) -> + {ok, Result}; +lookup_messages(_Result, #{owner_jid := ArcJID} = Params, #{host_type := HostType}) -> Env = env_vars(HostType, ArcJID), ExdParams = mam_encoder:extend_lookup_params(Params, Env), Filter = mam_filter:produce_filter(ExdParams, lookup_fields()), - mam_lookup:lookup(Env, Filter, ExdParams). + {ok, mam_lookup:lookup(Env, Filter, ExdParams)}. lookup_query(QueryType, Env, Filters, Order, OffsetLimit) -> mam_lookup_sql:lookup_query(QueryType, Env, Filters, Order, OffsetLimit). diff --git a/src/mam/mod_mam_muc_rdbms_arch_async.erl b/src/mam/mod_mam_muc_rdbms_arch_async.erl index 6199a9e8d4c..48077feb386 100644 --- a/src/mam/mod_mam_muc_rdbms_arch_async.erl +++ b/src/mam/mod_mam_muc_rdbms_arch_async.erl @@ -9,18 +9,28 @@ -behaviour(gen_mod). -export([start/2, stop/1, supported_features/0]). --export([archive_muc_message/3, mam_muc_archive_sync/2, flush/2]). --ignore_xref([archive_muc_message/3, mam_muc_archive_sync/2, flush/2]). +-export([archive_muc_message/3, mam_muc_archive_sync/3]). +-export([flush/2]). +-ignore_xref([flush/2]). --spec archive_muc_message(_Result, mongooseim:host_type(), mod_mam:archive_message_params()) -> ok. -archive_muc_message(_Result, HostType, Params0 = #{archive_id := RoomID}) -> +-spec archive_muc_message(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()}, + Params :: map(), + Extra :: gen_hook:extra(). +archive_muc_message(Result, + #{archive_id := RoomID} = Params0, + #{host_type := HostType}) -> Params = mod_mam_muc_rdbms_arch:extend_params_with_sender_id(HostType, Params0), - mongoose_async_pools:put_task(HostType, muc_mam, RoomID, Params). + mongoose_async_pools:put_task(HostType, muc_mam, RoomID, Params), + {ok, Result}. --spec mam_muc_archive_sync(term(), mongooseim:host_type()) -> term(). -mam_muc_archive_sync(Result, HostType) -> +-spec mam_muc_archive_sync(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok, + Params :: map(), + Extra :: gen_hook:extra(). +mam_muc_archive_sync(Result, _Params, #{host_type := HostType}) -> mongoose_async_pools:sync(HostType, muc_mam), - Result. + {ok, Result}. %%% gen_mod callbacks -spec start(mongooseim:host_type(), gen_mod:module_opts()) -> any(). @@ -29,16 +39,21 @@ start(HostType, Opts) -> mod_mam_rdbms_arch_async:prepare_insert_queries(muc, Extra), mongoose_metrics:ensure_metric(HostType, ?PER_MESSAGE_FLUSH_TIME, histogram), mongoose_metrics:ensure_metric(HostType, ?FLUSH_TIME, histogram), - ejabberd_hooks:add(mam_muc_archive_sync, HostType, ?MODULE, mam_muc_archive_sync, 50), - ejabberd_hooks:add(mam_muc_archive_message, HostType, ?MODULE, archive_muc_message, 50), + gen_hook:add_handlers(hooks(HostType)), mongoose_async_pools:start_pool(HostType, muc_mam, PoolOpts). -spec stop(mongooseim:host_type()) -> any(). stop(HostType) -> - ejabberd_hooks:delete(mam_muc_archive_sync, HostType, ?MODULE, mam_muc_archive_sync, 50), - ejabberd_hooks:delete(mam_muc_archive_message, HostType, ?MODULE, archive_muc_message, 50), + gen_hook:delete_handlers(hooks(HostType)), mongoose_async_pools:stop_pool(HostType, muc_mam). +-spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). +hooks(HostType) -> + [ + {mam_muc_archive_sync, HostType, fun ?MODULE:mam_muc_archive_sync/3, #{}, 50}, + {mam_muc_archive_message, HostType, fun ?MODULE:archive_muc_message/3, #{}, 50} + ]. + -spec supported_features() -> [atom()]. supported_features() -> [dynamic_domains]. diff --git a/src/mam/mod_mam_pm.erl b/src/mam/mod_mam_pm.erl index 6610236b8d3..f6529d55d11 100644 --- a/src/mam/mod_mam_pm.erl +++ b/src/mam/mod_mam_pm.erl @@ -175,7 +175,7 @@ disco_local_features(Acc, _, _) -> -spec user_send_packet(Acc, Args, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Args :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). user_send_packet(Acc, _, _) -> {From, To, Packet} = mongoose_acc:packet(Acc), ?LOG_DEBUG(#{what => mam_user_send_packet, acc => Acc}), @@ -193,7 +193,7 @@ user_send_packet(Acc, _, _) -> (FPacketAcc, Params, Extra) -> {ok, FPacketAcc} when FPacketAcc :: mongoose_hooks:filter_packet_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). filter_packet(drop, _, _) -> {ok, drop}; filter_packet({From, To, Acc1, Packet}, _, _) -> @@ -228,7 +228,7 @@ process_incoming_packet(From, To, Packet, Acc) -> -spec remove_user(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). remove_user(Acc, #{jid := JID}, _) -> delete_archive(JID), {ok, Acc}. @@ -236,7 +236,7 @@ remove_user(Acc, #{jid := JID}, _) -> -spec determine_amp_strategy(StrategyAcc, Params, Extra) -> {ok, StrategyAcc} when StrategyAcc :: mod_amp:amp_strategy(), Params :: #{from := jid:jid(), to := jid:jid(), packet := exml:element(), event := mod_amp:amp_event()}, - Extra :: map(). + Extra :: gen_hook:extra(). determine_amp_strategy(Strategy = #amp_strategy{deliver = Deliver}, #{from := FromJID, to := ToJID, packet := Packet, event := initial_check}, _) -> @@ -255,7 +255,7 @@ determine_amp_strategy(Strategy, _, _) -> -spec sm_filter_offline_message(Acc, Params, Extra) -> {ok, Acc} when Acc :: boolean(), Params :: #{packet := exml:element()}, - Extra :: map(). + Extra :: gen_hook:extra(). sm_filter_offline_message(_Drop=false, #{packet := Packet}, _) -> %% If ... {ok, mod_mam_utils:is_mam_result_message(Packet)}; diff --git a/src/mam/mod_mam_rdbms_arch.erl b/src/mam/mod_mam_rdbms_arch.erl index 6e2800b903f..0556e6cd966 100644 --- a/src/mam/mod_mam_rdbms_arch.erl +++ b/src/mam/mod_mam_rdbms_arch.erl @@ -20,19 +20,16 @@ -callback encode(term()) -> binary(). -callback decode(binary()) -> term(). --export([archive_size/4, +-export([archive_size/3, archive_message/3, lookup_messages/3, - remove_archive/4, - remove_domain/3]). - --export([get_mam_pm_gdpr_data/3]). + remove_archive/3, + remove_domain/3, + get_mam_pm_gdpr_data/3]). %% Called from mod_mam_rdbms_async_pool_writer -export([prepare_message/2, retract_message/2, prepare_insert/2]). --ignore_xref([behaviour_info/1, remove_archive/4]). - -type host_type() :: mongooseim:host_type(). %% ---------------------------------------------------------------------- @@ -80,18 +77,20 @@ stop(HostType) -> supported_features() -> [dynamic_domains]. --spec get_mam_pm_gdpr_data(ejabberd_gen_mam_archive:mam_pm_gdpr_data(), - host_type(), jid:jid()) -> - ejabberd_gen_mam_archive:mam_pm_gdpr_data(). -get_mam_pm_gdpr_data(Acc, HostType, - #jid{luser = LUser, lserver = LServer} = ArcJID) -> +-spec get_mam_pm_gdpr_data(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ejabberd_gen_mam_archive:mam_pm_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). +get_mam_pm_gdpr_data(Acc, + #{jid := #jid{luser = LUser, lserver = LServer} = ArcJID}, + #{host_type := HostType}) -> case mod_mam_pm:archive_id(LServer, LUser) of undefined -> - Acc; + {ok, Acc}; ArcID -> Env = env_vars(HostType, ArcJID), {selected, Rows} = extract_gdpr_messages(Env, ArcID), - [uniform_to_gdpr(row_to_uniform_format(Row, Env)) || Row <- Rows] ++ Acc + {ok, [uniform_to_gdpr(row_to_uniform_format(Row, Env)) || Row <- Rows] ++ Acc} end. -spec uniform_to_gdpr(mod_mam:message_row()) -> tuple(). @@ -103,31 +102,25 @@ uniform_to_gdpr(#{id := MessID, jid := RemoteJID, packet := Packet}) -> -spec start_hooks(host_type()) -> ok. start_hooks(HostType) -> - ejabberd_hooks:add(legacy_hooks(HostType)), gen_hook:add_handlers(hooks(HostType)). -spec stop_hooks(host_type()) -> ok. stop_hooks(HostType) -> - ejabberd_hooks:delete(legacy_hooks(HostType)), gen_hook:delete_handlers(hooks(HostType)). -legacy_hooks(HostType) -> +-spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). +hooks(HostType) -> case gen_mod:get_module_opt(HostType, ?MODULE, no_writer) of true -> []; false -> - [{mam_archive_message, HostType, ?MODULE, archive_message, 50}] + [{mam_archive_message, HostType, fun ?MODULE:archive_message/3, #{}, 50}] end ++ - [{mam_archive_size, HostType, ?MODULE, archive_size, 50}, - {mam_lookup_messages, HostType, ?MODULE, lookup_messages, 50}, - {mam_remove_archive, HostType, ?MODULE, remove_archive, 50}, - {get_mam_pm_gdpr_data, HostType, ?MODULE, get_mam_pm_gdpr_data, 50}]. - --spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). -hooks(HostType) -> - [ - {remove_domain, HostType, fun ?MODULE:remove_domain/3, #{}, 50} - ]. + [{mam_archive_size, HostType, fun ?MODULE:archive_size/3, #{}, 50}, + {mam_lookup_messages, HostType, fun ?MODULE:lookup_messages/3, #{}, 50}, + {mam_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}, + {get_mam_pm_gdpr_data, HostType, fun ?MODULE:get_mam_pm_gdpr_data/3, #{}, 50}, + {remove_domain, HostType, fun ?MODULE:remove_domain/3, #{}, 50}]. %% ---------------------------------------------------------------------- %% SQL queries @@ -247,27 +240,32 @@ get_retract_id(Packet, #{has_message_retraction := Enabled}) -> %% ---------------------------------------------------------------------- %% Internal functions and callbacks --spec archive_size(Size :: integer(), HostType :: host_type(), - ArcId :: mod_mam:archive_id(), ArcJID :: jid:jid()) -> integer(). -archive_size(Size, HostType, ArcID, ArcJID) when is_integer(Size) -> +-spec archive_size(Acc, Params, Extra) -> {ok, Acc} when + Acc :: integer(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner := jid:jid()}, + Extra :: gen_hook:extra(). +archive_size(Size, #{archive_id := ArcID, owner := ArcJID}, #{host_type := HostType}) when is_integer(Size) -> Filter = [{equal, user_id, ArcID}], Env = env_vars(HostType, ArcJID), Result = lookup_query(count, Env, Filter, unordered, all), - mongoose_rdbms:selected_to_integer(Result). + {ok, mongoose_rdbms:selected_to_integer(Result)}. --spec archive_message(_Result, host_type(), mod_mam:archive_message_params()) -> ok. -archive_message(_Result, HostType, Params = #{local_jid := ArcJID}) -> +-spec archive_message(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). +archive_message(_Result, #{local_jid := ArcJID} = Params, #{host_type := HostType}) -> try assert_archive_id_provided(Params), Env = env_vars(HostType, ArcJID), do_archive_message(HostType, Params, Env), retract_message(HostType, Params, Env), - ok + {ok, ok} catch error:Reason:StackTrace -> - ?LOG_ERROR(#{what => archive_message_failed, - host_type => HostType, mam_params => Params, - reason => Reason, stacktrace => StackTrace}), - erlang:raise(error, Reason, StackTrace) + ?LOG_ERROR(#{what => archive_message_failed, + host_type => HostType, mam_params => Params, + reason => Reason, stacktrace => StackTrace}), + erlang:raise(error, Reason, StackTrace) end. do_archive_message(HostType, Params, Env) -> @@ -340,17 +338,18 @@ prepare_insert(Name, NumRows) -> ok. %% Removal logic --spec remove_archive(Acc :: mongoose_acc:t(), HostType :: host_type(), - ArcID :: mod_mam:archive_id(), - RoomJID :: jid:jid()) -> mongoose_acc:t(). -remove_archive(Acc, HostType, ArcID, _ArcJID) -> +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner := jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{archive_id := ArcID}, #{host_type := HostType}) -> mongoose_rdbms:execute_successfully(HostType, mam_archive_remove, [ArcID]), - Acc. + {ok, Acc}. -spec remove_domain(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_domain_api:remove_domain_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> F = fun() -> case gen_mod:get_module_opt(HostType, ?MODULE, delete_domain_limit) of @@ -382,15 +381,17 @@ extract_gdpr_messages(Env, ArcID) -> lookup_query(lookup, Env, Filters, asc, all). %% Lookup logic --spec lookup_messages(Result :: any(), HostType :: host_type(), Params :: map()) -> - {ok, mod_mam:lookup_result()}. -lookup_messages({error, _Reason}=Result, _HostType, _Params) -> - Result; -lookup_messages(_Result, HostType, Params = #{owner_jid := ArcJID}) -> +-spec lookup_messages(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()}, + Params :: mam_iq:lookup_params(), + Extra :: gen_hook:extra(). +lookup_messages({error, _Reason} = Result, _Params, _Extra) -> + {ok, Result}; +lookup_messages(_Result, #{owner_jid := ArcJID} = Params, #{host_type := HostType}) -> Env = env_vars(HostType, ArcJID), ExdParams = mam_encoder:extend_lookup_params(Params, Env), Filter = mam_filter:produce_filter(ExdParams, lookup_fields()), - mam_lookup:lookup(Env, Filter, ExdParams). + {ok, mam_lookup:lookup(Env, Filter, ExdParams)}. lookup_query(QueryType, Env, Filters, Order, OffsetLimit) -> mam_lookup_sql:lookup_query(QueryType, Env, Filters, Order, OffsetLimit). diff --git a/src/mam/mod_mam_rdbms_arch_async.erl b/src/mam/mod_mam_rdbms_arch_async.erl index dd765cfcec4..c06e2fcc999 100644 --- a/src/mam/mod_mam_rdbms_arch_async.erl +++ b/src/mam/mod_mam_rdbms_arch_async.erl @@ -8,20 +8,27 @@ -define(FLUSH_TIME, [mod_mam_rdbms_async_pool_writer, flush_time]). -behaviour(gen_mod). + -export([start/2, stop/1, supported_features/0]). --export([archive_pm_message/3, mam_archive_sync/2, flush/2]). --ignore_xref([archive_pm_message/3, mam_archive_sync/2]). +-export([archive_pm_message/3, mam_archive_sync/3]). +-export([flush/2]). -export([make_pool_opts/2, prepare_insert_queries/2]). --spec archive_pm_message(_Result, mongooseim:host_type(), mod_mam:archive_message_params()) -> ok. -archive_pm_message(_Result, HostType, Params = #{archive_id := ArcID}) -> - mongoose_async_pools:put_task(HostType, pm_mam, ArcID, Params). - --spec mam_archive_sync(term(), mongooseim:host_type()) -> term(). -mam_archive_sync(Result, HostType) -> +-spec archive_pm_message(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). +archive_pm_message(_Result, #{archive_id := ArcID} = Params, #{host_type := HostType}) -> + {ok, mongoose_async_pools:put_task(HostType, pm_mam, ArcID, Params)}. + +-spec mam_archive_sync(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok, + Params :: map(), + Extra :: gen_hook:extra(). +mam_archive_sync(Result, _Params, #{host_type := HostType}) -> mongoose_async_pools:sync(HostType, pm_mam), - Result. + {ok, Result}. %%% gen_mod callbacks -spec start(mongooseim:host_type(), gen_mod:module_opts()) -> any(). @@ -30,16 +37,21 @@ start(HostType, Opts) -> prepare_insert_queries(pm, Extra), mongoose_metrics:ensure_metric(HostType, ?PER_MESSAGE_FLUSH_TIME, histogram), mongoose_metrics:ensure_metric(HostType, ?FLUSH_TIME, histogram), - ejabberd_hooks:add(mam_archive_sync, HostType, ?MODULE, mam_archive_sync, 50), - ejabberd_hooks:add(mam_archive_message, HostType, ?MODULE, archive_pm_message, 50), + gen_hook:add_handlers(hooks(HostType)), mongoose_async_pools:start_pool(HostType, pm_mam, PoolOpts). -spec stop(mongooseim:host_type()) -> any(). stop(HostType) -> - ejabberd_hooks:delete(mam_archive_message, HostType, ?MODULE, archive_pm_message, 50), - ejabberd_hooks:delete(mam_archive_sync, HostType, ?MODULE, mam_archive_sync, 50), + gen_hook:delete_handlers(hooks(HostType)), mongoose_async_pools:stop_pool(HostType, pm_mam). +-spec hooks(mongooseim:host_type()) -> gen_hook:hook_list(). +hooks(HostType) -> + [ + {mam_archive_sync, HostType, fun ?MODULE:mam_archive_sync/3, #{}, 50}, + {mam_archive_message, HostType, fun ?MODULE:archive_pm_message/3, #{}, 50} + ]. + -spec supported_features() -> [atom()]. supported_features() -> [dynamic_domains]. diff --git a/src/mam/mod_mam_rdbms_prefs.erl b/src/mam/mod_mam_rdbms_prefs.erl index b4cfa01b012..b3034436e27 100644 --- a/src/mam/mod_mam_rdbms_prefs.erl +++ b/src/mam/mod_mam_rdbms_prefs.erl @@ -10,16 +10,15 @@ %% Exports %% gen_mod handlers +-behaviour(gen_mod). -export([start/2, stop/1, supported_features/0]). %% MAM hook handlers -behaviour(ejabberd_gen_mam_prefs). --export([get_behaviour/5, - get_prefs/4, - set_prefs/7, - remove_archive/4]). - --ignore_xref([remove_archive/4, start/2, stop/1, supported_features/0]). +-export([get_behaviour/3, + get_prefs/3, + set_prefs/3, + remove_archive/3]). -import(mongoose_rdbms, [prepare/4]). @@ -34,12 +33,12 @@ -spec start(mongooseim:host_type(), _) -> ok. start(HostType, _Opts) -> prepare_queries(HostType), - ejabberd_hooks:add(hooks(HostType)), + gen_hook:add_handlers(hooks(HostType)), ok. -spec stop(mongooseim:host_type()) -> ok. stop(HostType) -> - ejabberd_hooks:delete(hooks(HostType)), + gen_hook:delete_handlers(hooks(HostType)), ok. -spec supported_features() -> [atom()]. @@ -58,16 +57,16 @@ maybe_muc_hooks(true, HostType) -> muc_hooks(HostType); maybe_muc_hooks(false, _HostType) -> []. pm_hooks(HostType) -> - [{mam_get_behaviour, HostType, ?MODULE, get_behaviour, 50}, - {mam_get_prefs, HostType, ?MODULE, get_prefs, 50}, - {mam_set_prefs, HostType, ?MODULE, set_prefs, 50}, - {mam_remove_archive, HostType, ?MODULE, remove_archive, 50}]. + [{mam_get_behaviour, HostType, fun ?MODULE:get_behaviour/3, #{}, 50}, + {mam_get_prefs, HostType, fun ?MODULE:get_prefs/3, #{}, 50}, + {mam_set_prefs, HostType, fun ?MODULE:set_prefs/3, #{}, 50}, + {mam_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}]. muc_hooks(HostType) -> - [{mam_muc_get_behaviour, HostType, ?MODULE, get_behaviour, 50}, - {mam_muc_get_prefs, HostType, ?MODULE, get_prefs, 50}, - {mam_muc_set_prefs, HostType, ?MODULE, set_prefs, 50}, - {mam_muc_remove_archive, HostType, ?MODULE, remove_archive, 50}]. + [{mam_muc_get_behaviour, HostType, fun ?MODULE:get_behaviour/3, #{}, 50}, + {mam_muc_get_prefs, HostType, fun ?MODULE:get_prefs/3, #{}, 50}, + {mam_muc_set_prefs, HostType, fun ?MODULE:set_prefs/3, #{}, 50}, + {mam_muc_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}]. %% Prepared queries prepare_queries(HostType) -> @@ -103,20 +102,23 @@ order_by_remote_jid_in_delete(HostType) -> %% ---------------------------------------------------------------------- %% Internal functions and callbacks --spec get_behaviour(Default :: mod_mam:archive_behaviour(), - HostType :: mongooseim:host_type(), ArchiveID :: mod_mam:archive_id(), - LocJID :: jid:jid(), RemJID :: jid:jid()) -> any(). -get_behaviour(DefaultBehaviour, HostType, UserID, _LocJID, RemJID) +-spec get_behaviour(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mod_mam:archive_behaviour(), + Params :: ejabberd_gen_mam_prefs:get_behaviour_params(), + Extra :: gen_hook:extra(). +get_behaviour(DefaultBehaviour, + #{archive_id := UserID, remote := RemJID}, + #{host_type := HostType}) when is_integer(UserID) -> RemLJID = jid:to_lower(RemJID), BRemLBareJID = jid:to_bare_binary(RemLJID), BRemLJID = jid:to_binary(RemLJID), case query_behaviour(HostType, UserID, BRemLJID, BRemLBareJID) of {selected, []} -> - DefaultBehaviour; + {ok, DefaultBehaviour}; {selected, RemoteJid2Behaviour} -> DbBehaviour = choose_behaviour(BRemLJID, BRemLBareJID, RemoteJid2Behaviour), - decode_behaviour(DbBehaviour) + {ok, decode_behaviour(DbBehaviour)} end. -spec choose_behaviour(binary(), binary(), [{binary(), binary()}]) -> binary(). @@ -135,16 +137,18 @@ choose_behaviour(BRemLJID, BRemLBareJID, RemoteJid2Behaviour) -> end end. --spec set_prefs(Result :: any(), HostType :: mongooseim:host_type(), - ArchiveID :: mod_mam:archive_id(), ArchiveJID :: jid:jid(), - DefaultMode :: mod_mam:archive_behaviour(), - AlwaysJIDs :: [jid:literal_jid()], - NeverJIDs :: [jid:literal_jid()]) -> any(). -set_prefs(_Result, HostType, UserID, _ArcJID, DefaultMode, AlwaysJIDs, NeverJIDs) -> +-spec set_prefs(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: ejabberd_gen_mam_prefs:set_prefs_params(), + Extra :: gen_hook:extra(). +set_prefs(_Result, + #{archive_id := UserID, default_mode := DefaultMode, + always_jids := AlwaysJIDs, never_jids := NeverJIDs}, + #{host_type := HostType}) -> try - set_prefs1(HostType, UserID, DefaultMode, AlwaysJIDs, NeverJIDs) + {ok, set_prefs1(HostType, UserID, DefaultMode, AlwaysJIDs, NeverJIDs)} catch _Type:Error -> - {error, Error} + {ok, {error, Error}} end. set_prefs1(HostType, UserID, DefaultMode, AlwaysJIDs, NeverJIDs) -> @@ -159,19 +163,21 @@ set_prefs1(HostType, UserID, DefaultMode, AlwaysJIDs, NeverJIDs) -> end, #{user_id => UserID, retries => 5, delay => 100}), ok. --spec get_prefs(mod_mam:preference(), HostType :: mongooseim:host_type(), - ArchiveID :: mod_mam:archive_id(), ArchiveJID :: jid:jid()) - -> mod_mam:preference(). -get_prefs({GlobalDefaultMode, _, _}, HostType, UserID, _ArcJID) -> +-spec get_prefs(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mod_mam:preference(), + Params :: ejabberd_gen_mam_prefs:get_prefs_params(), + Extra :: gen_hook:extra(). +get_prefs({GlobalDefaultMode, _, _}, #{archive_id := UserID}, #{host_type := HostType}) -> {selected, Rows} = mongoose_rdbms:execute(HostType, mam_prefs_select, [UserID]), - decode_prefs_rows(Rows, GlobalDefaultMode, [], []). + {ok, decode_prefs_rows(Rows, GlobalDefaultMode, [], [])}. --spec remove_archive(mongoose_acc:t(), mongooseim:host_type(), - mod_mam:archive_id(), jid:jid()) -> - mongoose_acc:t(). -remove_archive(Acc, HostType, UserID, _ArcJID) -> +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner => jid:jid(), room => jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{archive_id := UserID}, #{host_type := HostType}) -> remove_archive(HostType, UserID), - Acc. + {ok, Acc}. remove_archive(HostType, UserID) -> {updated, _} = diff --git a/src/mam/mod_mam_rdbms_user.erl b/src/mam/mod_mam_rdbms_user.erl index ba2a6e477f1..e5702ff5d56 100644 --- a/src/mam/mod_mam_rdbms_user.erl +++ b/src/mam/mod_mam_rdbms_user.erl @@ -9,19 +9,18 @@ %%% @end %%%------------------------------------------------------------------- -module(mod_mam_rdbms_user). +-behaviour(gen_mod). %% gen_mod handlers -export([start/2, stop/1, supported_features/0]). %% ejabberd handlers -export([archive_id/3, - remove_archive/4]). + remove_archive/3]). %% For debugging ONLY -export([create_user_archive/3]). - --ignore_xref([archive_id/3, create_user_archive/3, remove_archive/4, start/2, - stop/1, supported_features/0]). +-ignore_xref([create_user_archive/3]). -include("mongoose.hrl"). -include("jlib.hrl"). @@ -31,12 +30,12 @@ -spec start(mongooseim:host_type(), gen_mod:module_opts()) -> ok. start(HostType, _Opts) -> prepare_queries(), - ejabberd_hooks:add(hooks(HostType)), + gen_hook:add_handlers(hooks(HostType)), ok. -spec stop(mongooseim:host_type()) -> ok. stop(HostType) -> - ejabberd_hooks:delete(hooks(HostType)), + gen_hook:delete_handlers(hooks(HostType)), ok. -spec supported_features() -> [atom()]. @@ -44,7 +43,7 @@ supported_features() -> [dynamic_domains]. hooks(HostType) -> - [{Hook, HostType, ?MODULE, Fun, N} + [{Hook, HostType, Fun, #{}, N} || {true, Hook, Fun, N} <- hooks2(HostType)]. hooks2(HostType) -> @@ -52,10 +51,10 @@ hooks2(HostType) -> AR = gen_mod:get_module_opt(HostType, ?MODULE, auto_remove, false), PM = gen_mod:get_module_opt(HostType, ?MODULE, pm, false), MUC = gen_mod:get_module_opt(HostType, ?MODULE, muc, false), - [{PM, mam_archive_id, archive_id, 50}, - {PM and AR, mam_remove_archive, remove_archive, 90}, - {MUC, mam_muc_archive_id, archive_id, 50}, - {MUC and AR, mam_muc_remove_archive, remove_archive, 90}]. + [{PM, mam_archive_id, fun ?MODULE:archive_id/3, 50}, + {PM and AR, mam_remove_archive, fun ?MODULE:remove_archive/3, 90}, + {MUC, mam_muc_archive_id, fun ?MODULE:archive_id/3, 50}, + {MUC and AR, mam_muc_remove_archive, fun ?MODULE:remove_archive/3, 90}]. prepare_queries() -> mongoose_rdbms:prepare(mam_user_insert, mam_server_user, [server, user_name], @@ -69,20 +68,26 @@ prepare_queries() -> %%==================================================================== %% API %%==================================================================== --spec archive_id(ArcID :: undefined | mod_mam:archive_id(), - HostType :: mongooseim:host_type(), - ArchiveJID :: jid:jid()) -> mod_mam:archive_id(). -archive_id(undefined, HostType, _ArcJID=#jid{lserver = LServer, luser = LUser}) -> - query_archive_id(HostType, LServer, LUser); -archive_id(ArcID, _Host, _ArcJID) -> - ArcID. - --spec remove_archive(Acc :: map(), HostType :: mongooseim:host_type(), - ArchiveID :: mod_mam:archive_id(), - ArchiveJID :: jid:jid()) -> map(). -remove_archive(Acc, HostType, _ArcID, _ArcJID = #jid{lserver = LServer, luser = LUser}) -> +-spec archive_id(Acc, Params, Extra) -> {ok, Acc} when + Acc :: mod_mam:archive_id() | undefined, + Params :: map(), + Extra :: gen_hook:extra(). +archive_id(undefined, + #{owner := #jid{lserver = LServer, luser = LUser}}, + #{host_type := HostType}) -> + {ok, query_archive_id(HostType, LServer, LUser)}; +archive_id(ArcID, _Params, _Extra) -> + {ok, ArcID}. + +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: map(), + Extra :: gen_hook:extra(). +remove_archive(Acc, + #{owner := #jid{lserver = LServer, luser = LUser}}, + #{host_type := HostType}) -> execute_user_remove(HostType, LServer, LUser), - Acc. + {ok, Acc}. %%==================================================================== %% Internal functions diff --git a/src/mam/mod_mam_riak_timed_arch_yz.erl b/src/mam/mod_mam_riak_timed_arch_yz.erl index d4dae30b25e..f3e54998a7f 100644 --- a/src/mam/mod_mam_riak_timed_arch_yz.erl +++ b/src/mam/mod_mam_riak_timed_arch_yz.erl @@ -30,14 +30,14 @@ %% API -export([start/2, stop/1, - archive_size/4, - lookup_messages/2, - remove_archive/4]). + archive_size/3, + lookup_messages/2]). -export([archive_message/3, archive_message_muc/3, lookup_messages/3, - lookup_messages_muc/3]). + lookup_messages_muc/3, + remove_archive/3]). -export([key/3]). @@ -47,9 +47,8 @@ -export([get_mam_muc_gdpr_data/3, get_mam_pm_gdpr_data/3]). --ignore_xref([archive_message_muc/3, behaviour_info/1, bucket/2, create_obj/6, - key/3, list_mam_buckets/1, lookup_messages/2, lookup_messages_muc/3, - read_archive/8, remove_archive/4, remove_bucket/1]). +-ignore_xref([bucket/2, create_obj/6, key/3, list_mam_buckets/1, lookup_messages/2, + read_archive/8, remove_bucket/1]). -type yearweeknum() :: {non_neg_integer(), 1..53}. @@ -62,28 +61,29 @@ %% Use both options `pm, muc' to archive both MUC and private messages -spec start(mongooseim:host_type(), gen_mod:module_opts()) -> ok. start(HostType, Opts) -> - ejabberd_hooks:add(hooks(HostType, Opts)). + gen_hook:add_handlers(hooks(HostType, Opts)). -spec stop(mongooseim:host_type()) -> ok. stop(HostType) -> Opts = gen_mod:get_loaded_module_opts(HostType, ?MODULE), - ejabberd_hooks:delete(hooks(HostType, Opts)). + gen_hook:delete_handlers(hooks(HostType, Opts)). +-spec hooks(mongooseim:host_type(), gen_mod:module_opts()) -> gen_hook:hook_list(). hooks(HostType, Opts) -> lists:flatmap(fun(Type) -> hooks(HostType, Type, Opts) end, [pm, muc]). hooks(HostType, pm, #{pm := true}) -> - [{mam_archive_message, HostType, ?MODULE, archive_message, 50}, - {mam_archive_size, HostType, ?MODULE, archive_size, 50}, - {mam_lookup_messages, HostType, ?MODULE, lookup_messages, 50}, - {mam_remove_archive, HostType, ?MODULE, remove_archive, 50}, - {get_mam_pm_gdpr_data, HostType, ?MODULE, get_mam_pm_gdpr_data, 50}]; + [{mam_archive_message, HostType, fun ?MODULE:archive_message/3, #{}, 50}, + {mam_archive_size, HostType, fun ?MODULE:archive_size/3, #{}, 50}, + {mam_lookup_messages, HostType, fun ?MODULE:lookup_messages/3, #{}, 50}, + {mam_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}, + {get_mam_pm_gdpr_data, HostType, fun ?MODULE:get_mam_pm_gdpr_data/3, #{}, 50}]; hooks(HostType, muc, #{muc := true}) -> - [{mam_muc_archive_message, HostType, ?MODULE, archive_message_muc, 50}, - {mam_muc_archive_size, HostType, ?MODULE, archive_size, 50}, - {mam_muc_lookup_messages, HostType, ?MODULE, lookup_messages_muc, 50}, - {mam_muc_remove_archive, HostType, ?MODULE, remove_archive, 50}, - {get_mam_muc_gdpr_data, HostType, ?MODULE, get_mam_muc_gdpr_data, 50}]; + [{mam_muc_archive_message, HostType, fun ?MODULE:archive_message_muc/3, #{}, 50}, + {mam_muc_archive_size, HostType, fun ?MODULE:archive_size/3, #{}, 50}, + {mam_muc_lookup_messages, HostType, fun ?MODULE:lookup_messages_muc/3, #{}, 50}, + {mam_muc_remove_archive, HostType, fun ?MODULE:remove_archive/3, #{}, 50}, + {get_mam_muc_gdpr_data, HostType, fun ?MODULE:get_mam_muc_gdpr_data/3, #{}, 50}]; hooks(_HostType, _Opt, _Opts) -> []. @@ -96,40 +96,52 @@ mam_bucket_type(Host) -> %% LocJID - archive owner's JID %% RemJID - interlocutor's JID %% SrcJID - "Real" sender JID -archive_message(_Result, Host, #{message_id := MessId, - local_jid := LocJID, - remote_jid := RemJID, - source_jid := SrcJID, - packet := Packet} = Params) -> +-spec archive_message(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). +archive_message(_Result, + #{message_id := MessId, + local_jid := LocJID, + remote_jid := RemJID, + source_jid := SrcJID, + packet := Packet} = Params, + #{host_type := HostType}) -> try - archive_message(Host, MessId, LocJID, RemJID, SrcJID, LocJID, Packet, pm) + {ok, archive_message(HostType, MessId, LocJID, RemJID, SrcJID, LocJID, Packet, pm)} catch Class:Reason:StackTrace -> ?LOG_WARNING(maps:merge(Params, #{what => archive_message_failed, text => <<"Could not write message to archive">>, class => Class, reason => Reason, stacktrace => StackTrace})), - mongoose_metrics:update(Host, modMamDropped, 1), - {error, Reason} + mongoose_metrics:update(HostType, modMamDropped, 1), + {ok, {error, Reason}} end. +-spec archive_message_muc(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ok, + Params :: mod_mam:archive_message_params(), + Extra :: gen_hook:extra(). %% LocJID - MUC/MUC Light room's JID %% FromJID - "Real" sender JID %% SrcJID - Full JID of user within room (room@domain/user) -archive_message_muc(_Result, Host, #{message_id := MessId, - local_jid := LocJID, - remote_jid := FromJID, - source_jid := SrcJID, - packet := Packet} = Params) -> +archive_message_muc(_Result, + #{message_id := MessId, + local_jid := LocJID, + remote_jid := FromJID, + source_jid := SrcJID, + packet := Packet} = Params, + #{host_type := HostType}) -> RemJIDMuc = maybe_muc_jid(SrcJID), try - archive_message(Host, MessId, LocJID, RemJIDMuc, SrcJID, FromJID, Packet, muc) + {ok, archive_message(HostType, MessId, LocJID, RemJIDMuc, SrcJID, FromJID, Packet, muc)} catch Class:Reason:StackTrace -> ?LOG_WARNING(maps:merge(Params, #{what => archive_muc_message_failed, text => <<"Could not write MUC message to archive">>, class => Class, reason => Reason, stacktrace => StackTrace})), - mongoose_metrics:update(Host, modMamDropped, 1), - {error, Reason} + mongoose_metrics:update(HostType, modMamDropped, 1), + {ok, {error, Reason}} end. maybe_muc_jid(#jid{lresource = RemRes}) -> @@ -138,22 +150,38 @@ maybe_muc_jid(Other) -> Other. -lookup_messages({error, _Reason} = Result, _Host, _Params) -> - Result; -lookup_messages(_Result, Host, Params) -> +-spec lookup_messages(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()} | {error, term()}, + Params :: mam_iq:lookup_params(), + Extra :: gen_hook:extra(). +lookup_messages({error, _Reason} = Result, _Params, _Extra) -> + {ok, Result}; +lookup_messages(_Result, Params, #{host_type := HostType}) -> try - lookup_messages(Host, Params) + {ok, lookup_messages(HostType, Params)} catch _Type:Reason:S -> - {error, {Reason, {stacktrace, S}}} + {ok, {error, {Reason, {stacktrace, S}}}} end. - -lookup_messages_muc(Result, Host, #{with_jid := WithJID} = Params) -> +-spec lookup_messages_muc(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()} | {error, term()}, + Params :: mam_iq:lookup_params(), + Extra :: gen_hook:extra(). +lookup_messages_muc(Result, #{with_jid := WithJID} = Params, Extra) -> WithJIDMuc = maybe_muc_jid(WithJID), - lookup_messages(Result, Host, Params#{with_jid => WithJIDMuc}). + lookup_messages(Result, Params#{with_jid => WithJIDMuc}, Extra). + +-spec archive_size(Acc, Params, Extra) -> {ok, Acc} when + Acc :: integer(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner => jid:jid(), room => jid:jid()}, + Extra :: gen_hook:extra(). +archive_size(_Size, #{owner := ArchiveJID}, #{host_type := HostType}) -> + archive_size(ArchiveJID, HostType); +archive_size(_Size, #{room := ArchiveJID}, #{host_type := HostType}) -> + archive_size(ArchiveJID, HostType). -archive_size(_Size, Host, _ArchiveID, ArchiveJID) -> +archive_size(ArchiveJID, Host) -> OwnerJID = mod_mam_utils:bare_jid(ArchiveJID), RemoteJID = undefined, {MsgIdStartNoRSM, MsgIdEndNoRSM} = @@ -162,7 +190,7 @@ archive_size(_Size, Host, _ArchiveID, ArchiveJID) -> {TotalCount, _} = read_archive(Host, OwnerJID, RemoteJID, MsgIdStartNoRSM, MsgIdEndNoRSM, undefined, [{rows, 1}], F), - TotalCount. + {ok, TotalCount}. %% use correct bucket for given date @@ -337,19 +365,23 @@ get_message2(Host, MsgId, Bucket, Key) -> _ -> [] end. --spec get_mam_pm_gdpr_data(ejabberd_gen_mam_archive:mam_pm_gdpr_data(), - mongooseim:host_type(), jid:jid()) -> - ejabberd_gen_mam_archive:mam_pm_gdpr_data(). -get_mam_pm_gdpr_data(Acc, _HostType, OwnerJid) -> - Messages = get_mam_gdpr_data(OwnerJid, <<"pm">>), - [{Id, jid:to_binary(Jid), exml:to_binary(Packet)} || #{id := Id, jid := Jid, packet := Packet} <- Messages] ++ Acc. --spec get_mam_muc_gdpr_data(ejabberd_gen_mam_archive:mam_muc_gdpr_data(), - mongooseim:host_type(), jid:jid()) -> - ejabberd_gen_mam_archive:mam_muc_gdpr_data(). -get_mam_muc_gdpr_data(Acc, _HostType, JID) -> +-spec get_mam_pm_gdpr_data(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ejabberd_gen_mam_archive:mam_pm_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). +get_mam_pm_gdpr_data(Acc, #{jid := OwnerJid}, _Extra) -> + Messages = get_mam_gdpr_data(OwnerJid, <<"pm">>), + {ok, [{Id, jid:to_binary(Jid), exml:to_binary(Packet)} + || #{id := Id, jid := Jid, packet := Packet} <- Messages] ++ Acc}. + +-spec get_mam_muc_gdpr_data(Acc, Params, Extra) -> {ok, Acc} when + Acc :: ejabberd_gen_mam_archive:mam_muc_gdpr_data(), + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). +get_mam_muc_gdpr_data(Acc, #{jid := JID}, _Extra) -> Messages = get_mam_gdpr_data(JID, <<"muc">>), - [{MsgId, exml:to_binary(Packet)} || #{id := MsgId, packet := Packet} <- Messages] ++ Acc. + {ok, [{MsgId, exml:to_binary(Packet)} || #{id := MsgId, packet := Packet} <- Messages] ++ Acc}. get_mam_gdpr_data(#jid{ lserver = LServer } = BareJid, Type) -> BareLJidBin = jid:to_binary(jid:to_lower(BareJid)), @@ -358,9 +390,16 @@ get_mam_gdpr_data(#jid{ lserver = LServer } = BareJid, Type) -> {ok, _Cnt, _, MsgIds} = fold_archive(LServer, fun get_msg_id_key/3, Query, SearchOpts, []), get_messages(LServer, MsgIds). -remove_archive(Acc, Host, _ArchiveID, ArchiveJID) -> - remove_archive(Host, ArchiveJID), - Acc. +-spec remove_archive(Acc, Params, Extra) -> {ok, Acc} when + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner => jid:jid(), room => jid:jid()}, + Extra :: gen_hook:extra(). +remove_archive(Acc, #{owner := ArchiveJID}, #{host_type := HostType}) -> + remove_archive(HostType, ArchiveJID), + {ok, Acc}; +remove_archive(Acc, #{room := ArchiveJID}, #{host_type := HostType}) -> + remove_archive(HostType, ArchiveJID), + {ok, Acc}. remove_archive(Host, ArchiveJID) -> {ok, TotalCount, _, _} = R = remove_chunk(Host, ArchiveJID, 0), diff --git a/src/metrics/mongoose_metrics_mam_hooks.erl b/src/metrics/mongoose_metrics_mam_hooks.erl index cc1fd2611ee..ece05900fdc 100644 --- a/src/metrics/mongoose_metrics_mam_hooks.erl +++ b/src/metrics/mongoose_metrics_mam_hooks.erl @@ -34,7 +34,7 @@ %%------------------- %% @doc Here will be declared which hooks should be registered when mod_mam_pm is enabled. --spec get_mam_hooks(_) -> gen_hook:hook_list(). +-spec get_mam_hooks(mongooseim:host_type()) -> gen_hook:hook_list(). get_mam_hooks(HostType) -> [ {mam_set_prefs, HostType, fun ?MODULE:mam_set_prefs/3, #{}, 50}, @@ -46,7 +46,7 @@ get_mam_hooks(HostType) -> ]. %% @doc Here will be declared which hooks should be registered when mod_mam_muc is enabled. --spec get_mam_muc_hooks(_) -> gen_hook:hook_list(). +-spec get_mam_muc_hooks(mongooseim:host_type()) -> gen_hook:hook_list(). get_mam_muc_hooks(HostType) -> [ {mam_muc_set_prefs, HostType, fun ?MODULE:mam_muc_set_prefs/3, #{}, 50}, @@ -58,35 +58,36 @@ get_mam_muc_hooks(HostType) -> ]. -spec mam_get_prefs(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), + Acc :: mod_mam:preference() | {error, Reason :: term()}, Params :: map(), Extra :: gen_hook:extra(). -mam_get_prefs(Acc, _, #{host_type := HostType}) -> +mam_get_prefs(Result, _Params, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMamPrefsGets, 1), - {ok, Acc}. + {ok, Result}. -spec mam_set_prefs(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), + Acc :: term(), Params :: map(), Extra :: gen_hook:extra(). -mam_set_prefs(Acc, _, #{host_type := HostType}) -> +mam_set_prefs(Result, _Params, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMamPrefsSets, 1), - {ok, Acc}. + {ok, Result}. -spec mam_remove_archive(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), - Params :: map(), + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, owner := jid:jid()}, Extra :: gen_hook:extra(). -mam_remove_archive(Acc, _, #{host_type := HostType}) -> +mam_remove_archive(Acc, _Params, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMamArchiveRemoved, 1), {ok, Acc}. --spec mam_lookup_messages(Result, Params, Extra) -> {ok, Result} when - Result :: {ok | error, mod_mam:lookup_result()}, - Params :: map(), +-spec mam_lookup_messages(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()} | {error, term()}, + Params :: mam_iq:lookup_params(), Extra :: gen_hook:extra(). -mam_lookup_messages(Result = {ok, {_TotalCount, _Offset, MessageRows}}, - #{is_simple := IsSimple}, #{host_type := HostType}) -> +mam_lookup_messages({ok, {_TotalCount, _Offset, MessageRows}} = Result, + #{is_simple := IsSimple}, + #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMamForwarded, length(MessageRows)), mongoose_metrics:update(HostType, modMamLookups, 1), case IsSimple of @@ -96,22 +97,22 @@ mam_lookup_messages(Result = {ok, {_TotalCount, _Offset, MessageRows}}, ok end, {ok, Result}; -mam_lookup_messages(Result = {error, _}, _, _) -> +mam_lookup_messages(Result = {error, _}, _Params, _Extra) -> {ok, Result}. -spec mam_archive_message(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), + Acc :: ok | {error, timeout}, Params :: mod_mam:archive_message_params(), Extra :: gen_hook:extra(). -mam_archive_message(Acc, _, #{host_type := HostType}) -> +mam_archive_message(Result, _Params, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMamArchived, 1), - {ok, Acc}. + {ok, Result}. -spec mam_flush_messages(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), - Params :: #{message_count := integer()}, + Acc :: ok, + Params :: #{count := integer()}, Extra :: gen_hook:extra(). -mam_flush_messages(Acc, #{message_count := MessageCount}, #{host_type := HostType}) -> +mam_flush_messages(Acc, #{count := MessageCount}, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMamFlushed, MessageCount), {ok, Acc}. @@ -119,55 +120,54 @@ mam_flush_messages(Acc, #{message_count := MessageCount}, #{host_type := HostTyp %% mod_mam_muc -spec mam_muc_get_prefs(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), + Acc :: mod_mam:preference() | {error, Reason :: term()}, Params :: map(), Extra :: gen_hook:extra(). -mam_muc_get_prefs(Acc, _, #{host_type := HostType}) -> +mam_muc_get_prefs(Result, _Params, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMucMamPrefsGets, 1), - {ok, Acc}. + {ok, Result}. -spec mam_muc_set_prefs(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), + Acc :: term(), Params :: map(), Extra :: gen_hook:extra(). -mam_muc_set_prefs(Acc, _, #{host_type := HostType}) -> +mam_muc_set_prefs(Result, _Params, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMucMamPrefsSets, 1), - {ok, Acc}. + {ok, Result}. -spec mam_muc_remove_archive(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), - Params :: map(), + Acc :: term(), + Params :: #{archive_id := mod_mam:archive_id() | undefined, room := jid:jid()}, Extra :: gen_hook:extra(). -mam_muc_remove_archive(Acc, _, #{host_type := HostType}) -> +mam_muc_remove_archive(Acc, _Params, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMucMamArchiveRemoved, 1), {ok, Acc}. --spec mam_muc_lookup_messages(Result, Params, Extra) -> {ok, Result} when - Result :: {ok | error, mod_mam:lookup_result()}, - Params :: map(), +-spec mam_muc_lookup_messages(Acc, Params, Extra) -> {ok, Acc} when + Acc :: {ok, mod_mam:lookup_result()} | {error, term()}, + Params :: mam_iq:lookup_params(), Extra :: gen_hook:extra(). -mam_muc_lookup_messages(Result = {ok, {_TotalCount, _Offset, MessageRows}}, - _, #{host_type := HostType}) -> +mam_muc_lookup_messages({ok, {_TotalCount, _Offset, MessageRows}} = Result, + _Params, + #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMucMamForwarded, length(MessageRows)), mongoose_metrics:update(HostType, modMucMamLookups, 1), {ok, Result}; -mam_muc_lookup_messages(Result = {error, _}, _, _) -> +mam_muc_lookup_messages(Result = {error, _}, _Params, _Extra) -> {ok, Result}. -spec mam_muc_archive_message(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), + Acc :: ok | {error, timeout}, Params :: mod_mam:archive_message_params(), Extra :: gen_hook:extra(). -mam_muc_archive_message(Acc, _, #{host_type := HostType}) -> +mam_muc_archive_message(Result, _Params, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMucMamArchived, 1), - {ok, Acc}. + {ok, Result}. -spec mam_muc_flush_messages(Acc, Params, Extra) -> {ok, Acc} when - Acc :: any(), - Params :: #{message_count := integer()}, + Acc :: ok, + Params :: map(), Extra :: gen_hook:extra(). -mam_muc_flush_messages(Acc, #{message_count := MessageCount}, #{host_type := HostType}) -> +mam_muc_flush_messages(Acc, #{count := MessageCount}, #{host_type := HostType}) -> mongoose_metrics:update(HostType, modMucMamFlushed, MessageCount), {ok, Acc}. - -%%% vim: set sts=4 ts=4 sw=4 et filetype=erlang foldmarker=%%%',%%%. foldmethod=marker: diff --git a/src/mod_adhoc.erl b/src/mod_adhoc.erl index 24ee3d31843..846f01d9e9c 100644 --- a/src/mod_adhoc.erl +++ b/src/mod_adhoc.erl @@ -188,7 +188,7 @@ item(LServer, Node, Name, Lang) -> -spec disco_local_identity(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:identity_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_local_identity(Acc = #{node := ?NS_COMMANDS, lang := Lang}, _, _) -> {ok, mongoose_disco:add_identities([command_list_identity(Lang)], Acc)}; disco_local_identity(Acc = #{node := <<"ping">>, lang := Lang}, _, _) -> @@ -202,7 +202,7 @@ disco_local_identity(Acc, _, _) -> -spec disco_sm_identity(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:identity_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_sm_identity(Acc = #{node := ?NS_COMMANDS, lang := Lang}, _, _) -> {ok, mongoose_disco:add_identities([command_list_identity(Lang)], Acc)}; disco_sm_identity(Acc, _, _) -> @@ -223,7 +223,7 @@ command_list_identity(Lang) -> -spec disco_local_features(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:feature_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_local_features(Acc = #{node := <<>>}, _, _) -> {ok, mongoose_disco:add_features([?NS_COMMANDS], Acc)}; disco_local_features(Acc = #{node := ?NS_COMMANDS}, _, _) -> @@ -240,7 +240,7 @@ disco_local_features(Acc, _, _) -> -spec disco_sm_features(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:feature_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_sm_features(Acc = #{node := <<>>}, _, _) -> {ok, mongoose_disco:add_features([?NS_COMMANDS], Acc)}; disco_sm_features(Acc = #{node := ?NS_COMMANDS}, _, _) -> @@ -254,7 +254,7 @@ disco_sm_features(Acc, _, _) -> -spec ping_command(Acc, Params, Extra) -> {ok, Acc} when Acc :: command_hook_acc(), Params :: #{adhoc_request := adhoc:request()}, - Extra :: map(). + Extra :: gen_hook:extra(). ping_command(empty, #{adhoc_request := #adhoc_request{lang = Lang, node = <<"ping">> = Node, session_id = SessionID, action = Action}}, diff --git a/src/mod_amp.erl b/src/mod_amp.erl index 2d0f03e16b3..f6fdef7ce02 100644 --- a/src/mod_amp.erl +++ b/src/mod_amp.erl @@ -51,7 +51,7 @@ hooks(HostType) -> -spec run_initial_check(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). run_initial_check(#{result := drop} = Acc, _, _) -> {ok, Acc}; run_initial_check(Acc, _, _) -> @@ -81,7 +81,7 @@ disco_local_features(Acc = #{node := Node}, _, _) -> -spec c2s_stream_features(Acc, Params, Extra) -> {ok, Acc} when Acc :: [exml:element()], Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). c2s_stream_features(Acc, _, _) -> {ok, lists:keystore(<<"amp">>, #xmlel.name, Acc, ?AMP_FEATURE)}. diff --git a/src/mod_auth_token.erl b/src/mod_auth_token.erl index 102acc7c981..11161c83abf 100644 --- a/src/mod_auth_token.erl +++ b/src/mod_auth_token.erl @@ -428,7 +428,7 @@ revoke_token_command(Owner) -> -spec clean_tokens(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). clean_tokens(Acc, #{jid := Owner}, _) -> HostType = mongoose_acc:host_type(Acc), try diff --git a/src/mod_blocking.erl b/src/mod_blocking.erl index ed95989bd5d..6ec89150766 100644 --- a/src/mod_blocking.erl +++ b/src/mod_blocking.erl @@ -56,7 +56,7 @@ disco_local_features(Acc, _, _) -> -spec process_iq_get(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_acc:t(), Params :: #{from := jid:jid(), iq := jlib:iq()}, - Extra :: map(). + Extra :: gen_hook:extra(). process_iq_get(Acc, #{from := #jid{luser = LUser, lserver = LServer}, iq := #iq{xmlns = ?NS_BLOCKING}}, _) -> HostType = mongoose_acc:host_type(Acc), @@ -81,7 +81,7 @@ process_iq_get(Acc, _, _) -> -spec process_iq_set(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_acc:t(), Params :: #{from := jid:jid(), iq := jlib:iq()}, - Extra :: map(). + Extra :: gen_hook:extra(). process_iq_set(Acc, #{from := From, iq := #iq{xmlns = ?NS_BLOCKING, sub_el = SubEl}}, _) -> %% collect needed data HostType = mongoose_acc:host_type(Acc), diff --git a/src/mod_bosh.erl b/src/mod_bosh.erl index 2be3b56d90d..32a1a8f8878 100644 --- a/src/mod_bosh.erl +++ b/src/mod_bosh.erl @@ -131,7 +131,7 @@ supported_features() -> -spec node_cleanup(Acc, Params, Extra) -> {ok, Acc} when Acc :: map(), Params :: #{node := node()}, - Extra :: map(). + Extra :: gen_hook:extra(). node_cleanup(Acc, #{node := Node}, _) -> Res = mod_bosh_backend:node_cleanup(Node), {ok, maps:put(?MODULE, Res, Acc)}. diff --git a/src/mod_caps.erl b/src/mod_caps.erl index ec2ad1285c4..44a9940c67c 100644 --- a/src/mod_caps.erl +++ b/src/mod_caps.erl @@ -174,7 +174,7 @@ read_caps([], Result) -> Result. -spec user_send_packet(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). user_send_packet(Acc, _, _) -> {From, To, Packet} = mongoose_acc:packet(Acc), {ok, user_send_packet(Acc, From, To, Packet)}. @@ -193,7 +193,7 @@ user_send_packet(Acc, _From, _To, _Pkt) -> -spec user_receive_packet(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). user_receive_packet(Acc, #{jid := #jid{lserver = LServer}}, _) -> {From, _, Packet} = mongoose_acc:packet(Acc), {ok, user_receive_packet(Acc, LServer, From, Packet)}. @@ -255,7 +255,7 @@ disco_local_features(Acc = #{node := Node}, _, _) -> -spec disco_local_identity(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:identity_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_local_identity(Acc = #{node := Node}, _, _) -> NewAcc = case is_valid_node(Node) of true -> Acc#{node := <<>>}; @@ -266,7 +266,7 @@ disco_local_identity(Acc = #{node := Node}, _, _) -> -spec disco_info(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:identity_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_info(Acc = #{node := Node}, _, _) -> NewAcc = case is_valid_node(Node) of true -> Acc#{node := <<>>}; @@ -277,7 +277,7 @@ disco_info(Acc = #{node := Node}, _, _) -> -spec c2s_presence_in(Acc, Params, Extra) -> {ok, Acc} when Acc :: ejabberd_c2s:state(), Params :: #{from := jid:jid(), to := jid:jid(), packet := exml:element()}, - Extra :: map(). + Extra :: gen_hook:extra(). c2s_presence_in(C2SState, #{from := From, to := To, packet := Packet = #xmlel{attrs = Attrs, children = Els}}, _) -> ?LOG_DEBUG(#{what => caps_c2s_presence_in, to => jid:to_binary(To), from => jid:to_binary(From), @@ -325,7 +325,7 @@ upsert_caps(LFrom, Caps, Rs) -> -spec c2s_filter_packet(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: boolean(), Params :: #{state := ejabberd_c2s:state(), feature := {atom(), binary()}, to := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). c2s_filter_packet(InAcc, #{state := C2SState, feature := {pep_message, Feature}, to := To}, _) -> case ejabberd_c2s:get_aux_field(caps_resources, C2SState) of {ok, Rs} -> @@ -347,7 +347,7 @@ c2s_filter_packet(Acc, _, _) -> {ok, Acc}. -spec c2s_broadcast_recipients(Acc, Params, Extra) -> {ok, Acc} when Acc :: [jid:simple_jid()], Params :: #{state := ejabberd_c2s:state(), type := {atom(), binary()}}, - Extra :: map(). + Extra :: gen_hook:extra(). c2s_broadcast_recipients(InAcc, #{state := C2SState, type := {pep_message, Feature}}, _) -> HostType = ejabberd_c2s_state:host_type(C2SState), NewAcc = case ejabberd_c2s:get_aux_field(caps_resources, C2SState) of diff --git a/src/mod_carboncopy.erl b/src/mod_carboncopy.erl index 7a9c1187fca..0345bc419d9 100644 --- a/src/mod_carboncopy.erl +++ b/src/mod_carboncopy.erl @@ -104,7 +104,7 @@ config_spec() -> -spec disco_local_features(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:feature_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_local_features(Acc = #{node := <<>>}, _, _) -> NewAcc = mongoose_disco:add_features([?NS_CC_1, ?NS_CC_2, ?NS_CC_RULES], Acc), {ok, NewAcc}; @@ -141,7 +141,7 @@ iq_handler(Acc, _From, IQ, _CC) -> -spec user_send_packet(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). user_send_packet(Acc, _, _) -> {From, To, Packet} = mongoose_acc:packet(Acc), check_and_forward(Acc, From, To, Packet, sent), @@ -150,7 +150,7 @@ user_send_packet(Acc, _, _) -> -spec user_receive_packet(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). user_receive_packet(Acc, #{jid := JID}, _) -> {_, To, Packet} = mongoose_acc:packet(Acc), check_and_forward(Acc, JID, To, Packet, received), @@ -159,7 +159,7 @@ user_receive_packet(Acc, #{jid := JID}, _) -> -spec remove_connection(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). remove_connection(Acc, #{jid := JID}, _) -> disable(JID), {ok, Acc}. diff --git a/src/mod_dynamic_domains_test.erl b/src/mod_dynamic_domains_test.erl index 0baaccfdf3a..a6fc294ddb0 100644 --- a/src/mod_dynamic_domains_test.erl +++ b/src/mod_dynamic_domains_test.erl @@ -4,6 +4,7 @@ -include("jlib.hrl"). -behaviour(mongoose_packet_handler). +-behaviour(gen_mod). %% API -export([start/2, stop/1, @@ -11,8 +12,6 @@ supported_features/0]). -export([process_packet/5, process_iq/5]). --ignore_xref([config_spec/0, process_packet/5, start/2, stop/1, supported_features/0]). - -spec config_spec() -> mongoose_config_spec:config_section(). config_spec() -> #section{items = #{<<"host1">> => @@ -88,13 +87,13 @@ stop(HostType) -> ok. -spec process_packet(Acc :: mongoose_acc:t(), From :: jid:jid(), To :: jid:jid(), - El :: exml:element(), Extra :: map()) -> mongoose_acc:t(). + El :: exml:element(), Extra :: gen_hook:extra()) -> mongoose_acc:t(). process_packet(Acc, _From, _To, _El, _Extra) -> %% do nothing, just ignore the packet Acc. -spec process_iq(Acc :: mongoose_acc:t(), From :: jid:jid(), To :: jid:jid(), - IQ :: jlib:iq(), Extra :: map()) -> {NewAcc :: mongoose_acc:t(), + IQ :: jlib:iq(), Extra :: gen_hook:extra()) -> {NewAcc :: mongoose_acc:t(), IQResp :: ignore | jlib:iq()}. process_iq(Acc, _From, _To, IQ, _Extra) -> %% reply with empty result IQ stanza diff --git a/src/mod_ping.erl b/src/mod_ping.erl index 2614d016b62..66d21575bd2 100644 --- a/src/mod_ping.erl +++ b/src/mod_ping.erl @@ -152,7 +152,7 @@ iq_ping(Acc, _From, _To, #iq{sub_el = SubEl} = IQ, _) -> -spec handle_remote_hook(Acc, Params, Extra) -> {ok, Acc} when Acc :: term(), Params :: #{tag := atom(), args := term(), c2s_state := ejabberd_c2s:state()}, - Extra :: map(). + Extra :: gen_hook:extra(). handle_remote_hook(HandlerState, #{tag := mod_ping, hook_args := Args, c2s_state := C2SState}, _) -> {ok, handle_remote_call(Args, ejabberd_c2s_state:jid(C2SState), @@ -165,7 +165,7 @@ handle_remote_hook(HandlerState, _, _) -> -spec user_online(Acc, Params, Extra) -> {ok, Acc} when Acc :: ok, Params :: #{sid := ejabberd_sm:sid()}, - Extra :: map(). + Extra :: gen_hook:extra(). user_online(Acc, #{sid := {_, Pid}}, _) -> ejabberd_c2s:run_remote_hook(Pid, mod_ping, init), {ok, Acc}. @@ -173,7 +173,7 @@ user_online(Acc, #{sid := {_, Pid}}, _) -> -spec user_offline(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{sid := ejabberd_sm:sid()}, - Extra :: map(). + Extra :: gen_hook:extra(). user_offline(Acc, #{sid := {_, Pid}}, _) -> ejabberd_c2s:run_remote_hook(Pid, mod_ping, remove_timer), {ok, Acc}. @@ -181,7 +181,7 @@ user_offline(Acc, #{sid := {_, Pid}}, _) -> -spec user_send(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). user_send(Acc, _, _) -> ejabberd_c2s:run_remote_hook(self(), mod_ping, init), {ok, Acc}. @@ -189,7 +189,7 @@ user_send(Acc, _, _) -> -spec user_keep_alive(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). user_keep_alive(Acc, _, _) -> ejabberd_c2s:run_remote_hook(self(), mod_ping, init), {ok, Acc}. diff --git a/src/mongoose_hooks.erl b/src/mongoose_hooks.erl index 4f20076214f..709967e5318 100644 --- a/src/mongoose_hooks.erl +++ b/src/mongoose_hooks.erl @@ -173,7 +173,7 @@ -export_type([filter_packet_acc/0]). -spec c2s_remote_hook(HostType, Tag, Args, HandlerState, C2SState) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Tag :: atom(), Args :: term(), HandlerState :: term(), @@ -222,7 +222,7 @@ anonymous_purge_hook(LServer, Acc, LUser) -> run_hook_for_host_type(anonymous_purge_hook, HostType, Acc, ParamsWithLegacyArgs). -spec auth_failed(HostType, Server, Username) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Server :: jid:server(), Username :: jid:user() | unknown, Result :: ok. @@ -244,7 +244,7 @@ does_user_exist(HostType, Jid, RequestType) -> run_hook_for_host_type(does_user_exist, HostType, false, ParamsWithLegacyArgs). -spec remove_domain(HostType, Domain) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Domain :: jid:lserver(), Result :: mongoose_domain_api:remove_domain_acc(). remove_domain(HostType, Domain) -> @@ -333,7 +333,7 @@ packet_to_component(Acc, From, To) -> run_global_hook(packet_to_component, Acc, ParamsWithLegacyArgs). -spec presence_probe_hook(HostType, Acc, From, To, Pid) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Acc :: mongoose_acc:t(), From :: jid:jid(), To :: jid:jid(), @@ -371,7 +371,7 @@ register_subhost(LDomain, IsHidden) -> %%% @doc The `register_user' hook is called when a user is successfully %%% registered in an authentication backend. -spec register_user(HostType, LServer, LUser) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), LServer :: jid:lserver(), LUser :: jid:luser(), Result :: any(). @@ -499,7 +499,7 @@ user_ping_timeout(HostType, JID) -> run_hook_for_host_type(user_ping_timeout, HostType, ok, [JID]). -spec user_receive_packet(HostType, Acc, JID, From, To, El) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Acc :: mongoose_acc:t(), JID :: jid:jid(), From :: jid:jid(), @@ -513,7 +513,7 @@ user_receive_packet(HostType, Acc, JID, From, To, El) -> run_hook_for_host_type(user_receive_packet, HostType, Acc, ParamsWithLegacyArgs). -spec user_sent_keep_alive(HostType, JID) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), JID :: jid:jid(), Result :: any(). user_sent_keep_alive(HostType, JID) -> @@ -551,7 +551,7 @@ vcard_set(HostType, Server, LUser, VCard) -> run_hook_for_host_type(vcard_set, HostType, ok, [HostType, LUser, Server, VCard]). -spec xmpp_send_element(HostType, Acc, El) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Acc :: mongoose_acc:t(), El :: exml:element(), Result :: mongoose_acc:t(). @@ -696,14 +696,14 @@ privacy_check_packet(Acc, JID, PrivacyList, FromToNameType, Dir) -> ParamsWithLegacyArgs). -spec privacy_get_user_list(HostType, JID) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), JID :: jid:jid(), Result :: mongoose_privacy:userlist(). privacy_get_user_list(HostType, JID) -> run_hook_for_host_type(privacy_get_user_list, HostType, #userlist{}, [HostType, JID]). -spec privacy_iq_get(HostType, Acc, From, To, IQ, PrivList) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Acc :: mongoose_acc:t(), From :: jid:jid(), To :: jid:jid(), @@ -717,7 +717,7 @@ privacy_iq_get(HostType, Acc, From, To, IQ, PrivList) -> run_hook_for_host_type(privacy_iq_get, HostType, Acc, ParamsWithLegacyArgs). -spec privacy_iq_set(HostType, Acc, From, To, IQ) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Acc :: mongoose_acc:t(), From :: jid:jid(), To :: jid:jid(), @@ -730,7 +730,7 @@ privacy_iq_set(HostType, Acc, From, To, IQ) -> run_hook_for_host_type(privacy_iq_set, HostType, Acc, ParamsWithLegacyArgs). -spec privacy_updated_list(HostType, OldList, NewList) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), OldList :: mongoose_privacy:userlist(), NewList :: mongoose_privacy:userlist(), Result :: false | mongoose_privacy:userlist(). @@ -791,7 +791,7 @@ sm_broadcast(Acc, From, To, Broadcast, SessionCount) -> run_hook_for_host_type(sm_broadcast, HostType, Acc, ParamsWithLegacyArgs). -spec sm_filter_offline_message(HostType, From, To, Packet) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), From :: jid:jid(), To :: jid:jid(), Packet :: exml:element(), @@ -804,7 +804,7 @@ sm_filter_offline_message(HostType, From, To, Packet) -> ParamsWithLegacyArgs). -spec sm_register_connection_hook(HostType, SID, JID, Info) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), SID :: 'undefined' | ejabberd_sm:sid(), JID :: jid:jid(), Info :: ejabberd_sm:info(), @@ -893,7 +893,7 @@ roster_get_jid_info(HostType, ToJID, RemBareJID) -> %%% @doc The `roster_get_subscription_lists' hook is called to extract %%% user's subscription list. -spec roster_get_subscription_lists(HostType, Acc, JID) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Acc ::mongoose_acc:t(), JID :: jid:jid(), Result :: mongoose_acc:t(). @@ -904,7 +904,7 @@ roster_get_subscription_lists(HostType, Acc, JID) -> %%% @doc The `roster_get_versioning_feature' hook is %%% called to determine if roster versioning is enabled. -spec roster_get_versioning_feature(HostType) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), Result :: [exml:element()]. roster_get_versioning_feature(HostType) -> run_hook_for_host_type(roster_get_versioning_feature, HostType, [], [HostType]). @@ -1063,125 +1063,138 @@ room_new_affiliations(Acc, Room, NewAffs, Version) -> %%% %%% If a MAM backend doesn't support or doesn't require archive IDs, %%% `undefined' may be returned. --spec mam_archive_id(HostType, OwnerJID) -> Result when +-spec mam_archive_id(HostType, Owner) -> Result when HostType :: mongooseim:host_type(), - OwnerJID :: jid:jid(), + Owner :: jid:jid(), Result :: undefined | mod_mam:archive_id(). -mam_archive_id(HostType, OwnerJID) -> - run_hook_for_host_type(mam_archive_id, HostType, undefined, [HostType, OwnerJID]). +mam_archive_id(HostType, Owner) -> + Params = #{owner => Owner}, + Args = [HostType, Owner], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), + run_hook_for_host_type(mam_archive_id, HostType, undefined, ParamsWithLegacyArgs). %%% @doc The `mam_archive_size' hook is called to determine the size %%% of the archive for a given JID --spec mam_archive_size(HostType, ArchiveID, OwnerJID) -> Result when +-spec mam_archive_size(HostType, ArchiveID, Owner) -> Result when HostType :: mongooseim:host_type(), ArchiveID :: undefined | mod_mam:archive_id(), - OwnerJID :: jid:jid(), + Owner :: jid:jid(), Result :: integer(). -mam_archive_size(HostType, ArchiveID, OwnerJID) -> +mam_archive_size(HostType, ArchiveID, Owner) -> + Params = #{archive_id => ArchiveID, owner => Owner}, + Args = [HostType, ArchiveID, Owner], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), run_hook_for_host_type(mam_archive_size, HostType, 0, - [HostType, ArchiveID, OwnerJID]). + ParamsWithLegacyArgs). %%% @doc The `mam_get_behaviour' hooks is called to determine if a message %%% should be archived or not based on a given pair of JIDs. --spec mam_get_behaviour(HookServer, ArchiveID, - OwnerJID, RemoteJID) -> Result when - HookServer :: jid:lserver(), +-spec mam_get_behaviour(HostType, ArchiveID, + Owner, Remote) -> Result when + HostType :: mongooseim:host_type(), ArchiveID :: undefined | mod_mam:archive_id(), - OwnerJID :: jid:jid(), - RemoteJID :: jid:jid(), + Owner :: jid:jid(), + Remote :: jid:jid(), Result :: mod_mam:archive_behaviour(). -mam_get_behaviour(HookServer, ArchiveID, OwnerJID, RemoteJID) -> - run_hook_for_host_type(mam_get_behaviour, HookServer, always, - [HookServer, ArchiveID, OwnerJID, RemoteJID]). +mam_get_behaviour(HostType, ArchiveID, Owner, Remote) -> + Params = #{archive_id => ArchiveID, owner => Owner, remote => Remote}, + Args = [HostType, ArchiveID, Owner, Remote], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), + run_hook_for_host_type(mam_get_behaviour, HostType, always, + ParamsWithLegacyArgs). %%% @doc The `mam_set_prefs' hook is called to set a user's archive preferences. %%% %%% It's possible to set which JIDs are always or never allowed in the archive --spec mam_set_prefs(HookServer, ArchiveId, OwnerJID, +-spec mam_set_prefs(HostType, ArchiveId, Owner, DefaultMode, AlwaysJIDs, NeverJIDs) -> Result when - HookServer :: jid:lserver(), + HostType :: mongooseim:host_type(), ArchiveId :: undefined | mod_mam:archive_id(), - OwnerJID :: jid:jid(), + Owner :: jid:jid(), DefaultMode :: mod_mam:archive_behaviour(), AlwaysJIDs :: [jid:literal_jid()], - NeverJIDs :: [jid:literel_jid()], - Result :: any(). -mam_set_prefs(HookServer, ArchiveID, OwnerJID, DefaultMode, AlwaysJIDs, NeverJIDs) -> - Params = #{archive_id => ArchiveID, owner_jid => OwnerJID, default_mode => DefaultMode, - always_jids => AlwaysJIDs, never_jids => NeverJIDs}, - Args = [HookServer, ArchiveID, OwnerJID, DefaultMode, AlwaysJIDs, NeverJIDs], + NeverJIDs :: [jid:literel_jid()], + Result :: any(). +mam_set_prefs(HostType, ArchiveID, Owner, DefaultMode, AlwaysJIDs, NeverJIDs) -> + Params = #{archive_id => ArchiveID, owner => Owner, + default_mode => DefaultMode, always_jids => AlwaysJIDs, never_jids => NeverJIDs}, + Args = [HostType, ArchiveID, Owner, + DefaultMode, AlwaysJIDs, NeverJIDs], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), - run_hook_for_host_type(mam_set_prefs, HookServer, {error, not_implemented}, + run_hook_for_host_type(mam_set_prefs, HostType, {error, not_implemented}, ParamsWithLegacyArgs). %%% @doc The `mam_get_prefs' hook is called to read %%% the archive settings for a given user. --spec mam_get_prefs(HookServer, DefaultMode, ArchiveID, OwnerJID) -> Result when - HookServer :: jid:lserver(), +-spec mam_get_prefs(HostType, DefaultMode, ArchiveID, Owner) -> Result when + HostType :: mongooseim:host_type(), DefaultMode :: mod_mam:archive_behaviour(), ArchiveID :: undefined | mod_mam:archive_id(), - OwnerJID :: jid:jid(), + Owner :: jid:jid(), Result :: mod_mam:preference() | {error, Reason :: term()}. -mam_get_prefs(HookServer, DefaultMode, ArchiveID, OwnerJID) -> - Params = #{archive_id => ArchiveID, owner_jid => OwnerJID}, - Args = [HookServer, ArchiveID, OwnerJID], +mam_get_prefs(HostType, DefaultMode, ArchiveID, Owner) -> + Params = #{archive_id => ArchiveID, owner => Owner}, + Args = [HostType, ArchiveID, Owner], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), InitialAccValue = {DefaultMode, [], []}, %% mod_mam:preference() type - run_hook_for_host_type(mam_get_prefs, HookServer, InitialAccValue, + run_hook_for_host_type(mam_get_prefs, HostType, InitialAccValue, ParamsWithLegacyArgs). %%% @doc The `mam_remove_archive' hook is called in order to %%% remove the entire archive for a particular user. --spec mam_remove_archive(HookServer, ArchiveID, OwnerJID) -> any() when - HookServer :: jid:lserver(), +-spec mam_remove_archive(HostType, ArchiveID, Owner) -> any() when + HostType :: mongooseim:host_type(), ArchiveID :: undefined | mod_mam:archive_id(), - OwnerJID :: jid:jid(). -mam_remove_archive(HookServer, ArchiveID, OwnerJID) -> - Params = #{archive_id => ArchiveID, owner_jid => OwnerJID}, - Args = [HookServer, ArchiveID, OwnerJID], + Owner :: jid:jid(). +mam_remove_archive(HostType, ArchiveID, Owner) -> + Params = #{archive_id => ArchiveID, owner => Owner}, + Args = [HostType, ArchiveID, Owner], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), - run_hook_for_host_type(mam_remove_archive, HookServer, ok, + run_hook_for_host_type(mam_remove_archive, HostType, ok, ParamsWithLegacyArgs). %%% @doc The `mam_lookup_messages' hook is to retrieve %%% archived messages for given search parameters. --spec mam_lookup_messages(HookServer, Params) -> Result when - HookServer :: jid:lserver(), +-spec mam_lookup_messages(HostType, Params) -> Result when + HostType :: mongooseim:host_type(), Params :: map(), Result :: {ok, mod_mam:lookup_result()}. -mam_lookup_messages(HookServer, Params) -> - Args = [HookServer, Params], +mam_lookup_messages(HostType, Params) -> + Args = [HostType, Params], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), InitialLookupValue = {0, 0, []}, %% mod_mam:lookup_result() type - run_hook_for_host_type(mam_lookup_messages, HookServer, {ok, InitialLookupValue}, + run_hook_for_host_type(mam_lookup_messages, HostType, {ok, InitialLookupValue}, ParamsWithLegacyArgs). %%% @doc The `mam_archive_message' hook is called in order %%% to store the message in the archive. --spec mam_archive_message(HookServer, Params) -> +-spec mam_archive_message(HostType, Params) -> Result when - HookServer :: jid:lserver(), + HostType :: mongooseim:host_type(), Params :: mod_mam:archive_message_params(), Result :: ok | {error, timeout}. -mam_archive_message(HookServer, Params) -> - Args = [HookServer, Params], +mam_archive_message(HostType, Params) -> + Args = [HostType, Params], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), - run_hook_for_host_type(mam_archive_message, HookServer, ok, ParamsWithLegacyArgs). + run_hook_for_host_type(mam_archive_message, HostType, ok, ParamsWithLegacyArgs). %%% @doc The `mam_flush_messages' hook is run after the async bulk write %%% happens for messages despite the result of the write. --spec mam_flush_messages(HookServer :: jid:lserver(), +-spec mam_flush_messages(HostType :: mongooseim:host_type(), MessageCount :: integer()) -> ok. -mam_flush_messages(HookServer, MessageCount) -> - Params = #{message_count => MessageCount}, - Args = [HookServer, MessageCount], +mam_flush_messages(HostType, MessageCount) -> + Params = #{count => MessageCount}, + Args = [HostType, MessageCount], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), - run_hook_for_host_type(mam_flush_messages, HookServer, ok, ParamsWithLegacyArgs). + run_hook_for_host_type(mam_flush_messages, HostType, ok, + ParamsWithLegacyArgs). %% @doc Waits until all pending messages are written -spec mam_archive_sync(HostType :: mongooseim:host_type()) -> ok. mam_archive_sync(HostType) -> - run_hook_for_host_type(mam_archive_sync, HostType, ok, [HostType]). + Args = [HostType], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(#{}, Args), + run_hook_for_host_type(mam_archive_sync, HostType, ok, ParamsWithLegacyArgs). %% @doc Notifies of a message retraction -spec mam_retraction(mongooseim:host_type(), @@ -1204,85 +1217,97 @@ mam_retraction(HostType, RetractionInfo, Env) -> %%% %%% If a MAM backend doesn't support or doesn't require archive IDs, %%% `undefined' may be returned. --spec mam_muc_archive_id(HookServer, OwnerJID) -> Result when - HookServer :: jid:lserver(), - OwnerJID :: jid:jid(), +-spec mam_muc_archive_id(HostType, Owner) -> Result when + HostType :: mongooseim:host_type(), + Owner :: jid:jid(), Result :: undefined | mod_mam:archive_id(). -mam_muc_archive_id(HookServer, OwnerJID) -> - run_hook_for_host_type(mam_muc_archive_id, HookServer, undefined, - [HookServer, OwnerJID]). +mam_muc_archive_id(HostType, Owner) -> + Params = #{owner => Owner}, + Args = [HostType, Owner], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), + run_hook_for_host_type(mam_muc_archive_id, HostType, undefined, + ParamsWithLegacyArgs). %%% @doc The `mam_muc_archive_size' hook is called to determine %%% the archive size for a given room. --spec mam_muc_archive_size(HostType, ArchiveID, RoomJID) -> Result when +-spec mam_muc_archive_size(HostType, ArchiveID, Room) -> Result when HostType :: mongooseim:host_type(), ArchiveID :: undefined | mod_mam:archive_id(), - RoomJID :: jid:jid(), + Room :: jid:jid(), Result :: integer(). -mam_muc_archive_size(HostType, ArchiveID, RoomJID) -> - run_hook_for_host_type(mam_muc_archive_size, HostType, 0, - [HostType, ArchiveID, RoomJID]). +mam_muc_archive_size(HostType, ArchiveID, Room) -> + Params = #{archive_id => ArchiveID, room => Room}, + Args = [HostType, ArchiveID, Room], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), + run_hook_for_host_type(mam_muc_archive_size, HostType, 0, ParamsWithLegacyArgs). %%% @doc The `mam_muc_get_behaviour' hooks is called to determine if a message should %%% be archived or not based on the given room and user JIDs. -spec mam_muc_get_behaviour(HostType, ArchiveID, - RoomJID, RemoteJID) -> Result when + Room, Remote) -> Result when HostType :: mongooseim:host_type(), ArchiveID :: undefined | mod_mam:archive_id(), - RoomJID :: jid:jid(), - RemoteJID :: jid:jid(), + Room :: jid:jid(), + Remote :: jid:jid(), Result :: mod_mam:archive_behaviour(). -mam_muc_get_behaviour(HostType, ArchiveID, RoomJID, RemoteJID) -> +mam_muc_get_behaviour(HostType, ArchiveID, Room, Remote) -> + Params = #{archive_id => ArchiveID, room => Room, remote => Remote}, + Args = [HostType, ArchiveID, Room, Remote], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), DefaultBehaviour = always, %% mod_mam:archive_behaviour() type run_hook_for_host_type(mam_muc_get_behaviour, HostType, DefaultBehaviour, - [HostType, ArchiveID, RoomJID, RemoteJID]). + ParamsWithLegacyArgs). %%% @doc The `mam_muc_set_prefs' hook is called to set a room's archive preferences. %%% %%% It's possible to set which JIDs are always or never allowed in the archive --spec mam_muc_set_prefs(HostType, ArchiveId, RoomJID, +-spec mam_muc_set_prefs(HostType, ArchiveId, Room, DefaultMode, AlwaysJIDs, NeverJIDs) -> Result when HostType :: mongooseim:host_type(), ArchiveId :: undefined | mod_mam:archive_id(), - RoomJID :: jid:jid(), + Room :: jid:jid(), DefaultMode :: mod_mam:archive_behaviour(), AlwaysJIDs :: [jid:literal_jid()], NeverJIDs :: [jid:literel_jid()], Result :: any(). -mam_muc_set_prefs(HostType, ArchiveID, RoomJID, DefaultMode, AlwaysJIDs, NeverJIDs) -> - Params = #{archive_id => ArchiveID, room_jid => RoomJID, default_mode => DefaultMode, +mam_muc_set_prefs(HostType, ArchiveID, Room, DefaultMode, AlwaysJIDs, NeverJIDs) -> + Params = #{archive_id => ArchiveID, room => Room, default_mode => DefaultMode, always_jids => AlwaysJIDs, never_jids => NeverJIDs}, - Args = [HostType, ArchiveID, RoomJID, DefaultMode, AlwaysJIDs, NeverJIDs], + Args = [HostType, ArchiveID, Room, DefaultMode, + AlwaysJIDs, NeverJIDs], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), InitialAcc = {error, not_implemented}, - run_hook_for_host_type(mam_muc_set_prefs, HostType, InitialAcc, ParamsWithLegacyArgs). + run_hook_for_host_type(mam_muc_set_prefs, HostType, InitialAcc, + ParamsWithLegacyArgs). %%% @doc The `mam_muc_get_prefs' hook is called to read %%% the archive settings for a given room. --spec mam_muc_get_prefs(HostType, DefaultMode, ArchiveID, RoomJID) -> Result when +-spec mam_muc_get_prefs(HostType, DefaultMode, ArchiveID, Room) -> Result when HostType :: mongooseim:host_type(), DefaultMode :: mod_mam:archive_behaviour(), ArchiveID :: undefined | mod_mam:archive_id(), - RoomJID :: jid:jid(), + Room :: jid:jid(), Result :: mod_mam:preference() | {error, Reason :: term()}. -mam_muc_get_prefs(HostType, DefaultMode, ArchiveID, RoomJID) -> - Params = #{archive_id => ArchiveID, room_jid => RoomJID}, - Args = [HostType, ArchiveID, RoomJID], +mam_muc_get_prefs(HostType, DefaultMode, ArchiveID, Room) -> + Params = #{archive_id => ArchiveID, room => Room}, + Args = [HostType, ArchiveID, Room], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), InitialAcc = {DefaultMode, [], []}, %% mod_mam:preference() type - run_hook_for_host_type(mam_muc_get_prefs, HostType, InitialAcc, ParamsWithLegacyArgs). + run_hook_for_host_type(mam_muc_get_prefs, HostType, InitialAcc, + ParamsWithLegacyArgs). %%% @doc The `mam_muc_remove_archive' hook is called in order to remove the entire %%% archive for a particular user. --spec mam_muc_remove_archive(HostType, ArchiveID, RoomJID) -> any() when +-spec mam_muc_remove_archive(HostType, ArchiveID, Room) -> any() when HostType :: mongooseim:host_type(), ArchiveID :: undefined | mod_mam:archive_id(), - RoomJID :: jid:jid(). -mam_muc_remove_archive(HostType, ArchiveID, RoomJID) -> - Params = #{archive_id => ArchiveID, room_jid => RoomJID}, - Args = [HostType, ArchiveID, RoomJID], + Room :: jid:jid(). +mam_muc_remove_archive(HostType, ArchiveID, Room) -> + Params = #{archive_id => ArchiveID, room => Room}, + Args = [HostType, ArchiveID, Room], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), - run_hook_for_host_type(mam_muc_remove_archive, HostType, ok, ParamsWithLegacyArgs). + run_hook_for_host_type(mam_muc_remove_archive, HostType, ok, + ParamsWithLegacyArgs). %%% @doc The `mam_muc_lookup_messages' hook is to retrieve archived %%% MUC messages for any given search parameters. @@ -1310,18 +1335,21 @@ mam_muc_archive_message(HostType, Params) -> %%% @doc The `mam_muc_flush_messages' hook is run after the async bulk write %%% happens for MUC messages despite the result of the write. --spec mam_muc_flush_messages(HookServer :: jid:lserver(), +-spec mam_muc_flush_messages(HostType :: mongooseim:host_type(), MessageCount :: integer()) -> ok. -mam_muc_flush_messages(HookServer, MessageCount) -> - Params = #{message_count => MessageCount}, - Args = [HookServer, MessageCount], +mam_muc_flush_messages(HostType, MessageCount) -> + Params = #{count => MessageCount}, + Args = [HostType, MessageCount], ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), - run_hook_for_host_type(mam_muc_flush_messages, HookServer, ok, ParamsWithLegacyArgs). + run_hook_for_host_type(mam_muc_flush_messages, HostType, ok, + ParamsWithLegacyArgs). %% @doc Waits until all pending messages are written -spec mam_muc_archive_sync(HostType :: mongooseim:host_type()) -> ok. mam_muc_archive_sync(HostType) -> - run_hook_for_host_type(mam_muc_archive_sync, HostType, ok, [HostType]). + Args = [HostType], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(#{}, Args), + run_hook_for_host_type(mam_muc_archive_sync, HostType, ok, ParamsWithLegacyArgs). %% @doc Notifies of a muc message retraction -spec mam_muc_retraction(mongooseim:host_type(), @@ -1340,7 +1368,10 @@ mam_muc_retraction(HostType, RetractionInfo, Env) -> JID :: jid:jid(), Result :: ejabberd_gen_mam_archive:mam_pm_gdpr_data(). get_mam_pm_gdpr_data(HostType, JID) -> - run_hook_for_host_type(get_mam_pm_gdpr_data, HostType, [], [HostType, JID]). + Params = #{jid => JID}, + Args = [HostType, JID], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), + run_hook_for_host_type(get_mam_pm_gdpr_data, HostType, [], ParamsWithLegacyArgs). %%% @doc `get_mam_muc_gdpr_data' hook is called to provide %%% a user's archive for GDPR purposes. @@ -1349,12 +1380,15 @@ get_mam_pm_gdpr_data(HostType, JID) -> JID :: jid:jid(), Result :: ejabberd_gen_mam_archive:mam_muc_gdpr_data(). get_mam_muc_gdpr_data(HostType, JID) -> - run_hook_for_host_type(get_mam_muc_gdpr_data, HostType, [], [HostType, JID]). + Params = #{jid => JID}, + Args = [HostType, JID], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), + run_hook_for_host_type(get_mam_muc_gdpr_data, HostType, [], ParamsWithLegacyArgs). %%% @doc `get_personal_data' hook is called to retrieve %%% a user's personal data for GDPR purposes. -spec get_personal_data(HostType, JID) -> Result when - HostType :: binary(), + HostType :: mongooseim:host_type(), JID :: jid:jid(), Result :: gdpr:personal_data(). get_personal_data(HostType, JID) -> @@ -1532,7 +1566,10 @@ amp_verify_support(HostType, Rules) -> EventData :: mod_muc:room_event_data(), Result :: exml:element(). filter_room_packet(HostType, Packet, EventData) -> - run_hook_for_host_type(filter_room_packet, HostType, Packet, [HostType, EventData]). + Params = #{packet => Packet, event_data => EventData}, + Args = [HostType, EventData], + ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args), + run_hook_for_host_type(filter_room_packet, HostType, Packet, ParamsWithLegacyArgs). %%% @doc The `forget_room' hook is called when a room is removed from the database. -spec forget_room(HostType, MucHost, Room) -> Result when diff --git a/src/muc_light/mod_muc_light.erl b/src/muc_light/mod_muc_light.erl index 78ec55dbd9a..557202b578b 100644 --- a/src/muc_light/mod_muc_light.erl +++ b/src/muc_light/mod_muc_light.erl @@ -309,7 +309,7 @@ hooks(HostType) -> %%==================================================================== -spec process_packet(Acc :: mongoose_acc:t(), From ::jid:jid(), To ::jid:jid(), - El :: exml:element(), Extra :: map()) -> mongoose_acc:t(). + El :: exml:element(), Extra :: gen_hook:extra()) -> mongoose_acc:t(). process_packet(Acc, From, To, El, _Extra) -> HostType = mod_muc_light_utils:acc_to_host_type(Acc), DecodedPacket = mod_muc_light_codec_backend:decode(From, To, El, Acc), @@ -379,7 +379,7 @@ make_err(From, To, El, Acc, Reason) -> -spec prevent_service_unavailable(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). prevent_service_unavailable(Acc, #{packet := Packet}, _Extra) -> case xml:get_tag_attr_s(<<"type">>, Packet) of <<"groupchat">> -> {stop, Acc}; @@ -389,7 +389,7 @@ prevent_service_unavailable(Acc, #{packet := Packet}, _Extra) -> -spec disco_local_items(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_local_items(Acc = #{host_type := HostType, to_jid := #jid{lserver = ServerHost}, node := <<>>}, @@ -411,7 +411,7 @@ legacy_mode(HostType) -> -spec remove_user(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_user(Acc, #{jid := UserJid}, #{host_type := HostType}) -> Version = mongoose_bin:gen_from_timestamp(), case mod_muc_light_db_backend:remove_user(HostType, jid:to_lus(UserJid), Version) of @@ -428,7 +428,7 @@ remove_user(Acc, #{jid := UserJid}, #{host_type := HostType}) -> -spec remove_domain(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_domain_api:remove_domain_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> F = fun() -> MUCHost = server_host_to_muc_host(HostType, Domain), @@ -440,7 +440,7 @@ remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> -spec add_rooms_to_roster(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). add_rooms_to_roster(Acc, #{jid := UserJID}, _Extra) -> Items = mongoose_acc:get(roster, items, [], Acc), HostType = mongoose_acc:host_type(Acc), @@ -464,7 +464,7 @@ make_roster_item({{RoomU, RoomS}, RoomName, RoomVersion}) -> -spec process_iq_get(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). process_iq_get(Acc, #{from := #jid{lserver = FromS} = From, to := To, iq := IQ}, #{host_type := HostType}) -> MUCHost = server_host_to_muc_host(HostType, FromS), case {mod_muc_light_codec_backend:decode(From, To, IQ, Acc), @@ -490,7 +490,7 @@ process_iq_get(Acc, #{from := #jid{lserver = FromS} = From, to := To, iq := IQ}, -spec process_iq_set(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). process_iq_set(Acc, #{from := #jid{ lserver = FromS } = From, to := To, iq := IQ}, _Extra) -> HostType = mod_muc_light_utils:acc_to_host_type(Acc), MUCHost = server_host_to_muc_host(HostType, FromS), @@ -519,7 +519,7 @@ process_iq_set(Acc, #{from := #jid{ lserver = FromS } = From, to := To, iq := IQ -spec is_muc_room_owner(Acc, Params, Extra) -> {ok, Acc} when Acc :: boolean(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). is_muc_room_owner(true, _Params, _Extra) -> {ok, true}; is_muc_room_owner(_, #{acc := Acc, room := Room, user := User}, _Extra) -> @@ -528,7 +528,7 @@ is_muc_room_owner(_, #{acc := Acc, room := Room, user := User}, _Extra) -> -spec can_access_room(Acc, Params, Extra) -> {ok, Acc} when Acc :: boolean(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). can_access_room(true, _Params, _Extra) -> {ok, true}; can_access_room(_, #{acc := Acc, room := Room, user := User}, _Extra) -> @@ -537,7 +537,7 @@ can_access_room(_, #{acc := Acc, room := Room, user := User}, _Extra) -> -spec acc_room_affiliations(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). acc_room_affiliations(Acc1, #{room := RoomJid}, _Extra) -> case get_room_affs_from_acc(Acc1, RoomJid) of {error, _} -> @@ -555,7 +555,7 @@ acc_room_affiliations(Acc1, #{room := RoomJid}, _Extra) -> -spec room_exists(Acc, Params, Extra) -> {ok, Acc} when Acc :: boolean(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). room_exists(_, #{room := RoomJid}, #{host_type := HostType}) -> {ok, mod_muc_light_db_backend:room_exists(HostType, jid:to_lus(RoomJid))}. @@ -581,7 +581,7 @@ set_room_affs_from_acc(Acc, RoomJid, Affs) -> -spec can_access_identity(Acc, Params, Extra) -> {ok, Acc} when Acc :: boolean(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). can_access_identity(true, _Params, _Extra) -> {ok, true}; can_access_identity(_Acc, _Params, _Extra) -> diff --git a/src/muc_light/mod_muc_light_cache.erl b/src/muc_light/mod_muc_light_cache.erl index 4813bcdba91..82fed93eb85 100644 --- a/src/muc_light/mod_muc_light_cache.erl +++ b/src/muc_light/mod_muc_light_cache.erl @@ -51,7 +51,7 @@ hooks(HostType) -> -spec pre_acc_room_affiliations(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). pre_acc_room_affiliations(Acc, #{room := RoomJid}, #{host_type := HostType}) -> case mod_muc_light:get_room_affs_from_acc(Acc, RoomJid) of {error, _} -> @@ -68,7 +68,7 @@ pre_acc_room_affiliations(Acc, #{room := RoomJid}, #{host_type := HostType}) -> -spec post_acc_room_affiliations(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). post_acc_room_affiliations(Acc, #{room := RoomJid}, #{host_type := HostType}) -> case mod_muc_light:get_room_affs_from_acc(Acc, RoomJid) of {error, _} -> @@ -81,7 +81,7 @@ post_acc_room_affiliations(Acc, #{room := RoomJid}, #{host_type := HostType}) -> -spec pre_room_exists(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: boolean(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). pre_room_exists(false, #{room := RoomJid}, #{host_type := HostType}) -> case mongoose_user_cache:is_member(HostType, ?MODULE, RoomJid) of true -> {stop, true}; @@ -93,7 +93,7 @@ pre_room_exists(Status, _, _) -> -spec post_room_exists(Acc, Params, Extra) -> {ok, Acc} when Acc :: boolean(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). post_room_exists(true, #{room := RoomJid}, #{host_Type := HostType}) -> mongoose_user_cache:merge_entry(HostType, ?MODULE, RoomJid, #{}), {ok, true}; @@ -102,8 +102,8 @@ post_room_exists(Status, _, _) -> -spec forget_room(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), - Params :: map(), - Extra :: map(). + Params :: #{muc_host := jid:server(), room := jid:luser()}, + Extra :: gen_hook:extra(). forget_room(Acc, #{muc_host := RoomS, room := RoomU}, #{host_type := HostType}) -> mongoose_user_cache:delete_user(HostType, ?MODULE, jid:make_noprep(RoomU, RoomS, <<>>)), {ok, Acc}. @@ -111,7 +111,7 @@ forget_room(Acc, #{muc_host := RoomS, room := RoomU}, #{host_type := HostType}) -spec remove_domain(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_domain_api:remove_domain_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> MUCHost = mod_muc_light:server_host_to_muc_host(HostType, Domain), mongoose_user_cache:delete_domain(HostType, ?MODULE, MUCHost), @@ -120,7 +120,7 @@ remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> -spec room_new_affiliations(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). room_new_affiliations(Acc, #{room := RoomJid, new_affs := NewAffs, version := NewVersion}, _Extra) -> HostType = mod_muc_light_utils:acc_to_host_type(Acc), % make sure other nodes forget about stale values diff --git a/src/offline/mod_offline.erl b/src/offline/mod_offline.erl index b6f40d343f8..c8b2c97c419 100644 --- a/src/offline/mod_offline.erl +++ b/src/offline/mod_offline.erl @@ -173,7 +173,7 @@ hooks(HostType) -> -spec amp_failed_event(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). amp_failed_event(Acc, _Params, _Extra) -> {ok, mod_amp:check_packet(Acc, offline_failed)}. @@ -317,7 +317,7 @@ code_change(_OldVsn, State, _Extra) -> -spec inspect_packet(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). inspect_packet(Acc, #{from := From, to := To, packet := Packet}, _Extra) -> case check_event_chatstates(Acc, From, To, Packet) of true -> @@ -440,7 +440,7 @@ find_x_expire(TimeStamp, [El | Els]) -> -spec pop_offline_messages(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). pop_offline_messages(Acc, #{jid := JID}, _Extra) -> {ok, mongoose_acc:append(offline, messages, offline_messages(Acc, JID), Acc)}. @@ -473,7 +473,7 @@ pop_messages(HostType, JID) -> -spec remove_user(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_user(Acc, #{jid := #jid{luser = LUser, lserver = LServer}}, #{host_type := HostType}) -> mod_offline_backend:remove_user(HostType, LUser, LServer), {ok, Acc}. @@ -481,7 +481,7 @@ remove_user(Acc, #{jid := #jid{luser = LUser, lserver = LServer}}, #{host_type : -spec remove_domain(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_domain_api:remove_domain_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> case backend_module:is_exported(mod_offline_backend, remove_domain, 2) of true -> @@ -494,7 +494,7 @@ remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> -spec disco_features(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_disco:feature_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). disco_features(Acc = #{node := <<>>}, _Params, _Extra) -> {ok, mongoose_disco:add_features([?NS_FEATURE_MSGOFFLINE], Acc)}; disco_features(Acc = #{node := ?NS_FEATURE_MSGOFFLINE}, _Params, _Extra) -> @@ -506,7 +506,7 @@ disco_features(Acc, _Params, _Extra) -> -spec determine_amp_strategy(Acc, Params, Extra) -> {ok, Acc} when Acc :: mod_amp:amp_strategy(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). determine_amp_strategy(Strategy = #amp_strategy{deliver = [none]}, #{to := ToJID, event := initial_check}, _Params) -> case ejabberd_auth:does_user_exist(ToJID) of true -> {ok, Strategy#amp_strategy{deliver = [stored, none]}}; @@ -517,8 +517,8 @@ determine_amp_strategy(Strategy, _Params, _Extra) -> -spec get_personal_data(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: gdpr:personal_data(), - Params :: map(), - Extra :: map(). + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). get_personal_data(Acc, #{jid := JID}, #{host_type := HostType}) -> {ok, Messages} = mod_offline_backend:fetch_messages(HostType, JID), {ok, [{offline, ["timestamp", "from", "to", "packet"], diff --git a/src/offline/mod_offline_chatmarkers.erl b/src/offline/mod_offline_chatmarkers.erl index 0ae906c5733..47121dff8f0 100644 --- a/src/offline/mod_offline_chatmarkers.erl +++ b/src/offline/mod_offline_chatmarkers.erl @@ -104,7 +104,7 @@ config_spec() -> -spec remove_user(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_user(Acc, #{jid := #jid{luser = User, lserver = Server}}, #{host_type := HostType}) -> mod_offline_chatmarkers_backend:remove_user(HostType, jid:make(User, Server, <<>>)), {ok, Acc}. @@ -112,14 +112,14 @@ remove_user(Acc, #{jid := #jid{luser = User, lserver = Server}}, #{host_type := -spec pop_offline_messages(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). pop_offline_messages(Acc, #{jid := JID}, _Extra) -> {ok, mongoose_acc:append(offline, messages, offline_chatmarkers(Acc, JID), Acc)}. -spec inspect_packet(Acc, Params, Extra) -> {ok | stop, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). inspect_packet(Acc, #{from := From, to := To, packet := Packet}, _Extra) -> case maybe_store_chat_marker(Acc, From, To, Packet) of true -> diff --git a/src/offline/mod_offline_stub.erl b/src/offline/mod_offline_stub.erl index 9b163b1320e..4025c6a45bc 100644 --- a/src/offline/mod_offline_stub.erl +++ b/src/offline/mod_offline_stub.erl @@ -53,6 +53,6 @@ hooks(HostType) -> -spec stop_hook_processing(Acc, Params, Extra) -> {stop, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). stop_hook_processing(Acc, _Params, _Extra) -> {stop, Acc}. diff --git a/src/smart_markers/mod_smart_markers.erl b/src/smart_markers/mod_smart_markers.erl index b04b4a34d9a..691a6c7aab0 100644 --- a/src/smart_markers/mod_smart_markers.erl +++ b/src/smart_markers/mod_smart_markers.erl @@ -209,7 +209,7 @@ removal_hooks(HostType) -> -spec user_send_packet(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). user_send_packet(Acc, _, _) -> {From, To, Packet} = mongoose_acc:packet(Acc), {ok, user_send_packet(Acc, From, To, Packet)}. @@ -229,7 +229,7 @@ user_send_packet(Acc, _From, _To, _Packet) -> -spec filter_local_packet(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_hooks:filter_packet_acc() | drop, Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). filter_local_packet(Filter = {_From, _To, _Acc, Msg = #xmlel{name = <<"message">>}}, _, _) -> NewFilter = case mongoose_chat_markers:has_chat_markers(Msg) of false -> Filter; @@ -242,7 +242,7 @@ filter_local_packet(Filter, _, _) -> -spec remove_user(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: #{jid := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). remove_user(Acc, #{jid := #jid{luser = User, lserver = Server}}, _) -> HostType = mongoose_acc:host_type(Acc), mod_smart_markers_backend:remove_user(HostType, jid:make_bare(User, Server)), @@ -268,7 +268,7 @@ forget_room(Acc, #{muc_host := RoomS, room := RoomU}, #{host_type := HostType}) -spec room_new_affiliations(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_domain_api:simple_acc(), Params :: #{room := jid:jid()}, - Extra :: map(). + Extra :: gen_hook:extra(). room_new_affiliations(Acc, #{room := RoomJID}, _) -> HostType = mod_muc_light_utils:acc_to_host_type(Acc), Packet = mongoose_acc:element(Acc), diff --git a/src/vcard/mod_vcard.erl b/src/vcard/mod_vcard.erl index 5e3d67e895b..991706505b6 100644 --- a/src/vcard/mod_vcard.erl +++ b/src/vcard/mod_vcard.erl @@ -99,8 +99,8 @@ -spec get_personal_data(Acc, Params, Extra) -> {ok, Acc} when Acc :: gdpr:personal_data(), - Params :: map(), - Extra :: map(). + Params :: #{jid := jid:jid()}, + Extra :: gen_hook:extra(). get_personal_data(Acc, #{jid := #jid{luser = LUser, lserver = LServer}}, #{host_type := HostType}) -> Jid = jid:to_binary({LUser, LServer}), Schema = ["jid", "vcard"], @@ -390,7 +390,7 @@ process_local_iq(Acc, _From, _To, IQ = #iq{type = get}, _Extra) -> From :: jid:jid(), To :: jid:jid(), IQ :: jlib:iq(), - Extra :: map()) -> + Extra :: gen_hook:extra()) -> {stop, mongoose_acc:t()} | {mongoose_acc:t(), jlib:iq()}. process_sm_iq(Acc, From, To, IQ = #iq{type = set, sub_el = VCARD}, _Extra) -> HostType = mongoose_acc:host_type(Acc), @@ -459,7 +459,7 @@ unsafe_set_vcard(HostType, From, VCARD) -> -spec set_vcard(Acc, Params, Extra) -> {ok, Acc} when Acc :: ok | {error, term()}, Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). set_vcard(ok, _Params, _Extra) -> ?LOG_DEBUG(#{what => hook_call_already_handled}), {ok, ok}; @@ -481,7 +481,7 @@ set_vcard({error, _} = Error, _Params, _Extra) -> -spec remove_domain(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_domain_api:remove_domain_acc(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> mod_vcard_backend:remove_domain(HostType, Domain), {ok, Acc}. @@ -489,7 +489,7 @@ remove_domain(Acc, #{domain := Domain}, #{host_type := HostType}) -> -spec remove_user(Acc, Params, Extra) -> {ok, Acc} when Acc :: mongoose_acc:t(), Params :: map(), - Extra :: map(). + Extra :: gen_hook:extra(). remove_user(Acc, #{jid := #jid{luser = User, lserver = Server}}, #{host_type := HostType}) -> LUser = jid:nodeprep(User), LServer = jid:nodeprep(Server),