const QByteArray &metadataKeyChecksum) const
{
const auto referenceMetadataKeyValue = computeMetadataKeyChecksum(metadataKey);
+
+ if (referenceMetadataKeyValue != metadataKeyChecksum) {
+ if (recoverMetadataKeyChecksum(metadataKeyChecksum, metadataKey)) {
+ qCInfo(lcCseMetadata) << "Checksum recovery done";
+ return true;
+ }
+ }
+
return referenceMetadataKeyValue == metadataKeyChecksum;
}
return hashAlgorithm.result().toHex();
}
+bool FolderMetadata::recoverMetadataKeyChecksum(const QByteArray &expectedChecksum,
+ const QByteArray &metadataKey) const
+{
+ const auto sortLambda = [] (const auto &first, const auto &second) {
+ return first.encryptedFilename < second.encryptedFilename;
+ };
+ auto sortedFiles = _files;
+
+ std::sort(sortedFiles.begin(), sortedFiles.end(), sortLambda);
+
+ do {
+ auto hashAlgorithm = QCryptographicHash{QCryptographicHash::Sha256};
+ hashAlgorithm.addData(_account->e2e()->_mnemonic.remove(' ').toUtf8());
+ for (const auto &singleFile : sortedFiles) {
+ hashAlgorithm.addData(singleFile.encryptedFilename.toUtf8());
+ }
+ hashAlgorithm.addData(metadataKey);
+ if (hashAlgorithm.result().toHex() == expectedChecksum) {
+ break;
+ }
+ } while (std::next_permutation(sortedFiles.begin(), sortedFiles.end(), sortLambda));
+
+ return expectedChecksum;
+}
+
bool FolderMetadata::isMetadataSetup() const
{
return _isMetadataSetup;
[[nodiscard]] bool checkMetadataKeyChecksum(const QByteArray &metadataKey, const QByteArray &metadataKeyChecksum) const;
[[nodiscard]] QByteArray computeMetadataKeyChecksum(const QByteArray &metadataKey) const;
+ [[nodiscard]] bool recoverMetadataKeyChecksum(const QByteArray &expectedChecksum,
+ const QByteArray &metadataKey) const;
QByteArray _metadataKey;