changeset 116fd297511f in /home/hg/repos/gajim-plugins
author: lovetox forenjunkie@chello.at branches: details:gajim-plugins?cmd=changeset;node=116fd297511f description: Query the devicelist after BundleAnnouncement
The Devicelist ist queried after the BundleAnnouncement and afterwards handled with handle_devicelist_result()
diffstat:
omemo/__init__.py | 67 +++++++++++++++++++++++++++++++++++++++++------------- omemo/xmpp.py | 23 +++++++++++++---- 2 files changed, 67 insertions(+), 23 deletions(-)
diffs (153 lines):
diff -r aae1de9a8e68 -r 116fd297511f omemo/__init__.py --- a/omemo/__init__.py Sun May 29 11:45:46 2016 +0200 +++ b/omemo/__init__.py Mon Jun 06 02:33:41 2016 +0200 @@ -33,7 +33,7 @@ from .ui import Ui from .xmpp import ( NS_NOTIFY, NS_OMEMO, BundleInformationAnnouncement, BundleInformationQuery, - DeviceListAnnouncement, DevicelistPEP, OmemoMessage, successful, + DeviceListAnnouncement, DevicelistQuery, DevicelistPEP, OmemoMessage, successful, unpack_device_bundle, unpack_device_list_update, unpack_encrypted)
@@ -191,7 +191,7 @@ if event.pep_type != 'headline': return False
- devices_list = unpack_device_list_update(event) + devices_list = unpack_device_list_update(event.stanza, event.conn.name) if len(devices_list) == 0: return False account_name = event.conn.name @@ -407,14 +407,14 @@ id_ = str(iq.getAttr("id")) log.debug(account + " → Announcing OMEMO support via PEP") iq_ids_to_callbacks[id_] = lambda stanza: \ - self.handle_announcement_result(account, stanza, state) + self.handle_announcement_result(account, stanza)
@log_calls('OmemoPlugin') - def handle_announcement_result(self, account, stanza, state): - """ Updates own device list if announcement was successfull. + def handle_announcement_result(self, account, stanza): + """ Query own device list if announcement was successfull.
- If the OMEMO support announcement was successfull update own device - list if needed. + If the OMEMO support announcement was successfull own device + list is queried.
Parameters ---------- @@ -422,20 +422,53 @@ the account name stanza The stanza object received from callback - state : (OmemoState) - The OmemoState used + """ + my_jid = gajim.get_jid_from_account(account) + iq = DevicelistQuery(my_jid) + if successful(stanza): + log.debug(account + ' → Publishing bundle was successful') + gajim.connections[account].connection.send(iq) + log.debug(account + ' → Querry own Devicelist') + id_ = str(iq.getAttr("id")) + iq_ids_to_callbacks[id_] = lambda stanza: \ + self.handle_devicelist_result(account, stanza) + else: + log.error(account + ' → Publishing bundle was NOT successful') + + @log_calls('OmemoPlugin') + def handle_devicelist_result(self, account, stanza): + """ If query was successful add own device to the list. + + Parameters + ---------- + account : str + the account name + stanza + The stanza object received from callback """
- state = self.get_omemo_state(account) if successful(stanza): - log.debug(account + ' → Publishing bundle was successful') - if not state.own_device_id_published(): - log.warn(account + ' → Device list needs updating') - self.publish_own_devices_list(account, state) - else: - log.debug(account + ' → Device list up to date') + log.debug(account + ' → Devicelistquery was successful') + devices_list = unpack_device_list_update(stanza, account) + if len(devices_list) == 0: + return False + + my_jid = gajim.get_jid_from_account(account) + state = self.get_omemo_state(account) + contact_jid = stanza.getAttr('from') + if contact_jid == my_jid: + state.set_own_devices(devices_list) + if not state.own_device_id_published() or anydup( + state.own_devices): + # Our own device_id is not in the list, it could be + # overwritten by some other client? + # also remove duplicates + devices_list = list(set(state.own_devices)) + devices_list.append(state.own_device_id) + self.publish_own_devices_list(account, state) else: - log.error(account + ' → Publishing bundle was NOT successful') + log.error(account + ' → Devicelistquery was NOT successful') + self.publish_own_devices_list(account, state)
@log_calls('OmemoPlugin') def clear_device_list(self, contact): diff -r aae1de9a8e68 -r 116fd297511f omemo/xmpp.py --- a/omemo/xmpp.py Sun May 29 11:45:46 2016 +0200 +++ b/omemo/xmpp.py Mon Jun 06 02:33:41 2016 +0200 @@ -128,6 +128,16 @@ return result
+class DevicelistQuery(Iq): + def __init__(self, contact_jid,): + id_ = gajim.get_an_id() + attrs = {'id': id_} + Iq.__init__(self, typ='get', attrs=attrs, to=contact_jid) + items = Node('items', attrs={'node': NS_DEVICE_LIST}) + pubsub = PubsubNode(items) + self.addChild(node=pubsub) + + class DevicelistPEP(AbstractPEP): type_ = 'headline' namespace = NS_DEVICE_LIST @@ -270,20 +280,21 @@ return result
-def unpack_device_list_update(event): - """ Unpacks the device list update received in a MessageReceivedEvent. +def unpack_device_list_update(stanza, account): + """ Unpacks the device list from a stanza
Parameters ---------- - event : MessageReceivedEvent - The event received from gajim + stanza + Returns ------- [int] List of device ids or empty list if nothing found """ - event_node = event.stanza.getTag('event', namespace=NS_PUBSUB_EVENT) - account = event.conn.name + event_node = stanza.getTag('event', namespace=NS_PUBSUB_EVENT) + if not event_node: + event_node = stanza.getTag('pubsub', namespace=NS_PUBSUB) result = []
if not event_node: