diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 768d5e262..667a6a169 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -33,6 +33,10 @@ #include #include +#ifdef Q_OS_WIN +#include +#endif + QHash> Database::s_uuidMap; Database::Database() @@ -278,6 +282,11 @@ bool Database::saveAs(const QString& filePath, SaveAction action, const QString& QFileInfo fileInfo(filePath); auto realFilePath = fileInfo.exists() ? fileInfo.canonicalFilePath() : fileInfo.absoluteFilePath(); bool isNewFile = !QFile::exists(realFilePath); + +#ifdef Q_OS_WIN + bool isHidden = fileInfo.isHidden(); +#endif + bool ok = AsyncTask::runAndWaitForFuture([&] { return performSave(realFilePath, action, backupFilePath, error); }); if (ok) { setFilePath(filePath); @@ -285,6 +294,13 @@ bool Database::saveAs(const QString& filePath, SaveAction action, const QString& if (isNewFile) { QFile::setPermissions(realFilePath, QFile::ReadUser | QFile::WriteUser); } + +#ifdef Q_OS_WIN + if (isHidden) { + SetFileAttributes(realFilePath.toStdString().c_str(), FILE_ATTRIBUTE_HIDDEN); + } +#endif + m_fileWatcher->start(realFilePath, 30, 1); } else { // Saving failed, don't rewatch file since it does not represent our database diff --git a/tests/TestDatabase.cpp b/tests/TestDatabase.cpp index 9ab9de785..e3e957e79 100644 --- a/tests/TestDatabase.cpp +++ b/tests/TestDatabase.cpp @@ -30,6 +30,11 @@ #include "format/KeePass2Writer.h" #include "util/TemporaryFile.h" +#ifdef Q_OS_WIN +#include +#include +#endif + QTEST_GUILESS_MAIN(TestDatabase) static QString dbFileName = QStringLiteral(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx"); @@ -118,6 +123,12 @@ void TestDatabase::testSaveAs() QVERIFY(!db->isModified()); QCOMPARE(spyFilePathChanged.count(), 1); QVERIFY(QFile::exists(newDbFileName)); +#ifdef Q_OS_WIN + QVERIFY(!QFileInfo::QFileInfo(newDbFileName).isHidden()); + SetFileAttributes(newDbFileName.toStdString().c_str(), FILE_ATTRIBUTE_HIDDEN); + QVERIFY2(db->saveAs(newDbFileName, Database::Atomic, QString(), &error), error.toLatin1()); + QVERIFY(QFileInfo::QFileInfo(newDbFileName).isHidden()); +#endif QFile::remove(newDbFileName); QVERIFY(!QFile::exists(newDbFileName));