bitwarden_importers/
import.rs1use bitwarden_core::Client;
4
5use crate::{
6 Credentials, ImportError, ImportOptions, ImportSummary, OnePasswordImportSummary,
7 OnePasswordSignInMethods, OnePasswordTwoFactorUi, SignInAddress,
8 importers::{
9 self,
10 onepassword::{access, convert},
11 },
12 pipeline,
13};
14
15pub(crate) async fn import_kdbx(
17 client: &Client,
18 file: Vec<u8>,
19 password: Option<String>,
20 key_file: Option<Vec<u8>>,
21 options: ImportOptions,
22) -> Result<ImportSummary, ImportError> {
23 let parsed = importers::kdbx::parse(file, password, key_file)?;
24 pipeline::submit_import(client, parsed, options).await
25}
26
27pub(crate) async fn import_onepassword(
29 client: &Client,
30 credentials: Credentials,
31 two_factor: &dyn OnePasswordTwoFactorUi,
32 options: ImportOptions,
33) -> Result<OnePasswordImportSummary, ImportError> {
34 let mut account = access_client(client)
35 .open_account(credentials, two_factor)
36 .await?;
37 let skipped_items = account
38 .vaults
39 .iter_mut()
40 .flat_map(|vault| std::mem::take(&mut vault.skipped_items))
41 .collect();
42 let imported =
43 pipeline::submit_import(client, convert::convert(account.vaults), options).await?;
44
45 Ok(OnePasswordImportSummary {
46 imported,
47 skipped_vaults: account.skipped_vaults,
48 skipped_items,
49 })
50}
51
52pub(crate) async fn onepassword_sign_in_methods(
54 client: &Client,
55 username: String,
56 sign_in_address: SignInAddress,
57) -> Result<OnePasswordSignInMethods, ImportError> {
58 Ok(access_client(client)
59 .sign_in_methods(&username, sign_in_address)
60 .await?)
61}
62
63fn access_client(client: &Client) -> access::Client {
66 access::Client::new(client.internal.get_http_client().clone())
67}