From 726bbb2d942112663eef304577abef04a0dfc37c Mon Sep 17 00:00:00 2001 From: louib Date: Wed, 16 Jan 2019 12:32:06 -0500 Subject: [PATCH] We should output to stderr on EXIT_FAILURE (#2558) Making sure we use stderr to output the help message when there is an invalid number of arguments, or when there's any error related to the arguments. --- src/cli/Add.cpp | 2 +- src/cli/Clip.cpp | 12 ++++++------ src/cli/Diceware.cpp | 10 +++++----- src/cli/Edit.cpp | 19 +++++++++---------- src/cli/Estimate.cpp | 8 ++++---- src/cli/Extract.cpp | 22 +++++++++++----------- src/cli/Generate.cpp | 10 +++++----- src/cli/List.cpp | 14 +++++++------- src/cli/Locate.cpp | 12 ++++++------ src/cli/Merge.cpp | 14 +++++++------- src/cli/Remove.cpp | 16 ++++++++-------- src/cli/Show.cpp | 23 +++++++++++------------ 12 files changed, 80 insertions(+), 82 deletions(-) diff --git a/src/cli/Add.cpp b/src/cli/Add.cpp index 3eb3b1bfc..dd9d0b50c 100644 --- a/src/cli/Add.cpp +++ b/src/cli/Add.cpp @@ -83,7 +83,7 @@ int Add::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 2) { - outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli add"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli add"); return EXIT_FAILURE; } diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp index 0cec5b3ce..25aea06e1 100644 --- a/src/cli/Clip.cpp +++ b/src/cli/Clip.cpp @@ -42,7 +42,7 @@ Clip::~Clip() int Clip::execute(const QStringList& arguments) { - TextStream out(Utils::STDOUT); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -62,7 +62,7 @@ int Clip::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 2 && args.size() != 3) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli clip"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli clip"); return EXIT_FAILURE; } @@ -83,11 +83,11 @@ int Clip::clipEntry(QSharedPointer database, bool clipTotp, bool silent) { - TextStream err(Utils::STDERR); + TextStream errorTextStream(Utils::STDERR); int timeoutSeconds = 0; if (!timeout.isEmpty() && !timeout.toInt()) { - err << QObject::tr("Invalid timeout value %1.").arg(timeout) << endl; + errorTextStream << QObject::tr("Invalid timeout value %1.").arg(timeout) << endl; return EXIT_FAILURE; } else if (!timeout.isEmpty()) { timeoutSeconds = timeout.toInt(); @@ -96,14 +96,14 @@ int Clip::clipEntry(QSharedPointer database, TextStream outputTextStream(silent ? Utils::DEVNULL : Utils::STDOUT, QIODevice::WriteOnly); Entry* entry = database->rootGroup()->findEntryByPath(entryPath); if (!entry) { - err << QObject::tr("Entry %1 not found.").arg(entryPath) << endl; + errorTextStream << QObject::tr("Entry %1 not found.").arg(entryPath) << endl; return EXIT_FAILURE; } QString value; if (clipTotp) { if (!entry->hasTotp()) { - err << QObject::tr("Entry with path %1 has no TOTP set up.").arg(entryPath) << endl; + errorTextStream << QObject::tr("Entry with path %1 has no TOTP set up.").arg(entryPath) << endl; return EXIT_FAILURE; } diff --git a/src/cli/Diceware.cpp b/src/cli/Diceware.cpp index be1ac084f..f11347344 100644 --- a/src/cli/Diceware.cpp +++ b/src/cli/Diceware.cpp @@ -38,8 +38,8 @@ Diceware::~Diceware() int Diceware::execute(const QStringList& arguments) { - TextStream in(Utils::STDIN, QIODevice::ReadOnly); - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); + TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -58,7 +58,7 @@ int Diceware::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (!args.isEmpty()) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli diceware"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli diceware"); return EXIT_FAILURE; } @@ -78,12 +78,12 @@ int Diceware::execute(const QStringList& arguments) } if (!dicewareGenerator.isValid()) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli diceware"); + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli diceware"); return EXIT_FAILURE; } QString password = dicewareGenerator.generatePassphrase(); - out << password << endl; + outputTextStream << password << endl; return EXIT_SUCCESS; } diff --git a/src/cli/Edit.cpp b/src/cli/Edit.cpp index 48ea5d739..7954648ce 100644 --- a/src/cli/Edit.cpp +++ b/src/cli/Edit.cpp @@ -41,9 +41,8 @@ Edit::~Edit() int Edit::execute(const QStringList& arguments) { - TextStream in(Utils::STDIN, QIODevice::ReadOnly); - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); - TextStream err(Utils::STDERR, QIODevice::WriteOnly); + TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -88,7 +87,7 @@ int Edit::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 2) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli edit"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli edit"); return EXIT_FAILURE; } @@ -105,19 +104,19 @@ int Edit::execute(const QStringList& arguments) QString passwordLength = parser.value(length); if (!passwordLength.isEmpty() && !passwordLength.toInt()) { - err << QObject::tr("Invalid value for password length: %1").arg(passwordLength) << endl; + errorTextStream << QObject::tr("Invalid value for password length: %1").arg(passwordLength) << endl; return EXIT_FAILURE; } Entry* entry = db->rootGroup()->findEntryByPath(entryPath); if (!entry) { - err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl; + errorTextStream << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl; return EXIT_FAILURE; } if (parser.value("username").isEmpty() && parser.value("url").isEmpty() && parser.value("title").isEmpty() && !parser.isSet(prompt) && !parser.isSet(generate)) { - err << QObject::tr("Not changing any field for entry %1.").arg(entryPath) << endl; + errorTextStream << QObject::tr("Not changing any field for entry %1.").arg(entryPath) << endl; return EXIT_FAILURE; } @@ -137,7 +136,7 @@ int Edit::execute(const QStringList& arguments) if (parser.isSet(prompt)) { if (!parser.isSet(Command::QuietOption)) { - out << QObject::tr("Enter new password for entry: ") << flush; + outputTextStream << QObject::tr("Enter new password for entry: ") << flush; } QString password = Utils::getPassword(parser.isSet(Command::QuietOption) ? Utils::DEVNULL : Utils::STDOUT); entry->setPassword(password); @@ -160,12 +159,12 @@ int Edit::execute(const QStringList& arguments) QString errorMessage; if (!db->save(databasePath, &errorMessage, true, false)) { - err << QObject::tr("Writing the database failed: %1").arg(errorMessage) << endl; + errorTextStream << QObject::tr("Writing the database failed: %1").arg(errorMessage) << endl; return EXIT_FAILURE; } if (!parser.isSet(Command::QuietOption)) { - out << QObject::tr("Successfully edited entry %1.").arg(entry->title()) << endl; + outputTextStream << QObject::tr("Successfully edited entry %1.").arg(entry->title()) << endl; } return EXIT_SUCCESS; } diff --git a/src/cli/Estimate.cpp b/src/cli/Estimate.cpp index 556ff4435..7064963f4 100644 --- a/src/cli/Estimate.cpp +++ b/src/cli/Estimate.cpp @@ -156,8 +156,8 @@ static void estimate(const char* pwd, bool advanced) int Estimate::execute(const QStringList& arguments) { - TextStream in(Utils::STDIN, QIODevice::ReadOnly); - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); + TextStream inputTextStream(Utils::STDIN, QIODevice::ReadOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -171,7 +171,7 @@ int Estimate::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() > 1) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli estimate"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli estimate"); return EXIT_FAILURE; } @@ -179,7 +179,7 @@ int Estimate::execute(const QStringList& arguments) if (args.size() == 1) { password = args.at(0); } else { - password = in.readLine(); + password = inputTextStream.readLine(); } estimate(password.toLatin1(), parser.isSet(advancedOption)); diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index 0b20b9528..d7099cd52 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -43,8 +43,8 @@ Extract::~Extract() int Extract::execute(const QStringList& arguments) { - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); - TextStream err(Utils::STDERR, QIODevice::WriteOnly); + TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -56,12 +56,12 @@ int Extract::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 1) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli extract"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli extract"); return EXIT_FAILURE; } if (!parser.isSet(Command::QuietOption)) { - out << QObject::tr("Insert password to unlock %1: ").arg(args.at(0)) << flush; + outputTextStream << QObject::tr("Insert password to unlock %1: ").arg(args.at(0)) << flush; } auto compositeKey = QSharedPointer::create(); @@ -77,12 +77,12 @@ int Extract::execute(const QStringList& arguments) auto fileKey = QSharedPointer::create(); QString errorMsg; if (!fileKey->load(keyFilePath, &errorMsg)) { - err << QObject::tr("Failed to load key file %1: %2").arg(keyFilePath, errorMsg) << endl; + errorTextStream << QObject::tr("Failed to load key file %1: %2").arg(keyFilePath, errorMsg) << endl; return EXIT_FAILURE; } if (fileKey->type() != FileKey::Hashed) { - err << QObject::tr("WARNING: You are using a legacy key file format which may become\n" + errorTextStream << QObject::tr("WARNING: You are using a legacy key file format which may become\n" "unsupported in the future.\n\n" "Please consider generating a new key file.") << endl; @@ -95,11 +95,11 @@ int Extract::execute(const QStringList& arguments) const QString& databaseFilename = args.at(0); QFile dbFile(databaseFilename); if (!dbFile.exists()) { - err << QObject::tr("File %1 does not exist.").arg(databaseFilename) << endl; + errorTextStream << QObject::tr("File %1 does not exist.").arg(databaseFilename) << endl; return EXIT_FAILURE; } if (!dbFile.open(QIODevice::ReadOnly)) { - err << QObject::tr("Unable to open file %1.").arg(databaseFilename) << endl; + errorTextStream << QObject::tr("Unable to open file %1.").arg(databaseFilename) << endl; return EXIT_FAILURE; } @@ -112,14 +112,14 @@ int Extract::execute(const QStringList& arguments) if (reader.hasError()) { if (xmlData.isEmpty()) { - err << QObject::tr("Error while reading the database:\n%1").arg(reader.errorString()) << endl; + errorTextStream << QObject::tr("Error while reading the database:\n%1").arg(reader.errorString()) << endl; } else { - err << QObject::tr("Error while parsing the database:\n%1").arg(reader.errorString()) << endl; + errorTextStream << QObject::tr("Error while parsing the database:\n%1").arg(reader.errorString()) << endl; } return EXIT_FAILURE; } - out << xmlData.constData() << endl; + outputTextStream << xmlData.constData() << endl; return EXIT_SUCCESS; } diff --git a/src/cli/Generate.cpp b/src/cli/Generate.cpp index adbfc0cc0..5f0ad98ac 100644 --- a/src/cli/Generate.cpp +++ b/src/cli/Generate.cpp @@ -38,8 +38,8 @@ Generate::~Generate() int Generate::execute(const QStringList& arguments) { - TextStream in(Utils::STDIN, QIODevice::ReadOnly); - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); + TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -84,7 +84,7 @@ int Generate::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (!args.isEmpty()) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli generate"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli generate"); return EXIT_FAILURE; } @@ -128,12 +128,12 @@ int Generate::execute(const QStringList& arguments) passwordGenerator.setExcludedChars(parser.value(exclude)); if (!passwordGenerator.isValid()) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli generate"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli generate"); return EXIT_FAILURE; } QString password = passwordGenerator.generatePassword(); - out << password << endl; + outputTextStream << password << endl; return EXIT_SUCCESS; } diff --git a/src/cli/List.cpp b/src/cli/List.cpp index 9c4f733ef..11650d405 100644 --- a/src/cli/List.cpp +++ b/src/cli/List.cpp @@ -40,7 +40,7 @@ List::~List() int List::execute(const QStringList& arguments) { - TextStream out(Utils::STDOUT); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -58,7 +58,7 @@ int List::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 1 && args.size() != 2) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli ls"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli ls"); return EXIT_FAILURE; } @@ -80,20 +80,20 @@ int List::execute(const QStringList& arguments) int List::listGroup(Database* database, bool recursive, const QString& groupPath) { - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); - TextStream err(Utils::STDERR, QIODevice::WriteOnly); + TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); if (groupPath.isEmpty()) { - out << database->rootGroup()->print(recursive) << flush; + outputTextStream << database->rootGroup()->print(recursive) << flush; return EXIT_SUCCESS; } Group* group = database->rootGroup()->findGroupByPath(groupPath); if (!group) { - err << QObject::tr("Cannot find group %1.").arg(groupPath) << endl; + errorTextStream << QObject::tr("Cannot find group %1.").arg(groupPath) << endl; return EXIT_FAILURE; } - out << group->print(recursive) << flush; + outputTextStream << group->print(recursive) << flush; return EXIT_SUCCESS; } diff --git a/src/cli/Locate.cpp b/src/cli/Locate.cpp index e348df117..f25ce79af 100644 --- a/src/cli/Locate.cpp +++ b/src/cli/Locate.cpp @@ -42,7 +42,7 @@ Locate::~Locate() int Locate::execute(const QStringList& arguments) { - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -55,7 +55,7 @@ int Locate::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 2) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli locate"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli locate"); return EXIT_FAILURE; } @@ -72,17 +72,17 @@ int Locate::execute(const QStringList& arguments) int Locate::locateEntry(Database* database, const QString& searchTerm) { - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); - TextStream err(Utils::STDERR, QIODevice::WriteOnly); + TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QStringList results = database->rootGroup()->locate(searchTerm); if (results.isEmpty()) { - err << "No results for that search term." << endl; + errorTextStream << "No results for that search term." << endl; return EXIT_FAILURE; } for (const QString& result : asConst(results)) { - out << result << endl; + outputTextStream << result << endl; } return EXIT_SUCCESS; } diff --git a/src/cli/Merge.cpp b/src/cli/Merge.cpp index c4759fe40..39dcf21fa 100644 --- a/src/cli/Merge.cpp +++ b/src/cli/Merge.cpp @@ -38,8 +38,8 @@ Merge::~Merge() int Merge::execute(const QStringList& arguments) { - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); - TextStream err(Utils::STDERR, QIODevice::WriteOnly); + TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -64,7 +64,7 @@ int Merge::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 2) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli merge"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli merge"); return EXIT_FAILURE; } @@ -83,7 +83,7 @@ int Merge::execute(const QStringList& arguments) db2 = QSharedPointer::create(); QString errorMessage; if (!db2->open(args.at(1), db1->key(), &errorMessage, false)) { - err << QObject::tr("Error reading merge file:\n%1").arg(errorMessage); + errorTextStream << QObject::tr("Error reading merge file:\n%1").arg(errorMessage); return EXIT_FAILURE; } } @@ -94,14 +94,14 @@ int Merge::execute(const QStringList& arguments) if (databaseChanged) { QString errorMessage; if (!db1->save(args.at(0), &errorMessage, true, false)) { - err << QObject::tr("Unable to save database to file : %1").arg(errorMessage) << endl; + errorTextStream << QObject::tr("Unable to save database to file : %1").arg(errorMessage) << endl; return EXIT_FAILURE; } if (!parser.isSet(Command::QuietOption)) { - out << "Successfully merged the database files." << endl; + outputTextStream << "Successfully merged the database files." << endl; } } else if (!parser.isSet(Command::QuietOption)) { - out << "Database was not modified by merge operation." << endl; + outputTextStream << "Database was not modified by merge operation." << endl; } return EXIT_SUCCESS; diff --git a/src/cli/Remove.cpp b/src/cli/Remove.cpp index cd6275b77..a1cda2e2d 100644 --- a/src/cli/Remove.cpp +++ b/src/cli/Remove.cpp @@ -44,7 +44,7 @@ Remove::~Remove() int Remove::execute(const QStringList& arguments) { - TextStream out(Utils::STDERR, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(QCoreApplication::tr("main", "Remove an entry from the database.")); @@ -57,7 +57,7 @@ int Remove::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 2) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli rm"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli rm"); return EXIT_FAILURE; } @@ -74,12 +74,12 @@ int Remove::execute(const QStringList& arguments) int Remove::removeEntry(Database* database, const QString& databasePath, const QString& entryPath, bool quiet) { - TextStream out(quiet ? Utils::DEVNULL : Utils::STDOUT, QIODevice::WriteOnly); - TextStream err(Utils::STDERR, QIODevice::WriteOnly); + TextStream outputTextStream(quiet ? Utils::DEVNULL : Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QPointer entry = database->rootGroup()->findEntryByPath(entryPath); if (!entry) { - err << QObject::tr("Entry %1 not found.").arg(entryPath) << endl; + errorTextStream << QObject::tr("Entry %1 not found.").arg(entryPath) << endl; return EXIT_FAILURE; } @@ -95,14 +95,14 @@ int Remove::removeEntry(Database* database, const QString& databasePath, const Q QString errorMessage; if (!database->save(databasePath, &errorMessage, true, false)) { - err << QObject::tr("Unable to save database to file: %1").arg(errorMessage) << endl; + errorTextStream << QObject::tr("Unable to save database to file: %1").arg(errorMessage) << endl; return EXIT_FAILURE; } if (recycled) { - out << QObject::tr("Successfully recycled entry %1.").arg(entryTitle) << endl; + outputTextStream << QObject::tr("Successfully recycled entry %1.").arg(entryTitle) << endl; } else { - out << QObject::tr("Successfully deleted entry %1.").arg(entryTitle) << endl; + outputTextStream << QObject::tr("Successfully deleted entry %1.").arg(entryTitle) << endl; } return EXIT_SUCCESS; diff --git a/src/cli/Show.cpp b/src/cli/Show.cpp index d8cf5a4fe..9ae3f4d0f 100644 --- a/src/cli/Show.cpp +++ b/src/cli/Show.cpp @@ -41,7 +41,7 @@ Show::~Show() int Show::execute(const QStringList& arguments) { - TextStream out(Utils::STDOUT); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); QCommandLineParser parser; parser.setApplicationDescription(description); @@ -67,7 +67,7 @@ int Show::execute(const QStringList& arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 2) { - out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli show"); + errorTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli show"); return EXIT_FAILURE; } @@ -84,18 +84,17 @@ int Show::execute(const QStringList& arguments) int Show::showEntry(Database* database, QStringList attributes, bool showTotp, const QString& entryPath) { - TextStream in(Utils::STDIN, QIODevice::ReadOnly); - TextStream out(Utils::STDOUT, QIODevice::WriteOnly); - TextStream err(Utils::STDERR, QIODevice::WriteOnly); + TextStream outputTextStream(Utils::STDOUT, QIODevice::WriteOnly); + TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly); Entry* entry = database->rootGroup()->findEntryByPath(entryPath); if (!entry) { - err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl; + errorTextStream << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl; return EXIT_FAILURE; } if (showTotp && !entry->hasTotp()) { - err << QObject::tr("Entry with path %1 has no TOTP set up.").arg(entryPath) << endl; + errorTextStream << QObject::tr("Entry with path %1 has no TOTP set up.").arg(entryPath) << endl; return EXIT_FAILURE; } @@ -110,20 +109,20 @@ int Show::showEntry(Database* database, QStringList attributes, bool showTotp, c for (const QString& attribute : asConst(attributes)) { if (!entry->attributes()->contains(attribute)) { sawUnknownAttribute = true; - err << QObject::tr("ERROR: unknown attribute %1.").arg(attribute) << endl; + errorTextStream << QObject::tr("ERROR: unknown attribute %1.").arg(attribute) << endl; continue; } if (showAttributeNames) { - out << attribute << ": "; + outputTextStream << attribute << ": "; } - out << entry->resolveMultiplePlaceholders(entry->attributes()->value(attribute)) << endl; + outputTextStream << entry->resolveMultiplePlaceholders(entry->attributes()->value(attribute)) << endl; } if (showTotp) { if (showAttributeNames) { - out << "TOTP: "; + outputTextStream << "TOTP: "; } - out << entry->totp() << endl; + outputTextStream << entry->totp() << endl; } return sawUnknownAttribute ? EXIT_FAILURE : EXIT_SUCCESS;