Skip to content

Commit

Permalink
Refactored hook handlers in mod_global_distrib_mapping
Browse files Browse the repository at this point in the history
pawlooss1 committed Oct 28, 2022
1 parent dc32b41 commit 6d78f3d
Showing 3 changed files with 59 additions and 43 deletions.
79 changes: 43 additions & 36 deletions src/global_distrib/mod_global_distrib_mapping.erl
Original file line number Diff line number Diff line change
@@ -31,14 +31,13 @@
-export([for_domain/1, insert_for_domain/1, insert_for_domain/2, insert_for_domain/3,
cache_domain/2, delete_for_domain/1, all_domains/0, public_domains/0]).
-export([for_jid/1, insert_for_jid/1, cache_jid/2, delete_for_jid/1, clear_cache/1]).
-export([register_subhost/3, unregister_subhost/2, packet_to_component/3,
session_opened/5, session_closed/5]).
-export([register_subhost/3, unregister_subhost/3, packet_to_component/3,
session_opened/3, session_closed/3]).
-export([endpoints/1, hosts/0]).

-ignore_xref([
delete_for_domain/1, delete_for_jid/1, insert_for_domain/1,
insert_for_domain/2, insert_for_domain/3, insert_for_jid/1, packet_to_component/3,
register_subhost/3, session_closed/5, session_opened/5, unregister_subhost/2
insert_for_domain/2, insert_for_domain/3, insert_for_jid/1
]).

