bitwarden_uniffi/platform/
mod.rs1use 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 pub fn fingerprint(&self, req: FingerprintRequest) -> Result<String> {
21 Ok(self.0.platform().fingerprint(&req)?)
22 }
23
24 pub fn user_fingerprint(&self, fingerprint_material: String) -> Result<String> {
26 Ok(self.0.platform().user_fingerprint(fingerprint_material)?)
27 }
28
29 pub fn load_flags(&self, flags: std::collections::HashMap<String, bool>) -> Result<()> {
31 self.0.internal.load_flags(flags);
32 Ok(())
33 }
34
35 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 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}