[omemo] Save trust of message to database

This commit is contained in:
Philipp Hörist
2019-03-20 12:45:10 +01:00
parent 19e3ab9ba8
commit 7783864f99
6 changed files with 36 additions and 49 deletions

View File

@@ -532,7 +532,7 @@ class LiteAxolotlStore(AxolotlStore):
def getTrustedFingerprints(self, jid):
query = '''SELECT public_key as "public_key [pk]" FROM identities
WHERE recipient_id = ? AND trust = ?'''
result = self._con.execute(query, (jid, Trust.TRUSTED)).fetchall()
result = self._con.execute(query, (jid, Trust.VERIFIED)).fetchall()
return [row.public_key for row in result]
def getNewFingerprints(self, jid):
@@ -560,7 +560,7 @@ class LiteAxolotlStore(AxolotlStore):
return False
identity_key = record.getSessionState().getRemoteIdentityKey()
return self.getTrustForIdentity(
recipient_id, identity_key) == Trust.TRUSTED
recipient_id, identity_key) == Trust.VERIFIED
def isUntrustedIdentity(self, recipient_id, identity_key):
return self.getTrustForIdentity(

View File

@@ -40,6 +40,7 @@ from omemo.backend.devices import DeviceManager
from omemo.backend.devices import NoDevicesFound
from omemo.backend.liteaxolotlstore import LiteAxolotlStore
from omemo.backend.util import get_fingerprint
from omemo.backend.util import Trust
from omemo.backend.util import DEFAULT_PREKEY_AMOUNT
from omemo.backend.util import MIN_PREKEY_AMOUNT
from omemo.backend.util import SPK_CYCLE_TIME
@@ -129,16 +130,12 @@ class OmemoState(DeviceManager):
try:
if prekey:
key, fingerprint = self._process_pre_key_message(
key, fingerprint, trust = self._process_pre_key_message(
jid, omemo_message.sid, encrypted_key)
else:
key, fingerprint = self._process_message(
key, fingerprint, trust = self._process_message(
jid, omemo_message.sid, encrypted_key)
except SenderNotTrusted:
self._log.info('Sender not trusted, ignore message')
raise
except DuplicateMessageException:
self._log.info('Received duplicated message')
raise DuplicateMessage
@@ -153,7 +150,7 @@ class OmemoState(DeviceManager):
result = aes_decrypt(key, omemo_message.iv, omemo_message.payload)
self._log.debug("Decrypted Message => %s", result)
return result, fingerprint
return result, fingerprint, trust
def _get_whisper_message(self, jid, device, key):
cipher = self._get_session_cipher(jid, device)
@@ -253,8 +250,8 @@ class OmemoState(DeviceManager):
'without PreKey => %s' % jid)
identity_key = pre_key_message.getIdentityKey()
if self._storage.isUntrustedIdentity(jid, identity_key):
raise SenderNotTrusted
trust = self._storage.getTrustForIdentity(jid, identity_key)
trust = Trust(trust) if trust is not None else Trust.UNDECIDED
session_cipher = self._get_session_cipher(jid, device)
@@ -266,7 +263,7 @@ class OmemoState(DeviceManager):
self.xmpp_con.set_bundle()
self.add_device(jid, device)
return key, fingerprint
return key, fingerprint, trust
def _process_message(self, jid, device, key):
message = WhisperMessage(serialized=key)
@@ -278,15 +275,15 @@ class OmemoState(DeviceManager):
session_record = self._storage.loadSession(jid, device)
identity_key = session_record.getSessionState().getRemoteIdentityKey()
if self._storage.isUntrustedIdentity(jid, identity_key):
raise SenderNotTrusted
trust = self._storage.getTrustForIdentity(jid, identity_key)
trust = Trust(trust) if trust is not None else Trust.UNDECIDED
fingerprint = get_fingerprint(identity_key)
self._storage.setIdentityLastSeen(jid, identity_key)
self.add_device(jid, device)
return key, fingerprint
return key, fingerprint, trust
def _check_pre_key_count(self):
# Check if enough PreKeys are available
@@ -350,7 +347,3 @@ class InvalidMessage(Exception):
class DuplicateMessage(Exception):
pass
class SenderNotTrusted(Exception):
pass

View File

@@ -30,7 +30,7 @@ UNACKNOWLEDGED_COUNT = 300
class Trust(IntEnum):
UNTRUSTED = 0
TRUSTED = 1
VERIFIED = 1
UNDECIDED = 2