Package: keepassx Version: 0.4.3+dfsg-0.1 Severity: wishlist Tags: patch upstream
Dear Maintainer, I am using keepassx on a regular basis to store my credentials using multiple databases. I am using passphrases as well as key files to secure the individual kdb files, however switching between the different databases is a hassle due to the need to re-select the key file everytime. With the attached patch applied, keepassx optionally stores the path to the appropiate keyfile with each bookmark, making switching between the different databases easier. -- System Information: Debian Release: 7.1 APT prefers stable-updates APT policy: (500, 'stable-updates'), (500, 'stable') Architecture: i386 (i686) Kernel: Linux 3.2.0-4-686-pae (SMP w/4 CPU cores) Locale: LANG=de_DE.utf8, LC_CTYPE=de_DE.utf8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages keepassx depends on: ii libc6 2.13-38 ii libgcc1 1:4.7.2-5 ii libqt4-xml 4:4.8.2+dfsg-11 ii libqtcore4 4:4.8.2+dfsg-11 ii libqtgui4 4:4.8.2+dfsg-11 ii libstdc++6 4.7.2-5 ii libx11-6 2:1.5.0-1+deb7u1 ii libxtst6 2:1.2.1-1+deb7u1 keepassx recommends no packages. keepassx suggests no packages. -- no debconf information
>From 35348384cfa4cb46d3184723dde504865c3a5463 Mon Sep 17 00:00:00 2001 From: Stefan Tomanek <[email protected]> Date: Thu, 14 Nov 2013 15:03:32 +0100 Subject: [PATCH] store keyfile location in bookmark This patch adds the location of the keyfile used to unlock the database to the bookmark entry. This is especially useful if you use multiple databases and switch between them on a regular basis. --- src/dialogs/AddBookmarkDlg.cpp | 18 +++++++++++++++--- src/dialogs/AddBookmarkDlg.h | 3 ++- src/dialogs/ManageBookmarksDlg.cpp | 2 +- src/dialogs/PasswordDlg.cpp | 12 +++++++++--- src/dialogs/PasswordDlg.h | 2 ++ src/forms/AddBookmarkDlg.ui | 23 ++++++++++++++++++++--- src/lib/bookmarks.cpp | 12 ++++++++++-- src/lib/bookmarks.h | 6 ++++-- src/mainwindow.cpp | 10 +++++++--- src/mainwindow.h | 1 + 10 files changed, 71 insertions(+), 18 deletions(-) diff --git a/src/dialogs/AddBookmarkDlg.cpp b/src/dialogs/AddBookmarkDlg.cpp index c7337fb..78b1116 100644 --- a/src/dialogs/AddBookmarkDlg.cpp +++ b/src/dialogs/AddBookmarkDlg.cpp @@ -21,11 +21,12 @@ #include "AddBookmarkDlg.h" -AddBookmarkDlg::AddBookmarkDlg(QWidget* parent, QString DefaultFilename, int _ItemID):QDialog(parent) +AddBookmarkDlg::AddBookmarkDlg(QWidget* parent, QString DefaultFilename, QString DefaultKeyFilename, int _ItemID):QDialog(parent) { setupUi(this); ItemID=_ItemID; connect(Button_Browse,SIGNAL(clicked()),this,SLOT(OnButtonBrowse())); + connect(Button_Keyfile_Browse,SIGNAL(clicked()),this,SLOT(OnKeyfileButtonBrowse())); connect(buttonBox->button(QDialogButtonBox::Ok),SIGNAL(clicked()),this,SLOT(OnButtonOk())); connect(buttonBox->button(QDialogButtonBox::Cancel),SIGNAL(clicked()),this,SLOT(reject())); if(ItemID==-1){ @@ -35,12 +36,16 @@ AddBookmarkDlg::AddBookmarkDlg(QWidget* parent, QString DefaultFilename, int _It QMetaObject::invokeMethod(this, "OnButtonBrowse", Qt::QueuedConnection); else Edit_Filename->setText(DefaultFilename); + + if(!DefaultFilename.isEmpty()) + Edit_Keyfile->setText(DefaultKeyFilename); } else { createBanner(&BannerPixmap,getPixmap("bookmark_edit"),tr("Edit Bookmark"),width()); Edit_Title->setText(KpxBookmarks::title(ItemID)); Edit_Filename->setText(KpxBookmarks::path(ItemID)); + Edit_Keyfile->setText(KpxBookmarks::keypath(ItemID)); setWindowTitle(tr("Edit Bookmark")); } } @@ -59,10 +64,17 @@ void AddBookmarkDlg::OnButtonBrowse(){ Edit_Filename->setText(path); } +void AddBookmarkDlg::OnKeyfileButtonBrowse(){ + QString path=KpxFileDialogs::openExistingFile(this,"AddBookmarkDlg", tr("Add Bookmark"), + QStringList() << tr("All Files (*)")); + if(path!=QString()) + Edit_Keyfile->setText(path); +} + void AddBookmarkDlg::OnButtonOk(){ if(ItemID==-1) - ItemID=KpxBookmarks::add(Edit_Title->text(),Edit_Filename->text()); + ItemID=KpxBookmarks::add(Edit_Title->text(),Edit_Filename->text(),Edit_Keyfile->text()); else - KpxBookmarks::edit(Edit_Title->text(),Edit_Filename->text(),ItemID); + KpxBookmarks::edit(Edit_Title->text(),Edit_Filename->text(),Edit_Keyfile->text(),ItemID); accept(); } diff --git a/src/dialogs/AddBookmarkDlg.h b/src/dialogs/AddBookmarkDlg.h index 7786a62..26888f8 100644 --- a/src/dialogs/AddBookmarkDlg.h +++ b/src/dialogs/AddBookmarkDlg.h @@ -27,7 +27,7 @@ class AddBookmarkDlg : public QDialog, private Ui::AddBookmarkDlg Q_OBJECT public: - AddBookmarkDlg (QWidget* parent=0, QString DefaultFilename=QString(), int ItemID=-1); + AddBookmarkDlg (QWidget* parent=0, QString DefaultFilename=QString(), QString DefaultKeyFilename=QString(), int ItemID=-1); int ItemID; private: @@ -37,6 +37,7 @@ class AddBookmarkDlg : public QDialog, private Ui::AddBookmarkDlg private slots: void OnButtonOk(); void OnButtonBrowse(); + void OnKeyfileButtonBrowse(); }; diff --git a/src/dialogs/ManageBookmarksDlg.cpp b/src/dialogs/ManageBookmarksDlg.cpp index 21f467f..15ca7b4 100644 --- a/src/dialogs/ManageBookmarksDlg.cpp +++ b/src/dialogs/ManageBookmarksDlg.cpp @@ -112,7 +112,7 @@ void ManageBookmarksDlg::OnButtonDown(){ void ManageBookmarksDlg::edit(QListWidgetItem* item){ int i=item->data(Qt::UserRole).toInt(); - AddBookmarkDlg dlg(this,QString(),i); + AddBookmarkDlg dlg(this,QString(),QString(),i); dlg.exec(); item->setText(KpxBookmarks::title(i)); } diff --git a/src/dialogs/PasswordDlg.cpp b/src/dialogs/PasswordDlg.cpp index f9c3a30..0d80c94 100644 --- a/src/dialogs/PasswordDlg.cpp +++ b/src/dialogs/PasswordDlg.cpp @@ -136,7 +136,7 @@ PasswordDialog::PasswordDialog(QWidget* parent,DlgMode mode,DlgFlags flags,const // Adding all existing bookmarks for(int i=0;i<KpxBookmarks::count();i++){ QAction* action=new QAction(this); - action->setData(KpxBookmarks::path(i)); + action->setData(i); action->setText(KpxBookmarks::title(i)); action->setIcon(getIcon("document")); BookmarkMenu->addAction(action); @@ -172,6 +172,11 @@ PasswordDialog::PasswordDialog(QWidget* parent,DlgMode mode,DlgFlags flags,const OnCheckBoxesChanged(); } +void PasswordDialog::setKeyFile(QString keypath) +{ + Check_KeyFile->setChecked(! keypath.isEmpty()); + Combo_KeyFile->setEditText(keypath); +} void PasswordDialog::OnButtonBrowse() { @@ -331,9 +336,10 @@ void PasswordDialog::OnBookmarkTriggered(QAction* action){ if(action->data().toString()==QString()) setWindowTitle(Filename); else - setWindowTitle(action->data().toString()); + setWindowTitle(KpxBookmarks::path(action->data().toInt())); Label_Bookmark->setText(action->text()); - BookmarkFilename=action->data().toString(); + BookmarkFilename=KpxBookmarks::path(action->data().toInt()); + setKeyFile(KpxBookmarks::keypath(action->data().toInt())); } void PasswordDialog::OnGenKeyFile(){ diff --git a/src/dialogs/PasswordDlg.h b/src/dialogs/PasswordDlg.h index 4e2f9e6..ae55144 100644 --- a/src/dialogs/PasswordDlg.h +++ b/src/dialogs/PasswordDlg.h @@ -48,6 +48,8 @@ class PasswordDialog : public QDialog, private Ui_PasswordDlg { PasswordDialog(QWidget* parent,DlgMode mode,DlgFlags flags,const QString& filename=QString()); + void setKeyFile(QString keypath); + // result functions QString selectedBookmark(); QString keyFile(); diff --git a/src/forms/AddBookmarkDlg.ui b/src/forms/AddBookmarkDlg.ui index bfc938d..7120070 100644 --- a/src/forms/AddBookmarkDlg.ui +++ b/src/forms/AddBookmarkDlg.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>500</width> - <height>180</height> + <height>240</height> </rect> </property> <property name="sizePolicy" > @@ -19,13 +19,13 @@ <property name="minimumSize" > <size> <width>500</width> - <height>180</height> + <height>240</height> </size> </property> <property name="maximumSize" > <size> <width>500</width> - <height>180</height> + <height>240</height> </size> </property> <property name="windowTitle" > @@ -77,6 +77,23 @@ </property> </widget> </item> + <item row="2" column="0" > + <widget class="QLabel" name="label_3" > + <property name="text" > + <string>Keyfile:</string> + </property> + </widget> + </item> + <item row="2" column="1" > + <widget class="QLineEdit" name="Edit_Keyfile" /> + </item> + <item row="2" column="2" > + <widget class="QPushButton" name="Button_Keyfile_Browse" > + <property name="text" > + <string>Browse...</string> + </property> + </widget> + </item> </layout> </item> <item> diff --git a/src/lib/bookmarks.cpp b/src/lib/bookmarks.cpp index 1c3b748..8ac56e0 100644 --- a/src/lib/bookmarks.cpp +++ b/src/lib/bookmarks.cpp @@ -30,6 +30,7 @@ void KpxBookmarks::load(){ BookmarkEntry entry; entry.Title = config->settings.value( QString("Bookmarks/%1/Title").arg(i) ).toString(); entry.Path = config->settings.value( QString("Bookmarks/%1/Path").arg(i) ).toString(); + entry.KeyPath = config->settings.value( QString("Bookmarks/%1/Keypath").arg(i) ).toString(); if (!entry.Title.isNull() && !entry.Path.isNull()) Bookmarks << entry; } @@ -47,11 +48,15 @@ QString KpxBookmarks::path(int i){ return Bookmarks[i].Path; } +QString KpxBookmarks::keypath(int i){ + return Bookmarks[i].KeyPath; +} -int KpxBookmarks::add(const QString& Title,const QString& Path){ +int KpxBookmarks::add(const QString& Title,const QString& Path,const QString& KeyPath){ BookmarkEntry entry; entry.Title=Title; entry.Path=Path; + entry.KeyPath=KeyPath; entry.Index=Bookmarks.size(); Bookmarks<<entry; save(); @@ -62,6 +67,7 @@ void KpxBookmarks::save(){ for (int i=0;i<count();i++){ config->settings.setValue( QString("Bookmarks/%1/Title").arg(i+1), Bookmarks[i].Title ); config->settings.setValue( QString("Bookmarks/%1/Path").arg(i+1), Bookmarks[i].Path ); + config->settings.setValue( QString("Bookmarks/%1/KeyPath").arg(i+1), Bookmarks[i].KeyPath ); } config->settings.setValue("Bookmarks/size", count()); @@ -70,6 +76,7 @@ void KpxBookmarks::save(){ while ( config->settings.contains( QString("Bookmarks/%1/Title").arg(i) ) ){ config->settings.remove( QString("Bookmarks/%1/Title").arg(i) ); config->settings.remove( QString("Bookmarks/%1/Path").arg(i) ); + config->settings.remove( QString("Bookmarks/%1/KeyPath").arg(i) ); i++; } } @@ -79,9 +86,10 @@ void KpxBookmarks::remove(int index){ save(); } -void KpxBookmarks::edit(const QString& Title,const QString& Path,int i){ +void KpxBookmarks::edit(const QString& Title,const QString& Path,const QString& KeyPath, int i){ Bookmarks[i].Title=Title; Bookmarks[i].Path=Path; + Bookmarks[i].KeyPath=KeyPath; save(); } diff --git a/src/lib/bookmarks.h b/src/lib/bookmarks.h index 6d8d56d..50cab12 100644 --- a/src/lib/bookmarks.h +++ b/src/lib/bookmarks.h @@ -22,19 +22,21 @@ class KpxBookmarks { public: static void load(); - static int add(const QString& Title,const QString& Path); + static int add(const QString& Title,const QString& Path,const QString& KeyPath); static void remove(int id); - static void edit(const QString& Title,const QString& Path, int Index); + static void edit(const QString& Title,const QString& Path,const QString& KeyPath, int Index); static int count(); static void resort(QList<int> order); static QString title(int Index); static QString path(int Index); + static QString keypath(int Index); private: static void save(); class BookmarkEntry { public: QString Title; QString Path; + QString KeyPath; int Index; }; static QList<BookmarkEntry> Bookmarks; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 556ee3a..e8ca8f9 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -411,8 +411,7 @@ void KeepassMainWindow::setupDatabaseConnections(IDatabase* DB){ } } - -bool KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ +bool KeepassMainWindow::openDatabase(QString filename,QString keypath,bool IsAuto){ if (!QFile::exists(filename)){ QMessageBox::critical(this, tr("Error"), tr("The database file does not exist.")); return false; @@ -450,6 +449,7 @@ bool KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ if(IsAuto) flags = PasswordDialog::Flag_Auto; PasswordDialog dlg(this,PasswordDialog::Mode_Ask,flags,filename); + dlg.setKeyFile(keypath); if (InUnLock){ dlg.setWindowModality(Qt::WindowModal); unlockDlg = &dlg; @@ -515,6 +515,10 @@ bool KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ return true; } +bool KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ + return openDatabase(filename, QString(), IsAuto); +} + void KeepassMainWindow::fakeOpenDatabase(const QString& filename){ if (!QFile::exists(filename)){ QMessageBox::critical(this, tr("Error"), tr("The database file does not exist.")); @@ -1456,7 +1460,7 @@ void KeepassMainWindow::OnBookmarkTriggered(QAction* action){ } } else { - openDatabase(KpxBookmarks::path(action->data().toInt())); + openDatabase(KpxBookmarks::path(action->data().toInt()), KpxBookmarks::keypath(action->data().toInt())); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index a9b8d67..c76eccd 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -113,6 +113,7 @@ class KeepassMainWindow : public QMainWindow, private Ui_MainWindow{ void setStateGroupSelected(SelectionState s); void setStateEntrySelected(SelectionState s); bool openDatabase(QString filename,bool IsAuto=false); + bool openDatabase(QString filename,QString keypath,bool IsAuto=false); void fakeOpenDatabase(const QString& filename); void setupDatabaseConnections(IDatabase* DB); bool closeDatabase(bool lock=false); -- 1.7.10.4

