diff --git a/libs/common/spec/utils.ts b/libs/common/spec/utils.ts index db9a7e0842c..1eb4ab2d6a7 100644 --- a/libs/common/spec/utils.ts +++ b/libs/common/spec/utils.ts @@ -2,8 +2,11 @@ // @ts-strict-ignore import { mock, MockProxy } from "jest-mock-extended"; -import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; +import { ContainerService } from "@bitwarden/common/platform/services/container.service"; +import { KeyService } from "@bitwarden/key-management"; +import { EncryptService } from "../src/key-management/crypto/abstractions/encrypt.service"; +import { EncString } from "../src/key-management/crypto/models/enc-string"; import { EncryptionType } from "../src/platform/enums"; import { Utils } from "../src/platform/misc/utils"; import { SymmetricCryptoKey } from "../src/platform/models/domain/symmetric-crypto-key"; @@ -27,8 +30,10 @@ export function BuildTestObject( return Object.assign(constructor === null ? {} : new constructor(), def) as T; } +/** @deprecated */ export function mockEnc(s: string): MockProxy { const mocked = mock(); + mocked.data = s; mocked.decrypt.mockResolvedValue(s); return mocked; @@ -77,4 +82,12 @@ export const mockFromSdk = (stub: any) => { return `${stub}_fromSdk`; }; +export const mockContainerService = () => { + // Mock the container service for decryption + const keyService = mock(); + const encryptService = mock(); + (window as any).bitwardenContainerService = new ContainerService(keyService, encryptService); + return (window as any).bitwardenContainerService; +}; + export { trackEmissions, awaitAsync } from "@bitwarden/core-test-utils"; diff --git a/libs/common/src/platform/interfaces/decryptable.interface.ts b/libs/common/src/platform/interfaces/decryptable.interface.ts index 35895bfd6ff..367af3472f2 100644 --- a/libs/common/src/platform/interfaces/decryptable.interface.ts +++ b/libs/common/src/platform/interfaces/decryptable.interface.ts @@ -1,3 +1,5 @@ +import { UserId } from "@bitwarden/user-core"; + import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key"; import { InitializerMetadata } from "./initializer-metadata.interface"; @@ -8,5 +10,6 @@ import { InitializerMetadata } from "./initializer-metadata.interface"; * @example Cipher implements Decryptable */ export interface Decryptable extends InitializerMetadata { - decrypt: (key: SymmetricCryptoKey) => Promise; + /** @deprecated - Encryption and decryption of domain objects should be implemented in the SDK */ + decrypt: (key: SymmetricCryptoKey, userId?: UserId) => Promise; } diff --git a/libs/common/src/platform/models/domain/domain-base.ts b/libs/common/src/platform/models/domain/domain-base.ts index a144353f5bc..35d3c7ecbad 100644 --- a/libs/common/src/platform/models/domain/domain-base.ts +++ b/libs/common/src/platform/models/domain/domain-base.ts @@ -1,32 +1,41 @@ import { ConditionalExcept, ConditionalKeys } from "type-fest"; +import { UserId } from "@bitwarden/user-core"; + import { EncString } from "../../../key-management/crypto/models/enc-string"; import { View } from "../../../models/view/view"; import { SymmetricCryptoKey } from "./symmetric-crypto-key"; +/** @deprecated */ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type type EncStringKeys = ConditionalKeys, EncString>; +/** @deprecated */ export type DecryptedObject< TEncryptedObject, TDecryptedKeys extends EncStringKeys, > = Record & Omit; // extracts shared keys from the domain and view types +/** @deprecated */ type EncryptableKeys = (keyof D & ConditionalKeys) & (keyof V & ConditionalKeys); +/** @deprecated */ type DomainEncryptableKeys = { [key in ConditionalKeys]?: EncString | null | undefined; }; +/** @deprecated */ type ViewEncryptableKeys = { [key in ConditionalKeys]?: string | null | undefined; }; // https://contributing.bitwarden.com/architecture/clients/data-model#domain +/** @deprecated encryption and decryption of domain objects should be moved to the SDK */ export default class Domain { + /** @deprecated */ protected buildDomainModel( domain: D, dataObj: any, @@ -48,6 +57,7 @@ export default class Domain { } } + /** @deprecated */ protected buildDataModel( domain: D, dataObj: any, @@ -69,6 +79,7 @@ export default class Domain { } } + /** @deprecated */ protected async decryptObj( domain: DomainEncryptableKeys, viewModel: ViewEncryptableKeys, @@ -76,6 +87,8 @@ export default class Domain { orgId: string | null, key: SymmetricCryptoKey | null = null, objectContext: string = "No Domain Context", + // Unused until a follow-up PR in the PR-chain merges + userId: UserId | null = null, ): Promise { for (const prop of props) { viewModel[prop] =