implement XEP-0191 for servers that don't support privacy lists

This commit is contained in:
Yann Leboulanger 2013-03-30 23:13:48 +01:00
parent 0e480f3501
commit d77524b6a7
2 changed files with 42 additions and 3 deletions

View File

@ -159,6 +159,7 @@ class CommonConnection:
self.archiving_supported = False
self.archive_pref_supported = False
self.roster_supported = True
self.blocking_supported = False
self.muc_jid = {} # jid of muc server for each transport type
self._stun_servers = [] # STUN servers of our jabber server
@ -1576,11 +1577,20 @@ class Connection(CommonConnection, ConnectionHandlers):
def block_contacts(self, contact_list, message):
if not self.privacy_rules_supported:
if self.blocking_supported: #XEP-0191
iq = nbxmpp.Iq('set', xmlns='')
query = iq.setQuery(name='block')
query.setNamespace(nbxmpp.NS_BLOCKING)
for contact in contact_list:
self.blocked_contacts.append(contact.jid)
query.addChild(name='item', attrs={'jid': contact.jid})
self.connection.send(iq)
return
for contact in contact_list:
self.send_custom_status('offline', message, contact.jid)
new_rule = {'order': '1', 'type': 'jid', 'action': 'deny',
'value' : contact.jid, 'child': ['message', 'iq', 'presence-out']}
'value' : contact.jid, 'child': ['message', 'iq',
'presence-out']}
self.blocked_list.append(new_rule)
self.blocked_contacts.append(contact.jid)
self.set_privacy_list('block', self.blocked_list)
@ -1591,6 +1601,14 @@ class Connection(CommonConnection, ConnectionHandlers):
def unblock_contacts(self, contact_list):
if not self.privacy_rules_supported:
if self.blocking_supported: #XEP-0191
iq = nbxmpp.Iq('set', xmlns='')
query = iq.setQuery(name='unblock')
query.setNamespace(nbxmpp.NS_BLOCKING)
for contact in contact_list:
self.blocked_contacts.append(contact.jid)
query.addChild(name='item', attrs={'jid': contact.jid})
self.connection.send(iq)
return
self.new_blocked_list = []
self.to_unblock = []
@ -1831,6 +1849,8 @@ class Connection(CommonConnection, ConnectionHandlers):
self.archive_manual_supported = True
if nbxmpp.NS_ARCHIVE_PREF in obj.features:
self.archive_pref_supported = True
if nbxmpp.NS_BLOCKING in obj.features:
self.blocking_supported = True
if nbxmpp.NS_CARBONS in obj.features and gajim.config.get_per(
'accounts', self.name, 'enable_message_carbons'):
# Server supports carbons, activate it

View File

@ -80,6 +80,7 @@ METACONTACTS_ARRIVED = 'metacontacts_arrived'
ROSTER_ARRIVED = 'roster_arrived'
DELIMITER_ARRIVED = 'delimiter_arrived'
PRIVACY_ARRIVED = 'privacy_arrived'
BLOCKING_ARRIVED = 'blocking_arrived'
PEP_CONFIG = 'pep_config'
HAS_IDLE = True
try:
@ -562,8 +563,18 @@ class ConnectionVcard:
if iq_obj.getType() != 'error':
self.privacy_rules_supported = True
self.get_privacy_list('block')
elif self.continue_connect_info:
if self.continue_connect_info[0] == 'invisible':
else:
if self.blocking_supported:
iq = nbxmpp.Iq('get', xmlns='')
query = iq.setQuery(name='blocklist')
query.setNamespace(nbxmpp.NS_BLOCKING)
id_ = self.connection.getAnID()
iq.setID(id_)
self.awaiting_answers[id_] = (BLOCKING_ARRIVED, )
self.connection.send(iq)
if self.continue_connect_info and self.continue_connect_info[0]\
== 'invisible':
# Trying to login as invisible but privacy list not
# supported
self.disconnect(on_purpose=True)
@ -576,6 +587,14 @@ class ConnectionVcard:
return
# Ask metacontacts before roster
self.get_metacontacts()
elif self.awaiting_answers[id_][0] == BLOCKING_ARRIVED:
if iq_obj.getType() == 'result':
list_node = iq_obj.getTag('blocklist')
if not list_node:
return
self.blocked_contacts = []
for i in list_node.iterTags('item'):
self.blocked_contacts.append(i.getAttr('jid'))
elif self.awaiting_answers[id_][0] == PEP_CONFIG:
if iq_obj.getType() == 'error':
return