-
-
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
Implement recursive resolving for placeholders #1078
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 (\\{[^\\}]+)
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this
pointer is not needed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I meant the explicit this
pointer is not needed. Just call placeholderType()
without this->
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This code didn't work, variable name overrides the function name
const PlaceholderType placeholderType = placeholderType(placeholder);
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rename the variable then.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't put condition and body on the same line.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use brackets on all conditional statements (styleguide).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
src/core/Entry.cpp
Outdated
case PlaceholderType::UrlPassword: | ||
return qurl.password(); | ||
default: | ||
Q_ASSERT(false); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use Q_ASSERT_X. Q_ASSERT(false) gives not useful error message.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
|
||
Entry::PlaceholderType Entry::placeholderType(const QString &placeholder) const | ||
{ | ||
if (!placeholder.startsWith(QLatin1Char('{')) || !placeholder.endsWith(QLatin1Char('}'))) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can this case ever occur?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Variable assignment is redundant. Directly return the result.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
@@ -158,3 +160,109 @@ void TestEntry::testResolveUrl() | |||
|
|||
delete entry; | |||
} | |||
|
|||
void TestEntry::testResolveUrlPlaceholders() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1 for tests!
tests/TestEntry.cpp
Outdated
|
||
void TestEntry::testResolveUrlPlaceholders() | ||
{ | ||
Entry* entry = new Entry(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could use a stack variable here. No need for dynamic allocation. Or at least use a QScopedPointer.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
tests/TestEntry.cpp
Outdated
|
||
void TestEntry::testResolveRecursivePlaceholders() | ||
{ | ||
Database* db = new Database(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The comment here is wrong, just a typo :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You used a stack variable for the test above, you can do the same here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@phoerious can I not use stack variables? The database will still destroy all records.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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]