mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
fix: Autofill registration popup #2054 An CHANGELOG
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 ->
|
||||
|
||||
@@ -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:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user