@@ -78,7 +78,7 @@ class PGPLegacy(BaseModule):
|
|||||||
self._store = KeyStore(self._account, self.own_jid, self._log,
|
self._store = KeyStore(self._account, self.own_jid, self._log,
|
||||||
self._pgp.list_keys)
|
self._pgp.list_keys)
|
||||||
self._always_trust = []
|
self._always_trust = []
|
||||||
self._presence_key_id_store = {}
|
self._presence_fingerprint_store = {}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def pgp_backend(self):
|
def pgp_backend(self):
|
||||||
@@ -101,39 +101,43 @@ class PGPLegacy(BaseModule):
|
|||||||
if key_data is None:
|
if key_data is None:
|
||||||
return False
|
return False
|
||||||
key_id = key_data['key_id']
|
key_id = key_data['key_id']
|
||||||
announced_key_id = self._presence_key_id_store.get(jid)
|
|
||||||
if announced_key_id is None:
|
announced_fingerprint = self._presence_fingerprint_store.get(jid)
|
||||||
|
if announced_fingerprint is None:
|
||||||
return True
|
return True
|
||||||
if announced_key_id == key_id:
|
|
||||||
|
if announced_fingerprint == key_id:
|
||||||
return True
|
return True
|
||||||
raise KeyMismatch(announced_key_id)
|
|
||||||
|
raise KeyMismatch(announced_fingerprint)
|
||||||
|
|
||||||
def _on_presence_received(self, _con, _stanza, properties):
|
def _on_presence_received(self, _con, _stanza, properties):
|
||||||
if properties.signed is None:
|
if properties.signed is None:
|
||||||
return
|
return
|
||||||
jid = properties.jid.getBare()
|
jid = properties.jid.getBare()
|
||||||
|
|
||||||
key_id = self._pgp.verify(properties.status, properties.signed)
|
fingerprint = self._pgp.verify(properties.status, properties.signed)
|
||||||
self._log.info('Presence from %s was signed with key-id: %s',
|
if fingerprint is None:
|
||||||
jid, key_id)
|
self._log.info('Presence from %s was signed but no corresponding '
|
||||||
if key_id is None:
|
'key was found', jid)
|
||||||
return
|
return
|
||||||
|
|
||||||
self._presence_key_id_store[jid] = key_id
|
self._presence_fingerprint_store[jid] = fingerprint
|
||||||
|
self._log.info('Presence from %s was verified successfully, '
|
||||||
|
'fingerprint: %s', jid, fingerprint)
|
||||||
|
|
||||||
key_data = self.get_contact_key_data(jid)
|
key_data = self.get_contact_key_data(jid)
|
||||||
if key_data is not None:
|
if key_data is None:
|
||||||
|
self._log.info('No key assigned for contact: %s', jid)
|
||||||
return
|
return
|
||||||
|
|
||||||
key = self._pgp.get_key(key_id)
|
if key_data['key_id'] != fingerprint:
|
||||||
if not key:
|
self._log.warning('Fingerprint mismatch, '
|
||||||
self._log.info('Key-id %s not found in keyring, cant assign to %s',
|
'Presence was signed with fingerprint: %s, '
|
||||||
key_id, jid)
|
'Assigned key fingerprint: %s',
|
||||||
|
fingerprint, key_data['key_id'])
|
||||||
return
|
return
|
||||||
|
|
||||||
self._log.info('Assign key-id: %s to %s', key_id, jid)
|
|
||||||
self.set_contact_key_data(jid, (key_id, key[0]['uids'][0]))
|
|
||||||
|
|
||||||
def _message_received(self, _con, stanza, properties):
|
def _message_received(self, _con, stanza, properties):
|
||||||
if not properties.is_pgp_legacy or properties.from_muc:
|
if not properties.is_pgp_legacy or properties.from_muc:
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user