diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/AutofillLauncherActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/AutofillLauncherActivity.kt index a64cf3f90..37a6891ae 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/AutofillLauncherActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/AutofillLauncherActivity.kt @@ -26,26 +26,43 @@ import android.content.Intent import android.content.IntentSender import android.os.Build import android.os.Bundle +import android.widget.Toast import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import com.kunzisoft.keepass.R import com.kunzisoft.keepass.autofill.AutofillHelper +import com.kunzisoft.keepass.autofill.KeeAutofillService import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.search.SearchHelper import com.kunzisoft.keepass.model.SearchInfo +import com.kunzisoft.keepass.settings.PreferencesUtil @RequiresApi(api = Build.VERSION_CODES.O) class AutofillLauncherActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + + // Build search param + val searchInfo = SearchInfo().apply { + applicationId = intent.getStringExtra(KEY_SEARCH_APPLICATION_ID) + webDomain = intent.getStringExtra(KEY_SEARCH_DOMAIN) + } + // Pass extra for Autofill (EXTRA_ASSIST_STRUCTURE) val assistStructure = AutofillHelper.retrieveAssistStructure(intent) - if (assistStructure != null) { - // Build search param - val searchInfo = SearchInfo().apply { - applicationId = intent.getStringExtra(KEY_SEARCH_APPLICATION_ID) - webDomain = intent.getStringExtra(KEY_SEARCH_DOMAIN) - } + + if (assistStructure == null) { + setResult(Activity.RESULT_CANCELED) + finish() + } else if (!KeeAutofillService.searchAllowedFor(searchInfo.applicationId, + PreferencesUtil.applicationIdBlocklist(this)) + || !KeeAutofillService.searchAllowedFor(searchInfo.webDomain, + PreferencesUtil.webDomainBlocklist(this))) { + // If item not allowed, show a toast + Toast.makeText(this.applicationContext, R.string.autofill_block_restart, Toast.LENGTH_LONG).show() + setResult(Activity.RESULT_CANCELED) + finish() + } else { // If database is open SearchHelper.checkAutoSearchInfo(this, Database.getInstance(), @@ -69,9 +86,6 @@ class AutofillLauncherActivity : AppCompatActivity() { searchInfo) } ) - } else { - setResult(Activity.RESULT_CANCELED) - finish() } super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt index cf99c1f35..3d75c0e08 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/selection/SpecialModeActivity.kt @@ -76,14 +76,14 @@ abstract class SpecialModeActivity : StylishActivity() { val webDomain = searchInfo?.webDomain val applicationId = searchInfo?.applicationId if (webDomain != null) { - PreferencesUtil.addWebDomainToBlocklist(this@SpecialModeActivity, + PreferencesUtil.addWebDomainToBlocklist(this, webDomain) } else if (applicationId != null) { - PreferencesUtil.addApplicationIdToBlocklist(this@SpecialModeActivity, + PreferencesUtil.addApplicationIdToBlocklist(this, applicationId) } onCancelSpecialMode() - Toast.makeText(this@SpecialModeActivity, + Toast.makeText(this.applicationContext, R.string.autofill_block_restart, Toast.LENGTH_LONG).show() } diff --git a/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt b/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt index ae28cd63e..eaef31622 100644 --- a/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt @@ -57,27 +57,8 @@ class KeeAutofillService : AutofillService() { StructureParser(latestStructure).parse()?.let { parseResult -> // Build search info only if applicationId or webDomain are not blocked - var searchAllowed = true - parseResult.applicationId?.let { appId -> - if (applicationIdBlocklist?.any { appIdBlocked -> - appId.contains(appIdBlocked) - } == true - ) { - searchAllowed = false - Log.d(TAG, "Autofill not allowed for $appId") - } - } - parseResult.domain?.let { domain -> - if (webDomainBlocklist?.any { webDomainBlocked -> - domain.contains(webDomainBlocked) - } == true - ) { - searchAllowed = false - Log.d(TAG, "Autofill not allowed for $domain") - } - } - - if (searchAllowed) { + if (searchAllowedFor(parseResult.applicationId, applicationIdBlocklist) + && searchAllowedFor(parseResult.domain, webDomainBlocklist)) { val searchInfo = SearchInfo().apply { applicationId = parseResult.applicationId webDomain = parseResult.domain @@ -150,5 +131,18 @@ class KeeAutofillService : AutofillService() { companion object { private val TAG = KeeAutofillService::class.java.name + + fun searchAllowedFor(element: String?, blockList: Set?): Boolean { + element?.let { elementNotNull -> + if (blockList?.any { appIdBlocked -> + elementNotNull.contains(appIdBlocked) + } == true + ) { + Log.d(TAG, "Autofill not allowed for $elementNotNull") + return false + } + } + return true + } } }