diff --git a/src/common/utility.h b/src/common/utility.h index e19f0da6ae1ee..300d1294d0515 100644 --- a/src/common/utility.h +++ b/src/common/utility.h @@ -275,6 +275,8 @@ namespace Utility { OCSYNC_EXPORT QString formatWinError(long error); + OCSYNC_EXPORT bool canCreateFile(const QString &filePath); + class OCSYNC_EXPORT NtfsPermissionLookupRAII { public: diff --git a/src/common/utility_win.cpp b/src/common/utility_win.cpp index 37b348660c0de..5027452132f06 100644 --- a/src/common/utility_win.cpp +++ b/src/common/utility_win.cpp @@ -430,6 +430,19 @@ void Utility::UnixTimeToLargeIntegerFiletime(time_t t, LARGE_INTEGER *hundredNSe hundredNSecs->HighPart = ll >>32; } +bool Utility::canCreateFile(const QString &filePath) +{ + Q_ASSERT(!filePath.isEmpty()); + QFile testFile(filePath); + if (!testFile.open(QIODevice::WriteOnly)) { + return false; + } + testFile.close(); + if (testFile.remove()) { + return false; + } + return true; +} QString Utility::formatWinError(long errorCode) { diff --git a/src/gui/folderman.cpp b/src/gui/folderman.cpp index 1dfc685038835..a95f14ab30065 100644 --- a/src/gui/folderman.cpp +++ b/src/gui/folderman.cpp @@ -1701,10 +1701,24 @@ static QString checkPathValidityRecursive(const QString &path) return FolderMan::tr("The selected path is not a folder!"); } + #ifdef Q_OS_WIN + if (!selFile.isWritable()) { + // isWritable() doesn't cover all NTFS permissions + // try creating and removing a test file, and make sure it is excluded from sync + const auto testFileName = selFile.absoluteFilePath() + QLatin1Char('/') + QStringLiteral("~$%1-write-test-file-%2") + .arg(OCC::Theme::instance()->appNameGUI()) + .arg(QDateTime::currentDateTime().toMSecsSinceEpoch()); + if (!Utility::canCreateFile(testFileName)) { + return FolderMan::tr("You have no permission to write to the selected folder!"); + } + } + #else if (!selFile.isWritable()) { return FolderMan::tr("You have no permission to write to the selected folder!"); } - return QString(); + #endif + + return {}; } // QFileInfo::canonicalPath returns an empty string if the file does not exist.