From f31a30bf479c7a3f24fdb15c2608f2aa9a9f8b3a Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Tue, 1 Jul 2025 17:22:42 +0200 Subject: [PATCH] fix: Search #1946 #2003 --- CHANGELOG | 2 +- .../keepass/database/helper/SearchHelper.kt | 1 + .../keepass/view/SearchFiltersView.kt | 3 +++ .../keepass/database/element/Database.kt | 21 +++++++++++++---- .../keepass/database/search/SearchHelper.kt | 23 +++++++++---------- .../database/search/SearchParameters.kt | 1 + .../com/kunzisoft/keepass/model/SearchInfo.kt | 4 ++++ 7 files changed, 38 insertions(+), 17 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index bf7932514..3b74046cc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,5 @@ KeePassDX(4.1.2) - * Fix URL matching in presence of a path #1940 + * Fix URL matching in presence of a path #1940 #1946 #2003 KeePassDX(4.1.1) * Fix date parser #1933 diff --git a/app/src/main/java/com/kunzisoft/keepass/database/helper/SearchHelper.kt b/app/src/main/java/com/kunzisoft/keepass/database/helper/SearchHelper.kt index 245a79993..c4a90cf3c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/helper/SearchHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/helper/SearchHelper.kt @@ -60,6 +60,7 @@ object SearchHelper { // If search provide results database.createVirtualGroupFromSearchInfo( searchInfo.toString(), + searchInfo.isASearchByDomain(), MAX_SEARCH_ENTRY )?.let { searchGroup -> if (searchGroup.numberOfChildEntries > 0) { diff --git a/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt b/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt index 0536b6f39..8f957e6f9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt @@ -31,6 +31,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context, private var searchUsername: CompoundButton private var searchPassword: CompoundButton private var searchURL: CompoundButton + private var searchByURLDomain: Boolean = false private var searchExpired: CompoundButton private var searchNotes: CompoundButton private var searchOther: CompoundButton @@ -50,6 +51,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context, this.searchInUsernames = searchUsername.isChecked this.searchInPasswords = searchPassword.isChecked this.searchInUrls = searchURL.isChecked + this.searchByDomain = searchByURLDomain this.searchInExpired = searchExpired.isChecked this.searchInNotes = searchNotes.isChecked this.searchInOther = searchOther.isChecked @@ -70,6 +72,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context, searchUsername.isChecked = value.searchInUsernames searchPassword.isChecked = value.searchInPasswords searchURL.isChecked = value.searchInUrls + searchByURLDomain = value.searchByDomain searchExpired.isChecked = value.searchInExpired searchNotes.isChecked = value.searchInNotes searchOther.isChecked = value.searchInOther diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index 12439ed0f..8e19954a6 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -38,7 +38,12 @@ import com.kunzisoft.keepass.database.element.node.NodeIdInt import com.kunzisoft.keepass.database.element.node.NodeIdUUID import com.kunzisoft.keepass.database.element.template.Template import com.kunzisoft.keepass.database.element.template.TemplateEngine -import com.kunzisoft.keepass.database.exception.* +import com.kunzisoft.keepass.database.exception.DatabaseException +import com.kunzisoft.keepass.database.exception.DatabaseInputException +import com.kunzisoft.keepass.database.exception.DatabaseOutputException +import com.kunzisoft.keepass.database.exception.FileNotFoundDatabaseException +import com.kunzisoft.keepass.database.exception.MergeDatabaseKDBException +import com.kunzisoft.keepass.database.exception.SignatureDatabaseException import com.kunzisoft.keepass.database.file.DatabaseHeaderKDB import com.kunzisoft.keepass.database.file.DatabaseHeaderKDBX import com.kunzisoft.keepass.database.file.DatabaseHeaderKDBX.Companion.FILE_VERSION_40 @@ -51,11 +56,17 @@ import com.kunzisoft.keepass.database.search.SearchHelper import com.kunzisoft.keepass.database.search.SearchParameters import com.kunzisoft.keepass.hardware.HardwareKey import com.kunzisoft.keepass.tasks.ProgressTaskUpdater -import com.kunzisoft.keepass.utils.* +import com.kunzisoft.keepass.utils.SingletonHolder import com.kunzisoft.keepass.utils.StringUtil.toFormattedColorInt import com.kunzisoft.keepass.utils.StringUtil.toFormattedColorString -import java.io.* -import java.util.* +import com.kunzisoft.keepass.utils.readAllBytes +import com.kunzisoft.keepass.utils.readBytes4ToUInt +import java.io.BufferedInputStream +import java.io.File +import java.io.FileNotFoundException +import java.io.InputStream +import java.io.OutputStream +import java.util.UUID open class Database { @@ -875,6 +886,7 @@ open class Database { fun createVirtualGroupFromSearchInfo( searchInfoString: String, + searchInfoByDomain: Boolean, max: Int = Integer.MAX_VALUE ): Group? { return mSearchHelper.createVirtualGroupWithSearchResult(this, @@ -884,6 +896,7 @@ open class Database { searchInUsernames = false searchInPasswords = false searchInUrls = true + searchByDomain = searchInfoByDomain searchInNotes = true searchInOTP = false searchInOther = true diff --git a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt index b7a0f0ae4..d4d5b00ae 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt @@ -150,11 +150,13 @@ class SearchHelper { } if (searchParameters.searchInUrls) { if (checkSearchQuery(entry.url, searchParameters) { stringToCheck, word -> - try { - stringToCheck.inTheSameDomainAs(word, sameSubDomain = true) - } catch (e: Exception) { - false - } + if (searchParameters.searchByDomain) { + try { + stringToCheck.inTheSameDomainAs(word, sameSubDomain = true) + } catch (e: Exception) { + false + } + } else null }) return true } @@ -186,7 +188,7 @@ class SearchHelper { private fun checkSearchQuery( stringToCheck: String, searchParameters: SearchParameters, - specialComparison: ((check: String, word: String) -> Boolean)? = null): Boolean { + specialComparison: ((check: String, word: String) -> Boolean?)? = null): Boolean { /* // TODO Search settings var removeAccents = true <- Too much time, to study @@ -203,13 +205,10 @@ class SearchHelper { } regex.matches(stringToCheck) } else { - var searchFound = true - searchParameters.searchQuery.split(" ").forEach { word -> - searchFound = searchFound - && (specialComparison?.invoke(stringToCheck, word) - ?: stringToCheck.contains(word, !searchParameters.caseSensitive)) + searchParameters.searchQuery.split(" ").any { word -> + specialComparison?.invoke(stringToCheck, word) + ?: stringToCheck.contains(word, !searchParameters.caseSensitive) } - searchFound } } } diff --git a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt index 04a525879..8b23a2857 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt @@ -45,6 +45,7 @@ class SearchParameters() : Parcelable{ var searchInSearchableGroup = true var searchInRecycleBin = false var searchInTemplates = false + var searchByDomain = false constructor(parcel: Parcel) : this() { searchQuery = parcel.readString() ?: searchQuery diff --git a/database/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt b/database/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt index d319eecbe..e4845e054 100644 --- a/database/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt +++ b/database/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt @@ -84,6 +84,10 @@ class SearchInfo : ObjectNameResource, Parcelable { && webScheme == null && otpString == null } + + fun isASearchByDomain(): Boolean { + return toString() == webDomain && webDomain != null + } override fun equals(other: Any?): Boolean { if (this === other) return true