From da8ca8b46d5d842670c9400c9a55b181eceb10b2 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 6 Nov 2020 10:50:34 +0530 Subject: Fix extra content for multiple username fields (#1192) Fixes #1190 Signed-off-by: Harsh Shandilya (cherry picked from commit df6ebfee27597887075b94a945e707ecd69decb1) --- CHANGELOG.md | 1 + app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt | 4 +++- .../test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt | 11 +++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4e43b23..a4ea1b48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Cancelling the Autofill "Generate password" action now correctly returns you to the original app. +- If multiple username fields exist in the password, we now ensure the later ones are not dropped from extra content. ## [1.13.1] - 2020-10-23 diff --git a/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt b/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt index a143fcb9..5727c4ba 100644 --- a/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt +++ b/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt @@ -60,9 +60,11 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot } val extraContentWithoutAuthData by lazy(LazyThreadSafetyMode.NONE) { + var foundUsername = false extraContent.splitToSequence("\n").filter { line -> return@filter when { - USERNAME_FIELDS.any { prefix -> line.startsWith(prefix, ignoreCase = true) } -> { + USERNAME_FIELDS.any { prefix -> line.startsWith(prefix, ignoreCase = true) } && !foundUsername -> { + foundUsername = true false } line.startsWith("otpauth://", ignoreCase = true) || diff --git a/app/src/test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt b/app/src/test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt index 04c606e8..082fc110 100644 --- a/app/src/test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt +++ b/app/src/test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt @@ -116,6 +116,17 @@ class PasswordEntryTest { assertFalse(entry.hasUsername()) } + // https://github.com/android-password-store/Android-Password-Store/issues/1190 + @Test fun extraContentWithMultipleUsernameFields() { + val entry = makeEntry("pass\nuser: user\nid: id\n$TOTP_URI") + assertTrue(entry.hasExtraContent()) + assertTrue(entry.hasTotp()) + assertTrue(entry.hasUsername()) + assertEquals("pass", entry.password) + assertEquals("user", entry.username) + assertEquals("id: id", entry.extraContentWithoutAuthData) + } + companion object { const val TOTP_URI = "otpauth://totp/ACME%20Co:john@example.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30" -- cgit v1.2.3