CLI: Restore the original codepage on windows

* Fixes #11465
This commit is contained in:
Jonathan White 2024-11-13 17:50:45 -05:00
parent 9a63e80386
commit b1180b3341
4 changed files with 26 additions and 4 deletions

View File

@ -43,6 +43,11 @@ namespace Utils
QTextStream STDIN;
QTextStream DEVNULL;
#ifdef Q_OS_WIN
UINT origCodePage;
UINT origOutputCodePage;
#endif
void setDefaultTextStreams()
{
auto fd = new QFile();
@ -66,6 +71,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());
@ -73,6 +81,14 @@ namespace Utils
#endif
}
void resetTextStreams()
{
#ifdef Q_OS_WIN
SetConsoleCP(origCodePage);
SetConsoleOutputCP(origOutputCodePage);
#endif
}
void setStdinEcho(bool enable = true)
{
#ifdef Q_OS_WIN

View File

@ -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>& fileKey);

View File

@ -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 << Qt::endl;
return EXIT_SUCCESS;
} else if (parser.isSet(debugInfoOption)) {
}
if (parser.isSet(debugInfoOption)) {
QString debugInfo = Tools::debugInfo().append("\n").append(Crypto::debugInfo());
out << debugInfo << Qt::endl;
return EXIT_SUCCESS;

View File

@ -174,6 +174,8 @@ int main(int argc, char** argv)
return EXIT_FAILURE;
}
Utils::setDefaultTextStreams();
// Apply the configured theme before creating any GUI elements
app.applyTheme();
@ -192,9 +194,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) {
@ -228,5 +227,7 @@ int main(int argc, char** argv)
__lsan_disable();
#endif
Utils::resetTextStreams();
return exitCode;
}