diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 6730b2a6f05..738338c34dd 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -6195,10 +6195,6 @@
"message": "Access token created and copied to clipboard",
"description": "Notification to inform the user that the access token has been created and copied to the clipboard."
},
- "accessTokenPermissionsBetaNotification": {
- "message": "Permissions management is unavailable for beta.",
- "description": "Notification to inform the user that the feature for managing access token permissions is not available in the beta version."
- },
"revokeAccessToken": {
"message": "Revoke access token",
"description": "Invalidates / cancels an access token and as such removes access to secrets for the client application."
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.html
index 632e10c8c7f..3d7e1b1073e 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.html
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.html
@@ -32,7 +32,6 @@
{{ "name" | i18n }}
- {{ "permissions" | i18n }}
{{ "expires" | i18n }}
{{ "lastEdited" | i18n }}
@@ -57,7 +56,6 @@
/>
{{ token.name }}
- {{ permission(token) | i18n }}
{{ token.expireAt === null ? ("never" | i18n) : (token.expireAt | date : "medium") }}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.ts
index ce7ad6e86da..e24b0488b2c 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-list.component.ts
@@ -39,8 +39,4 @@ export class AccessListComponent {
const selected = this.tokens.filter((s) => this.selection.selected.includes(s.id));
this.revokeAccessTokensEvent.emit(selected);
}
-
- protected permission(token: AccessTokenView) {
- return "canRead";
- }
}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts
index e7e3c17fca9..2568a398362 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/access-tokens.component.ts
@@ -1,6 +1,14 @@
-import { Component, OnInit } from "@angular/core";
+import { Component, OnDestroy, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
-import { combineLatestWith, firstValueFrom, Observable, startWith, switchMap } from "rxjs";
+import {
+ combineLatestWith,
+ firstValueFrom,
+ Observable,
+ startWith,
+ Subject,
+ switchMap,
+ takeUntil,
+} from "rxjs";
import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog";
import { ModalService } from "@bitwarden/angular/services/modal.service";
@@ -8,7 +16,9 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { openUserVerificationPrompt } from "@bitwarden/web-vault/app/auth/shared/components/user-verification";
+import { ServiceAccountView } from "../../models/view/service-account.view";
import { AccessTokenView } from "../models/view/access-token.view";
+import { ServiceAccountService } from "../service-account.service";
import { AccessService } from "./access.service";
import { AccessTokenCreateDialogComponent } from "./dialogs/access-token-create-dialog.component";
@@ -17,11 +27,11 @@ import { AccessTokenCreateDialogComponent } from "./dialogs/access-token-create-
selector: "sm-access-tokens",
templateUrl: "./access-tokens.component.html",
})
-export class AccessTokenComponent implements OnInit {
+export class AccessTokenComponent implements OnInit, OnDestroy {
accessTokens$: Observable;
- private serviceAccountId: string;
- private organizationId: string;
+ private destroy$ = new Subject();
+ private serviceAccountView: ServiceAccountView;
constructor(
private route: ActivatedRoute,
@@ -29,19 +39,39 @@ export class AccessTokenComponent implements OnInit {
private dialogService: DialogServiceAbstraction,
private modalService: ModalService,
private platformUtilsService: PlatformUtilsService,
- private i18nService: I18nService
+ private i18nService: I18nService,
+ private serviceAccountService: ServiceAccountService
) {}
ngOnInit() {
this.accessTokens$ = this.accessService.accessToken$.pipe(
startWith(null),
combineLatestWith(this.route.params),
- switchMap(async ([_, params]) => {
- this.organizationId = params.organizationId;
- this.serviceAccountId = params.serviceAccountId;
- return await this.getAccessTokens();
- })
+ switchMap(async ([_, params]) =>
+ this.accessService.getAccessTokens(params.organizationId, params.serviceAccountId)
+ )
);
+
+ this.serviceAccountService.serviceAccount$
+ .pipe(
+ startWith(null),
+ combineLatestWith(this.route.params),
+ switchMap(([_, params]) =>
+ this.serviceAccountService.getByServiceAccountId(
+ params.serviceAccountId,
+ params.organizationId
+ )
+ ),
+ takeUntil(this.destroy$)
+ )
+ .subscribe((serviceAccountView) => {
+ this.serviceAccountView = serviceAccountView;
+ });
+ }
+
+ ngOnDestroy(): void {
+ this.destroy$.next();
+ this.destroy$.complete();
}
protected async revoke(tokens: AccessTokenView[]) {
@@ -59,7 +89,7 @@ export class AccessTokenComponent implements OnInit {
}
await this.accessService.revokeAccessTokens(
- this.serviceAccountId,
+ this.serviceAccountView.id,
tokens.map((t) => t.id)
);
@@ -69,8 +99,7 @@ export class AccessTokenComponent implements OnInit {
protected openNewAccessTokenDialog() {
AccessTokenCreateDialogComponent.openNewAccessTokenDialog(
this.dialogService,
- this.serviceAccountId,
- this.organizationId
+ this.serviceAccountView
);
}
@@ -89,8 +118,4 @@ export class AccessTokenComponent implements OnInit {
return firstValueFrom(ref.closed);
}
-
- private async getAccessTokens(): Promise {
- return await this.accessService.getAccessTokens(this.organizationId, this.serviceAccountId);
- }
}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-create-dialog.component.html b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-create-dialog.component.html
index 7e020a51060..cdbd53086f5 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-create-dialog.component.html
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/access/dialogs/access-token-create-dialog.component.html
@@ -12,19 +12,6 @@
{{ "name" | i18n }}
-
-
- {{ "permissions" | i18n }}
-
-
- {{ "canRead" | i18n }}
-
-
-
-
- {{ "accessTokenPermissionsBetaNotification" | i18n }}
-
-
(AccessTokenCreateDialogComponent, {
data: {
- organizationId: organizationId,
- serviceAccountView: serviceAccountView,
+ serviceAccountView,
},
});
}
diff --git a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.ts b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.ts
index 98d316467db..2e6084e06ea 100644
--- a/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.ts
+++ b/bitwarden_license/bit-web/src/app/secrets-manager/service-accounts/service-account.component.ts
@@ -15,6 +15,8 @@ import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
+import { ServiceAccountView } from "../models/view/service-account.view";
+
import { AccessTokenCreateDialogComponent } from "./access/dialogs/access-token-create-dialog.component";
import { ServiceAccountService } from "./service-account.service";
@@ -32,6 +34,7 @@ export class ServiceAccountComponent implements OnInit, OnDestroy {
startWith(null)
);
+ private serviceAccountView: ServiceAccountView;
protected serviceAccount$ = combineLatest([this.route.params, this.onChange$]).pipe(
switchMap(([params, _]) =>
this.serviceAccountService.getByServiceAccountId(
@@ -61,9 +64,8 @@ export class ServiceAccountComponent implements OnInit, OnDestroy {
) {}
ngOnInit(): void {
- this.route.params.pipe(takeUntil(this.destroy$)).subscribe((params) => {
- this.serviceAccountId = params.serviceAccountId;
- this.organizationId = params.organizationId;
+ this.serviceAccount$.pipe(takeUntil(this.destroy$)).subscribe((serviceAccountView) => {
+ this.serviceAccountView = serviceAccountView;
});
}
@@ -75,8 +77,7 @@ export class ServiceAccountComponent implements OnInit, OnDestroy {
protected openNewAccessTokenDialog() {
AccessTokenCreateDialogComponent.openNewAccessTokenDialog(
this.dialogService,
- this.serviceAccountId,
- this.organizationId
+ this.serviceAccountView
);
}
}