From a8c02fdc3cb39e8cabfd7012a6104e60938d3bb8 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Wed, 4 Mar 2020 10:05:33 -0500 Subject: [PATCH] Move database open to async task * Wrap key transformation in AsyncTask when reading a database. Significantly reduces user interface lockup. * Replace root group with new group instead of deleting the pointer (fulfills member validity promise). --- src/core/Database.cpp | 17 ++++++++--------- src/core/Group.cpp | 9 +-------- src/format/Kdbx3Reader.cpp | 4 +++- src/format/Kdbx4Reader.cpp | 4 +++- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 9c59c70b..66af624e 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -415,27 +415,26 @@ void Database::releaseData() // Prevent data release while saving QMutexLocker locker(&m_saveMutex); - s_uuidMap.remove(m_uuid); - m_uuid = QUuid(); - if (m_modified) { emit databaseDiscarded(); } + setEmitModified(false); + m_modified = false; + m_modifiedTimer.stop(); + + s_uuidMap.remove(m_uuid); + m_uuid = QUuid(); + m_data.clear(); m_metadata->clear(); - if (m_rootGroup && m_rootGroup->parent() == this) { - delete m_rootGroup; - } + setRootGroup(new Group()); m_fileWatcher->stop(); m_deletedObjects.clear(); m_commonUsernames.clear(); - - m_modified = false; - m_modifiedTimer.stop(); } /** diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 2c0d6709..eb795f95 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -967,14 +967,7 @@ void Group::removeEntry(Entry* entry) void Group::connectDatabaseSignalsRecursive(Database* db) { if (m_db) { - disconnect(SIGNAL(groupDataChanged(Group*)), m_db); - disconnect(SIGNAL(groupAboutToRemove(Group*)), m_db); - disconnect(SIGNAL(groupRemoved()), m_db); - disconnect(SIGNAL(groupAboutToAdd(Group*, int)), m_db); - disconnect(SIGNAL(groupAdded()), m_db); - disconnect(SIGNAL(aboutToMove(Group*, Group*, int)), m_db); - disconnect(SIGNAL(groupMoved()), m_db); - disconnect(SIGNAL(groupModified()), m_db); + disconnect(m_db); } for (Entry* entry : asConst(m_entries)) { diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp index 9196bc61..cce46deb 100644 --- a/src/format/Kdbx3Reader.cpp +++ b/src/format/Kdbx3Reader.cpp @@ -18,6 +18,7 @@ #include "Kdbx3Reader.h" +#include "core/AsyncTask.h" #include "core/Endian.h" #include "core/Group.h" #include "crypto/CryptoHash.h" @@ -47,7 +48,8 @@ bool Kdbx3Reader::readDatabaseImpl(QIODevice* device, return false; } - if (!db->setKey(key, false)) { + bool ok = AsyncTask::runAndWaitForFuture([&] { return db->setKey(key, false); }); + if (!ok) { raiseError(tr("Unable to calculate master key")); return false; } diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp index d0914a04..ebdf634a 100644 --- a/src/format/Kdbx4Reader.cpp +++ b/src/format/Kdbx4Reader.cpp @@ -19,6 +19,7 @@ #include +#include "core/AsyncTask.h" #include "core/Endian.h" #include "core/Group.h" #include "crypto/CryptoHash.h" @@ -47,7 +48,8 @@ bool Kdbx4Reader::readDatabaseImpl(QIODevice* device, return false; } - if (!db->setKey(key, false, false)) { + bool ok = AsyncTask::runAndWaitForFuture([&] { return db->setKey(key, false, false); }); + if (!ok) { raiseError(tr("Unable to calculate master key")); return false; }