mod_push_keepalive: Delay 'wake_on_start'

Delay the 'wake_on_start' notifications until ejabberd is fully
initialized.  This makes sure no s2s connections are initiated before
certificates are loaded.

Many thanks to Friedrich Altheide for reporting the issue.
This commit is contained in:
Holger Weiss 2023-08-08 20:17:10 +02:00
parent a9347cd248
commit 26ed6539ba
1 changed files with 24 additions and 19 deletions

View File

@ -32,8 +32,9 @@
-export([start/2, stop/1, reload/3, mod_opt_type/1, mod_options/1, depends/2]).
-export([mod_doc/0]).
%% ejabberd_hooks callbacks.
-export([c2s_session_pending/1, c2s_session_resumed/1, c2s_copy_session/2,
c2s_handle_cast/2, c2s_handle_info/2, c2s_stanza/3]).
-export([ejabberd_started/0, c2s_session_pending/1, c2s_session_resumed/1,
c2s_copy_session/2, c2s_handle_cast/2, c2s_handle_info/2,
c2s_stanza/3]).
-include("logger.hrl").
-include_lib("xmpp/include/xmpp.hrl").
@ -47,13 +48,7 @@
%% gen_mod callbacks.
%%--------------------------------------------------------------------
-spec start(binary(), gen_mod:opts()) -> ok.
start(Host, Opts) ->
case mod_push_keepalive_opt:wake_on_start(Opts) of
true ->
wake_all(Host);
false ->
ok
end,
start(Host, _Opts) ->
register_hooks(Host).
-spec stop(binary()) -> ok.
@ -61,14 +56,8 @@ stop(Host) ->
unregister_hooks(Host).
-spec reload(binary(), gen_mod:opts(), gen_mod:opts()) -> ok.
reload(Host, NewOpts, OldOpts) ->
case {mod_push_keepalive_opt:wake_on_start(NewOpts),
mod_push_keepalive_opt:wake_on_start(OldOpts)} of
{true, false} ->
wake_all(Host);
_ ->
ok
end.
reload(_Host, _NewOpts, _OldOpts) ->
ok.
-spec depends(binary(), gen_mod:opts()) -> [{module(), hard | soft}].
depends(_Host, _Opts) ->
@ -146,7 +135,10 @@ register_hooks(Host) ->
ejabberd_hooks:add(c2s_handle_info, Host, ?MODULE,
c2s_handle_info, 50),
ejabberd_hooks:add(c2s_handle_send, Host, ?MODULE,
c2s_stanza, 50).
c2s_stanza, 50),
% Wait for ejabberd_pkix before running our ejabberd_started/0, so that we
% don't initiate s2s connections before certificates are loaded:
ejabberd_hooks:add(ejabberd_started, ?MODULE, ejabberd_started, 90).
-spec unregister_hooks(binary()) -> ok.
unregister_hooks(Host) ->
@ -161,7 +153,14 @@ unregister_hooks(Host) ->
ejabberd_hooks:delete(c2s_handle_info, Host, ?MODULE,
c2s_handle_info, 50),
ejabberd_hooks:delete(c2s_handle_send, Host, ?MODULE,
c2s_stanza, 50).
c2s_stanza, 50),
case gen_mod:is_loaded_elsewhere(Host, ?MODULE) of
false ->
ejabberd_hooks:delete(
ejabberd_started, ?MODULE, ejabberd_started, 90);
true ->
ok
end.
%%--------------------------------------------------------------------
%% Hook callbacks.
@ -233,6 +232,12 @@ c2s_handle_info(#{push_enabled := true, mgmt_state := pending,
c2s_handle_info(State, _) ->
State.
-spec ejabberd_started() -> ok.
ejabberd_started() ->
[wake_all(Host) || Host <- ejabberd_config:get_option(hosts),
mod_push_keepalive_opt:wake_on_start(Host)],
ok.
%%--------------------------------------------------------------------
%% Internal functions.
%%--------------------------------------------------------------------