Skip to content

Commit

Permalink
Check path validity on Windows will validate NTFS permissions for net…
Browse files Browse the repository at this point in the history
…work drives.

Signed-off-by: Alkl58 <[email protected]>
  • Loading branch information
Alkl58 authored and backportbot-nextcloud[bot] committed Nov 13, 2023
1 parent 384b8ab commit 9e29c30
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/common/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,8 @@ namespace Utility {

OCSYNC_EXPORT QString formatWinError(long error);

OCSYNC_EXPORT bool canCreateFileInPath(const QString &path);

class OCSYNC_EXPORT NtfsPermissionLookupRAII
{
public:
Expand Down
10 changes: 10 additions & 0 deletions src/common/utility_win.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <QFile>
#include <QLibrary>
#include <QSettings>
#include <QTemporaryFile>

extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;

Expand Down Expand Up @@ -430,6 +431,15 @@ void Utility::UnixTimeToLargeIntegerFiletime(time_t t, LARGE_INTEGER *hundredNSe
hundredNSecs->HighPart = ll >>32;
}

bool Utility::canCreateFileInPath(const QString &path)
{
Q_ASSERT(!path.isEmpty());
const auto pathWithSlash = !path.endsWith(QLatin1Char('/'))
? path + QLatin1Char('/')
: path;
QTemporaryFile testFile(pathWithSlash + QStringLiteral("~$write-test-file-XXXXXX"));
return testFile.open();
}

QString Utility::formatWinError(long errorCode)
{
Expand Down
12 changes: 11 additions & 1 deletion src/gui/folderman.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1701,10 +1701,20 @@ 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
if (!Utility::canCreateFileInPath(path)) {
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.
Expand Down

0 comments on commit 9e29c30

Please sign in to comment.