From ecf2e2da5a7069717ff95f361ddeb238305d5289 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Wed, 13 Nov 2024 17:50:45 -0500 Subject: [PATCH] CLI: Restore the original codepage on windows * Fixes #11465 --- src/cli/Utils.cpp | 16 ++++++++++++++++ src/cli/Utils.h | 1 + src/cli/keepassxc-cli.cpp | 6 +++++- src/main.cpp | 7 ++++--- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/cli/Utils.cpp b/src/cli/Utils.cpp index d8134de26..313de8cc8 100644 --- a/src/cli/Utils.cpp +++ b/src/cli/Utils.cpp @@ -42,6 +42,11 @@ namespace Utils QTextStream STDIN; QTextStream DEVNULL; +#ifdef Q_OS_WIN + UINT origCodePage; + UINT origOutputCodePage; +#endif + void setDefaultTextStreams() { auto fd = new QFile(); @@ -65,6 +70,9 @@ namespace Utils DEVNULL.setDevice(fd); #ifdef Q_OS_WIN + origCodePage = GetConsoleCP(); + origOutputCodePage = GetConsoleOutputCP(); + // On Windows, we ask via keepassxc-cli.exe.manifest to use UTF-8, // but the console code-page isn't automatically changed to match. SetConsoleCP(GetACP()); @@ -72,6 +80,14 @@ namespace Utils #endif } + void resetTextStreams() + { +#ifdef Q_OS_WIN + SetConsoleCP(origCodePage); + SetConsoleOutputCP(origOutputCodePage); +#endif + } + void setStdinEcho(bool enable = true) { #ifdef Q_OS_WIN diff --git a/src/cli/Utils.h b/src/cli/Utils.h index 84ddbbb4b..6a272fc62 100644 --- a/src/cli/Utils.h +++ b/src/cli/Utils.h @@ -39,6 +39,7 @@ namespace Utils static const QStringList EntryFieldNames(QStringList() << UuidFieldName << TagsFieldName); void setDefaultTextStreams(); + void resetTextStreams(); void setStdinEcho(bool enable); bool loadFileKey(const QString& path, QSharedPointer& fileKey); diff --git a/src/cli/keepassxc-cli.cpp b/src/cli/keepassxc-cli.cpp index abf1b0efd..4bb81d5d5 100644 --- a/src/cli/keepassxc-cli.cpp +++ b/src/cli/keepassxc-cli.cpp @@ -181,6 +181,8 @@ int main(int argc, char** argv) QCoreApplication app(argc, argv); QCoreApplication::setApplicationVersion(KEEPASSXC_VERSION); + // Cleanup code pages after cli exits + QObject::connect(&app, &QCoreApplication::destroyed, &app, [] { Utils::resetTextStreams(); }); Bootstrap::bootstrap(config()->get(Config::GUI_Language).toString()); Utils::setDefaultTextStreams(); @@ -218,7 +220,9 @@ int main(int argc, char** argv) // Switch to parser.showVersion() when available (QT 5.4). out << KEEPASSXC_VERSION << endl; return EXIT_SUCCESS; - } else if (parser.isSet(debugInfoOption)) { + } + + if (parser.isSet(debugInfoOption)) { QString debugInfo = Tools::debugInfo().append("\n").append(Crypto::debugInfo()); out << debugInfo << endl; return EXIT_SUCCESS; diff --git a/src/main.cpp b/src/main.cpp index 37eb9d710..99ed2fada 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -176,6 +176,8 @@ int main(int argc, char** argv) return EXIT_FAILURE; } + Utils::setDefaultTextStreams(); + // Apply the configured theme before creating any GUI elements app.applyTheme(); @@ -196,9 +198,6 @@ int main(int argc, char** argv) mainWindow.setAllowScreenCapture(parser.isSet(allowScreenCaptureOption)); const bool pwstdin = parser.isSet(pwstdinOption); - if (!fileNames.isEmpty() && pwstdin) { - Utils::setDefaultTextStreams(); - } for (const QString& filename : fileNames) { QString password; if (pwstdin) { @@ -232,5 +231,7 @@ int main(int argc, char** argv) __lsan_disable(); #endif + Utils::resetTextStreams(); + return exitCode; }