From 7413c43d49722bb6e3fb61de54f370b7dba99439 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Thu, 11 Apr 2024 19:07:47 -0300 Subject: [PATCH] PM-7379 Fix creating the PendingIntent for a passkey credential on Android so it has different request codes amongst each other so the extras are not overriden by the last credential entry created. (#3149) --- src/App/Platforms/Android/Autofill/CredentialHelpers.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/App/Platforms/Android/Autofill/CredentialHelpers.cs b/src/App/Platforms/Android/Autofill/CredentialHelpers.cs index e87df501c..c2c33c97e 100644 --- a/src/App/Platforms/Android/Autofill/CredentialHelpers.cs +++ b/src/App/Platforms/Android/Autofill/CredentialHelpers.cs @@ -25,12 +25,15 @@ namespace Bit.App.Platforms.Android.Autofill var authenticator = Bit.Core.Utilities.ServiceContainer.Resolve(); var credentials = await authenticator.SilentCredentialDiscoveryAsync(requestOptions.RpId); - passkeyEntries = credentials.Select(credential => MapCredential(credential, option, context, hasVaultBeenUnlockedInThisTransaction) as CredentialEntry).ToList(); + // We need to change the request code for every pending intent on mapping the credential so the extras are not overriten by the last + // credential entry created. + int requestCodeAddition = 0; + passkeyEntries = credentials.Select(credential => MapCredential(credential, option, context, hasVaultBeenUnlockedInThisTransaction, Bit.Droid.Autofill.CredentialProviderService.UniqueGetRequestCode + requestCodeAddition++) as CredentialEntry).ToList(); return passkeyEntries; } - private static PublicKeyCredentialEntry MapCredential(Fido2AuthenticatorDiscoverableCredentialMetadata credential, BeginGetPublicKeyCredentialOption option, Context context, bool hasVaultBeenUnlockedInThisTransaction) + private static PublicKeyCredentialEntry MapCredential(Fido2AuthenticatorDiscoverableCredentialMetadata credential, BeginGetPublicKeyCredentialOption option, Context context, bool hasVaultBeenUnlockedInThisTransaction, int requestCode) { var credDataBundle = new Bundle(); credDataBundle.PutByteArray(Bit.Core.Utilities.Fido2.CredentialProviderConstants.CredentialIdIntentExtra, credential.Id); @@ -40,7 +43,7 @@ namespace Bit.App.Platforms.Android.Autofill intent.PutExtra(Bit.Core.Utilities.Fido2.CredentialProviderConstants.CredentialDataIntentExtra, credDataBundle); intent.PutExtra(Bit.Core.Utilities.Fido2.CredentialProviderConstants.CredentialProviderCipherId, credential.CipherId); intent.PutExtra(Bit.Core.Utilities.Fido2.CredentialProviderConstants.CredentialHasVaultBeenUnlockedInThisTransactionExtra, hasVaultBeenUnlockedInThisTransaction); - var pendingIntent = PendingIntent.GetActivity(context, Bit.Droid.Autofill.CredentialProviderService.UniqueGetRequestCode, intent, + var pendingIntent = PendingIntent.GetActivity(context, requestCode, intent, PendingIntentFlags.Mutable | PendingIntentFlags.UpdateCurrent); return new PublicKeyCredentialEntry.Builder(