From 4b7f8074f3b5d361af78afb985c87d2371748be2 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Mon, 15 Apr 2024 17:13:26 -0300 Subject: [PATCH] PM-7365 Fix setting HasUnlockedInThisTransaction on passkey creation on android (#3153) --- .../Autofill/Fido2MakeCredentialUserInterface.cs | 16 +++++++++++----- ...do2MakeCredentialConfirmationUserInterface.cs | 2 ++ .../AccountManagement/AccountsManager.cs | 4 ++++ src/Core/Utilities/AppHelpers.cs | 3 +++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/App/Platforms/Android/Autofill/Fido2MakeCredentialUserInterface.cs b/src/App/Platforms/Android/Autofill/Fido2MakeCredentialUserInterface.cs index a96c97f11..fa0f52178 100644 --- a/src/App/Platforms/Android/Autofill/Fido2MakeCredentialUserInterface.cs +++ b/src/App/Platforms/Android/Autofill/Fido2MakeCredentialUserInterface.cs @@ -16,7 +16,8 @@ namespace Bit.App.Platforms.Android.Autofill private readonly IDeviceActionService _deviceActionService; private TaskCompletionSource<(string cipherId, bool? userVerified)> _confirmCredentialTcs; - Fido2UserVerificationOptions? _currentDefaultUserVerificationOptions; + private Fido2UserVerificationOptions? _currentDefaultUserVerificationOptions; + private Func _checkHasVaultBeenUnlockedInThisTransaction; public Fido2MakeCredentialUserInterface(IStateService stateService, IVaultTimeoutService vaultTimeoutService, @@ -31,7 +32,7 @@ namespace Bit.App.Platforms.Android.Autofill _deviceActionService = deviceActionService; } - public bool HasVaultBeenUnlockedInThisTransaction => true; + public bool HasVaultBeenUnlockedInThisTransaction => _checkHasVaultBeenUnlockedInThisTransaction?.Invoke() == true; public async Task<(string CipherId, bool UserVerified)> ConfirmNewCredentialAsync(Fido2ConfirmNewCredentialParams confirmNewCredentialParams) { @@ -39,12 +40,12 @@ namespace Bit.App.Platforms.Android.Autofill _confirmCredentialTcs = null; _confirmCredentialTcs = new TaskCompletionSource<(string cipherId, bool? userVerified)>(); - _currentDefaultUserVerificationOptions = new Fido2UserVerificationOptions(false, confirmNewCredentialParams.UserVerificationPreference, true, confirmNewCredentialParams.RpId); + _currentDefaultUserVerificationOptions = new Fido2UserVerificationOptions(false, confirmNewCredentialParams.UserVerificationPreference, HasVaultBeenUnlockedInThisTransaction, confirmNewCredentialParams.RpId); var messagingService = ServiceContainer.Resolve("messagingService"); messagingService?.Send("fidoNavigateToAutofillCipher", confirmNewCredentialParams); - var (cipherId, isUserVerified) = await _confirmCredentialTcs.Task; + var (cipherId, isUserVerified) = await _confirmCredentialTcs.Task; var verified = isUserVerified; if (verified is null) @@ -108,6 +109,11 @@ namespace Bit.App.Platforms.Android.Autofill return Task.FromResult(true); } + public void SetCheckHasVaultBeenUnlockedInThisTransaction(Func checkHasVaultBeenUnlockedInThisTransaction) + { + _checkHasVaultBeenUnlockedInThisTransaction = checkHasVaultBeenUnlockedInThisTransaction; + } + public void Confirm(string cipherId, bool? userVerified) => _confirmCredentialTcs?.TrySetResult((cipherId, userVerified)); public void Cancel() => _confirmCredentialTcs?.TrySetCanceled(); @@ -135,7 +141,7 @@ namespace Bit.App.Platforms.Android.Autofill new Fido2UserVerificationOptions( shouldCheckMasterPasswordReprompt, userVerificationPreference, - true, + HasVaultBeenUnlockedInThisTransaction, rpId) ); } diff --git a/src/Core/Abstractions/IFido2MakeCredentialConfirmationUserInterface.cs b/src/Core/Abstractions/IFido2MakeCredentialConfirmationUserInterface.cs index efec99cd2..ecc287768 100644 --- a/src/Core/Abstractions/IFido2MakeCredentialConfirmationUserInterface.cs +++ b/src/Core/Abstractions/IFido2MakeCredentialConfirmationUserInterface.cs @@ -28,5 +28,7 @@ namespace Bit.Core.Abstractions void OnConfirmationException(Exception ex); Fido2UserVerificationOptions? GetCurrentUserVerificationOptions(); + + void SetCheckHasVaultBeenUnlockedInThisTransaction(Func checkHasVaultBeenUnlockedInThisTransaction); } } diff --git a/src/Core/Utilities/AccountManagement/AccountsManager.cs b/src/Core/Utilities/AccountManagement/AccountsManager.cs index 146e02d1b..c557a67d0 100644 --- a/src/Core/Utilities/AccountManagement/AccountsManager.cs +++ b/src/Core/Utilities/AccountManagement/AccountsManager.cs @@ -254,6 +254,10 @@ namespace Bit.App.Utilities.AccountManagement await _accountsManagerHost.UpdateThemeAsync(); _watchDeviceService.SyncDataToWatchAsync().FireAndForget(); _messagingService.Send(AccountsManagerMessageCommands.ACCOUNT_SWITCH_COMPLETED); + if (Options != null) + { + Options.HasUnlockedInThisTransaction = false; + } }); } diff --git a/src/Core/Utilities/AppHelpers.cs b/src/Core/Utilities/AppHelpers.cs index 69e427de8..a4a8c2da2 100644 --- a/src/Core/Utilities/AppHelpers.cs +++ b/src/Core/Utilities/AppHelpers.cs @@ -432,6 +432,9 @@ namespace Bit.App.Utilities // this is called after login in or unlocking so we can assume the vault has been unlocked in this transaction here. appOptions.HasUnlockedInThisTransaction = true; + ServiceContainer.Resolve() + .SetCheckHasVaultBeenUnlockedInThisTransaction(() => appOptions?.HasUnlockedInThisTransaction == true); + if (appOptions.FromAutofillFramework && appOptions.SaveType.HasValue) { App.MainPage = new NavigationPage(new CipherAddEditPage(appOptions: appOptions));