bitwarden_uniffi/platform/
mod.rs

1#![allow(deprecated)]
2
3use std::sync::Arc;
4
5use bitwarden_core::{Client, platform::FingerprintRequest};
6use bitwarden_fido::ClientFido2Ext;
7use bitwarden_state::DatabaseConfiguration;
8use repository::{UniffiRepositoryBridge, create_uniffi_repositories};
9
10use crate::error::Result;
11
12mod fido2;
13mod repository;
14
15#[derive(uniffi::Object)]
16pub struct PlatformClient(pub(crate) bitwarden_core::Client);
17
18#[uniffi::export]
19impl PlatformClient {
20    /// Fingerprint (public key)
21    pub fn fingerprint(&self, req: FingerprintRequest) -> Result<String> {
22        Ok(self.0.platform().fingerprint(&req)?)
23    }
24
25    /// Fingerprint using logged in user's public key
26    pub fn user_fingerprint(&self, fingerprint_material: String) -> Result<String> {
27        Ok(self.0.platform().user_fingerprint(fingerprint_material)?)
28    }
29
30    /// Load feature flags into the client
31    pub fn load_flags(&self, flags: std::collections::HashMap<String, bool>) -> Result<()> {
32        self.0.internal.load_flags(flags);
33        Ok(())
34    }
35
36    /// FIDO2 operations
37    pub fn fido2(&self) -> fido2::ClientFido2 {
38        fido2::ClientFido2(self.0.fido2())
39    }
40
41    pub fn state(&self) -> StateClient {
42        StateClient(self.0.clone())
43    }
44}
45
46#[derive(uniffi::Object)]
47pub struct StateClient(Client);
48
49#[derive(uniffi::Record)]
50pub struct SqliteConfiguration {
51    db_name: String,
52    folder_path: String,
53}
54
55bitwarden_pm::create_client_managed_repositories!(Repositories, create_uniffi_repositories);
56
57#[uniffi::export]
58impl StateClient {
59    #[deprecated(note = "Use `register_client_managed_repositories` instead")]
60    pub fn register_cipher_repository(&self, repository: Arc<dyn CipherRepository>) {
61        let cipher = UniffiRepositoryBridge::new(repository);
62        self.0.platform().state().register_client_managed(cipher);
63    }
64
65    pub fn register_client_managed_repositories(&self, repositories: Repositories) {
66        repositories.register_all(&self.0.platform().state());
67    }
68
69    /// Initialize the database for SDK managed repositories.
70    pub async fn initialize_state(&self, configuration: SqliteConfiguration) -> Result<()> {
71        let migrations = bitwarden_pm::migrations::get_sdk_managed_migrations();
72
73        self.0
74            .platform()
75            .state()
76            .initialize_database(configuration.into(), migrations)
77            .await?;
78
79        Ok(())
80    }
81}
82
83impl From<SqliteConfiguration> for DatabaseConfiguration {
84    fn from(config: SqliteConfiguration) -> Self {
85        DatabaseConfiguration::Sqlite {
86            db_name: config.db_name,
87            folder_path: config.folder_path.into(),
88        }
89    }
90}