diff options
author | Andrew Meyer <apmeyer@bgsu.edu> | 2020-05-09 06:48:03 +0300 |
---|---|---|
committer | Jonathan White <support@dmapps.us> | 2020-05-16 18:00:27 +0300 |
commit | 45848c3f611b88015c8227be197baac07a284b3d (patch) | |
tree | 04f2706254702c443a01cd09308acfbd1473338f /src/gui/DatabaseWidget.cpp | |
parent | 2237cf0188af38898e1492f5d7ce2c0f087c8f35 (diff) |
Implement 'Save Database Backup' option
Add an option in the 'Database' menu to save a backup of the current database.
Add unit test for saving database copy
* Open a test database, mark it as modified, and save a copy
* Fail if the copy is not a valid database
* Fail if the original database is saved
* Fail if the original database is no longer marked as modified
Diffstat (limited to 'src/gui/DatabaseWidget.cpp')
-rw-r--r-- | src/gui/DatabaseWidget.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index a7531537e..310f141d7 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1866,6 +1866,53 @@ bool DatabaseWidget::saveAs() } } +/** + * Save copy of database under a new user-selected filename. + * + * @return true on success + */ +bool DatabaseWidget::saveBackup() +{ + while (true) { + QString oldFilePath = m_db->filePath(); + if (!QFileInfo::exists(oldFilePath)) { + oldFilePath = QDir::toNativeSeparators(config()->get(Config::LastDir).toString() + "/" + + tr("Passwords").append(".kdbx")); + } + const QString newFilePath = fileDialog()->getSaveFileName(this, + tr("Save database backup"), + oldFilePath, + tr("KeePass 2 Database").append(" (*.kdbx)"), + nullptr, + nullptr); + + if (!newFilePath.isEmpty()) { + // Ensure we don't recurse back into this function + m_db->setReadOnly(false); + m_db->setFilePath(newFilePath); + m_saveAttempts = 0; + + bool modified = m_db->isModified(); + + if (!save()) { + // Failed to save, try again + m_db->setFilePath(oldFilePath); + continue; + } + + m_db->setFilePath(oldFilePath); + if (modified) { + // Source database is marked as clean when copy is saved, even if source has unsaved changes + m_db->markAsModified(); + } + return true; + } + + // Canceled file selection + return false; + } +} + void DatabaseWidget::showMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton, |