From 71a39c37eca9b080a2f06e768ad2e83fe6ff6cb8 Mon Sep 17 00:00:00 2001 From: James Ring Date: Thu, 30 Jan 2020 12:46:48 -0800 Subject: [PATCH] Add --username option to Clip command. (#3947) * make Clip accept an attribute name This allows users to copy arbitrary attributes (e.g. username, notes, URL) to the clipboard in addition to the password and TOTP values. * update Clip manpage * Add findAttributes to CLI utils * Use case-insensitive search in Show command. * Use case-insensitive search in Clip command. Co-authored-by: louib --- share/docs/man/keepassxc-cli.1 | 12 +++++--- src/cli/Clip.cpp | 52 ++++++++++++++++++++++++--------- src/cli/Clip.h | 1 + src/cli/Show.cpp | 26 ++++++++++++----- src/cli/Utils.cpp | 17 +++++++++++ src/cli/Utils.h | 9 ++++++ tests/TestCli.cpp | 44 +++++++++++++++++++++++++++- tests/data/NewDatabase.kdbx | Bin 15006 -> 20334 bytes 8 files changed, 135 insertions(+), 26 deletions(-) diff --git a/share/docs/man/keepassxc-cli.1 b/share/docs/man/keepassxc-cli.1 index d7ab9cdd..d1360cd6 100644 --- a/share/docs/man/keepassxc-cli.1 +++ b/share/docs/man/keepassxc-cli.1 @@ -23,7 +23,7 @@ The same password generation options as documented for the generate command can Analyzes passwords in a database for weaknesses. .IP "\fBclip\fP [options] [timeout]" -Copies the password or the current TOTP (\fI-t\fP option) of a database entry to the clipboard. If multiple entries with the same name exist in different groups, only the password for the first one is going to be copied. For copying the password of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name. Optionally, a timeout in seconds can be specified to automatically clear the clipboard. +Copies an attribute or the current TOTP (if the \fI-t\fP option is specified) of a database entry to the clipboard. If no attribute name is specified using the \fI-a\fP option, the password is copied. If multiple entries with the same name exist in different groups, only the attribute for the first one is copied. For copying the attribute of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name. Optionally, a timeout in seconds can be specified to automatically clear the clipboard. .IP "\fBclose\fP" In interactive mode, closes the currently opened database (see \fIopen\fP). @@ -174,10 +174,14 @@ hour or so). .SS "Clip options" -.IP "\fB-t\fP, \fB--totp\fP" -Copies the current TOTP instead of current password to clipboard. Will report -an error if no TOTP is configured for the entry. +.IP "\fB-a\fP, \fB--attribute\fP" +Copies the specified attribute to the clipboard. If no attribute is specified, +the password attribute is the default. For example, "\fI-a\fP username" would +copy the username to the clipboard. [Default: password] +.IP "\fB-t\fP, \fB--totp\fP" +Copies the current TOTP instead of the specified attribute to the clipboard. +Will report an error if no TOTP is configured for the entry. .SS "Create options" diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp index 482ad8a1..ccb7c0e5 100644 --- a/src/cli/Clip.cpp +++ b/src/cli/Clip.cpp @@ -17,7 +17,6 @@ #include #include -#include #include #include "Clip.h" @@ -28,14 +27,23 @@ #include "core/Entry.h" #include "core/Group.h" -const QCommandLineOption Clip::TotpOption = QCommandLineOption(QStringList() << "t" - << "totp", - QObject::tr("Copy the current TOTP to the clipboard.")); +const QCommandLineOption Clip::AttributeOption = QCommandLineOption( + QStringList() << "a" + << "attribute", + QObject::tr("Copy the given attribute to the clipboard. Defaults to \"password\" if not specified."), + "attr", + "password"); + +const QCommandLineOption Clip::TotpOption = + QCommandLineOption(QStringList() << "t" + << "totp", + QObject::tr("Copy the current TOTP to the clipboard (equivalent to \"-a totp\").")); Clip::Clip() { name = QString("clip"); - description = QObject::tr("Copy an entry's password to the clipboard."); + description = QObject::tr("Copy an entry's attribute to the clipboard."); + options.append(Clip::AttributeOption); options.append(Clip::TotpOption); positionalArguments.append( {QString("entry"), QObject::tr("Path of the entry to clip.", "clip = copy to clipboard"), QString("")}); @@ -51,7 +59,6 @@ int Clip::executeWithDatabase(QSharedPointer database, QSharedPointer< if (args.size() == 3) { timeout = args.at(2); } - bool clipTotp = parser->isSet(Clip::TotpOption); TextStream errorTextStream(Utils::STDERR); int timeoutSeconds = 0; @@ -70,16 +77,39 @@ int Clip::executeWithDatabase(QSharedPointer database, QSharedPointer< return EXIT_FAILURE; } + if (parser->isSet(AttributeOption) && parser->isSet(TotpOption)) { + errorTextStream << QObject::tr("ERROR: Please specify one of --attribute or --totp, not both.") << endl; + return EXIT_FAILURE; + } + + QString selectedAttribute = parser->value(AttributeOption); QString value; - if (clipTotp) { + bool found = false; + if (parser->isSet(TotpOption) || selectedAttribute == "totp") { if (!entry->hasTotp()) { errorTextStream << QObject::tr("Entry with path %1 has no TOTP set up.").arg(entryPath) << endl; return EXIT_FAILURE; } + found = true; value = entry->totp(); } else { - value = entry->password(); + QStringList attrs = Utils::findAttributes(*entry->attributes(), selectedAttribute); + if (attrs.size() > 1) { + errorTextStream << QObject::tr("ERROR: attribute %1 is ambiguous, it matches %2.") + .arg(selectedAttribute, QLocale().createSeparatedList(attrs)) + << endl; + return EXIT_FAILURE; + } else if (attrs.size() == 1) { + found = true; + selectedAttribute = attrs[0]; + value = entry->attributes()->value(selectedAttribute); + } + } + + if (!found) { + outputTextStream << QObject::tr("Attribute \"%1\" not found.").arg(selectedAttribute) << endl; + return EXIT_FAILURE; } int exitCode = Utils::clipText(value); @@ -87,11 +117,7 @@ int Clip::executeWithDatabase(QSharedPointer database, QSharedPointer< return exitCode; } - if (clipTotp) { - outputTextStream << QObject::tr("Entry's current TOTP copied to the clipboard!") << endl; - } else { - outputTextStream << QObject::tr("Entry's password copied to the clipboard!") << endl; - } + outputTextStream << QObject::tr("Entry's \"%1\" attribute copied to the clipboard!").arg(selectedAttribute) << endl; if (!timeoutSeconds) { return exitCode; diff --git a/src/cli/Clip.h b/src/cli/Clip.h index b171c868..291e6329 100644 --- a/src/cli/Clip.h +++ b/src/cli/Clip.h @@ -27,6 +27,7 @@ public: int executeWithDatabase(QSharedPointer db, QSharedPointer parser) override; + static const QCommandLineOption AttributeOption; static const QCommandLineOption TotpOption; }; diff --git a/src/cli/Show.cpp b/src/cli/Show.cpp index f7bf8d54..12b2a835 100644 --- a/src/cli/Show.cpp +++ b/src/cli/Show.cpp @@ -27,6 +27,8 @@ #include "core/Global.h" #include "core/Group.h" +#include + const QCommandLineOption Show::TotpOption = QCommandLineOption(QStringList() << "t" << "totp", QObject::tr("Show the entry's current TOTP.")); @@ -79,25 +81,33 @@ int Show::executeWithDatabase(QSharedPointer database, QSharedPointer< // If no attributes specified, output the default attribute set. bool showDefaultAttributes = attributes.isEmpty() && !showTotp; - if (attributes.isEmpty() && !showTotp) { + if (showDefaultAttributes) { attributes = EntryAttributes::DefaultAttributes; } // Iterate over the attributes and output them line-by-line. - bool sawUnknownAttribute = false; + bool encounteredError = false; for (const QString& attributeName : asConst(attributes)) { - if (!entry->attributes()->contains(attributeName)) { - sawUnknownAttribute = true; + QStringList attrs = Utils::findAttributes(*entry->attributes(), attributeName); + if (attrs.isEmpty()) { + encounteredError = true; errorTextStream << QObject::tr("ERROR: unknown attribute %1.").arg(attributeName) << endl; continue; + } else if (attrs.size() > 1) { + encounteredError = true; + errorTextStream << QObject::tr("ERROR: attribute %1 is ambiguous, it matches %2.") + .arg(attributeName, QLocale().createSeparatedList(attrs)) + << endl; + continue; } + QString canonicalName = attrs[0]; if (showDefaultAttributes) { - outputTextStream << attributeName << ": "; + outputTextStream << canonicalName << ": "; } - if (entry->attributes()->isProtected(attributeName) && showDefaultAttributes && !showProtectedAttributes) { + if (entry->attributes()->isProtected(canonicalName) && showDefaultAttributes && !showProtectedAttributes) { outputTextStream << "PROTECTED" << endl; } else { - outputTextStream << entry->resolveMultiplePlaceholders(entry->attributes()->value(attributeName)) << endl; + outputTextStream << entry->resolveMultiplePlaceholders(entry->attributes()->value(canonicalName)) << endl; } } @@ -105,5 +115,5 @@ int Show::executeWithDatabase(QSharedPointer database, QSharedPointer< outputTextStream << entry->totp() << endl; } - return sawUnknownAttribute ? EXIT_FAILURE : EXIT_SUCCESS; + return encounteredError ? EXIT_FAILURE : EXIT_SUCCESS; } diff --git a/src/cli/Utils.cpp b/src/cli/Utils.cpp index 9988b60f..88d70466 100644 --- a/src/cli/Utils.cpp +++ b/src/cli/Utils.cpp @@ -331,4 +331,21 @@ namespace Utils return result; } + QStringList findAttributes(const EntryAttributes& attributes, const QString& name) + { + QStringList result; + if (attributes.hasKey(name)) { + result.append(name); + return result; + } + + for (const QString& key : attributes.keys()) { + if (key.compare(name, Qt::CaseSensitivity::CaseInsensitive) == 0) { + result.append(key); + } + } + + return result; + } + } // namespace Utils diff --git a/src/cli/Utils.h b/src/cli/Utils.h index b7fa63ac..d96e260c 100644 --- a/src/cli/Utils.h +++ b/src/cli/Utils.h @@ -20,6 +20,7 @@ #include "cli/TextStream.h" #include "core/Database.h" +#include "core/EntryAttributes.h" #include "keys/CompositeKey.h" #include "keys/FileKey.h" #include "keys/PasswordKey.h" @@ -51,6 +52,14 @@ namespace Utils QStringList splitCommandString(const QString& command); + /** + * If `attributes` contains an attribute named `name` (case-sensitive), + * returns a list containing only `name`. Otherwise, returns the list of + * all attribute names in `attributes` matching the given name + * (case-insensitive). + */ + QStringList findAttributes(const EntryAttributes& attributes, const QString& name); + namespace Test { void setNextPassword(const QString& password); diff --git a/tests/TestCli.cpp b/tests/TestCli.cpp index bc96de97..efaff183 100644 --- a/tests/TestCli.cpp +++ b/tests/TestCli.cpp @@ -480,7 +480,7 @@ void TestCli::testClip() QCOMPARE(clipboard->text(), QString("Password")); m_stdoutFile->readLine(); // skip prompt line - QCOMPARE(m_stdoutFile->readLine(), QByteArray("Entry's password copied to the clipboard!\n")); + QCOMPARE(m_stdoutFile->readLine(), QByteArray("Entry's \"Password\" attribute copied to the clipboard!\n")); // Quiet option qint64 pos = m_stdoutFile->pos(); @@ -491,6 +491,11 @@ void TestCli::testClip() QCOMPARE(m_stdoutFile->readAll(), QByteArray("")); QCOMPARE(clipboard->text(), QString("Password")); + // Username + Utils::Test::setNextPassword("a"); + clipCmd.execute({"clip", m_dbFile->fileName(), "/Sample Entry", "-a", "username"}); + QCOMPARE(clipboard->text(), QString("User Name")); + // TOTP Utils::Test::setNextPassword("a"); clipCmd.execute({"clip", m_dbFile->fileName(), "/Sample Entry", "--totp"}); @@ -538,6 +543,20 @@ void TestCli::testClip() clipCmd.execute({"clip", m_dbFile2->fileName(), "--totp", "/Sample Entry"}); m_stderrFile->seek(posErr); QCOMPARE(m_stderrFile->readAll(), QByteArray("Entry with path /Sample Entry has no TOTP set up.\n")); + + posErr = m_stderrFile->pos(); + Utils::Test::setNextPassword("a"); + clipCmd.execute({"clip", m_dbFile->fileName(), "-a", "TESTAttribute1", "/Sample Entry"}); + m_stderrFile->seek(posErr); + QCOMPARE( + m_stderrFile->readAll(), + QByteArray("ERROR: attribute TESTAttribute1 is ambiguous, it matches TestAttribute1 and testattribute1.\n")); + + posErr = m_stderrFile->pos(); + Utils::Test::setNextPassword("a"); + clipCmd.execute({"clip", m_dbFile2->fileName(), "--attribute", "Username", "--totp", "/Sample Entry"}); + m_stderrFile->seek(posErr); + QCOMPARE(m_stderrFile->readAll(), QByteArray("ERROR: Please specify one of --attribute or --totp, not both.\n")); } void TestCli::testCreate() @@ -1913,6 +1932,16 @@ void TestCli::testShow() QByteArray("Sample Entry\n" "http://www.somesite.com/\n")); + // Test case insensitivity + pos = m_stdoutFile->pos(); + Utils::Test::setNextPassword("a"); + showCmd.execute({"show", "-a", "TITLE", "-a", "URL", m_dbFile->fileName(), "/Sample Entry"}); + m_stdoutFile->seek(pos); + m_stdoutFile->readLine(); // skip password prompt + QCOMPARE(m_stdoutFile->readAll(), + QByteArray("Sample Entry\n" + "http://www.somesite.com/\n")); + pos = m_stdoutFile->pos(); Utils::Test::setNextPassword("a"); showCmd.execute({"show", "-a", "DoesNotExist", m_dbFile->fileName(), "/Sample Entry"}); @@ -1946,6 +1975,19 @@ void TestCli::testShow() m_stderrFile->seek(posErr); QCOMPARE(m_stdoutFile->readAll(), QByteArray("")); QCOMPARE(m_stderrFile->readAll(), QByteArray("Entry with path /Sample Entry has no TOTP set up.\n")); + + // Show with ambiguous attributes + pos = m_stdoutFile->pos(); + posErr = m_stderrFile->pos(); + Utils::Test::setNextPassword("a"); + showCmd.execute({"show", m_dbFile->fileName(), "-a", "Testattribute1", "/Sample Entry"}); + m_stdoutFile->seek(pos); + m_stdoutFile->readLine(); // skip password prompt + m_stderrFile->seek(posErr); + QCOMPARE(m_stdoutFile->readAll(), QByteArray("")); + QCOMPARE( + m_stderrFile->readAll(), + QByteArray("ERROR: attribute Testattribute1 is ambiguous, it matches TestAttribute1 and testattribute1.\n")); } void TestCli::testInvalidDbFiles() diff --git a/tests/data/NewDatabase.kdbx b/tests/data/NewDatabase.kdbx index 3008cce7c9fcb53524f2bd500afd2615b7bb1afc..a6d6adb1707f66cae69a44f51c092070d50a7e71 100644 GIT binary patch literal 20334 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 o8nvVbWIxlby6`N-@OaK4?