From: alex-z Date: Fri, 30 Dec 2022 12:59:50 +0000 (+0100) Subject: Fix issue of e2ee folders not disappearing when disabling the e2e. Properly process... X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~11^2~30^2~9 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ad258473c4ebd5f2e26deb5c084046c64c7238b9;p=nextcloud-desktop.git Fix issue of e2ee folders not disappearing when disabling the e2e. Properly process blacklisted e2ee folders instead of ignoring them. Signed-off-by: alex-z --- diff --git a/src/csync/csync_exclude.h b/src/csync/csync_exclude.h index 0fd9acbf3..d701401af 100644 --- a/src/csync/csync_exclude.h +++ b/src/csync/csync_exclude.h @@ -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; diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index 5a71c6a7c..809c78e71 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -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 diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index 73dbe7faa..3156279a0 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -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,