]> granicus.if.org Git - ejabberd/commitdiff
mod_mam: Honor Message Processing Hints (XEP-0334)
authorHolger Weiss <holger@zedat.fu-berlin.de>
Mon, 7 Dec 2015 23:10:00 +0000 (00:10 +0100)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Mon, 7 Dec 2015 23:10:00 +0000 (00:10 +0100)
src/mod_mam.erl

index c0756b6ebec9d42d8f37c94621f43fa0268a8eed..1481c48d2df441a0701ea8ccd8e082ee03868add 100644 (file)
@@ -361,17 +361,26 @@ process_iq(LServer, From, To, IQ, SubEl, Fs, MsgType) ->
     end.
 
 should_archive(#xmlel{name = <<"message">>} = Pkt) ->
-    case {xml:get_attr_s(<<"type">>, Pkt#xmlel.attrs),
-         xml:get_subtag_cdata(Pkt, <<"body">>)} of
-       {<<"error">>, _} ->
-           false;
-       {<<"groupchat">>, _} ->
+    case xml:get_attr_s(<<"type">>, Pkt#xmlel.attrs) of
+       <<"error">> ->
            false;
-       {_, <<>>} ->
-           %% Empty body
+       <<"groupchat">> ->
            false;
        _ ->
-           true
+           case check_store_hint(Pkt) of
+               store ->
+                   true;
+               no_store ->
+                   false;
+               none ->
+                   case xml:get_subtag_cdata(Pkt, <<"body">>) of
+                       <<>> ->
+                           %% Empty body
+                           false;
+                       _ ->
+                           true
+                   end
+           end
     end;
 should_archive(#xmlel{}) ->
     false.
@@ -426,6 +435,33 @@ should_archive_muc(_MUCState, _Peer) ->
     %% TODO
     true.
 
+check_store_hint(Pkt) ->
+    case has_store_hint(Pkt) of
+       true ->
+           store;
+       false ->
+           case has_no_store_hint(Pkt) of
+               true ->
+                   no_store;
+               false ->
+                   none
+           end
+    end.
+
+has_store_hint(Message) ->
+    xml:get_subtag_with_xmlns(Message, <<"store">>, ?NS_HINTS)
+      /= false.
+
+has_no_store_hint(Message) ->
+    xml:get_subtag_with_xmlns(Message, <<"no-store">>, ?NS_HINTS)
+      /= false orelse
+    xml:get_subtag_with_xmlns(Message, <<"no-storage">>, ?NS_HINTS)
+      /= false orelse
+    xml:get_subtag_with_xmlns(Message, <<"no-permanent-store">>, ?NS_HINTS)
+      /= false orelse
+    xml:get_subtag_with_xmlns(Message, <<"no-permanent-storage">>, ?NS_HINTS)
+      /= false.
+
 store_msg(C2SState, Pkt, LUser, LServer, Peer, Dir) ->
     Prefs = get_prefs(LUser, LServer),
     case should_archive_peer(C2SState, Prefs, Peer) of