Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/desktop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@nextcloud.com>2020-10-21 11:16:14 +0300
committerGitHub <noreply@github.com>2020-10-21 11:16:14 +0300
commit60da0cee25fe0ae03039c479c8e207ab36d65a77 (patch)
tree35484b5aa5824fbb5d27ccb2af54025b7eee2dfd
parent65b90f4bb1c05aad13bd10e73df8ee6a4ed48654 (diff)
parent10cb4170c7354c919a415f1082cf7bb0618ef988 (diff)
Merge pull request #2572 from nextcloud/avoid_depth_infinity_propfind_for_e2ee
Avoid depth infinity propfind for e2ee
-rw-r--r--src/libsync/clientsideencryption.cpp60
-rw-r--r--src/libsync/clientsideencryption.h4
-rw-r--r--src/libsync/clientsideencryptionjobs.cpp7
-rw-r--r--src/libsync/clientsideencryptionjobs.h2
4 files changed, 60 insertions, 13 deletions
diff --git a/src/libsync/clientsideencryption.cpp b/src/libsync/clientsideencryption.cpp
index 7d6c0ef45..134a83425 100644
--- a/src/libsync/clientsideencryption.cpp
+++ b/src/libsync/clientsideencryption.cpp
@@ -1241,29 +1241,65 @@ void ClientSideEncryption::getPublicKeyFromServer()
job->start();
}
-void ClientSideEncryption::fetchFolderEncryptedStatus() {
- _refreshingEncryptionStatus = true;
- auto getEncryptedStatus = new GetFolderEncryptStatusJob(_account, QString());
+void ClientSideEncryption::scheduleFolderEncryptedStatusJob(const QString &path)
+{
+ auto getEncryptedStatus = new GetFolderEncryptStatusJob(_account, path, this);
connect(getEncryptedStatus, &GetFolderEncryptStatusJob::encryptStatusReceived,
- this, &ClientSideEncryption::folderEncryptedStatusFetched);
+ this, &ClientSideEncryption::folderEncryptedStatusFetched);
connect(getEncryptedStatus, &GetFolderEncryptStatusJob::encryptStatusError,
- this, &ClientSideEncryption::folderEncryptedStatusError);
+ this, &ClientSideEncryption::folderEncryptedStatusError);
getEncryptedStatus->start();
+
+ _folderStatusJobs.append(getEncryptedStatus);
+}
+
+void ClientSideEncryption::fetchFolderEncryptedStatus()
+{
+ _refreshingEncryptionStatus = true;
+ _folder2encryptedStatus.clear();
+ scheduleFolderEncryptedStatusJob(QString());
}
void ClientSideEncryption::folderEncryptedStatusFetched(const QHash<QString, bool>& result)
{
- _refreshingEncryptionStatus = false;
- _folder2encryptedStatus = result;
- qCDebug(lcCse) << "Retrieved correctly the encrypted status of the folders." << result;
- emit folderEncryptedStatusFetchDone(result);
+ auto job = static_cast<GetFolderEncryptStatusJob *>(sender());
+ Q_ASSERT(job);
+
+ _folderStatusJobs.removeAll(job);
+
+ qCDebug(lcCse) << "Retrieved correctly the encrypted status of the folders for" << job->folder() << result;
+
+ // FIXME: Can be replaced by _folder2encryptedStatus.insert(result); once we depend on Qt 5.15
+ for (auto it = result.constKeyValueBegin(); it != result.constKeyValueEnd(); ++it) {
+ _folder2encryptedStatus.insert((*it).first, (*it).second);
+ }
+
+ for (const auto &folder : result.keys()) {
+ if (folder == job->folder()) {
+ continue;
+ }
+ scheduleFolderEncryptedStatusJob(folder);
+ }
+
+ if (_folderStatusJobs.isEmpty()) {
+ _refreshingEncryptionStatus = false;
+ emit folderEncryptedStatusFetchDone(_folder2encryptedStatus);
+ }
}
void ClientSideEncryption::folderEncryptedStatusError(int error)
{
- _refreshingEncryptionStatus = false;
- qCDebug(lcCse) << "Failed to retrieve the status of the folders." << error;
- emit folderEncryptedStatusFetchDone({});
+ auto job = static_cast<GetFolderEncryptStatusJob *>(sender());
+ Q_ASSERT(job);
+
+ qCDebug(lcCse) << "Failed to retrieve the status of the folders for" << job->folder() << error;
+
+ _folderStatusJobs.removeAll(job);
+
+ if (_folderStatusJobs.isEmpty()) {
+ _refreshingEncryptionStatus = false;
+ emit folderEncryptedStatusFetchDone(_folder2encryptedStatus);
+ }
}
FolderMetadata::FolderMetadata(AccountPtr account, const QByteArray& metadata, int statusCode) : _account(account)
diff --git a/src/libsync/clientsideencryption.h b/src/libsync/clientsideencryption.h
index 13ec98043..355e96535 100644
--- a/src/libsync/clientsideencryption.h
+++ b/src/libsync/clientsideencryption.h
@@ -23,6 +23,8 @@ class ReadPasswordJob;
namespace OCC {
+class GetFolderEncryptStatusJob;
+
QString baseUrl();
namespace EncryptionHelper {
@@ -109,6 +111,7 @@ signals:
void folderEncryptedStatusFetchDone(const QHash<QString, bool> &values);
private:
+ void scheduleFolderEncryptedStatusJob(const QString &path);
void getPrivateKeyFromServer();
void getPublicKeyFromServer();
void decryptPrivateKey(const QByteArray &key);
@@ -125,6 +128,7 @@ private:
//TODO: Save this on disk.
QHash<QByteArray, QByteArray> _folder2token;
QHash<QString, bool> _folder2encryptedStatus;
+ QVector<GetFolderEncryptStatusJob*> _folderStatusJobs;
public:
//QSslKey _privateKey;
diff --git a/src/libsync/clientsideencryptionjobs.cpp b/src/libsync/clientsideencryptionjobs.cpp
index 6ff8f4dce..505bd99f5 100644
--- a/src/libsync/clientsideencryptionjobs.cpp
+++ b/src/libsync/clientsideencryptionjobs.cpp
@@ -29,13 +29,18 @@ GetFolderEncryptStatusJob::GetFolderEncryptStatusJob(const AccountPtr& account,
{
}
+QString GetFolderEncryptStatusJob::folder() const
+{
+ return _folder;
+}
+
void GetFolderEncryptStatusJob::start()
{
QNetworkRequest req;
req.setPriority(QNetworkRequest::HighPriority);
req.setRawHeader("OCS-APIREQUEST", "true");
req.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral("application/xml"));
- req.setRawHeader("Depth", "infinity");
+ req.setRawHeader("Depth", "1");
QByteArray xml = R"(<d:propfind xmlns:d="DAV:"> <d:prop xmlns:nc="http://nextcloud.org/ns"> <nc:is-encrypted/> </d:prop> </d:propfind>)";
auto *buf = new QBuffer(this);
diff --git a/src/libsync/clientsideencryptionjobs.h b/src/libsync/clientsideencryptionjobs.h
index 9a375ff92..4a78db8c7 100644
--- a/src/libsync/clientsideencryptionjobs.h
+++ b/src/libsync/clientsideencryptionjobs.h
@@ -286,6 +286,8 @@ class OWNCLOUDSYNC_EXPORT GetFolderEncryptStatusJob : public AbstractNetworkJob
public:
explicit GetFolderEncryptStatusJob (const AccountPtr &account, const QString& folder, QObject *parent = nullptr);
+ QString folder() const;
+
public slots:
void start() override;