From a426586d6dd026ddf2916978ac57d92a6a0ad309 Mon Sep 17 00:00:00 2001 From: Daniel James Smith Date: Thu, 4 Sep 2025 18:32:59 +0200 Subject: [PATCH] Use new vault-export-api.service instead of the ApiService to retrieve organizational export data --- .../service-container/service-container.ts | 6 +- .../src/services/jslib-services.module.ts | 9 ++- .../src/services/org-vault-export.service.ts | 58 +++++++++---------- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/apps/cli/src/service-container/service-container.ts b/apps/cli/src/service-container/service-container.ts index 76eeb340550..93d16c54a71 100644 --- a/apps/cli/src/service-container/service-container.ts +++ b/apps/cli/src/service-container/service-container.ts @@ -179,6 +179,7 @@ import { SerializedMemoryStorageService } from "@bitwarden/storage-core"; import { IndividualVaultExportService, IndividualVaultExportServiceAbstraction, + VaultExportApiService, OrganizationVaultExportService, OrganizationVaultExportServiceAbstraction, VaultExportService, @@ -241,6 +242,7 @@ export class ServiceContainer { importService: ImportServiceAbstraction; importApiService: ImportApiServiceAbstraction; exportService: VaultExportServiceAbstraction; + vaultExportApiService: VaultExportApiService; individualExportService: IndividualVaultExportServiceAbstraction; organizationExportService: OrganizationVaultExportServiceAbstraction; searchService: SearchService; @@ -844,9 +846,11 @@ export class ServiceContainer { this.restrictedItemTypesService, ); + this.vaultExportApiService = new VaultExportApiService(this.apiService); + this.organizationExportService = new OrganizationVaultExportService( this.cipherService, - this.apiService, + this.vaultExportApiService, this.pinService, this.keyService, this.encryptService, diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index 5066cabd05a..31d3c29d914 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -342,6 +342,8 @@ import { PasswordRepromptService } from "@bitwarden/vault"; import { IndividualVaultExportService, IndividualVaultExportServiceAbstraction, + VaultExportApiService, + VaultExportApiServiceAbstraction, OrganizationVaultExportService, OrganizationVaultExportServiceAbstraction, VaultExportService, @@ -886,12 +888,17 @@ const safeProviders: SafeProvider[] = [ RestrictedItemTypesService, ], }), + safeProvider({ + provide: VaultExportApiServiceAbstraction, + useClass: VaultExportApiService, + deps: [ApiServiceAbstraction], + }), safeProvider({ provide: OrganizationVaultExportServiceAbstraction, useClass: OrganizationVaultExportService, deps: [ CipherServiceAbstraction, - ApiServiceAbstraction, + VaultExportApiServiceAbstraction, PinServiceAbstraction, KeyService, EncryptService, diff --git a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts index 404a5d6cf3c..7c6736df6da 100644 --- a/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts +++ b/libs/tools/export/vault-export/vault-export-core/src/services/org-vault-export.service.ts @@ -10,7 +10,6 @@ import { CollectionDetailsResponse, CollectionView, } from "@bitwarden/admin-console/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service"; @@ -34,6 +33,7 @@ import { ExportedVaultAsString, } from "../types"; +import { VaultExportApiServiceAbstraction } from "./api/vault-export-api.service.abstraction"; import { BaseVaultExportService } from "./base-vault-export.service"; import { ExportHelper } from "./export-helper"; import { OrganizationVaultExportServiceAbstraction } from "./org-vault-export.service.abstraction"; @@ -45,7 +45,7 @@ export class OrganizationVaultExportService { constructor( private cipherService: CipherService, - private apiService: ApiService, + private vaultExportApiService: VaultExportApiServiceAbstraction, pinService: PinServiceAbstraction, private keyService: KeyService, encryptService: EncryptService, @@ -138,7 +138,7 @@ export class OrganizationVaultExportService const restrictions = await firstValueFrom(this.restrictedItemTypesService.restricted$); promises.push( - this.apiService.getOrganizationExport(organizationId).then((exportData) => { + this.vaultExportApiService.getOrganizationExport(organizationId as OrganizationId).then((exportData) => { const exportPromises: any = []; if (exportData != null) { if (exportData.collections != null && exportData.collections.length > 0) { @@ -188,39 +188,35 @@ export class OrganizationVaultExportService private async getOrganizationEncryptedExport(organizationId: string): Promise { const collections: Collection[] = []; - let ciphers: Cipher[] = []; - const promises = []; - - promises.push( - this.apiService.getCollections(organizationId).then((c) => { - if (c != null && c.data != null && c.data.length > 0) { - c.data.forEach((r) => { - const collection = Collection.fromCollectionData( - new CollectionData(r as CollectionDetailsResponse), - ); - collections.push(collection); - }); - } - }), - ); + const ciphers: Cipher[] = []; const restrictions = await firstValueFrom(this.restrictedItemTypesService.restricted$); - promises.push( - this.apiService.getCiphersOrganization(organizationId).then((c) => { - if (c != null && c.data != null && c.data.length > 0) { - ciphers = c.data - .filter((item) => item.deletedDate === null) - .map((item) => new Cipher(new CipherData(item))) - .filter( - (cipher) => !this.restrictedItemTypesService.isCipherRestricted(cipher, restrictions), - ); - } - }), - ); + const exportData = await this.vaultExportApiService.getOrganizationExport(organizationId as OrganizationId); - await Promise.all(promises); + if (exportData == null) { + return; + } + if (exportData.collections != null && exportData.collections.length > 0) { + exportData.collections.forEach((c) => { + const collection = Collection.fromCollectionData( + new CollectionData(c as CollectionDetailsResponse), + ); + collections.push(collection); + }); + } + + if (exportData.ciphers != null && exportData.ciphers.length > 0) { + exportData.ciphers + .filter((c) => c.deletedDate === null) + .forEach((c) => { + const cipher = new Cipher(new CipherData(c)); + if (!this.restrictedItemTypesService.isCipherRestricted(cipher, restrictions)) { + ciphers.push(cipher); + } + }); + } return this.BuildEncryptedExport(organizationId, collections, ciphers); }