From 1157594530f41e9711372c2d9f3047faf660449f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 4 Aug 2021 16:42:57 +0200 Subject: [PATCH] crypto: Add a method to check if a user identity is verified --- matrix_sdk_crypto/src/identities/user.rs | 9 ++++ matrix_sdk_crypto/src/store/mod.rs | 66 +++++++++++++++++------- matrix_sdk_crypto/src/store/sled.rs | 7 +-- 3 files changed, 56 insertions(+), 26 deletions(-) diff --git a/matrix_sdk_crypto/src/identities/user.rs b/matrix_sdk_crypto/src/identities/user.rs index 2b860850..1866054f 100644 --- a/matrix_sdk_crypto/src/identities/user.rs +++ b/matrix_sdk_crypto/src/identities/user.rs @@ -169,6 +169,7 @@ impl OwnUserIdentity { #[derive(Debug, Clone)] pub struct UserIdentity { pub(crate) inner: ReadOnlyUserIdentity, + pub(crate) own_identity: Option, pub(crate) verification_machine: VerificationMachine, } @@ -181,6 +182,14 @@ impl Deref for UserIdentity { } impl UserIdentity { + /// Is this user identity verified. + pub fn verified(&self) -> bool { + self.own_identity + .as_ref() + .map(|o| o.is_identity_signed(&self.inner).is_ok()) + .unwrap_or(false) + } + /// Create a `VerificationRequest` object after the verification request /// content has been sent out. pub async fn request_verification( diff --git a/matrix_sdk_crypto/src/store/mod.rs b/matrix_sdk_crypto/src/store/mod.rs index 8cd23a7f..2bd86651 100644 --- a/matrix_sdk_crypto/src/store/mod.rs +++ b/matrix_sdk_crypto/src/store/mod.rs @@ -290,31 +290,57 @@ impl Store { user_id: &UserId, device_id: &DeviceId, ) -> Result> { - let own_identity = - self.inner.get_user_identity(&self.user_id).await?.map(|i| i.own().cloned()).flatten(); - let device_owner_identity = self.inner.get_user_identity(user_id).await?; + if user_id == self.user_id() && device_id == self.device_id() { + Ok(None) + } else { + let own_identity = self + .inner + .get_user_identity(&self.user_id) + .await? + .map(|i| i.own().cloned()) + .flatten(); + let device_owner_identity = self.inner.get_user_identity(user_id).await?; - Ok(self.inner.get_device(user_id, device_id).await?.map(|d| Device { - inner: d, - private_identity: self.identity.clone(), - verification_machine: self.verification_machine.clone(), - own_identity, - device_owner_identity, - })) + Ok(self.inner.get_device(user_id, device_id).await?.map(|d| Device { + inner: d, + private_identity: self.identity.clone(), + verification_machine: self.verification_machine.clone(), + own_identity, + device_owner_identity, + })) + } } pub async fn get_identity(&self, user_id: &UserId) -> Result> { - Ok(self.inner.get_user_identity(user_id).await?.map(|i| match i { - ReadOnlyUserIdentities::Own(i) => OwnUserIdentity { - inner: i, - verification_machine: self.verification_machine.clone(), - } - .into(), - ReadOnlyUserIdentities::Other(i) => { - UserIdentity { inner: i, verification_machine: self.verification_machine.clone() } + // let own_identity = + // self.inner.get_user_identity(self.user_id()).await?.and_then(|i| i.own()); + Ok(if let Some(identity) = self.inner.get_user_identity(user_id).await? { + Some(match identity { + ReadOnlyUserIdentities::Own(i) => OwnUserIdentity { + inner: i, + verification_machine: self.verification_machine.clone(), + } + .into(), + ReadOnlyUserIdentities::Other(i) => { + let own_identity = + self.inner.get_user_identity(self.user_id()).await?.and_then(|i| { + if let ReadOnlyUserIdentities::Own(i) = i { + Some(i) + } else { + None + } + }); + UserIdentity { + inner: i, + verification_machine: self.verification_machine.clone(), + own_identity, + } .into() - } - })) + } + }) + } else { + None + }) } /// Try to export the secret with the given secret name. diff --git a/matrix_sdk_crypto/src/store/sled.rs b/matrix_sdk_crypto/src/store/sled.rs index 91aa7d1c..8a474360 100644 --- a/matrix_sdk_crypto/src/store/sled.rs +++ b/matrix_sdk_crypto/src/store/sled.rs @@ -665,12 +665,7 @@ impl CryptoStore for SledStore { device_id: &DeviceId, ) -> Result> { let key = (user_id.as_str(), device_id.as_str()).encode(); - - if let Some(d) = self.devices.get(key)? { - Ok(Some(serde_json::from_slice(&d)?)) - } else { - Ok(None) - } + Ok(self.devices.get(key)?.map(|d| serde_json::from_slice(&d)).transpose()?) } async fn get_user_devices(