Skip to main content

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 repository::{UniffiRepositoryBridge, create_uniffi_repositories};
8
9use crate::error::Result;
10
11mod fido2;
12mod repository;
13mod server_communication_config;
14
15// Re-export ServerCommunicationConfig types for UniFFI bindings
16pub use bitwarden_server_communication_config::{
17    AcquiredCookie, BootstrapConfig, ServerCommunicationConfig, SsoCookieVendorConfig,
18};
19pub use server_communication_config::{
20    ServerCommunicationConfigClient, ServerCommunicationConfigRepository,
21};
22
23#[derive(uniffi::Object)]
24pub struct PlatformClient(pub(crate) bitwarden_core::Client);
25
26#[uniffi::export(async_runtime = "tokio")]
27impl PlatformClient {
28    /// Fingerprint (public key)
29    pub fn fingerprint(&self, req: FingerprintRequest) -> Result<String> {
30        Ok(self.0.platform().fingerprint(&req)?)
31    }
32
33    /// Fingerprint using logged in user's public key
34    pub fn user_fingerprint(&self, fingerprint_material: String) -> Result<String> {
35        Ok(self.0.platform().user_fingerprint(fingerprint_material)?)
36    }
37
38    /// Load feature flags into the client
39    pub async fn load_flags(&self, flags: std::collections::HashMap<String, bool>) -> Result<()> {
40        self.0.internal.load_flags(flags).await;
41        Ok(())
42    }
43
44    /// FIDO2 operations
45    pub fn fido2(&self) -> fido2::ClientFido2 {
46        fido2::ClientFido2(self.0.fido2())
47    }
48
49    pub fn state(&self) -> StateClient {
50        StateClient(self.0.clone())
51    }
52
53    /// Server communication configuration operations
54    pub fn server_communication_config(
55        &self,
56        repository: Arc<dyn server_communication_config::ServerCommunicationConfigRepository>,
57        platform_api: Arc<
58            dyn bitwarden_server_communication_config::ServerCommunicationConfigPlatformApi,
59        >,
60    ) -> Arc<server_communication_config::ServerCommunicationConfigClient> {
61        server_communication_config::ServerCommunicationConfigClient::new(repository, platform_api)
62    }
63}
64
65#[derive(uniffi::Object)]
66pub struct StateClient(Client);
67
68bitwarden_pm::create_client_managed_repositories!(Repositories, create_uniffi_repositories);
69
70#[uniffi::export]
71impl StateClient {
72    #[deprecated(note = "Use `register_client_managed_repositories` instead")]
73    pub fn register_cipher_repository(&self, repository: Arc<dyn CipherRepository>) {
74        let cipher = UniffiRepositoryBridge::new(repository);
75        self.0.platform().state().register_client_managed(cipher);
76    }
77
78    pub fn register_client_managed_repositories(&self, repositories: Repositories) {
79        repositories.register_all(&self.0.platform().state());
80    }
81}