Delete E2EE files/folders for accounts that have had E2EE disabled

Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
Claudio Cambra 2022-11-11 18:32:12 +01:00
parent cc6bdc9bd5
commit b57b35e7a4
No known key found for this signature in database
GPG key ID: C839200C384636B0
5 changed files with 76 additions and 0 deletions

View file

@ -1614,6 +1614,11 @@ void AccountSettings::resetE2eEncryption()
_ui->encryptionMessage->setIcon({});
initializeE2eEncryption();
checkClientSideEncryptionState();
const auto account = _accountState->account();
if (account->e2e()->_mnemonic.isEmpty()) {
FolderMan::instance()->removeE2eFiles(account);
}
}
void AccountSettings::removeActionFromEncryptionMessage(const QString &actionId)

View file

@ -1332,6 +1332,60 @@ void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction dir, std::functio
msgBox->open();
}
void Folder::removeLocalE2eFiles()
{
qCDebug(lcFolder) << "Removing local E2EE files";
QByteArrayList e2eFiles;
const auto couldGetFiles = _journal.getFilesBelowPath("", [&e2eFiles](const SyncJournalFileRecord &rec) {
if (rec._isE2eEncrypted) {
e2eFiles.append(rec._path);
}
});
if (!couldGetFiles) {
qCWarning(lcFolder) << "Could not fetch E2EE files to delete in this folder:" << path();
return;
} else if (e2eFiles.isEmpty()) {
qCWarning(lcFolder) << "No E2EE files found at path" << path();
return;
}
const auto currentSyncPaused = syncPaused();
setSyncPaused(true);
qCDebug(lcFolder) << "About to remove: " << e2eFiles;
for (const auto &e2eFilePath : qAsConst(e2eFiles)) {
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 file:" << fullPath;
}
} else {
qCWarning(lcFolder) << "Unable to delete:" << fullPath << "as it does not exist!";
}
}
setSyncPaused(currentSyncPaused);
_journal.forceRemoteDiscoveryNextSync();
scheduleThisFolderSoon();
}
QString Folder::fileFromLocalPath(const QString &localPath) const
{
return localPath.mid(cleanPath().length() + 1);

View file

@ -370,6 +370,11 @@ public slots:
void setSilenceErrorsUntilNextSync(bool silenceErrors);
/** Deletes local copies of E2EE files.
* Intended for clean-up after disabling E2EE for an account.
*/
void removeLocalE2eFiles();
private slots:
void slotSyncStarted();
void slotSyncFinished(bool);

View file

@ -658,6 +658,16 @@ void FolderMan::forceSyncForFolder(Folder *folder)
scheduleFolderNext(folder);
}
void FolderMan::removeE2eFiles(const AccountPtr &account) const
{
Q_ASSERT(account->e2e()->_mnemonic.isEmpty());
for (const auto folder : map()) {
if(folder->accountState()->account()->id() == account->id()) {
folder->removeLocalE2eFiles();
}
}
}
void FolderMan::slotScheduleAppRestart()
{
_appRestartRequired = true;

View file

@ -271,6 +271,8 @@ public slots:
void forceSyncForFolder(OCC::Folder *folder);
void removeE2eFiles(const AccountPtr &account) const;
private slots:
void slotFolderSyncPaused(OCC::Folder *, bool paused);
void slotFolderCanSyncChanged();