crypto: Add a method to check if a user identity is verified

This commit is contained in:
Damir Jelić 2021-08-04 16:42:57 +02:00
parent 8d7fe5e575
commit 1157594530
3 changed files with 56 additions and 26 deletions

View file

@ -169,6 +169,7 @@ impl OwnUserIdentity {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct UserIdentity { pub struct UserIdentity {
pub(crate) inner: ReadOnlyUserIdentity, pub(crate) inner: ReadOnlyUserIdentity,
pub(crate) own_identity: Option<ReadOnlyOwnUserIdentity>,
pub(crate) verification_machine: VerificationMachine, pub(crate) verification_machine: VerificationMachine,
} }
@ -181,6 +182,14 @@ impl Deref for UserIdentity {
} }
impl 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 /// Create a `VerificationRequest` object after the verification request
/// content has been sent out. /// content has been sent out.
pub async fn request_verification( pub async fn request_verification(

View file

@ -290,31 +290,57 @@ impl Store {
user_id: &UserId, user_id: &UserId,
device_id: &DeviceId, device_id: &DeviceId,
) -> Result<Option<Device>> { ) -> Result<Option<Device>> {
let own_identity = if user_id == self.user_id() && device_id == self.device_id() {
self.inner.get_user_identity(&self.user_id).await?.map(|i| i.own().cloned()).flatten(); Ok(None)
let device_owner_identity = self.inner.get_user_identity(user_id).await?; } 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 { Ok(self.inner.get_device(user_id, device_id).await?.map(|d| Device {
inner: d, inner: d,
private_identity: self.identity.clone(), private_identity: self.identity.clone(),
verification_machine: self.verification_machine.clone(), verification_machine: self.verification_machine.clone(),
own_identity, own_identity,
device_owner_identity, device_owner_identity,
})) }))
}
} }
pub async fn get_identity(&self, user_id: &UserId) -> Result<Option<UserIdentities>> { pub async fn get_identity(&self, user_id: &UserId) -> Result<Option<UserIdentities>> {
Ok(self.inner.get_user_identity(user_id).await?.map(|i| match i { // let own_identity =
ReadOnlyUserIdentities::Own(i) => OwnUserIdentity { // self.inner.get_user_identity(self.user_id()).await?.and_then(|i| i.own());
inner: i, Ok(if let Some(identity) = self.inner.get_user_identity(user_id).await? {
verification_machine: self.verification_machine.clone(), Some(match identity {
} ReadOnlyUserIdentities::Own(i) => OwnUserIdentity {
.into(), inner: i,
ReadOnlyUserIdentities::Other(i) => { verification_machine: self.verification_machine.clone(),
UserIdentity { 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() .into()
} }
})) })
} else {
None
})
} }
/// Try to export the secret with the given secret name. /// Try to export the secret with the given secret name.

View file

@ -665,12 +665,7 @@ impl CryptoStore for SledStore {
device_id: &DeviceId, device_id: &DeviceId,
) -> Result<Option<ReadOnlyDevice>> { ) -> Result<Option<ReadOnlyDevice>> {
let key = (user_id.as_str(), device_id.as_str()).encode(); let key = (user_id.as_str(), device_id.as_str()).encode();
Ok(self.devices.get(key)?.map(|d| serde_json::from_slice(&d)).transpose()?)
if let Some(d) = self.devices.get(key)? {
Ok(Some(serde_json::from_slice(&d)?))
} else {
Ok(None)
}
} }
async fn get_user_devices( async fn get_user_devices(