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 d7ab9cdd7..d1360cd65 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 482ad8a13..ccb7c0e53 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 b171c8689..291e63295 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 f7bf8d54b..12b2a835f 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 9988b60f9..88d70466b 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 b7fa63acf..d96e260c4 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 bc96de974..efaff1831 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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 Re=GOn%~jn6yKMhW0sxLNVyFNB literal 15006 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