handle XEP-191 (blocking command) in a better way: hability to block a contact when server doesn't support privacy lists, add / remove jid to blocked list only when we get the result from server, handle blocked / unblocked contacts by other resources
This commit is contained in:
parent
fae34e8be4
commit
a084cad22a
|
@ -1706,7 +1706,6 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
query = iq.setQuery(name='block')
|
query = iq.setQuery(name='block')
|
||||||
query.setNamespace(nbxmpp.NS_BLOCKING)
|
query.setNamespace(nbxmpp.NS_BLOCKING)
|
||||||
for contact in contact_list:
|
for contact in contact_list:
|
||||||
self.blocked_contacts.append(contact.jid)
|
|
||||||
query.addChild(name='item', attrs={'jid': contact.jid})
|
query.addChild(name='item', attrs={'jid': contact.jid})
|
||||||
self.connection.send(iq)
|
self.connection.send(iq)
|
||||||
return
|
return
|
||||||
|
@ -1731,7 +1730,6 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
query = iq.setQuery(name='unblock')
|
query = iq.setQuery(name='unblock')
|
||||||
query.setNamespace(nbxmpp.NS_BLOCKING)
|
query.setNamespace(nbxmpp.NS_BLOCKING)
|
||||||
for contact in contact_list:
|
for contact in contact_list:
|
||||||
self.blocked_contacts.append(contact.jid)
|
|
||||||
query.addChild(name='item', attrs={'jid': contact.jid})
|
query.addChild(name='item', attrs={'jid': contact.jid})
|
||||||
self.connection.send(iq)
|
self.connection.send(iq)
|
||||||
return
|
return
|
||||||
|
|
|
@ -574,9 +574,9 @@ class ConnectionVcard:
|
||||||
iq = nbxmpp.Iq('get', xmlns='')
|
iq = nbxmpp.Iq('get', xmlns='')
|
||||||
query = iq.setQuery(name='blocklist')
|
query = iq.setQuery(name='blocklist')
|
||||||
query.setNamespace(nbxmpp.NS_BLOCKING)
|
query.setNamespace(nbxmpp.NS_BLOCKING)
|
||||||
id_ = self.connection.getAnID()
|
id2_ = self.connection.getAnID()
|
||||||
iq.setID(id_)
|
iq.setID(id2_)
|
||||||
self.awaiting_answers[id_] = (BLOCKING_ARRIVED, )
|
self.awaiting_answers[id2_] = (BLOCKING_ARRIVED, )
|
||||||
self.connection.send(iq)
|
self.connection.send(iq)
|
||||||
|
|
||||||
if self.continue_connect_info and self.continue_connect_info[0]\
|
if self.continue_connect_info and self.continue_connect_info[0]\
|
||||||
|
@ -1521,6 +1521,8 @@ ConnectionJingle, ConnectionIBBytestream):
|
||||||
self._nec_agent_removed)
|
self._nec_agent_removed)
|
||||||
gajim.ged.register_event_handler('stream-other-host-received', ged.CORE,
|
gajim.ged.register_event_handler('stream-other-host-received', ged.CORE,
|
||||||
self._nec_stream_other_host_received)
|
self._nec_stream_other_host_received)
|
||||||
|
gajim.ged.register_event_handler('blocking', ged.CORE,
|
||||||
|
self._nec_blocking)
|
||||||
|
|
||||||
def cleanup(self):
|
def cleanup(self):
|
||||||
ConnectionHandlersBase.cleanup(self)
|
ConnectionHandlersBase.cleanup(self)
|
||||||
|
@ -1565,6 +1567,7 @@ ConnectionJingle, ConnectionIBBytestream):
|
||||||
self._nec_agent_removed)
|
self._nec_agent_removed)
|
||||||
gajim.ged.remove_event_handler('stream-other-host-received', ged.CORE,
|
gajim.ged.remove_event_handler('stream-other-host-received', ged.CORE,
|
||||||
self._nec_stream_other_host_received)
|
self._nec_stream_other_host_received)
|
||||||
|
gajim.ged.remove_event_handler('blocking', ged.CORE, self._nec_blocking)
|
||||||
|
|
||||||
def build_http_auth_answer(self, iq_obj, answer):
|
def build_http_auth_answer(self, iq_obj, answer):
|
||||||
if not self.connection or self.connected < 2:
|
if not self.connection or self.connected < 2:
|
||||||
|
@ -2254,6 +2257,25 @@ ConnectionJingle, ConnectionIBBytestream):
|
||||||
jid_from = helpers.get_full_jid_from_iq(iq_obj)
|
jid_from = helpers.get_full_jid_from_iq(iq_obj)
|
||||||
jingle_xtls.handle_new_cert(con, iq_obj, jid_from)
|
jingle_xtls.handle_new_cert(con, iq_obj, jid_from)
|
||||||
|
|
||||||
|
def _BlockingSetCB(self, con, iq_obj):
|
||||||
|
log.debug('_BlockingSetCB')
|
||||||
|
gajim.nec.push_incoming_event(BlockingEvent(None, conn=self,
|
||||||
|
stanza=iq_obj))
|
||||||
|
raise nbxmpp.NodeProcessed
|
||||||
|
|
||||||
|
def _nec_blocking(self, obj):
|
||||||
|
if obj.conn.name != self.name:
|
||||||
|
return
|
||||||
|
if obj.unblock_all:
|
||||||
|
self.blocked_contacts = []
|
||||||
|
else:
|
||||||
|
for jid in obj.blocked_jids:
|
||||||
|
if jid not in self.blocked_contacts:
|
||||||
|
self.blocked_contacts.append(jid)
|
||||||
|
for jid in obj.unblocked_jids:
|
||||||
|
if jid in self.blocked_contacts:
|
||||||
|
self.blocked_contacts.remove(jid)
|
||||||
|
|
||||||
def _nec_stream_other_host_received(self, obj):
|
def _nec_stream_other_host_received(self, obj):
|
||||||
if obj.conn.name != self.name:
|
if obj.conn.name != self.name:
|
||||||
return
|
return
|
||||||
|
@ -2348,3 +2370,5 @@ ConnectionJingle, ConnectionIBBytestream):
|
||||||
nbxmpp.NS_PUBKEY_PUBKEY)
|
nbxmpp.NS_PUBKEY_PUBKEY)
|
||||||
con.RegisterHandler('iq', self._PubkeyResultCB, 'result',
|
con.RegisterHandler('iq', self._PubkeyResultCB, 'result',
|
||||||
nbxmpp.NS_PUBKEY_PUBKEY)
|
nbxmpp.NS_PUBKEY_PUBKEY)
|
||||||
|
con.RegisterHandler('iq', self._BlockingSetCB, 'set',
|
||||||
|
nbxmpp.NS_BLOCKING)
|
||||||
|
|
|
@ -2552,3 +2552,26 @@ class InformationEvent(nec.NetworkIncomingEvent):
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
self.popup = True
|
self.popup = True
|
||||||
|
|
||||||
|
class BlockingEvent(nec.NetworkIncomingEvent):
|
||||||
|
name = 'blocking'
|
||||||
|
base_network_events = []
|
||||||
|
|
||||||
|
def init(self):
|
||||||
|
self.blocked_jids = []
|
||||||
|
self.unblocked_jids = []
|
||||||
|
self.unblock_all = False
|
||||||
|
|
||||||
|
def generate(self):
|
||||||
|
block_tag = self.stanza.getTag('block', namespace=nbxmpp.NS_BLOCKING)
|
||||||
|
if block_tag:
|
||||||
|
for item in block_tag.getTags('item'):
|
||||||
|
self.blocked_jids.append(item.getAttr('jid'))
|
||||||
|
unblock_tag = self.stanza.getTag('unblock',
|
||||||
|
namespace=nbxmpp.NS_BLOCKING)
|
||||||
|
if unblock_tag:
|
||||||
|
if not unblock_tag.getTags('item'): # unblock all
|
||||||
|
self.unblock_all = True
|
||||||
|
for item in unblock_tag.getTags('item'):
|
||||||
|
self.unblocked_jids.append(item.getAttr('jid'))
|
||||||
|
return True
|
||||||
|
|
|
@ -3035,6 +3035,14 @@ class RosterWindow:
|
||||||
dialogs.ConfirmationDialog(pritext, sectext,
|
dialogs.ConfirmationDialog(pritext, sectext,
|
||||||
on_response_ok = (remove, list_))
|
on_response_ok = (remove, list_))
|
||||||
|
|
||||||
|
def _nec_blocking(self, obj):
|
||||||
|
if obj.unblock_all:
|
||||||
|
jids = gajim.contacts.get_jid_list(obj.conn.name)
|
||||||
|
self._idle_draw_jids_of_account(jids, obj.conn.name)
|
||||||
|
else:
|
||||||
|
for jid in obj.blocked_jids + obj.unblocked_jids:
|
||||||
|
self.draw_contact(jid, obj.conn.name)
|
||||||
|
|
||||||
def on_block(self, widget, list_, group=None):
|
def on_block(self, widget, list_, group=None):
|
||||||
"""
|
"""
|
||||||
When clicked on the 'block' button in context menu. list_ is a list of
|
When clicked on the 'block' button in context menu. list_ is a list of
|
||||||
|
@ -3044,9 +3052,9 @@ class RosterWindow:
|
||||||
if msg is None:
|
if msg is None:
|
||||||
# user pressed Cancel to change status message dialog
|
# user pressed Cancel to change status message dialog
|
||||||
return
|
return
|
||||||
accounts = []
|
accounts = set(i[1] for i in list_ if (gajim.connections[i[1]].\
|
||||||
accounts = set(i[1] for i in list_ if gajim.connections[i[1]].\
|
privacy_rules_supported or (group is None and gajim.\
|
||||||
privacy_rules_supported)
|
connections[i[1]].blocking_supported)))
|
||||||
if group is None:
|
if group is None:
|
||||||
for acct in accounts:
|
for acct in accounts:
|
||||||
l_ = [i[0] for i in list_ if i[1] == acct]
|
l_ = [i[0] for i in list_ if i[1] == acct]
|
||||||
|
@ -3084,8 +3092,9 @@ class RosterWindow:
|
||||||
"""
|
"""
|
||||||
When clicked on the 'unblock' button in context menu.
|
When clicked on the 'unblock' button in context menu.
|
||||||
"""
|
"""
|
||||||
accounts = set(i[1] for i in list_ if gajim.connections[i[1]].\
|
accounts = set(i[1] for i in list_ if (gajim.connections[i[1]].\
|
||||||
privacy_rules_supported)
|
privacy_rules_supported or (group is None and gajim.\
|
||||||
|
connections[i[1]].blocking_supported)))
|
||||||
if group is None:
|
if group is None:
|
||||||
for acct in accounts:
|
for acct in accounts:
|
||||||
l_ = [i[0] for i in list_ if i[1] == acct]
|
l_ = [i[0] for i in list_ if i[1] == acct]
|
||||||
|
@ -6547,3 +6556,5 @@ class RosterWindow:
|
||||||
self._nec_signed_in)
|
self._nec_signed_in)
|
||||||
gajim.ged.register_event_handler('decrypted-message-received', ged.GUI2,
|
gajim.ged.register_event_handler('decrypted-message-received', ged.GUI2,
|
||||||
self._nec_decrypted_message_received)
|
self._nec_decrypted_message_received)
|
||||||
|
gajim.ged.register_event_handler('blocking', ged.GUI1,
|
||||||
|
self._nec_blocking)
|
||||||
|
|
Loading…
Reference in New Issue