-
Notifications
You must be signed in to change notification settings - Fork 1.5k
[PM-27225] Fix nothing showing when biometrics unavailable #17209
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 12 commits
39666ad
5c000d7
a85d804
8e79ec2
89f2d51
8aa5b7f
d28f549
d8d7a0c
00b1bc1
d1b11ed
8667729
3617369
5107570
6b6b851
fc79ba6
f5a53b3
214b4e3
dc6548e
a1ddda7
5e29c93
a6b2435
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,7 +16,7 @@ import { | |
| } from "rxjs"; | ||
|
|
||
| import { JslibModule } from "@bitwarden/angular/jslib.module"; | ||
| import { LogoutService } from "@bitwarden/auth/common"; | ||
| import { LogoutService, UserDecryptionOptionsServiceAbstraction } from "@bitwarden/auth/common"; | ||
| import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; | ||
| import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options"; | ||
| import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; | ||
|
|
@@ -43,6 +43,7 @@ import { SyncService } from "@bitwarden/common/platform/sync"; | |
| import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; | ||
| import { UserKey } from "@bitwarden/common/types/key"; | ||
| import { | ||
| TooltipDirective, | ||
| AsyncActionsModule, | ||
| AnonLayoutWrapperDataService, | ||
| ButtonModule, | ||
|
|
@@ -100,6 +101,7 @@ const AUTOPROMPT_BIOMETRICS_PROCESS_RELOAD_DELAY = 5000; | |
| AsyncActionsModule, | ||
| IconButtonModule, | ||
| MasterPasswordLockComponent, | ||
| TooltipDirective, | ||
| ], | ||
| }) | ||
| export class LockComponent implements OnInit, OnDestroy { | ||
|
|
@@ -178,6 +180,7 @@ export class LockComponent implements OnInit, OnDestroy { | |
| private lockComponentService: LockComponentService, | ||
| private anonLayoutWrapperDataService: AnonLayoutWrapperDataService, | ||
| private configService: ConfigService, | ||
| private userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction, | ||
| // desktop deps | ||
| private broadcasterService: BroadcasterService, | ||
| ) {} | ||
|
|
@@ -276,7 +279,26 @@ export class LockComponent implements OnInit, OnDestroy { | |
| this.lockComponentService.getAvailableUnlockOptions$(activeAccount.id), | ||
| ); | ||
|
|
||
| this.setDefaultActiveUnlockOption(this.unlockOptions); | ||
| const canUsePassword = await firstValueFrom( | ||
| this.userDecryptionOptionsService.hasMasterPassword$, | ||
| ); | ||
| const canUsePin = | ||
| (await this.pinService.isPinSet(activeAccount.id)) && | ||
| (await this.pinService.isPinDecryptionAvailable(activeAccount.id)); | ||
| const canUseBiometrics = [ | ||
| BiometricsStatus.Available, | ||
| BiometricsStatus.HardwareUnavailable, | ||
| BiometricsStatus.DesktopDisconnected, | ||
| BiometricsStatus.NotEnabledInConnectedDesktopApp, | ||
quexten marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| ].includes(await this.biometricService.getBiometricsStatusForUser(activeAccount.id)); | ||
mzieniukbw marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The biometric status is already available in Suggested change: const canUseBiometrics = [
BiometricsStatus.Available,
...BIOMETRIC_UNLOCK_TEMPORARY_UNAVAILABLE_STATUSES,
].includes(this.unlockOptions?.biometrics.biometricsStatus ?? BiometricsStatus.PlatformUnsupported);This was flagged in a previous review and appears unresolved. |
||
| if (!canUsePassword && !canUsePin && !canUseBiometrics) { | ||
| // User has no available unlock options, force logout. This happens for TDE users without a masterpassword, that don't have a persistent unlock method set. | ||
| this.logService.warning("[LockComponent] User cannot unlock again. Logging out!"); | ||
| await this.logoutService.logout(activeAccount.id); | ||
| return; | ||
| } | ||
mzieniukbw marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| await this.setDefaultActiveUnlockOption(this.unlockOptions); | ||
|
|
||
| if (this.unlockOptions?.biometrics.enabled) { | ||
| await this.handleBiometricsUnlockEnabled(); | ||
|
|
@@ -299,14 +321,30 @@ export class LockComponent implements OnInit, OnDestroy { | |
| }); | ||
| } | ||
|
|
||
| private setDefaultActiveUnlockOption(unlockOptions: UnlockOptions | null) { | ||
| private async setDefaultActiveUnlockOption(unlockOptions: UnlockOptions | null) { | ||
| const biometricsStatus: BiometricsStatus | null = | ||
| this.activeAccount != null | ||
| ? await this.biometricService.getBiometricsStatusForUser(this.activeAccount.id) | ||
quexten marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| : null; | ||
|
|
||
| // Priorities should be Biometrics > Pin > Master Password for speed | ||
| if (unlockOptions?.biometrics.enabled) { | ||
| this.activeUnlockOption = UnlockOption.Biometrics; | ||
| } else if (unlockOptions?.pin.enabled) { | ||
| this.activeUnlockOption = UnlockOption.Pin; | ||
| } else if (unlockOptions?.masterPassword.enabled) { | ||
| this.activeUnlockOption = UnlockOption.MasterPassword; | ||
| // If biometrics is temporarily unavailable for masterpassword-less users, but they have biometrics configured, | ||
| // then show the biometrics screen so the user knows why they can't unlock, and to give them the option to log out. | ||
quexten marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| } else if ( | ||
| biometricsStatus != null && | ||
| [ | ||
| BiometricsStatus.HardwareUnavailable, | ||
| BiometricsStatus.DesktopDisconnected, | ||
| BiometricsStatus.NotEnabledInConnectedDesktopApp, | ||
| ].includes(biometricsStatus) | ||
mzieniukbw marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| ) { | ||
| this.activeUnlockOption = UnlockOption.Biometrics; | ||
mzieniukbw marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
| } | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.