bitwarden_uniffi/platform/
mod.rs

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