From 6a8c2114ebd347f902d842a5c86da59b43fa1e89 Mon Sep 17 00:00:00 2001 From: tarek_saidi Date: Sat, 16 Dec 2006 22:24:57 +0000 Subject: [PATCH] made password dialog working, moved key file creation from KeepassMainWindow to CPasswordDlg git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@121 b624d157-de02-0410-bad0-e51aec6abb33 --- src/Database.h | 6 +- src/PwmConfig.cpp | 198 +++++++------- src/PwmConfig.h | 105 ++++---- src/StandardDatabase.cpp | 17 +- src/StandardDatabase.h | 5 +- src/dialogs/PasswordDlg.cpp | 368 ++++++++++++++------------- src/dialogs/PasswordDlg.h | 60 ++--- src/dialogs/SettingsDlg.cpp | 26 +- src/forms/SettingsDlg.ui | 22 +- src/main.cpp | 1 - src/mainwindow.cpp | 168 ++++-------- src/mainwindow.h | 154 ++++++----- src/plugins/gnome/keepassx-gnome.cpp | 1 + 13 files changed, 551 insertions(+), 580 deletions(-) diff --git a/src/Database.h b/src/Database.h index f84c42b..7c63f94 100644 --- a/src/Database.h +++ b/src/Database.h @@ -227,6 +227,8 @@ This is the common base interface for databases. Every database class must imple */ class IDatabase{ public: + virtual ~IDatabase(){}; + //! Loads a database. /*! It is not allowed to call this function if a database is already loaded. \param identifier Normally this is the filename of the database but it can also be an IP address or something else if the database is not file based. @@ -385,8 +387,8 @@ public: class IFilePasswordAuth{ public: virtual void authByPwd(QString& password)=0; - virtual bool authByFile(QFile& file)=0; - virtual bool authByFileAndPwd(QString& password, QFile& file)=0; + virtual bool authByFile(QString& filename)=0; + virtual bool authByFileAndPwd(QString& password, QString& filename)=0; /*! Creates a key file. \param filename Filename of the new key file. \param length Length of the key file. diff --git a/src/PwmConfig.cpp b/src/PwmConfig.cpp index 3405483..44ee2ed 100755 --- a/src/PwmConfig.cpp +++ b/src/PwmConfig.cpp @@ -38,103 +38,113 @@ using namespace std; bool CConfig::loadFromIni(QString filename){ -QString defaultSearchOptions = "001101111"; -QString defaultPwGenOptions = "1111100001"; -ini.SetPath((const char*)filename.toUtf8()); -ini.ReadFile(); -ClipboardTimeOut=ini.GetValueI("Options","ClipboardTimeOut",20); -Toolbar=ini.GetValueB("UI","ShowToolbar",true); -EntryDetails=ini.GetValueB("UI","ShowEntryDetails",true); -OpenLast=ini.GetValueB("Options","RememberLastFile",true); -LastFile=ini.GetValue("Options","LastFile","").c_str(); -ParseColumnString(ini.GetValue("UI","Columns","1111100000").c_str(),Columns); -BannerColor1=ParseColorString(ini.GetValue("Options","BannerColor1","0,85,127").c_str()); -BannerColor2=ParseColorString(ini.GetValue("Options","BannerColor2","0,117,175").c_str()); -BannerTextColor=ParseColorString(ini.GetValue("Options","BannerTextColor","222,222,222").c_str()); -ShowPasswords=ini.GetValueB("Options","ShowPasswords",false); -OpenUrlCommand=ini.GetValue("Options","UrlCmd","kfmclient openURL %1").c_str(); -Language=ini.GetValue("Options","LangFile","").c_str(); -ParseBoolString(ini.GetValue("Options","SearchOptions",(const char*)defaultSearchOptions.toUtf8()).c_str(),defaultSearchOptions,SearchOptions,9); -ListView_HidePasswords=ini.GetValueB("UI","HidePasswords",true); -ListView_HideUsernames=ini.GetValueB("UI","HideUsernames",false); -ParseBoolString(ini.GetValue("Options","PwGenOptions",(const char*)defaultPwGenOptions.toUtf8()).c_str(),defaultPwGenOptions,PwGenOptions,10); -PwGenLength=ini.GetValueI("Options","PwGenLength",25); -PwGenCharList=ini.GetValue("Options","PwGenCharList","").c_str(); -ExpandGroupTree=ini.GetValueB("Options","ExpandGroupTree",true); -MainWinHeight=ini.GetValueI("UI","MainWinHeight",550); -MainWinWidth=ini.GetValueI("UI","MainWinWidth",900); -MainWinSplit1=ini.GetValueI("UI","MainWinSplit1",100); -MainWinSplit2=ini.GetValueI("UI","MainWinSplit2",300); -ParseIntString(ini.GetValue("UI","ColumnSizes","15,10,10,10,10,10,10,10,10,10").c_str(),ColumnSizes,10); -ShowStatusbar=ini.GetValueB("UI","ShowStatusbar",true); -AlternatingRowColors=ini.GetValueB("Options","AlternatingRowColors",true); -MountDir=ini.GetValue("Options","MountDir",DEFAULT_MOUNT_DIR).c_str(); -RememberLastKey=ini.GetValueB("Options","RememberLastKey",true); -LastKeyLocation=ini.GetValue("Options","LastKeyLocation","").c_str(); -LastKeyType=(tKeyType)ini.GetValueI("Options","LastKeyType",(int)PASSWORD); -if(!OpenLast)RememberLastKey=false; -ToolbarIconSize=ini.GetValueI("UI","ToolbarIconSize",16); - -QString IntegrPluginVal=ini.GetValue("Options","IntegrPlugin","None").c_str(); -if(IntegrPluginVal=="None") - IntegrPlugin=NONE; -else if(IntegrPluginVal=="Gnome") - IntegrPlugin=GNOME; -else if(IntegrPluginVal=="KDE") - IntegrPlugin=KDE; -else - IntegrPlugin=NONE; - -return true; + QString defaultSearchOptions = "001101111"; + QString defaultPwGenOptions = "1111100001"; + ini.SetPath((const char*)filename.toUtf8()); + ini.ReadFile(); + ClipboardTimeOut=ini.GetValueI("Options","ClipboardTimeOut",20); + Toolbar=ini.GetValueB("UI","ShowToolbar",true); + EntryDetails=ini.GetValueB("UI","ShowEntryDetails",true); + OpenLast=ini.GetValueB("Options","RememberLastFile",true); + LastFile=ini.GetValue("Options","LastFile","").c_str(); + ParseColumnString(ini.GetValue("UI","Columns","1111100000").c_str(),Columns); + BannerColor1=ParseColorString(ini.GetValue("Options","BannerColor1","0,85,127").c_str()); + BannerColor2=ParseColorString(ini.GetValue("Options","BannerColor2","0,117,175").c_str()); + BannerTextColor=ParseColorString(ini.GetValue("Options","BannerTextColor","222,222,222").c_str()); + ShowPasswords=ini.GetValueB("Options","ShowPasswords",false); + OpenUrlCommand=ini.GetValue("Options","UrlCmd","kfmclient openURL %1").c_str(); + Language=ini.GetValue("Options","LangFile","").c_str(); + ParseBoolString(ini.GetValue("Options","SearchOptions",(const char*)defaultSearchOptions.toUtf8()).c_str(),defaultSearchOptions,SearchOptions,9); + ListView_HidePasswords=ini.GetValueB("UI","HidePasswords",true); + ListView_HideUsernames=ini.GetValueB("UI","HideUsernames",false); + ParseBoolString(ini.GetValue("Options","PwGenOptions",(const char*)defaultPwGenOptions.toUtf8()).c_str(),defaultPwGenOptions,PwGenOptions,10); + PwGenLength=ini.GetValueI("Options","PwGenLength",25); + PwGenCharList=ini.GetValue("Options","PwGenCharList","").c_str(); + ExpandGroupTree=ini.GetValueB("Options","ExpandGroupTree",true); + MainWinHeight=ini.GetValueI("UI","MainWinHeight",550); + MainWinWidth=ini.GetValueI("UI","MainWinWidth",900); + MainWinSplit1=ini.GetValueI("UI","MainWinSplit1",100); + MainWinSplit2=ini.GetValueI("UI","MainWinSplit2",300); + ParseIntString(ini.GetValue("UI","ColumnSizes","15,10,10,10,10,10,10,10,10,10").c_str(),ColumnSizes,10); + ShowStatusbar=ini.GetValueB("UI","ShowStatusbar",true); + AlternatingRowColors=ini.GetValueB("Options","AlternatingRowColors",true); + MountDir=ini.GetValue("Options","MountDir",DEFAULT_MOUNT_DIR).c_str(); + RememberLastKey=ini.GetValueB("Options","RememberLastKey",true); + LastKeyLocation=ini.GetValue("Options","LastKeyLocation","").c_str(); + LastKeyType=(tKeyType)ini.GetValueI("Options","LastKeyType",(int)PASSWORD); + if(!OpenLast)RememberLastKey=false; + ToolbarIconSize=ini.GetValueI("UI","ToolbarIconSize",16); + ShowSysTrayIcon=ini.GetValueB("Options","ShowSysTrayIcon",false); + MinimizeToTray=ini.GetValueB("Options","MinimizeToTray",false); + SaveFileDlgHistory=ini.GetValueB("Options","SaveFileDlgHistory",true); + EnableBookmarkMenu=ini.GetValueB("Options","EnableBookmarkMenu",true); + GroupTreeRestore=ini.GetValueI("Options","GroupTreeRestore",1); + QString IntegrPluginVal=ini.GetValue("Options","IntegrPlugin","None").c_str(); + if(IntegrPluginVal=="None") + IntegrPlugin=NONE; + else if(IntegrPluginVal=="Gnome") + IntegrPlugin=GNOME; + else if(IntegrPluginVal=="KDE") + IntegrPlugin=KDE; + else + IntegrPlugin=NONE; + + return true; } bool CConfig::saveToIni(QString filename){ -ini.SetValueI("Options","ClipboardTimeOut",ClipboardTimeOut); -ini.SetValueB("UI","ShowToolbar",Toolbar); -ini.SetValueB("UI","ShowEntryDetails",EntryDetails); -ini.SetValueB("Options","RememberLastFile",OpenLast); - if(OpenLast)ini.SetValue("Options","LastFile",(const char*)LastFile.toUtf8()); - else ini.SetValue("Options","LastFile",""); -ini.SetValue("UI","Columns",(const char*)CreateColumnString().toUtf8(),true); -ini.SetValue("Options","BannerColor1",(const char*)CreateColorString(BannerColor1).toUtf8(),true); -ini.SetValue("Options","BannerColor2",(const char*)CreateColorString(BannerColor2).toUtf8(),true); -ini.SetValue("Options","BannerTextColor",(const char*)CreateColorString(BannerTextColor).toUtf8(),true); -ini.SetValueB("Options","ShowPasswords",ShowPasswords,true); -ini.SetValue("Options","UrlCmd",(const char*)OpenUrlCommand.toUtf8(),true); -ini.SetValue("Options","LangFile",(const char*)Language.toUtf8(),true); -ini.SetValue("Options","SearchOptions",(const char*)CreateBoolString(SearchOptions,9).toUtf8(),true); -ini.SetValueB("UI","HidePasswords",ListView_HidePasswords); -ini.SetValueB("UI","HideUsernames",ListView_HideUsernames); -ini.SetValue("Options","PwGenOptions",(const char*)CreateBoolString(PwGenOptions,10).toUtf8(),true); -ini.SetValueI("Options","PwGenLength",PwGenLength,true); -ini.SetValue("Options","PwGenCharList",(const char*)PwGenCharList.toUtf8(),true); -ini.SetValueB("Options","ExpandGroupTree",ExpandGroupTree,true); -ini.SetValueI("UI","MainWinHeight",MainWinHeight); -ini.SetValueI("UI","MainWinWidth",MainWinWidth); -ini.SetValueI("UI","MainWinSplit1",MainWinSplit1); -ini.SetValueI("UI","MainWinSplit2",MainWinSplit2); -ini.SetValue("UI","ColumnSizes",(const char*)CreateIntString(ColumnSizes,10).toUtf8(),true); -ini.SetValueB("UI","ShowStatusbar",ShowStatusbar); -ini.SetValueB("Options","AlternatingRowColors",AlternatingRowColors); -ini.SetValue("Options","MountDir",(const char*)MountDir.toUtf8()); -ini.SetValueB("Options","RememberLastKey",RememberLastKey); -if(RememberLastKey){ - ini.SetValue("Options","LastKeyLocation",(const char*)LastKeyLocation.toUtf8()); - ini.SetValueI("Options","LastKeyType",LastKeyType);} -else{ - ini.SetValue("Options","LastKeyLocation",""); - ini.SetValueI("Options","LastKeyType",0);} -ini.SetValueI("UI","ToolbarIconSize",ToolbarIconSize,true); - -if(IntegrPlugin==NONE) - ini.SetValue("Options","IntegrPlugin","None"); -if(IntegrPlugin==GNOME) - ini.SetValue("Options","IntegrPlugin","Gnome"); -if(IntegrPlugin==KDE) - ini.SetValue("Options","IntegrPlugin","KDE"); - -if(!ini.WriteFile())return false; -else return true; + ini.SetValueI("Options","ClipboardTimeOut",ClipboardTimeOut); + ini.SetValueB("UI","ShowToolbar",Toolbar); + ini.SetValueB("UI","ShowEntryDetails",EntryDetails); + ini.SetValueB("Options","RememberLastFile",OpenLast); + if(OpenLast)ini.SetValue("Options","LastFile",(const char*)LastFile.toUtf8()); + else ini.SetValue("Options","LastFile",""); + ini.SetValue("UI","Columns",(const char*)CreateColumnString().toUtf8(),true); + ini.SetValue("Options","BannerColor1",(const char*)CreateColorString(BannerColor1).toUtf8(),true); + ini.SetValue("Options","BannerColor2",(const char*)CreateColorString(BannerColor2).toUtf8(),true); + ini.SetValue("Options","BannerTextColor",(const char*)CreateColorString(BannerTextColor).toUtf8(),true); + ini.SetValueB("Options","ShowPasswords",ShowPasswords,true); + ini.SetValue("Options","UrlCmd",(const char*)OpenUrlCommand.toUtf8(),true); + ini.SetValue("Options","LangFile",(const char*)Language.toUtf8(),true); + ini.SetValue("Options","SearchOptions",(const char*)CreateBoolString(SearchOptions,9).toUtf8(),true); + ini.SetValueB("UI","HidePasswords",ListView_HidePasswords); + ini.SetValueB("UI","HideUsernames",ListView_HideUsernames); + ini.SetValue("Options","PwGenOptions",(const char*)CreateBoolString(PwGenOptions,10).toUtf8(),true); + ini.SetValueI("Options","PwGenLength",PwGenLength,true); + ini.SetValue("Options","PwGenCharList",(const char*)PwGenCharList.toUtf8(),true); + ini.SetValueB("Options","ExpandGroupTree",ExpandGroupTree,true); + ini.SetValueI("UI","MainWinHeight",MainWinHeight); + ini.SetValueI("UI","MainWinWidth",MainWinWidth); + ini.SetValueI("UI","MainWinSplit1",MainWinSplit1); + ini.SetValueI("UI","MainWinSplit2",MainWinSplit2); + ini.SetValue("UI","ColumnSizes",(const char*)CreateIntString(ColumnSizes,10).toUtf8(),true); + ini.SetValueB("UI","ShowStatusbar",ShowStatusbar); + ini.SetValueB("Options","AlternatingRowColors",AlternatingRowColors); + ini.SetValue("Options","MountDir",(const char*)MountDir.toUtf8()); + ini.SetValueB("Options","RememberLastKey",RememberLastKey); + ini.SetValueB("Options","ShowSysTrayIcon",ShowSysTrayIcon); + ini.SetValueB("Options","MinimizeToTray",MinimizeToTray); + ini.SetValueB("Options","SaveFileDlgHistory",SaveFileDlgHistory); + ini.SetValueB("Options","EnableBookmarkMenu",EnableBookmarkMenu); + ini.SetValueI("Options","GroupTreeRestore",GroupTreeRestore); + + if(RememberLastKey){ + ini.SetValue("Options","LastKeyLocation",(const char*)LastKeyLocation.toUtf8()); + ini.SetValueI("Options","LastKeyType",LastKeyType);} + else{ + ini.SetValue("Options","LastKeyLocation",""); + ini.SetValueI("Options","LastKeyType",0);} + ini.SetValueI("UI","ToolbarIconSize",ToolbarIconSize,true); + + if(IntegrPlugin==NONE) + ini.SetValue("Options","IntegrPlugin","None"); + if(IntegrPlugin==GNOME) + ini.SetValue("Options","IntegrPlugin","Gnome"); + if(IntegrPlugin==KDE) + ini.SetValue("Options","IntegrPlugin","KDE"); + + if(!ini.WriteFile())return false; + else return true; } void CConfig::ParseColumnString(QString str, bool* dst){ diff --git a/src/PwmConfig.h b/src/PwmConfig.h index add5294..8057dca 100755 --- a/src/PwmConfig.h +++ b/src/PwmConfig.h @@ -20,61 +20,66 @@ #ifndef _PWMCONFIG_H_ #define _PWMCONFIG_H_ +#include #include "main.h" #include "lib/IniReader.h" -#include - class CConfig{ -public: -enum IntegrPluginType{NONE,KDE,GNOME}; - int TimeFormat; - int ClipboardTimeOut; - bool Toolbar; - bool EntryDetails; - QString LastFile; - bool OpenLast; - bool Columns[10]; - QColor BannerColor1; - QColor BannerColor2; - QColor BannerTextColor; - bool ShowPasswords; - QString OpenUrlCommand; - QString Language; - bool SearchOptions[9]; - bool ListView_HidePasswords; - bool ListView_HideUsernames; - bool PwGenOptions[10]; - int PwGenLength; - QString PwGenCharList; - bool ExpandGroupTree; - bool EnableKdePlugin; - int MainWinHeight; - int MainWinWidth; - int MainWinSplit1; - int MainWinSplit2; - int ColumnSizes[10]; - bool ShowStatusbar; - bool AlternatingRowColors; - QString MountDir; - bool RememberLastKey; - tKeyType LastKeyType; - QString LastKeyLocation; - int ToolbarIconSize; - IntegrPluginType IntegrPlugin; - bool loadFromIni(QString filename); - bool saveToIni(QString filename); + public: + enum IntegrPluginType{NONE,KDE,GNOME}; + int TimeFormat; + int ClipboardTimeOut; + int MainWinHeight; + int MainWinWidth; + int MainWinSplit1; + int MainWinSplit2; + int ToolbarIconSize; + int PwGenLength; + int GroupTreeRestore; // 0:Restore Last; 1:Expand All; 2:Don't Expand + int ColumnSizes[10]; + bool Toolbar; + bool EntryDetails; + bool OpenLast; + bool ListView_HidePasswords; + bool ListView_HideUsernames; + bool SearchOptions[9]; + bool PwGenOptions[10]; + bool Columns[10]; + bool ShowPasswords; + bool ExpandGroupTree; + bool EnableKdePlugin; + bool ShowStatusbar; + bool AlternatingRowColors; + bool RememberLastKey; + bool ShowSysTrayIcon; + bool MinimizeToTray; + bool SaveFileDlgHistory; + bool EnableBookmarkMenu; + QString PwGenCharList; + QString MountDir; + QString LastKeyLocation; + QString OpenUrlCommand; + QString Language; + QString LastFile; + QColor BannerColor1; + QColor BannerColor2; + QColor BannerTextColor; + IntegrPluginType IntegrPlugin; + tKeyType LastKeyType; + + bool loadFromIni(QString filename); + bool saveToIni(QString filename); -private: - CIniFile ini; - void ParseColumnString(QString str, bool* dst); - void ParseBoolString(const QString &str,const QString &defaults,bool* dst, int count); - void ParseIntString(const QString &str,int* dst, int count); - QString CreateBoolString(bool* src, int count); - QColor ParseColorString(QString str); - QString CreateColumnString(); - QString CreateColorString(QColor); - QString CreateIntString(int* src, int count); + private: + CIniFile ini; + void ParseColumnString(QString str, bool* dst); + void ParseBoolString(const QString &str,const QString &defaults,bool* dst, int count); + void ParseIntString(const QString &str,int* dst, int count); + QString CreateBoolString(bool* src, int count); + QColor ParseColorString(QString str); + QString CreateColumnString(); + QString CreateColorString(QColor); + QString CreateIntString(int* src, int count); }; #endif \ No newline at end of file diff --git a/src/StandardDatabase.cpp b/src/StandardDatabase.cpp index 0c39dad..6e4cba0 100644 --- a/src/StandardDatabase.cpp +++ b/src/StandardDatabase.cpp @@ -666,7 +666,12 @@ void StandardDatabase::authByPwd(QString& Password){ return; } -bool StandardDatabase::authByFile(QFile& file){ +bool StandardDatabase::authByFile(QString& filename){ + QFile file(filename); + if(!file.open(QIODevice::ReadOnly|QIODevice::Unbuffered)){ + error=decodeFileError(file.error()); + return false; + } unsigned long FileSize=file.size(); if(FileSize == 0){ error=tr("Key file is empty."); @@ -674,14 +679,14 @@ bool StandardDatabase::authByFile(QFile& file){ } if(FileSize == 32){ if(file.read((char*)RawMasterKey,32) != 32){ - error=tr("Error while reading key file."); + error=decodeFileError(file.error()); return false;} return true; } if(FileSize == 64){ char hex[64]; if(file.read(hex,64) != 64){ - error=tr("Error while reading key file."); + error=decodeFileError(file.error()); return false;} if(convHexToBinaryKey(hex,(char*)RawMasterKey))return true; } @@ -699,10 +704,10 @@ bool StandardDatabase::authByFile(QFile& file){ return true; } -bool StandardDatabase::authByFileAndPwd(QString& Password, QFile& file){ +bool StandardDatabase::authByFileAndPwd(QString& Password, QString& filename){ unsigned char PasswordKey[32]; unsigned char FileKey[32]; - if(!authByFile(file))return false; + if(!authByFile(filename))return false; memcpy(FileKey,RawMasterKey,32); authByPwd(Password); memcpy(PasswordKey,RawMasterKey,32); @@ -711,6 +716,7 @@ bool StandardDatabase::authByFileAndPwd(QString& Password, QFile& file){ sha.update(PasswordKey,32); sha.update(FileKey,32); sha.finish(RawMasterKey); + return true; } QList StandardDatabase::entries(){ @@ -1511,6 +1517,7 @@ bool StandardDatabase::createKeyFile(const QString& filename,int length, bool He } file.close(); delete [] key; + return true; } diff --git a/src/StandardDatabase.h b/src/StandardDatabase.h index cc8d47f..fad36f9 100644 --- a/src/StandardDatabase.h +++ b/src/StandardDatabase.h @@ -139,6 +139,7 @@ public: QList Childs; QList Entries; }; + virtual ~StandardDatabase(){}; virtual bool load(QString identifier); virtual bool save(); virtual bool close(); @@ -155,8 +156,8 @@ public: virtual void replaceIcon(int index,const QPixmap& icon); virtual int builtinIcons(){return 62;}; virtual void authByPwd(QString& password); - virtual bool authByFile(QFile& file); - virtual bool authByFileAndPwd(QString& password, QFile& file); + virtual bool authByFile(QString& filename); + virtual bool authByFileAndPwd(QString& password, QString& filename); virtual bool createKeyFile(const QString& filename,int length=32, bool Hex=false); virtual QList search(IGroupHandle* Group,const QString& SearchString, bool CaseSensitve, bool RegExp,bool Recursive,bool* Fields); virtual QFile* file(){return File;} diff --git a/src/dialogs/PasswordDlg.cpp b/src/dialogs/PasswordDlg.cpp index 59346ae..5a83f82 100755 --- a/src/dialogs/PasswordDlg.cpp +++ b/src/dialogs/PasswordDlg.cpp @@ -31,94 +31,97 @@ #include -CPasswordDialog::CPasswordDialog(QWidget* parent, bool modal, bool ShowExitButton,bool ChangeKeyMode, Qt::WFlags fl) -: QDialog(parent,fl) +CPasswordDialog::CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButton,bool ChangeKeyMode) +: QDialog(parent) { -setupUi(this); -createBanner(Banner,Icon_Key32x32,tr("Database Key")); -QDir media(config.MountDir); -if(media.exists()){ - QStringList Paths; - Paths=media.entryList(QStringList()<<"*",QDir::Dirs); - Paths.erase(Paths.begin()); // delete "." - Paths.erase(Paths.begin()); // delete ".." - for(int i=0;iaddItem(config.MountDir+Paths[i]); -} - -Combo_Dirs->setEditText(QString()); -if(config.RememberLastKey && !ChangeKeyMode){ - switch(config.LastKeyType){ - //case PASSWORD: setStatePasswordOnly(); break; //Password-Only is already the default - case KEYFILE: setStateKeyFileOnly(); - Combo_Dirs->setEditText(config.LastKeyLocation); - break; - case BOTH: setStateBoth(); - CheckBox_Both->setChecked(true); - Combo_Dirs->setEditText(config.LastKeyLocation); - break; + setupUi(this); + createBanner(Banner,Icon_Key32x32,tr("Database Key")); + db=DB; + QDir media(config.MountDir); + if(media.exists()){ + QStringList Paths; + Paths=media.entryList(QStringList()<<"*",QDir::Dirs); + Paths.erase(Paths.begin()); // delete "." + Paths.erase(Paths.begin()); // delete ".." + for(int i=0;iaddItem(config.MountDir+Paths[i]); } -} - - -connect( Combo_Dirs, SIGNAL( editTextChanged(const QString&) ),this, SLOT( OnComboTextChanged(const QString&))); -connect( ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); -connect( Edit_Password, SIGNAL( textChanged(const QString&) ), this, SLOT( OnPasswordChanged(const QString&) ) ); -connect( CheckBox_Both, SIGNAL( stateChanged(int) ), this, SLOT( OnCheckBox_BothChanged(int) ) ); -connect( ButtonChangeEchoMode, SIGNAL( clicked() ), this, SLOT( ChangeEchoMode() ) ); -connect( Edit_Password, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); -connect( Edit_PasswordRep, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); -connect( ButtonExit, SIGNAL( clicked()),this,SLOT(OnButtonExit())); - -ButtonExit->setVisible(ShowExitButton); -Mode_Set=ChangeKeyMode; -if(!ChangeKeyMode){ - Edit_PasswordRep->hide(); - Label_PasswordRep->hide(); - connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) ); - connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse() ) ); -}else{ - connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK_Set() ) ); - connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse_Set() ) ); -} - -if(!config.ShowPasswords)ChangeEchoMode(); + + Combo_Dirs->setEditText(QString()); + if(config.RememberLastKey && !ChangeKeyMode){ + switch(config.LastKeyType){ + //case PASSWORD: setStatePasswordOnly(); break; //Password-Only is already the default + case KEYFILE: setStateKeyFileOnly(); + Combo_Dirs->setEditText(config.LastKeyLocation); + break; + case BOTH: setStateBoth(); + CheckBox_Both->setChecked(true); + Combo_Dirs->setEditText(config.LastKeyLocation); + break; + } + } + + connect( Combo_Dirs, SIGNAL( editTextChanged(const QString&) ),this, SLOT( OnComboTextChanged(const QString&))); + connect( ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); + connect( Edit_Password, SIGNAL( textChanged(const QString&) ), this, SLOT( OnPasswordChanged(const QString&) ) ); + connect( CheckBox_Both, SIGNAL( stateChanged(int) ), this, SLOT( OnCheckBox_BothChanged(int) ) ); + connect( ButtonChangeEchoMode, SIGNAL( clicked() ), this, SLOT( ChangeEchoMode() ) ); + connect( Edit_Password, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); + connect( Edit_PasswordRep, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); + connect( ButtonExit, SIGNAL( clicked()),this,SLOT(OnButtonExit())); + + ButtonExit->setVisible(ShowExitButton); + Mode_Set=ChangeKeyMode; + if(!ChangeKeyMode){ + Edit_PasswordRep->hide(); + Label_PasswordRep->hide(); + connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) ); + connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse() ) ); + }else{ + connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK_Set() ) ); + connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse_Set() ) ); + } + + if(!config.ShowPasswords)ChangeEchoMode(); } void CPasswordDialog::setStatePasswordOnly(){ -Combo_Dirs->setEnabled(false); -ButtonBrowse->setEnabled(false); -Label_KeyFile->setEnabled(false); -Label_Password->setEnabled(true); -Edit_Password->setEnabled(true); -Edit_PasswordRep->setEnabled(true); -ButtonChangeEchoMode->setEnabled(true); -KeyType=PASSWORD; + Combo_Dirs->setEnabled(false); + ButtonBrowse->setEnabled(false); + Label_KeyFile->setEnabled(false); + Label_Password->setEnabled(true); + Label_PasswordRep->setEnabled(true); + Edit_Password->setEnabled(true); + Edit_PasswordRep->setEnabled(true); + ButtonChangeEchoMode->setEnabled(true); + KeyType=PASSWORD; } void CPasswordDialog::setStateKeyFileOnly(){ -Combo_Dirs->setEnabled(true); -ButtonBrowse->setEnabled(true); -Label_KeyFile->setEnabled(true); -Label_Password->setEnabled(false); -Edit_Password->setEnabled(false); -Edit_PasswordRep->setEnabled(false); -ButtonChangeEchoMode->setEnabled(false); -KeyType=KEYFILE; + Combo_Dirs->setEnabled(true); + ButtonBrowse->setEnabled(true); + Label_KeyFile->setEnabled(true); + Label_Password->setEnabled(false); + Label_PasswordRep->setEnabled(false); + Edit_Password->setEnabled(false); + Edit_PasswordRep->setEnabled(false); + ButtonChangeEchoMode->setEnabled(false); + KeyType=KEYFILE; } void CPasswordDialog::setStateBoth(){ -Combo_Dirs->setEnabled(true); -ButtonBrowse->setEnabled(true); -Label_KeyFile->setEnabled(true); -Label_Password->setEnabled(true); -Edit_Password->setEnabled(true); -Edit_PasswordRep->setEnabled(true); -ButtonChangeEchoMode->setEnabled(true); -KeyType=BOTH; + Combo_Dirs->setEnabled(true); + ButtonBrowse->setEnabled(true); + Label_KeyFile->setEnabled(true); + Label_Password->setEnabled(true); + Label_PasswordRep->setEnabled(true); + Edit_Password->setEnabled(true); + Edit_PasswordRep->setEnabled(true); + ButtonChangeEchoMode->setEnabled(true); + KeyType=BOTH; } @@ -158,122 +161,129 @@ void CPasswordDialog::OnOK(){ if(password=="" && keyfile==""){ QMessageBox::warning(this,tr("Error"),tr("Please enter a Password or select a key file."),tr("OK"),"","",0,0); - return;} + return; + } - if(KeyType==BOTH){ - if(password==""){ - QMessageBox::warning(this,tr("Error"),tr("Please enter a Password."),tr("OK"),"","",0,0); - return;} - if(keyfile==""){ - QMessageBox::warning(this,tr("Error"),tr("Please choose a key file."),tr("OK"),"","",0,0); - return;} - } + if(KeyType==BOTH){ + if(password==""){ + QMessageBox::warning(this,tr("Error"),tr("Please enter a Password."),tr("OK"),"","",0,0); + return;} + if(keyfile==""){ + QMessageBox::warning(this,tr("Error"),tr("Please choose a key file."),tr("OK"),"","",0,0); + return;} + } - if(KeyType==BOTH || KeyType==KEYFILE){ - QFileInfo fileinfo(keyfile); - if(Mode_Set){ - if(fileinfo.exists()){ - switch(QMessageBox::question(this,tr("File exists."),tr("A file with the selected name already exists, should this file be used as key file\nor do you want to overwrite it with a new generated one?"), - tr("Use"),tr("Overwrite"),tr("Cancel"),0,2)){ - case 0: OverwriteKeyFile=false; - break; - case 1: OverwriteKeyFile=true; - break; - case 2: return; - } - } - - } - else{ - if(!fileinfo.exists()){ - QMessageBox::warning(this,tr("Error"),tr("The selected key file or directory does not exist."),tr("OK"),"","",0,0); - return; - } - if(!fileinfo.isReadable()){ - QMessageBox::warning(this,tr("Error"),tr("The selected key file or directory is not readable.\nPlease check your permissions."),tr("OK"),"","",0,0); - return; + if(KeyType==BOTH || KeyType==KEYFILE){ + QFileInfo fileinfo(keyfile); + if(!fileinfo.exists()){ + QMessageBox::warning(this,tr("Error"),tr("The selected key file or directory does not exist."),tr("OK"),"","",0,0); + return; + } + if(!fileinfo.isReadable()){ + QMessageBox::warning(this,tr("Error"),tr("The selected key file or directory is not readable.\nPlease check your permissions."),tr("OK"),"","",0,0); + return; + } + if(fileinfo.isDir()){ + if(keyfile.right(1)!="/")keyfile+="/"; + QFile file(keyfile+"pwsafe.key"); + if(!file.exists()){ + QDir dir(keyfile); + QStringList files; + files=dir.entryList(QStringList()<<"*.key",QDir::Files); + if(!files.size()){ + QMessageBox::warning(this,tr("Error"),tr("The given directory does not contain any key files."),tr("OK"),"","",0,0); + return;} + if(files.size()>1){ + QMessageBox::warning(this,tr("Error"),tr("The given directory contains more then one key file.\nPlease specify the key file directly."),tr("OK"),"","",0,0); + return;} + QFile file(keyfile+files[0]); + Q_ASSERT(file.exists()); + if(!QFileInfo(file).isReadable()){ + QMessageBox::warning(this,tr("Error"),tr("The key file found in the given directory is not readable.\nPlease check your permissions."),tr("OK"),"","",0,0); + return;} + keyfile+=files[0]; } - if(fileinfo.isDir()){ - if(keyfile.right(1)!="/")keyfile+="/"; - QFile file(keyfile+"pwsafe.key"); - if(!file.exists()){ - QDir dir(keyfile); - QStringList files; - files=dir.entryList(QStringList()<<"*.key",QDir::Files); - if(!files.size()){ - QMessageBox::warning(this,tr("Error"),tr("The given directory does not contain any key files."),tr("OK"),"","",0,0); - return;} - if(files.size()>1){ - QMessageBox::warning(this,tr("Error"),tr("The given directory contains more then one key file.\nPlease specify the key file directly."),tr("OK"),"","",0,0); - return;} - QFile file(keyfile+files[0]); - Q_ASSERT(file.exists()); - if(!QFileInfo(file).isReadable()){ - QMessageBox::warning(this,tr("Error"),tr("The key file found in the given directory is not readable.\nPlease check your permissions."),tr("OK"),"","",0,0); - return;} - keyfile+=files[0]; - }else{ - if(!QFileInfo(file).isReadable()){ - QMessageBox::warning(this,tr("Error"),tr("The key file found in the given directory is not readable.\nPlease check your permissions."),tr("OK"),"","",0,0); - return;} - keyfile+="pwsafe.key"; - } - }else{ - QFile file(keyfile); - if(!file.exists()){ - QMessageBox::warning(this,tr("Error"),tr("Key file could not be found."),tr("OK"),"","",0,0); - return;} - if(!QFileInfo(file).isReadable()){ - QMessageBox::warning(this,tr("Error"),tr("Key file is not readable.\nPlease check your permissions."),tr("OK"),"","",0,0); - return;} + else{ /* pwsafe.key exists */ + if(!QFileInfo(file).isReadable()){ + QMessageBox::warning(this,tr("Error"),tr("The key file found in the given directory is not readable.\nPlease check your permissions."),tr("OK"),"","",0,0); + return;} + keyfile+="pwsafe.key"; } - } -} + } + else{ /* not a directory */ + QFile file(keyfile); + if(!file.exists()){ + QMessageBox::warning(this,tr("Error"),tr("Key file could not be found."),tr("OK"),"","",0,0); + return;} + if(!QFileInfo(file).isReadable()){ + QMessageBox::warning(this,tr("Error"),tr("Key file is not readable.\nPlease check your permissions."),tr("OK"),"","",0,0); + return;} + } -if(config.RememberLastKey){ - config.LastKeyLocation=keyfile; - config.LastKeyType=KeyType; -} -done(1); + } +if(doAuth())done(1); } void CPasswordDialog::OnOK_Set(){ -password=Edit_Password->text(); -if(password!=Edit_PasswordRep->text()){ - QMessageBox::warning(this,tr("Warning"),tr("Password an password repetition are not equal.\nPlease check your input."),tr("OK"),"","",0,0); - return;} -keyfile=Combo_Dirs->currentText(); -if(password=="" && keyfile==""){ - QMessageBox::warning(this,tr("Error"),tr("Please enter a password or select a key file."),tr("OK"),"","",0,0); - return;} - -QFile file(keyfile); -if(QFileInfo(file).isDir()){ - if(keyfile.right(1)!="/")keyfile+="/"; - QFile file(keyfile+"pwsafe.key"); - if(file.exists()){ - int r=QMessageBox::warning(this,tr("Warning"),tr("A file with the name 'pwsafe.key' already exisits in the given directory.\nDo you want to replace it?"),tr("Yes"),tr("No"),"",1,1); - if(r)return; - if(!QFileInfo(file).isWritable()){ - QMessageBox::warning(this,tr("Error"),tr("The exisiting file is not writable."),tr("OK"),"","",0,0); - return;} + password=Edit_Password->text(); + if(password!=Edit_PasswordRep->text()){ + QMessageBox::warning(this,tr("Warning"),tr("Password an password repetition are not equal.\nPlease check your input."),tr("OK"),"","",0,0); + return; } - keyfile+="pwsafe.key"; -}else{ - QFile file(keyfile); - if(file.exists()){ - int r=QMessageBox::warning(this,tr("Warning"),tr("A file with the this name already exisits.\nDo you want to replace it?"),tr("Yes"),tr("No"),"",1,1); - if(r)return; - if(!QFileInfo(file).isWritable()){ - QMessageBox::warning(this,tr("Error"),tr("The exisiting file is not writable."),tr("OK"),"","",0,0); - return;} + keyfile=Combo_Dirs->currentText(); + if(password=="" && keyfile==""){ + QMessageBox::warning(this,tr("Error"),tr("Please enter a password or select a key file."),tr("OK"),"","",0,0); + return; } + + if(keyfile!=QString()){ + QFile file(keyfile); + if(QFileInfo(file).isDir()){ + if(keyfile.right(1)!="/")keyfile+="/"; + keyfile+="pwsafe.key"; + } + if(file.exists()){ + switch(QMessageBox::question(this,tr("File exists."),tr("A file with the selected name already exists, should this file be used as key file or do you want to overwrite it with a newly generated one?"), + tr("Use"),tr("Overwrite"),tr("Cancel"),0,2)){ + case 0: + OverwriteKeyFile=false; + break; + case 1: + OverwriteKeyFile=true; + break; + case 2: + return; + } + } + IFilePasswordAuth* DbAuth=dynamic_cast(db); + if(OverwriteKeyFile){ + if(!DbAuth->createKeyFile(keyfile,32,true)){ + QMessageBox::warning(this,tr("Error"),tr("Key file could not be created.\n%1").arg(db->getError()),tr("OK"),"","",0,0); + return; + } + } + } + if(doAuth())done(1); } -if(config.RememberLastKey){ - config.LastKeyLocation=keyfile; - config.LastKeyType=KeyType; -} -done(1); + +bool CPasswordDialog::doAuth(){ + IFilePasswordAuth* DbAuth=dynamic_cast(db); + if(password!=QString() && keyfile==QString()){ + DbAuth->authByPwd(password); + } + if(password==QString() && keyfile!=QString()){ + if(!DbAuth->authByFile(keyfile))return false; + } + if(password!=QString() && keyfile!=QString()){ + if(!DbAuth->authByFile(keyfile))return false; + } + + if(config.RememberLastKey){ + config.LastKeyLocation=keyfile; + config.LastKeyType=KeyType; + } + return true; + } void CPasswordDialog::OnPasswordChanged(const QString &txt){ diff --git a/src/dialogs/PasswordDlg.h b/src/dialogs/PasswordDlg.h index 7bf398e..da06618 100755 --- a/src/dialogs/PasswordDlg.h +++ b/src/dialogs/PasswordDlg.h @@ -17,42 +17,44 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "main.h" #ifndef PASSWORDDIALOG_H #define PASSWORDDIALOG_H -#include "lib/UrlLabel.h" #include "ui_PasswordDlg.h" +#include "main.h" +#include "lib/UrlLabel.h" +#include "Database.h" + class CPasswordDialog : public QDialog, public Ui_PasswordDlg { - Q_OBJECT - -private: -bool Mode_Set; //true = Set, false = Get -void setStatePasswordOnly(); -void setStateKeyFileOnly(); -void setStateBoth(); - -public: -QString keyfile; -QString password; -tKeyType KeyType; -bool OverwriteKeyFile; - -CPasswordDialog(QWidget* parent = 0, bool modal = false, - bool ShowExitButton = false, bool KeyMode_Set=false, Qt::WFlags fl = 0 ); + Q_OBJECT -public slots: - void OnOK(); - void OnOK_Set(); - void OnCancel(); - void OnButtonBrowse(); - void OnButtonBrowse_Set(); - void OnButtonExit(); - void OnPasswordChanged(const QString &txt); - void OnCheckBox_BothChanged(int state); - void ChangeEchoMode(); - void OnComboTextChanged(const QString&); + private: + bool Mode_Set; //true = Set, false = Get + IDatabase* db; + void setStatePasswordOnly(); + void setStateKeyFileOnly(); + void setStateBoth(); + bool doAuth(); + + public: + QString keyfile; + QString password; + tKeyType KeyType; + bool OverwriteKeyFile; + CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButton = false, bool KeyMode_Set=false); + + public slots: + void OnOK(); + void OnOK_Set(); + void OnCancel(); + void OnButtonBrowse(); + void OnButtonBrowse_Set(); + void OnButtonExit(); + void OnPasswordChanged(const QString &txt); + void OnCheckBox_BothChanged(int state); + void ChangeEchoMode(); + void OnComboTextChanged(const QString&); }; #endif diff --git a/src/dialogs/SettingsDlg.cpp b/src/dialogs/SettingsDlg.cpp index bc6b191..e2a0594 100755 --- a/src/dialogs/SettingsDlg.cpp +++ b/src/dialogs/SettingsDlg.cpp @@ -74,8 +74,22 @@ CSettingsDlg::CSettingsDlg(QWidget* parent):QDialog(parent,Qt::Dialog) color2=config.BannerColor2; textcolor=config.BannerTextColor; CheckBox_ShowPasswords->setChecked(config.ShowPasswords); + checkBox_ShowSysTrayIcon->setChecked(config.ShowSysTrayIcon); + checkBox_MinimizeToTray->setChecked(config.MinimizeToTray); + checkBox_SaveFileDlgHistory->setChecked(config.SaveFileDlgHistory); Edit_BrowserCmd->setText(config.OpenUrlCommand); -// CheckBox_ExpandGroupTree->setChecked(config.ExpandGroupTree); + + switch(config.GroupTreeRestore){ + case 1: + Radio_GroupTreeRestore->setChecked(true); + break; + case 2: + Radio_GroupTreeExpand->setChecked(true); + break; + case 3: + Radio_GroupTreeDoNothing->setChecked(true); + } + CheckBox_AlternatingRowColors->setChecked(config.AlternatingRowColors); Edit_MountDir->setText(config.MountDir); CheckBox_RememberLastKey->setChecked(config.RememberLastKey); @@ -133,9 +147,17 @@ void CSettingsDlg::apply(){ config.BannerTextColor=textcolor; config.ShowPasswords=CheckBox_ShowPasswords->isChecked(); config.OpenUrlCommand=Edit_BrowserCmd->text(); -// config.ExpandGroupTree=CheckBox_ExpandGroupTree->isChecked(); config.AlternatingRowColors=CheckBox_AlternatingRowColors->isChecked(); config.MountDir=Edit_MountDir->text(); + config.ShowSysTrayIcon=checkBox_ShowSysTrayIcon->isChecked(); + config.MinimizeToTray=checkBox_MinimizeToTray->isChecked(); + config.SaveFileDlgHistory=checkBox_SaveFileDlgHistory->isChecked(); + config.EnableBookmarkMenu=checkBox_EnableBookmarkMenu->isChecked(); + + if(Radio_GroupTreeRestore->isChecked())config.GroupTreeRestore=0; + if(Radio_GroupTreeExpand->isChecked())config.GroupTreeRestore=1; + if(Radio_GroupTreeDoNothing->isChecked())config.GroupTreeRestore=2; + if(config.MountDir!="" && config.MountDir.right(1)!="/") config.MountDir+="/"; config.RememberLastKey=CheckBox_RememberLastKey->isChecked(); diff --git a/src/forms/SettingsDlg.ui b/src/forms/SettingsDlg.ui index d2c31f3..1d10062 100644 --- a/src/forms/SettingsDlg.ui +++ b/src/forms/SettingsDlg.ui @@ -62,7 +62,7 @@ QTabWidget::Rounded - 0 + 4 @@ -209,7 +209,7 @@ - + Enable bookmark menu @@ -276,7 +276,7 @@ - + Do not expand any item @@ -827,7 +827,7 @@ - &Other + Advanced @@ -863,6 +863,13 @@ + + + + Mounting Root: + + + @@ -876,13 +883,6 @@ - - - - Mounting Root: - - - diff --git a/src/main.cpp b/src/main.cpp index 1a2e3e2..e15365d 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -95,7 +95,6 @@ int main(int argc, char **argv) { QString ArgFile,ArgCfg,ArgLang,IniFilename; QApplication* app=NULL; - AppDir=QString(argv[0]); AppDir.truncate(AppDir.lastIndexOf("/")); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 93ea270..f7be5df 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -73,7 +73,6 @@ KeepassMainWindow::KeepassMainWindow(const QString& ArgFile,QWidget *parent, Qt: statusBar()->addWidget(StatusBarGeneral,15); statusBar()->addWidget(StatusBarSelection,85); statusBar()->setVisible(config.ShowStatusbar); -// Group::UI_ExpandByDefault=config.ExpandGroupTree; setupConnections(); FileOpen=false; if(ArgFile!=QString()) @@ -202,7 +201,8 @@ void KeepassMainWindow::setupIcons(){ EditAutoTypeAction->setIcon(*Icon_AutoType); HelpHandbookAction->setIcon(*Icon_Help); SysTray->setIcon(QIcon(AppDir+"/../share/keepass/icons/keepassx_large.png")); - SysTray->show(); + if(config.ShowSysTrayIcon) + SysTray->show(); } void KeepassMainWindow::setupMenus(){ @@ -285,49 +285,19 @@ void KeepassMainWindow::setupDatabaseConnections(IDatabase* DB){ void KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ - Q_ASSERT(!FileOpen); if(!IsAuto){ config.LastKeyLocation=QString(); config.LastKeyType=PASSWORD;} - CPasswordDialog PasswordDlg(this,true,IsAuto); + db=dynamic_cast(new StandardDatabase()); + CPasswordDialog PasswordDlg(this,db,IsAuto,false); PasswordDlg.setWindowTitle(filename); - int r=PasswordDlg.exec(); - if(r==0) return; - if(r==2) {Start=false; return;} - Q_ASSERT(r==1); - db = new StandardDatabase(); + switch(PasswordDlg.exec()){ + case 0: return; + case 2: Start=false; return; + } GroupView->db=db; EntryView->db=db; - setupDatabaseConnections(db); - IFilePasswordAuth* auth=dynamic_cast(db); - if(PasswordDlg.password!="" && PasswordDlg.keyfile=="") - auth->authByPwd(PasswordDlg.password); - if(PasswordDlg.password=="" && PasswordDlg.keyfile!=""){ - QFile keyfile(PasswordDlg.keyfile); - if(!keyfile.open(QIODevice::ReadOnly)){ - delete db; - QMessageBox::critical(this,tr("Error"),tr("Could not open key file."),tr("OK")); - return; - } - if(!auth->authByFile(keyfile)){ - QMessageBox::critical(this,tr("Error"),db->getError(),tr("OK")); - delete db; - return; - } - } - if(PasswordDlg.password!="" && PasswordDlg.keyfile!=""){ - QFile keyfile(PasswordDlg.keyfile); - if(!keyfile.open(QIODevice::ReadOnly)){ - delete db; - QMessageBox::critical(this,tr("Error"),tr("Could not open key file."),tr("OK")); - return; - } - if(!auth->authByFileAndPwd(PasswordDlg.password,keyfile)){ - QMessageBox::critical(this,tr("Error"),db->getError(),tr("OK")); - delete db; - return; - } - } + setupDatabaseConnections(db); QString err; StatusBarGeneral->setText(tr("Loading Database...")); if(db->load(filename)==true){ @@ -341,19 +311,20 @@ void KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ else{ StatusBarGeneral->setText(tr("Loading Failed")); QString error=db->getError(); - bool KeyError=auth->isKeyError(); - delete db; if(error==QString())error=tr("Unknown error while loading database."); QMessageBox::critical(this,tr("Error") ,tr("The following error occured while opening the database:\n%1") .arg(error),tr("OK")); - if(KeyError) + if(dynamic_cast(db)->isKeyError()){ + delete db; openDatabase(filename,IsAuto); + } + else + delete db; } StatusBarGeneral->setText(tr("Ready")); } - bool KeepassMainWindow::closeDatabase(){ Q_ASSERT(FileOpen); Q_ASSERT(db!=NULL); @@ -381,52 +352,14 @@ bool KeepassMainWindow::closeDatabase(){ void KeepassMainWindow::OnFileNewKdb(){ - CPasswordDialog dlg(this,true,false,true); + IDatabase* db_new=dynamic_cast(new StandardDatabase()); + db_new->create(); + CPasswordDialog dlg(this,db_new,false,true); dlg.setWindowTitle("New Database"); if(dlg.exec()==1){ if(FileOpen) if(!closeDatabase())return; - db=new StandardDatabase(); - db->create(); - IFilePasswordAuth* DbAuth=dynamic_cast(db); - if(dlg.KeyType==BOTH || dlg.KeyType==KEYFILE){ - bool KeyFileExists=QFileInfo(dlg.keyfile).exists(); - if((KeyFileExists && dlg.OverwriteKeyFile) || !KeyFileExists){ - if(!DbAuth->createKeyFile(dlg.keyfile)){ - QMessageBox::warning(this,tr("Error"),tr("Could not create key file. The following error occured:\n%1").arg(db->getError()),tr("OK"),"","",0,0); - delete db; db=NULL; - return; - } - } - } - if(dlg.password!="" && dlg.keyfile=="") - DbAuth->authByPwd(dlg.password); - if(dlg.password=="" && dlg.keyfile!=""){ - QFile keyfile(dlg.keyfile); - if(!keyfile.open(QIODevice::ReadOnly)){ - delete db; - QMessageBox::critical(this,tr("Error"),tr("Could not open key file."),tr("OK")); - return; - } - if(!DbAuth->authByFile(keyfile)){ - QMessageBox::critical(this,tr("Error"),db->getError(),tr("OK")); - delete db; - return; - } - } - if(dlg.password!="" && dlg.keyfile!=""){ - QFile keyfile(dlg.keyfile); - if(!keyfile.open(QIODevice::ReadOnly)){ - delete db; - QMessageBox::critical(this,tr("Error"),tr("Could not open key file."),tr("OK")); - return; - } - if(!DbAuth->authByFileAndPwd(dlg.password,keyfile)){ - QMessageBox::critical(this,tr("Error"),db->getError(),tr("OK")); - delete db; - return; - } - } + db=dynamic_cast(db_new); setWindowTitle(tr("%1 - KeePassX").arg(tr("[new]"))); GroupView->db=db; EntryView->db=db; @@ -438,8 +371,12 @@ void KeepassMainWindow::OnFileNewKdb(){ setupDatabaseConnections(db); setStateGroupSelected(NONE); setStateEntrySelected(NONE); - } } + else{ + delete db_new; + } + +} void KeepassMainWindow::OnFileNewKxdb(){ @@ -694,27 +631,9 @@ if(dlg.exec())setStateFileModified(true); } void KeepassMainWindow::OnFileChangeKey(){ - /* -CPasswordDialog dlg(this,true,false,true); -dlg.setWindowTitle(db->file->fileName()); -if(dlg.exec()==1){ - if(dlg.KeyType==BOTH || dlg.KeyType==KEYFILE){ - if(!db->createKeyFile(dlg.keyfile)){ - QMessageBox::warning(this,tr("Error"),tr("Could not create key file. The following error occured:\n%1").arg(db->getError()),tr("OK"),"","",0,0); - return; - } - } - IFilePasswordAuth* auth=dynamic_castdb; - if(dlg.password!="" && dlg.keyfile=="") - auth->authByPwd(dlg.password); - if(dlg.password=="" && dlg.keyfile!="") - auth->authByFile(dlg.keyfile); - if(dlg.password!="" && dlg.keyfile!="") - auth->authByFileAndPw(dlg.keyfile,dlg.password); - setStateFileModified(true); -} - */ - + CPasswordDialog dlg(this,db,false,true); + if(dlg.exec()) + setStateFileModified(true); } void KeepassMainWindow::OnFileExit(){ @@ -866,18 +785,18 @@ void KeepassMainWindow::OnQuickSearch(){ } void KeepassMainWindow::OnColumnVisibilityChanged(bool value){ -config.Columns[0]=ViewColumnsTitleAction->isChecked(); -config.Columns[1]=ViewColumnsUsernameAction->isChecked(); -config.Columns[2]=ViewColumnsUrlAction->isChecked(); -config.Columns[3]=ViewColumnsPasswordAction->isChecked(); -config.Columns[4]=ViewColumnsCommentAction->isChecked(); -config.Columns[5]=ViewColumnsExpireAction->isChecked(); -config.Columns[6]=ViewColumnsCreationAction->isChecked(); -config.Columns[7]=ViewColumnsLastChangeAction->isChecked(); -config.Columns[8]=ViewColumnsLastAccessAction->isChecked(); -config.Columns[9]=ViewColumnsAttachmentAction->isChecked(); -//EntryView->updateColumns(); -//if(FileOpen) EntryView->updateItems(); + config.Columns[0]=ViewColumnsTitleAction->isChecked(); + config.Columns[1]=ViewColumnsUsernameAction->isChecked(); + config.Columns[2]=ViewColumnsUrlAction->isChecked(); + config.Columns[3]=ViewColumnsPasswordAction->isChecked(); + config.Columns[4]=ViewColumnsCommentAction->isChecked(); + config.Columns[5]=ViewColumnsExpireAction->isChecked(); + config.Columns[6]=ViewColumnsCreationAction->isChecked(); + config.Columns[7]=ViewColumnsLastChangeAction->isChecked(); + config.Columns[8]=ViewColumnsLastAccessAction->isChecked(); + config.Columns[9]=ViewColumnsAttachmentAction->isChecked(); + //EntryView->updateColumns(); + //if(FileOpen) EntryView->updateItems(); } void KeepassMainWindow::OnUsernPasswVisibilityChanged(bool value){ @@ -891,7 +810,7 @@ setStateFileModified(true); } void KeepassMainWindow::closeEvent(QCloseEvent* e){ - if(!ShutingDown){ + if(!ShutingDown && config.MinimizeToTray){ e->ignore(); hide(); return; @@ -918,10 +837,11 @@ void KeepassMainWindow::closeEvent(QCloseEvent* e){ void KeepassMainWindow::OnExtrasSettings(){ -CSettingsDlg dlg(this); -dlg.exec(); -EntryView->setAlternatingRowColors(config.AlternatingRowColors); -//Group::UI_ExpandByDefault=config.ExpandGroupTree; + CSettingsDlg dlg(this); + if(dlg.exec()==1){ + EntryView->setAlternatingRowColors(config.AlternatingRowColors); + SysTray->setVisible(config.ShowSysTrayIcon); + } } void KeepassMainWindow::OnHelpAbout(){ diff --git a/src/mainwindow.h b/src/mainwindow.h index c5a54ea..9b0e788 100755 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -46,88 +46,80 @@ #include "ui_MainWindow.h" - - class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ -Q_OBJECT -public: - KeepassMainWindow (const QString& ArgFile,QWidget *parent=0, Qt::WFlags flags=0); - StandardDatabase* db; - bool Start; - -signals: - void entryChanged(); - -private slots: - void OnFileNewKdb(); - void OnFileNewKxdb(); - void OnFileOpen(); - void OnFileClose(); - bool OnFileSave(); - bool OnFileSaveAs(); - void OnFileSettings(); - void OnFileChangeKey(); - void OnFileExit(); - void OnImportFromPwm(); - void OnImportFromKWalletXml(); - void OnExportToTxt(); - void OnEditOpenUrl(); - void OnSearch(); - void OnGroupSearch(); - void OnViewShowToolbar(bool); - void OnViewShowEntryDetails(bool); - void OnViewToolbarIconSize16(bool); - void OnViewToolbarIconSize22(bool); - void OnViewToolbarIconSize28(bool); - void OnGroupSelectionChanged(IGroupHandle*); - void OnQuickSearch(); - void OnColumnVisibilityChanged(bool show); - void OnUsernPasswVisibilityChanged(bool hide); - void OnFileModified(); - void OnExtrasSettings(); - void OnExtrasPasswordGen(); - void OnHelpAbout(); - void OnHelpHandbook(); - void OnItemExpanded(QTreeWidgetItem*); - void OnItemCollaped(QTreeWidgetItem*); - void OnShowSearchResults(); - void OnEntryChanged(SelectionState); - void OnSysTrayActivated(QSystemTrayIcon::ActivationReason); - -private: - SelectionState GroupSelection, EntrySelection; - bool FileOpen; - bool ModFlag; - QList SearchResults; - inline void setupToolbar(); - inline void setupIcons(); - inline void setupConnections(); - inline void setupMenus(); - void setStateFileOpen(bool); - void setStateFileModified(bool); - void setStateGroupSelected(SelectionState s); - void setStateEntrySelected(SelectionState s); - void openDatabase(QString filename,bool IsStart=false); - void setupDatabaseConnections(IDatabase* DB); - bool closeDatabase(); - void search(IGroupHandle* Group); - void removeFromSearchResults(int sID); - void updateDetailView(); - QLineEdit* QuickSearchEdit; - QLabel* StatusBarGeneral; - QLabel* StatusBarSelection; - QToolBar* toolBar; - QSystemTrayIcon* SysTray; - QAction* ViewShowToolbarAction; - QMenu* SysTrayMenu; - bool ShutingDown; -protected: - void closeEvent(QCloseEvent* event); - - - + Q_OBJECT + public: + KeepassMainWindow (const QString& ArgFile,QWidget *parent=0, Qt::WFlags flags=0); + IDatabase* db; + bool Start; + + signals: + void entryChanged(); + + private slots: + void OnFileNewKdb(); + void OnFileNewKxdb(); + void OnFileOpen(); + void OnFileClose(); + bool OnFileSave(); + bool OnFileSaveAs(); + void OnFileSettings(); + void OnFileChangeKey(); + void OnFileExit(); + void OnImportFromPwm(); + void OnImportFromKWalletXml(); + void OnExportToTxt(); + void OnEditOpenUrl(); + void OnSearch(); + void OnGroupSearch(); + void OnViewShowToolbar(bool); + void OnViewShowEntryDetails(bool); + void OnViewToolbarIconSize16(bool); + void OnViewToolbarIconSize22(bool); + void OnViewToolbarIconSize28(bool); + void OnGroupSelectionChanged(IGroupHandle*); + void OnQuickSearch(); + void OnColumnVisibilityChanged(bool show); + void OnUsernPasswVisibilityChanged(bool hide); + void OnFileModified(); + void OnExtrasSettings(); + void OnExtrasPasswordGen(); + void OnHelpAbout(); + void OnHelpHandbook(); + void OnItemExpanded(QTreeWidgetItem*); + void OnItemCollaped(QTreeWidgetItem*); + void OnShowSearchResults(); + void OnEntryChanged(SelectionState); + void OnSysTrayActivated(QSystemTrayIcon::ActivationReason); + + private: + void closeEvent(QCloseEvent* event); + SelectionState GroupSelection, EntrySelection; + bool FileOpen; + bool ModFlag; + QList SearchResults; + inline void setupToolbar(); + inline void setupIcons(); + inline void setupConnections(); + inline void setupMenus(); + void setStateFileOpen(bool); + void setStateFileModified(bool); + void setStateGroupSelected(SelectionState s); + void setStateEntrySelected(SelectionState s); + void openDatabase(QString filename,bool IsAuto=false); + void setupDatabaseConnections(IDatabase* DB); + bool closeDatabase(); + void search(IGroupHandle* Group); + void removeFromSearchResults(int sID); + void updateDetailView(); + QLineEdit* QuickSearchEdit; + QLabel* StatusBarGeneral; + QLabel* StatusBarSelection; + QToolBar* toolBar; + QSystemTrayIcon* SysTray; + QAction* ViewShowToolbarAction; + QMenu* SysTrayMenu; + bool ShutingDown; }; - - #endif diff --git a/src/plugins/gnome/keepassx-gnome.cpp b/src/plugins/gnome/keepassx-gnome.cpp index de00790..2756e14 100644 --- a/src/plugins/gnome/keepassx-gnome.cpp +++ b/src/plugins/gnome/keepassx-gnome.cpp @@ -39,6 +39,7 @@ QString GnomePlugin::openExistingFileDialog(QWidget* parent,QString title,QStrin GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(FileDlg),CSTR(dir)); GtkFileFilter** filters=parseFilterStrings(Filters);