Fix e2ee folder move issue
authorallexzander <blackslayer4@gmail.com>
Tue, 12 Jan 2021 15:51:32 +0000 (17:51 +0200)
committerallexzander <blackslayer4@gmail.com>
Thu, 14 Jan 2021 13:54:30 +0000 (15:54 +0200)
Signed-off-by: allexzander <blackslayer4@gmail.com>
src/libsync/discovery.cpp
src/libsync/discovery.h

index 09f0dae2d085f762cf560bdc95c5bd75460d72b4..00732bab0c5be97994dbf0f97f52c4826f2c52db 100644 (file)
@@ -887,6 +887,11 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
             qCInfo(lcDisco) << "Not a move, no item in db with inode" << localEntry.inode;
             return false;
         }
+
+        if (base._isE2eEncrypted || isInsideEncryptedTree()) {
+            return false;
+        }
+
         if (base.isDirectory() != item->isDirectory()) {
             qCInfo(lcDisco) << "Not a move, types don't match" << base._type << item->_type << localEntry.type;
             return false;
@@ -1149,6 +1154,7 @@ void ProcessDirectoryJob::processFileFinalize(
     }
     if (recurse) {
         auto job = new ProcessDirectoryJob(path, item, recurseQueryLocal, recurseQueryServer, this);
+        job->setInsideEncryptedTree(isInsideEncryptedTree() || item->_isEncrypted);
         if (removed) {
             job->setParent(_discoveryData);
             _discoveryData->_queuedDeletedDirectories[path._original] = job;
index 2d036b9a9e977c29c9c8868b47a44a15186c17b6..18e43176aa3aeab63c73e7212cfdee79a20740b9 100644 (file)
@@ -88,6 +88,16 @@ public:
     /** Start up to nbJobs, return the number of job started; emit finished() when done */
     int processSubJobs(int nbJobs);
 
+    void setInsideEncryptedTree(bool isInsideEncryptedTree)
+    {
+        _isInsideEncryptedTree = isInsideEncryptedTree;
+    }
+
+    bool isInsideEncryptedTree() const
+    {
+        return _isInsideEncryptedTree;
+    }
+
     SyncFileItemPtr _dirItem;
 
 private:
@@ -273,6 +283,7 @@ private:
     bool _childModified = false; // the directory contains modified item what would prevent deletion
     bool _childIgnored = false; // The directory contains ignored item that would prevent deletion
     PinState _pinState = PinState::Unspecified; // The directory's pin-state, see computePinState()
+    bool _isInsideEncryptedTree = false; // this directory is encrypted or is within the tree of directories with root directory encrypted
 
 signals:
     void finished();