diff --git a/src/libsync/discoveryphase.cpp b/src/libsync/discoveryphase.cpp index 142b4470d9eaf..cb7674ab40f0e 100644 --- a/src/libsync/discoveryphase.cpp +++ b/src/libsync/discoveryphase.cpp @@ -695,6 +695,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), diff --git a/src/libsync/foldermetadata.cpp b/src/libsync/foldermetadata.cpp index 4374093325244..ba3294ed518d9 100644 --- a/src/libsync/foldermetadata.cpp +++ b/src/libsync/foldermetadata.cpp @@ -181,6 +181,12 @@ void FolderMetadata::setupExistingMetadata(const QByteArray &metadata) } } + if (_initialSignature.isEmpty()) { + qCDebug(lcCseMetadata()) << "Signature is empty"; + _account->reportClientStatus(OCC::ClientStatusReportingStatus::E2EeError_GeneralError); + return; + } + if (!parseFileDropPart(metaDataDoc)) { qCDebug(lcCseMetadata()) << "Could not parse filedrop part"; return; diff --git a/test/testclientsideencryptionv2.cpp b/test/testclientsideencryptionv2.cpp index 3aa3066de02f8..a8d8be646c805 100644 --- a/test/testclientsideencryptionv2.cpp +++ b/test/testclientsideencryptionv2.cpp @@ -187,6 +187,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"