Fix E2EE root folder rename issue.
authorallexzander <blackslayer4@gmail.com>
Fri, 15 Jan 2021 16:40:27 +0000 (18:40 +0200)
committerallexzander <blackslayer4@gmail.com>
Mon, 25 Jan 2021 08:35:30 +0000 (10:35 +0200)
Signed-off-by: allexzander <blackslayer4@gmail.com>
src/gui/convert.exe [new file with mode: 0644]
src/libsync/discovery.cpp
src/libsync/owncloudpropagator.h
src/libsync/propagateremotedelete.cpp
src/libsync/propagateremotedelete.h
src/libsync/propagateremotemkdir.cpp
src/libsync/propagateremotemkdir.h
src/libsync/propagateremotemove.cpp
src/libsync/propagateupload.cpp
src/libsync/propagateupload.h

diff --git a/src/gui/convert.exe b/src/gui/convert.exe
new file mode 100644 (file)
index 0000000..5f12648
Binary files /dev/null and b/src/gui/convert.exe differ
index 00732bab0c5be97994dbf0f97f52c4826f2c52db..8f61ae20da7b5b7e784fe992e54fc1f7e0773bc0 100644 (file)
@@ -937,9 +937,14 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
 
     // If it's not a move it's just a local-NEW
     if (!moveCheck()) {
-       postProcessLocalNew();
-       finalize();
-       return;
+        const bool isRootEncryptedFolderRename = base._isE2eEncrypted;
+        if (isRootEncryptedFolderRename) {
+            // if we're renaming the root encrypted folder, we'd need to mark it's NEW item with _isEncrypted true so the further processing will work correctly
+            item->_isEncrypted = true;
+        }
+        postProcessLocalNew();
+        finalize();
+        return;
     }
 
     // Check local permission if we are allowed to put move the file here
index ba36ce344d26ff1162cf38bc09a5e81c2af7bd64..4160191dba87d58479f953c1144c57d58134fc6f 100644 (file)
@@ -178,12 +178,15 @@ protected slots:
 
 private:
     QScopedPointer<PropagateItemJob> _restoreJob;
+    JobParallelism _parallelism;
 
 public:
     PropagateItemJob(OwncloudPropagator *propagator, const SyncFileItemPtr &item)
         : PropagatorJob(propagator)
         , _item(item)
+        , _parallelism(FullParallelism)
     {
+        _parallelism = (_item->_isEncrypted || hasEncryptedAncestor()) ? WaitForFinished : FullParallelism;
     }
     ~PropagateItemJob();
 
@@ -199,6 +202,8 @@ public:
         return true;
     }
 
+    virtual JobParallelism parallelism() override { return _parallelism; }
+
     SyncFileItemPtr _item;
 
 public slots:
