From bf5b214e0e184d3a2ca51423ecedbc13683f6f6a Mon Sep 17 00:00:00 2001 From: allexzander Date: Wed, 13 Jan 2021 16:34:08 +0200 Subject: [PATCH] E2EE fix upload parallelism issue. Signed-off-by: allexzander --- src/libsync/owncloudpropagator.cpp | 23 +++++++++++++++++ src/libsync/owncloudpropagator.h | 2 ++ src/libsync/propagateremotemkdir.cpp | 38 ++-------------------------- src/libsync/propagateupload.cpp | 6 +---- 4 files changed, 28 insertions(+), 41 deletions(-) diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index c576c93df..90ba4ea66 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -301,6 +301,29 @@ void PropagateItemJob::slotRestoreJobFinished(SyncFileItem::Status status) } } +bool PropagateItemJob::hasEncryptedAncestor() const +{ + if (!propagator()->account()->capabilities().clientSideEncryptionAvailable()) { + return false; + } + + const auto path = _item->_file; + const auto slashPosition = path.lastIndexOf('/'); + const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString(); + + auto pathComponents = parentPath.split('/'); + while (!pathComponents.isEmpty()) { + SyncJournalFileRecord rec; + propagator()->_journal->getFileRecord(pathComponents.join('/'), &rec); + if (rec.isValid() && rec._isE2eEncrypted) { + return true; + } + pathComponents.removeLast(); + } + + return false; +} + // ================================================================================ PropagateItemJob *OwncloudPropagator::createJob(const SyncFileItemPtr &item) diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h index e16e27cf8..ba36ce344 100644 --- a/src/libsync/owncloudpropagator.h +++ b/src/libsync/owncloudpropagator.h @@ -171,6 +171,8 @@ protected: _item->_errorString = msg; } + bool hasEncryptedAncestor() const; + protected slots: void slotRestoreJobFinished(SyncFileItem::Status status); diff --git a/src/libsync/propagateremotemkdir.cpp b/src/libsync/propagateremotemkdir.cpp index 3aeb49388..8b7228d99 100644 --- a/src/libsync/propagateremotemkdir.cpp +++ b/src/libsync/propagateremotemkdir.cpp @@ -34,14 +34,6 @@ PropagateRemoteMkdir::PropagateRemoteMkdir(OwncloudPropagator *propagator, const , _uploadEncryptedHelper(nullptr) , _parallelism(FullParallelism) { - const auto rootPath = [=]() { - const auto result = propagator->remotePath(); - if (result.startsWith('/')) { - return result.mid(1); - } else { - return result; - } - }(); const auto path = _item->_file; const auto slashPosition = path.lastIndexOf('/'); const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString(); @@ -52,11 +44,7 @@ PropagateRemoteMkdir::PropagateRemoteMkdir(OwncloudPropagator *propagator, const return; } - const auto account = propagator->account(); - - if (account->capabilities().clientSideEncryptionAvailable() && - parentRec.isValid() && - parentRec._isE2eEncrypted) { + if (hasEncryptedAncestor()) { _parallelism = WaitForFinished; } } @@ -142,14 +130,6 @@ void PropagateRemoteMkdir::setDeleteExisting(bool enabled) void PropagateRemoteMkdir::slotMkdir() { - const auto rootPath = [=]() { - const auto result = propagator()->remotePath(); - if (result.startsWith('/')) { - return result.mid(1); - } else { - return result; - } - }(); const auto path = _item->_file; const auto slashPosition = path.lastIndexOf('/'); const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString(); @@ -161,21 +141,7 @@ void PropagateRemoteMkdir::slotMkdir() return; } - const auto hasEncryptedAncestor = [=] { - auto pathComponents = parentPath.split('/'); - while (!pathComponents.isEmpty()) { - SyncJournalFileRecord rec; - propagator()->_journal->getFileRecord(pathComponents.join('/'), &rec); - if (rec.isValid() && rec._isE2eEncrypted) { - return true; - } - pathComponents.removeLast(); - } - return false; - }(); - - const auto account = propagator()->account(); - if (!account->capabilities().clientSideEncryptionAvailable() || !hasEncryptedAncestor) { + if (!hasEncryptedAncestor()) { slotStartMkcolJob(); return; } diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp index a3dcb6571..7a6653ea4 100644 --- a/src/libsync/propagateupload.cpp +++ b/src/libsync/propagateupload.cpp @@ -206,11 +206,7 @@ PropagateUploadFileCommon::PropagateUploadFileCommon(OwncloudPropagator *propaga return; } - const auto account = propagator->account(); - - if (account->capabilities().clientSideEncryptionAvailable() && - parentRec.isValid() && - parentRec._isE2eEncrypted) { + if (hasEncryptedAncestor()) { _parallelism = WaitForFinished; } } -- 2.30.2