diff --git a/src/misc/db/encrypteddb.cpp b/src/misc/db/encrypteddb.cpp index 6240b0420..90acaaade 100644 --- a/src/misc/db/encrypteddb.cpp +++ b/src/misc/db/encrypteddb.cpp @@ -30,22 +30,25 @@ EncryptedDb::EncryptedDb(const QString &fname) : plainChunkSize = 1024; encryptedChunkSize = plainChunkSize + tox_pass_encryption_extra_length(); - encrFile.open(QIODevice::ReadOnly); - - QList sqlCommands = decryptFile(); - for (const QString &cmd : sqlCommands) + QByteArray fileContent; + if (pullFileContent()) { - // check line here - QSqlQuery r = PlainDb::exec(cmd); - qDebug() << r.lastError(); + chunkPosition = encrFile.size() / encryptedChunkSize; + + encrFile.seek(0); + fileContent = encrFile.readAll(); + + /* + if (encrFile.size() > 0) + { + encrFile.copy(fname + "~"); + } + */ + } else { + qWarning() << "corrupted history log file will be wiped!"; + chunkPosition = 0; } - chunkPosition = encrFile.size() / encryptedChunkSize; -// encrFile.seek(chunkPosition * encryptedChunkSize); -// buffer = encrFile.read(encrFile.size() % encryptedChunkSize); - - encrFile.seek(0); - QByteArray fileContent = encrFile.readAll(); encrFile.close(); encrFile.open(QIODevice::WriteOnly); encrFile.write(fileContent); @@ -70,28 +73,59 @@ bool EncryptedDb::save() return true; } -QList EncryptedDb::decryptFile() +bool EncryptedDb::pullFileContent() { + encrFile.open(QIODevice::ReadOnly); QByteArray fileContent; while (!encrFile.atEnd()) { QByteArray encrChunk = encrFile.read(encryptedChunkSize); buffer = Core::getInstance()->decryptData(encrChunk); - fileContent += buffer; + if (buffer.size() > 0) + { + fileContent += buffer; + } else { + qWarning() << "Encrypted history log is corrupted: can't decrypt"; + buffer = QByteArray(); + return false; + } } QList splittedBA = fileContent.split('\n'); - QList res; + QList sqlCmds; + for (auto ba_line : splittedBA) { QString line = QByteArray::fromBase64(ba_line); - //check line correctness here - res.append(line); -// res.append(ba_line); + if (line.size() == 0) + continue; + + bool isGoodLine = false; + if (line.startsWith("CREATE", Qt::CaseInsensitive) || line.startsWith("INSERT", Qt::CaseInsensitive)) + { + if (line.endsWith(");")) + { + sqlCmds.append(line); + isGoodLine = true; + } + } + + if (!isGoodLine) + { + qWarning() << "Encrypted history log is corrupted: errors in content"; + buffer = QByteArray(); + return false; + } + } + + for (auto line : sqlCmds) + { + QSqlQuery r = PlainDb::exec(line); + qDebug() << r.lastError(); } - return res; + return true; } void EncryptedDb::appendToEncrypted(const QString &sql) @@ -106,14 +140,21 @@ void EncryptedDb::appendToEncrypted(const QString &sql) { QByteArray filledChunk = buffer.left(plainChunkSize); encrFile.seek(chunkPosition * encryptedChunkSize); - encrFile.write(Core::getInstance()->encryptData(filledChunk)); + QByteArray encr = Core::getInstance()->encryptData(filledChunk); + if (encr.size() > 0) + { + encrFile.write(encr); + } + buffer = buffer.right(buffer.size() - plainChunkSize); chunkPosition++; } encrFile.seek(chunkPosition * encryptedChunkSize); - encrFile.write(Core::getInstance()->encryptData(buffer)); + QByteArray encr = Core::getInstance()->encryptData(buffer); + if (encr.size() > 0) + { + encrFile.write(encr); + } encrFile.flush(); - - qDebug() << sql; } diff --git a/src/misc/db/encrypteddb.h b/src/misc/db/encrypteddb.h index 11c999f30..940e3d806 100644 --- a/src/misc/db/encrypteddb.h +++ b/src/misc/db/encrypteddb.h @@ -32,7 +32,7 @@ public: virtual bool save(); private: - QList decryptFile(); + bool pullFileContent(); void appendToEncrypted(const QString &sql); QFile encrFile; diff --git a/src/widget/form/settings/privacysettings.ui b/src/widget/form/settings/privacysettings.ui index 9fee5764e..62baa0f3f 100644 --- a/src/widget/form/settings/privacysettings.ui +++ b/src/widget/form/settings/privacysettings.ui @@ -37,7 +37,7 @@ - false + true Encryption @@ -45,6 +45,9 @@ + + false + Encrypt Tox datafile @@ -74,6 +77,9 @@ + + false + Set profile password