Stop unlocking from within PropagateRemoteDeleteEncrypted
authorKevin Ottens <kevin.ottens@nextcloud.com>
Wed, 8 Jul 2020 14:18:08 +0000 (16:18 +0200)
committerCamila <smayres@gmail.com>
Thu, 9 Jul 2020 14:22:54 +0000 (16:22 +0200)
We need to finish deleting the file before we can actually unlock. Also
the token will be necessary for the delete to succeed.

Signed-off-by: Kevin Ottens <kevin.ottens@nextcloud.com>
src/libsync/propagateremotedeleteencrypted.cpp
src/libsync/propagateremotedeleteencrypted.h

index f9048067ac08944dc9214c0b3e04c05708f4baae..1f4dd80f7bffdb32625bd3d0f4627dba05bc7aeb 100644 (file)
@@ -20,6 +20,11 @@ PropagateRemoteDeleteEncrypted::PropagateRemoteDeleteEncrypted(OwncloudPropagato
 
 }
 
+QByteArray PropagateRemoteDeleteEncrypted::folderToken()
+{
+    return _folderToken;
+}
+
 void PropagateRemoteDeleteEncrypted::start()
 {
     Q_ASSERT(!_item->_encryptedFileName.isEmpty());
@@ -65,7 +70,7 @@ void PropagateRemoteDeleteEncrypted::slotFolderEncryptedMetadataReceived(const Q
 {
     if (statusCode == 404) {
         qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Metadata not found, ignoring.";
-        unlockFolder();
+        emit finished(true);
         return;
     }
 
@@ -90,7 +95,8 @@ void PropagateRemoteDeleteEncrypted::slotFolderEncryptedMetadataReceived(const Q
 
     if (!found) {
         // The removed file was not in the JSON so nothing else to do
-        unlockFolder();
+        emit finished(true);
+        return;
     }
 
     qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Metadata updated, sending to the server.";
@@ -100,13 +106,18 @@ void PropagateRemoteDeleteEncrypted::slotFolderEncryptedMetadataReceived(const Q
                                         metadata.encryptedMetadata(),
                                         _folderToken);
 
-    connect(job, &UpdateMetadataApiJob::success, this, &PropagateRemoteDeleteEncrypted::unlockFolder);
+    connect(job, &UpdateMetadataApiJob::success, this, [this] { emit finished(true); });
     connect(job, &UpdateMetadataApiJob::error, this, &PropagateRemoteDeleteEncrypted::taskFailed);
     job->start();
 }
 
 void PropagateRemoteDeleteEncrypted::unlockFolder()
 {
+    if (!_folderLocked) {
+        emit folderUnlocked();
+        return;
+    }
+
     qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Unlocking folder" << _folderId;
     auto unlockJob = new UnlockEncryptFolderApiJob(_propagator->account(),
                                                    _folderId, _folderToken, this);
@@ -114,7 +125,7 @@ void PropagateRemoteDeleteEncrypted::unlockFolder()
     connect(unlockJob, &UnlockEncryptFolderApiJob::success, [this] {
         qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Folder successfully unlocked" << _folderId;
         _folderLocked = false;
-        emit finished(true);
+        emit folderUnlocked();
     });
     connect(unlockJob, &UnlockEncryptFolderApiJob::error, this, &PropagateRemoteDeleteEncrypted::taskFailed);
     unlockJob->start();
@@ -124,6 +135,7 @@ void PropagateRemoteDeleteEncrypted::taskFailed()
 {
     qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Task failed of job" << sender();
     if (_folderLocked) {
+        connect(this, &PropagateRemoteDeleteEncrypted::folderUnlocked, this, [this] { emit finished(false); });
         unlockFolder();
     } else {
         emit finished(false);
index 8e0d44f9038c3cabf4b76ce7e8a34ad1ea31c2df..25ef3738b47582cf8d906773a0d5ea912b087b72 100644 (file)
@@ -15,17 +15,20 @@ class PropagateRemoteDeleteEncrypted : public QObject
 public:
     PropagateRemoteDeleteEncrypted(OwncloudPropagator *_propagator, SyncFileItemPtr item, QObject *parent);
 
+    QByteArray folderToken();
+    void unlockFolder();
+
     void start();
 
 signals:
     void finished(bool success);
+    void folderUnlocked();
 
 private:
     void slotFolderEncryptedIdReceived(const QStringList &list);
     void slotTryLock(const QByteArray &folderId);
     void slotFolderLockedSuccessfully(const QByteArray &fileId, const QByteArray &token);
     void slotFolderEncryptedMetadataReceived(const QJsonDocument &json, int statusCode);
-    void unlockFolder();
     void taskFailed();
 
     OwncloudPropagator *_propagator;