bitwarden_fido/
client_fido.rs

1use bitwarden_core::Client;
2use bitwarden_vault::CipherView;
3use thiserror::Error;
4
5use crate::{
6    Fido2Authenticator, Fido2Client, Fido2CredentialAutofillView, Fido2CredentialAutofillViewError,
7    Fido2CredentialStore, Fido2UserInterface,
8};
9
10#[allow(missing_docs)]
11#[derive(Clone)]
12pub struct ClientFido2 {
13    pub(crate) client: Client,
14}
15
16#[allow(missing_docs)]
17#[derive(Debug, Error)]
18#[cfg_attr(feature = "uniffi", derive(uniffi::Error), uniffi(flat_error))]
19pub enum DecryptFido2AutofillCredentialsError {
20    #[error(transparent)]
21    Fido2CredentialAutofillView(#[from] Fido2CredentialAutofillViewError),
22}
23
24impl ClientFido2 {
25    #[allow(missing_docs)]
26    pub fn new(client: Client) -> Self {
27        Self { client }
28    }
29
30    #[allow(missing_docs)]
31    pub fn create_authenticator<'a>(
32        &'a self,
33        user_interface: &'a dyn Fido2UserInterface,
34        credential_store: &'a dyn Fido2CredentialStore,
35    ) -> Fido2Authenticator<'a> {
36        Fido2Authenticator::new(&self.client, user_interface, credential_store)
37    }
38
39    #[allow(missing_docs)]
40    pub fn create_client<'a>(
41        &'a self,
42        user_interface: &'a dyn Fido2UserInterface,
43        credential_store: &'a dyn Fido2CredentialStore,
44    ) -> Fido2Client<'a> {
45        Fido2Client {
46            authenticator: self.create_authenticator(user_interface, credential_store),
47        }
48    }
49
50    #[allow(missing_docs)]
51    pub fn decrypt_fido2_autofill_credentials(
52        &self,
53        cipher_view: CipherView,
54    ) -> Result<Vec<Fido2CredentialAutofillView>, DecryptFido2AutofillCredentialsError> {
55        let key_store = self.client.internal.get_key_store();
56
57        Ok(Fido2CredentialAutofillView::from_cipher_view(
58            &cipher_view,
59            &mut key_store.context(),
60        )?)
61    }
62}
63
64#[allow(missing_docs)]
65pub trait ClientFido2Ext {
66    fn fido2(&self) -> ClientFido2;
67}
68
69impl ClientFido2Ext for Client {
70    fn fido2(&self) -> ClientFido2 {
71        ClientFido2::new(self.clone())
72    }
73}