From 2fea019b95c719779122fb13bfec12e58e152203 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Wed, 29 Oct 2025 18:12:44 +0100 Subject: [PATCH] fix: Save search info if URL present #2255 --- CHANGELOG | 1 + .../keepass/activities/GroupActivity.kt | 17 +++++++++++++++-- .../keepass/model/AppOriginEntryField.kt | 2 +- .../com/kunzisoft/keepass/model/EntryInfo.kt | 13 +++++++++++++ .../metadata/android/en-US/changelogs/148.txt | 3 ++- .../metadata/android/fr-FR/changelogs/148.txt | 3 ++- 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 20c81a96c..004737f9e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ KeePassDX(4.2.3) * Fix multiple Passkey selection #2253 * Fix database dialog subtitle #2254 + * Fix save search info if URL present #2255 KeePassDX(4.2.2) * Fix database merge algorithm #2223 diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index 0b37f2378..94ad52ef6 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -841,7 +841,7 @@ class GroupActivity : DatabaseLockActivity(), // Open child group loadMainGroup(GroupState(group.nodeId, 0)) } catch (e: ClassCastException) { - Log.e(TAG, "Node can't be cast in Group") + Log.e(TAG, "Node can't be cast in Group", e) } Type.ENTRY -> try { @@ -867,6 +867,7 @@ class GroupActivity : DatabaseLockActivity(), if (!database.isReadOnly && searchInfo != null && PreferencesUtil.isKeyboardSaveSearchInfoEnable(this@GroupActivity) + && entryVersioned.containsSearchInfo(database, searchInfo).not() ) { updateEntryWithRegisterInfo( database, @@ -884,6 +885,7 @@ class GroupActivity : DatabaseLockActivity(), if (!database.isReadOnly && searchInfo != null && PreferencesUtil.isAutofillSaveSearchInfoEnable(this@GroupActivity) + && entryVersioned.containsSearchInfo(database, searchInfo).not() ) { updateEntryWithRegisterInfo( database, @@ -912,7 +914,7 @@ class GroupActivity : DatabaseLockActivity(), finish() }) } catch (e: ClassCastException) { - Log.e(TAG, "Node can't be cast in Entry") + Log.e(TAG, "Node can't be cast in Entry", e) } } } @@ -981,6 +983,17 @@ class GroupActivity : DatabaseLockActivity(), updateEntry(entry, newEntry) } + private fun Entry.containsSearchInfo( + database: ContextualDatabase, + searchInfo: SearchInfo + ): Boolean { + return getEntryInfo( + database, + raw = true, + removeTemplateConfiguration = false + ).containsSearchInfo(searchInfo) + } + private fun finishNodeAction() { actionNodeMode?.finish() } diff --git a/database/src/main/java/com/kunzisoft/keepass/model/AppOriginEntryField.kt b/database/src/main/java/com/kunzisoft/keepass/model/AppOriginEntryField.kt index bc9580458..567424e31 100644 --- a/database/src/main/java/com/kunzisoft/keepass/model/AppOriginEntryField.kt +++ b/database/src/main/java/com/kunzisoft/keepass/model/AppOriginEntryField.kt @@ -71,7 +71,7 @@ object AppOriginEntryField { /** * Useful to detect if an other KeePass compatibility app already add a web domain or an app id */ - private fun EntryInfo.containsDomainOrApplicationId(search: String): Boolean { + fun EntryInfo.containsDomainOrApplicationId(search: String): Boolean { if (url.contains(search)) return true return customFields.find { diff --git a/database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt b/database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt index 8c45ee341..5576b664f 100644 --- a/database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt +++ b/database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt @@ -27,6 +27,7 @@ import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Field import com.kunzisoft.keepass.database.element.Tags import com.kunzisoft.keepass.database.element.entry.AutoType +import com.kunzisoft.keepass.model.AppOriginEntryField.containsDomainOrApplicationId import com.kunzisoft.keepass.model.AppOriginEntryField.setAppOrigin import com.kunzisoft.keepass.model.AppOriginEntryField.setApplicationId import com.kunzisoft.keepass.model.AppOriginEntryField.setWebDomain @@ -183,6 +184,18 @@ class EntryInfo : NodeInfo { } } + /** + * True if this entry contains domain or applicationId, + * OTP is ignored and considered not present + */ + fun containsSearchInfo(searchInfo: SearchInfo): Boolean { + return searchInfo.webDomain?.let { webDomain -> + containsDomainOrApplicationId(webDomain) + } ?: searchInfo.applicationId?.let { applicationId -> + containsDomainOrApplicationId(applicationId) + } ?: false + } + /** * Add searchInfo to current EntryInfo */ diff --git a/fastlane/metadata/android/en-US/changelogs/148.txt b/fastlane/metadata/android/en-US/changelogs/148.txt index e3e1a58d4..33eca8d6b 100644 --- a/fastlane/metadata/android/en-US/changelogs/148.txt +++ b/fastlane/metadata/android/en-US/changelogs/148.txt @@ -1,2 +1,3 @@ * Fix multiple Passkey selection #2253 - * Fix database dialog subtitle #2254 \ No newline at end of file + * Fix database dialog subtitle #2254 + * Fix save search info if URL present #2255 \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/148.txt b/fastlane/metadata/android/fr-FR/changelogs/148.txt index 18cbd8d34..edd509c9b 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/148.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/148.txt @@ -1,2 +1,3 @@ * Correction de la selection multiple des Passkeys #2253 - * Correction du sous-titre du dialogue de la base de données #2254 \ No newline at end of file + * Correction du sous-titre du dialogue de la base de données #2254 + * Correction de la sauvegarde des infos de recherchesi l'URL est present #2255 \ No newline at end of file