From a42af5da69da1da461040143042eb707c2ceddd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 19 Aug 2020 10:54:26 +0200 Subject: [PATCH] crypto: Let the device hold on to identities. This makes it possible to check the verification state of the device directly. --- matrix_sdk_crypto/src/device.rs | 17 +++++++++--- matrix_sdk_crypto/src/machine.rs | 38 ++++++++++++++++++++++++++ matrix_sdk_crypto/src/user_identity.rs | 14 ++++++++++ 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/matrix_sdk_crypto/src/device.rs b/matrix_sdk_crypto/src/device.rs index b6fbcbd9..6e517279 100644 --- a/matrix_sdk_crypto/src/device.rs +++ b/matrix_sdk_crypto/src/device.rs @@ -36,7 +36,10 @@ use serde_json::{json, Value}; use super::{Account, OlmMachine}; use crate::{ - error::SignatureError, store::Result as StoreResult, verification::VerificationMachine, + error::SignatureError, + store::Result as StoreResult, + user_identity::{OwnUserIdentity, UserIdentity}, + verification::VerificationMachine, verify_json, ReadOnlyUserDevices, Sas, }; @@ -58,6 +61,8 @@ pub struct ReadOnlyDevice { pub struct Device { pub(crate) inner: ReadOnlyDevice, pub(crate) verification_machine: VerificationMachine, + pub(crate) own_identity: Option, + pub(crate) device_owner_identity: Option, } impl Deref for Device { @@ -97,6 +102,8 @@ impl Device { pub struct UserDevices { pub(crate) inner: ReadOnlyUserDevices, pub(crate) verification_machine: VerificationMachine, + pub(crate) own_identity: Option, + pub(crate) device_owner_identity: Option, } impl UserDevices { @@ -105,6 +112,8 @@ impl UserDevices { self.inner.get(device_id).map(|d| Device { inner: d, verification_machine: self.verification_machine.clone(), + own_identity: self.own_identity.clone(), + device_owner_identity: self.device_owner_identity.clone(), }) } @@ -115,11 +124,11 @@ impl UserDevices { /// Iterator over all the devices of the user devices. pub fn devices(&self) -> impl Iterator + '_ { - let machine = self.verification_machine.clone(); - self.inner.devices().map(move |d| Device { inner: d.clone(), - verification_machine: machine.clone(), + verification_machine: self.verification_machine.clone(), + own_identity: self.own_identity.clone(), + device_owner_identity: self.device_owner_identity.clone(), }) } } diff --git a/matrix_sdk_crypto/src/machine.rs b/matrix_sdk_crypto/src/machine.rs index b8dbf9e7..65a53c8d 100644 --- a/matrix_sdk_crypto/src/machine.rs +++ b/matrix_sdk_crypto/src/machine.rs @@ -1423,9 +1423,28 @@ impl OlmMachine { .ok() .flatten()?; + let own_identity = self + .store + .get_user_identity(self.user_id()) + .await + .ok() + .flatten() + .map(|i| i.own().cloned()) + .flatten(); + let device_owner_identity = self + .store + .get_user_identity(user_id) + .await + .ok() + .flatten() + .map(|i| i.other().cloned()) + .flatten(); + Some(Device { inner: device, verification_machine: self.verification_machine.clone(), + own_identity, + device_owner_identity, }) } @@ -1455,9 +1474,28 @@ impl OlmMachine { pub async fn get_user_devices(&self, user_id: &UserId) -> StoreResult { let devices = self.store.get_user_devices(user_id).await?; + let own_identity = self + .store + .get_user_identity(self.user_id()) + .await + .ok() + .flatten() + .map(|i| i.own().cloned()) + .flatten(); + let device_owner_identity = self + .store + .get_user_identity(user_id) + .await + .ok() + .flatten() + .map(|i| i.other().cloned()) + .flatten(); + Ok(UserDevices { inner: devices, verification_machine: self.verification_machine.clone(), + own_identity, + device_owner_identity, }) } } diff --git a/matrix_sdk_crypto/src/user_identity.rs b/matrix_sdk_crypto/src/user_identity.rs index 4c0f8197..21bf3ee5 100644 --- a/matrix_sdk_crypto/src/user_identity.rs +++ b/matrix_sdk_crypto/src/user_identity.rs @@ -166,6 +166,20 @@ impl UserIdentities { UserIdentities::Other(i) => i.master_key(), } } + + pub fn own(&self) -> Option<&OwnUserIdentity> { + match self { + UserIdentities::Own(i) => Some(i), + _ => None, + } + } + + pub fn other(&self) -> Option<&UserIdentity> { + match self { + UserIdentities::Other(i) => Some(i), + _ => None, + } + } } #[derive(Debug, Clone)]