Skip to main content

bitwarden_importers/
import.rs

1//! Routing: maps each importer's public entry to its parser + the generic submit pipeline.
2
3use 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
15/// See [crate::ImporterClient::import_kdbx] for more documentation.
16pub(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
27/// See [crate::ImporterClient::import_onepassword] for more documentation.
28pub(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
52/// See [crate::ImporterClient::onepassword_sign_in_methods] for more documentation.
53pub(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
63/// 1Password is a third-party host, so this goes through the client's external transport rather
64/// than the one configured for the Bitwarden API.
65fn access_client(client: &Client) -> access::Client {
66    access::Client::new(client.internal.get_http_client().clone())
67}