1
0
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:
Rui Tomé 2024-05-27 14:20:44 +01:00 committed by GitHub
parent 93b9eba769
commit 8e7a215597
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 40 additions and 0 deletions

View File

@ -8288,5 +8288,11 @@
},
"upgradeOrganizationCloseSecurityGapsDesc": {
"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"
}
}

View File

@ -28,6 +28,16 @@
appA11yTitle="{{ 'options' | i18n }}"
></button>
<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
type="button"
bitMenuItem

View File

@ -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 { ApiService } from "@bitwarden/common/abstractions/api.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 { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
@ -41,6 +43,9 @@ export class DeviceApprovalsComponent implements OnInit, OnDestroy {
actionInProgress = false;
protected readonly Devices = Devices;
protected bulkDeviceApprovalEnabled$ = this.configService.getFeatureFlag$(
FeatureFlag.BulkDeviceApproval,
);
private destroy$ = new Subject<void>();
private refresh$ = new BehaviorSubject<void>(null);
@ -52,6 +57,7 @@ export class DeviceApprovalsComponent implements OnInit, OnDestroy {
private i18nService: I18nService,
private logService: LogService,
private validationService: ValidationService,
private configService: ConfigService,
) {}
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) {
await this.performAsyncAction(async () => {
await this.organizationAuthRequestService.denyPendingRequests(this.organizationId, requestId);