Skip to content

Commit

Permalink
Use FetchAndUploadE2eeFolderMetadataJob in EncryptFolderJob.
Browse files Browse the repository at this point in the history
Signed-off-by: alex-z <[email protected]>
  • Loading branch information
allexzander committed Jul 4, 2023
1 parent f630d5c commit 970ebdb
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 74 deletions.
94 changes: 28 additions & 66 deletions src/libsync/encryptfolderjob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
#include "common/syncjournaldb.h"
#include "clientsideencryptionjobs.h"
#include "foldermetadata.h"

#include <QLoggingCategory>

namespace OCC {
Expand All @@ -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()
Expand Down Expand Up @@ -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,
Expand All @@ -104,23 +102,20 @@ 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)) {
emit finished(Error, EncryptionStatusEnums::ItemEncryptionStatus::NotEncrypted);
return;
}
QSharedPointer<FolderMetadata> 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 =
Expand All @@ -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());
}

}
13 changes: 6 additions & 7 deletions src/libsync/encryptfolderjob.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#pragma once

#include "account.h"
#include "fetchanduploade2eefoldermetadatajob.h"
#include "syncfileitem.h"
#include "owncloudpropagator.h"

Expand Down Expand Up @@ -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:
Expand All @@ -70,6 +69,6 @@ private slots:
QString _errorString;
OwncloudPropagator *_propagator = nullptr;
SyncFileItemPtr _item;
EncryptionStatusEnums::ItemEncryptionStatus _folderEncryptionStatus = EncryptionStatusEnums::ItemEncryptionStatus::NotEncrypted;
QScopedPointer<FetchAndUploadE2eeFolderMetadataJob> _fetchAndUploadE2eeFolderMetadataJob;
};
}
13 changes: 13 additions & 0 deletions src/libsync/fetchanduploade2eefoldermetadatajob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,19 @@ QSharedPointer<FolderMetadata> FetchAndUploadE2eeFolderMetadataJob::folderMetada
return _folderMetadata;
}

void FetchAndUploadE2eeFolderMetadataJob::setMetadata(const QSharedPointer<FolderMetadata> &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;
Expand Down
4 changes: 3 additions & 1 deletion src/libsync/fetchanduploade2eefoldermetadatajob.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ class OWNCLOUDSYNC_EXPORT FetchAndUploadE2eeFolderMetadataJob : public QObject
QObject *parent = nullptr);

[[nodiscard]] QSharedPointer<FolderMetadata> folderMetadata() const;
void setMetadata(const QSharedPointer<FolderMetadata> &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;
Expand Down
5 changes: 5 additions & 0 deletions src/libsync/foldermetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/libsync/foldermetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ class OWNCLOUDSYNC_EXPORT FolderMetadata : public QObject

[[nodiscard]] bool isVersion2AndUp() const;

[[nodiscard]] quint64 counter() const;
[[nodiscard]] quint64 newCounter() const;

private:
Expand Down

0 comments on commit 970ebdb

Please sign in to comment.