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