when migrating older metadata, do not check missing checksum
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Tue, 28 Mar 2023 09:59:24 +0000 (11:59 +0200)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Fri, 31 Mar 2023 15:18:28 +0000 (17:18 +0200)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/clientsideencryption.cpp

index 02128a2c08b04306142d215a7918a661a34e5608..fce72815c334539e30574e0cb4c7510140fad2a8 100644 (file)
@@ -1541,8 +1541,10 @@ void FolderMetadata::setupExistingMetadata(const QByteArray& metadata)
         }
     }
 
+    auto migratedMetadata = false;
     if (_metadataKey.isEmpty()) {
         qCDebug(lcCse()) << "Migrating from v1.1 to v1.2";
+        migratedMetadata = true;
 
         if (metadataKeys.isEmpty()) {
             qCDebug(lcCse()) << "Could not migrate. No metadata keys found!";
@@ -1556,14 +1558,16 @@ void FolderMetadata::setupExistingMetadata(const QByteArray& metadata)
         }
     }
 
+    if (_metadataKey.isEmpty()) {
+        qCDebug(lcCse()) << "Could not setup existing metadata with missing metadataKeys!";
+        return;
+    }
+
     const auto sharing = metadataObj["sharing"].toString().toLocal8Bit();
     const auto files = metaDataDoc.object()["files"].toObject();
     const auto metadataKey = metaDataDoc.object()["metadata"].toObject()["metadataKey"].toString().toUtf8();
     const auto metadataKeyChecksum = metaDataDoc.object()["metadata"].toObject()["checksum"].toString().toUtf8();
 
-    QByteArray sharing = metadataObj["sharing"].toString().toLocal8Bit();
-    QJsonObject files = metaDataDoc.object()["files"].toObject();
-
     _fileDrop = metaDataDoc.object().value("filedrop").toObject();
 
     // Iterate over the document to store the keys. I'm unsure that the keys are in order,
@@ -1610,15 +1614,23 @@ void FolderMetadata::setupExistingMetadata(const QByteArray& metadata)
         file.encryptionKey = QByteArray::fromBase64(decryptedFileObj["key"].toString().toLocal8Bit());
         file.mimetype = decryptedFileObj["mimetype"].toString().toLocal8Bit();
 
-        if (!checkMetadataKeyChecksum(metadataKey, metadataKeyChecksum)) {
-            _metadataKey.clear();
-            _files.clear();
-            return;
+        // In case we wrongly stored "inode/directory" we try to recover from it
+        if (file.mimetype == QByteArrayLiteral("inode/directory")) {
+            file.mimetype = QByteArrayLiteral("httpd/unix-directory");
         }
 
-        // decryption finished, create new metadata key to be used for encryption
-        _metadataKey = EncryptionHelper::generateRandom(metadataKeySize);
-        _isMetadataSetup = true;
+        _files.push_back(file);
+    }
+
+    if (!migratedMetadata && !checkMetadataKeyChecksum(metadataKey, metadataKeyChecksum)) {
+        _metadataKey.clear();
+        _files.clear();
+        return;
+    }
+
+    // decryption finished, create new metadata key to be used for encryption
+    _metadataKey = EncryptionHelper::generateRandom(metadataKeySize);
+    _isMetadataSetup = true;
 }
 
 // RSA/ECB/OAEPWithSHA-256AndMGF1Padding using private / public key.