mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-11-29 19:06:55 -05:00
Refactor Database and Database widgets (#2491)
The Database, DatabaseWidget, and DatabaseTabWidget classes share many responsibilities in inconsistent ways resulting in impenetrable and unmaintainable code and a diverse set of bugs and architecture restrictions. This patch reworks the architecture, responsibilities of, and dependencies between these classes. The core changes are: * Move loading and saving logic from widgets into the Database class * Get rid of the DatabaseManagerStruct and move all the information contained in it into the Database * Let database objects keep track of modifications and dirty/clean state instead of handing this to external widgets * Move GUI interactions for loading and saving from the DatabaseTabWidget into the DatabaseWidget (resolves #2494 as a side-effect) * Heavily clean up DatabaseTabWidget and degrade it to a slightly glorified QTabWidget * Use QSharedPointers for all Database objects * Remove the modifiedImmediate signal and replace it with a markAsModified() method * Implement proper tabName() method instead of reading back titles from GUI widgets (resolves #1389 and its duplicates #2146 #855) * Fix unwanted AES-KDF downgrade if database uses Argon2 and has CustomData * Improve code This patch is also the first major step towards solving issues #476 and #2322.
This commit is contained in:
parent
917c4cc18b
commit
d612cad09a
115 changed files with 2116 additions and 2165 deletions
|
|
@ -1,3 +1,5 @@
|
|||
#include <utility>
|
||||
|
||||
/*
|
||||
* Copyright (C) 2010 Felix Geyer <debfx@fobos.de>
|
||||
* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
|
||||
|
|
@ -340,7 +342,7 @@ void EditEntryWidget::setupSSHAgent()
|
|||
connect(m_sshAgentUi->decryptButton, SIGNAL(clicked()), SLOT(decryptPrivateKey()));
|
||||
connect(m_sshAgentUi->copyToClipboardButton, SIGNAL(clicked()), SLOT(copyPublicKey()));
|
||||
|
||||
connect(m_advancedUi->attachmentsWidget->entryAttachments(), SIGNAL(modified()), SLOT(updateSSHAgentAttachments()));
|
||||
connect(m_advancedUi->attachmentsWidget->entryAttachments(), SIGNAL(entryAttachmentsModified()), SLOT(updateSSHAgentAttachments()));
|
||||
|
||||
addPage(tr("SSH Agent"), FilePath::instance()->icon("apps", "utilities-terminal"), m_sshAgentWidget);
|
||||
}
|
||||
|
|
@ -640,10 +642,10 @@ QString EditEntryWidget::entryTitle() const
|
|||
}
|
||||
}
|
||||
|
||||
void EditEntryWidget::loadEntry(Entry* entry, bool create, bool history, const QString& parentName, Database* database)
|
||||
void EditEntryWidget::loadEntry(Entry* entry, bool create, bool history, const QString& parentName, QSharedPointer<Database> database)
|
||||
{
|
||||
m_entry = entry;
|
||||
m_database = database;
|
||||
m_db = std::move(database);
|
||||
m_create = create;
|
||||
m_history = history;
|
||||
|
||||
|
|
@ -667,7 +669,7 @@ void EditEntryWidget::loadEntry(Entry* entry, bool create, bool history, const Q
|
|||
setUnsavedChanges(m_create);
|
||||
}
|
||||
|
||||
void EditEntryWidget::setForms(const Entry* entry, bool restore)
|
||||
void EditEntryWidget::setForms(Entry* entry, bool restore)
|
||||
{
|
||||
m_mainUi->titleEdit->setReadOnly(m_history);
|
||||
m_mainUi->usernameEdit->setReadOnly(m_history);
|
||||
|
|
@ -734,7 +736,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore)
|
|||
IconStruct iconStruct;
|
||||
iconStruct.uuid = entry->iconUuid();
|
||||
iconStruct.number = entry->iconNumber();
|
||||
m_iconsWidget->load(entry->uuid(), m_database, iconStruct, entry->webUrl());
|
||||
m_iconsWidget->load(entry->uuid(), m_db, iconStruct, entry->webUrl());
|
||||
connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString)), m_iconsWidget, SLOT(setUrl(QString)));
|
||||
|
||||
m_autoTypeUi->enableButton->setChecked(entry->autoTypeEnabled());
|
||||
|
|
@ -924,7 +926,7 @@ void EditEntryWidget::cancel()
|
|||
return;
|
||||
}
|
||||
|
||||
if (!m_entry->iconUuid().isNull() && !m_database->metadata()->containsCustomIcon(m_entry->iconUuid())) {
|
||||
if (!m_entry->iconUuid().isNull() && !m_db->metadata()->containsCustomIcon(m_entry->iconUuid())) {
|
||||
m_entry->setIcon(Entry::DefaultIconNumber);
|
||||
}
|
||||
|
||||
|
|
@ -952,7 +954,7 @@ void EditEntryWidget::cancel()
|
|||
void EditEntryWidget::clear()
|
||||
{
|
||||
m_entry = nullptr;
|
||||
m_database = nullptr;
|
||||
m_db.reset();
|
||||
m_entryAttributes->clear();
|
||||
m_advancedUi->attachmentsWidget->clearAttachments();
|
||||
m_autoTypeAssoc->clear();
|
||||
|
|
@ -969,11 +971,11 @@ bool EditEntryWidget::hasBeenModified() const
|
|||
}
|
||||
|
||||
// check if updating the entry would modify it
|
||||
QScopedPointer<Entry> entry(new Entry());
|
||||
entry->copyDataFrom(m_entry);
|
||||
auto* entry = new Entry();
|
||||
entry->copyDataFrom(m_entry.data());
|
||||
|
||||
entry->beginUpdate();
|
||||
updateEntryData(entry.data());
|
||||
updateEntryData(entry);
|
||||
return entry->endUpdate();
|
||||
}
|
||||
|
||||
|
|
@ -1256,17 +1258,13 @@ void EditEntryWidget::deleteHistoryEntry()
|
|||
void EditEntryWidget::deleteAllHistoryEntries()
|
||||
{
|
||||
m_historyModel->deleteAll();
|
||||
if (m_historyModel->rowCount() > 0) {
|
||||
m_historyUi->deleteAllButton->setEnabled(true);
|
||||
} else {
|
||||
m_historyUi->deleteAllButton->setEnabled(false);
|
||||
}
|
||||
m_historyUi->deleteAllButton->setEnabled(m_historyModel->rowCount() > 0);
|
||||
setUnsavedChanges(true);
|
||||
}
|
||||
|
||||
QMenu* EditEntryWidget::createPresetsMenu()
|
||||
{
|
||||
QMenu* expirePresetsMenu = new QMenu(this);
|
||||
auto* expirePresetsMenu = new QMenu(this);
|
||||
expirePresetsMenu->addAction(tr("Tomorrow"))->setData(QVariant::fromValue(TimeDelta::fromDays(1)));
|
||||
expirePresetsMenu->addSeparator();
|
||||
expirePresetsMenu->addAction(tr("%n week(s)", nullptr, 1))->setData(QVariant::fromValue(TimeDelta::fromDays(7)));
|
||||
|
|
@ -1277,9 +1275,9 @@ QMenu* EditEntryWidget::createPresetsMenu()
|
|||
expirePresetsMenu->addAction(tr("%n month(s)", nullptr, 3))->setData(QVariant::fromValue(TimeDelta::fromMonths(3)));
|
||||
expirePresetsMenu->addAction(tr("%n month(s)", nullptr, 6))->setData(QVariant::fromValue(TimeDelta::fromMonths(6)));
|
||||
expirePresetsMenu->addSeparator();
|
||||
expirePresetsMenu->addAction(tr("%n year(s)", 0, 1))->setData(QVariant::fromValue(TimeDelta::fromYears(1)));
|
||||
expirePresetsMenu->addAction(tr("%n year(s)", 0, 2))->setData(QVariant::fromValue(TimeDelta::fromYears(2)));
|
||||
expirePresetsMenu->addAction(tr("%n year(s)", 0, 3))->setData(QVariant::fromValue(TimeDelta::fromYears(3)));
|
||||
expirePresetsMenu->addAction(tr("%n year(s)", nullptr, 1))->setData(QVariant::fromValue(TimeDelta::fromYears(1)));
|
||||
expirePresetsMenu->addAction(tr("%n year(s)", nullptr, 2))->setData(QVariant::fromValue(TimeDelta::fromYears(2)));
|
||||
expirePresetsMenu->addAction(tr("%n year(s)", nullptr, 3))->setData(QVariant::fromValue(TimeDelta::fromYears(3)));
|
||||
return expirePresetsMenu;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue