]> granicus.if.org Git - ejabberd/commitdiff
Change logic for archiving mucsub messages
authorPaweł Chmielowski <pchmielowski@process-one.net>
Wed, 10 Oct 2018 16:02:45 +0000 (18:02 +0200)
committerPaweł Chmielowski <pchmielowski@process-one.net>
Wed, 10 Oct 2018 16:12:35 +0000 (18:12 +0200)
This change should apply usual logic for message wrapped in mucsub except
check for groupchat message, so messages without bodies for example
should be rejected

src/mod_mam.erl
src/mod_muc_room.erl

index 4581a6daac03f2de39ab0dd2169993ecfb251f45..ca2cbeb02c043583c5d3c5609799b973427a39a2 100644 (file)
@@ -648,9 +648,20 @@ should_archive(#message{body = Body, subject = Subject,
                none when Type == headline ->
                    false;
                none ->
-                   xmpp:get_text(Body) /= <<>> orelse
-                   xmpp:get_text(Subject) /= <<>> orelse
-                   xmpp:has_subtag(Pkt, #ps_event{})
+                   case xmpp:get_text(Body) /= <<>> orelse
+                        xmpp:get_text(Subject) /= <<>> of
+                       true ->
+                           true;
+                       _ ->
+                           case mod_muc_room:unwrap_mucsub_message(Pkt) of
+                               #message{type = groupchat} = Msg ->
+                                   should_archive(Msg#message{type = chat}, LServer);
+                               #message{} = Msg ->
+                                   should_archive(Msg, LServer);
+                               _ ->
+                                   false
+                           end
+                   end
            end
     end;
 should_archive(_, _LServer) ->
index ede3c8ebb8b22b493362da3997de80a8fb6f522e..a7089bc1029208d4886a4623fd0929551654fe1d 100644 (file)
@@ -39,7 +39,8 @@
         is_occupant_or_admin/2,
         route/2,
         expand_opts/1,
-        config_fields/0]).
+        config_fields/0,
+        unwrap_mucsub_message/1]).
 
 %% gen_fsm callbacks
 -export([init/1,
@@ -4459,6 +4460,24 @@ wrap(From, To, Packet, Node) ->
                                            id = p1_rand:get_string(),
                                            sub_els = [El]}]}}]}.
 
+-spec unwrap_mucsub_message(xmpp_element()) -> message() | false.
+unwrap_mucsub_message(#message{} = Packet) ->
+    case xmpp:get_subtag(Packet, #ps_event{}) of
+       #ps_event{
+           items = #ps_items{
+               node = Node,
+               items = [
+                   #ps_item{
+                       sub_els = [#message{} = Message]} | _]}}
+           when Node == ?NS_MUCSUB_NODES_MESSAGES;
+                Node == ?NS_MUCSUB_NODES_SUBJECT ->
+           Message;
+       _ ->
+           false
+    end;
+unwrap_mucsub_message(_Packet) ->
+    false.
+
 %% -spec send_multiple(jid(), binary(), [#user{}], stanza()) -> ok.
 %% send_multiple(From, Server, Users, Packet) ->
 %%     JIDs = [ User#user.jid || {_, User} <- ?DICT:to_list(Users)],