Fix issue of e2ee folders not disappearing when disabling the e2e. Properly process...
authoralex-z <blackslayer4@gmail.com>
Fri, 30 Dec 2022 12:59:50 +0000 (13:59 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Tue, 24 Jan 2023 16:00:15 +0000 (17:00 +0100)
Signed-off-by: alex-z <blackslayer4@gmail.com>
src/csync/csync_exclude.h
src/gui/folder.cpp
src/libsync/discovery.cpp

index 0fd9acbf3b1f831b631c9eae0bc959eebc02b9b0..d701401afe90bc1a5267a90f288683ea0e6a973f 100644 (file)
@@ -47,7 +47,6 @@ enum CSYNC_EXCLUDE_TYPE {
   CSYNC_FILE_EXCLUDE_SERVER_BLACKLISTED,
   CSYNC_FILE_EXCLUDE_LEADING_SPACE,
   CSYNC_FILE_EXCLUDE_LEADING_AND_TRAILING_SPACE,
-  CSYNC_FILE_E2E_COULD_NOT_DECRYPT_EXCLUDED,
 };
 
 class ExcludedFilesTest;
index 5a71c6a7c8906ee3417260bbefac589ce9dd41a0..809c78e714fee0563436e6195a14394d846acaa2 100644 (file)
@@ -1359,7 +1359,8 @@ void Folder::removeLocalE2eFiles()
             }
 
             if (!parentPathEncrypted) {
-                e2eFoldersToBlacklist.append(rec._path);
+                const auto pathAdjusted = rec._path.endsWith('/') ? rec._path : QString(rec._path + QStringLiteral("/"));
+                e2eFoldersToBlacklist.append(pathAdjusted);
             }
         }
     });
@@ -1378,47 +1379,28 @@ void Folder::removeLocalE2eFiles()
     const auto existingBlacklist = _journal.getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
     Q_ASSERT(ok);
 
-    // Will get deleted from blacklist if encryption is set up again later
-    const auto expandedBlacklist = existingBlacklist + e2eFoldersToBlacklist;
-    _journal.setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, expandedBlacklist);
-    _journal.setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, e2eFoldersToBlacklist);
-
-    if(isBusy()) {
-        slotTerminateSync();
-    }
-
-    for (const auto &e2eFilePath : qAsConst(e2eFoldersToBlacklist)) {
-         if (!_journal.deleteFileRecord(e2eFilePath, true)) {
-             qCWarning(lcFolder) << "Failed to delete file record from local DB" << e2eFilePath
-                                 << "it might have already been deleted.";
-             continue;
-         }
-
-         qCDebug(lcFolder) << "Removing local copy of" << e2eFilePath;
-
-         const auto fullPath = QString(path() + e2eFilePath);
-         const QFileInfo pathInfo(fullPath);
-
-         if (pathInfo.isDir() && pathInfo.exists()) {
-             QDir dir(fullPath);
-             if (!dir.removeRecursively()) {
-                 qCWarning(lcFolder) << "Unable to remove directory and contents at:" << fullPath;
-             }
-         } else if (pathInfo.exists()) {
-             if (!QFile::remove(fullPath)) {
-                 qCWarning(lcFolder) << "Unable to delete:" << fullPath;
-             }
-         } else {
-             qCWarning(lcFolder) << "Unable to delete:" << fullPath << "as it does not exist!";
-         }
-     }
+    const auto existingBlacklistSet = existingBlacklist.toSet();
+    auto expandedBlacklistSet = existingBlacklist.toSet();
 
     for (const auto &path : qAsConst(e2eFoldersToBlacklist)) {
-        _journal.schedulePathForRemoteDiscovery(path);
-        schedulePathForLocalDiscovery(path);
+        expandedBlacklistSet.insert(path);
     }
 
-    slotScheduleThisFolder();
+    // same as in void FolderStatusModel::slotApplySelectiveSync()
+    // only start sync if blackList has changed
+    // database lists will get updated during discovery
+    const auto changes = (existingBlacklistSet - expandedBlacklistSet) + (expandedBlacklistSet - existingBlacklistSet);
+    if (!changes.isEmpty()) {
+        _journal.setSelectiveSyncList(SyncJournalDb::SelectiveSyncUndecidedList, QStringList());
+        if (isBusy()) {
+            slotTerminateSync();
+        }
+        foreach (const auto &it, changes) {
+            _journal.schedulePathForRemoteDiscovery(it);
+            schedulePathForLocalDiscovery(it);
+        }
+        FolderMan::instance()->scheduleFolderForImmediateSync(this);
+    }
 }
 
 QString Folder::fileFromLocalPath(const QString &localPath) const
index 73dbe7faa4801d928d020d4cfe914a8985fb9e55..3156279a09ccd9de91821c50c13686f732e44756 100644 (file)
@@ -217,7 +217,14 @@ void ProcessDirectoryJob::process()
         if (handleExcluded(path._target, e, isHidden))
             continue;
 