-type endpoint() :: mod_global_distrib_utils:endpoint().
@@ -148,7 +147,7 @@ start(HostType, Opts = #{cache := CacheOpts}) ->
DomainLifetime = timer:seconds(DomainLifetimeSec),
JidLifetime = timer:seconds(JidLifeTimeSec),

ejabberd_hooks:add(hooks(HostType)),
gen_hook:add_handlers(hooks(HostType)),

ets_cache:new(?DOMAIN_TAB, [{cache_missed, CacheMissed}, {life_time, DomainLifetime}]),
ets_cache:new(?JID_TAB, [{cache_missed, CacheMissed}, {life_time, JidLifetime},
@@ -158,7 +157,7 @@ start(HostType, Opts = #{cache := CacheOpts}) ->
stop(HostType) ->
ets_cache:delete(?JID_TAB),
ets_cache:delete(?DOMAIN_TAB),
ejabberd_hooks:delete(hooks(HostType)),
gen_hook:delete_handlers(hooks(HostType)),
mod_global_distrib_mapping_backend:stop().

-spec deps(mongooseim:host_type(), gen_mod:module_opts()) -> gen_mod_deps:deps().
@@ -170,31 +169,35 @@ deps(_HostType, Opts) ->
%% Hooks implementation
%%--------------------------------------------------------------------

-spec session_opened(Acc, binary(), ejabberd_sm:sid(), UserJID :: jid:jid(), Info :: list()) ->
Acc when Acc :: any().
session_opened(Acc, _HostType, _SID, UserJid, _Info) ->
-spec session_opened(Acc, Params, Extra) -> {ok, Acc} when
Acc :: any(),
Params :: #{jid := jid:jid()},
Extra :: map().
session_opened(Acc, #{jid := UserJid}, _) ->
insert_for_jid(UserJid),
Acc.

-spec session_closed(mongoose_acc:t(),
ejabberd_sm:sid(),
UserJID :: jid:jid(),
Info :: list(),
_Status :: any()) ->
mongoose_acc:t().
session_closed(Acc, _SID, UserJid, _Info, _Reason) ->
{ok, Acc}.

-spec session_closed(Acc, Params, Extra) -> {ok, Acc} when
Acc :: mongoose_acc:t(),
Params :: #{jid := jid:jid()},
Extra :: map().
session_closed(Acc, #{jid := UserJid}, _) ->
delete_for_jid(UserJid),
Acc.
{ok, Acc}.

-spec packet_to_component(Acc :: mongoose_acc:t(),
From :: jid:jid(),
To :: jid:jid()) -> mongoose_acc:t().
packet_to_component(Acc, From, _To) ->
-spec packet_to_component(Acc, Params, Extra) -> {ok, Acc} when
Acc :: mongoose_acc:t(),
Params :: #{from := jid:jid()},
Extra :: map().
packet_to_component(Acc, #{from := From}, _) ->
mod_global_distrib_utils:maybe_update_mapping(From, Acc),
Acc.
{ok, Acc}.

-spec register_subhost(any(), SubHost :: binary(), IsHidden :: boolean()) -> ok.
register_subhost(_, SubHost, IsHidden) ->
-spec register_subhost(Acc, Params, Extra) -> {ok, ok} when
Acc :: any(),
Params :: #{ldomain := binary(), is_hidden := boolean()},
Extra :: map().
register_subhost(_, #{ldomain := SubHost, is_hidden := IsHidden}, _) ->
IsSubhostOf =
fun(Host) ->
case binary:match(SubHost, Host) of
@@ -204,25 +207,29 @@ register_subhost(_, SubHost, IsHidden) ->
end,

GlobalHost = opt(global_host),
case lists:filter(IsSubhostOf, ?MYHOSTS) of
NewAcc = case lists:filter(IsSubhostOf, ?MYHOSTS) of
[GlobalHost] -> insert_for_domain(SubHost, IsHidden);
_ -> ok
end.
end,
{ok, NewAcc}.

-spec unregister_subhost(any(), SubHost :: binary()) -> ok.
unregister_subhost(_, SubHost) ->
delete_for_domain(SubHost).
-spec unregister_subhost(Acc, Params, Extra) -> {ok, ok} when
Acc :: any(),
Params :: #{ldomain := binary()},
Extra :: map().
unregister_subhost(_, #{ldomain := SubHost}, _) ->
{ok, delete_for_domain(SubHost)}.

%%--------------------------------------------------------------------
%% Helpers
%%--------------------------------------------------------------------

hooks(HostType) ->
[{register_subhost, global, ?MODULE, register_subhost, 90},
{unregister_subhost, global, ?MODULE, unregister_subhost, 90},
{packet_to_component, global, ?MODULE, packet_to_component, 90},
{sm_register_connection_hook, HostType, ?MODULE, session_opened, 90},
{sm_remove_connection_hook, HostType, ?MODULE, session_closed, 90}].
[{register_subhost, global, fun ?MODULE:register_subhost/3, #{}, 90},
{unregister_subhost, global, fun ?MODULE:unregister_subhost/3, #{}, 90},
{packet_to_component, global, fun ?MODULE:packet_to_component/3, #{}, 90},
{sm_register_connection_hook, HostType, fun ?MODULE:session_opened/3, #{}, 90},
{sm_remove_connection_hook, HostType, fun ?MODULE:session_closed/3, #{}, 90}].

-spec normalize_jid(jid:ljid()) -> [binary()].
normalize_jid({_, _, _} = FullJid) ->
15 changes: 12 additions & 3 deletions src/mongoose_hooks.erl
Original file line number Diff line number Diff line change
@@ -322,7 +322,10 @@ get_key(HostType, KeyName) ->
To :: jid:jid(),
Result :: mongoose_acc:t().
packet_to_component(Acc, From, To) ->
run_global_hook(packet_to_component, Acc, [From, To]).
Params = #{from => From, to => To},
Args = [From, To],
ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args),
run_global_hook(packet_to_component, Acc, ParamsWithLegacyArgs).

-spec presence_probe_hook(HostType, Acc, From, To, Pid) -> Result when
HostType :: binary(),
@@ -355,7 +358,10 @@ push_notifications(HostType, Acc, NotificationForms, Options) ->
IsHidden :: boolean(),
Result :: any().
register_subhost(LDomain, IsHidden) ->
run_global_hook(register_subhost, ok, [LDomain, IsHidden]).
Params = #{ldomain => LDomain, is_hidden => IsHidden},
Args = [LDomain, IsHidden],
ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args),
run_global_hook(register_subhost, ok, ParamsWithLegacyArgs).

%%% @doc The `register_user' hook is called when a user is successfully
%%% registered in an authentication backend.
@@ -441,7 +447,10 @@ filter_unacknowledged_messages(HostType, Jid, Buffer) ->
LDomain :: binary(),
Result :: any().
unregister_subhost(LDomain) ->
run_global_hook(unregister_subhost, ok, [LDomain]).
Params = #{ldomain => LDomain},
Args = [LDomain],
ParamsWithLegacyArgs = ejabberd_hooks:add_args(Params, Args),
run_global_hook(unregister_subhost, ok, ParamsWithLegacyArgs).

-spec user_available_hook(Acc, JID) -> Result when
Acc :: mongoose_acc:t(),
8 changes: 4 additions & 4 deletions test/mod_global_distrib_SUITE.erl
Original file line number Diff line number Diff line change
@@ -114,17 +114,17 @@ connection_opts() ->
%% despite lack of global_distrib structure in Acc.
missing_struct_in_message_from_user(_Config) ->
From = jid:make(<<"user">>, global_host(), <<"resource">>),
{Acc, To} = fake_acc_to_component(From),
{Acc, _To} = fake_acc_to_component(From),
% The handler must not crash and return unchanged Acc
Acc = mod_global_distrib_mapping:packet_to_component(Acc, From, To).
{ok, Acc} = mod_global_distrib_mapping:packet_to_component(Acc, #{from => From}, #{}).

%% Update logic has two separate paths: when a packet is sent by a user or by another
%% component. This test covers the latter.
missing_struct_in_message_from_component(_Config) ->
From = jid:make(<<"">>, <<"from_service.", (global_host())/binary>>, <<"">>),
{Acc, To} = fake_acc_to_component(From),
{Acc, _To} = fake_acc_to_component(From),
% The handler must not crash and return unchanged Acc
Acc = mod_global_distrib_mapping:packet_to_component(Acc, From, To).
{ok, Acc} = mod_global_distrib_mapping:packet_to_component(Acc, #{from => From}, #{}).

%%--------------------------------------------------------------------
%% Helpers

0 comments on commit 6d78f3d

Please sign in to comment.