diff --git a/src/libsync/encryptfolderjob.cpp b/src/libsync/encryptfolderjob.cpp index 352b41e615d3..0193ff4c8222 100644 --- a/src/libsync/encryptfolderjob.cpp +++ b/src/libsync/encryptfolderjob.cpp @@ -17,7 +17,6 @@ #include "common/syncjournaldb.h" #include "clientsideencryptionjobs.h" #include "foldermetadata.h" - #include namespace OCC { @@ -34,6 +33,10 @@ EncryptFolderJob::EncryptFolderJob(const AccountPtr &account, SyncJournalDb *jou , _propagator(propagator) , _item(item) { + SyncJournalFileRecord rec; + const auto currentPath = !_pathNonEncrypted.isEmpty() ? _pathNonEncrypted : _path; + [[maybe_unused]] const auto result = _journal->getRootE2eFolderRecord(currentPath, &rec); + _fetchAndUploadE2eeFolderMetadataJob.reset(new FetchAndUploadE2eeFolderMetadataJob(account, _path, _journal, rec.path())); } void EncryptFolderJob::slotSetEncryptionFlag() @@ -87,12 +90,7 @@ void EncryptFolderJob::slotEncryptionFlagSuccess(const QByteArray &fileId) } } - const auto lockJob = new LockEncryptFolderApiJob(_account, fileId, _journal, _account->e2e()->_publicKey, this); - connect(lockJob, &LockEncryptFolderApiJob::success, - this, &EncryptFolderJob::slotLockForEncryptionSuccess); - connect(lockJob, &LockEncryptFolderApiJob::error, - this, &EncryptFolderJob::slotLockForEncryptionError); - lockJob->start(); + uploadMetadata(); } void EncryptFolderJob::slotEncryptionFlagError(const QByteArray &fileId, @@ -104,9 +102,8 @@ void EncryptFolderJob::slotEncryptionFlagError(const QByteArray &fileId, emit finished(Error, EncryptionStatusEnums::ItemEncryptionStatus::NotEncrypted); } -void EncryptFolderJob::slotLockForEncryptionSuccess(const QByteArray &fileId, const QByteArray &token) +void EncryptFolderJob::uploadMetadata() { - _folderToken = token; const auto currentPath = !_pathNonEncrypted.isEmpty() ? _pathNonEncrypted : _path; SyncJournalFileRecord rec; if (!_journal->getRootE2eFolderRecord(currentPath, &rec)) { @@ -114,13 +111,11 @@ void EncryptFolderJob::slotLockForEncryptionSuccess(const QByteArray &fileId, co return; } QSharedPointer emptyMetadata( - new FolderMetadata( - _account, - {}, - FolderMetadata::RootEncryptedFolderInfo(FolderMetadata::RootEncryptedFolderInfo::createRootPath(currentPath, rec.path()))) - ); - connect(emptyMetadata.data(), &FolderMetadata::setupComplete, this, [this, fileId, token, emptyMetadata] { - const auto encryptedMetadata = emptyMetadata->encryptedMetadata(); + new FolderMetadata(_account, + {}, + FolderMetadata::RootEncryptedFolderInfo(FolderMetadata::RootEncryptedFolderInfo::createRootPath(currentPath, rec.path())))); + connect(emptyMetadata.data(), &FolderMetadata::setupComplete, this, [this, emptyMetadata] { + const auto encryptedMetadata = !emptyMetadata->isValid() ? QByteArray{} : emptyMetadata->encryptedMetadata(); if (encryptedMetadata.isEmpty()) { // TODO: Mark the folder as unencrypted as the metadata generation failed. _errorString = @@ -129,60 +124,27 @@ void EncryptFolderJob::slotLockForEncryptionSuccess(const QByteArray &fileId, co emit finished(Error, EncryptionStatusEnums::ItemEncryptionStatus::NotEncrypted); return; } - - _folderEncryptionStatus = emptyMetadata->encryptedMetadataEncryptionStatus(); - - const auto storeMetadataJob = new StoreMetaDataApiJob(_account, fileId, token, encryptedMetadata, this); - connect(storeMetadataJob, &StoreMetaDataApiJob::success, this, &EncryptFolderJob::slotUploadMetadataSuccess); - connect(storeMetadataJob, &StoreMetaDataApiJob::error, this, &EncryptFolderJob::slotUpdateMetadataError); - storeMetadataJob->start(); + _fetchAndUploadE2eeFolderMetadataJob->setMetadata(emptyMetadata); + _fetchAndUploadE2eeFolderMetadataJob->setFolderId(_fileId); + connect(_fetchAndUploadE2eeFolderMetadataJob.data(), + &FetchAndUploadE2eeFolderMetadataJob::uploadFinished, + this, + &EncryptFolderJob::slotUploadMetadataFinished); + _fetchAndUploadE2eeFolderMetadataJob->uploadMetadata(); }); } -void EncryptFolderJob::slotUploadMetadataSuccess(const QByteArray &folderId) -{ - auto unlockJob = new UnlockEncryptFolderApiJob(_account, folderId, _folderToken, _journal, this); - connect(unlockJob, &UnlockEncryptFolderApiJob::success, - this, &EncryptFolderJob::slotUnlockFolderSuccess); - connect(unlockJob, &UnlockEncryptFolderApiJob::error, - this, &EncryptFolderJob::slotUnlockFolderError); - unlockJob->start(); -} - -void EncryptFolderJob::slotUpdateMetadataError(const QByteArray &folderId, const int httpReturnCode) -{ - Q_UNUSED(httpReturnCode); - - const auto unlockJob = new UnlockEncryptFolderApiJob(_account, folderId, _folderToken, _journal, this); - connect(unlockJob, &UnlockEncryptFolderApiJob::success, - this, &EncryptFolderJob::slotUnlockFolderSuccess); - connect(unlockJob, &UnlockEncryptFolderApiJob::error, - this, &EncryptFolderJob::slotUnlockFolderError); - unlockJob->start(); -} - -void EncryptFolderJob::slotLockForEncryptionError(const QByteArray &fileId, - const int httpErrorCode, - const QString &errorMessage) +void EncryptFolderJob::slotUploadMetadataFinished(int statusCode, const QString &message) { - qCInfo(lcEncryptFolderJob()) << "Locking error for" << fileId << "HTTP code:" << httpErrorCode; - _errorString = errorMessage; - emit finished(Error, EncryptionStatusEnums::ItemEncryptionStatus::NotEncrypted); -} - -void EncryptFolderJob::slotUnlockFolderError(const QByteArray &fileId, - const int httpErrorCode, - const QString &errorMessage) -{ - qCInfo(lcEncryptFolderJob()) << "Unlocking error for" << fileId << "HTTP code:" << httpErrorCode; - _errorString = errorMessage; - emit finished(Error, EncryptionStatusEnums::ItemEncryptionStatus::NotEncrypted); -} -void EncryptFolderJob::slotUnlockFolderSuccess(const QByteArray &fileId) -{ - qCInfo(lcEncryptFolderJob()) << "Unlocking success for" << fileId; - emit finished(Success, _folderEncryptionStatus); - return; + if (statusCode != 200) { + qCDebug(lcEncryptFolderJob) << "Update metadata error for folder" << _fetchAndUploadE2eeFolderMetadataJob->folderId() << "with error" + << message; + qCDebug(lcEncryptFolderJob()) << "Unlocking the folder."; + _errorString = message; + emit finished(Error, EncryptionStatusEnums::ItemEncryptionStatus::NotEncrypted); + return; + } + emit finished(Success, _fetchAndUploadE2eeFolderMetadataJob->folderMetadata()->encryptedMetadataEncryptionStatus()); } } diff --git a/src/libsync/encryptfolderjob.h b/src/libsync/encryptfolderjob.h index 980310c3101b..803670b600fc 100644 --- a/src/libsync/encryptfolderjob.h +++ b/src/libsync/encryptfolderjob.h @@ -14,6 +14,7 @@ #pragma once #include "account.h" +#include "fetchanduploade2eefoldermetadatajob.h" #include "syncfileitem.h" #include "owncloudpropagator.h" @@ -49,15 +50,13 @@ class OWNCLOUDSYNC_EXPORT EncryptFolderJob : public QObject public slots: void setPathNonEncrypted(const QString &pathNonEncrypted); +private: + void uploadMetadata(); + private slots: void slotEncryptionFlagSuccess(const QByteArray &folderId); void slotEncryptionFlagError(const QByteArray &folderId, const int httpReturnCode, const QString &errorMessage); - void slotLockForEncryptionSuccess(const QByteArray &folderId, const QByteArray &token); - void slotLockForEncryptionError(const QByteArray &folderId, const int httpReturnCode, const QString &errorMessage); - void slotUnlockFolderSuccess(const QByteArray &folderId); - void slotUnlockFolderError(const QByteArray &folderId, const int httpReturnCode, const QString &errorMessage); - void slotUploadMetadataSuccess(const QByteArray &folderId); - void slotUpdateMetadataError(const QByteArray &folderId, const int httpReturnCode); + void slotUploadMetadataFinished(int statusCode, const QString &message); void slotSetEncryptionFlag(); private: @@ -70,6 +69,6 @@ private slots: QString _errorString; OwncloudPropagator *_propagator = nullptr; SyncFileItemPtr _item; - EncryptionStatusEnums::ItemEncryptionStatus _folderEncryptionStatus = EncryptionStatusEnums::ItemEncryptionStatus::NotEncrypted; + QScopedPointer _fetchAndUploadE2eeFolderMetadataJob; }; } diff --git a/src/libsync/fetchanduploade2eefoldermetadatajob.cpp b/src/libsync/fetchanduploade2eefoldermetadatajob.cpp index f6fa46e50097..f7df553db95f 100644 --- a/src/libsync/fetchanduploade2eefoldermetadatajob.cpp +++ b/src/libsync/fetchanduploade2eefoldermetadatajob.cpp @@ -304,6 +304,19 @@ QSharedPointer FetchAndUploadE2eeFolderMetadataJob::folderMetada return _folderMetadata; } +void FetchAndUploadE2eeFolderMetadataJob::setMetadata(const QSharedPointer &metadata) +{ + _folderMetadata = metadata; + if (metadata && metadata->isValid() && metadata->counter() == 0) { + _isNewMetadataCreated = true; + } +} + +void FetchAndUploadE2eeFolderMetadataJob::setFolderId(const QByteArray &folderId) +{ + _folderId = folderId; +} + const QByteArray FetchAndUploadE2eeFolderMetadataJob::folderId() const { return _folderId; diff --git a/src/libsync/fetchanduploade2eefoldermetadatajob.h b/src/libsync/fetchanduploade2eefoldermetadatajob.h index 4159118947f9..464e6a99356e 100644 --- a/src/libsync/fetchanduploade2eefoldermetadatajob.h +++ b/src/libsync/fetchanduploade2eefoldermetadatajob.h @@ -37,10 +37,12 @@ class OWNCLOUDSYNC_EXPORT FetchAndUploadE2eeFolderMetadataJob : public QObject QObject *parent = nullptr); [[nodiscard]] QSharedPointer folderMetadata() const; + void setMetadata(const QSharedPointer &metadata); + void setFolderId(const QByteArray &folderId); [[nodiscard]] const QByteArray folderId() const; - void setFolderToken(const QByteArray &token); //use this when modifying metadata for multiple folders inside top-level one which is locked + void setFolderToken(const QByteArray &token); // use this when modifying metadata for multiple folders inside top-level one which is locked [[nodiscard]] const QByteArray folderToken() const; [[nodiscard]] const bool isUnlockRunning() const; diff --git a/src/libsync/foldermetadata.cpp b/src/libsync/foldermetadata.cpp index 704cd799f0cc..90d50f568cd8 100644 --- a/src/libsync/foldermetadata.cpp +++ b/src/libsync/foldermetadata.cpp @@ -758,6 +758,11 @@ const FolderMetadata::MetadataVersion FolderMetadata::latestSupportedMetadataVer return fromItemEncryptionStatusToMedataVersion(itemEncryptionStatusFromApiVersion); } +quint64 FolderMetadata::counter() const +{ + return _counter; +} + quint64 FolderMetadata::newCounter() const { return _counter + 1; diff --git a/src/libsync/foldermetadata.h b/src/libsync/foldermetadata.h index eb1545af4b36..a254a108c1c7 100644 --- a/src/libsync/foldermetadata.h +++ b/src/libsync/foldermetadata.h @@ -110,6 +110,7 @@ class OWNCLOUDSYNC_EXPORT FolderMetadata : public QObject [[nodiscard]] bool isVersion2AndUp() const; + [[nodiscard]] quint64 counter() const; [[nodiscard]] quint64 newCounter() const; private: