mirror of
https://github.com/sqlitebrowser/sqlitebrowser.git
synced 2026-01-19 10:20:17 -06:00
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user