1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-12 06:13:38 +00:00

[PM-17745] Catch network errors in new device notification guard (#13161)

* [PM-17745] Wrap new device guard applicability check in try/catch to prevent crashes from network errors

* [PM-17745] Fix broken test
This commit is contained in:
Shane Melton
2025-01-30 12:18:22 -08:00
committed by GitHub
parent cbba1a686c
commit a404729c9e
2 changed files with 24 additions and 12 deletions

View File

@@ -36,7 +36,7 @@ describe("NewDeviceVerificationNoticeGuard", () => {
return Promise.resolve(false); return Promise.resolve(false);
}); });
const isSelfHost = jest.fn().mockResolvedValue(false); const isSelfHost = jest.fn().mockReturnValue(false);
const getProfileTwoFactorEnabled = jest.fn().mockResolvedValue(false); const getProfileTwoFactorEnabled = jest.fn().mockResolvedValue(false);
const policyAppliesToActiveUser$ = jest.fn().mockReturnValue(new BehaviorSubject<boolean>(false)); const policyAppliesToActiveUser$ = jest.fn().mockReturnValue(new BehaviorSubject<boolean>(false));
const noticeState$ = jest.fn().mockReturnValue(new BehaviorSubject(null)); const noticeState$ = jest.fn().mockReturnValue(new BehaviorSubject(null));
@@ -139,6 +139,12 @@ describe("NewDeviceVerificationNoticeGuard", () => {
expect(await newDeviceGuard()).toBe(true); expect(await newDeviceGuard()).toBe(true);
}); });
it("returns `true` when the profile service throws an error", async () => {
getProfileCreationDate.mockRejectedValueOnce(new Error("test"));
expect(await newDeviceGuard()).toBe(true);
});
describe("temp flag", () => { describe("temp flag", () => {
beforeEach(() => { beforeEach(() => {
getFeatureFlag.mockImplementation((key) => { getFeatureFlag.mockImplementation((key) => {

View File

@@ -1,6 +1,6 @@
import { inject } from "@angular/core"; import { inject } from "@angular/core";
import { ActivatedRouteSnapshot, CanActivateFn, Router } from "@angular/router"; import { ActivatedRouteSnapshot, CanActivateFn, Router } from "@angular/router";
import { Observable, firstValueFrom } from "rxjs"; import { firstValueFrom, Observable } from "rxjs";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { PolicyType } from "@bitwarden/common/admin-console/enums";
@@ -47,17 +47,23 @@ export const NewDeviceVerificationNoticeGuard: CanActivateFn = async (
return router.createUrlTree(["/login"]); return router.createUrlTree(["/login"]);
} }
const has2FAEnabled = await hasATwoFactorProviderEnabled(vaultProfileService, currentAcct.id); try {
const isSelfHosted = await platformUtilsService.isSelfHost(); const isSelfHosted = platformUtilsService.isSelfHost();
const requiresSSO = await isSSORequired(policyService); const requiresSSO = await isSSORequired(policyService);
const isProfileLessThanWeekOld = await profileIsLessThanWeekOld( const has2FAEnabled = await hasATwoFactorProviderEnabled(vaultProfileService, currentAcct.id);
vaultProfileService, const isProfileLessThanWeekOld = await profileIsLessThanWeekOld(
currentAcct.id, vaultProfileService,
); currentAcct.id,
);
// When any of the following are true, the device verification notice is // When any of the following are true, the device verification notice is
// not applicable for the user. // not applicable for the user.
if (has2FAEnabled || isSelfHosted || requiresSSO || isProfileLessThanWeekOld) { if (has2FAEnabled || isSelfHosted || requiresSSO || isProfileLessThanWeekOld) {
return true;
}
} catch {
// Skip showing the notice if there was a problem determining applicability
// The most likely problem to occur is the user not having a network connection
return true; return true;
} }