From 38ece10e0dfdc907089b7ddc4e6c9d17e69013f3 Mon Sep 17 00:00:00 2001 From: Joris Minjat Date: Fri, 23 Oct 2020 18:13:37 +0200 Subject: Minimal support for MIME secret encoding (#1170) Co-authored-by: Fabian Henneke --- .../java/com/zeapo/pwdstore/model/PasswordEntry.kt | 26 ++++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'app/src/main') 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 556b2c87..a143fcb9 100644 --- a/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt +++ b/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt @@ -31,9 +31,9 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot constructor(os: ByteArrayOutputStream) : this(os.toString("UTF-8"), UriTotpFinder()) init { - val passContent = content.split("\n".toRegex(), 2).toTypedArray() - password = if (UriTotpFinder.TOTP_FIELDS.any { passContent[0].startsWith(it) }) "" else passContent[0] - extraContent = findExtraContent(passContent) + val (foundPassword, passContent) = findAndStripPassword(content.split("\n".toRegex())) + password = foundPassword + extraContent = passContent.joinToString("\n") username = findUsername() digits = findOtpDigits(content) totpSecret = findTotpSecret(content) @@ -86,10 +86,16 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot return null } - private fun findExtraContent(passContent: Array) = when { - password.isEmpty() && passContent[0].isNotEmpty() -> passContent[0] - passContent.size > 1 -> passContent[1] - else -> "" + private fun findAndStripPassword(passContent: List): Pair> { + if (UriTotpFinder.TOTP_FIELDS.any { passContent[0].startsWith(it) }) return Pair("", passContent) + for (line in passContent) { + for (prefix in PASSWORD_FIELDS) { + if (line.startsWith(prefix, ignoreCase = true)) { + return Pair(line.substring(prefix.length).trimStart(), passContent.minus(line)) + } + } + } + return Pair(passContent[0], passContent.minus(passContent[0])) } private fun findTotpSecret(decryptedContent: String): String? { @@ -121,5 +127,11 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot "id:", "identity:" ) + + val PASSWORD_FIELDS = arrayOf( + "password:", + "secret:", + "pass:", + ) } } -- cgit v1.2.3