collect remnant read-only folders during discovery
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Fri, 30 Aug 2024 13:35:20 +0000 (15:35 +0200)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Thu, 12 Sep 2024 07:57:29 +0000 (09:57 +0200)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/discovery.cpp
src/libsync/discoveryphase.h
src/libsync/syncengine.cpp
src/libsync/syncengine.h

index a23291fe45fbb493b5a5a4b18022c9195552734f..468d1fae467c249818f51c5f5adc70eeffde236f 100644 (file)
@@ -1831,11 +1831,13 @@ bool ProcessDirectoryJob::checkPermissions(const OCC::SyncFileItemPtr &item)
             const auto localPath = QString{_discoveryData->_localDir + item->_file};
             qCWarning(lcDisco) << "unexpected new folder in a read-only folder will be made read-write" << localPath;
             FileSystem::setFolderPermissions(localPath, FileSystem::FolderPermissions::ReadWrite);
+            emit _discoveryData->remnantReadOnlyFolderDiscovered(item);
             return false;
         } else if (!item->isDirectory() && !perms.hasPermission(RemotePermissions::CanAddFile)) {
             qCWarning(lcDisco) << "checkForPermission: ERROR" << item->_file;
             item->_instruction = CSYNC_INSTRUCTION_ERROR;
             item->_errorString = tr("Not allowed because you don't have permission to add files in that folder");
+            emit _discoveryData->remnantReadOnlyFolderDiscovered(item);
             return false;
         }
         break;
@@ -2035,6 +2037,7 @@ int ProcessDirectoryJob::processSubJobs(int nbJobs)
                     const auto localPath = QString{_discoveryData->_localDir + _dirItem->_file};
                     qCWarning(lcDisco) << "unexpected new folder in a read-only folder will be made read-write" << localPath;
                     FileSystem::setFolderPermissions(localPath, FileSystem::FolderPermissions::ReadWrite);
+                    emit _discoveryData->remnantReadOnlyFolderDiscovered(_dirItem);
                 }
 
                 _dirItem->_direction = _dirItem->_direction == SyncFileItem::Up ? SyncFileItem::Down : SyncFileItem::Up;
index 89012df25f878654202455f9555f1c80dfe1d201..7d53f1336d698f9fcd4533d450028690734501c2 100644 (file)
@@ -357,6 +357,7 @@ signals:
 
     void addErrorToGui(const SyncFileItem::Status status, const QString &errorMessage, const QString &subject, const OCC::ErrorCategory category);
 
+    void remnantReadOnlyFolderDiscovered(const OCC::SyncFileItemPtr &item);
 private slots:
     void slotItemDiscovered(const OCC::SyncFileItemPtr &item);
 };
index 3f0cd9b3cd7115c09d505001a13dc24d6f533725..21d6b0c8b6bc33df7699d92d7528cceb59ed16b4 100644 (file)
@@ -630,6 +630,8 @@ void SyncEngine::startSync()
     _progressInfo->_status = ProgressInfo::Discovery;
     emit transmissionProgress(*_progressInfo);
 
+    _remnantReadOnlyFolders.clear();
+
     _discoveryPhase.reset(new DiscoveryPhase);
     _discoveryPhase->_leadingAndTrailingSpacesFilesAllowed = _leadingAndTrailingSpacesFilesAllowed;
     _discoveryPhase->_account = _account;
@@ -683,6 +685,7 @@ void SyncEngine::startSync()
     connect(_discoveryPhase.data(), &DiscoveryPhase::finished, this, &SyncEngine::slotDiscoveryFinished);
     connect(_discoveryPhase.data(), &DiscoveryPhase::silentlyExcluded,
         _syncFileStatusTracker.data(), &SyncFileStatusTracker::slotAddSilentlyExcluded);
+    connect(_discoveryPhase.data(), &DiscoveryPhase::remnantReadOnlyFolderDiscovered, this, &SyncEngine::remnantReadOnlyFolderDiscovered);
 
     ProcessDirectoryJob *discoveryJob = nullptr;
 
@@ -1486,6 +1489,11 @@ void SyncEngine::slotCleanupScheduledSyncTimers()
     }
 }
 
+void SyncEngine::remnantReadOnlyFolderDiscovered(const SyncFileItemPtr &item)
+{
+    _remnantReadOnlyFolders.push_back(item);
+}
+
 void SyncEngine::slotUnscheduleFilesDelayedSync()
 {
     if (!_discoveryPhase || _discoveryPhase->_filesUnscheduleSync.empty()) {
index ea9b3c21ad0043fbbfc78fabbe351639204a175b..2887c4bc1f65853cb5f16f0b10df930f49f921ba 100644 (file)
@@ -240,6 +240,8 @@ private slots:
     void slotUnscheduleFilesDelayedSync();
     void slotCleanupScheduledSyncTimers();
 
+    void remnantReadOnlyFolderDiscovered(const OCC::SyncFileItemPtr &item);
+
 private:
     // Some files need a sync run to be executed at a specified time after
     // their status is scheduled to change (e.g. lock status will expire in
@@ -404,6 +406,8 @@ private:
     QVector<QSharedPointer<ScheduledSyncTimer>> _scheduledSyncTimers;
 
     SingleItemDiscoveryOptions _singleItemDiscoveryOptions;
+
+    QList<SyncFileItemPtr> _remnantReadOnlyFolders;
 };
 }