mirror of
https://github.com/bitwarden/browser.git
synced 2024-12-21 16:18:28 +01:00
[AC-1712] Add functionality to approve all device approval requests (#9251)
* [AC-2302] Move organization-auth-request.service to bit-common folder * [AC-2302] Rename organization-auth-request.service to organization-auth-request-api.service * [AC-2302] Move logic from component to organization-auth-request.service * [AC-2302] Fix import path in OrganizationAuthRequestService * [AC-2302] Move imports to OrganizationsModule and delete unused CoreOrganizationModule * [AC-2302] Move the call to get userResetPasswordDetails into OrganizationAuthRequestService * [AC-2302] Remove @Injectable() and manually configure dependencies * [AC-2302] Add OrganizationAuthRequestService unit tests first draft * [AC-2302] Refactor device-approvals.component.ts to remove unused imports * [AC-2302] Set up jest on bit-common and add unit tests for OrganizationAuthRequestService * [AC-2302] Add bit-common to jest.config.js * [AC-2302] Update organizations.module.ts to include safeProviders declared in variable * [AC-2302] Remove services and views folders from bit-common * [AC-2302] Define path mapping * Adjust an import path The import path of `PendingAuthRequestView` in `OrganizationAuthRequestApiService` was pointing to the wrong place. I think this file was just recently moved, and the import didn't get updated. * Get paths working * Fix import * Update jest config to use ts-jest adn jsdom * Copy-paste path mappings from bit-web * Remove unnecessary test setup file * Undo unnecessary change * Fix remaining path mappings * Remove Bitwarden License mapping from OSS code * Fix bit-web so it uses its own tsconfig * Fix import path * Remove web-bit entrypoint from OSS tsconfig * Make DeviceApprovalsComponent standalone * Remove organization-auth-request-api.service export * Add BulkApproveAuthRequestsRequest class for bulk approval of authentication requests * Add api call for device bulk approvals * Add bulk device approval to OrganizationAuthRequestService * Add unit tests for bulk device approval method * Remove OrganizationsRoutingModule from DeviceApprovalsComponent imports * Remove CoreOrganizationModule from OrganizationsModule imports * Remove NoItemsModule from OrganizationsModule imports * Get keys for each item to approve * Update approvePendingRequests unit test * Use ApiService from JslibServicesModule * Update providers in device-approvals.component.ts * Add method to retrieve reset password details for multiple organization users * Add organizationUserId property to OrganizationUserResetPasswordDetailsResponse class * Use method to retrieve reset password details for multiple organization users * Rename ResetPasswordDetails to AccountRecoveryDetails * Update OrganizationAuthRequestService to use getManyOrganizationUserAccountRecoveryDetails * Add functionality to approve all device approval requests * Update AdminAuthRequestUpdateWithIdRequest property names and imports * Refactor bulk approval functionality in organization auth requests * Put the 'Approve All' button behind a feature flag. * Update feature flag key Co-authored-by: Addison Beck <github@addisonbeck.com> * Rename update request AdminAuthRequestUpdateWithIdRequest to OrganizationAuthRequestUpdateRequest * Update organization-auth-request.service.spec.ts to use bulkUpdatePendingRequests method --------- Co-authored-by: Addison Beck <hello@addisonbeck.com> Co-authored-by: Thomas Rittson <trittson@bitwarden.com> Co-authored-by: Addison Beck <github@addisonbeck.com>
This commit is contained in:
parent
93b9eba769
commit
8e7a215597
@ -8288,5 +8288,11 @@
|
|||||||
},
|
},
|
||||||
"upgradeOrganizationCloseSecurityGapsDesc": {
|
"upgradeOrganizationCloseSecurityGapsDesc": {
|
||||||
"message": "Stay ahead of security vulnerabilities by upgrading to a paid plan for enhanced monitoring."
|
"message": "Stay ahead of security vulnerabilities by upgrading to a paid plan for enhanced monitoring."
|
||||||
|
},
|
||||||
|
"approveAllRequests": {
|
||||||
|
"message": "Approve all requests"
|
||||||
|
},
|
||||||
|
"allLoginRequestsApproved": {
|
||||||
|
"message": "All login requests approved"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,16 @@
|
|||||||
appA11yTitle="{{ 'options' | i18n }}"
|
appA11yTitle="{{ 'options' | i18n }}"
|
||||||
></button>
|
></button>
|
||||||
<bit-menu #headerMenu>
|
<bit-menu #headerMenu>
|
||||||
|
<button
|
||||||
|
*ngIf="bulkDeviceApprovalEnabled$ | async"
|
||||||
|
type="button"
|
||||||
|
bitMenuItem
|
||||||
|
(click)="approveAllRequests()"
|
||||||
|
[disabled]="actionInProgress"
|
||||||
|
>
|
||||||
|
<i class="bwi bwi-fw bwi-check" aria-hidden="true"></i>
|
||||||
|
{{ "approveAllRequests" | i18n }}
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
bitMenuItem
|
bitMenuItem
|
||||||
|
@ -8,6 +8,8 @@ import { OrganizationAuthRequestService } from "@bitwarden/bit-common/admin-cons
|
|||||||
import { PendingAuthRequestView } from "@bitwarden/bit-common/admin-console/auth-requests/pending-auth-request.view";
|
import { PendingAuthRequestView } from "@bitwarden/bit-common/admin-console/auth-requests/pending-auth-request.view";
|
||||||
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
||||||
import { OrganizationUserService } from "@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service";
|
import { OrganizationUserService } from "@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service";
|
||||||
|
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
||||||
|
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
||||||
import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service";
|
import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service";
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
@ -41,6 +43,9 @@ export class DeviceApprovalsComponent implements OnInit, OnDestroy {
|
|||||||
actionInProgress = false;
|
actionInProgress = false;
|
||||||
|
|
||||||
protected readonly Devices = Devices;
|
protected readonly Devices = Devices;
|
||||||
|
protected bulkDeviceApprovalEnabled$ = this.configService.getFeatureFlag$(
|
||||||
|
FeatureFlag.BulkDeviceApproval,
|
||||||
|
);
|
||||||
|
|
||||||
private destroy$ = new Subject<void>();
|
private destroy$ = new Subject<void>();
|
||||||
private refresh$ = new BehaviorSubject<void>(null);
|
private refresh$ = new BehaviorSubject<void>(null);
|
||||||
@ -52,6 +57,7 @@ export class DeviceApprovalsComponent implements OnInit, OnDestroy {
|
|||||||
private i18nService: I18nService,
|
private i18nService: I18nService,
|
||||||
private logService: LogService,
|
private logService: LogService,
|
||||||
private validationService: ValidationService,
|
private validationService: ValidationService,
|
||||||
|
private configService: ConfigService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
async ngOnInit() {
|
async ngOnInit() {
|
||||||
@ -97,6 +103,24 @@ export class DeviceApprovalsComponent implements OnInit, OnDestroy {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async approveAllRequests() {
|
||||||
|
if (this.tableDataSource.data.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.performAsyncAction(async () => {
|
||||||
|
await this.organizationAuthRequestService.approvePendingRequests(
|
||||||
|
this.organizationId,
|
||||||
|
this.tableDataSource.data,
|
||||||
|
);
|
||||||
|
this.platformUtilsService.showToast(
|
||||||
|
"success",
|
||||||
|
null,
|
||||||
|
this.i18nService.t("allLoginRequestsApproved"),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async denyRequest(requestId: string) {
|
async denyRequest(requestId: string) {
|
||||||
await this.performAsyncAction(async () => {
|
await this.performAsyncAction(async () => {
|
||||||
await this.organizationAuthRequestService.denyPendingRequests(this.organizationId, requestId);
|
await this.organizationAuthRequestService.denyPendingRequests(this.organizationId, requestId);
|
||||||
|
Loading…
Reference in New Issue
Block a user