From 37aedc8b03fc4f6a837d2bac3ed3630a7136f899 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Wed, 9 Nov 2016 07:38:14 -0500 Subject: [PATCH] Cleaned up code and added spots for todo work. Fully Working! --- src/CMakeLists.txt | 1 - src/core/FileSystemWatcher.cpp | 75 ------------------------------- src/core/FileSystemWatcher.h | 47 ------------------- src/gui/DatabaseWidget.cpp | 61 +++++++++++++++++-------- src/gui/DatabaseWidget.h | 11 +++-- src/gui/SettingsWidgetGeneral.ui | 22 ++++----- tests/data/NewDatabase.kdbx | Bin 8350 -> 15150 bytes 7 files changed, 62 insertions(+), 155 deletions(-) delete mode 100644 src/core/FileSystemWatcher.cpp delete mode 100644 src/core/FileSystemWatcher.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 59ada8766..3d3d3f5f8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -40,7 +40,6 @@ set(keepassx_SOURCES autotype/test/AutoTypeTestInterface.h core/AutoTypeAssociations.cpp core/Config.cpp - core/FileSystemWatcher.cpp core/Database.cpp core/DatabaseIcons.cpp core/Endian.cpp diff --git a/src/core/FileSystemWatcher.cpp b/src/core/FileSystemWatcher.cpp deleted file mode 100644 index 93b4f6f3f..000000000 --- a/src/core/FileSystemWatcher.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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 "FileSystemWatcher.h" -#include -#include -#include - -FileSystemWatcher::FileSystemWatcher (): QFileSystemWatcher ( ) -{ - connect(this,SIGNAL( fileChanged ( const QString & )), - this,SLOT( fileChangedSlot ( const QString & ))); - connect(this,SIGNAL( directoryChanged ( const QString & )), - this,SLOT( directoryChangedSlot ( const QString & ))); -} - -void FileSystemWatcher::watchFile(const QString &file) -{ - _file=file; - if (!files().isEmpty()) - removePaths(files()); - if (!directories().isEmpty()) - removePaths(directories()); - QFileInfo fileInfo(file); - if (fileInfo.exists()) - addPath(file); - QString filePath=fileInfo.absoluteDir().path(); - QFileInfo filePathInfo(filePath); - if (filePathInfo.exists()) - addPath(filePath); -} - -void FileSystemWatcher::stopWatching() -{ - watchFile( QString() ); -} - -void FileSystemWatcher::fileChangedSlot ( const QString & ) -{ - QFileInfo fileInfo(_file); - if ( fileInfo.exists() ) - fileChanged(); -} - -void FileSystemWatcher::directoryChangedSlot ( const QString & ) -{ - if (!files().contains(_file)) - { - QFileInfo fileInfo(_file); - if ( fileInfo.exists() ) - { - addPath(_file); - fileChanged(); - } - } -} - -FileSystemWatcher::~FileSystemWatcher() -{ -} - diff --git a/src/core/FileSystemWatcher.h b/src/core/FileSystemWatcher.h deleted file mode 100644 index 4721a98b7..000000000 --- a/src/core/FileSystemWatcher.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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 FILE_SYSTEM_WATCHER_H -#define FILE_SYSTEM_WATCHER_H -#include -#include -#include - - -class FileSystemWatcher : public QFileSystemWatcher -{ - Q_OBJECT ; - -public: - FileSystemWatcher (); - void watchFile( const QString & ); - void stopWatching(); - - virtual ~FileSystemWatcher(); - -private: - QString _file; - -private Q_SLOTS: - void directoryChangedSlot ( const QString & ); - void fileChangedSlot ( const QString & ); -Q_SIGNALS: - void fileChanged(); -}; - -#endif - diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 8915e5c06..f9b635af0 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include "autotype/AutoType.h" @@ -157,8 +156,12 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) connect(m_databaseOpenMergeWidget, SIGNAL(editFinished(bool)), SLOT(mergeDatabase(bool))); connect(m_keepass1OpenWidget, SIGNAL(editFinished(bool)), SLOT(openDatabase(bool))); connect(m_unlockDatabaseWidget, SIGNAL(editFinished(bool)), SLOT(unlockDatabase(bool))); + connect(&m_fileWatcher, SIGNAL(fileChanged(QString)), this, SLOT(onWatchedFileChanged())); + connect(&m_fileWatchTimer, SIGNAL(timeout()), this, SLOT(reloadDatabaseFile())); connect(this, SIGNAL(currentChanged(int)), this, SLOT(emitCurrentModeChanged())); + m_fileWatchTimer.setSingleShot(true); + m_searchCaseSensitive = false; m_searchCurrentGroup = false; @@ -662,11 +665,10 @@ void DatabaseWidget::openDatabase(bool accepted) m_databaseOpenWidget = nullptr; delete m_keepass1OpenWidget; m_keepass1OpenWidget = nullptr; - if (config()->get("AutoReloadOnChange").toBool() ) - m_file_watcher.watchFile( m_filename ); + m_fileWatcher.addPath(m_filename); } else { - m_file_watcher.stopWatching(); + m_fileWatcher.removePath(m_filename); if (m_databaseOpenWidget->database()) { delete m_databaseOpenWidget->database(); } @@ -939,29 +941,52 @@ void DatabaseWidget::updateFilename(const QString& fileName) m_filename = fileName; } -void DatabaseWidget::databaseModifedExternally() +void DatabaseWidget::onWatchedFileChanged() { - if ( database() == Q_NULLPTR ) + if (m_fileWatchTimer.isActive()) return; - if ( ! config()->get("AutoReloadOnChange").toBool() ) + m_fileWatchTimer.start(500); +} + +void DatabaseWidget::reloadDatabaseFile() +{ + if (m_db == nullptr) return; + // TODO: Also check if db is currently modified before reloading + if (! config()->get("AutoReloadOnChange").toBool()) { + // Ask if we want to reload the db + QMessageBox::StandardButton mb = MessageBox::question(this, tr("Reload database file"), + tr("The database file has changed. Do you want to load the changes?"), + QMessageBox::Yes | QMessageBox::No); + + if (mb == QMessageBox::No) { + // TODO: taint database + + // Rewatch the database file + m_fileWatcher.addPath(m_filename); + return; + } + } + KeePass2Reader reader; QFile file(m_filename); - if (!file.open(QIODevice::ReadOnly)) { - // TODO: error message - return; + if (file.open(QIODevice::ReadOnly)) { + Database* db = reader.readDatabase(&file, database()->key()); + if (db != nullptr) { + replaceDatabase(db); + } + else { + // TODO: error message for failure to read the new db + } } - Database* db = reader.readDatabase(&file, database()->key() ); - if ( db ) - { - Database* oldDb = m_db; - m_db = db; - m_groupView->changeDatabase(m_db); - Q_EMIT databaseChanged(m_db); - delete oldDb; + else { + // TODO: error message for failure to open db file } + + // Rewatch the database file + m_fileWatcher.addPath(m_filename); } int DatabaseWidget::numberOfSelectedEntries() const diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 57211c05f..11b5d3963 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -20,11 +20,12 @@ #include #include +#include +#include #include "core/Uuid.h" #include "gui/entry/EntryModel.h" -#include "core/FileSystemWatcher.h" class ChangeMasterKeyWidget; class DatabaseOpenWidget; @@ -42,6 +43,7 @@ class QMenu; class QSplitter; class QLabel; class UnlockDatabaseWidget; +class QFileSystemWatcher; class DatabaseWidget : public QStackedWidget { @@ -149,10 +151,12 @@ private Q_SLOTS: void updateMasterKey(bool accepted); void openDatabase(bool accepted); void mergeDatabase(bool accepted); - void databaseModifedExternally(); void unlockDatabase(bool accepted); void emitCurrentModeChanged(); void clearLastGroup(Group* group); + // Database autoreload slots + void onWatchedFileChanged(); + void reloadDatabaseFile(); private: void setClipboardTextAndMinimize(const QString& text); @@ -186,7 +190,8 @@ private: bool m_searchCaseSensitive; bool m_searchCurrentGroup; - FileSystemWatcher m_file_watcher; + QFileSystemWatcher m_fileWatcher; + QTimer m_fileWatchTimer; }; #endif // KEEPASSX_DATABASEWIDGET_H diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui index 843e16fec..223e2b9af 100644 --- a/src/gui/SettingsWidgetGeneral.ui +++ b/src/gui/SettingsWidgetGeneral.ui @@ -7,7 +7,7 @@ 0 0 684 - 394 + 430 @@ -103,14 +103,7 @@ - - - - Show a system tray icon - - - - + QLayout::SetMaximumSize @@ -149,7 +142,7 @@ - + QLayout::SetMaximumSize @@ -179,7 +172,7 @@ - + QLayout::SetMaximumSize @@ -209,6 +202,13 @@ + + + + Show a system tray icon + + + diff --git a/tests/data/NewDatabase.kdbx b/tests/data/NewDatabase.kdbx index 4e77724c7e8cfdf22bcd951ccfcaa4ae7f49d460..f45929de27c5bd3a879623ab351175917c85b06a 100644 GIT binary patch literal 15150 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 H_$CGbEb8x@