core_crypto/transaction_context/
credential.rs1use std::sync::Arc;
2
3use super::{Error, Result};
4use crate::{Credential, CredentialRef, MlsConversation, RecursiveError, transaction_context::TransactionContext};
5
6impl TransactionContext {
7 pub(crate) async fn add_credential_without_clientid_check(
14 &self,
15 mut credential: Credential,
16 ) -> Result<Arc<Credential>> {
17 let _credential_ref = credential
18 .save(&self.database().await?)
19 .await
20 .map_err(RecursiveError::mls_credential("saving credential"))?;
21
22 Ok(Arc::new(credential))
23 }
24 pub async fn add_credential(&self, credential: Credential) -> Result<CredentialRef> {
26 let credential = self.add_credential_producing_arc(credential).await?;
27 Ok(CredentialRef::from_credential(&credential))
28 }
29
30 pub(crate) async fn add_credential_producing_arc(&self, credential: Credential) -> Result<Arc<Credential>> {
36 if *credential.client_id() != self.session().await?.id() {
37 return Err(Error::WrongCredential);
38 }
39
40 self.add_credential_without_clientid_check(credential).await
41 }
42
43 pub async fn remove_credential(&self, credential_ref: &CredentialRef) -> Result<()> {
48 if *credential_ref.client_id() != self.session().await?.id() {
50 return Err(Error::WrongCredential);
51 }
52
53 let database = self.database().await?;
54
55 let credential = credential_ref
56 .load(&database)
57 .await
58 .map_err(RecursiveError::mls_credential_ref(
59 "loading all credentials from ref to remove from session identities",
60 ))?;
61
62 for (conversation_id, conversation) in
68 MlsConversation::load_all(&database)
69 .await
70 .map_err(RecursiveError::mls_conversation(
71 "loading all conversations to check if the credential to be removed is present",
72 ))?
73 {
74 let converation_credential = conversation
75 .own_mls_credential()
76 .map_err(RecursiveError::mls_conversation("geting conversation credential"))?;
77 if credential.mls_credential() == converation_credential {
78 return Err(Error::CredentialStillInUse(conversation_id));
79 }
80 }
81
82 self.remove_keypackages_for(credential_ref).await?;
84
85 credential
87 .delete(&database)
88 .await
89 .map_err(RecursiveError::mls_credential("deleting credential from keystore"))
90 .map_err(Into::into)
91 }
92}