diff --git a/angular/src/components/folder-add-edit.component.ts b/angular/src/components/folder-add-edit.component.ts index 34b19abc..99a6ee44 100644 --- a/angular/src/components/folder-add-edit.component.ts +++ b/angular/src/components/folder-add-edit.component.ts @@ -1,5 +1,6 @@ import { Directive, EventEmitter, Input, OnInit, Output } from "@angular/core"; +import { CryptoService } from "jslib-common/abstractions/crypto.service"; import { FolderService } from "jslib-common/abstractions/folder.service"; import { I18nService } from "jslib-common/abstractions/i18n.service"; import { LogService } from "jslib-common/abstractions/log.service"; @@ -19,10 +20,11 @@ export class FolderAddEditComponent implements OnInit { deletePromise: Promise; constructor( + protected cryptoService: CryptoService, protected folderService: FolderService, protected i18nService: I18nService, - protected platformUtilsService: PlatformUtilsService, - private logService: LogService + protected logService: LogService, + protected platformUtilsService: PlatformUtilsService ) {} async ngOnInit() { @@ -88,7 +90,7 @@ export class FolderAddEditComponent implements OnInit { this.editMode = true; this.title = this.i18nService.t("editFolder"); const folder = await this.folderService.get(this.folderId); - this.folder = await this.folderService.decrypt(folder); + this.folder = await FolderView.fromFolder(this.cryptoService, folder); } else { this.title = this.i18nService.t("addFolder"); } diff --git a/common/spec/domain/folder.spec.ts b/common/spec/domain/folder.spec.ts index fad01ad9..a73b992c 100644 --- a/common/spec/domain/folder.spec.ts +++ b/common/spec/domain/folder.spec.ts @@ -1,4 +1,11 @@ +import Substitute from "@fluffy-spoon/substitute"; + +import { CryptoService } from "jslib-common/abstractions/crypto.service"; import { FolderData } from "jslib-common/models/data/folderData"; +import { Folder } from "jslib-common/models/domain/folder"; +import { FolderView } from "jslib-common/models/view/folderView"; + +import { mockEnc } from "../utils"; describe("Folder", () => { it("Convert", () => { @@ -15,4 +22,21 @@ describe("Folder", () => { revisionDate: new Date("2022-01-31T12:00:00.000Z"), }); }); + + it("Decrypt", async () => { + const folder: Folder = { + id: "id", + name: mockEnc("encName"), + revisionDate: new Date("2022-01-31T12:00:00.000Z"), + }; + + const cryptoService = Substitute.for(); + const view = await FolderView.fromFolder(cryptoService, folder); + + expect(view).toEqual({ + id: "id", + name: "encName", + revisionDate: new Date("2022-01-31T12:00:00.000Z"), + }); + }); }); diff --git a/common/spec/services/folder.service.spec.ts b/common/spec/services/folder.service.spec.ts index c401c605..66765bcc 100644 --- a/common/spec/services/folder.service.spec.ts +++ b/common/spec/services/folder.service.spec.ts @@ -111,20 +111,4 @@ describe("FolderService", () => { expect(folders).toHaveLength(0); }); }); - - it("Decrypt", async () => { - const folder: Folder = { - id: "id", - name: mockEnc("encName"), - revisionDate: new Date("2022-01-31T12:00:00.000Z"), - }; - - const view = await folderService.decrypt(folder); - - expect(view).toEqual({ - id: "id", - name: "encName", - revisionDate: new Date("2022-01-31T12:00:00.000Z"), - }); - }); }); diff --git a/common/src/abstractions/folder.service.ts b/common/src/abstractions/folder.service.ts index 07d7ae1c..738305ad 100644 --- a/common/src/abstractions/folder.service.ts +++ b/common/src/abstractions/folder.service.ts @@ -7,7 +7,6 @@ import { FolderView } from "../models/view/folderView"; export abstract class FolderService { clearCache: (userId?: string) => Promise; encrypt: (model: FolderView, key?: SymmetricCryptoKey) => Promise; - decrypt: (model: Folder, key?: SymmetricCryptoKey) => Promise; get: (id: string) => Promise; getAll: () => Promise; getAllDecrypted: () => Promise; diff --git a/common/src/importers/bitwardenJsonImporter.ts b/common/src/importers/bitwardenJsonImporter.ts index 4fd49a03..c535b758 100644 --- a/common/src/importers/bitwardenJsonImporter.ts +++ b/common/src/importers/bitwardenJsonImporter.ts @@ -81,7 +81,7 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { const folder = FolderWithIdExport.toDomain(f); if (folder != null) { folder.id = null; - const view = await this.folderService.decrypt(folder); + const view = await FolderView.fromFolder(this.cryptoService, folder); groupingsMap.set(f.id, this.result.folders.length); this.result.folders.push(view); } diff --git a/common/src/models/domain/encString.ts b/common/src/models/domain/encString.ts index 74ae8370..142d025c 100644 --- a/common/src/models/domain/encString.ts +++ b/common/src/models/domain/encString.ts @@ -96,11 +96,10 @@ export class EncString { } } + /** + * @deprecated As of 2022-04-20, use {@link decryptWithCryptoService} instead + */ async decrypt(orgId: string, key: SymmetricCryptoKey = null): Promise { - if (this.decryptedValue != null) { - return this.decryptedValue; - } - let cryptoService: CryptoService; const containerService = (Utils.global as any).bitwardenContainerService; if (containerService) { @@ -109,8 +108,20 @@ export class EncString { throw new Error("global bitwardenContainerService not initialized."); } + return this.decryptWithCryptoService(cryptoService, orgId, key); + } + + async decryptWithCryptoService( + cryptoService: CryptoService, + orgId?: string, + key: SymmetricCryptoKey = null + ): Promise { + if (this.decryptedValue != null) { + return this.decryptedValue; + } + try { - if (key == null) { + if (orgId != null && key == null) { key = await cryptoService.getOrgKey(orgId); } this.decryptedValue = await cryptoService.decryptToUtf8(this, key); diff --git a/common/src/models/view/folderView.ts b/common/src/models/view/folderView.ts index 207332db..2c0d369a 100644 --- a/common/src/models/view/folderView.ts +++ b/common/src/models/view/folderView.ts @@ -1,9 +1,24 @@ +import { CryptoService } from "jslib-common/abstractions/crypto.service"; + +import { Folder } from "../domain/folder"; +import { SymmetricCryptoKey } from "../domain/symmetricCryptoKey"; import { ITreeNodeObject } from "../domain/treeNode"; -import { View } from "./view"; - -export class FolderView implements View, ITreeNodeObject { +export class FolderView implements ITreeNodeObject { id: string = null; name: string = null; revisionDate: Date = null; + + static async fromFolder( + cryptoService: CryptoService, + folder: Folder, + key?: SymmetricCryptoKey + ): Promise { + const view = new FolderView(); + view.id = folder.id; + view.name = await folder.name.decryptWithCryptoService(cryptoService, null, key); + view.revisionDate = folder.revisionDate; + + return view; + } }