allow to read v1.2 from buggy v3.8.0 client
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Thu, 6 Apr 2023 09:49:02 +0000 (11:49 +0200)
committerMatthieu Gallien <matthieu_gallien@yahoo.fr>
Wed, 12 Apr 2023 13:46:51 +0000 (15:46 +0200)
will consider v1.2 stored encryption status in DB to be equivalent to v1
due to bugs in the v3.8.0 release

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/common/syncjournalfilerecord.h
src/csync/csync.h
src/libsync/discovery.cpp
src/libsync/syncfileitem.cpp
src/libsync/syncfileitem.h

index 195956f6b50511ea944067bc034b9c13a570b4c1..694a34cfbcfbe421b35c4754374f63ce9303e3a3 100644 (file)
@@ -53,11 +53,7 @@ public:
         return !_path.isEmpty();
     }
 
-    enum class EncryptionStatus : int {
-        NotEncrypted = 0,
-        Encrypted = 1,
-        EncryptedMigratedV1_2 = 2,
-    };
+    using EncryptionStatus = EncryptionStatusEnums::JournalDbEncryptionStatus;
 
     /** Returns the numeric part of the full id in _fileId.
      *
@@ -73,7 +69,7 @@ public:
     [[nodiscard]] bool isVirtualFile() const { return _type == ItemTypeVirtualFile || _type == ItemTypeVirtualFileDownload; }
     [[nodiscard]] QString path() const { return QString::fromUtf8(_path); }
     [[nodiscard]] QString e2eMangledName() const { return QString::fromUtf8(_e2eMangledName); }
-    [[nodiscard]] bool isE2eEncrypted() const { return _e2eEncryptionStatus != SyncJournalFileRecord::EncryptionStatus::NotEncrypted; }
+    [[nodiscard]] bool isE2eEncrypted() const { return _e2eEncryptionStatus != EncryptionStatus::NotEncrypted; }
 
     QByteArray _path;
     quint64 _inode = 0;
index 9c4b2580c0c995a3a4c4cf6a0826b45004da27c0..d24915422bbae93049279e65da6d1aa625776cfe 100644 (file)
 
 namespace OCC {
 class SyncJournalFileRecord;
+
+namespace EncryptionStatusEnums {
+
+Q_NAMESPACE
+
+enum class ItemEncryptionStatus : int {
+    NotEncrypted = 0,
+    Encrypted = 1,
+    EncryptedMigratedV1_2 = 2,
+};
+
+Q_ENUM_NS(ItemEncryptionStatus)
+
+enum class JournalDbEncryptionStatus : int {
+    NotEncrypted = 0,
+    Encrypted = 1,
+    EncryptedMigratedV1_2Invalid = 2,
+    EncryptedMigratedV1_2 = 3,
+};
+
+Q_ENUM_NS(JournalDbEncryptionStatus)
+
+ItemEncryptionStatus fromDbEncryptionStatus(JournalDbEncryptionStatus encryptionStatus);
+
+JournalDbEncryptionStatus toDbEncryptionStatus(ItemEncryptionStatus encryptionStatus);
+
+}
+
 }
 
 #if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG) && (__GNUC__ * 100 + __GNUC_MINOR__ < 408)
index 288290f8f6ae4cd617a2ee3ebb78755d4f8115cf..75912f4db14d41ca174ce77f4825606414c4d70c 100644 (file)
@@ -1292,7 +1292,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
         if (base.isE2eEncrypted()) {
             // renaming the encrypted folder is done via remove + re-upload hence we need to mark the newly created folder as encrypted
             // base is a record in the SyncJournal database that contains the data about the being-renamed folder with it's old name and encryption information
-            item->_e2eEncryptionStatus = static_cast<SyncFileItem::EncryptionStatus>(base._e2eEncryptionStatus);
+            item->_e2eEncryptionStatus = EncryptionStatusEnums::fromDbEncryptionStatus(base._e2eEncryptionStatus);
         }
         postProcessLocalNew();
         finalize();
index bca84700d80e89aa470703e0c24184633b25e7e6..42d8843e99c55f5ac543dbc60e58fae2d5edf94d 100644 (file)
@@ -26,6 +26,53 @@ namespace OCC {
 
 Q_LOGGING_CATEGORY(lcFileItem, "nextcloud.sync.fileitem", QtInfoMsg)
 
+namespace EncryptionStatusEnums {
+
+ItemEncryptionStatus fromDbEncryptionStatus(JournalDbEncryptionStatus encryptionStatus)
+{
+    auto result = ItemEncryptionStatus::NotEncrypted;
+
+    switch (encryptionStatus)
+    {
+    case JournalDbEncryptionStatus::Encrypted:
+        result = ItemEncryptionStatus::Encrypted;
+        break;
+    case JournalDbEncryptionStatus::EncryptedMigratedV1_2:
+        result = ItemEncryptionStatus::EncryptedMigratedV1_2;
+        break;
+    case JournalDbEncryptionStatus::EncryptedMigratedV1_2Invalid:
+        result = ItemEncryptionStatus::Encrypted;
+        break;
+    case JournalDbEncryptionStatus::NotEncrypted:
+        result = ItemEncryptionStatus::NotEncrypted;
+        break;
+    }
+
+    return result;
+}
+
+JournalDbEncryptionStatus toDbEncryptionStatus(ItemEncryptionStatus encryptionStatus)
+{
+    auto result = JournalDbEncryptionStatus::NotEncrypted;
+
+    switch (encryptionStatus)
+    {
+    case ItemEncryptionStatus::Encrypted:
+        result = JournalDbEncryptionStatus::Encrypted;
+        break;
+    case ItemEncryptionStatus::EncryptedMigratedV1_2:
+        result = JournalDbEncryptionStatus::EncryptedMigratedV1_2;
+        break;
+    case ItemEncryptionStatus::NotEncrypted:
+        result = JournalDbEncryptionStatus::NotEncrypted;
+        break;
+    }
+
+    return result;
+}
+
+}
+
 SyncJournalFileRecord SyncFileItem::toSyncJournalFileRecordWithInode(const QString &localFileName) const
 {
     SyncJournalFileRecord rec;
@@ -49,7 +96,7 @@ SyncJournalFileRecord SyncFileItem::toSyncJournalFileRecordWithInode(const QStri
     rec._serverHasIgnoredFiles = _serverHasIgnoredFiles;
     rec._checksumHeader = _checksumHeader;
     rec._e2eMangledName = _encryptedFileName.toUtf8();
-    rec._e2eEncryptionStatus = static_cast<SyncJournalFileRecord::EncryptionStatus>(_e2eEncryptionStatus);
+    rec._e2eEncryptionStatus = EncryptionStatusEnums::toDbEncryptionStatus(_e2eEncryptionStatus);
     rec._lockstate._locked = _locked == LockStatus::LockedItem;
     rec._lockstate._lockOwnerDisplayName = _lockOwnerDisplayName;
     rec._lockstate._lockOwnerId = _lockOwnerId;
@@ -86,8 +133,7 @@ SyncFileItemPtr SyncFileItem::fromSyncJournalFileRecord(const SyncJournalFileRec
     item->_serverHasIgnoredFiles = rec._serverHasIgnoredFiles;
     item->_checksumHeader = rec._checksumHeader;
     item->_encryptedFileName = rec.e2eMangledName();
-    item->_e2eEncryptionStatus = static_cast<SyncFileItem::EncryptionStatus>(rec._e2eEncryptionStatus);
-    qCInfo(lcFileItem) << "fromSyncJournalFileRecord" << item->_file << rec._e2eEncryptionStatus << item->_e2eEncryptionStatus;
+    item->_e2eEncryptionStatus = EncryptionStatusEnums::fromDbEncryptionStatus(rec._e2eEncryptionStatus);
     item->_locked = rec._lockstate._locked ? LockStatus::LockedItem : LockStatus::UnlockedItem;
     item->_lockOwnerDisplayName = rec._lockstate._lockOwnerDisplayName;
     item->_lockOwnerId = rec._lockstate._lockOwnerId;
index 62d7ef7caafa81db34938abc9b8ae51536f72c0e..b03d6b53b02cdd5a0e83b8f54455402565092a38 100644 (file)
@@ -46,12 +46,7 @@ public:
     };
     Q_ENUM(Direction)
 
-    enum class EncryptionStatus : int {
-        NotEncrypted = 0,
-        Encrypted = 1,
-        EncryptedMigratedV1_2 = 2,
-    };
-    Q_ENUM(EncryptionStatus)
+    using EncryptionStatus = EncryptionStatusEnums::ItemEncryptionStatus;
 
     // Note: the order of these statuses is used for ordering in the SortedActivityListModel
     enum Status { // stored in 4 bits
@@ -234,7 +229,7 @@ public:
             && !(_instruction == CSYNC_INSTRUCTION_CONFLICT && _status == SyncFileItem::Success);
     }
 
-    [[nodiscard]] bool isEncrypted() const { return _e2eEncryptionStatus != SyncFileItem::EncryptionStatus::NotEncrypted; }
+    [[nodiscard]] bool isEncrypted() const { return _e2eEncryptionStatus != EncryptionStatus::NotEncrypted; }
 
     // Variables useful for everybody