From 37226dd41fc2c3584e299cd80d3c4e1f3802450e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Thu, 16 Apr 2020 13:04:12 +0200 Subject: [PATCH] Resending unacked stanzas should send even archived msgs if mod_offline is enabled Messages that are received when no c2s is active will be stored in offline, even when mam archived them, so i don't think we should be doing something different in this case. --- src/mod_stream_mgmt.erl | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/mod_stream_mgmt.erl b/src/mod_stream_mgmt.erl index 0c73eb7f7..45d52ccb0 100644 --- a/src/mod_stream_mgmt.erl +++ b/src/mod_stream_mgmt.erl @@ -605,6 +605,7 @@ route_unacked_stanzas(#{mgmt_state := MgmtState, end, ?DEBUG("Re-routing ~B unacknowledged stanza(s) to ~ts", [p1_queue:len(Queue), jid:encode(JID)]), + ModOfflineEnabled = gen_mod:is_loaded(LServer, mod_offline), p1_queue:foreach( fun({_, _Time, #presence{from = From}}) -> ?DEBUG("Dropping presence stanza from ~ts", [jid:encode(From)]); @@ -621,20 +622,21 @@ route_unacked_stanzas(#{mgmt_state := MgmtState, ?DEBUG("Dropping forwarded message stanza from ~ts", [jid:encode(From)]); ({_, Time, #message{} = Msg}) -> - case ejabberd_hooks:run_fold(message_is_archived, - LServer, false, - [State, Msg]) of - true -> - ?DEBUG("Dropping archived message stanza from ~ts", - [jid:encode(xmpp:get_from(Msg))]); - false when ResendOnTimeout -> - NewEl = add_resent_delay_info(State, Msg, Time), - ejabberd_router:route(NewEl); - false -> - Txt = ?T("User session terminated"), - ejabberd_router:route_error( - Msg, xmpp:err_service_unavailable(Txt, Lang)) - end; + case {ModOfflineEnabled, ResendOnTimeout, + xmpp:get_meta(Msg, mam_archived, false)} of + Val when Val == {true, true, false}; + Val == {true, true, true}; + Val == {false, true, false} -> + NewEl = add_resent_delay_info(State, Msg, Time), + ejabberd_router:route(NewEl); + {_, _, true} -> + ?DEBUG("Dropping archived message stanza from ~s", + [jid:encode(xmpp:get_from(Msg))]); + _ -> + Txt = ?T("User session terminated"), + ejabberd_router:route_error( + Msg, xmpp:err_service_unavailable(Txt, Lang)) + end; ({_, _Time, El}) -> %% Raw element of type 'error' resulting from a validation error %% We cannot pass it to the router, it will generate an error