Skip to content

Commit 180ba03

Browse files
authored
Merge pull request #9615 from nextcloud/backport/9544/stable-4.0
[stable-4.0] fix(e2ee): allow read of metadata 1.2 again
2 parents f28aecc + 021a8b9 commit 180ba03

File tree

4 files changed

+33
-19
lines changed

4 files changed

+33
-19
lines changed

src/libsync/discovery.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2290,7 +2290,7 @@ DiscoverySingleDirectoryJob *ProcessDirectoryJob::startAsyncServerQuery()
22902290
const auto alreadyDownloaded = _discoveryData->_statedb->getFileRecord(_dirItem->_file, &record) && record.isValid();
22912291
// we need to make sure we first download all e2ee files/folders before migrating
22922292
_dirItem->_isEncryptedMetadataNeedUpdate = alreadyDownloaded && serverJob->encryptedMetadataNeedUpdate();
2293-
_dirItem->_e2eEncryptionStatus = SyncFileItem::EncryptionStatus::EncryptedMigratedV2_0;
2293+
_dirItem->_e2eEncryptionStatus = serverJob->currentEncryptionStatus();
22942294
_dirItem->_e2eEncryptionStatusRemote = serverJob->currentEncryptionStatus();
22952295
_dirItem->_e2eEncryptionServerCapability = serverJob->requiredEncryptionStatus();
22962296
qCDebug(lcDisco()) << _dirItem->_e2eEncryptionStatus << _dirItem->_e2eEncryptionServerCapability;

src/libsync/discoveryphase.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -645,19 +645,30 @@ void DiscoverySingleDirectoryJob::metadataReceived(const QJsonDocument &json, in
645645
}
646646
}
647647

