diff options
Diffstat (limited to 'src/cli/Clip.cpp')
-rw-r--r-- | src/cli/Clip.cpp | 96 |
1 files changed, 64 insertions, 32 deletions
diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp index 70d97c0e2..886f8ecc7 100644 --- a/src/cli/Clip.cpp +++ b/src/cli/Clip.cpp @@ -15,68 +15,100 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <chrono> #include <cstdlib> #include <stdio.h> +#include <thread> #include "Clip.h" -#include <QApplication> -#include <QClipboard> #include <QCommandLineParser> -#include <QStringList> #include <QTextStream> -#include "gui/UnlockDatabaseDialog.h" +#include "cli/Utils.h" #include "core/Database.h" #include "core/Entry.h" #include "core/Group.h" -#include "gui/Clipboard.h" -int Clip::execute(int argc, char** argv) +Clip::Clip() +{ + name = QString("clip"); + description = QObject::tr("Copy an entry's password to the clipboard."); +} + +Clip::~Clip() +{ +} + +int Clip::execute(const QStringList& arguments) { - QStringList arguments; - for (int i = 0; i < argc; ++i) { - arguments << QString(argv[i]); - } QTextStream out(stdout); QCommandLineParser parser; - parser.setApplicationDescription(QCoreApplication::translate("main", "Copy a password to the clipboard")); - parser.addPositionalArgument("database", QCoreApplication::translate("main", "Path of the database.")); - QCommandLineOption guiPrompt( - QStringList() << "g" - << "gui-prompt", - QCoreApplication::translate("main", "Use a GUI prompt unlocking the database.")); - parser.addOption(guiPrompt); - parser.addPositionalArgument("entry", QCoreApplication::translate("main", "Name of the entry to clip.")); + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("database", QObject::tr("Path of the database.")); + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); + parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.", "clip = copy to clipboard")); + parser.addPositionalArgument( + "timeout", QObject::tr("Timeout in seconds before clearing the clipboard."), QString("[timeout]")); parser.process(arguments); const QStringList args = parser.positionalArguments(); - if (args.size() != 2) { - QCoreApplication app(argc, argv); - parser.showHelp(EXIT_FAILURE); + if (args.size() != 2 && args.size() != 3) { + out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli clip"); + return EXIT_FAILURE; } - Database* db = nullptr; - QApplication app(argc, argv); - if (parser.isSet("gui-prompt")) { - db = UnlockDatabaseDialog::openDatabasePrompt(args.at(0)); - } else { - db = Database::unlockFromStdin(args.at(0)); + Database* db = Database::unlockFromStdin(args.at(0), parser.value(keyFile)); + if (!db) { + return EXIT_FAILURE; } - if (!db) { + return this->clipEntry(db, args.at(1), args.value(2)); +} + +int Clip::clipEntry(Database* database, QString entryPath, QString timeout) +{ + + int timeoutSeconds = 0; + if (!timeout.isEmpty() && !timeout.toInt()) { + qCritical("Invalid timeout value %s.", qPrintable(timeout)); return EXIT_FAILURE; + } else if (!timeout.isEmpty()) { + timeoutSeconds = timeout.toInt(); } - QString entryId = args.at(1); - Entry* entry = db->rootGroup()->findEntry(entryId); + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + Entry* entry = database->rootGroup()->findEntry(entryPath); if (!entry) { - qCritical("Entry %s not found.", qPrintable(entryId)); + qCritical("Entry %s not found.", qPrintable(entryPath)); return EXIT_FAILURE; } - Clipboard::instance()->setText(entry->password()); + int exitCode = Utils::clipText(entry->password()); + if (exitCode != EXIT_SUCCESS) { + return exitCode; + } + + outputTextStream << "Entry's password copied to the clipboard!" << endl; + + if (!timeoutSeconds) { + return exitCode; + } + + while (timeoutSeconds > 0) { + outputTextStream << "\rClearing the clipboard in " << timeoutSeconds << " seconds..."; + outputTextStream.flush(); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + timeoutSeconds--; + } + Utils::clipText(""); + outputTextStream << "\nClipboard cleared!" << endl; + return EXIT_SUCCESS; } |