From f30564c15c518930a3485ea5cf0bc04ff51aaf39 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Philipp=20H=C3=B6rist?= <philipp@hoerist.com>
Date: Thu, 22 Feb 2018 21:42:49 +0100
Subject: [PATCH] Dont notify about PMs from MUCs we are not joined

The server sends us carbons if one of our other resources has
a conversation in a muc we are not joined.
Instead we log the messages silently.
---
 gajim/common/connection_handlers_events.py | 7 +++++--
 gajim/session.py                           | 7 ++++++-
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/gajim/common/connection_handlers_events.py b/gajim/common/connection_handlers_events.py
index c29e14b998..ddc8aacacb 100644
--- a/gajim/common/connection_handlers_events.py
+++ b/gajim/common/connection_handlers_events.py
@@ -176,8 +176,10 @@ class HelperEvent:
     def _is_muc_pm(self, message):
         if self.muc_pm is not None:
             return self.muc_pm
-        self.muc_pm = message.getTag(
-            'x', namespace=nbxmpp.NS_MUC_USER) is not None
+        self.muc_pm = False
+        muc_user = message.getTag('x', namespace=nbxmpp.NS_MUC_USER)
+        if muc_user is not None:
+            self.muc_pm = muc_user.getChildren() == []
         return self.muc_pm
 
 class HttpAuthReceivedEvent(nec.NetworkIncomingEvent):
@@ -1599,6 +1601,7 @@ class DecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
         self.forwarded = self.msg_obj.forwarded
         self.sent = self.msg_obj.sent
         self.conn = self.msg_obj.conn
+        self.muc_pm = self.msg_obj.muc_pm
         self.popup = False
         self.msg_log_id = None # id in log database
         self.attention = False # XEP-0224
diff --git a/gajim/session.py b/gajim/session.py
index 8b6eef9d45..35d9bfa546 100644
--- a/gajim/session.py
+++ b/gajim/session.py
@@ -101,7 +101,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
         if treat_as:
             obj.mtype = treat_as
         pm = False
-        if obj.gc_control and obj.resource:
+        if obj.muc_pm or (obj.gc_control and obj.resource):
             # It's a Private message
             pm = True
             obj.mtype = 'pm'
@@ -123,6 +123,11 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
                 additional_data=obj.additional_data,
                 stanza_id=obj.unique_id)
 
+        if obj.muc_pm and not obj.gc_control:
+            # This is a carbon of a PM from a MUC we are not currently
+            # joined. We log it silently without notification.
+            return True
+
         # Handle chat states
         if contact and (not obj.forwarded or not obj.sent):
             if self.control and self.control.type_id == \
-- 
GitLab