Skip to content

Commit 9486978

Browse files
committed
allow to read v1.2 from buggy v3.8.0 client
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>
1 parent 7118fc4 commit 9486978

5 files changed

Lines changed: 82 additions & 17 deletions

File tree

src/common/syncjournalfilerecord.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,7 @@ class OCSYNC_EXPORT SyncJournalFileRecord
5353
return !_path.isEmpty();
5454
}
5555

56-
enum class EncryptionStatus : int {
57-
NotEncrypted = 0,
58-
Encrypted = 1,
59-
EncryptedMigratedV1_2 = 2,
60-
};
56+
using EncryptionStatus = EncryptionStatusEnums::JournalDbEncryptionStatus;
6157

6258
/** Returns the numeric part of the full id in _fileId.
6359
*
@@ -73,7 +69,7 @@ class OCSYNC_EXPORT SyncJournalFileRecord
7369
[[nodiscard]] bool isVirtualFile() const { return _type == ItemTypeVirtualFile || _type == ItemTypeVirtualFileDownload; }
7470
[[nodiscard]] QString path() const { return QString::fromUtf8(_path); }
7571
[[nodiscard]] QString e2eMangledName() const { return QString::fromUtf8(_e2eMangledName); }
76-
[[nodiscard]] bool isE2eEncrypted() const { return _e2eEncryptionStatus != SyncJournalFileRecord::EncryptionStatus::NotEncrypted; }
72+
[[nodiscard]] bool isE2eEncrypted() const { return _e2eEncryptionStatus != EncryptionStatus::NotEncrypted; }
7773

7874
QByteArray _path;
7975
quint64 _inode = 0;

src/csync/csync.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,34 @@
4747

4848
namespace OCC {
4949
class SyncJournalFileRecord;
50+
51+
namespace EncryptionStatusEnums {
52+
53+
Q_NAMESPACE
54+
55+
enum class ItemEncryptionStatus : int {
56+
NotEncrypted = 0,
57+
Encrypted = 1,
58+
EncryptedMigratedV1_2 = 2,
59+
};
60+
61+
Q_ENUM_NS(ItemEncryptionStatus)
62+
63+
enum class JournalDbEncryptionStatus : int {
64+
NotEncrypted = 0,
65+
Encrypted = 1,
66+
EncryptedMigratedV1_2Invalid = 2,
67+
EncryptedMigratedV1_2 = 3,
68+
};
69+
70+
Q_ENUM_NS(JournalDbEncryptionStatus)
71+
72+
ItemEncryptionStatus fromDbEncryptionStatus(JournalDbEncryptionStatus encryptionStatus);
73+
74+
JournalDbEncryptionStatus toDbEncryptionStatus(ItemEncryptionStatus encryptionStatus);
75+
76+
}
77+
5078
}
5179

5280
#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG) && (__GNUC__ * 100 + __GNUC_MINOR__ < 408)

src/libsync/discovery.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1292,7 +1292,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
12921292
if (base.isE2eEncrypted()) {
12931293
// renaming the encrypted folder is done via remove + re-upload hence we need to mark the newly created folder as encrypted
12941294
// 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
1295-
item->_e2eEncryptionStatus = static_cast<SyncFileItem::EncryptionStatus>(base._e2eEncryptionStatus);
1295+
item->_e2eEncryptionStatus = EncryptionStatusEnums::fromDbEncryptionStatus(base._e2eEncryptionStatus);
12961296
}
12971297
postProcessLocalNew();
12981298
finalize();

src/libsync/syncfileitem.cpp

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,53 @@ namespace OCC {
2626

2727
Q_LOGGING_CATEGORY(lcFileItem, "nextcloud.sync.fileitem", QtInfoMsg)
2828

29+
namespace EncryptionStatusEnums {
30+
31+
ItemEncryptionStatus fromDbEncryptionStatus(JournalDbEncryptionStatus encryptionStatus)
32+
{
33+
auto result = ItemEncryptionStatus::NotEncrypted;
34+
35+
switch (encryptionStatus)
36+
{
37+
case JournalDbEncryptionStatus::Encrypted:
38+
result = ItemEncryptionStatus::Encrypted;
39+
break;
40+
case JournalDbEncryptionStatus::EncryptedMigratedV1_2:
41+
result = ItemEncryptionStatus::EncryptedMigratedV1_2;
42+
break;
43+
case JournalDbEncryptionStatus::EncryptedMigratedV1_2Invalid:
44+
result = ItemEncryptionStatus::Encrypted;
45+
break;
46+
case JournalDbEncryptionStatus::NotEncrypted:
47+
result = ItemEncryptionStatus::NotEncrypted;
48+
break;
49+
}
50+
51+
return result;
52+
}
53+
54+
JournalDbEncryptionStatus toDbEncryptionStatus(ItemEncryptionStatus encryptionStatus)
55+
{
56+
auto result = JournalDbEncryptionStatus::NotEncrypted;
57+
58+
switch (encryptionStatus)
59+
{
60+
case ItemEncryptionStatus::Encrypted:
61+
result = JournalDbEncryptionStatus::Encrypted;
62+
break;
63+
case ItemEncryptionStatus::EncryptedMigratedV1_2:
64+
result = JournalDbEncryptionStatus::EncryptedMigratedV1_2;
65+
break;
66+
case ItemEncryptionStatus::NotEncrypted:
67+
result = JournalDbEncryptionStatus::NotEncrypted;
68+
break;
69+
}
70+
71+
return result;
72+
}
73+
74+
}
75+
2976
SyncJournalFileRecord SyncFileItem::toSyncJournalFileRecordWithInode(const QString &localFileName) const
3077
{
3178
SyncJournalFileRecord rec;
@@ -49,7 +96,7 @@ SyncJournalFileRecord SyncFileItem::toSyncJournalFileRecordWithInode(const QStri
4996
rec._serverHasIgnoredFiles = _serverHasIgnoredFiles;
5097
rec._checksumHeader = _checksumHeader;
5198
rec._e2eMangledName = _encryptedFileName.toUtf8();
52-
rec._e2eEncryptionStatus = static_cast<SyncJournalFileRecord::EncryptionStatus>(_e2eEncryptionStatus);
99+
rec._e2eEncryptionStatus = EncryptionStatusEnums::toDbEncryptionStatus(_e2eEncryptionStatus);
53100
rec._lockstate._locked = _locked == LockStatus::LockedItem;
54101
rec._lockstate._lockOwnerDisplayName = _lockOwnerDisplayName;
55102
rec._lockstate._lockOwnerId = _lockOwnerId;
@@ -86,8 +133,7 @@ SyncFileItemPtr SyncFileItem::fromSyncJournalFileRecord(const SyncJournalFileRec
86133
item->_serverHasIgnoredFiles = rec._serverHasIgnoredFiles;
87134
item->_checksumHeader = rec._checksumHeader;
88135
item->_encryptedFileName = rec.e2eMangledName();
89-
item->_e2eEncryptionStatus = static_cast<SyncFileItem::EncryptionStatus>(rec._e2eEncryptionStatus);
90-
qCInfo(lcFileItem) << "fromSyncJournalFileRecord" << item->_file << rec._e2eEncryptionStatus << item->_e2eEncryptionStatus;
136+
item->_e2eEncryptionStatus = EncryptionStatusEnums::fromDbEncryptionStatus(rec._e2eEncryptionStatus);
91137
item->_locked = rec._lockstate._locked ? LockStatus::LockedItem : LockStatus::UnlockedItem;
92138
item->_lockOwnerDisplayName = rec._lockstate._lockOwnerDisplayName;
93139
item->_lockOwnerId = rec._lockstate._lockOwnerId;

src/libsync/syncfileitem.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,7 @@ class OWNCLOUDSYNC_EXPORT SyncFileItem
4646
};
4747
Q_ENUM(Direction)
4848

49-
enum class EncryptionStatus : int {
50-
NotEncrypted = 0,
51-
Encrypted = 1,
52-
EncryptedMigratedV1_2 = 2,
53-
};
54-
Q_ENUM(EncryptionStatus)
49+
using EncryptionStatus = EncryptionStatusEnums::ItemEncryptionStatus;
5550

5651
// Note: the order of these statuses is used for ordering in the SortedActivityListModel
5752
enum Status { // stored in 4 bits
@@ -234,7 +229,7 @@ class OWNCLOUDSYNC_EXPORT SyncFileItem
234229
&& !(_instruction == CSYNC_INSTRUCTION_CONFLICT && _status == SyncFileItem::Success);
235230
}
236231

237-
[[nodiscard]] bool isEncrypted() const { return _e2eEncryptionStatus != SyncFileItem::EncryptionStatus::NotEncrypted; }
232+
[[nodiscard]] bool isEncrypted() const { return _e2eEncryptionStatus != EncryptionStatus::NotEncrypted; }
238233

239234
// Variables useful for everybody
240235

0 commit comments

Comments
 (0)