Skip to content

Commit

Permalink
Renamed AbstractPropagateRemoteDeleteEncrypted to BasePropagateRemote…
Browse files Browse the repository at this point in the history
…DeleteEncrypted.

Signed-off-by: alex-z <[email protected]>
  • Loading branch information
allexzander committed Jun 19, 2023
1 parent 308ea38 commit be21c37
Show file tree
Hide file tree
Showing 10 changed files with 211 additions and 32 deletions.
4 changes: 2 additions & 2 deletions src/libsync/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ set(libsync_SRCS
owncloudpropagator.cpp
nextcloudtheme.h
nextcloudtheme.cpp
abstractpropagateremotedeleteencrypted.h
abstractpropagateremotedeleteencrypted.cpp
basepropagateremotedeleteencrypted.h
basepropagateremotedeleteencrypted.cpp
deletejob.h
deletejob.cpp
progressdispatcher.h
Expand Down
30 changes: 15 additions & 15 deletions src/libsync/abstractpropagateremotedeleteencrypted.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#include <QFileInfo>
#include <QLoggingCategory>

#include "abstractpropagateremotedeleteencrypted.h"
#include "basepropagateremotedeleteencrypted.h"
#include "account.h"
#include "clientsideencryptionjobs.h"
#include "deletejob.h"
Expand All @@ -25,37 +25,37 @@ Q_LOGGING_CATEGORY(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED, "nextcloud.sync.propagat

namespace OCC {

AbstractPropagateRemoteDeleteEncrypted::AbstractPropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent)
BasePropagateRemoteDeleteEncrypted::BasePropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent)
: QObject(parent)
, _propagator(propagator)
, _item(item)
{}

QNetworkReply::NetworkError AbstractPropagateRemoteDeleteEncrypted::networkError() const
QNetworkReply::NetworkError BasePropagateRemoteDeleteEncrypted::networkError() const
{
return _networkError;
}

QString AbstractPropagateRemoteDeleteEncrypted::errorString() const
QString BasePropagateRemoteDeleteEncrypted::errorString() const
{
return _errorString;
}

void AbstractPropagateRemoteDeleteEncrypted::storeFirstError(QNetworkReply::NetworkError err)
void BasePropagateRemoteDeleteEncrypted::storeFirstError(QNetworkReply::NetworkError err)
{
if (_networkError == QNetworkReply::NetworkError::NoError) {
_networkError = err;
}
}

void AbstractPropagateRemoteDeleteEncrypted::storeFirstErrorString(const QString &errString)
void BasePropagateRemoteDeleteEncrypted::storeFirstErrorString(const QString &errString)
{
if (_errorString.isEmpty()) {
_errorString = errString;
}
}

void AbstractPropagateRemoteDeleteEncrypted::fetchMetadataForPath(const QString &path)
void BasePropagateRemoteDeleteEncrypted::fetchMetadataForPath(const QString &path)
{
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Folder is encrypted, let's its metadata.";
_fullFolderRemotePath = _propagator->fullRemotePath(path);
Expand All @@ -74,11 +74,11 @@ void AbstractPropagateRemoteDeleteEncrypted::fetchMetadataForPath(const QString
connect(_fetchAndUploadE2eeFolderMetadataJob.data(),
&FetchAndUploadE2eeFolderMetadataJob::fetchFinished,
this,
&AbstractPropagateRemoteDeleteEncrypted::slotFetchMetadataJobFinished);
&BasePropagateRemoteDeleteEncrypted::slotFetchMetadataJobFinished);

}

void AbstractPropagateRemoteDeleteEncrypted::slotFolderUnLockFinished(const QByteArray &folderId, int statusCode)
void BasePropagateRemoteDeleteEncrypted::slotFolderUnLockFinished(const QByteArray &folderId, int statusCode)
{
if (statusCode != 200) {
_item->_httpErrorCode = statusCode;
Expand All @@ -90,7 +90,7 @@ void AbstractPropagateRemoteDeleteEncrypted::slotFolderUnLockFinished(const QByt
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Folder id" << folderId << "successfully unlocked";
}

void AbstractPropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished()
void BasePropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished()
{
auto *deleteJob = qobject_cast<DeleteJob *>(QObject::sender());

Expand Down Expand Up @@ -140,19 +140,19 @@ void AbstractPropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished()
unlockFolder(true);
}

void AbstractPropagateRemoteDeleteEncrypted::deleteRemoteItem(const QString &filename)
void BasePropagateRemoteDeleteEncrypted::deleteRemoteItem(const QString &filename)
{
qCInfo(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Deleting nested encrypted item" << filename;

auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), this);
deleteJob->setFolderToken(_fetchAndUploadE2eeFolderMetadataJob->folderToken());

connect(deleteJob, &DeleteJob::finishedSignal, this, &AbstractPropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished);
connect(deleteJob, &DeleteJob::finishedSignal, this, &BasePropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished);

deleteJob->start();
}

void AbstractPropagateRemoteDeleteEncrypted::unlockFolder(bool success)
void BasePropagateRemoteDeleteEncrypted::unlockFolder(bool success)
{
if (!_fetchAndUploadE2eeFolderMetadataJob->isFolderLocked()) {
emit finished(true);
Expand All @@ -161,11 +161,11 @@ void AbstractPropagateRemoteDeleteEncrypted::unlockFolder(bool success)

qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Unlocking folder" << _fetchAndUploadE2eeFolderMetadataJob->folderId();

connect(_fetchAndUploadE2eeFolderMetadataJob.data(), &FetchAndUploadE2eeFolderMetadataJob::folderUnlocked, this, &AbstractPropagateRemoteDeleteEncrypted::slotFolderUnLockFinished);
connect(_fetchAndUploadE2eeFolderMetadataJob.data(), &FetchAndUploadE2eeFolderMetadataJob::folderUnlocked, this, &BasePropagateRemoteDeleteEncrypted::slotFolderUnLockFinished);
_fetchAndUploadE2eeFolderMetadataJob->unlockFolder(success);
}

void AbstractPropagateRemoteDeleteEncrypted::taskFailed()
void BasePropagateRemoteDeleteEncrypted::taskFailed()
{
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Task failed for job" << sender();
_isTaskFailed = true;
Expand Down
179 changes: 179 additions & 0 deletions src/libsync/basepropagateremotedeleteencrypted.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
/*
* Copyright (C) by Oleksandr Zolotov <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/

#include <QFileInfo>
#include <QLoggingCategory>

#include "BasePropagateRemoteDeleteEncrypted.h"
#include "account.h"
#include "clientsideencryptionjobs.h"
#include "deletejob.h"
#include "owncloudpropagator.h"

Q_LOGGING_CATEGORY(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED, "nextcloud.sync.propagator.remove.encrypted")

namespace OCC {

BasePropagateRemoteDeleteEncrypted::BasePropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent)
: QObject(parent)
, _propagator(propagator)
, _item(item)
{}

QNetworkReply::NetworkError BasePropagateRemoteDeleteEncrypted::networkError() const
{
return _networkError;
}

QString BasePropagateRemoteDeleteEncrypted::errorString() const
{
return _errorString;
}

void BasePropagateRemoteDeleteEncrypted::storeFirstError(QNetworkReply::NetworkError err)
{
if (_networkError == QNetworkReply::NetworkError::NoError) {
_networkError = err;
}
}

void BasePropagateRemoteDeleteEncrypted::storeFirstErrorString(const QString &errString)
{
if (_errorString.isEmpty()) {
_errorString = errString;
}
}

void BasePropagateRemoteDeleteEncrypted::fetchMetadataForPath(const QString &path)
{
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Folder is encrypted, let's its metadata.";
_fullFolderRemotePath = _propagator->fullRemotePath(path);

SyncJournalFileRecord rec;
if (!_propagator->_journal->getRootE2eFolderRecord(_fullFolderRemotePath, &rec) || !rec.isValid()) {
taskFailed();
return;
}

_fetchAndUploadE2eeFolderMetadataJob.reset(new FetchAndUploadE2eeFolderMetadataJob(_propagator->account(),
_fullFolderRemotePath,
_propagator->_journal,
rec.path(), _fullFolderRemotePath));

connect(_fetchAndUploadE2eeFolderMetadataJob.data(),
&FetchAndUploadE2eeFolderMetadataJob::fetchFinished,
this,
&BasePropagateRemoteDeleteEncrypted::slotFetchMetadataJobFinished);

}

void BasePropagateRemoteDeleteEncrypted::slotFolderUnLockFinished(const QByteArray &folderId, int statusCode)
{
if (statusCode != 200) {
_item->_httpErrorCode = statusCode;
_errorString = tr("\"%1 Failed to unlock encrypted folder %2\".").arg(statusCode).arg(QString::fromUtf8(folderId));
_item->_errorString = _errorString;
taskFailed();
return;
}
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Folder id" << folderId << "successfully unlocked";
}

void BasePropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished()
{
auto *deleteJob = qobject_cast<DeleteJob *>(QObject::sender());

Q_ASSERT(deleteJob);

if (!deleteJob) {
qCCritical(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Sender is not a DeleteJob instance.";
taskFailed();
return;
}

const auto err = deleteJob->reply()->error();

_item->_httpErrorCode = deleteJob->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
_item->_responseTimeStamp = deleteJob->responseTimestamp();
_item->_requestId = deleteJob->requestId();

if (err != QNetworkReply::NoError && err != QNetworkReply::ContentNotFoundError) {
storeFirstErrorString(deleteJob->errorString());
storeFirstError(err);

taskFailed();
return;
}

// A 404 reply is also considered a success here: We want to make sure
// a file is gone from the server. It not being there in the first place
// is ok. This will happen for files that are in the DB but not on
// the server or the local file system.
if (_item->_httpErrorCode != 204 && _item->_httpErrorCode != 404) {
// Normally we expect "204 No Content"
// If it is not the case, it might be because of a proxy or gateway intercepting the request, so we must
// throw an error.
storeFirstErrorString(tr("Wrong HTTP code returned by server. Expected 204, but received \"%1 %2\".")
.arg(_item->_httpErrorCode)
.arg(deleteJob->reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()));

taskFailed();
return;
}

if (!_propagator->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory())) {
qCWarning(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Failed to delete file record from local DB" << _item->_originalFile;
}
_propagator->_journal->commit("Remote Remove");

unlockFolder(true);
}

void BasePropagateRemoteDeleteEncrypted::deleteRemoteItem(const QString &filename)
{
qCInfo(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Deleting nested encrypted item" << filename;

auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), this);
deleteJob->setFolderToken(_fetchAndUploadE2eeFolderMetadataJob->folderToken());

connect(deleteJob, &DeleteJob::finishedSignal, this, &BasePropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished);

deleteJob->start();
}

void BasePropagateRemoteDeleteEncrypted::unlockFolder(bool success)
{
if (!_fetchAndUploadE2eeFolderMetadataJob->isFolderLocked()) {
emit finished(true);
return;
}

qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Unlocking folder" << _fetchAndUploadE2eeFolderMetadataJob->folderId();

connect(_fetchAndUploadE2eeFolderMetadataJob.data(), &FetchAndUploadE2eeFolderMetadataJob::folderUnlocked, this, &BasePropagateRemoteDeleteEncrypted::slotFolderUnLockFinished);
_fetchAndUploadE2eeFolderMetadataJob->unlockFolder(success);
}

void BasePropagateRemoteDeleteEncrypted::taskFailed()
{
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Task failed for job" << sender();
_isTaskFailed = true;
if (_fetchAndUploadE2eeFolderMetadataJob->isFolderLocked()) {
unlockFolder(false);
} else {
emit finished(false);
}
}

} // namespace OCC
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ namespace OCC {

class OwncloudPropagator;
/**
* @brief The AbstractPropagateRemoteDeleteEncrypted class is the base class for Propagate Remote Delete Encrypted jobs
* @brief The BasePropagateRemoteDeleteEncrypted class is the base class for Propagate Remote Delete Encrypted jobs
* @ingroup libsync
*/
class AbstractPropagateRemoteDeleteEncrypted : public QObject
class BasePropagateRemoteDeleteEncrypted : public QObject
{
Q_OBJECT
public:
AbstractPropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent);
~AbstractPropagateRemoteDeleteEncrypted() override = default;
BasePropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent);
~BasePropagateRemoteDeleteEncrypted() override = default;

[[nodiscard]] QNetworkReply::NetworkError networkError() const;
[[nodiscard]] QString errorString() const;
Expand Down
2 changes: 1 addition & 1 deletion src/libsync/propagateremotedelete.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ void PropagateRemoteDelete::start()
} else {
_deleteEncryptedHelper = new PropagateRemoteDeleteEncryptedRootFolder(propagator(), _item, this);
}
connect(_deleteEncryptedHelper, &AbstractPropagateRemoteDeleteEncrypted::finished, this, [this] (bool success) {
connect(_deleteEncryptedHelper, &BasePropagateRemoteDeleteEncrypted::finished, this, [this] (bool success) {
if (!success) {
SyncFileItem::Status status = SyncFileItem::NormalError;
if (_deleteEncryptedHelper->networkError() != QNetworkReply::NoError && _deleteEncryptedHelper->networkError() != QNetworkReply::ContentNotFoundError) {
Expand Down
4 changes: 2 additions & 2 deletions src/libsync/propagateremotedelete.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace OCC {

class DeleteJob;

class AbstractPropagateRemoteDeleteEncrypted;
class BasePropagateRemoteDeleteEncrypted;

/**
* @brief The PropagateRemoteDelete class
Expand All @@ -30,7 +30,7 @@ class PropagateRemoteDelete : public PropagateItemJob
{
Q_OBJECT
QPointer<DeleteJob> _job;
AbstractPropagateRemoteDeleteEncrypted *_deleteEncryptedHelper = nullptr;
BasePropagateRemoteDeleteEncrypted *_deleteEncryptedHelper = nullptr;

public:
PropagateRemoteDelete(OwncloudPropagator *propagator, const SyncFileItemPtr &item)
Expand Down
4 changes: 2 additions & 2 deletions src/libsync/propagateremotedeleteencrypted.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ using namespace OCC;
Q_LOGGING_CATEGORY(PROPAGATE_REMOVE_ENCRYPTED, "nextcloud.sync.propagator.remove.encrypted")

PropagateRemoteDeleteEncrypted::PropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent)
: AbstractPropagateRemoteDeleteEncrypted(propagator, item, parent)
: BasePropagateRemoteDeleteEncrypted(propagator, item, parent)
{

}
Expand All @@ -40,7 +40,7 @@ void PropagateRemoteDeleteEncrypted::start()

void PropagateRemoteDeleteEncrypted::slotFolderUnLockFinished(const QByteArray &folderId, int statusCode)
{
AbstractPropagateRemoteDeleteEncrypted::slotFolderUnLockFinished(folderId, statusCode);
BasePropagateRemoteDeleteEncrypted::slotFolderUnLockFinished(folderId, statusCode);
emit finished(!_isTaskFailed);
}

Expand Down
4 changes: 2 additions & 2 deletions src/libsync/propagateremotedeleteencrypted.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@

#pragma once

#include "abstractpropagateremotedeleteencrypted.h"
#include "basepropagateremotedeleteencrypted.h"

namespace OCC {

class PropagateRemoteDeleteEncrypted : public AbstractPropagateRemoteDeleteEncrypted
class PropagateRemoteDeleteEncrypted : public BasePropagateRemoteDeleteEncrypted
{
Q_OBJECT
public:
Expand Down
Loading

0 comments on commit be21c37

Please sign in to comment.