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;
14mod server_communication_config;
15
16// Re-export ServerCommunicationConfig types for UniFFI bindings
17pub use bitwarden_server_communication_config::{
18    AcquiredCookie, BootstrapConfig, ServerCommunicationConfig, SsoCookieVendorConfig,
19};
20pub use server_communication_config::{
21    ServerCommunicationConfigClient, ServerCommunicationConfigRepository,
22};
23
24#[derive(uniffi::Object)]
25pub struct PlatformClient(pub(crate) bitwarden_core::Client);
26
27#[uniffi::export]
28impl PlatformClient {
29    /// Fingerprint (public key)
30    pub fn fingerprint(&self, req: FingerprintRequest) -> Result<String> {
31        Ok(self.0.platform().fingerprint(&req)?)
32    }
33
34    /// Fingerprint using logged in user's public key
35    pub fn user_fingerprint(&self, fingerprint_material: String) -> Result<String> {
36        Ok(self.0.platform().user_fingerprint(fingerprint_material)?)
37    }
38
39    /// Load feature flags into the client
40    pub fn load_flags(&self, flags: std::collections::HashMap<String, bool>) -> Result<()> {
41        self.0.internal.load_flags(flags);
42        Ok(())
43    }
44
45    /// FIDO2 operations
46    pub fn fido2(&self) -> fido2::ClientFido2 {
47        fido2::ClientFido2(self.0.fido2())
48    }
49
50    pub fn state(&self) -> StateClient {
51        StateClient(self.0.clone())
52    }
53
54    /// Server communication configuration operations
55    pub fn server_communication_config(
56        &self,
57        repository: Arc<dyn server_communication_config::ServerCommunicationConfigRepository>,
58        platform_api: Arc<
59            dyn bitwarden_server_communication_config::ServerCommunicationConfigPlatformApi,
60        >,
61    ) -> Arc<server_communication_config::ServerCommunicationConfigClient> {
62        server_communication_config::ServerCommunicationConfigClient::new(repository, platform_api)
63    }
64}
65
66#[derive(uniffi::Object)]
67pub struct StateClient(Client);
68
69#[derive(uniffi::Record)]
70pub struct SqliteConfiguration {
71    db_name: String,
72    folder_path: String,
73}
74
75bitwarden_pm::create_client_managed_repositories!(Repositories, create_uniffi_repositories);
76
77#[uniffi::export]
78impl StateClient {
79    #[deprecated(note = "Use `register_client_managed_repositories` instead")]
80    pub fn register_cipher_repository(&self, repository: Arc<dyn CipherRepository>) {
81        let cipher = UniffiRepositoryBridge::new(repository);
82        self.0.platform().state().register_client_managed(cipher);
83    }
84
85    pub fn register_client_managed_repositories(&self, repositories: Repositories) {
86        repositories.register_all(&self.0.platform().state());
87    }
88
89    /// Initialize the database for SDK managed repositories.
90    pub async fn initialize_state(&self, configuration: SqliteConfiguration) -> Result<()> {
91        let migrations = bitwarden_pm::migrations::get_sdk_managed_migrations();
92
93        self.0
94            .platform()
95            .state()
96            .initialize_database(configuration.into(), migrations)
97            .await?;
98
99        Ok(())
100    }
101}
102
103impl From<SqliteConfiguration> for DatabaseConfiguration {
104    fn from(config: SqliteConfiguration) -> Self {
105        DatabaseConfiguration::Sqlite {
106            db_name: config.db_name,
107            folder_path: config.folder_path.into(),
108        }
109    }
110}