crypto: Add a method to check if a user identity is verified
This commit is contained in:
parent
8d7fe5e575
commit
1157594530
3 changed files with 56 additions and 26 deletions
|
@ -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(
|
||||||
|
|
|
@ -290,8 +290,15 @@ 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)
|
||||||
|
} 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?;
|
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 {
|
||||||
|
@ -302,19 +309,38 @@ impl Store {
|
||||||
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 =
|
||||||
|
// 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 {
|
ReadOnlyUserIdentities::Own(i) => OwnUserIdentity {
|
||||||
inner: i,
|
inner: i,
|
||||||
verification_machine: self.verification_machine.clone(),
|
verification_machine: self.verification_machine.clone(),
|
||||||
}
|
}
|
||||||
.into(),
|
.into(),
|
||||||
ReadOnlyUserIdentities::Other(i) => {
|
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| {
|
||||||
|
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.
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Reference in a new issue