core_crypto/transaction_context/credential/
mod.rs1mod check;
2
3use std::sync::Arc;
4
5use super::{Error, Result};
6use crate::{
7 Credential, CredentialRef, RecursiveError, mls::conversation::Conversation, transaction_context::TransactionContext,
8};
9
10impl TransactionContext {
11 pub(crate) async fn add_credential_without_clientid_check(
18 &self,
19 mut credential: Credential,
20 ) -> Result<Arc<Credential>> {
21 let _credential_ref = credential
22 .save(&self.database().await?)
23 .await
24 .map_err(RecursiveError::mls_credential("saving credential"))?;
25
26 Ok(Arc::new(credential))
27 }
28 pub async fn add_credential(&self, credential: Credential) -> Result<CredentialRef> {
30 let credential = self.add_credential_producing_arc(credential).await?;
31 Ok(CredentialRef::from_credential(&credential))
32 }
33
34 pub(crate) async fn add_credential_producing_arc(&self, credential: Credential) -> Result<Arc<Credential>> {
40 if *credential.client_id() != self.session().await?.id() {
41 return Err(Error::WrongCredential);
42 }
43
44 self.add_credential_without_clientid_check(credential).await
45 }
46
47 pub async fn remove_credential(&self, credential_ref: &CredentialRef) -> Result<()> {
52 if *credential_ref.client_id() != self.session().await?.id() {
54 return Err(Error::WrongCredential);
55 }
56
57 let database = self.database().await?;
58
59 let credential = credential_ref
60 .load(&database)
61 .await
62 .map_err(RecursiveError::mls_credential_ref(
63 "loading all credentials from ref to remove from session identities",
64 ))?;
65
66 let session = self.session().await?;
72 for (conversation_id, conversation) in
73 Conversation::load_all(session)
74 .await
75 .map_err(RecursiveError::mls_conversation(
76 "loading all conversations to check if the credential to be removed is present",
77 ))?
78 {
79 let converation_credential = conversation
80 .own_mls_credential()
81 .await
82 .map_err(RecursiveError::mls_conversation("geting conversation credential"))?;
83 if credential.mls_credential() == &converation_credential {
84 return Err(Error::CredentialStillInUse(conversation_id));
85 }
86 }
87
88 self.remove_key_packages_for(credential_ref).await?;
90
91 credential
93 .delete(&database)
94 .await
95 .map_err(RecursiveError::mls_credential("deleting credential from keystore"))
96 .map_err(Into::into)
97 }
98}