diff --git a/gajim/common/caps_cache.py b/gajim/common/caps_cache.py index 5fdf53490..e96caacca 100644 --- a/gajim/common/caps_cache.py +++ b/gajim/common/caps_cache.py @@ -449,7 +449,8 @@ class MucCapsCache: features.append(child.getAttr('var')) elif child.getName() == 'x': if child.getNamespace() == nbxmpp.NS_DATA: - data.append(nbxmpp.DataForm(node=child)) + from gajim.common import dataforms + data.append(dataforms.ExtendForm(node=child)) if nbxmpp.NS_MUC not in features: # Not a MUC, dont cache info @@ -483,3 +484,16 @@ class MucCapsCache: return nbxmpp.NS_MAM_1 except (KeyError, AttributeError): return + + def is_subject_change_allowed(self, jid, affiliation): + allowed = True + if affiliation in ('owner, admin'): + return allowed + + if jid in self.cache: + for form in self.cache[jid].data: + try: + allowed = form['muc#roominfo_changesubject'].value + except KeyError: + pass + return allowed diff --git a/gajim/common/connection_handlers.py b/gajim/common/connection_handlers.py index f666b3c6a..2cc47d1ab 100644 --- a/gajim/common/connection_handlers.py +++ b/gajim/common/connection_handlers.py @@ -101,8 +101,8 @@ class ConnectionDisco: id_ = self._discover(nbxmpp.NS_DISCO_INFO, jid, node, id_prefix) self.disco_info_ids.append(id_) - def discoverMUC(self, jid, callback): - if muc_caps_cache.is_cached(jid): + def discoverMUC(self, jid, callback, update=False): + if muc_caps_cache.is_cached(jid) and not update: callback() return disco_info = nbxmpp.Iq(typ='get', to=jid, queryNS=nbxmpp.NS_DISCO_INFO) diff --git a/gajim/groupchat_control.py b/gajim/groupchat_control.py index ee6d4eb30..31e61ded9 100644 --- a/gajim/groupchat_control.py +++ b/gajim/groupchat_control.py @@ -603,9 +603,12 @@ class GroupchatControl(ChatControlBase): online and role == 'visitor') # Change Subject - # Get this from Room Disco + subject = False + if contact is not None: + subject = muc_caps_cache.is_subject_change_allowed( + self.room_jid, contact.affiliation) win.lookup_action('change-subject-' + self.control_id).set_enabled( - online) + online and subject) # Change Nick win.lookup_action('change-nick-' + self.control_id).set_enabled( @@ -1521,7 +1524,9 @@ class GroupchatControl(ChatControlBase): changes.append(_('Room now does not show unavailable members')) if '104' in obj.status_code: changes.append(_('A setting not related to privacy has been ' - 'changed')) + 'changed')) + app.connections[self.account].discoverMUC( + self.room_jid, self.update_actions, update=True) if '170' in obj.status_code: # Can be a presence (see chg_contact_status in groupchat_control.py) changes.append(_('Room logging is now enabled'))