mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Fix search in field reference
This commit is contained in:
@@ -538,7 +538,7 @@ class Database {
|
||||
max: Int = Integer.MAX_VALUE): Group? {
|
||||
return mSearchHelper?.createVirtualGroupWithSearchResult(this,
|
||||
SearchParameters().apply {
|
||||
searchString = searchQuery
|
||||
this.searchQuery = searchQuery
|
||||
}, omitBackup, max)
|
||||
}
|
||||
|
||||
@@ -547,7 +547,7 @@ class Database {
|
||||
max: Int = Integer.MAX_VALUE): Group? {
|
||||
return mSearchHelper?.createVirtualGroupWithSearchResult(this,
|
||||
SearchParameters().apply {
|
||||
searchString = searchInfoString
|
||||
searchQuery = searchInfoString
|
||||
searchInTitles = true
|
||||
searchInUserNames = false
|
||||
searchInPasswords = false
|
||||
|
||||
@@ -125,7 +125,7 @@ class FieldReferencesEngine {
|
||||
val searchParameters = SearchParameters()
|
||||
searchParameters.setupNone()
|
||||
|
||||
searchParameters.searchString = ref.substring(4)
|
||||
searchParameters.searchQuery = ref.substring(4)
|
||||
when (scan) {
|
||||
'T' -> searchParameters.searchInTitles = true
|
||||
'U' -> searchParameters.searchInUserNames = true
|
||||
@@ -170,7 +170,9 @@ class FieldReferencesEngine {
|
||||
return newText
|
||||
}
|
||||
|
||||
private fun searchEntries(contextKDBX: SprContextKDBX, searchParameters: SearchParameters?, listStorage: MutableList<EntryKDBX>?) {
|
||||
private fun searchEntries(contextKDBX: SprContextKDBX,
|
||||
searchParameters: SearchParameters?,
|
||||
listStorage: MutableList<EntryKDBX>?) {
|
||||
|
||||
val root = contextKDBX.databaseKDBX?.rootGroup
|
||||
if (searchParameters == null) {
|
||||
@@ -180,9 +182,9 @@ class FieldReferencesEngine {
|
||||
return
|
||||
}
|
||||
|
||||
val terms = splitStringTerms(searchParameters.searchString)
|
||||
val terms = splitStringTerms(searchParameters.searchQuery)
|
||||
if (terms.size <= 1 || searchParameters.regularExpression) {
|
||||
root!!.doForEachChild(EntryKDBXSearchHandler(contextKDBX, searchParameters, listStorage), null)
|
||||
root!!.doForEachChild(EntryKDBXSearchHandler(searchParameters, listStorage), null)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -190,20 +192,20 @@ class FieldReferencesEngine {
|
||||
val stringLengthComparator = Comparator<String> { lhs, rhs -> lhs.length - rhs.length }
|
||||
Collections.sort(terms, stringLengthComparator)
|
||||
|
||||
val fullSearch = searchParameters.searchString
|
||||
val fullSearch = searchParameters.searchQuery
|
||||
var childEntries: List<EntryKDBX>? = root!!.getChildEntries()
|
||||
for (i in terms.indices) {
|
||||
val pgNew = ArrayList<EntryKDBX>()
|
||||
|
||||
searchParameters.searchString = terms[i]
|
||||
searchParameters.searchQuery = terms[i]
|
||||
|
||||
var negate = false
|
||||
if (searchParameters.searchString.startsWith("-")) {
|
||||
searchParameters.searchString = searchParameters.searchString.substring(1)
|
||||
negate = searchParameters.searchString.isNotEmpty()
|
||||
if (searchParameters.searchQuery.startsWith("-")) {
|
||||
searchParameters.searchQuery = searchParameters.searchQuery.substring(1)
|
||||
negate = searchParameters.searchQuery.isNotEmpty()
|
||||
}
|
||||
|
||||
if (!root.doForEachChild(EntryKDBXSearchHandler(contextKDBX, searchParameters, pgNew), null)) {
|
||||
if (!root.doForEachChild(EntryKDBXSearchHandler(searchParameters, pgNew), null)) {
|
||||
childEntries = null
|
||||
break
|
||||
}
|
||||
@@ -224,7 +226,7 @@ class FieldReferencesEngine {
|
||||
if (childEntries != null) {
|
||||
listStorage.addAll(childEntries)
|
||||
}
|
||||
searchParameters.searchString = fullSearch
|
||||
searchParameters.searchQuery = fullSearch
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -282,41 +284,54 @@ class FieldReferencesEngine {
|
||||
}
|
||||
}
|
||||
|
||||
private class EntryKDBXSearchHandler(private val contextKDBX: SprContextKDBX,
|
||||
private val mSearchParametersKDBX: SearchParameters,
|
||||
private class EntryKDBXSearchHandler(private val mSearchParametersKDBX: SearchParameters,
|
||||
private val mListStorage: MutableList<EntryKDBX>)
|
||||
: NodeHandler<EntryKDBX>() {
|
||||
|
||||
override fun operate(node: EntryKDBX): Boolean {
|
||||
contextKDBX.databaseKDBX?.let {
|
||||
node.startToManageFieldReferences(it)
|
||||
}
|
||||
if (mSearchParametersKDBX.excludeExpired
|
||||
&& node.isCurrentlyExpires) {
|
||||
node.stopToManageFieldReferences()
|
||||
return true
|
||||
}
|
||||
if (searchStrings(node)) {
|
||||
mListStorage.add(node)
|
||||
node.stopToManageFieldReferences()
|
||||
return true
|
||||
}
|
||||
if (searchInGroupNames(node)) {
|
||||
mListStorage.add(node)
|
||||
node.stopToManageFieldReferences()
|
||||
return true
|
||||
}
|
||||
if (searchInUUID(node)) {
|
||||
mListStorage.add(node)
|
||||
node.stopToManageFieldReferences()
|
||||
return true
|
||||
}
|
||||
node.stopToManageFieldReferences()
|
||||
return true
|
||||
}
|
||||
|
||||
private fun searchStrings(entry: EntryKDBX): Boolean {
|
||||
return SearchHelper.searchInEntry(entry, mSearchParametersKDBX)
|
||||
var searchFound = false
|
||||
// Search all strings in the KDBX entry
|
||||
EntryFieldsLoop@ for((key, value) in entry.fields) {
|
||||
if (entryKDBXKeyIsAllowedToSearch(key, mSearchParametersKDBX)) {
|
||||
val currentString = value.toString()
|
||||
if (SearchHelper.checkSearchQuery(currentString, mSearchParametersKDBX)) {
|
||||
searchFound = true
|
||||
break@EntryFieldsLoop
|
||||
}
|
||||
}
|
||||
}
|
||||
return searchFound
|
||||
}
|
||||
|
||||
private fun entryKDBXKeyIsAllowedToSearch(key: String, searchParameters: SearchParameters): Boolean {
|
||||
return when (key) {
|
||||
EntryKDBX.STR_TITLE -> searchParameters.searchInTitles
|
||||
EntryKDBX.STR_USERNAME -> searchParameters.searchInUserNames
|
||||
EntryKDBX.STR_PASSWORD -> searchParameters.searchInPasswords
|
||||
EntryKDBX.STR_URL -> searchParameters.searchInUrls
|
||||
EntryKDBX.STR_NOTES -> searchParameters.searchInNotes
|
||||
else -> searchParameters.searchInOther
|
||||
}
|
||||
}
|
||||
|
||||
private fun searchInGroupNames(entry: EntryKDBX): Boolean {
|
||||
@@ -324,7 +339,7 @@ class FieldReferencesEngine {
|
||||
val parent = entry.parent
|
||||
if (parent != null) {
|
||||
return parent.title
|
||||
.contains(mSearchParametersKDBX.searchString,
|
||||
.contains(mSearchParametersKDBX.searchQuery,
|
||||
mSearchParametersKDBX.ignoreCase)
|
||||
}
|
||||
}
|
||||
@@ -334,7 +349,7 @@ class FieldReferencesEngine {
|
||||
private fun searchInUUID(entry: EntryKDBX): Boolean {
|
||||
if (mSearchParametersKDBX.searchInUUIDs) {
|
||||
return UuidUtil.toHexString(entry.id)
|
||||
.contains(mSearchParametersKDBX.searchString, true)
|
||||
.contains(mSearchParametersKDBX.searchQuery, true)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -24,11 +24,9 @@ import com.kunzisoft.keepass.database.action.node.NodeHandler
|
||||
import com.kunzisoft.keepass.database.element.Database
|
||||
import com.kunzisoft.keepass.database.element.Entry
|
||||
import com.kunzisoft.keepass.database.element.Group
|
||||
import com.kunzisoft.keepass.database.element.entry.EntryKDB
|
||||
import com.kunzisoft.keepass.database.element.entry.EntryKDBX
|
||||
import com.kunzisoft.keepass.model.EntryInfo
|
||||
import com.kunzisoft.keepass.model.SearchInfo
|
||||
import com.kunzisoft.keepass.otp.OtpEntryFields
|
||||
import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_FIELD
|
||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||
import com.kunzisoft.keepass.timeout.TimeoutHelper
|
||||
import com.kunzisoft.keepass.utils.StringUtil.removeDiacriticalMarks
|
||||
@@ -44,7 +42,7 @@ class SearchHelper {
|
||||
|
||||
val searchGroup = database.createGroup()
|
||||
searchGroup?.isVirtual = true
|
||||
searchGroup?.title = "\"" + searchParameters.searchString + "\""
|
||||
searchGroup?.title = "\"" + searchParameters.searchQuery + "\""
|
||||
|
||||
// Search all entries
|
||||
incrementEntry = 0
|
||||
@@ -78,21 +76,14 @@ class SearchHelper {
|
||||
private fun entryContainsString(database: Database,
|
||||
entry: Entry,
|
||||
searchParameters: SearchParameters): Boolean {
|
||||
val searchQuery = searchParameters.searchString
|
||||
val searchQuery = searchParameters.searchQuery
|
||||
// Entry don't contains string if the search string is empty
|
||||
if (searchQuery.isEmpty())
|
||||
return false
|
||||
|
||||
var searchFound = false
|
||||
|
||||
database.startManageEntry(entry)
|
||||
// Search all strings in the entry
|
||||
entry.entryKDB?.let { entryKDB ->
|
||||
searchFound = searchInEntry(entryKDB, searchParameters)
|
||||
}
|
||||
entry.entryKDBX?.let { entryKDBX ->
|
||||
searchFound = searchInEntry(entryKDBX, searchParameters)
|
||||
}
|
||||
val searchFound = searchInEntry(entry, searchParameters)
|
||||
database.stopManageEntry(entry)
|
||||
|
||||
return searchFound
|
||||
@@ -136,11 +127,11 @@ class SearchHelper {
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkString(stringToCheck: String, searchParameters: SearchParameters): Boolean {
|
||||
fun checkSearchQuery(stringToCheck: String, searchParameters: SearchParameters): Boolean {
|
||||
if (stringToCheck.isNotEmpty()
|
||||
&& stringToCheck
|
||||
.removeDiacriticalMarks()
|
||||
.contains(searchParameters.searchString
|
||||
.contains(searchParameters.searchQuery
|
||||
.removeDiacriticalMarks(),
|
||||
searchParameters.ignoreCase)) {
|
||||
return true
|
||||
@@ -148,56 +139,39 @@ class SearchHelper {
|
||||
return false
|
||||
}
|
||||
|
||||
fun searchInEntry(entryKDB: EntryKDB,
|
||||
searchParameters: SearchParameters): Boolean {
|
||||
private fun searchInEntry(entry: Entry,
|
||||
searchParameters: SearchParameters): Boolean {
|
||||
// Search all strings in the KDBX entry
|
||||
when {
|
||||
searchParameters.searchInTitles -> {
|
||||
if (checkString(entryKDB.title, searchParameters))
|
||||
return true
|
||||
}
|
||||
searchParameters.searchInUrls -> {
|
||||
if (checkString(entryKDB.url, searchParameters))
|
||||
return true
|
||||
}
|
||||
searchParameters.searchInUserNames -> {
|
||||
if (checkString(entryKDB.username, searchParameters))
|
||||
return true
|
||||
}
|
||||
searchParameters.searchInNotes -> {
|
||||
if (checkString(entryKDB.notes, searchParameters))
|
||||
return true
|
||||
if (searchParameters.searchInTitles) {
|
||||
if (checkSearchQuery(entry.title, searchParameters))
|
||||
return true
|
||||
}
|
||||
if (searchParameters.searchInUserNames) {
|
||||
if (checkSearchQuery(entry.username, searchParameters))
|
||||
return true
|
||||
}
|
||||
if (searchParameters.searchInPasswords) {
|
||||
if (checkSearchQuery(entry.password, searchParameters))
|
||||
return true
|
||||
}
|
||||
if (searchParameters.searchInUrls) {
|
||||
if (checkSearchQuery(entry.url, searchParameters))
|
||||
return true
|
||||
}
|
||||
if (searchParameters.searchInNotes) {
|
||||
if (checkSearchQuery(entry.notes, searchParameters))
|
||||
return true
|
||||
}
|
||||
if (searchParameters.searchInOther) {
|
||||
entry.getExtraFields().forEach { field ->
|
||||
if (field.name != OTP_FIELD
|
||||
|| (field.name == OTP_FIELD && searchParameters.searchInOTP)) {
|
||||
if (checkSearchQuery(field.protectedValue.toString(), searchParameters))
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
fun searchInEntry(entryKDBX: EntryKDBX,
|
||||
searchParameters: SearchParameters): Boolean {
|
||||
var searchFound = false
|
||||
// Search all strings in the KDBX entry
|
||||
EntryFieldsLoop@ for((key, value) in entryKDBX.fields) {
|
||||
if (entryKDBXKeyIsAllowedToSearch(key, searchParameters)) {
|
||||
val currentString = value.toString()
|
||||
if (checkString(currentString, searchParameters)) {
|
||||
searchFound = true
|
||||
break@EntryFieldsLoop
|
||||
}
|
||||
}
|
||||
}
|
||||
return searchFound
|
||||
}
|
||||
|
||||
private fun entryKDBXKeyIsAllowedToSearch(key: String, searchParameters: SearchParameters): Boolean {
|
||||
return when (key) {
|
||||
EntryKDBX.STR_TITLE -> searchParameters.searchInTitles
|
||||
EntryKDBX.STR_USERNAME -> searchParameters.searchInUserNames
|
||||
EntryKDBX.STR_PASSWORD -> searchParameters.searchInPasswords
|
||||
EntryKDBX.STR_URL -> searchParameters.searchInUrls
|
||||
EntryKDBX.STR_NOTES -> searchParameters.searchInNotes
|
||||
OtpEntryFields.OTP_FIELD -> searchParameters.searchInOTP
|
||||
else -> searchParameters.searchInOther
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ package com.kunzisoft.keepass.database.search
|
||||
*/
|
||||
class SearchParameters {
|
||||
|
||||
var searchString: String = ""
|
||||
var searchQuery: String = ""
|
||||
|
||||
var regularExpression = false
|
||||
var searchInTitles = true
|
||||
|
||||
Reference in New Issue
Block a user