diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8d0fc3e6f..891261cd3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -51,6 +51,7 @@ set(keepassx_SOURCES format/KeePass2XmlWriter.cpp gui/ChangeMasterKeyWidget.cpp gui/DatabaseOpenDialog.cpp + gui/DatabaseSettingsWidget.cpp gui/DatabaseTabWidget.cpp gui/DatabaseWidget.cpp gui/EditEntryWidget.cpp @@ -82,6 +83,7 @@ set(keepassx_MOC core/Metadata.h gui/ChangeMasterKeyWidget.h gui/DatabaseOpenDialog.h + gui/DatabaseSettingsWidget.h gui/DatabaseTabWidget.h gui/DatabaseWidget.h gui/EditEntryWidget.h @@ -102,6 +104,7 @@ set(keepassx_MOC set(keepassx_FORMS gui/ChangeMasterKeyWidget.ui gui/DatabaseOpenDialog.ui + gui/DatabaseSettingsWidget.ui gui/EditEntryWidget.ui gui/EditEntryWidgetAdvanced.ui gui/EditEntryWidgetMain.ui diff --git a/src/core/Database.cpp b/src/core/Database.cpp index a50044355..b61ddc032 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -167,6 +167,7 @@ void Database::setTransformRounds(quint64 rounds) void Database::setKey(const CompositeKey& key, const QByteArray& transformSeed, bool updateChangedTime) { + m_key = key; m_transformSeed = transformSeed; m_transformedMasterKey = key.transform(transformSeed, transformRounds()); m_hasKey = true; @@ -181,6 +182,16 @@ void Database::setKey(const CompositeKey& key) setKey(key, Random::randomArray(32)); } +void Database::updateKey(quint64 rounds) +{ + if (m_transformRounds != rounds) { + m_transformRounds = rounds; + m_transformedMasterKey = m_key.transform(m_transformSeed, transformRounds()); + m_metadata->setMasterKeyChanged(QDateTime::currentDateTimeUtc()); + Q_EMIT modified(); + } +} + bool Database::hasKey() { return m_hasKey; diff --git a/src/core/Database.h b/src/core/Database.h index 2eb14a9cc..d84ffa38a 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -81,6 +81,7 @@ public: * Sets the database key and generates a random transform seed. */ void setKey(const CompositeKey& key); + void updateKey(quint64 rounds); bool hasKey(); void recycleEntry(Entry* entry); @@ -106,6 +107,8 @@ private: quint64 m_transformRounds; QByteArray m_transformedMasterKey; + CompositeKey m_key; + bool m_hasKey; }; diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp new file mode 100644 index 000000000..74b8be290 --- /dev/null +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2012 Felix Geyer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "DatabaseSettingsWidget.h" +#include "ui_DatabaseSettingsWidget.h" + + +DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) + : QWidget(parent) + , m_ui(new Ui::DatabaseSettingsWidget()) +{ + m_ui->setupUi(this); + + connect(m_ui->buttonBox, SIGNAL(accepted()), SLOT(changeSettings())); + connect(m_ui->buttonBox, SIGNAL(rejected()), SLOT(reject())); +} + +DatabaseSettingsWidget::~DatabaseSettingsWidget() +{ +} + +void DatabaseSettingsWidget::setForms(int transformRounds) +{ + m_ui->transformRoundsSpinBox->setValue(transformRounds); +} + +quint64 DatabaseSettingsWidget::transformRounds() +{ + return m_transformRounds; +} + +void DatabaseSettingsWidget::changeSettings() +{ + m_transformRounds = m_ui->transformRoundsSpinBox->value(); + Q_EMIT editFinished(true); +} + +void DatabaseSettingsWidget::reject() +{ + Q_EMIT editFinished(false); +} + diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h new file mode 100644 index 000000000..8a09ba886 --- /dev/null +++ b/src/gui/DatabaseSettingsWidget.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2012 Felix Geyer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSX_DATABASESETTINGSWIDGET_H +#define KEEPASSX_DATABASESETTINGSWIDGET_H + +#include +#include + +class QAbstractButton; + +namespace Ui { + class DatabaseSettingsWidget; +} + +class DatabaseSettingsWidget : public QWidget +{ + Q_OBJECT + +public: + explicit DatabaseSettingsWidget(QWidget* parent = 0); + ~DatabaseSettingsWidget(); + + void setForms(int transformRounds); + quint64 transformRounds(); + +Q_SIGNALS: + void editFinished(bool accepted); + +private Q_SLOTS: + void changeSettings(); + void reject(); + +private: + QScopedPointer m_ui; + + quint64 m_transformRounds; + + Q_DISABLE_COPY(DatabaseSettingsWidget) +}; + +#endif // KEEPASSX_DATABASESETTINGSWIDGET_H diff --git a/src/gui/DatabaseSettingsWidget.ui b/src/gui/DatabaseSettingsWidget.ui new file mode 100644 index 000000000..768eae1a4 --- /dev/null +++ b/src/gui/DatabaseSettingsWidget.ui @@ -0,0 +1,84 @@ + + + DatabaseSettingsWidget + + + + 0 + 0 + 500 + 399 + + + + Form + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 1 + 3 + + + + + + + + + + Transform rounds: + + + + + + + + 0 + 0 + + + + 1 + + + 1000000000 + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index c6e9eb84f..eecdd2651 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -258,6 +258,11 @@ void DatabaseTabWidget::changeMasterKey() currentDatabaseWidget()->switchToMasterKeyChange(); } +void DatabaseTabWidget::changeDatabaseSettings() +{ + currentDatabaseWidget()->switchToDatabaseSettings(); +} + void DatabaseTabWidget::createEntry() { currentDatabaseWidget()->createEntry(); diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index 19f2cae5a..161ad890c 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -58,6 +58,7 @@ public Q_SLOTS: void closeDatabaseFromSender(); bool closeAllDatabases(); void changeMasterKey(); + void changeDatabaseSettings(); void createEntry(); void editEntry(); void deleteEntry(); diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 28ed89bf7..31b4656bb 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -25,6 +25,7 @@ #include "core/Metadata.h" #include "core/Tools.h" #include "gui/ChangeMasterKeyWidget.h" +#include "gui/DatabaseSettingsWidget.h" #include "gui/EditEntryWidget.h" #include "gui/EditGroupWidget.h" #include "gui/EntryView.h" @@ -73,17 +74,19 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) headlineLabelFont.setBold(true); headlineLabelFont.setPointSize(headlineLabelFont.pointSize() + 2); m_changeMasterKeyWidget->headlineLabel()->setFont(headlineLabelFont); - + m_databaseSettingsWidget = new DatabaseSettingsWidget(); addWidget(m_mainWidget); addWidget(m_editEntryWidget); addWidget(m_editGroupWidget); addWidget(m_changeMasterKeyWidget); + addWidget(m_databaseSettingsWidget); connect(m_groupView, SIGNAL(groupChanged(Group*)), m_entryView, SLOT(setGroup(Group*))); connect(m_entryView, SIGNAL(entryActivated(Entry*)), SLOT(switchToEntryEdit(Entry*))); connect(m_editEntryWidget, SIGNAL(editFinished(bool)), SLOT(switchToView(bool))); connect(m_editGroupWidget, SIGNAL(editFinished(bool)), SLOT(switchToView(bool))); connect(m_changeMasterKeyWidget, SIGNAL(editFinished(bool)), SLOT(updateMasterKey(bool))); + connect(m_databaseSettingsWidget, SIGNAL(editFinished(bool)), SLOT(updateSettings(bool))); setCurrentIndex(0); } @@ -191,6 +194,15 @@ void DatabaseWidget::updateMasterKey(bool accepted) setCurrentIndex(0); } +void DatabaseWidget::updateSettings(bool accepted) +{ + if (accepted) { + m_db->updateKey(m_databaseSettingsWidget->transformRounds()); + } + + setCurrentIndex(0); +} + void DatabaseWidget::switchToEntryEdit() { switchToEntryEdit(m_entryView->currentEntry(), false); @@ -207,6 +219,12 @@ void DatabaseWidget::switchToMasterKeyChange() setCurrentIndex(3); } +void DatabaseWidget::switchToDatabaseSettings() +{ + m_databaseSettingsWidget->setForms(m_db->transformRounds()); + setCurrentIndex(4); +} + bool DatabaseWidget::dbHasKey() { return m_db->hasKey(); diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 1035e7c4e..76d1d8941 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -21,6 +21,7 @@ #include class ChangeMasterKeyWidget; +class DatabaseSettingsWidget; class Database; class EditEntryWidget; class EditGroupWidget; @@ -49,6 +50,7 @@ public Q_SLOTS: void switchToEntryEdit(); void switchToGroupEdit(); void switchToMasterKeyChange(); + void switchToDatabaseSettings(); private Q_SLOTS: void switchToView(bool accepted); @@ -56,6 +58,7 @@ private Q_SLOTS: void switchToEntryEdit(Entry* entry, bool create); void switchToGroupEdit(Group* entry, bool create); void updateMasterKey(bool accepted); + void updateSettings(bool accepted); private: Database* m_db; @@ -63,6 +66,7 @@ private: EditEntryWidget* m_editEntryWidget; EditGroupWidget* m_editGroupWidget; ChangeMasterKeyWidget* m_changeMasterKeyWidget; + DatabaseSettingsWidget* m_databaseSettingsWidget; GroupView* m_groupView; EntryView* m_entryView; Group* m_newGroup; diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index b7cb3719f..6c1960f9d 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -42,6 +42,7 @@ MainWindow::MainWindow() connect(m_ui->actionDatabaseSaveAs, SIGNAL(triggered()), m_ui->tabWidget, SLOT(saveDatabaseAs())); connect(m_ui->actionDatabaseClose, SIGNAL(triggered()), m_ui->tabWidget, SLOT(closeDatabase())); connect(m_ui->actionChangeMasterKey, SIGNAL(triggered()), m_ui->tabWidget, SLOT(changeMasterKey())); + connect(m_ui->actionChangeDatabaseSettings, SIGNAL(triggered()), m_ui->tabWidget, SLOT(changeDatabaseSettings())); connect(m_ui->actionEntryNew, SIGNAL(triggered()), m_ui->tabWidget, SLOT(createEntry())); connect(m_ui->actionEntryEdit, SIGNAL(triggered()), m_ui->tabWidget, SLOT(editEntry())); connect(m_ui->actionEntryDelete, SIGNAL(triggered()), m_ui->tabWidget, SLOT(deleteEntry())); @@ -88,12 +89,14 @@ void MainWindow::setMenuActionState(int index) } */ m_ui->actionChangeMasterKey->setEnabled(true); + m_ui->actionChangeDatabaseSettings->setEnabled(true); m_ui->actionDatabaseSave->setEnabled(true); m_ui->actionDatabaseSaveAs->setEnabled(true); break; case 1: // entry edit case 2: // group edit case 3: // change master key + case 4: // database settings m_ui->actionEntryNew->setEnabled(false); m_ui->actionGroupNew->setEnabled(false); m_ui->actionEntryEdit->setEnabled(false); @@ -101,6 +104,7 @@ void MainWindow::setMenuActionState(int index) m_ui->actionEntryDelete->setEnabled(false); m_ui->actiocGroupDelete->setEnabled(false); m_ui->actionChangeMasterKey->setEnabled(false); + m_ui->actionChangeDatabaseSettings->setEnabled(false); m_ui->actionDatabaseSave->setEnabled(false); m_ui->actionDatabaseSaveAs->setEnabled(false); break; @@ -117,6 +121,7 @@ void MainWindow::setMenuActionState(int index) m_ui->actionEntryDelete->setEnabled(false); m_ui->actiocGroupDelete->setEnabled(false); m_ui->actionChangeMasterKey->setEnabled(false); + m_ui->actionChangeDatabaseSettings->setEnabled(false); m_ui->actionDatabaseSave->setEnabled(false); m_ui->actionDatabaseSaveAs->setEnabled(false); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 6fa422f05..72de9b881 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -50,6 +50,7 @@ + @@ -198,6 +199,17 @@ Change master key + + + false + + + Database settings + + + Database settings + +