From d0d2676f998129ebd98bf70cf677531ad29d1b01 Mon Sep 17 00:00:00 2001 From: Thomas Avery Date: Thu, 7 Nov 2024 11:48:24 -0600 Subject: [PATCH] Add handling missing private key in initialize org crypto for SdkService --- .../src/services/jslib-services.module.ts | 1 + .../services/sdk/default-sdk.service.spec.ts | 4 +++ .../services/sdk/default-sdk.service.ts | 30 +++++++++++++------ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 340e8f567cb..6285466da4e 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -1370,6 +1370,7 @@ const safeProviders: SafeProvider[] = [ KdfConfigServiceAbstraction, KeyServiceAbstraction, ApiServiceAbstraction, + LogService, ], }), safeProvider({ diff --git a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts index ff82b3aa764..8ed9fa7b69c 100644 --- a/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts +++ b/libs/common/src/platform/services/sdk/default-sdk.service.spec.ts @@ -11,6 +11,7 @@ import { PBKDF2KdfConfig } from "../../../auth/models/domain/kdf-config"; import { UserId } from "../../../types/guid"; import { UserKey } from "../../../types/key"; import { Environment, EnvironmentService } from "../../abstractions/environment.service"; +import { LogService } from "../../abstractions/log.service"; import { PlatformUtilsService } from "../../abstractions/platform-utils.service"; import { SdkClientFactory } from "../../abstractions/sdk/sdk-client-factory"; import { EncryptedString } from "../../models/domain/enc-string"; @@ -27,6 +28,7 @@ describe("DefaultSdkService", () => { let kdfConfigService!: MockProxy; let keyService!: MockProxy; let apiService!: MockProxy; + let logService!: MockProxy; let service!: DefaultSdkService; let mockClient!: MockProxy; @@ -39,6 +41,7 @@ describe("DefaultSdkService", () => { kdfConfigService = mock(); keyService = mock(); apiService = mock(); + logService = mock(); // Can't use `of(mock())` for some reason environmentService.environment$ = new BehaviorSubject(mock()); @@ -51,6 +54,7 @@ describe("DefaultSdkService", () => { kdfConfigService, keyService, apiService, + logService, ); mockClient = mock(); diff --git a/libs/common/src/platform/services/sdk/default-sdk.service.ts b/libs/common/src/platform/services/sdk/default-sdk.service.ts index b25ede006c5..04fefa2280c 100644 --- a/libs/common/src/platform/services/sdk/default-sdk.service.ts +++ b/libs/common/src/platform/services/sdk/default-sdk.service.ts @@ -27,6 +27,7 @@ import { DeviceType } from "../../../enums/device-type.enum"; import { OrganizationId, UserId } from "../../../types/guid"; import { UserKey } from "../../../types/key"; import { Environment, EnvironmentService } from "../../abstractions/environment.service"; +import { LogService } from "../../abstractions/log.service"; import { PlatformUtilsService } from "../../abstractions/platform-utils.service"; import { SdkClientFactory } from "../../abstractions/sdk/sdk-client-factory"; import { SdkService } from "../../abstractions/sdk/sdk.service"; @@ -59,6 +60,7 @@ export class DefaultSdkService implements SdkService { private kdfConfigService: KdfConfigService, private keyService: KeyService, private apiService: ApiService, // Yes we shouldn't import ApiService, but it's temporary + private logService: LogService, private userAgent: string = null, ) {} @@ -181,15 +183,25 @@ export class DefaultSdkService implements SdkService { privateKey, }); - // We initialize the org crypto even if the org_keys are - // null to make sure any existing org keys are cleared. - await client.crypto().initialize_org_crypto({ - organizationKeys: new Map( - Object.entries(orgKeys ?? {}) - .filter(([_, v]) => v.type === "organization") - .map(([k, v]) => [k, v.key]), - ), - }); + try { + // We initialize the org crypto even if the org_keys are + // null to make sure any existing org keys are cleared. + await client.crypto().initialize_org_crypto({ + organizationKeys: new Map( + Object.entries(orgKeys ?? {}) + .filter(([_, v]) => v.type === "organization") + .map(([k, v]) => [k, v.key]), + ), + }); + } catch (e) { + if (e.message === "Missing private key") { + this.logService.warning( + "[SdkService] organization crypto not initialized, missing private key", + ); + } else { + throw e; + } + } } private toSettings(env: Environment): ClientSettings {