diff options
author | Paweł Chmielowski <pchmielowski@process-one.net> | 2020-04-16 14:04:12 +0300 |
---|---|---|
committer | Paweł Chmielowski <pchmielowski@process-one.net> | 2020-04-16 14:04:12 +0300 |
commit | 37226dd41fc2c3584e299cd80d3c4e1f3802450e (patch) | |
tree | 0fdee096e11349a7a717666370004f18416f8ab8 | |
parent | cd0b65f4d5d1af1b0d706d3c307687dce17ca3b2 (diff) |
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.
-rw-r--r-- | src/mod_stream_mgmt.erl | 30 |
1 files 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 |