Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/Database.cpp')
-rw-r--r--src/core/Database.cpp18
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;
}