Fix search in field reference

This commit is contained in:
J-Jamet
2021-04-19 18:24:30 +02:00
parent 4a40719534
commit 622b2e1edc
4 changed files with 77 additions and 88 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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
}
}
}
}

View File

@@ -24,7 +24,7 @@ package com.kunzisoft.keepass.database.search
*/
class SearchParameters {
var searchString: String = ""
var searchQuery: String = ""
var regularExpression = false
var searchInTitles = true