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:
Holger Weiss 2015-12-29 09:54:48 +01:00
parent 48deb47021
commit 4cdb30d59e
1 changed files with 16 additions and 11 deletions

View File

@ -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) ->