Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/libsync/discovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2290,7 +2290,7 @@ DiscoverySingleDirectoryJob *ProcessDirectoryJob::startAsyncServerQuery()
const auto alreadyDownloaded = _discoveryData->_statedb->getFileRecord(_dirItem->_file, &record) && record.isValid();
// we need to make sure we first download all e2ee files/folders before migrating
_dirItem->_isEncryptedMetadataNeedUpdate = alreadyDownloaded && serverJob->encryptedMetadataNeedUpdate();
_dirItem->_e2eEncryptionStatus = SyncFileItem::EncryptionStatus::EncryptedMigratedV2_0;
_dirItem->_e2eEncryptionStatus = serverJob->currentEncryptionStatus();
_dirItem->_e2eEncryptionStatusRemote = serverJob->currentEncryptionStatus();
_dirItem->_e2eEncryptionServerCapability = serverJob->requiredEncryptionStatus();
qCDebug(lcDisco()) << _dirItem->_e2eEncryptionStatus << _dirItem->_e2eEncryptionServerCapability;
Expand Down
31 changes: 21 additions & 10 deletions src/libsync/discoveryphase.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
/*
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2014 ownCloud GmbH
Expand Down Expand Up @@ -645,19 +645,30 @@
}
}

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 jsonMetadata = statusCode == 404 ? QByteArray{} : json.toJson(QJsonDocument::Compact);
const auto jsonMetadataVersion = FolderMetadata::setupVersionFromExistingMetadata(jsonMetadata);
switch (jsonMetadataVersion) {
case FolderMetadata::MetadataVersion::VersionUndefined:
case FolderMetadata::MetadataVersion::Version1:
case FolderMetadata::MetadataVersion::Version1_2:
break;
case FolderMetadata::MetadataVersion::Version2_0:
case FolderMetadata::MetadataVersion::Version2_1:
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.")});

Check warning on line 660 in src/libsync/discoveryphase.cpp

View workflow job for this annotation

GitHub Actions / build

src/libsync/discoveryphase.cpp:660:18 [cppcoreguidelines-init-variables]

variable 'finished' is not initialized
deleteLater();
return;
}
break;
}

const auto e2EeFolderMetadata = new FolderMetadata(_account,
_remoteRootFolderPath,
statusCode == 404 ? QByteArray{} : json.toJson(QJsonDocument::Compact),
RootEncryptedFolderInfo(Utility::fullRemotePathToRemoteSyncRootRelative(topLevelFolderPath, _remoteRootFolderPath)),
job->signature());
_remoteRootFolderPath,
jsonMetadata,
RootEncryptedFolderInfo(Utility::fullRemotePathToRemoteSyncRootRelative(topLevelFolderPath, _remoteRootFolderPath)),
job->signature());
connect(e2EeFolderMetadata, &FolderMetadata::setupComplete, this, [this, e2EeFolderMetadata] {
e2EeFolderMetadata->deleteLater();
if (!e2EeFolderMetadata->isValid()) {
Expand Down
15 changes: 9 additions & 6 deletions src/libsync/foldermetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ FolderMetadata::FolderMetadata(AccountPtr account,
, _initialSignature(signature)
{
Q_ASSERT(!_remoteFolderRoot.isEmpty());
setupVersionFromExistingMetadata(metadata);
_existingMetadataVersion = setupVersionFromExistingMetadata(metadata);

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

void FolderMetadata::setupVersionFromExistingMetadata(const QByteArray &metadata)
FolderMetadata::MetadataVersion FolderMetadata::setupVersionFromExistingMetadata(const QByteArray &metadata)
{
auto resultVersion = FolderMetadata::MetadataVersion{};
const auto &doc = QJsonDocument::fromJson(metadata);
const auto &metaDataStr = metadataStringFromOCsDocument(doc);
const auto &metaDataDoc = QJsonDocument::fromJson(metaDataStr.toLocal8Bit()).object();
Expand Down Expand Up @@ -407,17 +408,19 @@ void FolderMetadata::setupVersionFromExistingMetadata(const QByteArray &metadata
}

if (versionStringFromMetadata == QStringLiteral("1.2")) {
_existingMetadataVersion = MetadataVersion::Version1_2;
resultVersion = MetadataVersion::Version1_2;
} else if (versionStringFromMetadata == QStringLiteral("2.0") || versionStringFromMetadata == QStringLiteral("2")) {
_existingMetadataVersion = MetadataVersion::Version2_0;
resultVersion = MetadataVersion::Version2_0;
} else if (versionStringFromMetadata == QStringLiteral("2.1")) {
_existingMetadataVersion = MetadataVersion::Version2_1;
resultVersion = MetadataVersion::Version2_1;
} else if (versionStringFromMetadata == QStringLiteral("1.0")
|| versionStringFromMetadata == QStringLiteral("1.1")) {
// We used to have an intermediate 1.1 after applying a security-vulnerability fix for metadata keys.
// 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.
_existingMetadataVersion = MetadataVersion::Version1;
resultVersion = MetadataVersion::Version1;
}

return resultVersion;
}

void FolderMetadata::emitSetupComplete()
Expand Down
4 changes: 2 additions & 2 deletions src/libsync/foldermetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ class OWNCLOUDSYNC_EXPORT FolderMetadata : public QObject

void updateSelfCertificate();

static MetadataVersion setupVersionFromExistingMetadata(const QByteArray &metadata);

public slots:
void addEncryptedFile(const FolderMetadata::EncryptedFile &f);
void removeEncryptedFile(const FolderMetadata::EncryptedFile &f);
Expand Down Expand Up @@ -188,8 +190,6 @@ private slots:
void setupExistingMetadata(const QByteArray &metadata);
void setupExistingMetadataLegacy(const QByteArray &metadata);

void setupVersionFromExistingMetadata(const QByteArray &metadata);

void startFetchRootE2eeFolderMetadata(const QString &path);
void slotRootE2eeFolderMetadataReceived(int statusCode, const QString &message);

Expand Down
Loading