Merge pull request #7333 from nextcloud/bugfix/signature

Bugfix/signature
This commit is contained in:
Matthieu Gallien 2024-10-16 15:22:21 +02:00 коммит произвёл GitHub
Родитель e02cf85201 ddaaf2c344
Коммит 97539218e6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
3 изменённых файлов: 49 добавлений и 0 удалений

Просмотреть файл

@ -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, const auto e2EeFolderMetadata = new FolderMetadata(_account,
_remoteRootFolderPath, _remoteRootFolderPath,
statusCode == 404 ? QByteArray{} : json.toJson(QJsonDocument::Compact), statusCode == 404 ? QByteArray{} : json.toJson(QJsonDocument::Compact),

Просмотреть файл

@ -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)) { if (!parseFileDropPart(metaDataDoc)) {
qCDebug(lcCseMetadata()) << "Could not parse filedrop part"; qCDebug(lcCseMetadata()) << "Could not parse filedrop part";
return; return;

Просмотреть файл

@ -192,6 +192,41 @@ private slots:
QVERIFY(metadataFromJson->isValid()); QVERIFY(metadataFromJson->isValid());
} }
void testFolderMetadataWithEmptySignatureDecryptFails()
{
QScopedPointer<FolderMetadata> 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<FolderMetadata> 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() void testE2EeFolderMetadataSharing()
{ {
// instantiate empty metadata, add a file, and share with a second user "sharee" // instantiate empty metadata, add a file, and share with a second user "sharee"