diff options
Diffstat (limited to 'src/core/Database.cpp')
-rw-r--r-- | src/core/Database.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 13dea7d1c..94113546d 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -275,6 +275,7 @@ bool Database::writeDatabase(QIODevice* device, QString* error) return false; } + QByteArray oldTransformedKey = m_data.transformedMasterKey; KeePass2Writer writer; setEmitModified(false); writer.writeDatabase(device, this); @@ -288,6 +289,15 @@ bool Database::writeDatabase(QIODevice* device, QString* error) return false; } + Q_ASSERT(!m_data.transformedMasterKey.isEmpty()); + Q_ASSERT(m_data.transformedMasterKey != oldTransformedKey); + if (m_data.transformedMasterKey.isEmpty() || m_data.transformedMasterKey == oldTransformedKey) { + if (error) { + *error = tr("Key not transformed. This is a bug, please report it to the developers!"); + } + return false; + } + markAsClean(); return true; } @@ -499,9 +509,11 @@ void Database::setCompressionAlgorithm(Database::CompressionAlgorithm algo) * @param key key to set and transform or nullptr to reset the key * @param updateChangedTime true to update database change time * @param updateTransformSalt true to update the transform salt + * @param transformKey trigger the KDF after setting the key * @return true on success */ -bool Database::setKey(const QSharedPointer<const CompositeKey>& key, bool updateChangedTime, bool updateTransformSalt) +bool Database::setKey(const QSharedPointer<const CompositeKey>& key, bool updateChangedTime, + bool updateTransformSalt, bool transformKey) { Q_ASSERT(!m_data.isReadOnly); @@ -519,7 +531,9 @@ bool Database::setKey(const QSharedPointer<const CompositeKey>& key, bool update QByteArray oldTransformedMasterKey = m_data.transformedMasterKey; QByteArray transformedMasterKey; - if (!key->transform(*m_data.kdf, transformedMasterKey)) { + if (!transformKey) { + transformedMasterKey = oldTransformedMasterKey; + } else if (!key->transform(*m_data.kdf, transformedMasterKey)) { return false; } |