Skip to content
This repository was archived by the owner on Oct 15, 2024. It is now read-only.

Commit 53b9a80

Browse files
minjatJFabianHenneke
authored andcommitted
Minimal support for MIME secret encoding (#1170)
Co-authored-by: Fabian Henneke <[email protected]> (cherry picked from commit 38ece10)
1 parent 2b25171 commit 53b9a80

File tree

2 files changed

+28
-7
lines changed

2 files changed

+28
-7
lines changed

app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot
3131
constructor(os: ByteArrayOutputStream) : this(os.toString("UTF-8"), UriTotpFinder())
3232

3333
init {
34-
val passContent = content.split("\n".toRegex(), 2).toTypedArray()
35-
password = if (UriTotpFinder.TOTP_FIELDS.any { passContent[0].startsWith(it) }) "" else passContent[0]
36-
extraContent = findExtraContent(passContent)
34+
val (foundPassword, passContent) = findAndStripPassword(content.split("\n".toRegex()))
35+
password = foundPassword
36+
extraContent = passContent.joinToString("\n")
3737
username = findUsername()
3838
digits = findOtpDigits(content)
3939
totpSecret = findTotpSecret(content)
@@ -86,10 +86,16 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot
8686
return null
8787
}
8888

89-
private fun findExtraContent(passContent: Array<String>) = when {
90-
password.isEmpty() && passContent[0].isNotEmpty() -> passContent[0]
91-
passContent.size > 1 -> passContent[1]
92-
else -> ""
89+
private fun findAndStripPassword(passContent: List<String>): Pair<String, List<String>> {
90+
if (UriTotpFinder.TOTP_FIELDS.any { passContent[0].startsWith(it) }) return Pair("", passContent)
91+
for (line in passContent) {
92+
for (prefix in PASSWORD_FIELDS) {
93+
if (line.startsWith(prefix, ignoreCase = true)) {
94+
return Pair(line.substring(prefix.length).trimStart(), passContent.minus(line))
95+
}
96+
}
97+
}
98+
return Pair(passContent[0], passContent.minus(passContent[0]))
9399
}
94100

95101
private fun findTotpSecret(decryptedContent: String): String? {
@@ -121,5 +127,11 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot
121127
"id:",
122128
"identity:"
123129
)
130+
131+
val PASSWORD_FIELDS = arrayOf(
132+
"password:",
133+
"secret:",
134+
"pass:",
135+
)
124136
}
125137
}

app/src/test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ class PasswordEntryTest {
2828
assertEquals("", makeEntry("\nblubb").password)
2929
assertEquals("", makeEntry("\n").password)
3030
assertEquals("", makeEntry("").password)
31+
for (field in PasswordEntry.PASSWORD_FIELDS) {
32+
assertEquals("fooooo", makeEntry("\n$field fooooo").password)
33+
assertEquals("fooooo", makeEntry("\n${field.toUpperCase()} fooooo").password)
34+
assertEquals("fooooo", makeEntry("GOPASS-SECRET-1.0\n$field fooooo").password)
35+
assertEquals("fooooo", makeEntry("someFirstLine\nUsername: bar\n$field fooooo").password)
36+
}
3137
}
3238

3339
@Test fun testGetExtraContent() {
@@ -37,6 +43,9 @@ class PasswordEntryTest {
3743
assertEquals("", makeEntry("fooooo").extraContent)
3844
assertEquals("blubb\n", makeEntry("\nblubb\n").extraContent)
3945
assertEquals("blubb", makeEntry("\nblubb").extraContent)
46+
assertEquals("blubb", makeEntry("blubb\npassword: foo").extraContent)
47+
assertEquals("blubb", makeEntry("password: foo\nblubb").extraContent)
48+
assertEquals("blubb\nusername: bar", makeEntry("blubb\npassword: foo\nusername: bar").extraContent)
4049
assertEquals("", makeEntry("\n").extraContent)
4150
assertEquals("", makeEntry("").extraContent)
4251
}

0 commit comments

Comments
 (0)