aboutsummaryrefslogtreecommitdiff
path: root/src/mod_ping.erl
diff options
context:
space:
mode:
authorJérôme Sautret <jerome@sautret.org>2022-04-26 18:56:38 +0200
committerJérôme Sautret <jerome@sautret.org>2022-04-26 18:56:38 +0200
commitf4959c8b281211e622aae118aa30f63262a2a51b (patch)
tree7ec734e24694431ecf9bc88c0b8eea9e88b71a90 /src/mod_ping.erl
parentCopy include/ files for ejabberd, deps and otp, as "mix release" lacks that (diff)
Don't send ping if resource is gone
Diffstat (limited to 'src/mod_ping.erl')
-rw-r--r--src/mod_ping.erl66
1 files changed, 37 insertions, 29 deletions
diff --git a/src/mod_ping.erl b/src/mod_ping.erl
index 28f7a57b0..da6733617 100644
--- a/src/mod_ping.erl
+++ b/src/mod_ping.erl
@@ -138,29 +138,37 @@ handle_info({iq_reply, timeout, JID}, State) ->
ejabberd_hooks:run(user_ping_timeout, State#state.host,
[JID]),
Timers = case State#state.timeout_action of
- kill ->
- #jid{user = User, server = Server,
- resource = Resource} =
- JID,
- case ejabberd_sm:get_session_pid(User, Server, Resource)
- of
- Pid when is_pid(Pid) -> ejabberd_c2s:close(Pid, ping_timeout);
- _ -> ok
- end,
- del_timer(JID, State#state.timers);
- _ ->
- State#state.timers
- end,
+ kill ->
+ #jid{user = User, server = Server,
+ resource = Resource} =
+ JID,
+ case ejabberd_sm:get_session_pid(User, Server, Resource) of
+ Pid when is_pid(Pid) ->
+ ejabberd_c2s:close(Pid, ping_timeout);
+ _ ->
+ ok
+ end,
+ del_timer(JID, State#state.timers);
+ _ ->
+ State#state.timers
+ end,
{noreply, State#state{timers = Timers}};
handle_info({timeout, _TRef, {ping, JID}}, State) ->
- Host = State#state.host,
- 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),
- Timers = add_timer(JID, State#state.ping_interval,
- State#state.timers),
+ Timers = case ejabberd_sm:get_session_pid(JID#jid.luser,
+ JID#jid.lserver,
+ JID#jid.lresource) of
+ none ->
+ del_timer(JID, State#state.timers);
+ _ ->
+ Host = State#state.host,
+ 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}};
handle_info(Info, State) ->
?WARNING_MSG("Unexpected info: ~p", [Info]),
@@ -243,10 +251,10 @@ unregister_iq_handlers(Host) ->
add_timer(JID, Interval, Timers) ->
LJID = jid:tolower(JID),
NewTimers = case maps:find(LJID, Timers) of
- {ok, OldTRef} ->
- misc:cancel_timer(OldTRef),
- maps:remove(LJID, Timers);
- _ -> Timers
+ {ok, OldTRef} ->
+ misc:cancel_timer(OldTRef),
+ maps:remove(LJID, Timers);
+ _ -> Timers
end,
TRef = erlang:start_timer(Interval, self(), {ping, JID}),
maps:put(LJID, TRef, NewTimers).
@@ -255,10 +263,10 @@ add_timer(JID, Interval, Timers) ->
del_timer(JID, Timers) ->
LJID = jid:tolower(JID),
case maps:find(LJID, Timers) of
- {ok, TRef} ->
- misc:cancel_timer(TRef),
- maps:remove(LJID, Timers);
- _ -> Timers
+ {ok, TRef} ->
+ misc:cancel_timer(TRef),
+ maps:remove(LJID, Timers);
+ _ -> Timers
end.
depends(_Host, _Opts) ->