Implement recursive resolving for placeholders#1078
Conversation
|
@droidmonkey @phoerious please review the changes |
src/core/Entry.cpp
Outdated
| } | ||
|
|
||
| QString result = str; | ||
| QRegExp placeholderRegEx("(\\{.*\\})", Qt::CaseInsensitive, QRegExp::RegExp2); |
There was a problem hiding this comment.
I don't like this regular expression. It matches zero-length placeholders and if greedy evaluation is used (it's not atm, but this may be a potential error source), it also matches placeholders containing closing braces and may produce unnecessary backtracking. You should change this to (\\{[^\\}]+).
src/core/Entry.cpp
Outdated
|
|
||
| QString Entry::resolvePlaceholderRecursive(const QString &placeholder, int maxDepth) const | ||
| { | ||
| const PlaceholderType placeholderType = this->placeholderType(placeholder); |
There was a problem hiding this comment.
this pointer is not needed.
There was a problem hiding this comment.
This is useful for debugging, have the value which is returned by the function in a separate variable. I renamed the local variable.
There was a problem hiding this comment.
I meant the explicit this pointer is not needed. Just call placeholderType() without this->.
There was a problem hiding this comment.
This code didn't work, variable name overrides the function name
const PlaceholderType placeholderType = placeholderType(placeholder);
src/core/Entry.cpp
Outdated
| const Entry* refEntry = m_group->database()->resolveEntry(referencedUuid); | ||
| if (refEntry) { | ||
| const QString wantedField = referenceRegExp->cap(wantedFieldIndex).toLower(); | ||
| if (wantedField == "t") result = refEntry->title(); |
There was a problem hiding this comment.
Don't put condition and body on the same line.
There was a problem hiding this comment.
Use brackets on all conditional statements (styleguide).
src/core/Entry.cpp
Outdated
| case PlaceholderType::UrlPassword: | ||
| return qurl.password(); | ||
| default: | ||
| Q_ASSERT(false); |
There was a problem hiding this comment.
Use Q_ASSERT_X. Q_ASSERT(false) gives not useful error message.
|
|
||
| Entry::PlaceholderType Entry::placeholderType(const QString &placeholder) const | ||
| { | ||
| if (!placeholder.startsWith(QLatin1Char('{')) || !placeholder.endsWith(QLatin1Char('}'))) { |
There was a problem hiding this comment.
yes. In some places, the function "resolvePlaceholder" called directly.
src/core/Entry.cpp
Outdated
| { QStringLiteral("{URL:PASSWORD}"), PlaceholderType::UrlPassword } | ||
| }; | ||
|
|
||
| PlaceholderType result = placeholders.value(placeholder.toUpper(), PlaceholderType::Unknown); |
There was a problem hiding this comment.
Variable assignment is redundant. Directly return the result.
| delete entry; | ||
| } | ||
|
|
||
| void TestEntry::testResolveUrlPlaceholders() |
tests/TestEntry.cpp
Outdated
|
|
||
| void TestEntry::testResolveUrlPlaceholders() | ||
| { | ||
| Entry* entry = new Entry(); |
There was a problem hiding this comment.
You could use a stack variable here. No need for dynamic allocation. Or at least use a QScopedPointer.
tests/TestEntry.cpp
Outdated
|
|
||
| void TestEntry::testResolveRecursivePlaceholders() | ||
| { | ||
| Database* db = new Database(); |
tests/TestEntry.cpp
Outdated
| QString userinfo("user:pw"); // User information of the entry URL. | ||
| QString username("user"); // User name of the entry URL. | ||
| QString password("pw"); // Password of the entry URL. | ||
| QString fragment("fragment"); // Password of the entry URL. |
There was a problem hiding this comment.
The comment here is wrong, just a typo :)
|
I have one question. When I make changes to correct the observations. I must use squashing or I can just push new changes with a new commit? |
|
IMHO it's the best if you make new commits so we can see the changes easily. We will squash when merging if needed (most of the time we don't) |
|
@TheZ3ro thanks for the explanation |
|
thanks for your contributions 😉 |
|
To me if its minor change thats obvious i just amend and force push. Otherwise a new commit is preferred. |
d8fce34 to
3a0c965
Compare
|
Oops, what is the minimum version of Qt should be supported? |
|
Until now it has been 5.2, which is required to build with Trusty. If it makes sense, we can upgrade it, though. |
3a0c965 to
727c533
Compare
|
I removed the usage of Q_ENUM |
| Database db; | ||
| Group* root = db.rootGroup(); | ||
|
|
||
| Entry* entry1 = new Entry(); |
There was a problem hiding this comment.
You used a stack variable for the test above, you can do the same here.
There was a problem hiding this comment.
@phoerious can I not use stack variables? The database will still destroy all records.
There was a problem hiding this comment.
You mean free store variables? Yes, you are right. I actually didn't mark it last time exactly for that reason. Forgot about it this time. All fine. Just rebase to current develop and I can merge this.
727c533 to
f0fcc19
Compare
|
@phoerious @droidmonkey @TheZ3ro thanks guys ;) |
- Add support for KDBX 4.0, Argon2 and ChaCha20 [#148, #1179, #1230, #1494] - Add SSH Agent feature [#1098, #1450, #1463] - Add preview panel with details of the selected entry [#879, #1338] - Add more and configurable columns to entry table and allow copying of values by double click [#1305] - Add KeePassXC-Browser API as a replacement for KeePassHTTP [#608] - Deprecate KeePassHTTP [#1392] - Add support for Steam one-time passwords [#1206] - Add support for multiple Auto-Type sequences for a single entry [#1390] - Adjust YubiKey HMAC-SHA1 challenge-response key generation for KDBX 4.0 [#1060] - Replace qHttp with cURL for website icon downloads [#1460] - Remove lock file [#1231] - Add option to create backup file before saving [#1385] - Ask to save a generated password before closing the entry password generator [#1499] - Resolve placeholders recursively [#1078] - Add Auto-Type button to the toolbar [#1056] - Improve window focus handling for Auto-Type dialogs [#1204, #1490] - Auto-Type dialog and password generator can now be exited with ESC [#1252, #1412] - Add optional dark tray icon [#1154] - Add new "Unsafe saving" option to work around saving problems with file sync services [#1385] - Add IBus support to AppImage and additional image formats to Windows builds [#1534, #1537] - Add diceware password generator to CLI [#1406] - Add --key-file option to CLI [#816, #824] - Add DBus interface for opening and closing KeePassXC databases [#283] - Add KDBX compression options to database settings [#1419] - Discourage use of old fixed-length key files in favor of arbitrary files [#1326, #1327] - Correct reference resolution in entry fields [#1486] - Fix window state and recent databases not being remembered on exit [#1453] - Correct history item generation when configuring TOTP for an entry [#1446] - Correct multiple TOTP bugs [#1414] - Automatic saving after every change is now a default [#279] - Allow creation of new entries during search [#1398] - Correct menu issues on macOS [#1335] - Allow compilation on OpenBSD [#1328] - Improve entry attachments view [#1139, #1298] - Fix auto lock for Gnome and Xfce [#910, #1249] - Don't remember key files in file dialogs when the setting is disabled [#1188] - Improve database merging and conflict resolution [#807, #1165] - Fix macOS pasteboard issues [#1202] - Improve startup times on some platforms [#1205] - Hide the notes field by default [#1124] - Toggle main window by clicking tray icon with the middle mouse button [#992] - Fix custom icons not copied over when databases are merged [#1008] - Allow use of DEL key to delete entries [#914] - Correct intermittent crash due to stale history items [#1527] - Sanitize newline characters in title, username and URL fields [#1502] - Reopen previously opened databases in correct order [#774] - Use system's zxcvbn library if available [#701] - Implement various i18n improvements [#690, #875, #1436]
Implement recursive resolving for placeholders
Description
Recursive resolving for placeholders
From keepass help:
Currently KeePassXC does not support the described behavior.
Add support for {URL:Placeholders}
URL placeholders:
Motivation and context
Implement behavior similar to keepass2
How has this been tested?
With unit test, TestEntry class.
Screenshots (if appropriate):
Types of changes
Checklist:
-DWITH_ASAN=ON. [REQUIRED]