]> granicus.if.org Git - ejabberd/commitdiff
mod_mam: Use <stanza-id/> tags for deduplication
authorHolger Weiss <holger@zedat.fu-berlin.de>
Tue, 29 Dec 2015 08:54:48 +0000 (09:54 +0100)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Tue, 29 Dec 2015 08:54:48 +0000 (09:54 +0100)
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.

src/mod_mam.erl

index 7124e2c6d13edc4025e3c5af7e53a7873224b415..6dfff6058165e4c0351d98d73b9be5a6929d3ad2 100644 (file)
@@ -166,7 +166,7 @@ user_receive_packet(Pkt, C2SState, JID, Peer, To) ->
     LUser = JID#jid.luser,
     LServer = JID#jid.lserver,
     IsBareCopy = is_bare_copy(JID, To),
-    case should_archive(Pkt) of
+    case should_archive(Pkt, LServer) of
        true when not IsBareCopy ->
            NewPkt = strip_my_archived_tag(Pkt, LServer),
            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) ->
     LUser = JID#jid.luser,
     LServer = JID#jid.lserver,
-    case should_archive(Pkt) of
+    case should_archive(Pkt, LServer) of
        true ->
            NewPkt = strip_my_archived_tag(Pkt, LServer),
            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)
     end.
 
-should_archive(#xmlel{name = <<"message">>} = Pkt) ->
+should_archive(#xmlel{name = <<"message">>} = Pkt, LServer) ->
     case xml:get_attr_s(<<"type">>, Pkt#xmlel.attrs) of
        <<"error">> ->
            false;
        <<"groupchat">> ->
            false;
        _ ->
-           case is_resent(Pkt) of
+           case is_resent(Pkt, LServer) of
                true ->
                    false;
                false ->
@@ -412,7 +412,7 @@ should_archive(#xmlel{name = <<"message">>} = Pkt) ->
                    end
            end
     end;
-should_archive(#xmlel{}) ->
+should_archive(#xmlel{}, _LServer) ->
     false.
 
 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)
       /= false.
 
-is_resent(Pkt) ->
-    case xml:get_subtag_cdata(Pkt, <<"delay">>) of
-       <<>> ->
-           false;
-       Desc ->
-           binary:match(Desc, <<"Resent">>) =/= nomatch
+is_resent(Pkt, LServer) ->
+    case xml:get_subtag_with_xmlns(Pkt, <<"stanza-id">>, ?NS_SID_0) of
+       #xmlel{attrs = Attrs} ->
+           case xml:get_attr(<<"by">>, Attrs) of
+               {value, LServer} ->
+                   true;
+               _ ->
+                   false
+           end;
+       false ->
+           false
     end.
 
 store_msg(C2SState, Pkt, LUser, LServer, Peer, Dir) ->