diff options
author | louib <code@louib.net> | 2022-08-21 05:38:58 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-21 05:38:58 +0300 |
commit | 15b9e82f93971a1cd2f63f3b21eafcf3601ec70c (patch) | |
tree | 9b809e8c1cc3564fa346472a2e4568bf40aaf7d2 | |
parent | aa839e2619a3e5b035669a58d2335f8826b048ee (diff) |
[CLI] Add Option to show all attributes (Show command) (#8256)
* Adding --all option to Show
-rw-r--r-- | docs/man/keepassxc-cli.1.adoc | 5 | ||||
-rw-r--r-- | share/translations/keepassxc_en.ts | 4 | ||||
-rw-r--r-- | src/cli/Show.cpp | 32 | ||||
-rw-r--r-- | src/cli/Show.h | 1 | ||||
-rw-r--r-- | tests/TestCli.cpp | 15 |
5 files changed, 50 insertions, 7 deletions
diff --git a/docs/man/keepassxc-cli.1.adoc b/docs/man/keepassxc-cli.1.adoc index c891e2d8b..8ae0f4693 100644 --- a/docs/man/keepassxc-cli.1.adoc +++ b/docs/man/keepassxc-cli.1.adoc @@ -16,7 +16,7 @@ = keepassxc-cli(1) KeePassXC Team <team@keepassxc.org> -:docdate: 2020-08-31 +:docdate: 2022-08-20 :doctype: manpage :mansource: KeePassXC {revnumber} :manmanual: General Commands Manual @@ -252,6 +252,9 @@ The same password generation options as documented for the generate command can If no attributes are specified and *-t* is not specified, a summary of the default attributes is given. Protected attributes will be displayed in clear text if specified explicitly by this option. +*--all*:: + Show all the attributes of the entry. + *-s*, *--show-protected*:: Shows the protected attributes in clear text. diff --git a/share/translations/keepassxc_en.ts b/share/translations/keepassxc_en.ts index 06cfd3ecb..edba1690f 100644 --- a/share/translations/keepassxc_en.ts +++ b/share/translations/keepassxc_en.ts @@ -7812,6 +7812,10 @@ Kernel: %3 %4</source> <source>Please present or touch your YubiKey to continue.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Show all the attributes of the entry.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>QtIOCompressor</name> diff --git a/src/cli/Show.cpp b/src/cli/Show.cpp index 8ffd5614d..c8cb430ed 100644 --- a/src/cli/Show.cpp +++ b/src/cli/Show.cpp @@ -32,6 +32,9 @@ const QCommandLineOption Show::ProtectedAttributesOption = << "show-protected", QObject::tr("Show the protected attributes in clear text.")); +const QCommandLineOption Show::AllAttributesOption = + QCommandLineOption(QStringList() << "all", QObject::tr("Show all the attributes of the entry.")); + const QCommandLineOption Show::AttachmentsOption = QCommandLineOption(QStringList() << "show-attachments", QObject::tr("Show the attachments of the entry.")); @@ -51,6 +54,7 @@ Show::Show() options.append(Show::TotpOption); options.append(Show::AttributesOption); options.append(Show::ProtectedAttributesOption); + options.append(Show::AllAttributesOption); options.append(Show::AttachmentsOption); positionalArguments.append({QString("entry"), QObject::tr("Name of the entry to show."), QString("")}); } @@ -64,6 +68,7 @@ int Show::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer< const QString& entryPath = args.at(1); bool showTotp = parser->isSet(Show::TotpOption); bool showProtectedAttributes = parser->isSet(Show::ProtectedAttributesOption); + bool showAllAttributes = parser->isSet(Show::AllAttributesOption); QStringList attributes = parser->values(Show::AttributesOption); Entry* entry = database->rootGroup()->findEntryByPath(entryPath); @@ -77,9 +82,24 @@ int Show::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer< return EXIT_FAILURE; } - // If no attributes specified, output the default attribute set. - bool showDefaultAttributes = attributes.isEmpty() && !showTotp; - if (showDefaultAttributes) { + bool attributesWereSpecified = true; + if (showAllAttributes) { + attributesWereSpecified = false; + attributes = EntryAttributes::DefaultAttributes; + for (QString fieldName : Utils::EntryFieldNames) { + attributes.append(fieldName); + } + // Adding the custom attributes after the default attributes so that + // the default attributes are always shown first. + for (QString attributeName : entry->attributes()->keys()) { + if (EntryAttributes::DefaultAttributes.contains(attributeName)) { + continue; + } + attributes.append(attributeName); + } + } else if (attributes.isEmpty() && !showTotp) { + // If no attributes are specified, output the default attribute set. + attributesWereSpecified = false; attributes = EntryAttributes::DefaultAttributes; for (QString fieldName : Utils::EntryFieldNames) { attributes.append(fieldName); @@ -90,7 +110,7 @@ int Show::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer< bool encounteredError = false; for (const QString& attributeName : asConst(attributes)) { if (Utils::EntryFieldNames.contains(attributeName)) { - if (showDefaultAttributes) { + if (!attributesWereSpecified) { out << attributeName << ": "; } out << Utils::getTopLevelField(entry, attributeName) << endl; @@ -110,10 +130,10 @@ int Show::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer< continue; } QString canonicalName = attrs[0]; - if (showDefaultAttributes) { + if (!attributesWereSpecified) { out << canonicalName << ": "; } - if (entry->attributes()->isProtected(canonicalName) && showDefaultAttributes && !showProtectedAttributes) { + if (entry->attributes()->isProtected(canonicalName) && !attributesWereSpecified && !showProtectedAttributes) { out << "PROTECTED" << endl; } else { out << entry->resolveMultiplePlaceholders(entry->attributes()->value(canonicalName)) << endl; diff --git a/src/cli/Show.h b/src/cli/Show.h index 98f8b3cbc..ca00a815f 100644 --- a/src/cli/Show.h +++ b/src/cli/Show.h @@ -28,6 +28,7 @@ public: int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override; static const QCommandLineOption TotpOption; + static const QCommandLineOption AllAttributesOption; static const QCommandLineOption AttributesOption; static const QCommandLineOption ProtectedAttributesOption; static const QCommandLineOption AttachmentsOption; diff --git a/tests/TestCli.cpp b/tests/TestCli.cpp index 091c7a3ef..14012cdcd 100644 --- a/tests/TestCli.cpp +++ b/tests/TestCli.cpp @@ -2049,6 +2049,21 @@ void TestCli::testShow() execCmd(showCmd, {"show", m_dbFile->fileName(), "-a", "Testattribute1", "/Sample Entry"}); QCOMPARE(m_stdout->readAll(), QByteArray()); QVERIFY(m_stderr->readAll().contains("ERROR: attribute Testattribute1 is ambiguous")); + + setInput("a"); + execCmd(showCmd, {"show", "--all", m_dbFile->fileName(), "/Sample Entry"}); + QCOMPARE(m_stdout->readAll(), + QByteArray("Title: Sample Entry\n" + "UserName: User Name\n" + "Password: PROTECTED\n" + "URL: http://www.somesite.com/\n" + "Notes: Notes\n" + "Uuid: {9f4544c2-ab00-c74a-8a1a-6eaf26cf57e9}\n" + "Tags: \n" + "TOTP Seed: PROTECTED\n" + "TOTP Settings: 30;6\n" + "TestAttribute1: b\n" + "testattribute1: a\n")); } void TestCli::testInvalidDbFiles() |