diff options
| author | Danilo M. <danix@danix.xyz> | 2026-11-06 10:24:23 +0100 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-11-06 10:24:23 +0100 |
| commit | 4f1b534aec26e6f33e40f877282465f334c5f1fd (patch) | |
| tree | 0a1ccdf8182a0adbef4486888d077504690f7f4d /autofill-parser/src | |
| parent | 9ec740b0c73e33485e1d754759de46aa99444733 (diff) | |
| download | HardenedPass-4f1b534aec26e6f33e40f877282465f334c5f1fd.tar.gz HardenedPass-4f1b534aec26e6f33e40f877282465f334c5f1fd.zip | |
fix(app): keep sensitive details out of debug logs
A log export makes logs easy to share, so audit what they hold. Turn off the sshj trace level, which dumps SSH packets in the clear, password authentication included; until now only the minimum priority of the Android logger kept it out. Drop entry names from commit and autofill match lines, and log only descriptive HTML attributes of form fields, since value and placeholder can hold what the user typed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'autofill-parser/src')
2 files changed, 27 insertions, 1 deletions
diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FormField.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FormField.kt index b8df0664..bcd1081d 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FormField.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FormField.kt @@ -141,7 +141,7 @@ internal class FormField( ?.filter { it.first != null && it.second != null } ?.associate { Pair(it.first.lowercase(Locale.US), it.second.lowercase(Locale.US)) } ?: emptyMap() - private val htmlAttributesDebug = htmlAttributes.entries.joinToString { "${it.key}=${it.value}" } + private val htmlAttributesDebug = htmlAttributesForLog(htmlAttributes) private val htmlInputType = htmlAttributes["type"] private val htmlName = htmlAttributes["name"] ?: "" private val htmlMaxLength = htmlAttributes["maxlength"]?.toIntOrNull() @@ -292,3 +292,10 @@ internal class FormField( return autofillId.hashCode() } } + +/** The [attributes] that describe a field: `value` and the like can hold what the user typed. */ +internal fun htmlAttributesForLog(attributes: Map<String, String>): String = + attributes + .filterKeys { it in setOf("id", "name", "type", "autocomplete", "maxlength") } + .entries + .joinToString { "${it.key}=${it.value}" } diff --git a/autofill-parser/src/test/kotlin/com/github/androidpasswordstore/autofillparser/FormFieldLogTest.kt b/autofill-parser/src/test/kotlin/com/github/androidpasswordstore/autofillparser/FormFieldLogTest.kt new file mode 100644 index 00000000..be6b4b32 --- /dev/null +++ b/autofill-parser/src/test/kotlin/com/github/androidpasswordstore/autofillparser/FormFieldLogTest.kt @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2026 Danilo M. <danix@danix.xyz> + * SPDX-License-Identifier: GPL-3.0-only + */ + +package com.github.androidpasswordstore.autofillparser + +import kotlin.test.Test +import kotlin.test.assertEquals + +class FormFieldLogTest { + + @Test + fun onlyDescriptiveAttributesAreLogged() { + val attributes = + mapOf("type" to "email", "value" to "me@example.org", "placeholder" to "me@example.org") + assertEquals("type=email", htmlAttributesForLog(attributes)) + } +} |