-        if (_queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original)) {
+        const auto isEncryptedFolderButE2eIsNotSetup = e.serverEntry.isValid() && e.serverEntry.isE2eEncrypted &&
+            _discoveryData->_account->e2e() && !_discoveryData->_account->e2e()->_publicKey.isNull() && _discoveryData->_account->e2e()->_privateKey.isNull();
+
+        if (isEncryptedFolderButE2eIsNotSetup) {
+            checkAndUpdateSelectiveSyncListsForE2eeFolders(path._server + "/");
+        }
+
+        if (_queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original) || isEncryptedFolderButE2eIsNotSetup) {
             processBlacklisted(path, e.localEntry, e.dbEntry);
             continue;
         }
@@ -251,13 +258,6 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
             excluded = CSYNC_FILE_EXCLUDE_TRAILING_SPACE;
         } else if (startsWithSpace) {
             excluded = CSYNC_FILE_EXCLUDE_LEADING_SPACE;
-        } else if (entries.serverEntry.isValid() && entries.serverEntry.isE2eEncrypted) {
-            const auto wasE2eEnabledButNotSetup = _discoveryData->_account->e2e()
-                && !_discoveryData->_account->e2e()->_publicKey.isNull()
-                && _discoveryData->_account->e2e()->_privateKey.isNull();
-            if (wasE2eEnabledButNotSetup) {
-                excluded = CSYNC_FILE_E2E_COULD_NOT_DECRYPT_EXCLUDED;
-            }
         }
     }
 
@@ -304,10 +304,7 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
 
     if (excluded == CSYNC_NOT_EXCLUDED && !entries.localEntry.isSymLink) {
         return false;
-    } else if (excluded == CSYNC_FILE_SILENTLY_EXCLUDED || excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE || excluded == CSYNC_FILE_E2E_COULD_NOT_DECRYPT_EXCLUDED) {
-        if (excluded == CSYNC_FILE_E2E_COULD_NOT_DECRYPT_EXCLUDED && isDirectory && path != QStringLiteral("/")) {
-            checkAndUpdateSelectiveSyncListsForE2eeFolders(path);
-        }
+    } else if (excluded == CSYNC_FILE_SILENTLY_EXCLUDED || excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
         emit _discoveryData->silentlyExcluded(path);
         return true;
     }
@@ -323,7 +320,6 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
     } else {
         switch (excluded) {
         case CSYNC_NOT_EXCLUDED:
-        case CSYNC_FILE_E2E_COULD_NOT_DECRYPT_EXCLUDED:
         case CSYNC_FILE_SILENTLY_EXCLUDED:
         case CSYNC_FILE_EXCLUDE_AND_REMOVE:
             qFatal("These were handled earlier");
@@ -394,22 +390,21 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
 void ProcessDirectoryJob::checkAndUpdateSelectiveSyncListsForE2eeFolders(const QString &path)
 {
     bool ok = false;
-    auto blackList = _discoveryData->_statedb->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
-    auto selectiveSyncE2eFoldersToRemoveFromBlacklist =
-        _discoveryData->_statedb->getSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok);
+
     const auto pathWithTrailingSpace = path.endsWith(QLatin1Char('/')) ? path : path + QLatin1Char('/');
-    if (!blackList.contains(pathWithTrailingSpace)) {
-        blackList.push_back(pathWithTrailingSpace);
-        blackList.sort();
-        _discoveryData->_statedb->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList);
-    }
+
+    auto blackListSet = _discoveryData->_statedb->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok).toSet();
+    blackListSet.insert(pathWithTrailingSpace);
+    auto blackList = blackListSet.toList();
+    blackList.sort();
+    _discoveryData->_statedb->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList);
+
+    auto toRemoveFromBlacklistSet = _discoveryData->_statedb->getSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, &ok).toSet();
+    toRemoveFromBlacklistSet.insert(pathWithTrailingSpace);
     // record it into a separate list to automatically remove from blacklist once the e2EE gets set up
-    if (!selectiveSyncE2eFoldersToRemoveFromBlacklist.contains(pathWithTrailingSpace)) {
-        selectiveSyncE2eFoldersToRemoveFromBlacklist.push_back(pathWithTrailingSpace);
-        selectiveSyncE2eFoldersToRemoveFromBlacklist.sort();
-        _discoveryData->_statedb->setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist,
-                                                       selectiveSyncE2eFoldersToRemoveFromBlacklist);
-    }
+    auto toRemoveFromBlacklist = toRemoveFromBlacklistSet.toList();
+    toRemoveFromBlacklist.sort();
+    _discoveryData->_statedb->setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, toRemoveFromBlacklist);
 }
 
 void ProcessDirectoryJob::processFile(PathTuple path,