import { ConditionalExcept, ConditionalKeys } from "type-fest"; import { EncString } from "../../../key-management/crypto/models/enc-string"; import { View } from "../../../models/view/view"; import { SymmetricCryptoKey } from "./symmetric-crypto-key"; // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type type EncStringKeys = ConditionalKeys, EncString>; export type DecryptedObject< TEncryptedObject, TDecryptedKeys extends EncStringKeys, > = Record & Omit; // extracts shared keys from the domain and view types type EncryptableKeys = (keyof D & ConditionalKeys) & (keyof V & ConditionalKeys); type DomainEncryptableKeys = { [key in ConditionalKeys]?: EncString | null | undefined; }; type ViewEncryptableKeys = { [key in ConditionalKeys]?: string | null | undefined; }; // https://contributing.bitwarden.com/architecture/clients/data-model#domain export default class Domain { protected buildDomainModel( domain: D, dataObj: any, map: any, notEncList: any[] = [], ) { for (const prop in map) { // eslint-disable-next-line if (!map.hasOwnProperty(prop)) { continue; } const objProp = dataObj[map[prop] || prop]; if (notEncList.indexOf(prop) > -1) { (domain as any)[prop] = objProp ? objProp : null; } else { (domain as any)[prop] = objProp ? new EncString(objProp) : null; } } } protected buildDataModel( domain: D, dataObj: any, map: any, notEncStringList: any[] = [], ) { for (const prop in map) { // eslint-disable-next-line if (!map.hasOwnProperty(prop)) { continue; } const objProp = (domain as any)[map[prop] || prop]; if (notEncStringList.indexOf(prop) > -1) { (dataObj as any)[prop] = objProp != null ? objProp : null; } else { (dataObj as any)[prop] = objProp != null ? (objProp as EncString).encryptedString : null; } } } protected async decryptObj( domain: DomainEncryptableKeys, viewModel: ViewEncryptableKeys, props: EncryptableKeys[], key: SymmetricCryptoKey | null = null, objectContext: string = "No Domain Context", ): Promise { for (const prop of props) { viewModel[prop] = (await domain[prop]?.decrypt( null, key, `Property: ${prop as string}; ObjectContext: ${objectContext}`, )) ?? null; } return viewModel as V; } }