From 912f734cae9d9944218f6380fa3f6f89fd7fa4fd Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Mon, 28 Jul 2025 15:13:09 -0400 Subject: [PATCH] [PM-24205] Fix Fido2CredentialStore to save new credentials correctly (#5601) --- .../vault/datasource/sdk/di/VaultSdkModule.kt | 5 ++++ .../sdk/model/Fido2CredentialStoreImpl.kt | 26 +++++++++++-------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/di/VaultSdkModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/di/VaultSdkModule.kt index f59a11b242..39c1af5d7a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/di/VaultSdkModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/di/VaultSdkModule.kt @@ -2,6 +2,7 @@ package com.x8bit.bitwarden.data.vault.datasource.sdk.di import com.bitwarden.data.manager.DispatcherManager import com.bitwarden.sdk.Fido2CredentialStore +import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.SdkClientManager import com.x8bit.bitwarden.data.platform.manager.sdk.SdkRepositoryFactory @@ -50,8 +51,12 @@ object VaultSdkModule { @Provides @Singleton fun providesFido2CredentialStore( + authRepository: AuthRepository, + vaultSdkSource: VaultSdkSource, vaultRepository: VaultRepository, ): Fido2CredentialStore = Fido2CredentialStoreImpl( + authRepository = authRepository, + vaultSdkSource = vaultSdkSource, vaultRepository = vaultRepository, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/Fido2CredentialStoreImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/Fido2CredentialStoreImpl.kt index 9cb23efa01..a0e20f5939 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/Fido2CredentialStoreImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/Fido2CredentialStoreImpl.kt @@ -5,8 +5,11 @@ import com.bitwarden.sdk.Fido2CredentialStore import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherView import com.bitwarden.vault.EncryptionContext +import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials import com.x8bit.bitwarden.data.autofill.util.login +import com.x8bit.bitwarden.data.platform.error.NoActiveUserException +import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource import com.x8bit.bitwarden.data.vault.manager.model.GetCipherResult import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.SyncVaultDataResult @@ -17,6 +20,8 @@ import timber.log.Timber */ @OmitFromCoverage class Fido2CredentialStoreImpl( + private val authRepository: AuthRepository, + private val vaultSdkSource: VaultSdkSource, private val vaultRepository: VaultRepository, ) : Fido2CredentialStore { @@ -79,18 +84,17 @@ class Fido2CredentialStoreImpl( * Save the provided [cred] to the users vault. */ override suspend fun saveCredential(cred: EncryptionContext) { - vaultRepository.getCipher(cred.cipher.id.orEmpty()) - .toCipherViewOrNull() - ?.let { cipherView -> - cipherView.id - ?.let { cipherId -> - vaultRepository.updateCipher( - cipherId = cipherId, - cipherView = cipherView, - ) - } - ?: vaultRepository.createCipher(cipherView = cipherView) + vaultSdkSource + .decryptCipher( + userId = authRepository.activeUserId ?: throw NoActiveUserException(), + cipher = cred.cipher, + ) + .map { decryptedCipherView -> + decryptedCipherView.id + ?.let { vaultRepository.updateCipher(it, decryptedCipherView) } + ?: vaultRepository.createCipher(decryptedCipherView) } + .onFailure { throw it } } /**