index 4dc8ecf3c29d597dc8bb2d688d6b2b62ca7c3b32..26073e7bc28a36b4e4ecbddd2abd0f193df5bde4 100644 (file)
@@ -26,11 +26,6 @@ namespace OCC {
 
 Q_LOGGING_CATEGORY(lcPropagateRemoteDelete, "nextcloud.sync.propagator.remotedelete", QtInfoMsg)
 
-PropagatorJob::JobParallelism PropagateRemoteDelete::parallelism()
-{
-    return _item->_encryptedFileName.isEmpty() ? FullParallelism : WaitForFinished;
-}
-
 void PropagateRemoteDelete::start()
 {
     if (propagator()->_abortRequested)
index 57d0aeafc8772272f6bdb4bdc82cedecd21a503c..4385e4545135723ab785ce639735694799018c4d 100644 (file)
@@ -37,7 +37,6 @@ public:
         : PropagateItemJob(propagator, item)
     {
     }
-    JobParallelism parallelism() override;
     void start() override;
     void createDeleteJob(const QString &filename);
     void abort(PropagatorJob::AbortType abortType) override;
index 8b7228d997c0d2a52e9be3457c9c6c84ae44aba9..4ce07ddacbe0115e167152a82e401550bc3c0d30 100644 (file)
@@ -32,7 +32,7 @@ PropagateRemoteMkdir::PropagateRemoteMkdir(OwncloudPropagator *propagator, const
     : PropagateItemJob(propagator, item)
     , _deleteExisting(false)
     , _uploadEncryptedHelper(nullptr)
-    , _parallelism(FullParallelism)
+    , _isEncryptedRootFolder(_item->_isEncrypted && _item->_encryptedFileName.isEmpty())
 {
     const auto path = _item->_file;
     const auto slashPosition = path.lastIndexOf('/');
@@ -43,15 +43,6 @@ PropagateRemoteMkdir::PropagateRemoteMkdir(OwncloudPropagator *propagator, const
     if (!ok) {
         return;
     }
-
-    if (hasEncryptedAncestor()) {
-        _parallelism = WaitForFinished;
-    }
-}
-
-PropagatorJob::JobParallelism PropagateRemoteMkdir::parallelism()
-{
-    return _parallelism;
 }
 
 void PropagateRemoteMkdir::start()
@@ -203,7 +194,7 @@ void PropagateRemoteMkdir::slotMkcolJobFinished()
         return;
     }
 
-    if (!_uploadEncryptedHelper) {
+    if (!_uploadEncryptedHelper && !_isEncryptedRootFolder) {
         success();
     } else {
         // We still need to mark that folder encrypted
@@ -212,7 +203,7 @@ void PropagateRemoteMkdir::slotMkcolJobFinished()
         // We're expecting directory path in /Foo/Bar convention...
         Q_ASSERT(_job->path().startsWith('/') && !_job->path().endsWith('/'));
         // But encryption job expect it in Foo/Bar/ convention
-        const auto path = _job->path().mid(1);
+        const auto path = _isEncryptedRootFolder ? _job->path() : _job->path().mid(1);
 
         auto job = new OCC::EncryptFolderJob(propagator()->account(), propagator()->_journal, path, _item->_fileId, this);
         connect(job, &OCC::EncryptFolderJob::finished, this, &PropagateRemoteMkdir::slotEncryptFolderFinished);
index 43de418ee3981a524b5216a948a67aec67071619..1cbe4defe892086b8d9ad4207bdd3b154af8e3ce 100644 (file)
@@ -30,13 +30,10 @@ class PropagateRemoteMkdir : public PropagateItemJob
     QPointer<AbstractNetworkJob> _job;
     bool _deleteExisting;
     PropagateUploadEncrypted *_uploadEncryptedHelper;
-    JobParallelism _parallelism;
     friend class PropagateDirectory; // So it can access the _item;
 public:
     PropagateRemoteMkdir(OwncloudPropagator *propagator, const SyncFileItemPtr &item);
 
-    JobParallelism parallelism() override;
-
     void start() override;
     void abort(PropagatorJob::AbortType abortType) override;
 
@@ -60,5 +57,8 @@ private slots:
     void propfindResult(const QVariantMap &);
     void propfindError();
     void success();
+
+private:
+    bool _isEncryptedRootFolder = false;
 };
 }
index df9935a7d1b89e5d301ebc3bd3a19b57fcc94d16..7735c46bda7184f2e9bdae398d9c251120cc23af 100644 (file)
@@ -85,6 +85,31 @@ void PropagateRemoteMove::start()
 
     if (origin == _item->_renameTarget) {
         // The parent has been renamed already so there is nothing more to do.
+
+        if (!_item->_encryptedFileName.isEmpty()) {
+            const auto path = _item->_file;
+            const auto slashPosition = path.lastIndexOf('/');
+            const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString();
+
+            SyncJournalFileRecord parentRec;
+            bool ok = propagator()->_journal->getFileRecord(parentPath, &parentRec);
+            if (!ok) {
+                done(SyncFileItem::NormalError);
+                return;
+            }
+
+            // We should be encrypted as well since our parent is
+            const auto remoteParentPath = parentRec._e2eMangledName.isEmpty() ? parentPath : parentRec._e2eMangledName;
+
+            const auto lastSlashPosition = _item->_encryptedFileName.lastIndexOf('/');
+            const auto encryptedName = slashPosition >= 0 ? _item->_encryptedFileName.mid(lastSlashPosition + 1) : QString();
+
+            if (!encryptedName.isEmpty()) {
+                _item->_encryptedFileName = remoteParentPath + "/" + encryptedName;
+            }
+
+        }
+
         finalize();
         return;
     }
index 7a6653ea416e234a4cb53dc2f7814ad510462e76..7f4cf6d86b8b80ae1db74d5fc2571ba658c7558a 100644 (file)
@@ -192,7 +192,6 @@ PropagateUploadFileCommon::PropagateUploadFileCommon(OwncloudPropagator *propaga
     , _finished(false)
     , _deleteExisting(false)
     , _aborting(false)
-    , _parallelism(FullParallelism)
     , _uploadEncryptedHelper(nullptr)
     , _uploadingEncrypted(false)
 {
@@ -205,15 +204,6 @@ PropagateUploadFileCommon::PropagateUploadFileCommon(OwncloudPropagator *propaga
     if (!ok) {
         return;
     }
-
-    if (hasEncryptedAncestor()) {
-        _parallelism = WaitForFinished;
-    }
-}
-
-PropagatorJob::JobParallelism PropagateUploadFileCommon::parallelism()
-{
-    return _parallelism;
 }
 
 void PropagateUploadFileCommon::setDeleteExisting(bool enabled)
index d04f10172077257ab83023c5eda98cb0e2ce9878..38a50b7d4601dd6ca6adac21af2b6ac5ecb90d4e 100644 (file)
@@ -231,13 +231,10 @@ protected:
     };
     UploadFileInfo _fileToUpload;
     QByteArray _transmissionChecksumHeader;
-    JobParallelism _parallelism;
 
 public:
     PropagateUploadFileCommon(OwncloudPropagator *propagator, const SyncFileItemPtr &item);
 
-    JobParallelism parallelism() override;
-
     /**
      * Whether an existing entity with the same name may be deleted before
      * the upload.