mod_mam: Use <stanza-id/> tags for deduplication
Use <stanza-id/> elements instead of <delay/> tags to check for messages resent by the stream management code. The <stanza-id/> element is preferable, as it is added by mod_mam itself.
This commit is contained in:
parent
48deb47021
commit
4cdb30d59e
|
@ -166,7 +166,7 @@ user_receive_packet(Pkt, C2SState, JID, Peer, To) ->
|
||||||
LUser = JID#jid.luser,
|
LUser = JID#jid.luser,
|
||||||
LServer = JID#jid.lserver,
|
LServer = JID#jid.lserver,
|
||||||
IsBareCopy = is_bare_copy(JID, To),
|
IsBareCopy = is_bare_copy(JID, To),
|
||||||
case should_archive(Pkt) of
|
case should_archive(Pkt, LServer) of
|
||||||
true when not IsBareCopy ->
|
true when not IsBareCopy ->
|
||||||
NewPkt = strip_my_archived_tag(Pkt, LServer),
|
NewPkt = strip_my_archived_tag(Pkt, LServer),
|
||||||
case store_msg(C2SState, NewPkt, LUser, LServer, Peer, recv) of
|
case store_msg(C2SState, NewPkt, LUser, LServer, Peer, recv) of
|
||||||
|
@ -191,7 +191,7 @@ user_receive_packet(Pkt, C2SState, JID, Peer, To) ->
|
||||||
user_send_packet(Pkt, C2SState, JID, Peer) ->
|
user_send_packet(Pkt, C2SState, JID, Peer) ->
|
||||||
LUser = JID#jid.luser,
|
LUser = JID#jid.luser,
|
||||||
LServer = JID#jid.lserver,
|
LServer = JID#jid.lserver,
|
||||||
case should_archive(Pkt) of
|
case should_archive(Pkt, LServer) of
|
||||||
true ->
|
true ->
|
||||||
NewPkt = strip_my_archived_tag(Pkt, LServer),
|
NewPkt = strip_my_archived_tag(Pkt, LServer),
|
||||||
store_msg(C2SState, jlib:replace_from_to(JID, Peer, NewPkt),
|
store_msg(C2SState, jlib:replace_from_to(JID, Peer, NewPkt),
|
||||||
|
@ -385,14 +385,14 @@ process_iq(LServer, From, To, IQ, SubEl, Fs, MsgType) ->
|
||||||
With, RSM, IQ, MsgType)
|
With, RSM, IQ, MsgType)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
should_archive(#xmlel{name = <<"message">>} = Pkt) ->
|
should_archive(#xmlel{name = <<"message">>} = Pkt, LServer) ->
|
||||||
case xml:get_attr_s(<<"type">>, Pkt#xmlel.attrs) of
|
case xml:get_attr_s(<<"type">>, Pkt#xmlel.attrs) of
|
||||||
<<"error">> ->
|
<<"error">> ->
|
||||||
false;
|
false;
|
||||||
<<"groupchat">> ->
|
<<"groupchat">> ->
|
||||||
false;
|
false;
|
||||||
_ ->
|
_ ->
|
||||||
case is_resent(Pkt) of
|
case is_resent(Pkt, LServer) of
|
||||||
true ->
|
true ->
|
||||||
false;
|
false;
|
||||||
false ->
|
false ->
|
||||||
|
@ -412,7 +412,7 @@ should_archive(#xmlel{name = <<"message">>} = Pkt) ->
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
should_archive(#xmlel{}) ->
|
should_archive(#xmlel{}, _LServer) ->
|
||||||
false.
|
false.
|
||||||
|
|
||||||
strip_my_archived_tag(Pkt, LServer) ->
|
strip_my_archived_tag(Pkt, LServer) ->
|
||||||
|
@ -492,12 +492,17 @@ has_no_store_hint(Message) ->
|
||||||
xml:get_subtag_with_xmlns(Message, <<"no-permanent-storage">>, ?NS_HINTS)
|
xml:get_subtag_with_xmlns(Message, <<"no-permanent-storage">>, ?NS_HINTS)
|
||||||
/= false.
|
/= false.
|
||||||
|
|
||||||
is_resent(Pkt) ->
|
is_resent(Pkt, LServer) ->
|
||||||
case xml:get_subtag_cdata(Pkt, <<"delay">>) of
|
case xml:get_subtag_with_xmlns(Pkt, <<"stanza-id">>, ?NS_SID_0) of
|
||||||
<<>> ->
|
#xmlel{attrs = Attrs} ->
|
||||||
false;
|
case xml:get_attr(<<"by">>, Attrs) of
|
||||||
Desc ->
|
{value, LServer} ->
|
||||||
binary:match(Desc, <<"Resent">>) =/= nomatch
|
true;
|
||||||
|
_ ->
|
||||||
|
false
|
||||||
|
end;
|
||||||
|
false ->
|
||||||
|
false
|
||||||
end.
|
end.
|
||||||
|
|
||||||
store_msg(C2SState, Pkt, LUser, LServer, Peer, Dir) ->
|
store_msg(C2SState, Pkt, LUser, LServer, Peer, Dir) ->
|
||||||
|
|
Loading…
Reference in New Issue