From f5a96ebfd891824395093c1cb32917d1a71bf77d Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 17:07:58 +0000 Subject: [PATCH] Update SDK to 3.0.0-8427-16db8e99 (#7284) Co-authored-by: bw-ghapp[bot] <178206702+bw-ghapp[bot]@users.noreply.github.com> Co-authored-by: Andre Rosado --- .../vault/datasource/sdk/VaultSdkSource.kt | 6 +- .../datasource/sdk/VaultSdkSourceImpl.kt | 2 +- .../CredentialExchangeImportManagerImpl.kt | 11 ++-- .../datasource/sdk/VaultSdkSourceTest.kt | 3 +- .../CredentialExchangeImportManagerTest.kt | 56 ++++++++++++------- gradle/libs.versions.toml | 2 +- 6 files changed, 48 insertions(+), 32 deletions(-) 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 cf585c82f0..beb61a8cf9 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 @@ -450,10 +450,10 @@ interface VaultSdkSource { /** * Imports the given CXF formatted [payload] into the users vault. * - * @return Result of the import. If successful, a list of [Cipher]s deciphered from the CXF - * payload. + * @return Result of the import. If successful, a list of [EncryptionContext]s for the ciphers + * deciphered from the CXF payload. */ - suspend fun importCxf(userId: String, payload: String): Result> + suspend fun importCxf(userId: String, payload: String): Result> /** * Register a new FIDO 2 credential to a cipher. 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 d7c4534cbe..335b94aab0 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 @@ -565,7 +565,7 @@ class VaultSdkSourceImpl( override suspend fun importCxf( userId: String, payload: String, - ): Result> = runCatchingWithLogs { + ): Result> = runCatchingWithLogs { getClient(userId = userId) .exporters() .importCxf(payload = payload) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/CredentialExchangeImportManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/CredentialExchangeImportManagerImpl.kt index 08811c7591..2e255d7ed7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/CredentialExchangeImportManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/CredentialExchangeImportManagerImpl.kt @@ -9,8 +9,8 @@ import com.bitwarden.cxf.parser.CredentialExchangePayloadParser import com.bitwarden.network.model.ImportCiphersJsonRequest import com.bitwarden.network.model.ImportCiphersResponseJson import com.bitwarden.network.service.CiphersService -import com.bitwarden.vault.Cipher import com.bitwarden.vault.CipherType +import com.bitwarden.vault.EncryptionContext import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.platform.manager.util.hasRestrictItemTypes import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource @@ -63,7 +63,7 @@ class CredentialExchangeImportManagerImpl( // Filter out card ciphers if RESTRICT_ITEM_TYPES policy is active val filteredCipherList = if (policyManager.hasRestrictItemTypes()) { - allCiphers.filter { cipher -> cipher.type != CipherType.CARD } + allCiphers.filter { context -> context.cipher.type != CipherType.CARD } } else { allCiphers } @@ -72,7 +72,7 @@ class CredentialExchangeImportManagerImpl( return ImportCxfPayloadResult.NoItems } - return uploadCiphers(userId = userId, ciphers = filteredCipherList) + return uploadCiphers(ciphers = filteredCipherList) .map { syncVault(it) } .fold( onSuccess = { it }, @@ -81,11 +81,10 @@ class CredentialExchangeImportManagerImpl( } private suspend fun uploadCiphers( - userId: String, - ciphers: List, + ciphers: List, ): Result { val request = ImportCiphersJsonRequest( - ciphers = ciphers.map { it.toEncryptedNetworkCipher(encryptedFor = userId) }, + ciphers = ciphers.map { it.toEncryptedNetworkCipher() }, folders = emptyList(), folderRelationships = emptyList(), ) 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 04ba6fde4d..802911dec3 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 @@ -63,6 +63,7 @@ import com.x8bit.bitwarden.data.vault.datasource.sdk.model.Fido2CredentialSearch import com.x8bit.bitwarden.data.vault.datasource.sdk.model.InitializeCryptoResult import com.x8bit.bitwarden.data.vault.datasource.sdk.model.RegisterFido2CredentialRequest import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockEncryptionContext import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkCipher import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkFolder import io.mockk.coEvery @@ -1312,7 +1313,7 @@ class VaultSdkSourceTest { @Test fun `importCxf should call SDK and return a Result with the correct data`() = runTest { val userId = "userId" - val expected = listOf(createMockSdkCipher(number = 1)) + val expected = listOf(createMockEncryptionContext(number = 1)) val cxf = "cxf" coEvery { diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/CredentialExchangeImportManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/CredentialExchangeImportManagerTest.kt index 35e3aa2076..7d496dd8cc 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/CredentialExchangeImportManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/CredentialExchangeImportManagerTest.kt @@ -10,9 +10,10 @@ import com.bitwarden.network.model.ImportCiphersJsonRequest import com.bitwarden.network.model.ImportCiphersResponseJson import com.bitwarden.network.service.CiphersService import com.bitwarden.policies.PolicyType -import com.bitwarden.vault.Cipher +import com.bitwarden.vault.EncryptionContext import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockEncryptionContext import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockPolicyView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkCipher import com.x8bit.bitwarden.data.vault.manager.model.ImportCxfPayloadResult @@ -227,7 +228,7 @@ class CredentialExchangeImportManagerTest { userId = DEFAULT_USER_ID, payload = DEFAULT_ACCOUNT_JSON, ) - } returns emptyList().asSuccess() + } returns emptyList().asSuccess() coEvery { ciphersService.importCiphers(any()) } just awaits @@ -253,8 +254,8 @@ class CredentialExchangeImportManagerTest { accountsJsonList = listOf(DEFAULT_ACCOUNT_JSON, DEFAULT_ACCOUNT_JSON_2), ) - val cipher1 = createMockSdkCipher(number = 1) - val cipher2 = createMockSdkCipher(number = 2) + val cipher1 = createMockEncryptionContext(number = 1) + val cipher2 = createMockEncryptionContext(number = 2) coEvery { vaultSdkSource.importCxf( userId = DEFAULT_USER_ID, @@ -303,7 +304,7 @@ class CredentialExchangeImportManagerTest { userId = DEFAULT_USER_ID, payload = DEFAULT_ACCOUNT_JSON, ) - } returns listOf(createMockSdkCipher(number = 1)).asSuccess() + } returns listOf(createMockEncryptionContext(number = 1)).asSuccess() val exception = RuntimeException("SDK import failed on second account") coEvery { @@ -346,9 +347,12 @@ class CredentialExchangeImportManagerTest { ), ) - val loginCipher = createMockSdkCipher(number = 1) - val cardCipher = createMockSdkCipher(number = 2).copy( - type = com.bitwarden.vault.CipherType.CARD, + val loginCipher = createMockEncryptionContext(number = 1) + val cardCipher = createMockEncryptionContext( + number = 2, + cipher = createMockSdkCipher(number = 2).copy( + type = com.bitwarden.vault.CipherType.CARD, + ), ) val mixedCipherList = listOf(loginCipher, cardCipher) @@ -387,9 +391,12 @@ class CredentialExchangeImportManagerTest { policyManager.getActivePolicies(PolicyType.RESTRICTED_ITEM_TYPES) } returns emptyList() - val loginCipher = createMockSdkCipher(number = 1) - val cardCipher = createMockSdkCipher(number = 2).copy( - type = com.bitwarden.vault.CipherType.CARD, + val loginCipher = createMockEncryptionContext(number = 1) + val cardCipher = createMockEncryptionContext( + number = 2, + cipher = createMockSdkCipher(number = 2).copy( + type = com.bitwarden.vault.CipherType.CARD, + ), ) val mixedCipherList = listOf(loginCipher, cardCipher) @@ -435,9 +442,12 @@ class CredentialExchangeImportManagerTest { ), ) - val loginCipher = createMockSdkCipher(number = 1) - val cardCipher = createMockSdkCipher(number = 2).copy( - type = com.bitwarden.vault.CipherType.CARD, + val loginCipher = createMockEncryptionContext(number = 1) + val cardCipher = createMockEncryptionContext( + number = 2, + cipher = createMockSdkCipher(number = 2).copy( + type = com.bitwarden.vault.CipherType.CARD, + ), ) val mixedCipherList = listOf(loginCipher, cardCipher) @@ -483,11 +493,17 @@ class CredentialExchangeImportManagerTest { ), ) - val cardCipher1 = createMockSdkCipher(number = 1).copy( - type = com.bitwarden.vault.CipherType.CARD, + val cardCipher1 = createMockEncryptionContext( + number = 1, + cipher = createMockSdkCipher(number = 1).copy( + type = com.bitwarden.vault.CipherType.CARD, + ), ) - val cardCipher2 = createMockSdkCipher(number = 2).copy( - type = com.bitwarden.vault.CipherType.CARD, + val cardCipher2 = createMockEncryptionContext( + number = 2, + cipher = createMockSdkCipher(number = 2).copy( + type = com.bitwarden.vault.CipherType.CARD, + ), ) val allCardsList = listOf(cardCipher1, cardCipher2) @@ -514,8 +530,8 @@ class CredentialExchangeImportManagerTest { private const val DEFAULT_USER_ID = "mockId-1" private const val DEFAULT_PAYLOAD = "mockPayload-1" -private val DEFAULT_CIPHER: Cipher = createMockSdkCipher(number = 1) -private val DEFAULT_CIPHER_LIST: List = listOf(DEFAULT_CIPHER) +private val DEFAULT_CIPHER: EncryptionContext = createMockEncryptionContext(number = 1) +private val DEFAULT_CIPHER_LIST: List = listOf(DEFAULT_CIPHER) private val DEFAULT_ACCOUNT_JSON = """ { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 85a6c1e752..bab5bac546 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom = "2.8.4" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.11.2" -bitwardenSdk = "3.0.0-8379-cc7daf10" +bitwardenSdk = "3.0.0-8427-16db8e99" crashlytics = "3.0.7" detekt = "1.23.8" firebaseBom = "34.15.0"