From d5320c830afcf77433761557a47e6a4c4fa11134 Mon Sep 17 00:00:00 2001 From: Alexander Gil Date: Tue, 29 Sep 2026 09:48:31 +0200 Subject: [PATCH] fix(autofill): align file path intent extra with BasePGPActivity AutofillDecryptActivity declared its own private EXTRA_FILE_PATH constant ("app.passwordstore.autofill.oreo.EXTRA_FILE_PATH") while its base class BasePGPActivity reads the file path from the "FILE_PATH" extra. The mismatch was latent until requireDecryptionKeysExist() began resolving the gpg-id scope from fullPath (a8bfc662), which made every autofill decrypt crash with IllegalArgumentException: FILE_PATH is missing. Drop the local constant and use BasePGPActivity.EXTRA_FILE_PATH at all three call sites, matching the convention already used by every other component in the codebase. The missing-extra path still degrades gracefully via the existing logcat(ERROR) + finish() guard in onStart(). Add a Robolectric test pinning the intent extra key contract so the mismatch cannot silently return. --- CHANGELOG.md | 4 +++ .../ui/autofill/AutofillDecryptActivity.kt | 7 ++-- .../autofill/AutofillDecryptActivityTest.kt | 34 +++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 app/src/test/java/app/passwordstore/ui/autofill/AutofillDecryptActivityTest.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c2039f2c..c3a81d498 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file ## [Unreleased] +### Fixed + +- Autofill no longer crashes when decrypting an entry + ## [1.25.1] - 2026-09-28 ### Fixed diff --git a/app/src/main/java/app/passwordstore/ui/autofill/AutofillDecryptActivity.kt b/app/src/main/java/app/passwordstore/ui/autofill/AutofillDecryptActivity.kt index e86738107..da8cb73e3 100644 --- a/app/src/main/java/app/passwordstore/ui/autofill/AutofillDecryptActivity.kt +++ b/app/src/main/java/app/passwordstore/ui/autofill/AutofillDecryptActivity.kt @@ -54,7 +54,7 @@ class AutofillDecryptActivity : BasePGPActivity() { override fun onStart() { super.onStart() filePath = - intent?.getStringExtra(EXTRA_FILE_PATH) + intent?.getStringExtra(BasePGPActivity.EXTRA_FILE_PATH) ?: run { logcat(ERROR) { "AutofillDecryptActivity started without EXTRA_FILE_PATH" } finish() @@ -251,7 +251,6 @@ class AutofillDecryptActivity : BasePGPActivity() { companion object { - private const val EXTRA_FILE_PATH = "app.passwordstore.autofill.oreo.EXTRA_FILE_PATH" private const val EXTRA_SEARCH_ACTION = "app.passwordstore.autofill.oreo.EXTRA_SEARCH_ACTION" private var decryptFileRequestCode = 1 @@ -261,7 +260,7 @@ class AutofillDecryptActivity : BasePGPActivity() { return Intent(context, AutofillDecryptActivity::class.java).apply { putExtras(forwardedExtras) putExtra(EXTRA_SEARCH_ACTION, true) - putExtra(EXTRA_FILE_PATH, file.absolutePath) + putExtra(BasePGPActivity.EXTRA_FILE_PATH, file.absolutePath) } } @@ -269,7 +268,7 @@ class AutofillDecryptActivity : BasePGPActivity() { val intent = Intent(context, AutofillDecryptActivity::class.java).apply { putExtra(EXTRA_SEARCH_ACTION, false) - putExtra(EXTRA_FILE_PATH, file.absolutePath) + putExtra(BasePGPActivity.EXTRA_FILE_PATH, file.absolutePath) } return PendingIntent.getActivity( context, diff --git a/app/src/test/java/app/passwordstore/ui/autofill/AutofillDecryptActivityTest.kt b/app/src/test/java/app/passwordstore/ui/autofill/AutofillDecryptActivityTest.kt new file mode 100644 index 000000000..635ba1366 --- /dev/null +++ b/app/src/test/java/app/passwordstore/ui/autofill/AutofillDecryptActivityTest.kt @@ -0,0 +1,34 @@ +/* + * Copyright © 2014-2026 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ +package app.passwordstore.ui.autofill + +import android.os.Bundle +import app.passwordstore.ui.crypto.BasePGPActivity +import java.io.File +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [23]) +class AutofillDecryptActivityTest { + + @Test + fun makeDecryptFileIntentCarriesFilePathExtra() { + val context = RuntimeEnvironment.getApplication() + val file = File("/tmp/test-entry.gpg") + val forwardedExtras = Bundle() + + val intent = AutofillDecryptActivity.makeDecryptFileIntent(file, forwardedExtras, context) + + val filePathExtra = intent.getStringExtra(BasePGPActivity.EXTRA_FILE_PATH) + assertNotNull(filePathExtra) + assertEquals(file.absolutePath, filePathExtra) + } +}