update read-only status of virtual files when needed for lock state
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Fri, 18 Aug 2023 14:24:30 +0000 (16:24 +0200)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Mon, 21 Aug 2023 10:57:16 +0000 (12:57 +0200)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/syncengine.cpp

index 656689a550e6048b61c82983d87025fc7bd066ad..47d88fa689df38109539ee1a187864fc91fe321f 100644 (file)
@@ -389,6 +389,18 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item)
                 modificationHappened = true;
             }
 
+            if (item->_type == CSyncEnums::ItemTypeVirtualFile) {
+                if (item->_locked == SyncFileItem::LockStatus::LockedItem && (item->_lockOwnerType != SyncFileItem::LockOwnerType::UserLock || item->_lockOwnerId != account()->davUser())) {
+                    qCDebug(lcEngine()) << filePath << "file is locked: making it read only";
+                    FileSystem::setFileReadOnly(filePath, true);
+                } else {
+                    qCDebug(lcEngine()) << filePath << "file is not locked: making it"
+                                        << ((!item->_remotePerm.isNull() && !item->_remotePerm.hasPermission(RemotePermissions::CanWrite)) ? "read only"
+                                                                                                                                           : "read write");
+                    FileSystem::setFileReadOnlyWeak(filePath, (!item->_remotePerm.isNull() && !item->_remotePerm.hasPermission(RemotePermissions::CanWrite)));
+                }
+            }
+
             // Update on-disk virtual file metadata
             if (modificationHappened && item->_type == ItemTypeVirtualFile) {
                 auto r = _syncOptions._vfs->updateMetadata(filePath, item->_modtime, item->_size, item->_fileId);