From: Evgeniy Khramtsov <ekhramtsov@process-one.net>
Date: Tue, 22 Sep 2015 18:15:34 +0000 (+0300)
Subject: Add <stanza-id/> (XEP-0359) to archived messages
X-Git-Tag: 15.09~18
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=89b3471742615cec6dd04745c6551f99a93bdcdf;p=ejabberd

Add <stanza-id/> (XEP-0359) to archived messages
---

diff --git a/include/ns.hrl b/include/ns.hrl
index 0685ae65c..85cf762ef 100644
--- a/include/ns.hrl
+++ b/include/ns.hrl
@@ -144,6 +144,7 @@
 -define(NS_MAM_TMP, <<"urn:xmpp:mam:tmp">>).
 -define(NS_MAM_0, <<"urn:xmpp:mam:0">>).
 -define(NS_MAM_1, <<"urn:xmpp:mam:1">>).
+-define(NS_SID_0, <<"urn:xmpp:sid:0">>).
 -define(NS_PING, <<"urn:xmpp:ping">>).
 -define(NS_CARBONS_2, <<"urn:xmpp:carbons:2">>).
 -define(NS_CARBONS_1, <<"urn:xmpp:carbons:1">>).
diff --git a/src/mod_mam.erl b/src/mod_mam.erl
index cd9dd7e40..3e3e0873d 100644
--- a/src/mod_mam.erl
+++ b/src/mod_mam.erl
@@ -169,7 +169,11 @@ user_receive_packet(Pkt, C2SState, JID, Peer, _To) ->
                                       attrs = [{<<"by">>, LServer},
                                                {<<"xmlns">>, ?NS_MAM_TMP},
                                                {<<"id">>, ID}]},
-                    NewEls = [Archived|NewPkt#xmlel.children],
+		    StanzaID = #xmlel{name = <<"stanza-id">>,
+				      attrs = [{<<"by">>, LServer},
+                                               {<<"xmlns">>, ?NS_SID_0},
+                                               {<<"id">>, ID}]},
+                    NewEls = [Archived, StanzaID|NewPkt#xmlel.children],
                     NewPkt#xmlel{children = NewEls};
                 _ ->
                     NewPkt
@@ -194,9 +198,19 @@ user_send_packet(Pkt, C2SState, JID, Peer) ->
 muc_filter_message(Pkt, #state{config = Config} = MUCState,
 		   RoomJID, From, FromNick) ->
     if Config#config.mam ->
-	    NewPkt = strip_my_archived_tag(Pkt, MUCState#state.server_host),
-	    store_muc(MUCState, NewPkt, RoomJID, From, FromNick),
-	    NewPkt;
+	    By = jlib:jid_to_string(RoomJID),
+	    NewPkt = strip_my_archived_tag(Pkt, By),
+	    case store_muc(MUCState, NewPkt, RoomJID, From, FromNick) of
+		{ok, ID} ->
+		    StanzaID = #xmlel{name = <<"stanza-id">>,
+				      attrs = [{<<"by">>, By},
+                                               {<<"xmlns">>, ?NS_SID_0},
+                                               {<<"id">>, ID}]},
+                    NewEls = [StanzaID|NewPkt#xmlel.children],
+                    NewPkt#xmlel{children = NewEls};
+		_ ->
+		    NewPkt
+	    end;
 	true ->
 	    Pkt
     end.
@@ -345,8 +359,8 @@ should_archive(#xmlel{}) ->
 
 strip_my_archived_tag(Pkt, LServer) ->
     NewEls = lists:filter(
-               fun(#xmlel{name = <<"archived">>,
-                          attrs = Attrs}) ->
+               fun(#xmlel{name = Tag, attrs = Attrs})
+		  when Tag == <<"archived">>; Tag == <<"stanza-id">> ->
                        case catch jlib:nameprep(
                                     xml:get_attr_s(
                                       <<"by">>, Attrs)) of