From 5f05f736263fe7c28f94ad4102c3fa1c84028904 Mon Sep 17 00:00:00 2001 From: Thomas Avery <43214426+Thomas-Avery@users.noreply.github.com> Date: Thu, 2 Mar 2023 09:02:48 -0600 Subject: [PATCH] [SM-572] Hide Project's People and Service accounts tabs based on permission (#4885) * Hide tabs based on permission * Swap to a new endpoint * Swap to different server implementation * Swap to server's ProjectPermissionDetails * remove async * remove write access observable * Fix mac decrypt error --- .../models/view/project.view.ts | 5 ++++ .../models/responses/project.response.ts | 11 ++++++++ .../projects/project.service.ts | 28 ++++++++++++++----- .../projects/project/project.component.html | 6 ++-- .../projects/project/project.component.ts | 4 +-- .../access-policies/access-policy.service.ts | 10 ++++--- 6 files changed, 49 insertions(+), 15 deletions(-) diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts index 4566e3beca..0d8c55afee 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project.view.ts @@ -5,3 +5,8 @@ export class ProjectView { creationDate: string; revisionDate: string; } + +export class ProjectPermissionDetailsView extends ProjectView { + read: boolean; + write: boolean; +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/responses/project.response.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/responses/project.response.ts index 7603a35600..06fe62e6e1 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/responses/project.response.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/models/responses/project.response.ts @@ -16,3 +16,14 @@ export class ProjectResponse extends BaseResponse { this.revisionDate = this.getResponseProperty("RevisionDate"); } } + +export class ProjectPermissionDetailsResponse extends ProjectResponse { + read: boolean; + write: boolean; + + constructor(response: any) { + super(response); + this.read = this.getResponseProperty("Read"); + this.write = this.getResponseProperty("Write"); + } +} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts index a56112a55f..9484b9604c 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project.service.ts @@ -9,12 +9,15 @@ import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetric-cr import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { ProjectListView } from "../models/view/project-list.view"; -import { ProjectView } from "../models/view/project.view"; +import { ProjectPermissionDetailsView, ProjectView } from "../models/view/project.view"; import { BulkOperationStatus } from "../shared/dialogs/bulk-status-dialog.component"; import { ProjectRequest } from "./models/requests/project.request"; import { ProjectListItemResponse } from "./models/responses/project-list-item.response"; -import { ProjectResponse } from "./models/responses/project.response"; +import { + ProjectPermissionDetailsResponse, + ProjectResponse, +} from "./models/responses/project.response"; @Injectable({ providedIn: "root", @@ -29,10 +32,10 @@ export class ProjectService { private encryptService: EncryptService ) {} - async getByProjectId(projectId: string): Promise { + async getByProjectId(projectId: string): Promise { const r = await this.apiService.send("GET", "/projects/" + projectId, null, true, true); - const projectResponse = new ProjectResponse(r); - return await this.createProjectView(projectResponse); + const projectResponse = new ProjectPermissionDetailsResponse(r); + return await this.createProjectPermissionDetailsView(projectResponse); } async getProjects(organizationId: string): Promise { @@ -96,7 +99,9 @@ export class ProjectService { return request; } - private async createProjectView(projectResponse: ProjectResponse): Promise { + private async createProjectView( + projectResponse: ProjectResponse | ProjectPermissionDetailsResponse + ) { const orgKey = await this.getOrganizationKey(projectResponse.organizationId); const projectView = new ProjectView(); @@ -108,10 +113,19 @@ export class ProjectService { new EncString(projectResponse.name), orgKey ); - return projectView; } + private async createProjectPermissionDetailsView( + projectResponse: ProjectPermissionDetailsResponse + ): Promise { + return { + ...(await this.createProjectView(projectResponse)), + read: projectResponse.read, + write: projectResponse.write, + }; + } + private async createProjectsListView( organizationId: string, projects: ProjectListItemResponse[] diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.html index f62767c1df..85443e577f 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.html @@ -4,8 +4,10 @@ {{ "secrets" | i18n }} - {{ "people" | i18n }} - {{ "serviceAccounts" | i18n }} + + {{ "people" | i18n }} + {{ "serviceAccounts" | i18n }} + diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts index 393ea33d55..9e7ea933cf 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/project/project.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { Observable, switchMap } from "rxjs"; -import { ProjectView } from "../../models/view/project.view"; +import { ProjectPermissionDetailsView } from "../../models/view/project.view"; import { ProjectService } from "../project.service"; @Component({ @@ -10,7 +10,7 @@ import { ProjectService } from "../project.service"; templateUrl: "./project.component.html", }) export class ProjectComponent implements OnInit { - project$: Observable; + project$: Observable; constructor(private route: ActivatedRoute, private projectService: ProjectService) {} diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts index 79aee4a0e8..c99161b8a1 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/access-policies/access-policy.service.ts @@ -277,10 +277,12 @@ export class AccessPolicyService { ...this.createBaseAccessPolicyView(response), grantedProjectId: response.grantedProjectId, serviceAccountId: response.serviceAccountId, - grantedProjectName: await this.encryptService.decryptToUtf8( - new EncString(response.grantedProjectName), - organizationKey - ), + grantedProjectName: response.grantedProjectName + ? await this.encryptService.decryptToUtf8( + new EncString(response.grantedProjectName), + organizationKey + ) + : null, serviceAccountName: await this.encryptService.decryptToUtf8( new EncString(response.serviceAccountName), organizationKey