diff options
author | Kevin Ottens <kevin.ottens@nextcloud.com> | 2020-10-21 11:16:14 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-21 11:16:14 +0300 |
commit | 60da0cee25fe0ae03039c479c8e207ab36d65a77 (patch) | |
tree | 35484b5aa5824fbb5d27ccb2af54025b7eee2dfd | |
parent | 65b90f4bb1c05aad13bd10e73df8ee6a4ed48654 (diff) | |
parent | 10cb4170c7354c919a415f1082cf7bb0618ef988 (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.cpp | 60 | ||||
-rw-r--r-- | src/libsync/clientsideencryption.h | 4 | ||||
-rw-r--r-- | src/libsync/clientsideencryptionjobs.cpp | 7 | ||||
-rw-r--r-- | src/libsync/clientsideencryptionjobs.h | 2 |
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; |