648-
if (job->signature().isEmpty()) {
649-
qCDebug(lcDiscovery) << "Initial signature is empty.";
650-
_account->reportClientStatus(OCC::ClientStatusReportingStatus::E2EeError_GeneralError);
651-
emit finished(HttpError{0, tr("Encrypted metadata setup error: initial signature from server is empty.")});
652-
deleteLater();
653-
return;
648+
const auto jsonMetadata = statusCode == 404 ? QByteArray{} : json.toJson(QJsonDocument::Compact);
649+
const auto jsonMetadataVersion = FolderMetadata::setupVersionFromExistingMetadata(jsonMetadata);
650+
switch (jsonMetadataVersion) {
651+
case FolderMetadata::MetadataVersion::VersionUndefined:
652+
case FolderMetadata::MetadataVersion::Version1:
653+
case FolderMetadata::MetadataVersion::Version1_2:
654+
break;
655+
case FolderMetadata::MetadataVersion::Version2_0:
656+
case FolderMetadata::MetadataVersion::Version2_1:
657+
if (job->signature().isEmpty()) {
658+
qCDebug(lcDiscovery) << "Initial signature is empty.";
659+
_account->reportClientStatus(OCC::ClientStatusReportingStatus::E2EeError_GeneralError);
660+
emit finished(HttpError{0, tr("Encrypted metadata setup error: initial signature from server is empty.")});
661+
deleteLater();
662+
return;
663+
}
664+
break;
654665
}
655666

656667
const auto e2EeFolderMetadata = new FolderMetadata(_account,
657-
_remoteRootFolderPath,
658-
statusCode == 404 ? QByteArray{} : json.toJson(QJsonDocument::Compact),
659-
RootEncryptedFolderInfo(Utility::fullRemotePathToRemoteSyncRootRelative(topLevelFolderPath, _remoteRootFolderPath)),
660-
job->signature());
668+
_remoteRootFolderPath,
669+
jsonMetadata,
670+
RootEncryptedFolderInfo(Utility::fullRemotePathToRemoteSyncRootRelative(topLevelFolderPath, _remoteRootFolderPath)),
671+
job->signature());
661672
connect(e2EeFolderMetadata, &FolderMetadata::setupComplete, this, [this, e2EeFolderMetadata] {
662673
e2EeFolderMetadata->deleteLater();
663674
if (!e2EeFolderMetadata->isValid()) {

src/libsync/foldermetadata.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ FolderMetadata::FolderMetadata(AccountPtr account,
8080
, _initialSignature(signature)
8181
{
8282
Q_ASSERT(!_remoteFolderRoot.isEmpty());
83-
setupVersionFromExistingMetadata(metadata);
83+
_existingMetadataVersion = setupVersionFromExistingMetadata(metadata);
8484

8585
const auto doc = QJsonDocument::fromJson(metadata);
8686
qCDebug(lcCseMetadata()) << doc.toJson(QJsonDocument::Compact);
@@ -378,8 +378,9 @@ void FolderMetadata::setupExistingMetadataLegacy(const QByteArray &metadata)
378378
_isMetadataValid = true;
379379
}
380380

381-
void FolderMetadata::setupVersionFromExistingMetadata(const QByteArray &metadata)
381+
FolderMetadata::MetadataVersion FolderMetadata::setupVersionFromExistingMetadata(const QByteArray &metadata)
382382
{
383+
auto resultVersion = FolderMetadata::MetadataVersion{};
383384
const auto &doc = QJsonDocument::fromJson(metadata);
384385
const auto &metaDataStr = metadataStringFromOCsDocument(doc);
385386
const auto &metaDataDoc = QJsonDocument::fromJson(metaDataStr.toLocal8Bit()).object();
@@ -407,17 +408,19 @@ void FolderMetadata::setupVersionFromExistingMetadata(const QByteArray &metadata
407408
}
408409

409410
if (versionStringFromMetadata == QStringLiteral("1.2")) {
410-
_existingMetadataVersion = MetadataVersion::Version1_2;
411+
resultVersion = MetadataVersion::Version1_2;
411412
} else if (versionStringFromMetadata == QStringLiteral("2.0") || versionStringFromMetadata == QStringLiteral("2")) {
412-
_existingMetadataVersion = MetadataVersion::Version2_0;
413+
resultVersion = MetadataVersion::Version2_0;
413414
} else if (versionStringFromMetadata == QStringLiteral("2.1")) {
414-
_existingMetadataVersion = MetadataVersion::Version2_1;
415+
resultVersion = MetadataVersion::Version2_1;
415416
} else if (versionStringFromMetadata == QStringLiteral("1.0")
416417
|| versionStringFromMetadata == QStringLiteral("1.1")) {
417418
// We used to have an intermediate 1.1 after applying a security-vulnerability fix for metadata keys.
418419
// It should be treated as MetadataVersion::Version1, as we don't want to change logic related to 1.2, since 1.1 is an edge case.
419-
_existingMetadataVersion = MetadataVersion::Version1;
420+
resultVersion = MetadataVersion::Version1;
420421
}
422+
423+
return resultVersion;
421424
}
422425

423426
void FolderMetadata::emitSetupComplete()

src/libsync/foldermetadata.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ class OWNCLOUDSYNC_EXPORT FolderMetadata : public QObject
143143

144144
void updateSelfCertificate();
145145

146+
static MetadataVersion setupVersionFromExistingMetadata(const QByteArray &metadata);
147+
146148
public slots:
147149
void addEncryptedFile(const FolderMetadata::EncryptedFile &f);
148150
void removeEncryptedFile(const FolderMetadata::EncryptedFile &f);
@@ -188,8 +190,6 @@ private slots:
188190
void setupExistingMetadata(const QByteArray &metadata);
189191
void setupExistingMetadataLegacy(const QByteArray &metadata);
190192

191-
void setupVersionFromExistingMetadata(const QByteArray &metadata);
192-
193193
void startFetchRootE2eeFolderMetadata(const QString &path);
194194
void slotRootE2eeFolderMetadataReceived(int statusCode, const QString &message);
195195

0 commit comments

Comments
 (0)