diff options
Diffstat (limited to 'src/cli/Utils.cpp')
-rw-r--r-- | src/cli/Utils.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/cli/Utils.cpp b/src/cli/Utils.cpp new file mode 100644 index 000000000..35e7cce38 --- /dev/null +++ b/src/cli/Utils.cpp @@ -0,0 +1,122 @@ +/* + * 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 "Utils.h" + +#ifdef Q_OS_WIN +#include <windows.h> +#else +#include <termios.h> +#include <unistd.h> +#endif + +#include <QProcess> +#include <QTextStream> + +void Utils::setStdinEcho(bool enable = true) +{ +#ifdef Q_OS_WIN + HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); + DWORD mode; + GetConsoleMode(hIn, &mode); + + if (enable) { + mode |= ENABLE_ECHO_INPUT; + } else { + mode &= ~ENABLE_ECHO_INPUT; + } + + SetConsoleMode(hIn, mode); + +#else + struct termios t; + tcgetattr(STDIN_FILENO, &t); + + if (enable) { + t.c_lflag |= ECHO; + } else { + t.c_lflag &= ~ECHO; + } + + tcsetattr(STDIN_FILENO, TCSANOW, &t); +#endif +} + +QString Utils::getPassword() +{ + static QTextStream inputTextStream(stdin, QIODevice::ReadOnly); + static QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + + setStdinEcho(false); + QString line = inputTextStream.readLine(); + setStdinEcho(true); + + // The new line was also not echoed, but we do want to echo it. + outputTextStream << "\n"; + outputTextStream.flush(); + + return line; +} + +/* + * A valid and running event loop is needed to use the global QClipboard, + * so we need to use this from the CLI. + */ +int Utils::clipText(const QString& text) +{ + + QString programName = ""; + QStringList arguments; + +#ifdef Q_OS_UNIX + programName = "xclip"; + arguments << "-i" + << "-selection" + << "clipboard"; +#endif + +#ifdef Q_OS_MACOS + programName = "pbcopy"; +#endif + +#ifdef Q_OS_WIN + programName = "clip"; +#endif + + if (programName.isEmpty()) { + qCritical("No program defined for clipboard manipulation"); + return EXIT_FAILURE; + } + + QProcess* clipProcess = new QProcess(nullptr); + clipProcess->start(programName, arguments); + clipProcess->waitForStarted(); + + if (clipProcess->state() != QProcess::Running) { + qCritical("Unable to start program %s", qPrintable(programName)); + return EXIT_FAILURE; + } + + if (clipProcess->write(text.toLatin1()) == -1) { + qDebug("Unable to write to process : %s", qPrintable(clipProcess->errorString())); + } + clipProcess->waitForBytesWritten(); + clipProcess->closeWriteChannel(); + clipProcess->waitForFinished(); + + return clipProcess->exitCode(); +} |