From 1be869fdc7e10c247e71ab05b1d67cf7bdec4761 Mon Sep 17 00:00:00 2001 From: Kevin Ottens Date: Wed, 8 Jul 2020 16:48:06 +0200 Subject: [PATCH] Unlock the folder only after we actually deleted the file Signed-off-by: Kevin Ottens --- src/libsync/propagateremotedelete.cpp | 22 ++++++++++++++++++---- src/libsync/propagateremotedelete.h | 3 +++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/libsync/propagateremotedelete.cpp b/src/libsync/propagateremotedelete.cpp index 8d4460be1..bc50f2579 100644 --- a/src/libsync/propagateremotedelete.cpp +++ b/src/libsync/propagateremotedelete.cpp @@ -80,12 +80,12 @@ void PropagateRemoteDelete::start() return; if (!_item->_encryptedFileName.isEmpty()) { - auto job = new PropagateRemoteDeleteEncrypted(propagator(), _item, this); - connect(job, &PropagateRemoteDeleteEncrypted::finished, this, [this] (bool success) { + _deleteEncryptedHelper = new PropagateRemoteDeleteEncrypted(propagator(), _item, this); + connect(_deleteEncryptedHelper, &PropagateRemoteDeleteEncrypted::finished, this, [this] (bool success) { Q_UNUSED(success) // Should we skip file deletion in case of failure? createDeleteJob(_item->_encryptedFileName); }); - job->start(); + _deleteEncryptedHelper->start(); } else { createDeleteJob(_item->_file); } @@ -98,6 +98,9 @@ void PropagateRemoteDelete::createDeleteJob(const QString &filename) _job = new DeleteJob(propagator()->account(), propagator()->_remoteFolder + filename, this); + if (_deleteEncryptedHelper && !_deleteEncryptedHelper->folderToken().isEmpty()) { + _job->setFolderToken(_deleteEncryptedHelper->folderToken()); + } connect(_job.data(), &DeleteJob::finishedSignal, this, &PropagateRemoteDelete::slotDeleteJobFinished); propagator()->_activeJobList.append(this); _job->start(); @@ -149,6 +152,17 @@ void PropagateRemoteDelete::slotDeleteJobFinished() propagator()->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory()); propagator()->_journal->commit("Remote Remove"); - done(SyncFileItem::Success); + + if (_deleteEncryptedHelper && !_job->folderToken().isEmpty()) { + propagator()->_activeJobList.append(this); + connect(_deleteEncryptedHelper, &PropagateRemoteDeleteEncrypted::folderUnlocked, + this, [this] { + propagator()->_activeJobList.removeOne(this); + done(SyncFileItem::Success); + }); + _deleteEncryptedHelper->unlockFolder(); + } else { + done(SyncFileItem::Success); + } } } diff --git a/src/libsync/propagateremotedelete.h b/src/libsync/propagateremotedelete.h index 83eca33ef..096e18698 100644 --- a/src/libsync/propagateremotedelete.h +++ b/src/libsync/propagateremotedelete.h @@ -18,6 +18,8 @@ namespace OCC { +class PropagateRemoteDeleteEncrypted; + /** * @brief The DeleteJob class * @ingroup libsync @@ -51,6 +53,7 @@ class PropagateRemoteDelete : public PropagateItemJob { Q_OBJECT QPointer _job; + PropagateRemoteDeleteEncrypted *_deleteEncryptedHelper = nullptr; public: PropagateRemoteDelete(OwncloudPropagator *propagator, const SyncFileItemPtr &item) -- 2.30.2