From 5ce0b062ffb804bb81ec4e68bd0f9656a5ce3f3e Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 8 Dec 2015 00:10:00 +0100 Subject: [PATCH] mod_mam: Honor Message Processing Hints (XEP-0334) --- src/mod_mam.erl | 52 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/src/mod_mam.erl b/src/mod_mam.erl index c0756b6eb..1481c48d2 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -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">>, _} -> + case xml:get_attr_s(<<"type">>, Pkt#xmlel.attrs) of + <<"error">> -> false; - {<<"groupchat">>, _} -> - 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