-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improve Entry placeholder resolution #10846
Improve Entry placeholder resolution #10846
Conversation
4453524
to
2c682fa
Compare
Oh awesome, I have been meaning to clean this code for years.... its a mess. Can you also look into the "you've reached maximum depth of replacement" that gets thrown for some special sequences. There are some other long standing issues: https://github.com/keepassxreboot/keepassxc/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22feature%3A+Reference%2FPlaceholders%22 One thing I really want to move towards, this is another PR, is to swap the functions of Entry. Basically if you call |
Just checked and the fixes here do not fix the findings in #1741 Setting an entry with a password of |
2c682fa
to
8afff73
Compare
My latest commit here should fix #1741. |
After resolving placeholders, previously the code would do it all over again if anything had changed, multiple times up to the recursion limit. This would have the effect of applying a much greater recursion limit, which is confusing and unnecessary, and probably undesired.
- Entry::size(): when computing tag size, use same delimiter set as in other places in the code - Factor tag delimiter set regex out into global constant - Placeholder resolution: remove unnecessary special casing for self-referential placeholders (these are taken care of by existing recursion depth limit) - Placeholder resolution: less wasteful string building loop - Move some constants from being public static data members of Entry to being local to Entry.cpp (in anonymous namespace) - Migrate some QRegEx instances to QRegularExpression, the modern alternative - Miscellanous minor code cleanups
When encountering a {brace-enclosed} substring, the placeholder resolution logic would previously keep recursing until it hit the recursion depth limit (currently 10). This would lead to "Maximum depth of replacement has been reached" messages, and was also wasting CPU cycles. Fixes keepassxreboot#1741.
8afff73
to
07e1faa
Compare
* Entry placeholder resolution: don't overdo it After resolving placeholders, previously the code would do it all over again if anything had changed, multiple times up to the recursion limit. This would have the effect of applying a much greater recursion limit, which is confusing and unnecessary, and probably undesired. * Entry tweaks and minor refactoring - Entry::size(): when computing tag size, use same delimiter set as in other places in the code - Factor tag delimiter set regex out into global constant - Placeholder resolution: remove unnecessary special casing for self-referential placeholders (these are taken care of by existing recursion depth limit) - Placeholder resolution: less wasteful string building loop - Move some constants from being public static data members of Entry to being local to Entry.cpp (in anonymous namespace) - Migrate some QRegEx instances to QRegularExpression, the modern alternative - Miscellanous minor code cleanups * Entry: fix hitting recursion limit with {braces} When encountering a {brace-enclosed} substring, the placeholder resolution logic would previously keep recursing until it hit the recursion depth limit (currently 10). This would lead to "Maximum depth of replacement has been reached" messages, and was also wasting CPU cycles. Fixes #1741 --------- Co-authored-by: Jonathan White <[email protected]>
* Entry placeholder resolution: don't overdo it After resolving placeholders, previously the code would do it all over again if anything had changed, multiple times up to the recursion limit. This would have the effect of applying a much greater recursion limit, which is confusing and unnecessary, and probably undesired. * Entry tweaks and minor refactoring - Entry::size(): when computing tag size, use same delimiter set as in other places in the code - Factor tag delimiter set regex out into global constant - Placeholder resolution: remove unnecessary special casing for self-referential placeholders (these are taken care of by existing recursion depth limit) - Placeholder resolution: less wasteful string building loop - Move some constants from being public static data members of Entry to being local to Entry.cpp (in anonymous namespace) - Migrate some QRegEx instances to QRegularExpression, the modern alternative - Miscellanous minor code cleanups * Entry: fix hitting recursion limit with {braces} When encountering a {brace-enclosed} substring, the placeholder resolution logic would previously keep recursing until it hit the recursion depth limit (currently 10). This would lead to "Maximum depth of replacement has been reached" messages, and was also wasting CPU cycles. Fixes keepassxreboot#1741 --------- Co-authored-by: Jonathan White <[email protected]>
Release 2.7.9 * Passkeys: Ability to easily remove a passkey from an entry [keepassxreboot#10777] * Snap: Use new desktop portal for native messaging integration [keepassxreboot#10906] * Improve entry placeholder/reference feature [keepassxreboot#10846] * Improve CSV importing when title field isn't specified [keepassxreboot#10843] * Improve encrypted Bitwarden importing [keepassxreboot#10800] * Improve database settings UX [keepassxreboot#10821] * Improve handling of clipboard actions from entry preview [keepassxreboot#10810] * Improve group/entry view resize behavior and set sensible defaults [keepassxreboot#10641] * Passkeys: Fix incorrect username fill [keepassxreboot#10874] * Passkeys: Return additional data to the extension [keepassxreboot#10857] * Fix password clear timer inconsistency on unlock view [keepassxreboot#10708] * Fix portability check [keepassxreboot#10760] * Fix page overflow on HTML exports [keepassxreboot#10735] * Fix broken builds when using system provided zxcvbn [keepassxreboot#10717] * Fix copy password button when text is selected [keepassxreboot#10853] * Fix tab ordering on application settings pages [keepassxreboot#10907] * SSH Agent: Fix broken decrypt button [keepassxreboot#10638] * Windows: Fix ALT Auto-Type modifier [keepassxreboot#10795] * Windows: Fix wrong DACL memory size allocation [keepassxreboot#10712] * macOS: Fix monospace font sizing [keepassxreboot#10739] * Flatpak: Fix configuration settings off-by-one error [keepassxreboot#10688] * BSD: Fix compiling with libusb implementation [keepassxreboot#10736] # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCAAdFiEENIkEDB8MPuq41ValRA/GXy4MbgEFAmZzTogACgkQRA/GXy4M # bgHahggAg+hzMTiM0uDaw5yfxhv6GEfQQBPHMhX3JDyHEC+i7Pq6OjlxQkdUrRdu # f4w74od5jSul0Al/ehu9L2eZwNPMnU87FWDn16o1btYHsG9n24v5S0DuQoLXUjde # Y9nJNKeRNoWAlVKWbUG2YGvy9hF9YbtrFaiBksaQ+g3w8Xz82PzLY0VaUu4Xa/LO # RXAhryJC+8T3T479dXpHxJcUmEWkoY4bqj1i6R8tEK5Kz9y1c0kqzqwWysKMj+rD # WxTb2V4y9s57pO35zt9yxMLg66xx9bdcQHbSULa2vZNMFd9qdqk8WJmWFle112yG # UCBXv2ZIjd3lghPt0IrD+WKcuL85Aw== # =rbfs # -----END PGP SIGNATURE----- # gpg: directory '/home/runner/.gnupg' created # gpg: keybox '/home/runner/.gnupg/pubring.kbx' created # gpg: Signature made Wed Jun 19 21:32:56 2024 UTC # gpg: using RSA key 3489040C1F0C3EEAB8D556A5440FC65F2E0C6E01 # gpg: Can't check signature: No public key
Release 2.7.9 * Passkeys: Ability to easily remove a passkey from an entry [keepassxreboot#10777] * Snap: Use new desktop portal for native messaging integration [keepassxreboot#10906] * Improve entry placeholder/reference feature [keepassxreboot#10846] * Improve CSV importing when title field isn't specified [keepassxreboot#10843] * Improve encrypted Bitwarden importing [keepassxreboot#10800] * Improve database settings UX [keepassxreboot#10821] * Improve handling of clipboard actions from entry preview [keepassxreboot#10810] * Improve group/entry view resize behavior and set sensible defaults [keepassxreboot#10641] * Passkeys: Fix incorrect username fill [keepassxreboot#10874] * Passkeys: Return additional data to the extension [keepassxreboot#10857] * Fix password clear timer inconsistency on unlock view [keepassxreboot#10708] * Fix portability check [keepassxreboot#10760] * Fix page overflow on HTML exports [keepassxreboot#10735] * Fix broken builds when using system provided zxcvbn [keepassxreboot#10717] * Fix copy password button when text is selected [keepassxreboot#10853] * Fix tab ordering on application settings pages [keepassxreboot#10907] * SSH Agent: Fix broken decrypt button [keepassxreboot#10638] * Windows: Fix ALT Auto-Type modifier [keepassxreboot#10795] * Windows: Fix wrong DACL memory size allocation [keepassxreboot#10712] * macOS: Fix monospace font sizing [keepassxreboot#10739] * Flatpak: Fix configuration settings off-by-one error [keepassxreboot#10688] * BSD: Fix compiling with libusb implementation [keepassxreboot#10736]
After resolving placeholders in entry attributes (e.g.
{URL}
), previously the code would do it all over again if anything had changed, multiple times up to the recursion limit. This would have the effect of applying a much greater recursion limit, which is confusing and unnecessary, and probably undesired.Also, optimise and improve resolution of multiple placeholders by (a) being consistent about which placeholder substring to replace (i.e. the one found by the regex, as opposed to possibly one just introduced through a previous substitution), and (b) building the replacement string from scratch rather than doing successive string replacements.
Together, the above two changes are enough to fix #7158 in my testing.
While I was at it, I made some further improvements to the entry-related code:
Entry::size()
: when computing tag size, use the same delimiter set as in other places in the code.class Entry
to being local toEntry.cpp
(in an anonymous namespace).QRegEx
instances toQRegularExpression
, the modern alternative.Also fixes #1741
Testing strategy
No new functionality. Existing tests look sufficiently comprehensive, and they continue to pass.
Type of change