From 48643e45ea2ea9f09f2df7743c26e4c07f29111a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rui=20Tom=C3=A9?= <108268980+r-tome@users.noreply.github.com> Date: Thu, 11 Jan 2024 21:54:11 +0000 Subject: [PATCH] =?UTF-8?q?[AC-1893]=C2=A0Removed=20logic=20to=20downgrade?= =?UTF-8?q?=20Manager=20roles=20and=20remove=20Edit/Delete=20any=20collect?= =?UTF-8?q?ion=20permissions=20for=20Flexible=20Collections=20(#7365)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../browser/src/background/main.background.ts | 1 - apps/cli/src/bw.ts | 1 - .../sm-subscribe-standalone.component.ts | 9 +----- .../src/services/jslib-services.module.ts | 1 - .../organization.service.abstraction.ts | 10 ++----- .../organization/organization.service.spec.ts | 6 ++-- .../organization/organization.service.ts | 28 ++++--------------- .../src/vault/services/sync/sync.service.ts | 16 ++--------- 8 files changed, 14 insertions(+), 58 deletions(-) diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index cb6e1d4f993..438a0aa802c 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -581,7 +581,6 @@ export default class MainBackground { this.folderApiService, this.organizationService, this.sendApiService, - this.configService, logoutCallback, ); this.eventUploadService = new EventUploadService( diff --git a/apps/cli/src/bw.ts b/apps/cli/src/bw.ts index 8e887e7a330..333d6953ca5 100644 --- a/apps/cli/src/bw.ts +++ b/apps/cli/src/bw.ts @@ -480,7 +480,6 @@ export class Main { this.folderApiService, this.organizationService, this.sendApiService, - this.configService, async (expired: boolean) => await this.logout(), ); diff --git a/apps/web/src/app/billing/organizations/sm-subscribe-standalone.component.ts b/apps/web/src/app/billing/organizations/sm-subscribe-standalone.component.ts index e2b3107ae78..1f8b70e03fe 100644 --- a/apps/web/src/app/billing/organizations/sm-subscribe-standalone.component.ts +++ b/apps/web/src/app/billing/organizations/sm-subscribe-standalone.component.ts @@ -9,8 +9,6 @@ import { Organization } from "@bitwarden/common/admin-console/models/domain/orga import { SecretsManagerSubscribeRequest } from "@bitwarden/common/billing/models/request/sm-subscribe.request"; import { BillingCustomerDiscount } from "@bitwarden/common/billing/models/response/organization-subscription.response"; import { PlanResponse } from "@bitwarden/common/billing/models/response/plan.response"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -35,7 +33,6 @@ export class SecretsManagerSubscribeStandaloneComponent { private i18nService: I18nService, private organizationApiService: OrganizationApiServiceAbstraction, private organizationService: InternalOrganizationServiceAbstraction, - private configService: ConfigServiceAbstraction, ) {} submit = async () => { @@ -55,11 +52,7 @@ export class SecretsManagerSubscribeStandaloneComponent { isMember: this.organization.isMember, isProviderUser: this.organization.isProviderUser, }); - const flexibleCollectionsEnabled = await this.configService.getFeatureFlag( - FeatureFlag.FlexibleCollections, - false, - ); - await this.organizationService.upsert(organizationData, flexibleCollectionsEnabled); + await this.organizationService.upsert(organizationData); /* Because subscribing to Secrets Manager automatically provides access to Secrets Manager for the diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index a22b2899f92..b0d273c70f6 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -461,7 +461,6 @@ import { ModalService } from "./modal.service"; FolderApiServiceAbstraction, OrganizationServiceAbstraction, SendApiServiceAbstraction, - ConfigServiceAbstraction, LOGOUT_CALLBACK, ], }, diff --git a/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts b/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts index f35f1e4dbb1..603ef54b6bb 100644 --- a/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts +++ b/libs/common/src/admin-console/abstractions/organization/organization.service.abstraction.ts @@ -95,12 +95,6 @@ export abstract class OrganizationService { } export abstract class InternalOrganizationServiceAbstraction extends OrganizationService { - replace: ( - organizations: { [id: string]: OrganizationData }, - flexibleCollectionsEnabled: boolean, - ) => Promise; - upsert: ( - OrganizationData: OrganizationData | OrganizationData[], - flexibleCollectionsEnabled: boolean, - ) => Promise; + replace: (organizations: { [id: string]: OrganizationData }) => Promise; + upsert: (OrganizationData: OrganizationData | OrganizationData[]) => Promise; } diff --git a/libs/common/src/admin-console/services/organization/organization.service.spec.ts b/libs/common/src/admin-console/services/organization/organization.service.spec.ts index 5dc2fd7d522..598b24f3300 100644 --- a/libs/common/src/admin-console/services/organization/organization.service.spec.ts +++ b/libs/common/src/admin-console/services/organization/organization.service.spec.ts @@ -110,7 +110,7 @@ describe("Organization Service", () => { }); it("upsert", async () => { - await organizationService.upsert(organizationData("2", "Test 2"), false); + await organizationService.upsert(organizationData("2", "Test 2")); expect(await firstValueFrom(organizationService.organizations$)).toEqual([ { @@ -146,7 +146,7 @@ describe("Organization Service", () => { describe("delete", () => { it("exists", async () => { - await organizationService.delete("1", false); + await organizationService.delete("1"); expect(stateService.getOrganizations).toHaveBeenCalledTimes(2); @@ -154,7 +154,7 @@ describe("Organization Service", () => { }); it("does not exist", async () => { - organizationService.delete("1", false); + organizationService.delete("1"); expect(stateService.getOrganizations).toHaveBeenCalledTimes(2); }); diff --git a/libs/common/src/admin-console/services/organization/organization.service.ts b/libs/common/src/admin-console/services/organization/organization.service.ts index a54c9885260..b10f24ca851 100644 --- a/libs/common/src/admin-console/services/organization/organization.service.ts +++ b/libs/common/src/admin-console/services/organization/organization.service.ts @@ -5,7 +5,6 @@ import { InternalOrganizationServiceAbstraction, isMember, } from "../../abstractions/organization/organization.service.abstraction"; -import { OrganizationUserType } from "../../enums"; import { OrganizationData } from "../../models/data/organization.data"; import { Organization } from "../../models/domain/organization"; @@ -52,7 +51,7 @@ export class OrganizationService implements InternalOrganizationServiceAbstracti return organizations.length > 0; } - async upsert(organization: OrganizationData, flexibleCollectionsEnabled: boolean): Promise { + async upsert(organization: OrganizationData): Promise { let organizations = await this.stateService.getOrganizations(); if (organizations == null) { organizations = {}; @@ -60,10 +59,10 @@ export class OrganizationService implements InternalOrganizationServiceAbstracti organizations[organization.id] = organization; - await this.replace(organizations, flexibleCollectionsEnabled); + await this.replace(organizations); } - async delete(id: string, flexibleCollectionsEnabled: boolean): Promise { + async delete(id: string): Promise { const organizations = await this.stateService.getOrganizations(); if (organizations == null) { return; @@ -74,7 +73,7 @@ export class OrganizationService implements InternalOrganizationServiceAbstracti } delete organizations[id]; - await this.replace(organizations, flexibleCollectionsEnabled); + await this.replace(organizations); } get(id: string): Organization { @@ -103,24 +102,7 @@ export class OrganizationService implements InternalOrganizationServiceAbstracti return organizations.find((organization) => organization.identifier === identifier); } - async replace( - organizations: { [id: string]: OrganizationData }, - flexibleCollectionsEnabled: boolean, - ) { - // If Flexible Collections is enabled, treat Managers as Users and ignore deprecated permissions - if (flexibleCollectionsEnabled) { - Object.values(organizations).forEach((o) => { - if (o.type === OrganizationUserType.Manager) { - o.type = OrganizationUserType.User; - } - - if (o.permissions != null) { - o.permissions.editAssignedCollections = false; - o.permissions.deleteAssignedCollections = false; - } - }); - } - + async replace(organizations: { [id: string]: OrganizationData }) { await this.stateService.setOrganizations(organizations); this.updateObservables(organizations); } diff --git a/libs/common/src/vault/services/sync/sync.service.ts b/libs/common/src/vault/services/sync/sync.service.ts index 9195e39311b..6187d234e5d 100644 --- a/libs/common/src/vault/services/sync/sync.service.ts +++ b/libs/common/src/vault/services/sync/sync.service.ts @@ -10,7 +10,6 @@ import { ProviderData } from "../../../admin-console/models/data/provider.data"; import { PolicyResponse } from "../../../admin-console/models/response/policy.response"; import { KeyConnectorService } from "../../../auth/abstractions/key-connector.service"; import { ForceSetPasswordReason } from "../../../auth/models/domain/force-set-password-reason"; -import { FeatureFlag } from "../../../enums/feature-flag.enum"; import { DomainsResponse } from "../../../models/response/domains.response"; import { SyncCipherNotification, @@ -18,7 +17,6 @@ import { SyncSendNotification, } from "../../../models/response/notification.response"; import { ProfileResponse } from "../../../models/response/profile.response"; -import { ConfigServiceAbstraction } from "../../../platform/abstractions/config/config.service.abstraction"; import { CryptoService } from "../../../platform/abstractions/crypto.service"; import { LogService } from "../../../platform/abstractions/log.service"; import { MessagingService } from "../../../platform/abstractions/messaging.service"; @@ -61,7 +59,6 @@ export class SyncService implements SyncServiceAbstraction { private folderApiService: FolderApiServiceAbstraction, private organizationService: InternalOrganizationServiceAbstraction, private sendApiService: SendApiService, - private configService: ConfigServiceAbstraction, private logoutCallback: (expired: boolean) => Promise, ) {} @@ -321,11 +318,7 @@ export class SyncService implements SyncServiceAbstraction { await this.setForceSetPasswordReasonIfNeeded(response); - const flexibleCollectionsEnabled = await this.configService.getFeatureFlag( - FeatureFlag.FlexibleCollections, - false, - ); - await this.syncProfileOrganizations(response, flexibleCollectionsEnabled); + await this.syncProfileOrganizations(response); const providers: { [id: string]: ProviderData } = {}; response.providers.forEach((p) => { @@ -393,10 +386,7 @@ export class SyncService implements SyncServiceAbstraction { } } - private async syncProfileOrganizations( - response: ProfileResponse, - flexibleCollectionsEnabled: boolean, - ) { + private async syncProfileOrganizations(response: ProfileResponse) { const organizations: { [id: string]: OrganizationData } = {}; response.organizations.forEach((o) => { organizations[o.id] = new OrganizationData(o, { @@ -416,7 +406,7 @@ export class SyncService implements SyncServiceAbstraction { } }); - await this.organizationService.replace(organizations, flexibleCollectionsEnabled); + await this.organizationService.replace(organizations); } private async syncFolders(response: FolderResponse[]) {