diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json index 3eb89f11ffd..fe82e53d922 100644 --- a/apps/web/src/locales/en/messages.json +++ b/apps/web/src/locales/en/messages.json @@ -8581,6 +8581,14 @@ "message": "New project", "description": "Title for creating a new project." }, + "clickToRenameProject": { + "message": "Click to rename this project", + "description": "Tooltip text for corrupted project names that can be clicked to rename." + }, + "cannotDecryptProjectName": { + "message": "Cannot decrypt project name - click project to rename", + "description": "Tooltip text for project badges when the project name cannot be decrypted." + }, "softDeleteSecretWarning": { "message": "Deleting secrets can affect existing integrations.", "description": "Warns that deleting secrets can have consequences on integrations" diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts index df15d3fc373..eaca1060834 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/project-list.view.ts @@ -9,4 +9,5 @@ export class ProjectListView { read: boolean; write: boolean; linkable: boolean; + decryptionError: boolean = false; } 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 7f501467d32..636f26b7b92 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 @@ -8,4 +8,5 @@ export class ProjectView { revisionDate: string; read: boolean; write: boolean; + decryptionError: boolean = false; } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-project.view.ts b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-project.view.ts index 50951b0cd90..2976e7568b8 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-project.view.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/models/view/secret-project.view.ts @@ -3,4 +3,5 @@ export class SecretProjectView { id: string; name: string; + decryptionError: boolean = false; } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts index 2f6b2229d75..24e3c03c5da 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/projects/dialog/project-dialog.component.ts @@ -48,7 +48,9 @@ export class ProjectDialogComponent implements OnInit { private platformUtilsService: PlatformUtilsService, private router: Router, private toastService: ToastService, - ) {} + ) { + this.loading = data.operation === OperationType.Edit; + } async ngOnInit() { if (this.data.operation === OperationType.Edit && this.data.projectId) { 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 5d350a684a5..ce2a02bebb6 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 @@ -7,7 +7,10 @@ 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 { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; -import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; +import { + DECRYPT_ERROR, + EncString, +} from "@bitwarden/common/key-management/crypto/models/enc-string"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { OrganizationId } from "@bitwarden/common/types/guid"; @@ -136,10 +139,15 @@ export class ProjectService { projectView.revisionDate = projectResponse.revisionDate; projectView.read = projectResponse.read; projectView.write = projectResponse.write; - projectView.name = await this.encryptService.decryptString( - new EncString(projectResponse.name), - orgKey, - ); + try { + projectView.name = await this.encryptService.decryptString( + new EncString(projectResponse.name), + orgKey, + ); + } catch { + projectView.name = DECRYPT_ERROR; + projectView.decryptionError = true; + } return projectView; } @@ -155,10 +163,15 @@ export class ProjectService { projectListView.organizationId = s.organizationId; projectListView.read = s.read; projectListView.write = s.write; - projectListView.name = await this.encryptService.decryptString( - new EncString(s.name), - orgKey, - ); + try { + projectListView.name = await this.encryptService.decryptString( + new EncString(s.name), + orgKey, + ); + } catch { + projectListView.name = DECRYPT_ERROR; + projectListView.decryptionError = true; + } projectListView.creationDate = s.creationDate; projectListView.revisionDate = s.revisionDate; projectListView.linkable = true; diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts index 606cb835ff1..3e560ff6674 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.spec.ts @@ -130,6 +130,7 @@ const secretView: SecretView = { { id: "502d93ae-a084-490a-8a64-b187015eb69c", name: "project-name", + decryptionError: false, }, ], read: true, @@ -156,6 +157,7 @@ const expectedSecretView: SecretView = { { id: "502d93ae-a084-490a-8a64-b187015eb69c", name: mockUnencryptedData, + decryptionError: false, }, ], read: true, diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts index c37a7bee2a4..6d38102274e 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/secrets/secret.service.ts @@ -7,7 +7,10 @@ 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 { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; -import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; +import { + DECRYPT_ERROR, + EncString, +} from "@bitwarden/common/key-management/crypto/models/enc-string"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { OrganizationId } from "@bitwarden/common/types/guid"; import { KeyService } from "@bitwarden/key-management"; @@ -270,9 +273,14 @@ export class SecretService { projects.map(async (s: SecretProjectResponse) => { const projectsMappedToSecretView = new SecretProjectView(); projectsMappedToSecretView.id = s.id; - projectsMappedToSecretView.name = s.name - ? await this.encryptService.decryptString(new EncString(s.name), orgKey) - : null; + try { + projectsMappedToSecretView.name = s.name + ? await this.encryptService.decryptString(new EncString(s.name), orgKey) + : null; + } catch { + projectsMappedToSecretView.name = DECRYPT_ERROR; + projectsMappedToSecretView.decryptionError = true; + } return projectsMappedToSecretView; }), ); diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts index c45f230bf7a..c489c61b680 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts +++ b/bitwarden_license/bit-web/src/app/secrets-manager/settings/services/sm-porting-api.service.ts @@ -7,7 +7,10 @@ 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 { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; -import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; +import { + DECRYPT_ERROR, + EncString, +} from "@bitwarden/common/key-management/crypto/models/enc-string"; import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { OrganizationId } from "@bitwarden/common/types/guid"; @@ -147,7 +150,11 @@ export class SecretsManagerPortingApiService { exportData.projects.map(async (p) => { const project = new SecretsManagerExportProject(); project.id = p.id; - project.name = await this.encryptService.decryptString(new EncString(p.name), orgKey); + try { + project.name = await this.encryptService.decryptString(new EncString(p.name), orgKey); + } catch { + project.name = DECRYPT_ERROR; + } return project; }), ); 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 18f6313b95c..74886c0ab62 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 @@ -7,7 +7,10 @@ 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 { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; -import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; +import { + DECRYPT_ERROR, + EncString, +} from "@bitwarden/common/key-management/crypto/models/enc-string"; import { ListResponse } from "@bitwarden/common/models/response/list.response"; import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key"; import { OrganizationId } from "@bitwarden/common/types/guid"; @@ -359,15 +362,21 @@ export class AccessPolicyService { organizationKey: SymmetricCryptoKey, response: GrantedProjectAccessPolicyResponse, ): Promise { + let projectName = null; + if (response.grantedProjectName) { + try { + projectName = await this.encryptService.decryptString( + new EncString(response.grantedProjectName), + organizationKey, + ); + } catch { + projectName = DECRYPT_ERROR; + } + } return { ...this.createBaseAccessPolicyView(response), grantedProjectId: response.grantedProjectId, - grantedProjectName: response.grantedProjectName - ? await this.encryptService.decryptString( - new EncString(response.grantedProjectName), - organizationKey, - ) - : null, + grantedProjectName: projectName, }; } @@ -432,9 +441,15 @@ export class AccessPolicyService { view.currentUserInGroup = r.currentUserInGroup; if (r.type === "serviceAccount" || r.type === "project") { - view.name = r.name - ? await this.encryptService.decryptString(new EncString(r.name), orgKey) - : null; + if (r.name) { + try { + view.name = await this.encryptService.decryptString(new EncString(r.name), orgKey); + } catch { + view.name = DECRYPT_ERROR; + } + } else { + view.name = null; + } } else { view.name = r.name; } diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.html index c205d60b977..f4c208b88d3 100644 --- a/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.html +++ b/bitwarden_license/bit-web/src/app/secrets-manager/shared/projects-list.component.html @@ -62,13 +62,30 @@
+ + {{ project.name }} + + {{ project.name }} - {{ project.name }} + {{ project.name }} + + {{ project.name }}
{{ project.id }}