fix: Exclude field for form filling #2097

This commit is contained in:
J-Jamet
2025-08-21 21:25:26 +02:00
parent 05a39f6922
commit 6672085d84
7 changed files with 33 additions and 23 deletions

View File

@@ -258,7 +258,7 @@ object AutofillHelper {
}
}
}
for (field in entryInfo.customFields) {
for (field in entryInfo.getCustomFieldsForFilling()) {
if (field.name == TemplateField.LABEL_HOLDER) {
struct.creditCardHolderId?.let { ccNameId ->
datasetBuilder.addValueToDatasetBuilder(

View File

@@ -41,9 +41,9 @@ import androidx.core.graphics.BlendModeCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.credentialprovider.activity.EntrySelectionLauncherActivity
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper
import com.kunzisoft.keepass.adapters.FieldsAdapter
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper
import com.kunzisoft.keepass.credentialprovider.activity.EntrySelectionLauncherActivity
import com.kunzisoft.keepass.database.ContextualDatabase
import com.kunzisoft.keepass.database.DatabaseTaskProvider
import com.kunzisoft.keepass.database.element.Field
@@ -324,9 +324,9 @@ class MagikeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionL
actionGoAutomatically()
}
KEY_FIELDS -> {
getEntryInfo()?.customFields?.let { customFields ->
getEntryInfo()?.getCustomFieldsForFilling()?.let { customFields ->
fieldsAdapter?.apply {
setFields(customFields.filter { it.name != OTP_TOKEN_FIELD})
setFields(customFields)
notifyDataSetChanged()
}
}

View File

@@ -274,10 +274,12 @@ class ClipboardEntryNotificationService : LockNotificationService() {
val containsPasswordToCopy = entry.password.isNotEmpty()
&& PreferencesUtil.allowCopyProtectedFields(context)
val containsOTPToCopy = entry.containsCustomField(OTP_TOKEN_FIELD)
val containsExtraFieldToCopy = entry.customFields.isNotEmpty()
&& (entry.containsCustomFieldsNotProtected()
val customFields = entry.getCustomFieldsForFilling()
val containsExtraFieldToCopy = customFields.isNotEmpty()
&& (customFields.any { !it.protectedValue.isProtected }
||
(entry.containsCustomFieldsProtected() && PreferencesUtil.allowCopyProtectedFields(context))
(customFields.any { it.protectedValue.isProtected }
&& PreferencesUtil.allowCopyProtectedFields(context))
)
var startService = false
@@ -320,7 +322,7 @@ class ClipboardEntryNotificationService : LockNotificationService() {
if (containsExtraFieldToCopy) {
try {
var anonymousFieldNumber = 0
entry.customFields.forEach { field ->
entry.getCustomFieldsForFilling().forEach { field ->
//If value is not protected or allowed
if ((!field.protectedValue.isProtected
|| PreferencesUtil.allowCopyProtectedFields(context))

View File

@@ -24,10 +24,10 @@ import com.kunzisoft.keepass.database.element.Entry
import com.kunzisoft.keepass.database.element.Group
import com.kunzisoft.keepass.database.element.node.NodeHandler
import com.kunzisoft.keepass.database.element.node.NodeId
import com.kunzisoft.keepass.model.PasskeyEntryFields
import com.kunzisoft.keepass.model.PasskeyEntryFields.FIELD_RELYING_PARTY
import com.kunzisoft.keepass.otp.OtpEntryFields
import com.kunzisoft.keepass.model.PasskeyEntryFields.isPasskeyExclusion
import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_FIELD
import com.kunzisoft.keepass.otp.OtpEntryFields.isOtpExclusion
import com.kunzisoft.keepass.utils.UuidUtil
import com.kunzisoft.keepass.utils.inTheSameDomainAs
@@ -186,8 +186,8 @@ class SearchHelper {
}
if (searchParameters.searchInOther) {
if(entry.getExtraFields().any { field ->
OtpEntryFields.searchExcluded(field)
&& PasskeyEntryFields.searchExcluded(field)
field.isOtpExclusion()
&& field.isPasskeyExclusion()
&& checkSearchQuery(field.protectedValue.toString(), searchParameters)
})
return true

View File

@@ -30,10 +30,12 @@ import com.kunzisoft.keepass.database.element.Tags
import com.kunzisoft.keepass.database.element.entry.AutoType
import com.kunzisoft.keepass.database.element.security.ProtectedString
import com.kunzisoft.keepass.database.element.template.TemplateField
import com.kunzisoft.keepass.model.PasskeyEntryFields.isPasskeyExclusion
import com.kunzisoft.keepass.model.PasskeyEntryFields.setPasskey
import com.kunzisoft.keepass.otp.OtpElement
import com.kunzisoft.keepass.otp.OtpEntryFields
import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_TOKEN_FIELD
import com.kunzisoft.keepass.otp.OtpEntryFields.isOtpExclusion
import com.kunzisoft.keepass.utils.readBooleanCompat
import com.kunzisoft.keepass.utils.readListCompat
import com.kunzisoft.keepass.utils.readParcelableCompat
@@ -99,12 +101,11 @@ class EntryInfo : NodeInfo {
parcel.writeBooleanCompat(isTemplate)
}
fun containsCustomFieldsProtected(): Boolean {
return customFields.any { it.protectedValue.isProtected }
}
fun containsCustomFieldsNotProtected(): Boolean {
return customFields.any { !it.protectedValue.isProtected }
fun getCustomFieldsForFilling(): List<Field> {
return customFields.filter {
!it.isOtpExclusion()
&& !it.isPasskeyExclusion()
}
}
fun containsCustomField(label: String): Boolean {

View File

@@ -120,8 +120,12 @@ object PasskeyEntryFields {
return newCustomFields
}
fun searchExcluded(field: Field): Boolean {
return when(field.name) {
/**
* Field ignored for a search or a form filling
*/
fun Field.isPasskeyExclusion(): Boolean {
return when(name) {
PASSKEY_FIELD -> true
FIELD_USERNAME -> true
FIELD_PRIVATE_KEY -> true
FIELD_CREDENTIAL_ID -> true

View File

@@ -487,8 +487,11 @@ object OtpEntryFields {
return newCustomFields
}
fun searchExcluded(field: Field): Boolean {
return when(field.name) {
/**
* Field ignored for a search or a form filling
*/
fun Field.isOtpExclusion(): Boolean {
return when(name) {
OTP_FIELD -> true
TOTP_SEED_FIELD -> true
TOTP_SETTING_FIELD -> true