From 3397b7c433563f34937faba7efd46cf8e4174a3c Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 28 Oct 2026 12:49:28 +0000 Subject: [PATCH 01/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9751-1789780d --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 772a7f7de85..ed2dcbcab4e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9737-d9119f7a" +bitwardenSdk = "4.0.0-9751-1789780d" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 277bb0889a0833d88a0c0918dac74d75c6f6b356 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 28 Oct 2026 14:53:51 +0000 Subject: [PATCH 02/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9762-b8c41223 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ed2dcbcab4e..a5d853c5d8f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9751-1789780d" +bitwardenSdk = "4.0.0-9762-b8c41223" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 164adad0b2cd8c6ea6285038d2c132f44e186423 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 28 Oct 2026 15:18:27 +0000 Subject: [PATCH 03/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9769-4d983d78 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a5d853c5d8f..611389cef65 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9762-b8c41223" +bitwardenSdk = "4.0.0-9769-4d983d78" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 6952eacd372a4dfa2045bcea5b87a0a7290bab05 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 28 Oct 2026 15:52:19 +0000 Subject: [PATCH 04/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9779-5c0b59ae --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 611389cef65..416da5c623a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9769-4d983d78" +bitwardenSdk = "4.0.0-9779-5c0b59ae" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 1a8d111d40164102bd9ee618a74574f552f6bc10 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 03:58:33 +0000 Subject: [PATCH 05/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9795-47f3a7f7 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 416da5c623a..b6a6c1a9579 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9779-5c0b59ae" +bitwardenSdk = "4.0.0-9795-47f3a7f7" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From b125d0bcefeabdf5b8c73531b5a4846588e7fc0f Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 07:20:09 +0000 Subject: [PATCH 06/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9796-f2f05345 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b6a6c1a9579..d169b33e856 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9795-47f3a7f7" +bitwardenSdk = "4.0.0-9796-f2f05345" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 31bcd389ef0390a91d210c373687623e7ec485f4 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 08:19:25 +0000 Subject: [PATCH 07/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9801-71794918 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d169b33e856..46da30e77ce 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9796-f2f05345" +bitwardenSdk = "4.0.0-9801-71794918" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 0e1187e8f4ba3ff3091a692dc7c95b28c0017274 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 12:51:23 +0000 Subject: [PATCH 08/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9812-89119cd8 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 46da30e77ce..2aa1c8d8c66 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9801-71794918" +bitwardenSdk = "4.0.0-9812-89119cd8" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 88d195567d68306bd31d18d7669c7eaf81cfe175 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 13:01:57 +0000 Subject: [PATCH 09/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9816-d7ab9964 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2aa1c8d8c66..dab12709133 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9812-89119cd8" +bitwardenSdk = "4.0.0-9816-d7ab9964" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 82e0db229bccec30797e9296daab7767dae72492 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 14:25:06 +0000 Subject: [PATCH 10/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9829-bae4427e --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dab12709133..c7482dac3cc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9816-d7ab9964" +bitwardenSdk = "4.0.0-9829-bae4427e" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From facbe91e927bd38da1770f8412244c1e95497482 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 14:41:52 +0000 Subject: [PATCH 11/70] Preserve login httpAuthenticationEnabled on add/edit save MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SDK bump to 4.0.0-9829-bae4427e adds LoginView.httpAuthenticationEnabled (bitwarden/sdk-internal#1675). It defaults to null in the generated Kotlin, so the build stayed clean, but toLoginView rebuilds a fresh LoginView from UI state on every save and was dropping the field. On the blob path the SDK seals this with unwrap_or(false), so sending null is not "leave unchanged" — it writes false. Editing a blob-encrypted login on Android would have silently turned off an HTTP authentication setting enabled by another client. Android does not model the setting, so round-trip it from the original cipher, matching autofillOnPageLoad. --- .../vault/util/VaultAddItemStateExtensions.kt | 4 ++ .../util/VaultAddItemStateExtensionsTest.kt | 37 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensions.kt index fd9dcec43ec..5cc383b09d4 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensions.kt @@ -297,6 +297,10 @@ private fun VaultAddEditState.ViewState.Content.ItemType.toLoginView( uris = it.uriList.toLoginUriView(), totp = it.totp.orNullIfBlank(), autofillOnPageLoad = common.originalCipher?.login?.autofillOnPageLoad, + // Not modeled in the UI; preserved so saving does not clear a value set elsewhere. + httpAuthenticationEnabled = common.originalCipher + ?.login + ?.httpAuthenticationEnabled, fido2Credentials = common.originalCipher?.login?.fido2Credentials .takeIf { _ -> it.fido2CredentialCreationDateTime != null }, ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensionsTest.kt index ebc0376413a..6b3df1e4e75 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultAddItemStateExtensionsTest.kt @@ -228,6 +228,43 @@ class VaultAddItemStateExtensionsTest { ) } + @Test + fun `toCipherView should preserve httpAuthenticationEnabled from the original cipher`() { + val cipherView = DEFAULT_LOGIN_CIPHER_VIEW.copy( + login = requireNotNull(DEFAULT_LOGIN_CIPHER_VIEW.login).copy( + httpAuthenticationEnabled = true, + ), + ) + val viewState = VaultAddEditState.ViewState.Content( + common = VaultAddEditState.ViewState.Content.Common( + originalCipher = cipherView, + name = "mockName-1", + selectedOwnerId = "mockOwnerId-1", + ), + isIndividualVaultDisabled = false, + type = VaultAddEditState.ViewState.Content.ItemType.Login( + username = "mockUsername-1", + password = "mockPassword-1", + ), + ) + + val result = viewState.toCipherView(clock = FIXED_CLOCK, isPremiumUser = true) + + assertEquals( + LoginView( + username = "mockUsername-1", + password = "mockPassword-1", + passwordRevisionDate = FIXED_CLOCK.instant(), + uris = null, + totp = null, + autofillOnPageLoad = false, + httpAuthenticationEnabled = true, + fido2Credentials = null, + ), + result.login, + ) + } + @Test fun `toCipherView should transform SecureNotes ItemType to CipherView`() { val viewState = VaultAddEditState.ViewState.Content( From 27455c521b950c745418a54c8e87a245042ff619 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 18:48:29 +0000 Subject: [PATCH 12/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9838-404d3d4f --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c7482dac3cc..6095a4bc964 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9829-bae4427e" +bitwardenSdk = "4.0.0-9838-404d3d4f" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 26808e50f52ccd62902f96bd93b8729d71b8e1b7 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 29 Oct 2026 21:06:19 +0000 Subject: [PATCH 13/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9839-c1c9b9a5 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6095a4bc964..66afc21176f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9838-404d3d4f" +bitwardenSdk = "4.0.0-9839-c1c9b9a5" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 8c44b601509f3596e01d39fedeab142452f1de04 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 15:44:20 +0000 Subject: [PATCH 14/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9866-d3938694 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 66afc21176f..9e03f59602c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9839-c1c9b9a5" +bitwardenSdk = "4.0.0-9866-d3938694" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 7d89bda95f98804d2fcdc84194c2290f42e51eda Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 16:42:19 +0000 Subject: [PATCH 15/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9867-3e7a9738 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9e03f59602c..0ee283e1e80 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9866-d3938694" +bitwardenSdk = "4.0.0-9867-3e7a9738" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From f73449e38384ccf4fffeedb23ae2003fa4c4cff4 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 30 Oct 2026 17:30:58 +0000 Subject: [PATCH 16/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9872-92ca8306 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0ee283e1e80..e7ceab580d6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9867-3e7a9738" +bitwardenSdk = "4.0.0-9872-92ca8306" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 936018850557466e026170330ebef56341487975 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 2 Nov 2026 13:06:26 +0000 Subject: [PATCH 17/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9898-1819c5a0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e7ceab580d6..de817bef0d6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9872-92ca8306" +bitwardenSdk = "4.0.0-9898-1819c5a0" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 4db1a947f43f17477188c4f13a4b7a673422c1db Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 2 Nov 2026 15:00:38 +0000 Subject: [PATCH 18/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9907-36e5096b --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index de817bef0d6..9a86bcf079f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9898-1819c5a0" +bitwardenSdk = "4.0.0-9907-36e5096b" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 7bd8dde2f4ea592b1edf25249d1ce43ebcc24fb5 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 2 Nov 2026 18:52:34 +0000 Subject: [PATCH 19/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9914-ca53f727 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9a86bcf079f..c55c44df11a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9907-36e5096b" +bitwardenSdk = "4.0.0-9914-ca53f727" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 50841f310e1f917257361d2b294a2a3c31bff2a3 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 3 Nov 2026 10:58:06 +0000 Subject: [PATCH 20/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9919-2f10c1cb --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c55c44df11a..b70b7320a9d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9914-ca53f727" +bitwardenSdk = "4.0.0-9919-2f10c1cb" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From bdbabfe3eac4c1d70775bc5514355ebee1cc45c1 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 3 Nov 2026 11:13:36 +0000 Subject: [PATCH 21/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9921-1baf7bc0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b70b7320a9d..15d238afa10 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9919-2f10c1cb" +bitwardenSdk = "4.0.0-9921-1baf7bc0" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 4a9530af8def0d03dc5c2b1d798d0ac46be0406a Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 3 Nov 2026 13:01:44 +0000 Subject: [PATCH 22/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9932-37d73c02 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 15d238afa10..e8f17a0a850 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9921-1baf7bc0" +bitwardenSdk = "4.0.0-9932-37d73c02" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 89db797a59aaf586399e1834bb6dfd2142b4d9bb Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 3 Nov 2026 13:13:14 +0000 Subject: [PATCH 23/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9933-8aa7955d --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e8f17a0a850..0801ba342f0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9932-37d73c02" +bitwardenSdk = "4.0.0-9933-8aa7955d" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 0edd82fe57e58fc027d42829710631cd1c7094e4 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 3 Nov 2026 20:58:48 +0000 Subject: [PATCH 24/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9991-a06993f4 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0801ba342f0..f5277ec2563 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9933-8aa7955d" +bitwardenSdk = "4.0.0-9991-a06993f4" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 018f2f66ebefaab3ee0896416927181ab0b592e6 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 3 Nov 2026 21:22:45 +0000 Subject: [PATCH 25/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9993-d4722984 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f5277ec2563..2a011a1ef23 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9991-a06993f4" +bitwardenSdk = "4.0.0-9993-d4722984" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 11f591464c97ffd79a776d54b427a978091a99ad Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 3 Nov 2026 23:06:24 +0000 Subject: [PATCH 26/70] SDK Update - com.bitwarden:sdk-android 4.0.0-9998-18a2d27a --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2a011a1ef23..6fd3e901842 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9993-d4722984" +bitwardenSdk = "4.0.0-9998-18a2d27a" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 4b9950e988367e5d93bdcd56751ec94002b458ad Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 4 Nov 2026 00:19:15 +0000 Subject: [PATCH 27/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10000-6b0adaf7 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6fd3e901842..d19d97c74e8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-9998-18a2d27a" +bitwardenSdk = "4.0.0-10000-6b0adaf7" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From fd66d7789f4b474bc3ffa36517a16b05d15bd7d5 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 4 Nov 2026 12:17:04 +0000 Subject: [PATCH 28/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10010-6b78af30 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d19d97c74e8..10cb67412a8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10000-6b0adaf7" +bitwardenSdk = "4.0.0-10010-6b78af30" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From fa942cf7da0dcb06069ea65cc4a94af01d498ea9 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 4 Nov 2026 12:32:09 +0000 Subject: [PATCH 29/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10011-b2d59860 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 10cb67412a8..491776193c8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10010-6b78af30" +bitwardenSdk = "4.0.0-10011-b2d59860" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From b4ffa1194a55e5647a90af9fd3dcaf1948a4add8 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 4 Nov 2026 12:52:18 +0000 Subject: [PATCH 30/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10015-28d17ad2 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 491776193c8..9860dc31516 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10011-b2d59860" +bitwardenSdk = "4.0.0-10015-28d17ad2" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From f2fd4c20aa3f212d39ad389183bfdf601d0e56f0 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 4 Nov 2026 15:33:20 +0000 Subject: [PATCH 31/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10023-11cdbce9 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9860dc31516..00c1a018229 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10015-28d17ad2" +bitwardenSdk = "4.0.0-10023-11cdbce9" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 25e4a48a58fdee5e7dc73fccc3112f57193d8b51 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 4 Nov 2026 15:36:44 +0000 Subject: [PATCH 32/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10024-67d741eb --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 00c1a018229..0395fe03277 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10023-11cdbce9" +bitwardenSdk = "4.0.0-10024-67d741eb" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 87f15d471c50c867070325ac71979d503191050a Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 04:26:25 +0000 Subject: [PATCH 33/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10036-99102101 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0395fe03277..6e3dcc02c6f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10024-67d741eb" +bitwardenSdk = "4.0.0-10036-99102101" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 16ccfb5a448ffcb17373502c8c573d3b7f2b8227 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 04:44:20 +0000 Subject: [PATCH 34/70] Persist SDK pin length through the state bridge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SDK bump to 4.0.0-10036-99102101 adds a pinLength set/get/clear triple to the StateBridgeForeignImpl callback interface (likely from the PIN migration in bitwarden/sdk-internal#1705). It is a with_foreign callback interface, so Kotlin must implement it; SdkStateBridge is the only implementor in the repo and app:compileStandardDebugKotlin failed without it. The state bridge is a storage abstraction: the SDK calls set and expects a later get to return the value. Stubbing it the way getWebauthnPrfUnlockData is stubbed would be wrong by analogy — those are no-ops because Android does not support WebAuthn PRF unlock at all, so the SDK never writes them. Android does support PIN unlock, and every other PIN field on this bridge (encryptedPin, the ephemeral and persistent pin envelopes) is disk-backed, so dropping a pin length the SDK asked us to persist could silently change PIN behavior across process restarts. Persisting a value the SDK ends up ignoring costs nothing. Back it with a new AuthDiskSource pinLength field, mirroring encryptedPin: unencrypted preferences, user-scoped key, cleared in clearData on logout. The SDK types it as UInt; Int is stored on disk and converted at the bridge, which round-trips bit-exactly. AuthDiskSourceImpl crossed the detekt LargeClass threshold with the new accessors, suppressed to match SettingsDiskSourceImpl rather than splitting the class in an SDK-bump follow-up. --- .../auth/datasource/disk/AuthDiskSource.kt | 10 +++++ .../datasource/disk/AuthDiskSourceImpl.kt | 14 ++++++- .../manager/sdk/statebridge/SdkStateBridge.kt | 11 +++++ .../datasource/disk/AuthDiskSourceTest.kt | 41 +++++++++++++++++++ .../disk/util/FakeAuthDiskSource.kt | 15 +++++++ .../sdk/statebridge/SdkStateBridgeTest.kt | 25 +++++++++++ 6 files changed, 115 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSource.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSource.kt index a24d5aba7a1..ce06ea69b77 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSource.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSource.kt @@ -308,6 +308,16 @@ interface AuthDiskSource : AppIdProvider { */ fun storeEncryptedPin(userId: String, encryptedPin: String?) + /** + * Retrieves the number of digits in the PIN for the given [userId]. + */ + fun getPinLength(userId: String): Int? + + /** + * Stores the number of digits in the PIN for the given [userId]. + */ + fun storePinLength(userId: String, pinLength: Int?) + /** * Gets the organization keys for the given [userId] in the form of a mapping from organization * ID to encrypted organization key. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceImpl.kt index 2a0e3a271d9..a3310feb513 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceImpl.kt @@ -48,6 +48,7 @@ private const val MASTER_KEY_ENCRYPTION_PRIVATE_KEY = "encPrivateKey" private const val PIN_PROTECTED_USER_KEY_KEY = "pinKeyEncryptedUserKey" private const val PIN_PROTECTED_USER_KEY_KEY_ENVELOPE = "pinKeyEncryptedUserKeyEnvelope" private const val ENCRYPTED_PIN_KEY = "protectedPin" +private const val PIN_LENGTH_KEY = "pinLength" private const val ORGANIZATIONS_KEY = "organizations" private const val ORGANIZATION_KEYS_KEY = "encOrgKeys" private const val TWO_FACTOR_TOKEN_KEY = "twoFactorToken" @@ -68,7 +69,7 @@ private const val V2_ENCRYPTED_MIGRATIONS_GRACE_PERIOD_START = /** * Primary implementation of [AuthDiskSource]. */ -@Suppress("TooManyFunctions") +@Suppress("TooManyFunctions", "LargeClass") class AuthDiskSourceImpl( encryptedSharedPreferences: SharedPreferences, keystoreEncryptedPreferences: SharedPreferences, @@ -194,6 +195,7 @@ class AuthDiskSourceImpl( storeShowImportLogins(userId = userId, showImportLogins = null) storeLastLockTimestamp(userId = userId, lastLockTimestamp = null) storeEncryptedPin(userId = userId, encryptedPin = null) + storePinLength(userId = userId, pinLength = null) storePinProtectedUserKey(userId = userId, pinProtectedUserKey = null) storeEphemeralPinProtectedUserKeyEnvelope( userId = userId, @@ -472,6 +474,16 @@ class AuthDiskSourceImpl( ) } + override fun getPinLength(userId: String): Int? = + getInt(key = PIN_LENGTH_KEY.appendIdentifier(userId)) + + override fun storePinLength(userId: String, pinLength: Int?) { + putInt( + key = PIN_LENGTH_KEY.appendIdentifier(userId), + value = pinLength, + ) + } + override fun getOrganizationKeys(userId: String): Map? = getString(key = ORGANIZATION_KEYS_KEY.appendIdentifier(userId)) ?.let { json.decodeFromStringOrNull(it) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/statebridge/SdkStateBridge.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/statebridge/SdkStateBridge.kt index aa528c744bc..5b4155d4a45 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/statebridge/SdkStateBridge.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/statebridge/SdkStateBridge.kt @@ -95,6 +95,17 @@ internal class SdkStateBridge( authDiskSource.storeEncryptedPin(userId = userId, encryptedPin = null) } + override suspend fun setPinLength(value: UInt) { + authDiskSource.storePinLength(userId = userId, pinLength = value.toInt()) + } + + override suspend fun getPinLength(): UInt? = + authDiskSource.getPinLength(userId = userId)?.toUInt() + + override suspend fun clearPinLength() { + authDiskSource.storePinLength(userId = userId, pinLength = null) + } + override suspend fun setV2UpgradeToken(value: V2UpgradeToken) { authDiskSource.storeV2UpgradeToken( userId = userId, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt index b9d1f77a4e4..f0d771c0cba 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/AuthDiskSourceTest.kt @@ -318,6 +318,7 @@ class AuthDiskSourceTest { biometricsKey = "1234-9876-0192", ) authDiskSource.storeEncryptedPin(userId = userId, encryptedPin = "encryptedPin") + authDiskSource.storePinLength(userId = userId, pinLength = 4) authDiskSource.storePinProtectedUserKey( userId = userId, pinProtectedUserKey = "pinProtectedUserKey", @@ -415,6 +416,7 @@ class AuthDiskSourceTest { assertNull(authDiskSource.getAuthenticatorSyncUnlockKey(userId = userId)) assertNull(authDiskSource.getShowImportLogins(userId = userId)) assertNull(authDiskSource.getEncryptedPin(userId = userId)) + assertNull(authDiskSource.getPinLength(userId = userId)) assertNull(authDiskSource.getPinProtectedUserKey(userId = userId)) assertNull(authDiskSource.getPinProtectedUserKeyEnvelope(userId = userId)) assertNull(authDiskSource.getEphemeralPinProtectedUserKeyEnvelope(userId = userId)) @@ -1071,6 +1073,45 @@ class AuthDiskSourceTest { ) } + @Test + fun `getPinLength should pull from SharedPreferences`() { + val pinLengthBaseKey = "bwPreferencesStorage:pinLength" + val mockUserId = "mockUserId" + val mockPinLength = 4 + fakeSharedPreferences + .edit { + putInt( + "${pinLengthBaseKey}_$mockUserId", + mockPinLength, + ) + } + val actual = authDiskSource.getPinLength(userId = mockUserId) + assertEquals( + mockPinLength, + actual, + ) + } + + @Test + fun `storePinLength should update SharedPreferences`() { + val pinLengthBaseKey = "bwPreferencesStorage:pinLength" + val mockUserId = "mockUserId" + val mockPinLength = 6 + authDiskSource.storePinLength( + userId = mockUserId, + pinLength = mockPinLength, + ) + val actual = fakeSharedPreferences + .getInt( + "${pinLengthBaseKey}_$mockUserId", + 0, + ) + assertEquals( + mockPinLength, + actual, + ) + } + @Test fun `getOrganizationKeys should pull from SharedPreferences`() { val organizationKeysBaseKey = "bwPreferencesStorage:encOrgKeys" diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/util/FakeAuthDiskSource.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/util/FakeAuthDiskSource.kt index 950d77584fb..67470a33bbf 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/util/FakeAuthDiskSource.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/datasource/disk/util/FakeAuthDiskSource.kt @@ -50,6 +50,7 @@ class FakeAuthDiskSource : AuthDiskSource { private val storedUserAutoUnlockKeys = mutableMapOf() private val storedPinProtectedUserKeys = mutableMapOf>() private val storedEncryptedPins = mutableMapOf() + private val storedPinLengths = mutableMapOf() private val storedOrganizations = mutableMapOf?>() private val storedOrganizationKeys = mutableMapOf?>() @@ -100,6 +101,7 @@ class FakeAuthDiskSource : AuthDiskSource { storedEphemeralPinProtectedUserKeyEnvelopes.remove(userId) storedPersistentPinProtectedUserKeyEnvelopes.remove(userId) storedEncryptedPins.remove(userId) + storedPinLengths.remove(userId) storedPinProtectedUserKeys.remove(userId) storedV2UpgradeTokens.remove(userId) storedUserKeyIds.remove(userId) @@ -245,6 +247,12 @@ class FakeAuthDiskSource : AuthDiskSource { storedEncryptedPins[userId] = encryptedPin } + override fun getPinLength(userId: String): Int? = storedPinLengths[userId] + + override fun storePinLength(userId: String, pinLength: Int?) { + storedPinLengths[userId] = pinLength + } + override fun getOrganizationKeys( userId: String, ): Map? = storedOrganizationKeys[userId] @@ -523,6 +531,13 @@ class FakeAuthDiskSource : AuthDiskSource { assertEquals(encryptedPin, storedEncryptedPins[userId]) } + /** + * Assert that the [pinLength] was stored successfully using the [userId]. + */ + fun assertPinLength(userId: String, pinLength: Int?) { + assertEquals(pinLength, storedPinLengths[userId]) + } + /** * Assert that the [pinProtectedUserKey] was stored successfully using the [userId]. */ diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/statebridge/SdkStateBridgeTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/statebridge/SdkStateBridgeTest.kt index 1e5eb4b839b..f041c2c32fc 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/statebridge/SdkStateBridgeTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/sdk/statebridge/SdkStateBridgeTest.kt @@ -180,6 +180,31 @@ class SdkStateBridgeTest { authDiskSource.assertEncryptedPin(userId = USER_ID, encryptedPin = null) } + @Test + fun `setPinLength should store the pin length`() = runTest { + stateBridge.setPinLength(value = 4u) + + authDiskSource.assertPinLength(userId = USER_ID, pinLength = 4) + } + + @Test + fun `getPinLength should return the stored pin length`() = runTest { + assertNull(stateBridge.getPinLength()) + + authDiskSource.storePinLength(userId = USER_ID, pinLength = 4) + + assertEquals(4u, stateBridge.getPinLength()) + } + + @Test + fun `clearPinLength should clear the pin length`() = runTest { + authDiskSource.storePinLength(userId = USER_ID, pinLength = 4) + + stateBridge.clearPinLength() + + authDiskSource.assertPinLength(userId = USER_ID, pinLength = null) + } + @Test fun `setV2UpgradeToken should store the token as a V2UpgradeTokenJson`() = runTest { stateBridge.setV2UpgradeToken(value = V2_UPGRADE_TOKEN) From 1bc996e0939a86730dea42c5da638edbef2bac9f Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 07:33:45 +0000 Subject: [PATCH 35/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10044-144b5027 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6e3dcc02c6f..e701fef3873 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10036-99102101" +bitwardenSdk = "4.0.0-10044-144b5027" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 67227b3da57f1c85dd24b25ba9819959efc967f1 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 08:19:38 +0000 Subject: [PATCH 36/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10046-867cc58d --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e701fef3873..9a176503555 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10044-144b5027" +bitwardenSdk = "4.0.0-10046-867cc58d" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From fe2ddf480abdca3a15b08fc3c07a1f50f96b0268 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 12:31:47 +0000 Subject: [PATCH 37/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10052-2cb3e38f --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9a176503555..68233276e56 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10046-867cc58d" +bitwardenSdk = "4.0.0-10052-2cb3e38f" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 3e26d563753e80df5d32578761018032e20c3816 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 13:42:13 +0000 Subject: [PATCH 38/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10056-e89726f4 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 68233276e56..eb29628d7fa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10052-2cb3e38f" +bitwardenSdk = "4.0.0-10056-e89726f4" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From c55e464d004e2843f1b106272d71607ba4c93694 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 14:07:53 +0000 Subject: [PATCH 39/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10060-c7dff088 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eb29628d7fa..b4ed9b10215 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10056-e89726f4" +bitwardenSdk = "4.0.0-10060-c7dff088" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 881238ae3fb85fa71c9243493e628282f319e2a6 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 15:07:50 +0000 Subject: [PATCH 40/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10064-aa560aa1 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b4ed9b10215..f06fe477706 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10060-c7dff088" +bitwardenSdk = "4.0.0-10064-aa560aa1" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 13c2f1e85ab53541c175f43ee9bdb67ca8c9888d Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 15:23:10 +0000 Subject: [PATCH 41/70] Clear the SDK pin length when PIN unlock is disabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 16ccfb5a4 backed the state bridge's pinLength with AuthDiskSource but left the invariant half-wired. Android never routes through the SDK's PinLockSystem set_pin/unset_pin, which are what call clear_pin_length; it writes and clears encryptedPin and the PIN envelopes straight to disk from SettingsRepositoryImpl. So clearUnlockPin cleared every PIN field except the length. The only path that writes pinLength on Android is backfill_pin_length, which runs on unlock when an encrypted PIN exists and early-returns if a value is already present. A stale length therefore survives forever: set a 4-digit PIN, unlock to backfill 4, disable PIN unlock, set a 6-digit PIN, and backfill declines to correct the 4. Nothing calls getPinLength today, so there is no visible symptom; a future lock screen that auto-submits at the PIN length would inherit a silently wrong value. Clearing it alongside the other PIN fields restores "pinLength is absent whenever no PIN is set", and backfill repopulates the right length on the next unlock after re-enrollment. storeUnlockPin deliberately does not compute the length itself. The SDK defines it as pin.chars().count() — Unicode scalar values — while Kotlin's String.length counts UTF-16 code units, and the two disagree for any PIN outside the BMP. Re-implementing that in Kotlin would be a second source of truth for a value the SDK already owns, so repopulation stays with backfill. Also restore pinLength across soft logout in UserLogoutManagerImpl, beside the other PIN fields it already preserves. That one is not a correctness fix — clearData leaves the length absent rather than stale, so backfill would repair it on the next unlock — but the SDK documents the length as readable while locked, and a soft-logged-out account is exactly the locked state a PIN entry screen would read it in. --- .../data/auth/manager/UserLogoutManagerImpl.kt | 2 ++ .../data/platform/repository/SettingsRepositoryImpl.kt | 3 +++ .../data/auth/manager/UserLogoutManagerTest.kt | 10 ++++++++++ .../data/platform/repository/SettingsRepositoryTest.kt | 2 ++ 4 files changed, 17 insertions(+) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerImpl.kt index 4a1ee888622..c4874fab5ff 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerImpl.kt @@ -83,6 +83,7 @@ internal class UserLogoutManagerImpl( val vaultTimeoutInMinutes = settingsDiskSource.getVaultTimeoutInMinutes(userId = userId) val vaultTimeoutAction = settingsDiskSource.getVaultTimeoutAction(userId = userId) val encryptedPin = authDiskSource.getEncryptedPin(userId = userId) + val pinLength = authDiskSource.getPinLength(userId = userId) val pinProtectedUserKey = authDiskSource.getPinProtectedUserKey(userId = userId) val ephemeralPinProtectedUserKeyEnvelope = authDiskSource .getEphemeralPinProtectedUserKeyEnvelope(userId = userId) @@ -116,6 +117,7 @@ internal class UserLogoutManagerImpl( } authDiskSource.apply { storeEncryptedPin(userId = userId, encryptedPin = encryptedPin) + storePinLength(userId = userId, pinLength = pinLength) storePinProtectedUserKey(userId = userId, pinProtectedUserKey = pinProtectedUserKey) storeEphemeralPinProtectedUserKeyEnvelope( userId = userId, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt index 3b9c3beb37e..9653b44205a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryImpl.kt @@ -701,6 +701,9 @@ class SettingsRepositoryImpl( pinProtectedUserKeyEnvelope = null, ) storePinProtectedUserKey(userId = userId, pinProtectedUserKey = null) + // The SDK only repopulates this on unlock when it is absent, so a stale value here + // would survive a later PIN change. + storePinLength(userId = userId, pinLength = null) } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt index 489b2d28a2b..71878a9d5fb 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt @@ -153,6 +153,7 @@ class UserLogoutManagerTest { val pinProtectedUserKey = "pinProtectedUserKey" val pinProtectedUserKeyEnvelope = "pinProtectedUserKeyEnvelope" val encryptedPin = "encryptedPin" + val pinLength = 4 every { settingsDiskSource.getVaultTimeoutInMinutes(userId = userId) @@ -189,6 +190,8 @@ class UserLogoutManagerTest { every { authDiskSource.storeEncryptedPin(userId = userId, encryptedPin = encryptedPin) } just runs + every { authDiskSource.getPinLength(userId = userId) } returns pinLength + every { authDiskSource.storePinLength(userId = userId, pinLength = pinLength) } just runs userLogoutManager.softLogout(userId = userId, reason = LogoutReason.Timeout) @@ -224,6 +227,7 @@ class UserLogoutManagerTest { pinProtectedUserKey = pinProtectedUserKey, ) authDiskSource.storeEncryptedPin(userId = userId, encryptedPin = encryptedPin) + authDiskSource.storePinLength(userId = userId, pinLength = pinLength) } } @@ -235,6 +239,7 @@ class UserLogoutManagerTest { val pinProtectedUserKey = "pinProtectedUserKey" val pinProtectedUserKeyEnvelope = "pinProtectedUserKeyEnvelope" val encryptedPin = "encryptedPin" + val pinLength = 4 every { settingsDiskSource.getVaultTimeoutInMinutes(userId = userId) @@ -271,6 +276,8 @@ class UserLogoutManagerTest { every { authDiskSource.storeEncryptedPin(userId = userId, encryptedPin = encryptedPin) } just runs + every { authDiskSource.getPinLength(userId = userId) } returns pinLength + every { authDiskSource.storePinLength(userId = userId, pinLength = pinLength) } just runs userLogoutManager.softLogout(userId = userId, reason = LogoutReason.Timeout) @@ -296,6 +303,7 @@ class UserLogoutManagerTest { pinProtectedUserKey = pinProtectedUserKey, ) authDiskSource.storeEncryptedPin(userId = userId, encryptedPin = encryptedPin) + authDiskSource.storePinLength(userId = userId, pinLength = pinLength) } } @@ -400,7 +408,9 @@ class UserLogoutManagerTest { every { authDiskSource.getPersistentPinProtectedUserKeyEnvelope(userId = userId) } returns "pinProtectedUserKeyEnvelope" + every { authDiskSource.getPinLength(userId = userId) } returns 4 every { authDiskSource.storeEncryptedPin(userId = userId, encryptedPin = any()) } just runs + every { authDiskSource.storePinLength(userId = userId, pinLength = any()) } just runs every { authDiskSource.storePinProtectedUserKey(userId = userId, pinProtectedUserKey = any()) } just runs diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryTest.kt index 3506308e0c9..1e910914fbf 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/SettingsRepositoryTest.kt @@ -1212,6 +1212,7 @@ class SettingsRepositoryTest { userId = USER_ID, pinProtectedUserKeyEnvelope = "pinProtectedUserKeyEnvelope", ) + storePinLength(userId = USER_ID, pinLength = 4) } settingsRepository.clearUnlockPin() @@ -1229,6 +1230,7 @@ class SettingsRepositoryTest { userId = USER_ID, pinProtectedUserKeyEnvelope = null, ) + assertPinLength(userId = USER_ID, pinLength = null) } } From 11ad7b129a18b91c7984093b5075d0d9c183e207 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 15:39:09 +0000 Subject: [PATCH 42/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10071-73350fde --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f06fe477706..0c523f44177 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10064-aa560aa1" +bitwardenSdk = "4.0.0-10071-73350fde" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 2f7d901d65d9bd41f34aad8982a4c0c0e8b3acf3 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2026 04:13:34 +0000 Subject: [PATCH 43/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10102-000c1765 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0c523f44177..0f5e8072ac6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10071-73350fde" +bitwardenSdk = "4.0.0-10102-000c1765" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 7ff669e61b0ef24b59f485a32bf371c1b7a68473 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2026 13:55:00 +0000 Subject: [PATCH 44/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10105-408bf11b --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f5e8072ac6..47e6bd0aa4c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10102-000c1765" +bitwardenSdk = "4.0.0-10105-408bf11b" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 2d930985f198f0aff7595dbda4de169c7cda993f Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2026 14:20:21 +0000 Subject: [PATCH 45/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10109-5b7fbb41 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 47e6bd0aa4c..c96ebc3bf75 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10105-408bf11b" +bitwardenSdk = "4.0.0-10109-5b7fbb41" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 44b1d3236919250c341ad882faeb72ef99830fcb Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2026 14:20:42 +0000 Subject: [PATCH 46/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10108-32e23008 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c96ebc3bf75..739d2bf7b01 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10109-5b7fbb41" +bitwardenSdk = "4.0.0-10108-32e23008" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 759ca2d8dd9d363c0337c021462c1651ba103f1f Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2026 16:28:36 +0000 Subject: [PATCH 47/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10124-a13b4c4e --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 739d2bf7b01..c86e2c25ea0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10108-32e23008" +bitwardenSdk = "4.0.0-10124-a13b4c4e" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 164c01aa34e1eff50f98bca5ac06e8ccbaff218a Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2026 17:18:21 +0000 Subject: [PATCH 48/70] Preserve httpAuthenticationEnabled through the network layer The SDK now round-trips `httpAuthenticationEnabled` on `Login`/`LoginView` for legacy field-level ciphers, but Android maps the server JSON to the SDK types itself and had no such field. The value was therefore always null inbound from sync and dropped outbound on save, so enabling the setting from another client was lost the next time the login was edited on Android. Thread the field through `SyncResponseJson.Cipher.Login`, `toSdkLogin()`, and `toEncryptedNetworkLogin()` so the value survives a sync -> edit -> save round trip. Android has no UI for this setting; this is pass-through only. --- .../util/VaultSdkCipherExtensions.kt | 2 + .../datasource/disk/VaultDiskSourceTest.kt | 1 + .../sdk/model/VaultSdkCipherUtil.kt | 1 + .../util/VaultSdkCipherExtensionsTest.kt | 39 +++++++++++++++++++ .../network/model/SyncResponseJson.kt | 5 +++ .../network/service/CiphersServiceTest.kt | 3 ++ .../network/service/SyncServiceTest.kt | 1 + .../network/model/SyncResponseCipherUtil.kt | 2 + 8 files changed, 54 insertions(+) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensions.kt index f97b2271636..e84128c5090 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensions.kt @@ -397,6 +397,7 @@ private fun Login.toEncryptedNetworkLogin(): SyncResponseJson.Cipher.Login = uri = null, username = username, fido2Credentials = fido2Credentials?.toNetworkFido2Credentials(), + httpAuthenticationEnabled = httpAuthenticationEnabled, ) private fun List.toNetworkFido2Credentials() = @@ -534,6 +535,7 @@ fun SyncResponseJson.Cipher.Login.toSdkLogin(): Login = totp = totp, autofillOnPageLoad = shouldAutofillOnPageLoad, fido2Credentials = fido2Credentials?.toSdkFido2Credentials(), + httpAuthenticationEnabled = httpAuthenticationEnabled, ) private fun List.toSdkFido2Credentials() = diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/VaultDiskSourceTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/VaultDiskSourceTest.kt index 1724605f37e..e27762639ea 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/VaultDiskSourceTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/disk/VaultDiskSourceTest.kt @@ -514,6 +514,7 @@ private const val CIPHER_JSON = """ "password": "mockPassword-1", "passwordRevisionDate": "2023-10-27T12:00:00.000Z", "autofillOnPageLoad": false, + "httpAuthenticationEnabled": false, "uri": "mockUri-1", "username": "mockUsername-1", "fido2Credentials": [ diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/VaultSdkCipherUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/VaultSdkCipherUtil.kt index 1f4b374d181..6543bd83846 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/VaultSdkCipherUtil.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/datasource/sdk/model/VaultSdkCipherUtil.kt @@ -246,6 +246,7 @@ fun createMockSdkLogin(number: Int, clock: Clock): Login = number = number, clock = clock, ), + httpAuthenticationEnabled = false, ) /** diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensionsTest.kt index cd06a3c3b7a..1c74dcf8ff7 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensionsTest.kt @@ -141,6 +141,45 @@ class VaultSdkCipherExtensionsTest { ) } + @Suppress("MaxLineLength") + @Test + fun `toSdkLogin should convert the httpAuthenticationEnabled of a SyncResponseJson Cipher Login`() { + val syncLogin = createMockLogin(number = 1, httpAuthenticationEnabled = true) + + val sdkLogin = syncLogin.toSdkLogin() + + assertEquals( + createMockSdkLogin(number = 1, clock = FIXED_CLOCK) + .copy(httpAuthenticationEnabled = true), + sdkLogin, + ) + } + + @Suppress("MaxLineLength") + @Test + fun `toEncryptedNetworkCipher should convert the httpAuthenticationEnabled of an Sdk Cipher Login`() { + val sdkCipher = createMockSdkCipher(number = 1, clock = FIXED_CLOCK) + .let { it.copy(login = it.login?.copy(httpAuthenticationEnabled = true)) } + + val syncCipher = sdkCipher.toEncryptedNetworkCipher( + encryptedFor = "mockEncryptedFor-1", + encryptedByKeyId = "mockEncryptedByKeyId-1", + ) + + assertEquals( + createMockCipherJsonRequest( + number = 1, + login = createMockLogin( + number = 1, + uri = null, + httpAuthenticationEnabled = true, + ), + archivedDate = FIXED_CLOCK.instant(), + ), + syncCipher, + ) + } + @Test fun `toSdkIdentity should convert a SyncResponseJson Cipher Identity to a Identity`() { val syncIdentity = createMockIdentity(number = 1) diff --git a/network/src/main/kotlin/com/bitwarden/network/model/SyncResponseJson.kt b/network/src/main/kotlin/com/bitwarden/network/model/SyncResponseJson.kt index 99e6dd1d8a1..5fab92cdecb 100644 --- a/network/src/main/kotlin/com/bitwarden/network/model/SyncResponseJson.kt +++ b/network/src/main/kotlin/com/bitwarden/network/model/SyncResponseJson.kt @@ -973,6 +973,8 @@ data class SyncResponseJson( * @property uri The URI (nullable). * @property username The username (nullable). * @property fido2Credentials A list of FIDO 2 credentials (nullable). + * @property httpAuthenticationEnabled If HTTP authentication is used for the login + * (nullable). */ @Serializable data class Login( @@ -1000,6 +1002,9 @@ data class SyncResponseJson( @SerialName("fido2Credentials") val fido2Credentials: List?, + + @SerialName("httpAuthenticationEnabled") + val httpAuthenticationEnabled: Boolean?, ) { /** * Represents a URI in the vault response. diff --git a/network/src/test/kotlin/com/bitwarden/network/service/CiphersServiceTest.kt b/network/src/test/kotlin/com/bitwarden/network/service/CiphersServiceTest.kt index 2855b1a059f..a6d77f415a9 100644 --- a/network/src/test/kotlin/com/bitwarden/network/service/CiphersServiceTest.kt +++ b/network/src/test/kotlin/com/bitwarden/network/service/CiphersServiceTest.kt @@ -568,6 +568,7 @@ private const val CREATE_ATTACHMENT_SUCCESS_JSON = """ "password": "mockPassword-1", "passwordRevisionDate": "2023-10-27T12:00:00.00Z", "autofillOnPageLoad": false, + "httpAuthenticationEnabled": false, "uri": "mockUri-1", "username": "mockUsername-1", "fido2Credentials": [ @@ -738,6 +739,7 @@ private const val CREATE_RESTORE_UPDATE_CIPHER_SUCCESS_JSON = """ "password": "mockPassword-1", "passwordRevisionDate": "2023-10-27T12:00:00.00Z", "autofillOnPageLoad": false, + "httpAuthenticationEnabled": false, "uri": "mockUri-1", "username": "mockUsername-1", "fido2Credentials": [ @@ -925,6 +927,7 @@ private const val UPDATE_CIPHER_COLLECTION_SUCCESS_JSON = """ "password": "mockPassword-1", "passwordRevisionDate": "2023-10-27T12:00:00.00Z", "autofillOnPageLoad": false, + "httpAuthenticationEnabled": false, "uri": "mockUri-1", "username": "mockUsername-1", "fido2Credentials": [ diff --git a/network/src/test/kotlin/com/bitwarden/network/service/SyncServiceTest.kt b/network/src/test/kotlin/com/bitwarden/network/service/SyncServiceTest.kt index e20a81ee1dc..4bf7065b2fe 100644 --- a/network/src/test/kotlin/com/bitwarden/network/service/SyncServiceTest.kt +++ b/network/src/test/kotlin/com/bitwarden/network/service/SyncServiceTest.kt @@ -412,6 +412,7 @@ private const val SYNC_SUCCESS_JSON = """ "password": "mockPassword-1", "passwordRevisionDate": "2023-10-27T12:00:00.00Z", "autofillOnPageLoad": false, + "httpAuthenticationEnabled": false, "uri": "mockUri-1", "username": "mockUsername-1", "fido2Credentials": [ diff --git a/network/src/testFixtures/kotlin/com/bitwarden/network/model/SyncResponseCipherUtil.kt b/network/src/testFixtures/kotlin/com/bitwarden/network/model/SyncResponseCipherUtil.kt index db7c765e6c5..101afdbee57 100644 --- a/network/src/testFixtures/kotlin/com/bitwarden/network/model/SyncResponseCipherUtil.kt +++ b/network/src/testFixtures/kotlin/com/bitwarden/network/model/SyncResponseCipherUtil.kt @@ -240,6 +240,7 @@ fun createMockLogin( fido2Credentials: List = listOf( createMockFido2Credential(number = number), ), + httpAuthenticationEnabled: Boolean? = false, ): SyncResponseJson.Cipher.Login = SyncResponseJson.Cipher.Login( username = username, @@ -250,6 +251,7 @@ fun createMockLogin( uris = uris, totp = totp, fido2Credentials = fido2Credentials, + httpAuthenticationEnabled = httpAuthenticationEnabled, ) /** From d85ed8d0ae5a181a33984a4feaf1abdcc8123cb5 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 09:05:53 +0000 Subject: [PATCH 49/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10143-580a5c16 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c86e2c25ea0..d74921150dc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10124-a13b4c4e" +bitwardenSdk = "4.0.0-10143-580a5c16" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 2ba872468a56cf393902978a2edd3c13faa52986 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 09:21:56 +0000 Subject: [PATCH 50/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10146-26a9beca --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d74921150dc..b4590788b41 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10143-580a5c16" +bitwardenSdk = "4.0.0-10146-26a9beca" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 65f34f2ff57b875a850b4deb7c272529fc822cb4 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 10:26:39 +0000 Subject: [PATCH 51/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10150-221632ac --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b4590788b41..6b479e23558 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10146-26a9beca" +bitwardenSdk = "4.0.0-10150-221632ac" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 3d823bfd06447959920e478b57bec0352aba88e6 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 12:04:37 +0000 Subject: [PATCH 52/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10155-2bf65d72 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6b479e23558..ca1531a83af 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10150-221632ac" +bitwardenSdk = "4.0.0-10155-2bf65d72" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From d2e6c824b50612678a1aa5fc92a531638ebdc6ac Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 13:12:57 +0000 Subject: [PATCH 53/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10159-1109561f --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ca1531a83af..a093a3b55d1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10155-2bf65d72" +bitwardenSdk = "4.0.0-10159-1109561f" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From f7ad6f2890d02a361e2e17faec643317cbaddf0e Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 15:09:44 +0000 Subject: [PATCH 54/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10165-2a588111 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a093a3b55d1..9db8b5ef1a8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10159-1109561f" +bitwardenSdk = "4.0.0-10165-2a588111" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 7f33916716ab475bda08e68f3e3a74e2c4edd2e1 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 15:23:28 +0000 Subject: [PATCH 55/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10166-8a9566aa --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9db8b5ef1a8..fb9271b13e0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10165-2a588111" +bitwardenSdk = "4.0.0-10166-8a9566aa" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 05f092ba62d51327a5652d3245db8e5046d4db86 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 15:44:38 +0000 Subject: [PATCH 56/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10168-afc7f7f5 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fb9271b13e0..b51f00817d9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10166-8a9566aa" +bitwardenSdk = "4.0.0-10168-afc7f7f5" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From c46f31eb6c7d7e7ea872e0fb6fc730e2c3c63bd7 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 16:13:13 +0000 Subject: [PATCH 57/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10174-86bea6b5 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b51f00817d9..ffb87d5ae86 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10168-afc7f7f5" +bitwardenSdk = "4.0.0-10174-86bea6b5" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From d6f8921bae1467d7ea225c818a6a75dcf6ad1612 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Mon, 9 Nov 2026 16:27:55 +0000 Subject: [PATCH 58/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10176-839c6ca0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ffb87d5ae86..75be58ced79 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10174-86bea6b5" +bitwardenSdk = "4.0.0-10176-839c6ca0" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From e91cc186fe9f9e2b3648a719317319eeb91ca47c Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 08:26:30 +0000 Subject: [PATCH 59/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10188-69bca2ad --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 75be58ced79..5b3a2dbd5ac 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10176-839c6ca0" +bitwardenSdk = "4.0.0-10188-69bca2ad" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 34904df2c96f695c36d7ae883d47c2dfa2cfd4f4 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 08:47:38 +0000 Subject: [PATCH 60/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10189-c5111daf --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5b3a2dbd5ac..102ba34c79e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10188-69bca2ad" +bitwardenSdk = "4.0.0-10189-c5111daf" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From cea05bf98fc3a084821af399d06ab43bef13fc16 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 10:13:37 +0000 Subject: [PATCH 61/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10193-5582920a --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 102ba34c79e..46033025490 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10189-c5111daf" +bitwardenSdk = "4.0.0-10193-5582920a" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From ec94eb6c89fe2304c957e90db76c0495b1f9f9cd Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 12:10:25 +0000 Subject: [PATCH 62/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10197-c04bc697 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 46033025490..74c5ffc8265 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10193-5582920a" +bitwardenSdk = "4.0.0-10197-c04bc697" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From a1b453173be2533e22ac0588c9dc93b9bb519cb8 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 12:23:32 +0000 Subject: [PATCH 63/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10198-56b5ff13 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 74c5ffc8265..b30490a7046 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10197-c04bc697" +bitwardenSdk = "4.0.0-10198-56b5ff13" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 76c5fb21d277727a8040895d705ea47cbefaa63c Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 14:09:12 +0000 Subject: [PATCH 64/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10203-8e40e22e --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b30490a7046..f25c89bafef 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10198-56b5ff13" +bitwardenSdk = "4.0.0-10203-8e40e22e" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 9f9faa53a18ebf1e6a2f5aaea5df0d71e7280225 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Tue, 10 Nov 2026 17:07:25 +0000 Subject: [PATCH 65/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10208-5bcc1260 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f25c89bafef..4d6d84174e3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10203-8e40e22e" +bitwardenSdk = "4.0.0-10208-5bcc1260" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 6b80402242f9a05db4b8c275e3b8edc9f8f98d93 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 11 Nov 2026 01:53:29 +0000 Subject: [PATCH 66/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10214-15db6b9f --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4d6d84174e3..eae6e44010a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10208-5bcc1260" +bitwardenSdk = "4.0.0-10214-15db6b9f" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 8aae5ded8349361d46525543d54b67524b414fbf Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 11 Nov 2026 08:22:32 +0000 Subject: [PATCH 67/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10217-8d6a6715 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eae6e44010a..007a9d8d9a7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10214-15db6b9f" +bitwardenSdk = "4.0.0-10217-8d6a6715" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From a34f73111a2604dd4f62a81d2a4ca309bd5696d7 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Wed, 11 Nov 2026 16:50:35 +0000 Subject: [PATCH 68/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10228-187a3470 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 007a9d8d9a7..fc60008c889 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10217-8d6a6715" +bitwardenSdk = "4.0.0-10228-187a3470" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 7276bc80b4c15a561a639d62bd451cd56a085bf2 Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 12 Nov 2026 01:02:55 +0000 Subject: [PATCH 69/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10241-300aea59 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fc60008c889..6c03d5294ef 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10228-187a3470" +bitwardenSdk = "4.0.0-10241-300aea59" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8" From 44adedb3d27ab88e9458afd15aef25b5df5623fb Mon Sep 17 00:00:00 2001 From: "bw-ghapp[bot]" <178206702+bw-ghapp[bot]@users.noreply.github.com> Date: Thu, 12 Nov 2026 07:54:01 +0000 Subject: [PATCH 70/70] SDK Update - com.bitwarden:sdk-android 4.0.0-10242-e3cdc1ad --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6c03d5294ef..157111c8cb4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ androidxRoom3 = "3.0.3" androidxSecurityCrypto = "1.1.0" androidxSplash = "1.2.0" androidxWork = "2.12.0" -bitwardenSdk = "4.0.0-10241-300aea59" +bitwardenSdk = "4.0.0-10242-e3cdc1ad" coil = "3.6.3" crashlytics = "3.0.8" detekt = "1.23.8"