fix: Autofill registration popup #2054 An CHANGELOG

This commit is contained in:
J-Jamet
2025-07-01 19:45:26 +02:00
parent 0aa89ea9ff
commit e391fd59fe
6 changed files with 77 additions and 28 deletions

View File

@@ -1,5 +1,9 @@
KeePassDX(4.1.2)
* Fix URL matching in presence of a path #1940 #1946 #2003
* Fix URL search #1940 #1946 #2003 #2044
* Fix Autofill popup #2054
* Fix Dialog background #2005 #2004 (Thx @codokie)
* Fix OTP code alignment in the main screen #2007 (Thx @ymcx)
* App Metadata to translation #1823
KeePassDX(4.1.1)
* Fix date parser #1933

View File

@@ -41,11 +41,9 @@ import com.kunzisoft.keepass.database.ContextualDatabase
import com.kunzisoft.keepass.database.helper.SearchHelper
import com.kunzisoft.keepass.model.RegisterInfo
import com.kunzisoft.keepass.model.SearchInfo
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.utils.WebDomain
import com.kunzisoft.keepass.utils.getParcelableCompat
import com.kunzisoft.keepass.utils.getParcelableExtraCompat
import com.kunzisoft.keepass.utils.WebDomain
import java.lang.RuntimeException
@RequiresApi(api = Build.VERSION_CODES.O)
class AutofillLauncherActivity : DatabaseModeActivity() {
@@ -126,10 +124,11 @@ class AutofillLauncherActivity : DatabaseModeActivity() {
if (autofillComponent == null) {
setResult(Activity.RESULT_CANCELED)
finish()
} else if (!KeeAutofillService.autofillAllowedFor(searchInfo.applicationId,
PreferencesUtil.applicationIdBlocklist(this))
|| !KeeAutofillService.autofillAllowedFor(searchInfo.webDomain,
PreferencesUtil.webDomainBlocklist(this))) {
} else if (!KeeAutofillService.autofillAllowedFor(
applicationId = searchInfo.applicationId,
webDomain = searchInfo.webDomain,
context = this
)) {
showBlockRestartMessage()
setResult(Activity.RESULT_CANCELED)
finish()
@@ -166,10 +165,11 @@ class AutofillLauncherActivity : DatabaseModeActivity() {
private fun launchRegistration(database: ContextualDatabase?,
searchInfo: SearchInfo,
registerInfo: RegisterInfo?) {
if (!KeeAutofillService.autofillAllowedFor(searchInfo.applicationId,
PreferencesUtil.applicationIdBlocklist(this))
|| !KeeAutofillService.autofillAllowedFor(searchInfo.webDomain,
PreferencesUtil.webDomainBlocklist(this))) {
if (KeeAutofillService.autofillAllowedFor(
applicationId = searchInfo.applicationId,
webDomain = searchInfo.webDomain,
context = this
)) {
showBlockRestartMessage()
setResult(Activity.RESULT_CANCELED)
} else {

View File

@@ -21,12 +21,21 @@ package com.kunzisoft.keepass.autofill
import android.annotation.SuppressLint
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.graphics.BlendMode
import android.graphics.drawable.Icon
import android.os.Build
import android.os.CancellationSignal
import android.service.autofill.*
import android.service.autofill.AutofillService
import android.service.autofill.FillCallback
import android.service.autofill.FillRequest
import android.service.autofill.FillResponse
import android.service.autofill.InlinePresentation
import android.service.autofill.Presentations
import android.service.autofill.SaveCallback
import android.service.autofill.SaveInfo
import android.service.autofill.SaveRequest
import android.util.Log
import android.view.autofill.AutofillId
import android.widget.RemoteViews
@@ -35,6 +44,7 @@ import androidx.autofill.inline.UiVersions
import androidx.autofill.inline.v1.InlineSuggestionUi
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.AutofillLauncherActivity
import com.kunzisoft.keepass.autofill.StructureParser.Companion.APPLICATION_ID_POPUP_WINDOW
import com.kunzisoft.keepass.database.ContextualDatabase
import com.kunzisoft.keepass.database.DatabaseTaskProvider
import com.kunzisoft.keepass.database.helper.SearchHelper
@@ -99,8 +109,12 @@ class KeeAutofillService : AutofillService() {
StructureParser(latestStructure).parse()?.let { parseResult ->
// Build search info only if applicationId or webDomain are not blocked
if (autofillAllowedFor(parseResult.applicationId, applicationIdBlocklist)
&& autofillAllowedFor(parseResult.webDomain, webDomainBlocklist)) {
if (autofillAllowedFor(
applicationId = parseResult.applicationId,
applicationIdBlocklist = applicationIdBlocklist,
webDomain = parseResult.webDomain,
webDomainBlocklist = webDomainBlocklist)
) {
val searchInfo = SearchInfo().apply {
applicationId = parseResult.applicationId
webDomain = parseResult.webDomain
@@ -258,7 +272,7 @@ class KeeAutofillService : AutofillService() {
val inlinePresentationSpecs =
inlineSuggestionsRequest.inlinePresentationSpecs
if (inlineSuggestionsRequest.maxSuggestionCount > 0
&& inlinePresentationSpecs.size > 0
&& inlinePresentationSpecs.isNotEmpty()
) {
val inlinePresentationSpec = inlinePresentationSpecs[0]
@@ -274,11 +288,7 @@ class KeeAutofillService : AutofillService() {
this,
0,
Intent(this, AutofillSettingsActivity::class.java),
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.FLAG_IMMUTABLE
} else {
0
}
PendingIntent.FLAG_IMMUTABLE
)
).apply {
setContentDescription(getString(R.string.autofill_sign_in_prompt))
@@ -352,8 +362,12 @@ class KeeAutofillService : AutofillService() {
val latestStructure = request.fillContexts.last().structure
StructureParser(latestStructure).parse(true)?.let { parseResult ->
if (autofillAllowedFor(parseResult.applicationId, applicationIdBlocklist)
&& autofillAllowedFor(parseResult.webDomain, webDomainBlocklist)) {
if (autofillAllowedFor(
applicationId = parseResult.applicationId,
applicationIdBlocklist = applicationIdBlocklist,
webDomain = parseResult.webDomain,
webDomainBlocklist = webDomainBlocklist)
) {
Log.d(TAG, "autofill onSaveRequest password")
// Build expiration from date or from year and month
@@ -414,6 +428,28 @@ class KeeAutofillService : AutofillService() {
companion object {
private val TAG = KeeAutofillService::class.java.name
fun autofillAllowedFor(applicationId: String?,
webDomain: String?,
context: Context
): Boolean {
return autofillAllowedFor(
applicationId = applicationId,
applicationIdBlocklist = PreferencesUtil.applicationIdBlocklist(context),
webDomain = webDomain,
webDomainBlocklist = PreferencesUtil.webDomainBlocklist(context))
}
fun autofillAllowedFor(applicationId: String?,
applicationIdBlocklist: Set<String>?,
webDomain: String?,
webDomainBlocklist: Set<String>?
): Boolean {
return autofillAllowedFor(applicationId, applicationIdBlocklist)
// To prevent unrecognized autofill popup id
&& applicationId?.contains(APPLICATION_ID_POPUP_WINDOW) != true
&& autofillAllowedFor(webDomain, webDomainBlocklist)
}
fun autofillAllowedFor(element: String?, blockList: Set<String>?): Boolean {
element?.let { elementNotNull ->
if (blockList?.any { appIdBlocked ->

View File

@@ -27,8 +27,7 @@ import android.view.autofill.AutofillId
import android.view.autofill.AutofillValue
import androidx.annotation.RequiresApi
import org.joda.time.DateTime
import java.util.*
import kotlin.collections.ArrayList
import java.util.Locale
/**
@@ -52,7 +51,7 @@ class StructureParser(private val structure: AssistStructure) {
applicationId = windowNode.title.toString().split("/")[0]
Log.d(TAG, "Autofill applicationId: $applicationId")
if (applicationId?.contains("PopupWindow:") == false) {
if (applicationId?.contains(APPLICATION_ID_POPUP_WINDOW) == false) {
if (parseViewNode(windowNode.rootViewNode))
break@mainLoop
}
@@ -583,5 +582,7 @@ class StructureParser(private val structure: AssistStructure) {
companion object {
private val TAG = StructureParser::class.java.name
const val APPLICATION_ID_POPUP_WINDOW = "PopupWindow:"
}
}

View File

@@ -1 +1,5 @@
* Fix URL matching in presence of a path #1940
* Fix URL search #1940 #1946 #2003 #2044
* Fix Autofill popup #2054
* Fix Dialog background #2005 #2004 (Thx @codokie)
* Fix OTP code alignment in the main screen #2007 (Thx @ymcx)
* App Metadata to translation #1823

View File

@@ -1 +1,5 @@
* Correction du match URL en présence d'un chemin #1940
* Correction de la recherche URL #1940 #1946 #2003 #2044
* Correction de la boite de dialogue de remplissage automatique #2054
* Correction du fond de boite de dialogue #2005 #2004 (Thx @codokie)
* Correction de l'alignement du code OTP dans l'écran principal #2007 (Thx @ymcx)
* Metadonnées de l'app en traduction #1823