mirror of
https://github.com/bitwarden/browser
synced 2025-12-15 15:53:27 +00:00
[PM-2899] Implement ProtonPass json importer (#5766)
* Implement ProtonPass json importer * Add protonpass-importer json type definition * Fix alphabetical order in importer imports * Add importer error message for encrypted protonpass imports * Add i18n to protonpass importer * Add protonpass (zip) importer * Fix protonpass importer * Add unit tests for protonpass importer * Make protonpass importer not discard totp codes * Merge protonpass json & zip importers * Add protonpass creditcard import & fix note import * Fix protonpass zip import not recognizing zip files on windows/chrome * Make protonpass importer use vault types * Make protonpass importer treat vaults as folders * Make protonpass importer treat folders as collections for organizations Co-authored-by: Daniel James Smith <djsmith85@users.noreply.github.com> * Add types to protonpass test data * Fix protonpass importer's moveFoldersToCollections * Add tests for folders/collections * Remove unecessary type cast in protonpass importer * Remove unecessary type annotations in protonpass importer * Add assertion for credit card cvv in protonpass importer * Handle trashed items in protonpass importer * Fix setting expiry month on credit cards * Fix wrong folder-assignment Only the first item of a "vault" was getting assigned to a folder Extend unit tests to verify behaviour --------- Co-authored-by: Daniel James Smith <djsmith85@users.noreply.github.com> Co-authored-by: Daniel James Smith <djsmith@web.de>
This commit is contained in:
@@ -46,5 +46,8 @@
|
||||
},
|
||||
"ssoKeyConnectorError": {
|
||||
"message": "Key Connector error: make sure Key Connector is available and working correctly."
|
||||
},
|
||||
"unsupportedEncryptedImport": {
|
||||
"message": "Importing encrypted files is currently not supported."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,9 @@ export class ImportCommand {
|
||||
try {
|
||||
let contents;
|
||||
if (format === "1password1pux") {
|
||||
contents = await CliUtils.extract1PuxContent(filepath);
|
||||
contents = await CliUtils.extractZipContent(filepath, "export.data");
|
||||
} else if (format === "protonpass" && filepath.endsWith(".zip")) {
|
||||
contents = await CliUtils.extractZipContent(filepath, "Proton Pass/data.json");
|
||||
} else {
|
||||
contents = await CliUtils.readFile(filepath);
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ export class CliUtils {
|
||||
});
|
||||
}
|
||||
|
||||
static extract1PuxContent(input: string): Promise<string> {
|
||||
static extractZipContent(input: string, filepath: string): Promise<string> {
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
let p: string = null;
|
||||
if (input != null && input !== "") {
|
||||
@@ -65,7 +65,7 @@ export class CliUtils {
|
||||
}
|
||||
JSZip.loadAsync(data).then(
|
||||
(zip) => {
|
||||
resolve(zip.file("export.data").async("string"));
|
||||
resolve(zip.file(filepath).async("string"));
|
||||
},
|
||||
(reason) => {
|
||||
reject(reason);
|
||||
@@ -74,6 +74,7 @@ export class CliUtils {
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the given data to a file and determine the target file if necessary.
|
||||
* If output is non-empty, it is used as target filename. Otherwise the target filename is
|
||||
|
||||
Reference in New Issue
Block a user