}
if (!parentPathEncrypted) {
- e2eFoldersToBlacklist.append(rec._path);
+ const auto pathAdjusted = rec._path.endsWith('/') ? rec._path : QString(rec._path + QStringLiteral("/"));
+ e2eFoldersToBlacklist.append(pathAdjusted);
}
}
});
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
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;
}
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;
- }
}
}
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;
}
} 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");
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,