cipher: Proper fix for the is-it-encoded?-trial-and-error problem

Apparently after querying an encrypted database the handle is left in an
inconsistent state. So before setting any key or other encryption
details make sure to close and reopen the database to get a new, valid
handle.

Thanks to Nick (developernotes) and Stephen (sjlombardo) from the
SQLCipher forums for pointing this out!
This commit is contained in:
Martin Kleusberg
2014-11-14 12:51:27 +01:00
parent efe87a4b6e
commit 7bed20f1bf

View File

@@ -79,10 +79,19 @@ bool DBBrowserDB::open(const QString& db)
CipherDialog cipher(0, false);
if(cipher.exec())
{
// Close and reopen database first to be in a clean state after the failed read attempt from above
sqlite3_close(_db);
if(sqlite3_open_v2(db.toUtf8(), &_db, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK)
{
lastErrorMessage = QString::fromUtf8((const char*)sqlite3_errmsg(_db));
return false;
}
// Set key and, if it differs from the default value, the page size
sqlite3_key(_db, cipher.password().toUtf8(), cipher.password().toUtf8().length());
sqlite3_exec(_db, QString("PRAGMA cipher_page_size = 4096;").toUtf8(), NULL, NULL, NULL);
sqlite3_key(_db, cipher.password().toUtf8(), cipher.password().toUtf8().length());
sqlite3_exec(_db, QString("PRAGMA cipher_page_size = %1;").arg(cipher.pageSize()).toUtf8(), NULL, NULL, NULL);
if(cipher.pageSize() != 1024)
sqlite3_exec(_db, QString("PRAGMA cipher_page_size = %1;").arg(cipher.pageSize()).toUtf8(), NULL, NULL, NULL);
isEncrypted = true;
} else {
sqlite3_close(_db);