Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli/Command.cpp')
-rw-r--r--src/cli/Command.cpp300
1 files changed, 197 insertions, 103 deletions
diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp
index e64dd4aaa..4d3bf8270 100644
--- a/src/cli/Command.cpp
+++ b/src/cli/Command.cpp
@@ -1,103 +1,197 @@
-/*
- * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 or (at your option)
- * version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <cstdlib>
-#include <stdio.h>
-
-#include <QMap>
-
-#include "Command.h"
-
-#include "Add.h"
-#include "Clip.h"
-#include "Create.h"
-#include "Diceware.h"
-#include "Edit.h"
-#include "Estimate.h"
-#include "Extract.h"
-#include "Generate.h"
-#include "List.h"
-#include "Locate.h"
-#include "Merge.h"
-#include "Remove.h"
-#include "Show.h"
-
-const QCommandLineOption Command::QuietOption =
- QCommandLineOption(QStringList() << "q"
- << "quiet",
- QObject::tr("Silence password prompt and other secondary outputs."));
-
-const QCommandLineOption Command::KeyFileOption = QCommandLineOption(QStringList() << "k"
- << "key-file",
- QObject::tr("Key file of the database."),
- QObject::tr("path"));
-
-const QCommandLineOption Command::NoPasswordOption =
- QCommandLineOption(QStringList() << "no-password",
- QObject::tr("Deactivate password key for the database."));
-
-QMap<QString, Command*> commands;
-
-Command::~Command()
-{
-}
-
-QString Command::getDescriptionLine()
-{
-
- QString response = name;
- QString space(" ");
- QString spaces = space.repeated(15 - name.length());
- response = response.append(spaces);
- response = response.append(description);
- response = response.append("\n");
- return response;
-}
-
-void populateCommands()
-{
- if (commands.isEmpty()) {
- commands.insert(QString("add"), new Add());
- commands.insert(QString("clip"), new Clip());
- commands.insert(QString("create"), new Create());
- commands.insert(QString("diceware"), new Diceware());
- commands.insert(QString("edit"), new Edit());
- commands.insert(QString("estimate"), new Estimate());
- commands.insert(QString("extract"), new Extract());
- commands.insert(QString("generate"), new Generate());
- commands.insert(QString("locate"), new Locate());
- commands.insert(QString("ls"), new List());
- commands.insert(QString("merge"), new Merge());
- commands.insert(QString("rm"), new Remove());
- commands.insert(QString("show"), new Show());
- }
-}
-
-Command* Command::getCommand(const QString& commandName)
-{
- populateCommands();
- if (commands.contains(commandName)) {
- return commands[commandName];
- }
- return nullptr;
-}
-
-QList<Command*> Command::getCommands()
-{
- populateCommands();
- return commands.values();
-}
+/*
+ * Copyright (C) 2019 KeePassXC Team <team@keepassxc.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 or (at your option)
+ * version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <cstdio>
+#include <cstdlib>
+#include <utility>
+
+#include <QMap>
+
+#include "Command.h"
+
+#include "Add.h"
+#include "AddGroup.h"
+#include "Analyze.h"
+#include "Clip.h"
+#include "Close.h"
+#include "Create.h"
+#include "Diceware.h"
+#include "Edit.h"
+#include "Estimate.h"
+#include "Exit.h"
+#include "Export.h"
+#include "Generate.h"
+#include "Help.h"
+#include "Import.h"
+#include "List.h"
+#include "Locate.h"
+#include "Merge.h"
+#include "Move.h"
+#include "Open.h"
+#include "Remove.h"
+#include "RemoveGroup.h"
+#include "Show.h"
+#include "TextStream.h"
+#include "Utils.h"
+
+const QCommandLineOption Command::HelpOption = QCommandLineOption(QStringList()
+#ifdef Q_OS_WIN
+ << QStringLiteral("?")
+#endif
+ << QStringLiteral("h") << QStringLiteral("help"),
+ QObject::tr("Display this help."));
+
+const QCommandLineOption Command::QuietOption =
+ QCommandLineOption(QStringList() << "q"
+ << "quiet",
+ QObject::tr("Silence password prompt and other secondary outputs."));
+
+const QCommandLineOption Command::KeyFileOption = QCommandLineOption(QStringList() << "k"
+ << "key-file",
+ QObject::tr("Key file of the database."),
+ QObject::tr("path"));
+
+const QCommandLineOption Command::NoPasswordOption =
+ QCommandLineOption(QStringList() << "no-password", QObject::tr("Deactivate password key for the database."));
+
+const QCommandLineOption Command::YubiKeyOption =
+ QCommandLineOption(QStringList() << "y"
+ << "yubikey",
+ QObject::tr("Yubikey slot used to encrypt the database."),
+ QObject::tr("slot"));
+
+namespace
+{
+
+ QSharedPointer<QCommandLineParser> buildParser(Command* command)
+ {
+ auto parser = QSharedPointer<QCommandLineParser>(new QCommandLineParser());
+ parser->setApplicationDescription(command->description);
+ for (const CommandLineArgument& positionalArgument : command->positionalArguments) {
+ parser->addPositionalArgument(
+ positionalArgument.name, positionalArgument.description, positionalArgument.syntax);
+ }
+ for (const CommandLineArgument& optionalArgument : command->optionalArguments) {
+ parser->addPositionalArgument(optionalArgument.name, optionalArgument.description, optionalArgument.syntax);
+ }
+ for (const QCommandLineOption& option : command->options) {
+ parser->addOption(option);
+ }
+ parser->addOption(Command::HelpOption);
+ return parser;
+ }
+
+} // namespace
+
+Command::Command()
+ : currentDatabase(nullptr)
+{
+ options.append(Command::QuietOption);
+}
+
+Command::~Command()
+{
+}
+
+QString Command::getDescriptionLine()
+{
+ QString response = name;
+ QString space(" ");
+ QString spaces = space.repeated(15 - name.length());
+ response = response.append(spaces);
+ response = response.append(description);
+ response = response.append("\n");
+ return response;
+}
+
+QString Command::getHelpText()
+{
+ return buildParser(this)->helpText().replace("[options]", name + " [options]");
+}
+
+QSharedPointer<QCommandLineParser> Command::getCommandLineParser(const QStringList& arguments)
+{
+ TextStream errorTextStream(Utils::STDERR, QIODevice::WriteOnly);
+ QSharedPointer<QCommandLineParser> parser = buildParser(this);
+
+ if (!parser->parse(arguments)) {
+ errorTextStream << parser->errorText() << "\n\n";
+ errorTextStream << getHelpText();
+ return {};
+ }
+ if (parser->positionalArguments().size() < positionalArguments.size()) {
+ errorTextStream << getHelpText();
+ return {};
+ }
+ if (parser->positionalArguments().size() > (positionalArguments.size() + optionalArguments.size())) {
+ errorTextStream << getHelpText();
+ return {};
+ }
+ if (parser->isSet(HelpOption)) {
+ errorTextStream << getHelpText();
+ return {};
+ }
+ return parser;
+}
+
+namespace Commands
+{
+ QMap<QString, QSharedPointer<Command>> s_commands;
+
+ void setupCommands(bool interactive)
+ {
+ s_commands.clear();
+
+ s_commands.insert(QStringLiteral("add"), QSharedPointer<Command>(new Add()));
+ s_commands.insert(QStringLiteral("analyze"), QSharedPointer<Command>(new Analyze()));
+ s_commands.insert(QStringLiteral("clip"), QSharedPointer<Command>(new Clip()));
+ s_commands.insert(QStringLiteral("close"), QSharedPointer<Command>(new Close()));
+ s_commands.insert(QStringLiteral("create"), QSharedPointer<Command>(new Create()));
+ s_commands.insert(QStringLiteral("diceware"), QSharedPointer<Command>(new Diceware()));
+ s_commands.insert(QStringLiteral("edit"), QSharedPointer<Command>(new Edit()));
+ s_commands.insert(QStringLiteral("estimate"), QSharedPointer<Command>(new Estimate()));
+ s_commands.insert(QStringLiteral("generate"), QSharedPointer<Command>(new Generate()));
+ s_commands.insert(QStringLiteral("help"), QSharedPointer<Command>(new Help()));
+ s_commands.insert(QStringLiteral("locate"), QSharedPointer<Command>(new Locate()));
+ s_commands.insert(QStringLiteral("ls"), QSharedPointer<Command>(new List()));
+ s_commands.insert(QStringLiteral("merge"), QSharedPointer<Command>(new Merge()));
+ s_commands.insert(QStringLiteral("mkdir"), QSharedPointer<Command>(new AddGroup()));
+ s_commands.insert(QStringLiteral("mv"), QSharedPointer<Command>(new Move()));
+ s_commands.insert(QStringLiteral("open"), QSharedPointer<Command>(new Open()));
+ s_commands.insert(QStringLiteral("rm"), QSharedPointer<Command>(new Remove()));
+ s_commands.insert(QStringLiteral("rmdir"), QSharedPointer<Command>(new RemoveGroup()));
+ s_commands.insert(QStringLiteral("show"), QSharedPointer<Command>(new Show()));
+
+ if (interactive) {
+ s_commands.insert(QStringLiteral("exit"), QSharedPointer<Command>(new Exit("exit")));
+ s_commands.insert(QStringLiteral("quit"), QSharedPointer<Command>(new Exit("quit")));
+ } else {
+ s_commands.insert(QStringLiteral("export"), QSharedPointer<Command>(new Export()));
+ s_commands.insert(QStringLiteral("import"), QSharedPointer<Command>(new Import()));
+ }
+ }
+
+ QList<QSharedPointer<Command>> getCommands()
+ {
+ return s_commands.values();
+ }
+
+ QSharedPointer<Command> getCommand(const QString& commandName)
+ {
+ return s_commands.value(commandName);
+ }
+} // namespace Commands