1
0
mirror of https://github.com/bitwarden/browser synced 2026-01-08 11:33:28 +00:00

[PM-24748][PM-24072] Chromium importer (#16100)

* Add importer dummy lib, add cargo deps for win/mac

* Add Chromium importer source from bitwarden/password-access

* Mod crypto is no more

* Expose some Chromium importer functions via NAPI, replace home with home_dir crate

* Add Chromium importer to the main <-> renderer IPC, export all functions from Rust

* Add password and notes fields to the imported logins

* Fix windows to use homedir instead of home

* Return success/failure results

* Import from account logins and join

* Linux v10 support

* Use mod util on Windows

* Use mod util on macOS

* Refactor to move shared code into chromium.rs

* Fix windows

* Fix Linux as well

* Linux v11 support for Chrome/Gnome, everything is async now

* Support multiple browsers on Linux v11

* Move oo7 to Linux

* Fix Windows

* Fix macOS

* Add support for Brave browser in Linux configuration

* Add support for Opera browser in Linux configuration

* Fix Edge and add Arc on macOS

* Add Opera on macOS

* Add support for Vivaldi browser in macOS configuration

* Add support for Chromium browser in macOS configuration

* Fix Edge on Windows

* Add Opera on Windows

* Add Vivaldi on windows

* Add Chromium to supported browsers on Windows

* stub out UI options for chromium direct import

* call IPC funcs from import-desktop

* add notes to chrome csv importer

* remove (csv) from import tool names and format item names as hostnames

* Add ABE/v20 encryption support

* ABE/v20 architecture description

* Add a build step to produce admin.exe and service.exe

* Add Windows v20/ABE configuration functionality to specify the full path to the admin.exe and service.exe. Use ipc.platform.chromiumImporter.configureWindowsCryptoService to configure the Chromium importer on Windows.

* rename ARCHITECTURE.md to README.md

* aligns with guidance from architecture re: in-repository documentation.
* also fixes a failing lint.

* cargo fmt

* cargo clippy fix

* Declare feature flag for using chromium importer

* Linter fix after executing npm run prettier

* Use feature flag to guard the use of the chromium importer

* Added temporary logging to further debug, why the Angular change detection isn't working as expected

* introduce importer metadata; host metadata from service; includes tests

* fix cli build

* Register autotype module in lib.rs
introduce by a bad merge

* Fix web build

* Fix issue with loaders being undefined and the feature flag turned off

* Add missing Chromium support when selecting chromecsv

* debugging

* remove chromium support from chromecsv metadata

* fix default loader selection

* [PM-24753] cargo lib file (#16090)

* Add new modules

* Fix chromium importer

* Fix compile bugs for toolchain

* remove importer folder

* remove IPC code

* undo setting change

* clippy fixes

* cargo fmt

* clippy fixes

* clippy fixes

* clippy fixes

* clippy fixes

* lint fix

* fix release build

* Add files in CODEOWNERS

* Create tools owned preload.ts

* Move chromium-importer.service under tools-ownership

* Fix typeError
When accessing the Chromium direct import options the file button is hidden, so trying to access it's values will fail

* Fix tools owned preload

* Remove dead code and redundant truncation

* Remove configureWindowsCryptoService function/methods

* Clean up cargo files

* Fix unused async

* Update apps/desktop/desktop_native/bitwarden_chromium_importer/Cargo.toml

Co-authored-by: Oscar Hinton <Hinton@users.noreply.github.com>

* Fix napi deps

* fix lints

* format

* fix linux lint

* fix windows lints

* format

* fix missing `?`

* fix a different missing `?`

---------

Co-authored-by: Dmitry Yakimenko <detunized@gmail.com>
Co-authored-by: Kyle Spearrin <kyle.spearrin@gmail.com>
Co-authored-by: Daniel James Smith <djsmith85@users.noreply.github.com>
Co-authored-by:  Audrey  <ajensen@bitwarden.com>
Co-authored-by:  Audrey  <audrey@audreyality.com>
Co-authored-by: adudek-bw <adudek@bitwarden.com>
Co-authored-by: Oscar Hinton <Hinton@users.noreply.github.com>
This commit is contained in:
Daniel James Smith
2025-09-04 11:21:57 +02:00
committed by GitHub
parent b957a0c28f
commit 66f5700a75
46 changed files with 2436 additions and 90 deletions

View File

@@ -0,0 +1,15 @@
import { ClientType } from "@bitwarden/client-type";
import { deepFreeze } from "@bitwarden/common/tools/util";
import { Loader } from "./data";
import { DataLoader } from "./types";
/** Describes which loaders are supported on each client */
export const LoaderAvailability: Record<DataLoader, ClientType[]> = deepFreeze({
[Loader.chromium]: [ClientType.Desktop],
[Loader.download]: [ClientType.Browser],
[Loader.file]: [ClientType.Browser, ClientType.Desktop, ClientType.Web, ClientType.Cli],
// FIXME: enable IPC importer on `ClientType.Desktop` once it's ready
[Loader.ipc]: [],
});

View File

@@ -0,0 +1,27 @@
/** Mechanisms that load data into the importer. */
export const Loader = Object.freeze({
/** Data loaded from a file provided by the user/ */
file: "file",
/** Data loaded directly from the chromium browser's data store */
chromium: "chromium",
/** Data provided through an importer ipc channel (e.g. Bitwarden bridge) */
ipc: "ipc",
/** Data provided through direct file download (e.g. a LastPass export) */
download: "download",
});
/** Re-branded products often leave their exporters unaltered; when that occurs,
* `Instructions` lets us group them together.
*
* @remarks Instructions values must be mutually exclusive from Loader's values.
*/
export const Instructions = Object.freeze({
/** the instructions are unique to the import type */
unique: "unique",
/** shared chromium instructions */
chromium: "chromium",
});

View File

@@ -0,0 +1,27 @@
import { deepFreeze } from "@bitwarden/common/tools/util";
import { ImportType } from "../models";
import { Loader, Instructions } from "./data";
import { ImporterMetadata } from "./types";
// FIXME: load this data from rust code
const importers = [
// chromecsv import depends upon operating system, so ironically it doesn't support chromium
{ id: "chromecsv", loaders: [Loader.file], instructions: Instructions.chromium },
{ id: "operacsv", loaders: [Loader.file, Loader.chromium], instructions: Instructions.chromium },
{
id: "vivaldicsv",
loaders: [Loader.file, Loader.chromium],
instructions: Instructions.chromium,
},
{ id: "bravecsv", loaders: [Loader.file, Loader.chromium], instructions: Instructions.chromium },
{ id: "edgecsv", loaders: [Loader.file, Loader.chromium], instructions: Instructions.chromium },
// FIXME: add other formats and remove `Partial` from export
] as const;
/** Describes which loaders are available for each import type */
export const Importers: Partial<Record<ImportType, ImporterMetadata>> = deepFreeze(
Object.fromEntries(importers.map((i) => [i.id, i])),
);

View File

@@ -0,0 +1,4 @@
export * from "./availability";
export * from "./data";
export * from "./types";
export * from "./importers";

View File

@@ -0,0 +1,20 @@
import { ImportType } from "../models";
import { Instructions, Loader } from "./data";
/** Mechanisms that load data into the importer. */
export type DataLoader = (typeof Loader)[keyof typeof Loader];
export type InstructionLink = (typeof Instructions)[keyof typeof Instructions];
/** Mechanisms that load data into the importer. */
export type ImporterMetadata = {
/** Identifies the importer */
type: ImportType;
/** Identifies the instructions for the importer; this defaults to `unique`. */
instructions?: InstructionLink;
/** Describes the strategies used to obtain imported data */
loaders: DataLoader[];
};