From 2a8d5739d37ec2fe823fcfe62489cc50ed421931 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Philipp=20H=C3=B6rist?= <philipp@hoerist.com>
Date: Sun, 9 Dec 2018 00:29:20 +0100
Subject: [PATCH] MUC: Identify subject change correctly

Fixes #9491
---
 gajim/common/connection_handlers_events.py |  9 ---------
 gajim/common/modules/message.py            | 10 +++++++++-
 gajim/groupchat_control.py                 |  4 ++--
 gajim/roster_window.py                     |  4 ++--
 4 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/gajim/common/connection_handlers_events.py b/gajim/common/connection_handlers_events.py
index 99365b0a81..19f7d00430 100644
--- a/gajim/common/connection_handlers_events.py
+++ b/gajim/common/connection_handlers_events.py
@@ -432,15 +432,6 @@ class GcMessageReceivedEvent(nec.NetworkIncomingEvent):
             # message from server
             self.nick = ''
 
-        self.subject = self.stanza.getSubject()
-
-        if self.subject is not None:
-            app.nec.push_incoming_event(
-                nec.NetworkEvent('gc-subject-received',
-                                 nickname=self.msg_obj.resource,
-                                 **vars(self.msg_obj)))
-            return
-
         conditions = self.stanza.getStatusConditions()
         if conditions:
             self.status_code = []
diff --git a/gajim/common/modules/message.py b/gajim/common/modules/message.py
index b9991a911e..cb6e5a9d97 100644
--- a/gajim/common/modules/message.py
+++ b/gajim/common/modules/message.py
@@ -227,7 +227,10 @@ class Message:
 
         subject = event.stanza.getSubject()
         groupchat = event.mtype == 'groupchat'
-        muc_subject = subject and groupchat
+
+        # XEP-0045: only a message that contains a <subject/> but no <body/>
+        # element shall be considered a subject change for MUC purposes.
+        muc_subject = subject and groupchat and not event.msgtxt
 
         # Determine timestamps
         if groupchat:
@@ -284,6 +287,11 @@ class Message:
                     event.session, event.fjid, timestamp)
             return
 
+        if muc_subject:
+            app.nec.push_incoming_event(NetworkEvent('gc-subject-received',
+                                                     **vars(event)))
+            return
+
         if groupchat:
             app.nec.push_incoming_event(GcMessageReceivedEvent(
                 None,
diff --git a/gajim/groupchat_control.py b/gajim/groupchat_control.py
index b671d2c168..0f4a7ac345 100644
--- a/gajim/groupchat_control.py
+++ b/gajim/groupchat_control.py
@@ -1535,7 +1535,7 @@ class GroupchatControl(ChatControlBase):
         self.draw_banner_text()
 
     def _nec_gc_subject_received(self, event):
-        if event.conn.name != self.account:
+        if event.account != self.account:
             return
         if event.jid != self.room_jid:
             return
@@ -1544,7 +1544,7 @@ class GroupchatControl(ChatControlBase):
             return
         self.set_subject(event.subject)
         text = _('%(nick)s has set the subject to %(subject)s') % {
-            'nick': event.nickname, 'subject': event.subject}
+            'nick': event.resource, 'subject': event.subject}
 
         if event.delayed:
             date = time.strftime('%d-%m-%Y %H:%M:%S',
diff --git a/gajim/roster_window.py b/gajim/roster_window.py
index 8746d2f48d..d6aa85c579 100644
--- a/gajim/roster_window.py
+++ b/gajim/roster_window.py
@@ -2700,10 +2700,10 @@ class RosterWindow:
 
     def _nec_gc_subject_received(self, obj):
         contact = app.contacts.get_contact_with_highest_priority(
-            obj.conn.name, obj.jid)
+            obj.account, obj.jid)
         if contact:
             contact.status = obj.subject
-            self.draw_contact(obj.jid, obj.conn.name)
+            self.draw_contact(obj.jid, obj.account)
 
     def _nec_metacontacts_received(self, obj):
         self.redraw_metacontacts(obj.conn.name)
-- 
GitLab