diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt index 7cda94929b..d85970d0b7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt @@ -23,6 +23,7 @@ import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherView import com.bitwarden.vault.Collection import com.bitwarden.vault.CollectionView +import com.bitwarden.vault.DecryptCipherListResult import com.bitwarden.vault.EncryptionContext import com.bitwarden.vault.Folder import com.bitwarden.vault.FolderView @@ -227,6 +228,17 @@ interface VaultSdkSource { cipherList: List, ): Result> + /** + * Decrypts a list of [Cipher]s for the user with the given [userId]. + * + * @return A [DecryptCipherListResult] containing the decrypted [CipherListView]s and references + * to [Cipher]s that cannot be decrypted. + */ + suspend fun decryptCipherListWithFailures( + userId: String, + cipherList: List, + ): Result + /** * Decrypts a [Collection] for the user with the given [userId], returning a [CollectionView] * wrapped in a [Result]. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt index acc4923fb6..f97c1bb5a7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt @@ -25,6 +25,7 @@ import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherView import com.bitwarden.vault.Collection import com.bitwarden.vault.CollectionView +import com.bitwarden.vault.DecryptCipherListResult import com.bitwarden.vault.EncryptionContext import com.bitwarden.vault.Folder import com.bitwarden.vault.FolderView @@ -311,6 +312,17 @@ class VaultSdkSourceImpl( } } + override suspend fun decryptCipherListWithFailures( + userId: String, + cipherList: List, + ): Result = + runCatchingWithLogs { + getClient(userId = userId) + .vault() + .ciphers() + .decryptListWithFailures(cipherList) + } + override suspend fun decryptCollection( userId: String, collection: Collection, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt index de87e1b4d9..2df0fec3a9 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt @@ -41,6 +41,7 @@ import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherView import com.bitwarden.vault.Collection import com.bitwarden.vault.CollectionView +import com.bitwarden.vault.DecryptCipherListResult import com.bitwarden.vault.EncryptionContext import com.bitwarden.vault.Folder import com.bitwarden.vault.FolderView @@ -1369,6 +1370,43 @@ class VaultSdkSourceTest { assertTrue(result.isFailure) } + + @Test + fun `decryptCipherListWithFailures should return Success when successful`() = runTest { + val userId = "userId" + val mockCipherList = mockk>() + val expectedResult = mockk() + + coEvery { + clientVault.ciphers().decryptListWithFailures( + ciphers = mockCipherList, + ) + } returns expectedResult + + val result = vaultSdkSource.decryptCipherListWithFailures( + userId = userId, + cipherList = mockCipherList, + ) + + assertTrue(result.isSuccess) + } + + @Test + fun `decryptCipherListWithFailures should return Failure when Bitwarden exception is thrown`() = + runTest { + val userId = "userId" + val mockCipherList = mockk>() + coEvery { + clientVault.ciphers().decryptListWithFailures( + ciphers = mockCipherList, + ) + } throws BitwardenException.E("mockException") + val result = vaultSdkSource.decryptCipherListWithFailures( + userId = userId, + cipherList = mockCipherList, + ) + assertTrue(result.isFailure) + } } private const val DEFAULT_SIGNATURE = "0987654321ABCDEF"