From 8cce183ba4ce46ddef58751fe5358efdea8d0114 Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Tue, 16 Jul 2024 14:56:20 +0200 Subject: [PATCH 1/4] Check if signature is empty. Signed-off-by: Camila Ayres --- src/libsync/foldermetadata.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/libsync/foldermetadata.cpp b/src/libsync/foldermetadata.cpp index 6536e283f4392..c364df5595aef 100644 --- a/src/libsync/foldermetadata.cpp +++ b/src/libsync/foldermetadata.cpp @@ -181,6 +181,11 @@ void FolderMetadata::setupExistingMetadata(const QByteArray &metadata) } } + if (_initialSignature.isEmpty()) { + qCDebug(lcCseMetadata()) << "Signature is empty"; + return; + } + if (!parseFileDropPart(metaDataDoc)) { qCDebug(lcCseMetadata()) << "Could not parse filedrop part"; return; From 0e218bc5495abd422490b6b3db35ebc29d751e6c Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Tue, 16 Jul 2024 20:29:07 +0200 Subject: [PATCH 2/4] Add test testFolderMetadataWithEmptySignatureDecryptFails. Signed-off-by: Camila Ayres --- test/testclientsideencryptionv2.cpp | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/test/testclientsideencryptionv2.cpp b/test/testclientsideencryptionv2.cpp index 443adad94a687..9b2304d0251b6 100644 --- a/test/testclientsideencryptionv2.cpp +++ b/test/testclientsideencryptionv2.cpp @@ -192,6 +192,41 @@ private slots: QVERIFY(metadataFromJson->isValid()); } + void testFolderMetadataWithEmptySignatureDecryptFails() + { + QScopedPointer metadata(new FolderMetadata(_account, "/", FolderMetadata::FolderType::Root)); + QSignalSpy metadataSetupCompleteSpy(metadata.data(), &FolderMetadata::setupComplete); + metadataSetupCompleteSpy.wait(); + QCOMPARE(metadataSetupCompleteSpy.count(), 1); + QVERIFY(metadata->isValid()); + + const auto encryptedMetadata = metadata->encryptedMetadata(); + QVERIFY(!encryptedMetadata.isEmpty()); + + const auto signature = metadata->metadataSignature(); + QVERIFY(!signature.isEmpty()); + + auto encryptedMetadataCopy = encryptedMetadata; + encryptedMetadataCopy.replace("\"", "\\\""); + + const QJsonDocument ocsDoc = QJsonDocument::fromJson(QStringLiteral("{\"ocs\": {\"data\": {\"meta-data\": \"%1\"}}}") + .arg(QString::fromUtf8(encryptedMetadataCopy)).toUtf8()); + + const QByteArray emptySignature = {}; + QScopedPointer metadataFromJson(new FolderMetadata(_account, "/", + ocsDoc.toJson(), + RootEncryptedFolderInfo::makeDefault(), + emptySignature)); + + QSignalSpy metadataSetupExistingCompleteSpy(metadataFromJson.data(), &FolderMetadata::setupComplete); + metadataSetupExistingCompleteSpy.wait(); + QCOMPARE(metadataSetupExistingCompleteSpy.count(), 1); + + QVERIFY(metadataFromJson->metadataSignature().isEmpty()); + QVERIFY(metadataFromJson->metadataKeyForDecryption().isEmpty()); + QVERIFY(!metadataFromJson->isValid()); + } + void testE2EeFolderMetadataSharing() { // instantiate empty metadata, add a file, and share with a second user "sharee" From ef811ff22058d1ec865f8433a6695cb31c9960ab Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Thu, 26 Sep 2024 19:16:40 +0200 Subject: [PATCH 3/4] Report client status error when signature is empty. Signed-off-by: Camila Ayres --- src/libsync/foldermetadata.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libsync/foldermetadata.cpp b/src/libsync/foldermetadata.cpp index c364df5595aef..f3a21953d341d 100644 --- a/src/libsync/foldermetadata.cpp +++ b/src/libsync/foldermetadata.cpp @@ -183,6 +183,7 @@ void FolderMetadata::setupExistingMetadata(const QByteArray &metadata) if (_initialSignature.isEmpty()) { qCDebug(lcCseMetadata()) << "Signature is empty"; + _account->reportClientStatus(OCC::ClientStatusReportingStatus::E2EeError_GeneralError); return; } From ddaaf2c344b157aac01312b8d908ffde8e17dc11 Mon Sep 17 00:00:00 2001 From: Camila Ayres Date: Mon, 14 Oct 2024 16:36:38 +0200 Subject: [PATCH 4/4] Fail with error before calling folder metada setup when received empty signature. Signed-off-by: Camila Ayres --- src/libsync/discoveryphase.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libsync/discoveryphase.cpp b/src/libsync/discoveryphase.cpp index 0fcfabed9c82e..38e4a424c5a73 100644 --- a/src/libsync/discoveryphase.cpp +++ b/src/libsync/discoveryphase.cpp @@ -696,6 +696,14 @@ void DiscoverySingleDirectoryJob::metadataReceived(const QJsonDocument &json, in } } + if (job->signature().isEmpty()) { + qCDebug(lcDiscovery) << "Initial signature is empty."; + _account->reportClientStatus(OCC::ClientStatusReportingStatus::E2EeError_GeneralError); + emit finished(HttpError{0, tr("Encrypted metadata setup error: initial signature from server is empty.")}); + deleteLater(); + return; + } + const auto e2EeFolderMetadata = new FolderMetadata(_account, _remoteRootFolderPath, statusCode == 404 ? QByteArray{} : json.toJson(QJsonDocument::Compact),