From 79af4a8c0cecdf5a982ebbe3d81ebd05b825cf49 Mon Sep 17 00:00:00 2001 From: David Perez Date: Mon, 27 Nov 2023 09:56:53 -0600 Subject: [PATCH] Update the Bitwarden SDK (#276) --- .../vault/datasource/sdk/VaultSdkSource.kt | 4 +- .../datasource/sdk/VaultSdkSourceImpl.kt | 6 +- .../vault/repository/VaultRepositoryImpl.kt | 12 +- .../datasource/sdk/VaultSdkSourceTest.kt | 27 ++-- .../vault/repository/VaultRepositoryTest.kt | 120 ++++++++++-------- gradle/libs.versions.toml | 2 +- 6 files changed, 93 insertions(+), 78 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt index eeb93e5e40..e6510415fe 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSource.kt @@ -5,7 +5,7 @@ import com.bitwarden.core.CipherListView import com.bitwarden.core.CipherView import com.bitwarden.core.Folder import com.bitwarden.core.FolderView -import com.bitwarden.core.InitCryptoRequest +import com.bitwarden.core.InitUserCryptoRequest import com.bitwarden.core.Send import com.bitwarden.core.SendView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.InitializeCryptoResult @@ -19,7 +19,7 @@ interface VaultSdkSource { * Attempts to initialize cryptography functionality for the Bitwarden SDK * with a given [InitCryptoRequest]. */ - suspend fun initializeCrypto(request: InitCryptoRequest): Result + suspend fun initializeCrypto(request: InitUserCryptoRequest): Result /** * Decrypts a [Cipher] returning a [CipherView] wrapped in a [Result]. diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt index 9af7b16f20..45253b5d9a 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceImpl.kt @@ -5,7 +5,7 @@ import com.bitwarden.core.CipherListView import com.bitwarden.core.CipherView import com.bitwarden.core.Folder import com.bitwarden.core.FolderView -import com.bitwarden.core.InitCryptoRequest +import com.bitwarden.core.InitUserCryptoRequest import com.bitwarden.core.Send import com.bitwarden.core.SendView import com.bitwarden.sdk.BitwardenException @@ -22,11 +22,11 @@ class VaultSdkSourceImpl( private val clientCrypto: ClientCrypto, ) : VaultSdkSource { override suspend fun initializeCrypto( - request: InitCryptoRequest, + request: InitUserCryptoRequest, ): Result = runCatching { try { - clientCrypto.initializeCrypto(req = request) + clientCrypto.initializeUserCrypto(req = request) InitializeCryptoResult.Success } catch (exception: BitwardenException) { // The only truly expected error from the SDK is an incorrect password. diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt index 983c36a6d8..a01a7e9560 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt @@ -2,7 +2,8 @@ package com.x8bit.bitwarden.data.vault.repository import com.bitwarden.core.CipherView import com.bitwarden.core.FolderView -import com.bitwarden.core.InitCryptoRequest +import com.bitwarden.core.InitUserCryptoMethod +import com.bitwarden.core.InitUserCryptoRequest import com.bitwarden.core.Kdf import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.repository.util.toSdkParams @@ -195,13 +196,14 @@ class VaultRepositoryImpl constructor( emit( vaultSdkSource .initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = kdf, email = email, - password = masterPassword, - userKey = userKey, privateKey = privateKey, - organizationKeys = organizationalKeys, + method = InitUserCryptoMethod.Password( + password = masterPassword, + userKey = userKey, + ), ), ) .fold( diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt index 1921ee2da3..f2e42afd9c 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/datasource/sdk/VaultSdkSourceTest.kt @@ -5,7 +5,7 @@ import com.bitwarden.core.CipherListView import com.bitwarden.core.CipherView import com.bitwarden.core.Folder import com.bitwarden.core.FolderView -import com.bitwarden.core.InitCryptoRequest +import com.bitwarden.core.InitUserCryptoRequest import com.bitwarden.core.Send import com.bitwarden.core.SendView import com.bitwarden.sdk.BitwardenException @@ -20,7 +20,6 @@ import io.mockk.mockk import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test -import kotlin.IllegalStateException class VaultSdkSourceTest { private val clientVault = mockk() @@ -33,9 +32,9 @@ class VaultSdkSourceTest { @Test fun `initializeCrypto with sdk success should return InitializeCryptoResult Success`() = runBlocking { - val mockInitCryptoRequest = mockk() + val mockInitCryptoRequest = mockk() coEvery { - clientCrypto.initializeCrypto( + clientCrypto.initializeUserCrypto( req = mockInitCryptoRequest, ) } returns Unit @@ -47,18 +46,18 @@ class VaultSdkSourceTest { result, ) coVerify { - clientCrypto.initializeCrypto( + clientCrypto.initializeUserCrypto( req = mockInitCryptoRequest, ) } } @Test - fun `initializeCrypto with sdk failure should return failure`() = runBlocking { - val mockInitCryptoRequest = mockk() + fun `initializeUserCrypto with sdk failure should return failure`() = runBlocking { + val mockInitCryptoRequest = mockk() val expectedException = IllegalStateException("mock") coEvery { - clientCrypto.initializeCrypto( + clientCrypto.initializeUserCrypto( req = mockInitCryptoRequest, ) } throws expectedException @@ -70,19 +69,19 @@ class VaultSdkSourceTest { result, ) coVerify { - clientCrypto.initializeCrypto( + clientCrypto.initializeUserCrypto( req = mockInitCryptoRequest, ) } } @Test - fun `initializeCrypto with BitwardenException failure should return AuthenticationError`() = + fun `initializeUserCrypto with BitwardenException failure should return AuthenticationError`() = runBlocking { - val mockInitCryptoRequest = mockk() + val mockInitCryptoRequest = mockk() val expectedException = BitwardenException.E(message = "") coEvery { - clientCrypto.initializeCrypto( + clientCrypto.initializeUserCrypto( req = mockInitCryptoRequest, ) } throws expectedException @@ -94,7 +93,7 @@ class VaultSdkSourceTest { result, ) coVerify { - clientCrypto.initializeCrypto( + clientCrypto.initializeUserCrypto( req = mockInitCryptoRequest, ) } @@ -208,7 +207,7 @@ class VaultSdkSourceTest { send = mockSend, ) assertEquals( - expectedResult.asSuccess(), result, + expectedResult.asSuccess(), result, ) coVerify { clientVault.sends().decrypt( diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt index 5e3eb9e55d..2c23192702 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryTest.kt @@ -3,7 +3,8 @@ package com.x8bit.bitwarden.data.vault.repository import app.cash.turbine.test import com.bitwarden.core.CipherView import com.bitwarden.core.FolderView -import com.bitwarden.core.InitCryptoRequest +import com.bitwarden.core.InitUserCryptoMethod +import com.bitwarden.core.InitUserCryptoRequest import com.bitwarden.core.Kdf import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountJson import com.x8bit.bitwarden.data.auth.datasource.disk.model.UserStateJson @@ -489,13 +490,14 @@ class VaultRepositoryTest { fakeAuthDiskSource.userState = MOCK_USER_STATE coEvery { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = Kdf.Pbkdf2(iterations = DEFAULT_PBKDF2_ITERATIONS.toUInt()), email = "email", - password = "mockPassword-1", - userKey = "mockKey-1", privateKey = "mockPrivateKey-1", - organizationKeys = mapOf(), + method = InitUserCryptoMethod.Password( + password = "mockPassword-1", + userKey = "mockKey-1", + ), ), ) } returns Result.success(InitializeCryptoResult.Success) @@ -549,13 +551,14 @@ class VaultRepositoryTest { fakeAuthDiskSource.userState = MOCK_USER_STATE coEvery { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = Kdf.Pbkdf2(iterations = DEFAULT_PBKDF2_ITERATIONS.toUInt()), email = "email", - password = "mockPassword-1", - userKey = "mockKey-1", privateKey = "mockPrivateKey-1", - organizationKeys = mapOf(), + method = InitUserCryptoMethod.Password( + password = "mockPassword-1", + userKey = "mockKey-1", + ), ), ) } just awaits @@ -594,13 +597,14 @@ class VaultRepositoryTest { fakeAuthDiskSource.userState = MOCK_USER_STATE coEvery { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = Kdf.Pbkdf2(iterations = DEFAULT_PBKDF2_ITERATIONS.toUInt()), email = "email", - password = "mockPassword-1", - userKey = "mockKey-1", privateKey = "mockPrivateKey-1", - organizationKeys = mapOf(), + method = InitUserCryptoMethod.Password( + password = "mockPassword-1", + userKey = "mockKey-1", + ), ), ) } just awaits @@ -641,13 +645,14 @@ class VaultRepositoryTest { fakeAuthDiskSource.userState = MOCK_USER_STATE coEvery { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = Kdf.Pbkdf2(iterations = DEFAULT_PBKDF2_ITERATIONS.toUInt()), email = "email", - password = "mockPassword-1", - userKey = "mockKey-1", privateKey = "mockPrivateKey-1", - organizationKeys = mapOf(), + method = InitUserCryptoMethod.Password( + password = "mockPassword-1", + userKey = "mockKey-1", + ), ), ) } returns Result.failure(IllegalStateException()) @@ -696,13 +701,14 @@ class VaultRepositoryTest { fakeAuthDiskSource.userState = MOCK_USER_STATE coEvery { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = Kdf.Pbkdf2(iterations = DEFAULT_PBKDF2_ITERATIONS.toUInt()), email = "email", - password = "", - userKey = "mockKey-1", privateKey = "mockPrivateKey-1", - organizationKeys = mapOf(), + method = InitUserCryptoMethod.Password( + password = "", + userKey = "mockKey-1", + ), ), ) } returns Result.success(InitializeCryptoResult.AuthenticationError) @@ -828,13 +834,14 @@ class VaultRepositoryTest { val organizationalKeys = emptyMap() coEvery { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = kdf, email = email, - password = masterPassword, - userKey = userKey, privateKey = privateKey, - organizationKeys = organizationalKeys, + method = InitUserCryptoMethod.Password( + password = masterPassword, + userKey = userKey, + ), ), ) } returns InitializeCryptoResult.Success.asSuccess() @@ -864,13 +871,14 @@ class VaultRepositoryTest { ) coVerify(exactly = 1) { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = kdf, email = email, - password = masterPassword, - userKey = userKey, privateKey = privateKey, - organizationKeys = organizationalKeys, + method = InitUserCryptoMethod.Password( + password = masterPassword, + userKey = userKey, + ), ), ) } @@ -889,13 +897,14 @@ class VaultRepositoryTest { val organizationalKeys = emptyMap() coEvery { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = kdf, email = email, - password = masterPassword, - userKey = userKey, privateKey = privateKey, - organizationKeys = organizationalKeys, + method = InitUserCryptoMethod.Password( + password = masterPassword, + userKey = userKey, + ), ), ) } returns InitializeCryptoResult.AuthenticationError.asSuccess() @@ -925,13 +934,14 @@ class VaultRepositoryTest { ) coVerify(exactly = 1) { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = kdf, email = email, - password = masterPassword, - userKey = userKey, privateKey = privateKey, - organizationKeys = organizationalKeys, + method = InitUserCryptoMethod.Password( + password = masterPassword, + userKey = userKey, + ), ), ) } @@ -948,13 +958,14 @@ class VaultRepositoryTest { val organizationalKeys = emptyMap() coEvery { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = kdf, email = email, - password = masterPassword, - userKey = userKey, privateKey = privateKey, - organizationKeys = organizationalKeys, + method = InitUserCryptoMethod.Password( + password = masterPassword, + userKey = userKey, + ), ), ) } returns Throwable("Fail").asFailure() @@ -984,13 +995,14 @@ class VaultRepositoryTest { ) coVerify(exactly = 1) { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = kdf, email = email, - password = masterPassword, - userKey = userKey, privateKey = privateKey, - organizationKeys = organizationalKeys, + method = InitUserCryptoMethod.Password( + password = masterPassword, + userKey = userKey, + ), ), ) } @@ -1007,13 +1019,14 @@ class VaultRepositoryTest { val organizationalKeys = emptyMap() coEvery { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = kdf, email = email, - password = masterPassword, - userKey = userKey, privateKey = privateKey, - organizationKeys = organizationalKeys, + method = InitUserCryptoMethod.Password( + password = masterPassword, + userKey = userKey, + ), ), ) } just awaits @@ -1037,13 +1050,14 @@ class VaultRepositoryTest { coVerify(exactly = 0) { syncService.sync() } coVerify(exactly = 1) { vaultSdkSource.initializeCrypto( - request = InitCryptoRequest( + request = InitUserCryptoRequest( kdfParams = kdf, email = email, - password = masterPassword, - userKey = userKey, privateKey = privateKey, - organizationKeys = organizationalKeys, + method = InitUserCryptoMethod.Password( + password = masterPassword, + userKey = userKey, + ), ), ) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6f273ad797..f94e83d29c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ androidxRoom = "2.6.0" androidxSplash = "1.1.0-alpha02" # Once the app and SDK reach a critical point of completeness we should begin fixing the version # here (BIT-311). -bitwardenSdk = "0.3.1-20231116.203646-8" +bitwardenSdk = "0.3.1-20231127.121400-20" detekt = "1.23.1" firebaseBom = "32.5.0" glide = "4.15.1"