Don't send ping if resource is gone

This commit is contained in:
Jérôme Sautret 2022-04-26 18:56:38 +02:00
parent f61f5beb5b
commit f4959c8b28
1 changed files with 37 additions and 29 deletions

View File

@ -138,29 +138,37 @@ handle_info({iq_reply, timeout, JID}, State) ->
ejabberd_hooks:run(user_ping_timeout, State#state.host, ejabberd_hooks:run(user_ping_timeout, State#state.host,
[JID]), [JID]),
Timers = case State#state.timeout_action of Timers = case State#state.timeout_action of
kill -> kill ->
#jid{user = User, server = Server, #jid{user = User, server = Server,
resource = Resource} = resource = Resource} =
JID, JID,
case ejabberd_sm:get_session_pid(User, Server, Resource) case ejabberd_sm:get_session_pid(User, Server, Resource) of
of Pid when is_pid(Pid) ->
Pid when is_pid(Pid) -> ejabberd_c2s:close(Pid, ping_timeout); ejabberd_c2s:close(Pid, ping_timeout);
_ -> ok _ ->
end, ok
del_timer(JID, State#state.timers); end,
_ -> del_timer(JID, State#state.timers);
State#state.timers _ ->
end, State#state.timers
end,
{noreply, State#state{timers = Timers}}; {noreply, State#state{timers = Timers}};
handle_info({timeout, _TRef, {ping, JID}}, State) -> handle_info({timeout, _TRef, {ping, JID}}, State) ->
Host = State#state.host, Timers = case ejabberd_sm:get_session_pid(JID#jid.luser,
From = jid:make(Host), JID#jid.lserver,
IQ = #iq{from = From, to = JID, type = get, sub_els = [#ping{}]}, JID#jid.lresource) of
ejabberd_router:route_iq(IQ, JID, none ->
gen_mod:get_module_proc(Host, ?MODULE), del_timer(JID, State#state.timers);
State#state.ping_ack_timeout), _ ->
Timers = add_timer(JID, State#state.ping_interval, Host = State#state.host,
State#state.timers), From = jid:make(Host),
IQ = #iq{from = From, to = JID, type = get, sub_els = [#ping{}]},
ejabberd_router:route_iq(IQ, JID,
gen_mod:get_module_proc(Host, ?MODULE),
State#state.ping_ack_timeout),
add_timer(JID, State#state.ping_interval,
State#state.timers)
end,
{noreply, State#state{timers = Timers}}; {noreply, State#state{timers = Timers}};
handle_info(Info, State) -> handle_info(Info, State) ->
?WARNING_MSG("Unexpected info: ~p", [Info]), ?WARNING_MSG("Unexpected info: ~p", [Info]),
@ -243,10 +251,10 @@ unregister_iq_handlers(Host) ->
add_timer(JID, Interval, Timers) -> add_timer(JID, Interval, Timers) ->
LJID = jid:tolower(JID), LJID = jid:tolower(JID),
NewTimers = case maps:find(LJID, Timers) of NewTimers = case maps:find(LJID, Timers) of
{ok, OldTRef} -> {ok, OldTRef} ->
misc:cancel_timer(OldTRef), misc:cancel_timer(OldTRef),
maps:remove(LJID, Timers); maps:remove(LJID, Timers);
_ -> Timers _ -> Timers
end, end,
TRef = erlang:start_timer(Interval, self(), {ping, JID}), TRef = erlang:start_timer(Interval, self(), {ping, JID}),
maps:put(LJID, TRef, NewTimers). maps:put(LJID, TRef, NewTimers).
@ -255,10 +263,10 @@ add_timer(JID, Interval, Timers) ->
del_timer(JID, Timers) -> del_timer(JID, Timers) ->
LJID = jid:tolower(JID), LJID = jid:tolower(JID),
case maps:find(LJID, Timers) of case maps:find(LJID, Timers) of
{ok, TRef} -> {ok, TRef} ->
misc:cancel_timer(TRef), misc:cancel_timer(TRef),
maps:remove(LJID, Timers); maps:remove(LJID, Timers);
_ -> Timers _ -> Timers
end. end.
depends(_Host, _Opts) -> depends(_Host, _Opts) ->