mirror of
https://github.com/bitwarden/browser
synced 2025-12-17 16:53:34 +00:00
fix(Multi-Account-Logout: [Auth/PM-19555] Fix multi account logout on lock screens not redirecting properly (#14630)
* PM-19555 - LogoutService - build abstraction, default, and extension service and register with service modules * PM-19555 - Lock Comp - use logoutService * PM-19555 - LoginDecryptionOptions - Use logout service which removed need for extension-login-decryption-options.service * PM-19555 - AccountSwitcher logic update - (1) Use logout service + redirect guard routing (2) Remove logout method from account switcher service (3) use new NewActiveUser type * PM-19555 - Extension - Acct Switcher comp - clean up TODOs * PM-19555 - Add TODOs for remaining tech debt * PM-19555 - Add tests for new logout services. * PM-19555 - Extension - LoginInitiated - show acct switcher b/c user is AuthN * PM-19555 - Add TODO to replace LogoutCallback with LogoutService * PM-19555 WIP * PM-19555 - Extension App Comp - account switching to account in TDE locked state works now. * PM-19555 - Extension App Comp - add docs * PM-19555 - Extension App Comp - add early return * PM-19555 - Desktop App Comp - add handling for TDE lock case to switch account logic. * PM-19555 - Extension - Account Component - if account unlocked go to vault * PM-19555 - Per PR feedback, clean up unnecessary nullish coalescing operator. * PM-19555 - Extension - AppComponent - fix everHadUserKey merge issue * PM-19555 - PR feedback - refactor switchAccount and locked message handling on browser & desktop to require user id. I audited all callsites for both to ensure this *shouldn't* error.
This commit is contained in:
@@ -29,7 +29,11 @@ import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref";
|
||||
import { DocumentLangSetter } from "@bitwarden/angular/platform/i18n";
|
||||
import { ModalService } from "@bitwarden/angular/services/modal.service";
|
||||
import { FingerprintDialogComponent, LoginApprovalComponent } from "@bitwarden/auth/angular";
|
||||
import { DESKTOP_SSO_CALLBACK, LogoutReason } from "@bitwarden/auth/common";
|
||||
import {
|
||||
DESKTOP_SSO_CALLBACK,
|
||||
LogoutReason,
|
||||
UserDecryptionOptionsServiceAbstraction,
|
||||
} from "@bitwarden/auth/common";
|
||||
import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service";
|
||||
import { SearchService } from "@bitwarden/common/abstractions/search.service";
|
||||
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
|
||||
@@ -165,6 +169,7 @@ export class AppComponent implements OnInit, OnDestroy {
|
||||
private accountService: AccountService,
|
||||
private organizationService: OrganizationService,
|
||||
private deviceTrustToastService: DeviceTrustToastService,
|
||||
private userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction,
|
||||
private readonly destroyRef: DestroyRef,
|
||||
private readonly documentLangSetter: DocumentLangSetter,
|
||||
) {
|
||||
@@ -416,15 +421,35 @@ export class AppComponent implements OnInit, OnDestroy {
|
||||
this.router.navigate(["/remove-password"]);
|
||||
break;
|
||||
case "switchAccount": {
|
||||
if (message.userId != null) {
|
||||
await this.accountService.switchAccount(message.userId);
|
||||
if (message.userId == null) {
|
||||
this.logService.error("'switchAccount' message received without userId.");
|
||||
return;
|
||||
}
|
||||
|
||||
await this.accountService.switchAccount(message.userId);
|
||||
|
||||
const locked =
|
||||
(await this.authService.getAuthStatus(message.userId)) ===
|
||||
AuthenticationStatus.Locked;
|
||||
if (locked) {
|
||||
this.modalService.closeAll();
|
||||
await this.router.navigate(["lock"]);
|
||||
|
||||
// We only have to handle TDE lock on "switchAccount" message scenarios but not normal
|
||||
// lock scenarios since the user will have always decrypted the vault at least once in those cases.
|
||||
const tdeEnabled = await firstValueFrom(
|
||||
this.userDecryptionOptionsService
|
||||
.userDecryptionOptionsById$(message.userId)
|
||||
.pipe(map((decryptionOptions) => decryptionOptions?.trustedDeviceOption != null)),
|
||||
);
|
||||
|
||||
const everHadUserKey = await firstValueFrom(
|
||||
this.keyService.everHadUserKey$(message.userId),
|
||||
);
|
||||
if (tdeEnabled && !everHadUserKey) {
|
||||
await this.router.navigate(["login-initiated"]);
|
||||
} else {
|
||||
await this.router.navigate(["lock"]);
|
||||
}
|
||||
} else {
|
||||
this.messagingService.send("unlocked");
|
||||
this.loading = true;
|
||||
@@ -600,6 +625,8 @@ export class AppComponent implements OnInit, OnDestroy {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: PM-21212 - consolidate the logic of this method into the new LogoutService
|
||||
// (requires creating a desktop specific implementation of the LogoutService)
|
||||
// Even though the userId parameter is no longer optional doesn't mean a message couldn't be
|
||||
// passing null-ish values to us.
|
||||
private async logOut(logoutReason: LogoutReason, userId: UserId) {
|
||||
|
||||
Reference in New Issue
Block a user