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