1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-10 05:13:29 +00:00

[PM-1071] Display import-details-dialog on successful import (#4817)

* Prefer callback over error-flow to prompt for password

Remove error-flow to request file password
Prefer callback, which has to be provided when retrieving/creating an instance.
Delete ImportError
Call BitwardenPasswordProtector for all Bitwarden json imports, as it extends BitwardenJsonImporter
Throw errors instead of returning
Return ImportResult
Fix and extend tests import.service
Replace "@fluffy-spoon/substitute" with "jest-mock-extended"

* Fix up test cases

Delete bitwarden-json-importer.spec.ts
Add test case to ensure bitwarden-json-importer.ts is called given unencrypted or account-protected files

* Move file-password-prompt into dialog-folder

* Add import success dialog

* Fix typo

* Only list the type when at least one got imported

* update copy based on design feedback

* Remove unnecessary /index import

* Remove promptForPassword_callback from interface

PR feedback from @MGibson1 that giving every importer the ability to request a password is unnecessary. Instead, we can pass the callback into the constructor for every importer that needs this functionality

* Remove unneeded import of BitwardenJsonImporter

* Fix spec constructor

* Fixed organizational import

Added an else statement, or else we'd import into an org and then also import into an individual vault
This commit is contained in:
Daniel James Smith
2023-04-06 22:41:09 +02:00
committed by GitHub
parent 19626a7837
commit cf2d8b266a
24 changed files with 397 additions and 287 deletions

View File

@@ -2,7 +2,7 @@ import * as program from "commander";
import * as inquirer from "inquirer";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { ImportServiceAbstraction, Importer, ImportType } from "@bitwarden/importer";
import { ImportServiceAbstraction, ImportType } from "@bitwarden/importer";
import { Response } from "../models/response";
import { MessageResponse } from "../models/response/message.response";
@@ -50,8 +50,14 @@ export class ImportCommand {
if (filepath == null || filepath === "") {
return Response.badRequest("`filepath` was not provided.");
}
const importer = await this.importService.getImporter(format, organizationId);
const promptForPassword_callback = async () => {
return await this.promptPassword();
};
const importer = await this.importService.getImporter(
format,
promptForPassword_callback,
organizationId
);
if (importer === null) {
return Response.badRequest("Proper importer type required.");
}
@@ -68,12 +74,14 @@ export class ImportCommand {
return Response.badRequest("Import file was empty.");
}
const response = await this.doImport(importer, contents, organizationId);
const response = await this.importService.import(importer, contents, organizationId);
if (response.success) {
response.data = new MessageResponse("Imported " + filepath, null);
return Response.success(new MessageResponse("Imported " + filepath, null));
}
return response;
} catch (err) {
if (err.message) {
return Response.badRequest(err.message);
}
return Response.badRequest(err);
}
}
@@ -91,27 +99,6 @@ export class ImportCommand {
return Response.success(res);
}
private async doImport(
importer: Importer,
contents: string,
organizationId?: string
): Promise<Response> {
const err = await this.importService.import(importer, contents, organizationId);
if (err != null) {
if (err.passwordRequired) {
importer = this.importService.getImporter(
"bitwardenpasswordprotected",
organizationId,
await this.promptPassword()
);
return this.doImport(importer, contents, organizationId);
}
return Response.badRequest(err.message);
}
return Response.success();
}
private async promptPassword() {
const answer: inquirer.Answers = await inquirer.createPromptModule({
output: process.stderr,