]> granicus.if.org Git - ejabberd/commitdiff
Send unique stanza id and archived tag also in the message carbons
authorTobias Kräntzer <info@tobias-kraentzer.de>
Fri, 29 Apr 2016 11:11:08 +0000 (13:11 +0200)
committerTobias Kräntzer <info@tobias-kraentzer.de>
Sun, 15 May 2016 18:13:25 +0000 (20:13 +0200)
- Change order of the hooks in mod_mam for sending and receiving packets. Messages are archived before a carbon copy is send to the other recourcces.
- Add archived tag and unique stanza id to the outgoing packet to have message carbons with the archive information.
- Add additional hook (in mod_mam) to strip the archive tag for outgoing packets after message carbons have been send.

src/mod_mam.erl

index 12b80c45c7ef15d8909ff0b4ae6f4c4b6885e7c8..e3a165ca7b53ca50d613a8a29a6b38e0cca34ec2 100644 (file)
@@ -33,7 +33,7 @@
 %% API
 -export([start/2, stop/1]).
 
--export([user_send_packet/4, user_receive_packet/5,
+-export([user_send_packet/4, user_send_packet_strip_tag/4, user_receive_packet/5,
         process_iq_v0_2/3, process_iq_v0_3/3, disco_sm_features/5,
         remove_user/2, remove_room/3, mod_opt_type/1, muc_process_iq/4,
         muc_filter_message/5, message_is_archived/5, delete_old_messages/2,
@@ -89,9 +89,11 @@ start(Host, Opts) ->
     gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
                                  ?NS_MAM_1, ?MODULE, process_iq_v0_3, IQDisc),
     ejabberd_hooks:add(user_receive_packet, Host, ?MODULE,
-                      user_receive_packet, 500),
+                      user_receive_packet, 88),
     ejabberd_hooks:add(user_send_packet, Host, ?MODULE,
-                      user_send_packet, 500),
+                      user_send_packet, 88),
+    ejabberd_hooks:add(user_send_packet, Host, ?MODULE,
+               user_send_packet_strip_tag, 500),
     ejabberd_hooks:add(muc_filter_message, Host, ?MODULE,
                       muc_filter_message, 50),
     ejabberd_hooks:add(muc_process_iq, Host, ?MODULE,
@@ -128,9 +130,11 @@ init_cache(Opts) ->
 
 stop(Host) ->
     ejabberd_hooks:delete(user_send_packet, Host, ?MODULE,
-                         user_send_packet, 500),
+                         user_send_packet, 88),
     ejabberd_hooks:delete(user_receive_packet, Host, ?MODULE,
-                         user_receive_packet, 500),
+                         user_receive_packet, 88),
+    ejabberd_hooks:delete(user_send_packet, Host, ?MODULE,
+              user_send_packet_strip_tag, 500),
     ejabberd_hooks:delete(muc_filter_message, Host, ?MODULE,
                          muc_filter_message, 50),
     ejabberd_hooks:delete(muc_process_iq, Host, ?MODULE,
@@ -205,13 +209,30 @@ user_send_packet(Pkt, C2SState, JID, Peer) ->
     case should_archive(Pkt, LServer) of
        true ->
            NewPkt = strip_my_archived_tag(Pkt, LServer),
-           store_msg(C2SState, jlib:replace_from_to(JID, Peer, NewPkt),
-                     LUser, LServer, Peer, send),
-           NewPkt;
+           case store_msg(C2SState, jlib:replace_from_to(JID, Peer, NewPkt),
+                     LUser, LServer, Peer, send) of
+              {ok, ID} ->
+                   Archived = #xmlel{name = <<"archived">>,
+                                     attrs = [{<<"by">>, LServer},
+                                              {<<"xmlns">>, ?NS_MAM_TMP},
+                                              {<<"id">>, ID}]},
+                   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
+        end;
        false ->
            Pkt
     end.
 
+user_send_packet_strip_tag(Pkt, _C2SState, JID, _Peer) ->
+    LServer = JID#jid.lserver,
+    strip_my_archived_tag(Pkt, LServer).
+
 muc_filter_message(Pkt, #state{config = Config} = MUCState,
                   RoomJID, From, FromNick) ->
     if Config#config.mam ->