Philipp Hörist pushed to branch gajim_0.16 at gajim / gajim
Commits: 2175aff6 by Philipp Hörist at 2017-01-28T02:03:22+01:00 Dont block contacts only partially
This is needed for better interop with XEP-0191. The Server doesnt deliver a partial blocked contact as blocked to a XEP-0191 Client.
- - - - - a7b8744c by Philipp Hörist at 2017-01-28T02:03:28+01:00 Add blocked contacts always to the default list
- - - - - 1e86f016 by Philipp Hörist at 2017-01-28T02:03:29+01:00 Use push event to query privacy list after edit
- - - - - 0f0c3b7d by Philipp Hörist at 2017-01-28T02:03:29+01:00 Dont try to set empty privacy default list
This will result in a conflict stanza because an active default list cant be deleted
Decline the use of default list first, then delete the list
- - - - - de775106 by Philipp Hörist at 2017-01-28T18:35:46+01:00 Dont set default list active on block
There could be another list active (eg. invisible) If we block someone while invisible, setting the default list active would make us visible again
- - - - - 2595631a by Philipp Hörist at 2017-01-28T18:44:26+01:00 Remove redundant method
- - - - - a02ae05a by Philipp Hörist at 2017-01-28T18:46:17+01:00 Decline active list when going visible
Declining the active list will switch us to the default list
- - - - - e217d2ec by Philipp Hörist at 2017-01-30T00:21:43+01:00 Merge branch 'privacy' into 'gajim_0.16'
Fix Privacy Lists
See merge request !48 - - - - -
3 changed files:
- src/common/connection.py - src/common/connection_handlers.py - src/groupchat_control.py
Changes:
===================================== src/common/connection.py ===================================== --- a/src/common/connection.py +++ b/src/common/connection.py @@ -1719,16 +1719,6 @@ class Connection(CommonConnection, ConnectionHandlers): iq = self.build_invisible_rule() self.connection.send(iq)
- def activate_privacy_rule(self, name): - """ - Activate a privacy rule - """ - if not gajim.account_is_connected(self.name): - return - iq = nbxmpp.Iq('set', nbxmpp.NS_PRIVACY, xmlns='') - iq.setQuery().setTag('active', {'name': name}) - self.connection.send(iq) - def get_max_blocked_list_order(self): max_order = 0 for rule in self.blocked_list: @@ -1738,6 +1728,8 @@ class Connection(CommonConnection, ConnectionHandlers): return max_order
def block_contacts(self, contact_list, message): + if self.privacy_default_list is None: + self.privacy_default_list = 'block' if not self.privacy_rules_supported: if self.blocking_supported: #XEP-0191 iq = nbxmpp.Iq('set', xmlns='') @@ -1750,16 +1742,15 @@ class Connection(CommonConnection, ConnectionHandlers): for contact in contact_list: self.send_custom_status('offline', message, contact.jid) max_order = self.get_max_blocked_list_order() - new_rule = {'order': str(max_order + 1), 'type': 'jid', 'action': 'deny', - 'value' : contact.jid, 'child': ['message', 'iq', - 'presence-out']} + new_rule = {'order': str(max_order + 1), + 'type': 'jid', + 'action': 'deny', + 'value': contact.jid} self.blocked_list.append(new_rule) self.blocked_contacts.append(contact.jid) - self.set_privacy_list('block', self.blocked_list) + self.set_privacy_list(self.privacy_default_list, self.blocked_list) if len(self.blocked_list) == 1: - self.set_active_list('block') - self.set_default_list('block') - self.get_privacy_list('block') + self.set_default_list(self.privacy_default_list)
def unblock_contacts(self, contact_list): if not self.privacy_rules_supported: @@ -1781,15 +1772,14 @@ class Connection(CommonConnection, ConnectionHandlers): if rule['action'] != 'deny' or rule['type'] != 'jid' \ or rule['value'] not in self.to_unblock: self.new_blocked_list.append(rule) - self.set_privacy_list('block', self.new_blocked_list) - self.get_privacy_list('block') if len(self.new_blocked_list) == 0: self.blocked_list = [] self.blocked_contacts = [] self.blocked_groups = [] self.set_default_list('') - self.set_active_list('') - self.del_privacy_list('block') + self.del_privacy_list(self.privacy_default_list) + else: + self.set_privacy_list(self.privacy_default_list, self.new_blocked_list) if not gajim.interface.roster.regroup: show = gajim.SHOW_LIST[self.connected] else: # accounts merged @@ -1806,14 +1796,14 @@ class Connection(CommonConnection, ConnectionHandlers): for contact in contact_list: self.send_custom_status('offline', message, contact.jid) max_order = self.get_max_blocked_list_order() - new_rule = {'order': str(max_order + 1), 'type': 'group', 'action': 'deny', - 'value' : group, 'child': ['message', 'iq', 'presence-out']} + new_rule = {'order': str(max_order + 1), + 'type': 'group', + 'action': 'deny', + 'value': group} self.blocked_list.append(new_rule) - self.set_privacy_list('block', self.blocked_list) + self.set_privacy_list(self.privacy_default_list, self.blocked_list) if len(self.blocked_list) == 1: - self.set_active_list('block') - self.set_default_list('block') - self.get_privacy_list('block') + self.set_default_list(self.privacy_default_list)
def unblock_group(self, group, contact_list): if not self.privacy_rules_supported: @@ -1825,15 +1815,14 @@ class Connection(CommonConnection, ConnectionHandlers): if rule['action'] != 'deny' or rule['type'] != 'group' or \ rule['value'] != group: self.new_blocked_list.append(rule) - self.set_privacy_list('block', self.new_blocked_list) - self.get_privacy_list('block') if len(self.new_blocked_list) == 0: self.blocked_list = [] self.blocked_contacts = [] self.blocked_groups = [] self.set_default_list('') - self.set_active_list('') - self.del_privacy_list('block') + self.del_privacy_list(self.privacy_default_list) + else: + self.set_privacy_list(self.privacy_default_list, self.new_blocked_list) if not gajim.interface.roster.regroup: show = gajim.SHOW_LIST[self.connected] else: # accounts merged @@ -1874,7 +1863,7 @@ class Connection(CommonConnection, ConnectionHandlers): if iq_obj.getType() == 'error': # server doesn't support privacy lists return # active the privacy rule - self.activate_privacy_rule('invisible') + self.set_active_list('invisible') self.connected = gajim.SHOW_LIST.index('invisible') self.status = msg priority = unicode(gajim.get_priority(self.name, 'invisible')) @@ -2106,12 +2095,7 @@ class Connection(CommonConnection, ConnectionHandlers):
def _change_from_invisible(self): if self.privacy_rules_supported: - if self.blocked_list: - self.activate_privacy_rule('block') - else: - iq = self.build_privacy_rule('visible', 'allow') - self.connection.send(iq) - self.activate_privacy_rule('visible') + self.set_active_list('')
def _update_status(self, show, msg): xmpp_show = helpers.get_xmpp_show(show) @@ -2427,9 +2411,10 @@ class Connection(CommonConnection, ConnectionHandlers): self.connection.send(iq)
def _nec_privacy_list_received(self, obj): + roster = gajim.interface.roster if obj.conn.name != self.name: return - if obj.list_name != 'block': + if obj.list_name != self.privacy_default_list: return self.blocked_contacts = [] self.blocked_groups = [] @@ -2456,6 +2441,11 @@ class Connection(CommonConnection, ConnectionHandlers): self.blocked_groups.append(rule['value']) self.blocked_list.append(rule)
+ if rule['type'] == 'jid': + roster.draw_contact(rule['value'], self.name) + if rule['type'] == 'group': + roster.draw_group(rule['value'], self.name) + def _request_bookmarks_xml(self): if not gajim.account_is_connected(self.name): return
===================================== src/common/connection_handlers.py ===================================== --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -590,7 +590,11 @@ class ConnectionVcard: elif self.awaiting_answers[id_][0] == PRIVACY_ARRIVED: del self.awaiting_answers[id_] if iq_obj.getType() != 'error': - self.get_privacy_list('block') + for list_ in iq_obj.getQueryPayload(): + if list_.getName() == 'default': + self.privacy_default_list = list_.getAttr('name') + self.get_privacy_list(self.privacy_default_list) + break # Ask metacontacts before roster self.get_metacontacts() else: @@ -1465,6 +1469,8 @@ ConnectionHandlersBase, ConnectionJingle, ConnectionIBBytestream): self.awaiting_xmpp_ping_id = None self.continue_connect_info = None
+ self.privacy_default_list = None + try: self.sleeper = common.sleepy.Sleepy() HAS_IDLE = True @@ -2076,6 +2082,11 @@ ConnectionHandlersBase, ConnectionJingle, ConnectionIBBytestream): if q: result.delChild(q) self.connection.send(result) + + for list_ in iq_obj.getQueryPayload(): + if list_.getName() == 'list': + self.get_privacy_list(list_.getAttr('name')) + raise nbxmpp.NodeProcessed
def _getRoster(self):
===================================== src/groupchat_control.py ===================================== --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -2863,6 +2863,7 @@ class GroupchatControl(ChatControlBase): def on_block(self, widget, nick): fjid = self.room_jid + '/' + nick connection = gajim.connections[self.account] + default = connection.privacy_default_list if fjid in connection.blocked_contacts: return max_order = connection.get_max_blocked_list_order() @@ -2871,15 +2872,14 @@ class GroupchatControl(ChatControlBase): connection.blocked_list.append(new_rule) connection.blocked_contacts.append(fjid) self.draw_contact(nick) - connection.set_privacy_list('block', connection.blocked_list) + connection.set_privacy_list(default, connection.blocked_list) if len(connection.blocked_list) == 1: - connection.set_active_list('block') - connection.set_default_list('block') - connection.get_privacy_list('block') + connection.set_default_list(default)
def on_unblock(self, widget, nick): fjid = self.room_jid + '/' + nick connection = gajim.connections[self.account] + default = connection.privacy_default_list connection.new_blocked_list = [] # needed for draw_contact: if fjid in connection.blocked_contacts: @@ -2890,18 +2890,17 @@ class GroupchatControl(ChatControlBase): or rule['value'] != fjid: connection.new_blocked_list.append(rule)
- connection.set_privacy_list('block', connection.new_blocked_list) - connection.get_privacy_list('block') if len(connection.new_blocked_list) == 0: connection.blocked_list = [] connection.blocked_contacts = [] connection.blocked_groups = [] connection.set_default_list('') - connection.set_active_list('') - connection.del_privacy_list('block') + connection.del_privacy_list(default) if 'privay_list_block' in gajim.interface.instances[self.account]: del gajim.interface.instances[self.account]\ ['privay_list_block'] + else: + connection.set_privacy_list(default, connection.new_blocked_list)
def on_voice_checkmenuitem_activate(self, widget, nick): if widget.get_active():
View it on GitLab: https://dev.gajim.org/gajim/gajim/compare/6429ba2601752895e4543918eca9eafefd...