Skip to content

Commit ed5abe1

Browse files
fix(gh-9345): improve E2E folder restoration by handling sync termination and blacklist updates
Signed-off-by: Kevin Andrews <kevin@nforced.uk>
1 parent 4321f21 commit ed5abe1

4 files changed

Lines changed: 51 additions & 15 deletions

File tree

src/gui/e2eefoldermanager.cpp

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,20 +113,30 @@ void E2EFolderManager::restoreE2eFoldersForAccount(const AccountPtr &account)
113113

114114
auto blackList = folder->journalDb()->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
115115
qCDebug(lcE2eFolderManager) << "Current blacklist:" << blackList;
116+
const auto blackListSize = blackList.size();
116117

117118
for (const auto &pathToRemoveFromBlackList : foldersToRemoveFromBlacklist) {
118119
blackList.removeAll(pathToRemoveFromBlackList);
119120
}
120121

121-
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList);
122-
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, {});
122+
if (blackList.size() != blackListSize) {
123+
if (folder->isSyncRunning()) {
124+
qCDebug(lcE2eFolderManager) << "Folder is syncing, terminating to prevent E2E folder deletion";
125+
folderTerminateSyncAndUpdateBlackList(blackList, folder, foldersToRemoveFromBlacklist);
126+
++foldersProcessed;
127+
continue;
128+
}
123129

124-
for (const auto &pathToRemoteDiscover : foldersToRemoveFromBlacklist) {
125-
folder->journalDb()->schedulePathForRemoteDiscovery(pathToRemoteDiscover);
126-
}
130+
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList);
131+
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, {});
127132

128-
folderMan->scheduleFolder(folder);
129-
++foldersProcessed;
133+
for (const auto &pathToRemoteDiscover : foldersToRemoveFromBlacklist) {
134+
folder->journalDb()->schedulePathForRemoteDiscovery(pathToRemoteDiscover);
135+
}
136+
137+
folderMan->scheduleFolder(folder);
138+
++foldersProcessed;
139+
}
130140
}
131141

132142
if (foldersProcessed > 0) {
@@ -136,4 +146,31 @@ void E2EFolderManager::restoreE2eFoldersForAccount(const AccountPtr &account)
136146
}
137147
}
138148

149+
void E2EFolderManager::folderTerminateSyncAndUpdateBlackList(const QStringList &blackList, OCC::Folder *folder, const QStringList &foldersToRemoveFromBlacklist)
150+
{
151+
if (_folderConnections.contains(folder->alias())) {
152+
qCWarning(lcE2eFolderManager) << "Folder " << folder->alias() << "is already terminating the sync.";
153+
return;
154+
}
155+
// in case sync is already running - terminate it and start a new one
156+
const QMetaObject::Connection syncTerminatedConnection = connect(folder, &Folder::syncFinished, this, [this, blackList, folder, foldersToRemoveFromBlacklist]() {
157+
const auto foundConnectionIt = _folderConnections.find(folder->alias());
158+
if (foundConnectionIt != _folderConnections.end()) {
159+
disconnect(*foundConnectionIt);
160+
_folderConnections.erase(foundConnectionIt);
161+
}
162+
163+
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, blackList);
164+
folder->journalDb()->setSelectiveSyncList(SyncJournalDb::SelectiveSyncE2eFoldersToRemoveFromBlacklist, {});
165+
166+
for (const auto &pathToRemoteDiscover : foldersToRemoveFromBlacklist) {
167+
folder->journalDb()->schedulePathForRemoteDiscovery(pathToRemoteDiscover);
168+
}
169+
170+
FolderMan::instance()->scheduleFolder(folder);
171+
});
172+
_folderConnections.insert(folder->alias(), syncTerminatedConnection);
173+
folder->slotTerminateSync();
174+
}
175+
139176
} // namespace OCC

src/gui/e2eefoldermanager.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
#pragma once
55

66
#include <QObject>
7+
#include <QMap>
78
#include "account.h"
89
#include "accountmanager.h"
910

1011
namespace OCC {
1112

13+
class Folder;
14+
1215
/**
1316
* @brief Stateless bridge between E2E encryption and folder management
1417
*
@@ -36,7 +39,9 @@ private slots:
3639

3740
void connectE2eSignals(const AccountPtr &account);
3841
void restoreE2eFoldersForAccount(const AccountPtr &account);
42+
void folderTerminateSyncAndUpdateBlackList(const QStringList &blackList, OCC::Folder *folder, const QStringList &foldersToRemoveFromBlacklist);
3943

44+
QMap<QString, QMetaObject::Connection> _folderConnections;
4045
static E2EFolderManager *_instance;
4146
};
4247

src/libsync/discovery.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ void ProcessDirectoryJob::process()
252252
continue;
253253
}
254254

255-
const auto isBlacklisted = _queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original) || isEncryptedFolderButE2eIsNotSetup;
255+
const auto isBlacklisted = _queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original);
256256

257257
const auto willBeExcluded = handleExcluded(path._target, e, entries, isHidden, isBlacklisted);
258258

test/teste2eefoldermanager.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,6 @@ class TestE2EFolderManager : public QObject
2323
Q_OBJECT
2424

2525
private slots:
26-
void initTestCase()
27-
{
28-
OCC::Logger::instance()->setLogFlush(true);
29-
OCC::Logger::instance()->setLogDebug(true);
30-
QStandardPaths::setTestModeEnabled(true);
31-
}
3226

3327
void init()
3428
{
@@ -360,4 +354,4 @@ private slots:
360354
};
361355

362356
QTEST_GUILESS_MAIN(TestE2EFolderManager)
363-
#include "teste2eefoldermanager.moc"
357+
#include "teste2eefoldermanager.moc"

0 commit comments

Comments
 (0)