import { ApiService } from '../abstractions/api.service'; import { CryptoService } from '../abstractions/crypto.service'; import { KeyConnectorService as KeyConnectorServiceAbstraction } from '../abstractions/keyConnector.service'; import { LogService } from '../abstractions/log.service'; import { OrganizationService } from '../abstractions/organization.service'; import { StateService } from '../abstractions/state.service'; import { TokenService } from '../abstractions/token.service'; import { OrganizationUserType } from '../enums/organizationUserType'; import { Utils } from '../misc/utils'; import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey'; import { KeyConnectorUserKeyRequest } from '../models/request/keyConnectorUserKeyRequest'; export class KeyConnectorService implements KeyConnectorServiceAbstraction { constructor(private stateService: StateService, private cryptoService: CryptoService, private apiService: ApiService, private tokenService: TokenService, private logService: LogService, private organizationService: OrganizationService) { } setUsesKeyConnector(usesKeyConnector: boolean) { return this.stateService.setUsesKeyConnector(usesKeyConnector); } async getUsesKeyConnector(): Promise { return await this.stateService.getUsesKeyConnector(); } async userNeedsMigration() { const loggedInUsingSso = this.tokenService.getIsExternal(); const requiredByOrganization = await this.getManagingOrganization() != null; const userIsNotUsingKeyConnector = !await this.getUsesKeyConnector(); return loggedInUsingSso && requiredByOrganization && userIsNotUsingKeyConnector; } async migrateUser() { const organization = await this.getManagingOrganization(); const key = await this.cryptoService.getKey(); try { const keyConnectorRequest = new KeyConnectorUserKeyRequest(key.encKeyB64); await this.apiService.postUserKeyToKeyConnector(organization.keyConnectorUrl, keyConnectorRequest); } catch (e) { throw new Error('Unable to reach key connector'); } await this.apiService.postConvertToKeyConnector(); } async getAndSetKey(url: string) { try { const userKeyResponse = await this.apiService.getUserKeyFromKeyConnector(url); const keyArr = Utils.fromB64ToArray(userKeyResponse.key); const k = new SymmetricCryptoKey(keyArr); await this.cryptoService.setKey(k); } catch (e) { this.logService.error(e); throw new Error('Unable to reach key connector'); } } async getManagingOrganization() { const orgs = await this.organizationService.getAll(); return orgs.find(o => o.keyConnectorEnabled && o.type !== OrganizationUserType.Admin && o.type !== OrganizationUserType.Owner && !o.isProviderUser); } async setConvertAccountRequired(status: boolean) { await this.stateService.setConvertAccountToKeyConnector(status); } async getConvertAccountRequired(): Promise { return await this.stateService.getConvertAccountToKeyConnector(); } async removeConvertAccountRequired() { await this.stateService.setConvertAccountToKeyConnector(null); } async clear() { await this.removeConvertAccountRequired(); } }