]> granicus.if.org Git - ejabberd/commitdiff
mod_carboncopy: Don't copy MUC PMs
authorHolger Weiss <holger@zedat.fu-berlin.de>
Mon, 19 Sep 2016 20:46:36 +0000 (22:46 +0200)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Mon, 19 Sep 2016 20:46:36 +0000 (22:46 +0200)
Carbon copies of private MUC message are generally not desired,
especially not when multiple clients joined the room with the same nick.
In this case, the MUC service usually sends PMs to all joined resources
anyway, so carbon-copying those PMs would create duplicates.

src/mod_carboncopy.erl

index de8d8e1a71f588fb0022da9336ac01b473a991e8..e1e6d63a2647384e15b82ddecf4fcc726d53806a 100644 (file)
@@ -131,8 +131,9 @@ user_receive_packet(Packet, _C2SState, JID, _From, To) ->
 %    - we also replicate "read" notifications
 check_and_forward(JID, To, Packet, Direction)->
     case is_chat_message(Packet) andalso
-            fxml:get_subtag(Packet, <<"private">>) == false andalso
-                fxml:get_subtag(Packet, <<"no-copy">>) == false of
+            not is_muc_pm(To, Packet) andalso
+                fxml:get_subtag(Packet, <<"private">>) == false andalso
+                    fxml:get_subtag(Packet, <<"no-copy">>) == false of
        true ->
            case is_carbon_copy(Packet) of
                false ->
@@ -270,6 +271,11 @@ is_chat_message(#xmlel{name = <<"message">>} = Packet) ->
     end;
 is_chat_message(_Packet) -> false.
 
+is_muc_pm(#jid{lresource = <<>>}, _Packet) ->
+    false;
+is_muc_pm(_To, Packet) ->
+    fxml:get_subtag_with_xmlns(Packet, <<"x">>, ?NS_MUC_USER) =/= false.
+
 has_non_empty_body(Packet) ->
     fxml:get_subtag_cdata(Packet, <<"body">>) =/= <<"">>.