bitwarden_fido/
client_fido.rs1use 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}