From: Matthieu Gallien Date: Thu, 22 Aug 2024 12:20:37 +0000 (+0200) Subject: when deciding to create a new folder on server: check permissions X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~6^2~45^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=96d40624254ea6b05846313a6e614ab2917cb1e6;p=nextcloud-desktop.git when deciding to create a new folder on server: check permissions sometime we need to create a folder on server because some local files or folders modifications would be lost without that in that case instead of locally deleting teh folder, we create it back on server when doing that, it is important to check the remote permissions such that we do not try to create a folder in a read-only folder on server Signed-off-by: Matthieu Gallien --- diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index 089717f62..037874d25 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -57,6 +57,7 @@ ProcessDirectoryJob::ProcessDirectoryJob(DiscoveryPhase *data, PinState basePinS ProcessDirectoryJob::ProcessDirectoryJob(const PathTuple &path, const SyncFileItemPtr &dirItem, QueryMode queryLocal, QueryMode queryServer, qint64 lastSyncTimestamp, ProcessDirectoryJob *parent) : QObject(parent) , _dirItem(dirItem) + , _dirParentItem(parent->_dirItem) , _lastSyncTimestamp(lastSyncTimestamp) , _queryServer(queryServer) , _queryLocal(queryLocal) @@ -67,9 +68,10 @@ ProcessDirectoryJob::ProcessDirectoryJob(const PathTuple &path, const SyncFileIt computePinState(parent->_pinState); } -ProcessDirectoryJob::ProcessDirectoryJob(DiscoveryPhase *data, PinState basePinState, const PathTuple &path, const SyncFileItemPtr &dirItem, QueryMode queryLocal, qint64 lastSyncTimestamp, QObject *parent) +ProcessDirectoryJob::ProcessDirectoryJob(DiscoveryPhase *data, PinState basePinState, const PathTuple &path, const SyncFileItemPtr &dirItem, const SyncFileItemPtr &parentDirItem, QueryMode queryLocal, qint64 lastSyncTimestamp, QObject *parent) : QObject(parent) , _dirItem(dirItem) + , _dirParentItem(parentDirItem) , _lastSyncTimestamp(lastSyncTimestamp) , _queryLocal(queryLocal) , _discoveryData(data) @@ -2017,6 +2019,18 @@ int ProcessDirectoryJob::processSubJobs(int nbJobs) if (_childModified && _dirItem->_instruction == CSYNC_INSTRUCTION_REMOVE) { // re-create directory that has modified contents _dirItem->_instruction = CSYNC_INSTRUCTION_NEW; + + const auto perms = !_rootPermissions.isNull() ? _rootPermissions + : _dirParentItem ? _dirParentItem->_remotePerm : _rootPermissions; + + if (perms.isNull()) { + // No permissions set + } else if (_dirItem->isDirectory() && !perms.hasPermission(RemotePermissions::CanAddSubDirectories)) { + qCWarning(lcDisco) << "checkForPermission: ERROR" << _dirItem->_file; + _dirItem->_instruction = CSYNC_INSTRUCTION_ERROR; + _dirItem->_errorString = tr("Not allowed because you don't have permission to add subfolders to that folder"); + } + _dirItem->_direction = _dirItem->_direction == SyncFileItem::Up ? SyncFileItem::Down : SyncFileItem::Up; } if (_childModified && _dirItem->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE && !_dirItem->isDirectory()) { diff --git a/src/libsync/discovery.h b/src/libsync/discovery.h index 62d1f493c..840eb15d6 100644 --- a/src/libsync/discovery.h +++ b/src/libsync/discovery.h @@ -108,8 +108,8 @@ public: QueryMode queryLocal, QueryMode queryServer, qint64 lastSyncTimestamp, ProcessDirectoryJob *parent); - explicit ProcessDirectoryJob(DiscoveryPhase *data, PinState basePinState, const PathTuple &path, const SyncFileItemPtr &dirItem, - QueryMode queryLocal, qint64 lastSyncTimestamp, QObject *parent); + explicit ProcessDirectoryJob(DiscoveryPhase *data, PinState basePinState, const PathTuple &path, const SyncFileItemPtr &dirItem, const SyncFileItemPtr &parentDirItem, + QueryMode queryLocal, qint64 lastSyncTimestamp, QObject *parent); void start(); /** Start up to nbJobs, return the number of job started; emit finished() when done */ @@ -126,6 +126,7 @@ public: } SyncFileItemPtr _dirItem; + SyncFileItemPtr _dirParentItem; private: struct Entries diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index 4a95dc098..3f0cd9b3c 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -721,6 +721,7 @@ void SyncEngine::startSync() pinState, path, singleItemDiscoveryOptions().discoveryDirItem, + {}, localQueryMode, _journal->keyValueStoreGetInt("last_sync", 0), _discoveryPhase.data()