From 1cec69e3776b4bb47f9adbe5c0546399fa4dbadb Mon Sep 17 00:00:00 2001
From: vinith-kovan <156108204+vinith-kovan@users.noreply.github.com>
Date: Wed, 5 Jun 2024 22:44:33 +0530
Subject: [PATCH] [PM 2164] api-key component migration (#8562)
* api-key component migration
* api-key component migration
* api-key component migration
* api-key component migration
---
.../settings/account.component.ts | 44 +++----
.../settings/security/api-key.component.html | 114 +++++++-----------
.../settings/security/api-key.component.ts | 60 +++++----
.../security/security-keys.component.ts | 46 +++----
4 files changed, 126 insertions(+), 138 deletions(-)
diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.ts b/apps/web/src/app/admin-console/organizations/settings/account.component.ts
index 41cf9b9e8f5..5e083de9cc0 100644
--- a/apps/web/src/app/admin-console/organizations/settings/account.component.ts
+++ b/apps/web/src/app/admin-console/organizations/settings/account.component.ts
@@ -216,31 +216,33 @@ export class AccountComponent {
};
async viewApiKey() {
- await this.modalService.openViewRef(ApiKeyComponent, this.apiKeyModalRef, (comp) => {
- comp.keyType = "organization";
- comp.entityId = this.organizationId;
- comp.postKey = this.organizationApiService.getOrCreateApiKey.bind(
- this.organizationApiService,
- );
- comp.scope = "api.organization";
- comp.grantType = "client_credentials";
- comp.apiKeyTitle = "apiKey";
- comp.apiKeyWarning = "apiKeyWarning";
- comp.apiKeyDescription = "apiKeyDesc";
+ await ApiKeyComponent.open(this.dialogService, {
+ data: {
+ keyType: "organization",
+ entityId: this.organizationId,
+ postKey: this.organizationApiService.getOrCreateApiKey.bind(this.organizationApiService),
+ scope: "api.organization",
+ grantType: "client_credentials",
+ apiKeyTitle: "apiKey",
+ apiKeyWarning: "apiKeyWarning",
+ apiKeyDescription: "apiKeyDesc",
+ },
});
}
async rotateApiKey() {
- await this.modalService.openViewRef(ApiKeyComponent, this.rotateApiKeyModalRef, (comp) => {
- comp.keyType = "organization";
- comp.isRotation = true;
- comp.entityId = this.organizationId;
- comp.postKey = this.organizationApiService.rotateApiKey.bind(this.organizationApiService);
- comp.scope = "api.organization";
- comp.grantType = "client_credentials";
- comp.apiKeyTitle = "apiKey";
- comp.apiKeyWarning = "apiKeyWarning";
- comp.apiKeyDescription = "apiKeyRotateDesc";
+ await ApiKeyComponent.open(this.dialogService, {
+ data: {
+ keyType: "organization",
+ isRotation: true,
+ entityId: this.organizationId,
+ postKey: this.organizationApiService.rotateApiKey.bind(this.organizationApiService),
+ scope: "api.organization",
+ grantType: "client_credentials",
+ apiKeyTitle: "apiKey",
+ apiKeyWarning: "apiKeyWarning",
+ apiKeyDescription: "apiKeyRotateDesc",
+ },
});
}
}
diff --git a/apps/web/src/app/auth/settings/security/api-key.component.html b/apps/web/src/app/auth/settings/security/api-key.component.html
index 1402a993881..118b17643cc 100644
--- a/apps/web/src/app/auth/settings/security/api-key.component.html
+++ b/apps/web/src/app/auth/settings/security/api-key.component.html
@@ -1,72 +1,42 @@
-
+
diff --git a/apps/web/src/app/auth/settings/security/api-key.component.ts b/apps/web/src/app/auth/settings/security/api-key.component.ts
index 9d005562725..d171bc35617 100644
--- a/apps/web/src/app/auth/settings/security/api-key.component.ts
+++ b/apps/web/src/app/auth/settings/security/api-key.component.ts
@@ -1,46 +1,58 @@
-import { Component } from "@angular/core";
+import { DIALOG_DATA, DialogConfig } from "@angular/cdk/dialog";
+import { Component, Inject } from "@angular/core";
+import { FormBuilder, Validators } from "@angular/forms";
import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction";
import { SecretVerificationRequest } from "@bitwarden/common/auth/models/request/secret-verification.request";
import { ApiKeyResponse } from "@bitwarden/common/auth/models/response/api-key.response";
import { Verification } from "@bitwarden/common/auth/types/verification";
-import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
+import { DialogService } from "@bitwarden/components";
-@Component({
- selector: "app-api-key",
- templateUrl: "api-key.component.html",
-})
-export class ApiKeyComponent {
+export type ApiKeyDialogData = {
keyType: string;
- isRotation: boolean;
- postKey: (entityId: string, request: SecretVerificationRequest) => Promise;
+ isRotation?: boolean;
entityId: string;
+ postKey: (entityId: string, request: SecretVerificationRequest) => Promise;
scope: string;
grantType: string;
apiKeyTitle: string;
apiKeyWarning: string;
apiKeyDescription: string;
-
- masterPassword: Verification;
- formPromise: Promise;
+};
+@Component({
+ selector: "app-api-key",
+ templateUrl: "api-key.component.html",
+})
+export class ApiKeyComponent {
clientId: string;
clientSecret: string;
+ formGroup = this.formBuilder.group({
+ masterPassword: [null as Verification, [Validators.required]],
+ });
constructor(
+ @Inject(DIALOG_DATA) protected data: ApiKeyDialogData,
+ private formBuilder: FormBuilder,
private userVerificationService: UserVerificationService,
- private logService: LogService,
) {}
- async submit() {
- try {
- this.formPromise = this.userVerificationService
- .buildRequest(this.masterPassword)
- .then((request) => this.postKey(this.entityId, request));
- const response = await this.formPromise;
- this.clientSecret = response.apiKey;
- this.clientId = `${this.keyType}.${this.entityId}`;
- } catch (e) {
- this.logService.error(e);
+ submit = async () => {
+ if (this.formGroup.invalid) {
+ this.formGroup.markAllAsTouched();
+ return;
}
- }
+ const response = await this.userVerificationService
+ .buildRequest(this.formGroup.value.masterPassword)
+ .then((request) => this.data.postKey(this.data.entityId, request));
+ this.clientSecret = response.apiKey;
+ this.clientId = `${this.data.keyType}.${this.data.entityId}`;
+ };
+ /**
+ * Strongly typed helper to open a ApiKeyComponent
+ * @param dialogService Instance of the dialog service that will be used to open the dialog
+ * @param config Configuration for the dialog
+ */
+ static open = (dialogService: DialogService, config: DialogConfig) => {
+ return dialogService.open(ApiKeyComponent, config);
+ };
}
diff --git a/apps/web/src/app/auth/settings/security/security-keys.component.ts b/apps/web/src/app/auth/settings/security/security-keys.component.ts
index e29417fad74..8de629dc83e 100644
--- a/apps/web/src/app/auth/settings/security/security-keys.component.ts
+++ b/apps/web/src/app/auth/settings/security/security-keys.component.ts
@@ -1,9 +1,9 @@
import { Component, OnInit, ViewChild, ViewContainerRef } from "@angular/core";
-import { ModalService } from "@bitwarden/angular/services/modal.service";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction";
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
+import { DialogService } from "@bitwarden/components";
import { ApiKeyComponent } from "./api-key.component";
@@ -22,8 +22,8 @@ export class SecurityKeysComponent implements OnInit {
constructor(
private userVerificationService: UserVerificationService,
private stateService: StateService,
- private modalService: ModalService,
private apiService: ApiService,
+ private dialogService: DialogService,
) {}
async ngOnInit() {
@@ -32,30 +32,34 @@ export class SecurityKeysComponent implements OnInit {
async viewUserApiKey() {
const entityId = await this.stateService.getUserId();
- await this.modalService.openViewRef(ApiKeyComponent, this.viewUserApiKeyModalRef, (comp) => {
- comp.keyType = "user";
- comp.entityId = entityId;
- comp.postKey = this.apiService.postUserApiKey.bind(this.apiService);
- comp.scope = "api";
- comp.grantType = "client_credentials";
- comp.apiKeyTitle = "apiKey";
- comp.apiKeyWarning = "userApiKeyWarning";
- comp.apiKeyDescription = "userApiKeyDesc";
+ await ApiKeyComponent.open(this.dialogService, {
+ data: {
+ keyType: "user",
+ entityId: entityId,
+ postKey: this.apiService.postUserApiKey.bind(this.apiService),
+ scope: "api",
+ grantType: "client_credentials",
+ apiKeyTitle: "apiKey",
+ apiKeyWarning: "userApiKeyWarning",
+ apiKeyDescription: "userApiKeyDesc",
+ },
});
}
async rotateUserApiKey() {
const entityId = await this.stateService.getUserId();
- await this.modalService.openViewRef(ApiKeyComponent, this.rotateUserApiKeyModalRef, (comp) => {
- comp.keyType = "user";
- comp.isRotation = true;
- comp.entityId = entityId;
- comp.postKey = this.apiService.postUserRotateApiKey.bind(this.apiService);
- comp.scope = "api";
- comp.grantType = "client_credentials";
- comp.apiKeyTitle = "apiKey";
- comp.apiKeyWarning = "userApiKeyWarning";
- comp.apiKeyDescription = "apiKeyRotateDesc";
+ await ApiKeyComponent.open(this.dialogService, {
+ data: {
+ keyType: "user",
+ isRotation: true,
+ entityId: entityId,
+ postKey: this.apiService.postUserRotateApiKey.bind(this.apiService),
+ scope: "api",
+ grantType: "client_credentials",
+ apiKeyTitle: "apiKey",
+ apiKeyWarning: "userApiKeyWarning",
+ apiKeyDescription: "apiKeyRotateDesc",
+ },
});
}
}