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
master
tarek_saidi 18 years ago
parent d5ed360fce
commit 6a8c2114eb
  1. 6
      src/Database.h
  2. 198
      src/PwmConfig.cpp
  3. 105
      src/PwmConfig.h
  4. 17
      src/StandardDatabase.cpp
  5. 5
      src/StandardDatabase.h
  6. 362
      src/dialogs/PasswordDlg.cpp
  7. 56
      src/dialogs/PasswordDlg.h
  8. 26
      src/dialogs/SettingsDlg.cpp
  9. 22
      src/forms/SettingsDlg.ui
  10. 1
      src/main.cpp
  11. 164
      src/mainwindow.cpp
  12. 154
      src/mainwindow.h
  13. 1
      src/plugins/gnome/keepassx-gnome.cpp

@ -227,6 +227,8 @@ This is the common base interface for databases. Every database class must imple
*/ */
class IDatabase{ class IDatabase{
public: public:
virtual ~IDatabase(){};
//! Loads a database. //! Loads a database.
/*! It is not allowed to call this function if a database is already loaded. /*! 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. \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{ class IFilePasswordAuth{
public: public:
virtual void authByPwd(QString& password)=0; virtual void authByPwd(QString& password)=0;
virtual bool authByFile(QFile& file)=0; virtual bool authByFile(QString& filename)=0;
virtual bool authByFileAndPwd(QString& password, QFile& file)=0; virtual bool authByFileAndPwd(QString& password, QString& filename)=0;
/*! Creates a key file. /*! Creates a key file.
\param filename Filename of the new key file. \param filename Filename of the new key file.
\param length Length of the key file. \param length Length of the key file.

@ -38,103 +38,113 @@ using namespace std;
bool CConfig::loadFromIni(QString filename){ bool CConfig::loadFromIni(QString filename){
QString defaultSearchOptions = "001101111"; QString defaultSearchOptions = "001101111";
QString defaultPwGenOptions = "1111100001"; QString defaultPwGenOptions = "1111100001";
ini.SetPath((const char*)filename.toUtf8()); ini.SetPath((const char*)filename.toUtf8());
ini.ReadFile(); ini.ReadFile();
ClipboardTimeOut=ini.GetValueI("Options","ClipboardTimeOut",20); ClipboardTimeOut=ini.GetValueI("Options","ClipboardTimeOut",20);
Toolbar=ini.GetValueB("UI","ShowToolbar",true); Toolbar=ini.GetValueB("UI","ShowToolbar",true);
EntryDetails=ini.GetValueB("UI","ShowEntryDetails",true); EntryDetails=ini.GetValueB("UI","ShowEntryDetails",true);
OpenLast=ini.GetValueB("Options","RememberLastFile",true); OpenLast=ini.GetValueB("Options","RememberLastFile",true);
LastFile=ini.GetValue("Options","LastFile","").c_str(); LastFile=ini.GetValue("Options","LastFile","").c_str();
ParseColumnString(ini.GetValue("UI","Columns","1111100000").c_str(),Columns); ParseColumnString(ini.GetValue("UI","Columns","1111100000").c_str(),Columns);
BannerColor1=ParseColorString(ini.GetValue("Options","BannerColor1","0,85,127").c_str()); BannerColor1=ParseColorString(ini.GetValue("Options","BannerColor1","0,85,127").c_str());
BannerColor2=ParseColorString(ini.GetValue("Options","BannerColor2","0,117,175").c_str()); BannerColor2=ParseColorString(ini.GetValue("Options","BannerColor2","0,117,175").c_str());
BannerTextColor=ParseColorString(ini.GetValue("Options","BannerTextColor","222,222,222").c_str()); BannerTextColor=ParseColorString(ini.GetValue("Options","BannerTextColor","222,222,222").c_str());
ShowPasswords=ini.GetValueB("Options","ShowPasswords",false); ShowPasswords=ini.GetValueB("Options","ShowPasswords",false);
OpenUrlCommand=ini.GetValue("Options","UrlCmd","kfmclient openURL %1").c_str(); OpenUrlCommand=ini.GetValue("Options","UrlCmd","kfmclient openURL %1").c_str();
Language=ini.GetValue("Options","LangFile","").c_str(); Language=ini.GetValue("Options","LangFile","").c_str();
ParseBoolString(ini.GetValue("Options","SearchOptions",(const char*)defaultSearchOptions.toUtf8()).c_str(),defaultSearchOptions,SearchOptions,9); ParseBoolString(ini.GetValue("Options","SearchOptions",(const char*)defaultSearchOptions.toUtf8()).c_str(),defaultSearchOptions,SearchOptions,9);
ListView_HidePasswords=ini.GetValueB("UI","HidePasswords",true); ListView_HidePasswords=ini.GetValueB("UI","HidePasswords",true);
ListView_HideUsernames=ini.GetValueB("UI","HideUsernames",false); ListView_HideUsernames=ini.GetValueB("UI","HideUsernames",false);
ParseBoolString(ini.GetValue("Options","PwGenOptions",(const char*)defaultPwGenOptions.toUtf8()).c_str(),defaultPwGenOptions,PwGenOptions,10); ParseBoolString(ini.GetValue("Options","PwGenOptions",(const char*)defaultPwGenOptions.toUtf8()).c_str(),defaultPwGenOptions,PwGenOptions,10);
PwGenLength=ini.GetValueI("Options","PwGenLength",25); PwGenLength=ini.GetValueI("Options","PwGenLength",25);
PwGenCharList=ini.GetValue("Options","PwGenCharList","").c_str(); PwGenCharList=ini.GetValue("Options","PwGenCharList","").c_str();
ExpandGroupTree=ini.GetValueB("Options","ExpandGroupTree",true); ExpandGroupTree=ini.GetValueB("Options","ExpandGroupTree",true);
MainWinHeight=ini.GetValueI("UI","MainWinHeight",550); MainWinHeight=ini.GetValueI("UI","MainWinHeight",550);
MainWinWidth=ini.GetValueI("UI","MainWinWidth",900); MainWinWidth=ini.GetValueI("UI","MainWinWidth",900);
MainWinSplit1=ini.GetValueI("UI","MainWinSplit1",100); MainWinSplit1=ini.GetValueI("UI","MainWinSplit1",100);
MainWinSplit2=ini.GetValueI("UI","MainWinSplit2",300); 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); 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); ShowStatusbar=ini.GetValueB("UI","ShowStatusbar",true);
AlternatingRowColors=ini.GetValueB("Options","AlternatingRowColors",true); AlternatingRowColors=ini.GetValueB("Options","AlternatingRowColors",true);
MountDir=ini.GetValue("Options","MountDir",DEFAULT_MOUNT_DIR).c_str(); MountDir=ini.GetValue("Options","MountDir",DEFAULT_MOUNT_DIR).c_str();
RememberLastKey=ini.GetValueB("Options","RememberLastKey",true); RememberLastKey=ini.GetValueB("Options","RememberLastKey",true);
LastKeyLocation=ini.GetValue("Options","LastKeyLocation","").c_str(); LastKeyLocation=ini.GetValue("Options","LastKeyLocation","").c_str();
LastKeyType=(tKeyType)ini.GetValueI("Options","LastKeyType",(int)PASSWORD); LastKeyType=(tKeyType)ini.GetValueI("Options","LastKeyType",(int)PASSWORD);
if(!OpenLast)RememberLastKey=false; if(!OpenLast)RememberLastKey=false;
ToolbarIconSize=ini.GetValueI("UI","ToolbarIconSize",16); ToolbarIconSize=ini.GetValueI("UI","ToolbarIconSize",16);
ShowSysTrayIcon=ini.GetValueB("Options","ShowSysTrayIcon",false);
QString IntegrPluginVal=ini.GetValue("Options","IntegrPlugin","None").c_str(); MinimizeToTray=ini.GetValueB("Options","MinimizeToTray",false);
if(IntegrPluginVal=="None") SaveFileDlgHistory=ini.GetValueB("Options","SaveFileDlgHistory",true);
IntegrPlugin=NONE; EnableBookmarkMenu=ini.GetValueB("Options","EnableBookmarkMenu",true);
else if(IntegrPluginVal=="Gnome") GroupTreeRestore=ini.GetValueI("Options","GroupTreeRestore",1);
IntegrPlugin=GNOME; QString IntegrPluginVal=ini.GetValue("Options","IntegrPlugin","None").c_str();
else if(IntegrPluginVal=="KDE") if(IntegrPluginVal=="None")
IntegrPlugin=KDE; IntegrPlugin=NONE;
else else if(IntegrPluginVal=="Gnome")
IntegrPlugin=NONE; IntegrPlugin=GNOME;
else if(IntegrPluginVal=="KDE")
return true; IntegrPlugin=KDE;
else
IntegrPlugin=NONE;
return true;
} }
bool CConfig::saveToIni(QString filename){ bool CConfig::saveToIni(QString filename){
ini.SetValueI("Options","ClipboardTimeOut",ClipboardTimeOut); ini.SetValueI("Options","ClipboardTimeOut",ClipboardTimeOut);
ini.SetValueB("UI","ShowToolbar",Toolbar); ini.SetValueB("UI","ShowToolbar",Toolbar);
ini.SetValueB("UI","ShowEntryDetails",EntryDetails); ini.SetValueB("UI","ShowEntryDetails",EntryDetails);
ini.SetValueB("Options","RememberLastFile",OpenLast); ini.SetValueB("Options","RememberLastFile",OpenLast);
if(OpenLast)ini.SetValue("Options","LastFile",(const char*)LastFile.toUtf8()); if(OpenLast)ini.SetValue("Options","LastFile",(const char*)LastFile.toUtf8());
else ini.SetValue("Options","LastFile",""); else ini.SetValue("Options","LastFile","");
ini.SetValue("UI","Columns",(const char*)CreateColumnString().toUtf8(),true); ini.SetValue("UI","Columns",(const char*)CreateColumnString().toUtf8(),true);
ini.SetValue("Options","BannerColor1",(const char*)CreateColorString(BannerColor1).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","BannerColor2",(const char*)CreateColorString(BannerColor2).toUtf8(),true);
ini.SetValue("Options","BannerTextColor",(const char*)CreateColorString(BannerTextColor).toUtf8(),true); ini.SetValue("Options","BannerTextColor",(const char*)CreateColorString(BannerTextColor).toUtf8(),true);
ini.SetValueB("Options","ShowPasswords",ShowPasswords,true); ini.SetValueB("Options","ShowPasswords",ShowPasswords,true);
ini.SetValue("Options","UrlCmd",(const char*)OpenUrlCommand.toUtf8(),true); ini.SetValue("Options","UrlCmd",(const char*)OpenUrlCommand.toUtf8(),true);
ini.SetValue("Options","LangFile",(const char*)Language.toUtf8(),true); ini.SetValue("Options","LangFile",(const char*)Language.toUtf8(),true);
ini.SetValue("Options","SearchOptions",(const char*)CreateBoolString(SearchOptions,9).toUtf8(),true); ini.SetValue("Options","SearchOptions",(const char*)CreateBoolString(SearchOptions,9).toUtf8(),true);
ini.SetValueB("UI","HidePasswords",ListView_HidePasswords); ini.SetValueB("UI","HidePasswords",ListView_HidePasswords);
ini.SetValueB("UI","HideUsernames",ListView_HideUsernames); ini.SetValueB("UI","HideUsernames",ListView_HideUsernames);
ini.SetValue("Options","PwGenOptions",(const char*)CreateBoolString(PwGenOptions,10).toUtf8(),true); ini.SetValue("Options","PwGenOptions",(const char*)CreateBoolString(PwGenOptions,10).toUtf8(),true);
ini.SetValueI("Options","PwGenLength",PwGenLength,true); ini.SetValueI("Options","PwGenLength",PwGenLength,true);
ini.SetValue("Options","PwGenCharList",(const char*)PwGenCharList.toUtf8(),true); ini.SetValue("Options","PwGenCharList",(const char*)PwGenCharList.toUtf8(),true);
ini.SetValueB("Options","ExpandGroupTree",ExpandGroupTree,true); ini.SetValueB("Options","ExpandGroupTree",ExpandGroupTree,true);
ini.SetValueI("UI","MainWinHeight",MainWinHeight); ini.SetValueI("UI","MainWinHeight",MainWinHeight);
ini.SetValueI("UI","MainWinWidth",MainWinWidth); ini.SetValueI("UI","MainWinWidth",MainWinWidth);
ini.SetValueI("UI","MainWinSplit1",MainWinSplit1); ini.SetValueI("UI","MainWinSplit1",MainWinSplit1);
ini.SetValueI("UI","MainWinSplit2",MainWinSplit2); ini.SetValueI("UI","MainWinSplit2",MainWinSplit2);
ini.SetValue("UI","ColumnSizes",(const char*)CreateIntString(ColumnSizes,10).toUtf8(),true); ini.SetValue("UI","ColumnSizes",(const char*)CreateIntString(ColumnSizes,10).toUtf8(),true);
ini.SetValueB("UI","ShowStatusbar",ShowStatusbar); ini.SetValueB("UI","ShowStatusbar",ShowStatusbar);
ini.SetValueB("Options","AlternatingRowColors",AlternatingRowColors); ini.SetValueB("Options","AlternatingRowColors",AlternatingRowColors);
ini.SetValue("Options","MountDir",(const char*)MountDir.toUtf8()); ini.SetValue("Options","MountDir",(const char*)MountDir.toUtf8());
ini.SetValueB("Options","RememberLastKey",RememberLastKey); ini.SetValueB("Options","RememberLastKey",RememberLastKey);
if(RememberLastKey){ ini.SetValueB("Options","ShowSysTrayIcon",ShowSysTrayIcon);
ini.SetValue("Options","LastKeyLocation",(const char*)LastKeyLocation.toUtf8()); ini.SetValueB("Options","MinimizeToTray",MinimizeToTray);
ini.SetValueI("Options","LastKeyType",LastKeyType);} ini.SetValueB("Options","SaveFileDlgHistory",SaveFileDlgHistory);
else{ ini.SetValueB("Options","EnableBookmarkMenu",EnableBookmarkMenu);
ini.SetValue("Options","LastKeyLocation",""); ini.SetValueI("Options","GroupTreeRestore",GroupTreeRestore);
ini.SetValueI("Options","LastKeyType",0);}
ini.SetValueI("UI","ToolbarIconSize",ToolbarIconSize,true); if(RememberLastKey){
ini.SetValue("Options","LastKeyLocation",(const char*)LastKeyLocation.toUtf8());
if(IntegrPlugin==NONE) ini.SetValueI("Options","LastKeyType",LastKeyType);}
ini.SetValue("Options","IntegrPlugin","None"); else{
if(IntegrPlugin==GNOME) ini.SetValue("Options","LastKeyLocation","");
ini.SetValue("Options","IntegrPlugin","Gnome"); ini.SetValueI("Options","LastKeyType",0);}
if(IntegrPlugin==KDE) ini.SetValueI("UI","ToolbarIconSize",ToolbarIconSize,true);
ini.SetValue("Options","IntegrPlugin","KDE");
if(IntegrPlugin==NONE)
if(!ini.WriteFile())return false; ini.SetValue("Options","IntegrPlugin","None");
else return true; 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){ void CConfig::ParseColumnString(QString str, bool* dst){

@ -20,61 +20,66 @@
#ifndef _PWMCONFIG_H_ #ifndef _PWMCONFIG_H_
#define _PWMCONFIG_H_ #define _PWMCONFIG_H_
#include <QColor>
#include "main.h" #include "main.h"
#include "lib/IniReader.h" #include "lib/IniReader.h"
#include <qcolor.h>
class CConfig{ class CConfig{
public: public:
enum IntegrPluginType{NONE,KDE,GNOME}; enum IntegrPluginType{NONE,KDE,GNOME};
int TimeFormat; int TimeFormat;
int ClipboardTimeOut; int ClipboardTimeOut;
bool Toolbar; int MainWinHeight;
bool EntryDetails; int MainWinWidth;
QString LastFile; int MainWinSplit1;
bool OpenLast; int MainWinSplit2;
bool Columns[10]; int ToolbarIconSize;
QColor BannerColor1; int PwGenLength;
QColor BannerColor2; int GroupTreeRestore; // 0:Restore Last; 1:Expand All; 2:Don't Expand
QColor BannerTextColor; int ColumnSizes[10];
bool ShowPasswords; bool Toolbar;
QString OpenUrlCommand; bool EntryDetails;
QString Language; bool OpenLast;
bool SearchOptions[9]; bool ListView_HidePasswords;
bool ListView_HidePasswords; bool ListView_HideUsernames;
bool ListView_HideUsernames; bool SearchOptions[9];
bool PwGenOptions[10]; bool PwGenOptions[10];
int PwGenLength; bool Columns[10];
QString PwGenCharList; bool ShowPasswords;
bool ExpandGroupTree; bool ExpandGroupTree;
bool EnableKdePlugin; bool EnableKdePlugin;
int MainWinHeight; bool ShowStatusbar;
int MainWinWidth; bool AlternatingRowColors;
int MainWinSplit1; bool RememberLastKey;
int MainWinSplit2; bool ShowSysTrayIcon;
int ColumnSizes[10]; bool MinimizeToTray;
bool ShowStatusbar; bool SaveFileDlgHistory;
bool AlternatingRowColors; bool EnableBookmarkMenu;
QString MountDir; QString PwGenCharList;
bool RememberLastKey; QString MountDir;
tKeyType LastKeyType; QString LastKeyLocation;
QString LastKeyLocation; QString OpenUrlCommand;
int ToolbarIconSize; QString Language;
IntegrPluginType IntegrPlugin; QString LastFile;
bool loadFromIni(QString filename); QColor BannerColor1;
bool saveToIni(QString filename); QColor BannerColor2;
QColor BannerTextColor;
IntegrPluginType IntegrPlugin;
tKeyType LastKeyType;
bool loadFromIni(QString filename);
bool saveToIni(QString filename);
private: private:
CIniFile ini; CIniFile ini;
void ParseColumnString(QString str, bool* dst); void ParseColumnString(QString str, bool* dst);
void ParseBoolString(const QString &str,const QString &defaults,bool* dst, int count); void ParseBoolString(const QString &str,const QString &defaults,bool* dst, int count);
void ParseIntString(const QString &str,int* dst, int count); void ParseIntString(const QString &str,int* dst, int count);
QString CreateBoolString(bool* src, int count); QString CreateBoolString(bool* src, int count);
QColor ParseColorString(QString str); QColor ParseColorString(QString str);
QString CreateColumnString(); QString CreateColumnString();
QString CreateColorString(QColor); QString CreateColorString(QColor);
QString CreateIntString(int* src, int count); QString CreateIntString(int* src, int count);
}; };
#endif #endif

@ -666,7 +666,12 @@ void StandardDatabase::authByPwd(QString& Password){
return; 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(); unsigned long FileSize=file.size();
if(FileSize == 0){ if(FileSize == 0){
error=tr("Key file is empty."); error=tr("Key file is empty.");
@ -674,14 +679,14 @@ bool StandardDatabase::authByFile(QFile& file){
} }
if(FileSize == 32){ if(FileSize == 32){
if(file.read((char*)RawMasterKey,32) != 32){ if(file.read((char*)RawMasterKey,32) != 32){
error=tr("Error while reading key file."); error=decodeFileError(file.error());
return false;} return false;}
return true; return true;
} }
if(FileSize == 64){ if(FileSize == 64){
char hex[64]; char hex[64];
if(file.read(hex,64) != 64){ if(file.read(hex,64) != 64){
error=tr("Error while reading key file."); error=decodeFileError(file.error());
return false;} return false;}
if(convHexToBinaryKey(hex,(char*)RawMasterKey))return true; if(convHexToBinaryKey(hex,(char*)RawMasterKey))return true;
} }
@ -699,10 +704,10 @@ bool StandardDatabase::authByFile(QFile& file){
return true; return true;
} }
bool StandardDatabase::authByFileAndPwd(QString& Password, QFile& file){ bool StandardDatabase::authByFileAndPwd(QString& Password, QString& filename){
unsigned char PasswordKey[32]; unsigned char PasswordKey[32];
unsigned char FileKey[32]; unsigned char FileKey[32];
if(!authByFile(file))return false; if(!authByFile(filename))return false;
memcpy(FileKey,RawMasterKey,32); memcpy(FileKey,RawMasterKey,32);
authByPwd(Password); authByPwd(Password);
memcpy(PasswordKey,RawMasterKey,32); memcpy(PasswordKey,RawMasterKey,32);
@ -711,6 +716,7 @@ bool StandardDatabase::authByFileAndPwd(QString& Password, QFile& file){
sha.update(PasswordKey,32); sha.update(PasswordKey,32);
sha.update(FileKey,32); sha.update(FileKey,32);
sha.finish(RawMasterKey); sha.finish(RawMasterKey);
return true;
} }
QList<IEntryHandle*> StandardDatabase::entries(){ QList<IEntryHandle*> StandardDatabase::entries(){
@ -1511,6 +1517,7 @@ bool StandardDatabase::createKeyFile(const QString& filename,int length, bool He
} }
file.close(); file.close();
delete [] key; delete [] key;
return true;
} }

@ -139,6 +139,7 @@ public:
QList<StdGroup*> Childs; QList<StdGroup*> Childs;
QList<StdEntry*> Entries; QList<StdEntry*> Entries;
}; };
virtual ~StandardDatabase(){};
virtual bool load(QString identifier); virtual bool load(QString identifier);
virtual bool save(); virtual bool save();
virtual bool close(); virtual bool close();
@ -155,8 +156,8 @@ public:
virtual void replaceIcon(int index,const QPixmap& icon); virtual void replaceIcon(int index,const QPixmap& icon);
virtual int builtinIcons(){return 62;}; virtual int builtinIcons(){return 62;};
virtual void authByPwd(QString& password); virtual void authByPwd(QString& password);
virtual bool authByFile(QFile& file); virtual bool authByFile(QString& filename);
virtual bool authByFileAndPwd(QString& password, QFile& file); virtual bool authByFileAndPwd(QString& password, QString& filename);
virtual bool createKeyFile(const QString& filename,int length=32, bool Hex=false); virtual bool createKeyFile(const QString& filename,int length=32, bool Hex=false);
virtual QList<IEntryHandle*> search(IGroupHandle* Group,const QString& SearchString, bool CaseSensitve, bool RegExp,bool Recursive,bool* Fields); virtual QList<IEntryHandle*> search(IGroupHandle* Group,const QString& SearchString, bool CaseSensitve, bool RegExp,bool Recursive,bool* Fields);
virtual QFile* file(){return File;} virtual QFile* file(){return File;}

@ -31,94 +31,97 @@
#include <QMessageBox> #include <QMessageBox>
CPasswordDialog::CPasswordDialog(QWidget* parent, bool modal, bool ShowExitButton,bool ChangeKeyMode, Qt::WFlags fl) CPasswordDialog::CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButton,bool ChangeKeyMode)
: QDialog(parent,fl) : QDialog(parent)
{ {
setupUi(this); setupUi(this);
createBanner(Banner,Icon_Key32x32,tr("Database Key")); createBanner(Banner,Icon_Key32x32,tr("Database Key"));
QDir media(config.MountDir); db=DB;
if(media.exists()){ QDir media(config.MountDir);
QStringList Paths; if(media.exists()){
Paths=media.entryList(QStringList()<<"*",QDir::Dirs); QStringList Paths;
Paths.erase(Paths.begin()); // delete "." Paths=media.entryList(QStringList()<<"*",QDir::Dirs);
Paths.erase(Paths.begin()); // delete ".." Paths.erase(Paths.begin()); // delete "."
for(int i=0;i<Paths.count();i++) Paths.erase(Paths.begin()); // delete ".."
Combo_Dirs->addItem(config.MountDir+Paths[i]); for(int i=0;i<Paths.count();i++)
} Combo_Dirs->addItem(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;
} }
}
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( Combo_Dirs, SIGNAL( editTextChanged(const QString&) ),this, SLOT( OnComboTextChanged(const QString&)));
connect( ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); connect( ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) );
connect( Edit_Password, SIGNAL( textChanged(const QString&) ), this, SLOT( OnPasswordChanged(const QString&) ) ); connect( Edit_Password, SIGNAL( textChanged(const QString&) ), this, SLOT( OnPasswordChanged(const QString&) ) );
connect( CheckBox_Both, SIGNAL( stateChanged(int) ), this, SLOT( OnCheckBox_BothChanged(int) ) ); connect( CheckBox_Both, SIGNAL( stateChanged(int) ), this, SLOT( OnCheckBox_BothChanged(int) ) );
connect( ButtonChangeEchoMode, SIGNAL( clicked() ), this, SLOT( ChangeEchoMode() ) ); connect( ButtonChangeEchoMode, SIGNAL( clicked() ), this, SLOT( ChangeEchoMode() ) );
connect( Edit_Password, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); connect( Edit_Password, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) );
connect( Edit_PasswordRep, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); connect( Edit_PasswordRep, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) );
connect( ButtonExit, SIGNAL( clicked()),this,SLOT(OnButtonExit())); connect( ButtonExit, SIGNAL( clicked()),this,SLOT(OnButtonExit()));
ButtonExit->setVisible(ShowExitButton); ButtonExit->setVisible(ShowExitButton);
Mode_Set=ChangeKeyMode; Mode_Set=ChangeKeyMode;
if(!ChangeKeyMode){ if(!ChangeKeyMode){
Edit_PasswordRep->hide(); Edit_PasswordRep->hide();
Label_PasswordRep->hide(); Label_PasswordRep->hide();
connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) ); connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) );
connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse() ) ); connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse() ) );
}else{ }else{
connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK_Set() ) ); connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK_Set() ) );
connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse_Set() ) ); connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse_Set() ) );
} }
if(!config.ShowPasswords)ChangeEchoMode(); if(!config.ShowPasswords)ChangeEchoMode();
} }
void CPasswordDialog::setStatePasswordOnly(){ void CPasswordDialog::setStatePasswordOnly(){
Combo_Dirs->setEnabled(false); Combo_Dirs->setEnabled(false);
ButtonBrowse->setEnabled(false); ButtonBrowse->setEnabled(false);
Label_KeyFile->setEnabled(false); Label_KeyFile->setEnabled(false);
Label_Password->setEnabled(true); Label_Password->setEnabled(true);
Edit_Password->setEnabled(true); Label_PasswordRep->setEnabled(true);
Edit_PasswordRep->setEnabled(true); Edit_Password->setEnabled(true);
ButtonChangeEchoMode->setEnabled(true); Edit_PasswordRep->setEnabled(true);
KeyType=PASSWORD; ButtonChangeEchoMode->setEnabled(true);
KeyType=PASSWORD;
} }
void CPasswordDialog::setStateKeyFileOnly(){ void CPasswordDialog::setStateKeyFileOnly(){
Combo_Dirs->setEnabled(true); Combo_Dirs->setEnabled(true);
ButtonBrowse->setEnabled(true); ButtonBrowse->setEnabled(true);
Label_KeyFile->setEnabled(true); Label_KeyFile->setEnabled(true);
Label_Password->setEnabled(false); Label_Password->setEnabled(false);
Edit_Password->setEnabled(false); Label_PasswordRep->setEnabled(false);
Edit_PasswordRep->setEnabled(false); Edit_Password->setEnabled(false);
ButtonChangeEchoMode->setEnabled(false); Edit_PasswordRep->setEnabled(false);
KeyType=KEYFILE; ButtonChangeEchoMode->setEnabled(false);
KeyType=KEYFILE;
} }
void CPasswordDialog::setStateBoth(){ void CPasswordDialog::setStateBoth(){
Combo_Dirs->setEnabled(true); Combo_Dirs->setEnabled(true);
ButtonBrowse->setEnabled(true); ButtonBrowse->setEnabled(true);
Label_KeyFile->setEnabled(true); Label_KeyFile->setEnabled(true);
Label_Password->setEnabled(true); Label_Password->setEnabled(true);
Edit_Password->setEnabled(true); Label_PasswordRep->setEnabled(true);
Edit_PasswordRep->setEnabled(true); Edit_Password->setEnabled(true);
ButtonChangeEchoMode->setEnabled(true); Edit_PasswordRep->setEnabled(true);
KeyType=BOTH; ButtonChangeEchoMode->setEnabled(true);
KeyType=BOTH;
} }
@ -158,122 +161,129 @@ void CPasswordDialog::OnOK(){
if(password=="" && keyfile==""){ if(password=="" && keyfile==""){
QMessageBox::warning(this,tr("Error"),tr("Please enter a Password or select a key file."),tr("OK"),"","",0,0); 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 || KeyType==KEYFILE){ if(KeyType==BOTH){
QFileInfo fileinfo(keyfile); if(password==""){
if(Mode_Set){ QMessageBox::warning(this,tr("Error"),tr("Please enter a Password."),tr("OK"),"","",0,0);
if(fileinfo.exists()){ return;}
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?"), if(keyfile==""){
tr("Use"),tr("Overwrite"),tr("Cancel"),0,2)){ QMessageBox::warning(this,tr("Error"),tr("Please choose a key file."),tr("OK"),"","",0,0);
case 0: OverwriteKeyFile=false; return;}
break; }
case 1: OverwriteKeyFile=true;
break;
case 2: return;
}
}
} if(KeyType==BOTH || KeyType==KEYFILE){
else{ QFileInfo fileinfo(keyfile);
if(!fileinfo.exists()){ if(!fileinfo.exists()){
QMessageBox::warning(this,tr("Error"),tr("The selected key file or directory does not exist."),tr("OK"),"","",0,0); QMessageBox::warning(this,tr("Error"),tr("The selected key file or directory does not exist."),tr("OK"),"","",0,0);
return; return;
} }
if(!fileinfo.isReadable()){ 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); QMessageBox::warning(this,tr("Error"),tr("The selected key file or directory is not readable.\nPlease check your permissions."),tr("OK"),"","",0,0);
return; 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()){ else{ /* pwsafe.key exists */
if(keyfile.right(1)!="/")keyfile+="/"; if(!QFileInfo(file).isReadable()){
QFile file(keyfile+"pwsafe.key"); 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);
if(!file.exists()){ return;}
QDir dir(keyfile); keyfile+="pwsafe.key";
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{ /* 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; if(doAuth())done(1);
config.LastKeyType=KeyType;
}
done(1);
} }
void CPasswordDialog::OnOK_Set(){ void CPasswordDialog::OnOK_Set(){
password=Edit_Password->text(); password=Edit_Password->text();
if(password!=Edit_PasswordRep->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); QMessageBox::warning(this,tr("Warning"),tr("Password an password repetition are not equal.\nPlease check your input."),tr("OK"),"","",0,0);
return;} 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;}
} }
keyfile+="pwsafe.key"; keyfile=Combo_Dirs->currentText();
}else{ if(password=="" && keyfile==""){
QFile file(keyfile); QMessageBox::warning(this,tr("Error"),tr("Please enter a password or select a key file."),tr("OK"),"","",0,0);
if(file.exists()){ return;
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;}
} }
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<IFilePasswordAuth*>(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; bool CPasswordDialog::doAuth(){
config.LastKeyType=KeyType; IFilePasswordAuth* DbAuth=dynamic_cast<IFilePasswordAuth*>(db);
} if(password!=QString() && keyfile==QString()){
done(1); 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){ void CPasswordDialog::OnPasswordChanged(const QString &txt){

@ -17,42 +17,44 @@
* Free Software Foundation, Inc., * * Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/ ***************************************************************************/
#include "main.h"
#ifndef PASSWORDDIALOG_H #ifndef PASSWORDDIALOG_H
#define PASSWORDDIALOG_H #define PASSWORDDIALOG_H
#include "lib/UrlLabel.h"
#include "ui_PasswordDlg.h" #include "ui_PasswordDlg.h"
#include "main.h"
#include "lib/UrlLabel.h"
#include "Database.h"
class CPasswordDialog : public QDialog, public Ui_PasswordDlg class CPasswordDialog : public QDialog, public Ui_PasswordDlg
{ {
Q_OBJECT Q_OBJECT
private:
bool Mode_Set; //true = Set, false = Get
void setStatePasswordOnly();
void setStateKeyFileOnly();
void setStateBoth();
public: private:
QString keyfile; bool Mode_Set; //true = Set, false = Get
QString password; IDatabase* db;
tKeyType KeyType; void setStatePasswordOnly();
bool OverwriteKeyFile; void setStateKeyFileOnly();
void setStateBoth();
bool doAuth();
CPasswordDialog(QWidget* parent = 0, bool modal = false, public:
bool ShowExitButton = false, bool KeyMode_Set=false, Qt::WFlags fl = 0 ); QString keyfile;
QString password;
tKeyType KeyType;
bool OverwriteKeyFile;
CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButton = false, bool KeyMode_Set=false);
public slots: public slots:
void OnOK(); void OnOK();
void OnOK_Set(); void OnOK_Set();
void OnCancel(); void OnCancel();
void OnButtonBrowse(); void OnButtonBrowse();
void OnButtonBrowse_Set(); void OnButtonBrowse_Set();
void OnButtonExit(); void OnButtonExit();
void OnPasswordChanged(const QString &txt); void OnPasswordChanged(const QString &txt);
void OnCheckBox_BothChanged(int state); void OnCheckBox_BothChanged(int state);
void ChangeEchoMode(); void ChangeEchoMode();
void OnComboTextChanged(const QString&); void OnComboTextChanged(const QString&);
}; };
#endif #endif

@ -74,8 +74,22 @@ CSettingsDlg::CSettingsDlg(QWidget* parent):QDialog(parent,Qt::Dialog)
color2=config.BannerColor2; color2=config.BannerColor2;
textcolor=config.BannerTextColor; textcolor=config.BannerTextColor;
CheckBox_ShowPasswords->setChecked(config.ShowPasswords); 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); 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); CheckBox_AlternatingRowColors->setChecked(config.AlternatingRowColors);
Edit_MountDir->setText(config.MountDir); Edit_MountDir->setText(config.MountDir);
CheckBox_RememberLastKey->setChecked(config.RememberLastKey); CheckBox_RememberLastKey->setChecked(config.RememberLastKey);
@ -133,9 +147,17 @@ void CSettingsDlg::apply(){
config.BannerTextColor=textcolor; config.BannerTextColor=textcolor;
config.ShowPasswords=CheckBox_ShowPasswords->isChecked(); config.ShowPasswords=CheckBox_ShowPasswords->isChecked();
config.OpenUrlCommand=Edit_BrowserCmd->text(); config.OpenUrlCommand=Edit_BrowserCmd->text();
// config.ExpandGroupTree=CheckBox_ExpandGroupTree->isChecked();
config.AlternatingRowColors=CheckBox_AlternatingRowColors->isChecked(); config.AlternatingRowColors=CheckBox_AlternatingRowColors->isChecked();
config.MountDir=Edit_MountDir->text(); 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)!="/") if(config.MountDir!="" && config.MountDir.right(1)!="/")
config.MountDir+="/"; config.MountDir+="/";
config.RememberLastKey=CheckBox_RememberLastKey->isChecked(); config.RememberLastKey=CheckBox_RememberLastKey->isChecked();

@ -62,7 +62,7 @@
<enum>QTabWidget::Rounded</enum> <enum>QTabWidget::Rounded</enum>
</property> </property>
<property name="currentIndex" > <property name="currentIndex" >
<number>0</number> <number>4</number>
</property> </property>
<widget class="QWidget" name="tab" > <widget class="QWidget" name="tab" >
<attribute name="title" > <attribute name="title" >
@ -209,7 +209,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="checkBox_4" > <widget class="QCheckBox" name="checkBox_EnableBookmarkMenu" >
<property name="text" > <property name="text" >
<string>Enable bookmark menu</string> <string>Enable bookmark menu</string>
</property> </property>
@ -276,7 +276,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QRadioButton" name="Radion_GroupTreeDoNothing" > <widget class="QRadioButton" name="Radio_GroupTreeDoNothing" >
<property name="text" > <property name="text" >
<string>Do not expand any item</string> <string>Do not expand any item</string>
</property> </property>
@ -827,7 +827,7 @@
</widget> </widget>
<widget class="QWidget" name="tab" > <widget class="QWidget" name="tab" >
<attribute name="title" > <attribute name="title" >
<string>&amp;Other</string> <string>Advanced</string>
</attribute> </attribute>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout" >
<property name="margin" > <property name="margin" >
@ -863,6 +863,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0" >
<widget class="QLabel" name="label_2" >
<property name="text" >
<string>Mounting Root:</string>
</property>
</widget>
</item>
<item row="0" column="0" > <item row="0" column="0" >
<widget class="QLabel" name="label" > <widget class="QLabel" name="label" >
<property name="text" > <property name="text" >
@ -876,13 +883,6 @@
<item row="0" column="1" > <item row="0" column="1" >
<widget class="QLineEdit" name="Edit_BrowserCmd" /> <widget class="QLineEdit" name="Edit_BrowserCmd" />
</item> </item>
<item row="1" column="0" >
<widget class="QLabel" name="label_2" >
<property name="text" >
<string>Mounting Root:</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>

@ -95,7 +95,6 @@ int main(int argc, char **argv)
{ {
QString ArgFile,ArgCfg,ArgLang,IniFilename; QString ArgFile,ArgCfg,ArgLang,IniFilename;
QApplication* app=NULL; QApplication* app=NULL;
AppDir=QString(argv[0]); AppDir=QString(argv[0]);
AppDir.truncate(AppDir.lastIndexOf("/")); AppDir.truncate(AppDir.lastIndexOf("/"));

@ -73,7 +73,6 @@ KeepassMainWindow::KeepassMainWindow(const QString& ArgFile,QWidget *parent, Qt:
statusBar()->addWidget(StatusBarGeneral,15); statusBar()->addWidget(StatusBarGeneral,15);
statusBar()->addWidget(StatusBarSelection,85); statusBar()->addWidget(StatusBarSelection,85);
statusBar()->setVisible(config.ShowStatusbar); statusBar()->setVisible(config.ShowStatusbar);
// Group::UI_ExpandByDefault=config.ExpandGroupTree;
setupConnections(); setupConnections();
FileOpen=false; FileOpen=false;
if(ArgFile!=QString()) if(ArgFile!=QString())
@ -202,7 +201,8 @@ void KeepassMainWindow::setupIcons(){
EditAutoTypeAction->setIcon(*Icon_AutoType); EditAutoTypeAction->setIcon(*Icon_AutoType);
HelpHandbookAction->setIcon(*Icon_Help); HelpHandbookAction->setIcon(*Icon_Help);
SysTray->setIcon(QIcon(AppDir+"/../share/keepass/icons/keepassx_large.png")); SysTray->setIcon(QIcon(AppDir+"/../share/keepass/icons/keepassx_large.png"));
SysTray->show(); if(config.ShowSysTrayIcon)
SysTray->show();
} }
void KeepassMainWindow::setupMenus(){ void KeepassMainWindow::setupMenus(){
@ -285,49 +285,19 @@ void KeepassMainWindow::setupDatabaseConnections(IDatabase* DB){
void KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ void KeepassMainWindow::openDatabase(QString filename,bool IsAuto){
Q_ASSERT(!FileOpen);
if(!IsAuto){ if(!IsAuto){
config.LastKeyLocation=QString(); config.LastKeyLocation=QString();
config.LastKeyType=PASSWORD;} config.LastKeyType=PASSWORD;}
CPasswordDialog PasswordDlg(this,true,IsAuto); db=dynamic_cast<IDatabase*>(new StandardDatabase());
CPasswordDialog PasswordDlg(this,db,IsAuto,false);
PasswordDlg.setWindowTitle(filename); PasswordDlg.setWindowTitle(filename);
int r=PasswordDlg.exec(); switch(PasswordDlg.exec()){
if(r==0) return; case 0: return;
if(r==2) {Start=false; return;} case 2: Start=false; return;
Q_ASSERT(r==1); }
db = new StandardDatabase();
GroupView->db=db; GroupView->db=db;
EntryView->db=db; EntryView->db=db;
setupDatabaseConnections(db); setupDatabaseConnections(db);
IFilePasswordAuth* auth=dynamic_cast<IFilePasswordAuth*>(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;
}
}
QString err; QString err;
StatusBarGeneral->setText(tr("Loading Database...")); StatusBarGeneral->setText(tr("Loading Database..."));
if(db->load(filename)==true){ if(db->load(filename)==true){
@ -341,19 +311,20 @@ void KeepassMainWindow::openDatabase(QString filename,bool IsAuto){
else{ else{
StatusBarGeneral->setText(tr("Loading Failed")); StatusBarGeneral->setText(tr("Loading Failed"));
QString error=db->getError(); QString error=db->getError();
bool KeyError=auth->isKeyError();
delete db;
if(error==QString())error=tr("Unknown error while loading database."); if(error==QString())error=tr("Unknown error while loading database.");
QMessageBox::critical(this,tr("Error") QMessageBox::critical(this,tr("Error")
,tr("The following error occured while opening the database:\n%1") ,tr("The following error occured while opening the database:\n%1")
.arg(error),tr("OK")); .arg(error),tr("OK"));
if(KeyError) if(dynamic_cast<IFilePasswordAuth*>(db)->isKeyError()){
delete db;
openDatabase(filename,IsAuto); openDatabase(filename,IsAuto);
}
else
delete db;
} }
StatusBarGeneral->setText(tr("Ready")); StatusBarGeneral->setText(tr("Ready"));
} }
bool KeepassMainWindow::closeDatabase(){ bool KeepassMainWindow::closeDatabase(){
Q_ASSERT(FileOpen); Q_ASSERT(FileOpen);
Q_ASSERT(db!=NULL); Q_ASSERT(db!=NULL);
@ -381,52 +352,14 @@ bool KeepassMainWindow::closeDatabase(){
void KeepassMainWindow::OnFileNewKdb(){ void KeepassMainWindow::OnFileNewKdb(){
CPasswordDialog dlg(this,true,false,true); IDatabase* db_new=dynamic_cast<IDatabase*>(new StandardDatabase());
db_new->create();
CPasswordDialog dlg(this,db_new,false,true);
dlg.setWindowTitle("New Database"); dlg.setWindowTitle("New Database");
if(dlg.exec()==1){ if(dlg.exec()==1){
if(FileOpen) if(FileOpen)
if(!closeDatabase())return; if(!closeDatabase())return;
db=new StandardDatabase(); db=dynamic_cast<IDatabase*>(db_new);
db->create();
IFilePasswordAuth* DbAuth=dynamic_cast<IFilePasswordAuth*>(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;
}
}
setWindowTitle(tr("%1 - KeePassX").arg(tr("[new]"))); setWindowTitle(tr("%1 - KeePassX").arg(tr("[new]")));
GroupView->db=db; GroupView->db=db;
EntryView->db=db; EntryView->db=db;
@ -439,8 +372,12 @@ void KeepassMainWindow::OnFileNewKdb(){
setStateGroupSelected(NONE); setStateGroupSelected(NONE);
setStateEntrySelected(NONE); setStateEntrySelected(NONE);
} }
else{
delete db_new;
} }
}
void KeepassMainWindow::OnFileNewKxdb(){ void KeepassMainWindow::OnFileNewKxdb(){
@ -694,27 +631,9 @@ if(dlg.exec())setStateFileModified(true);
} }
void KeepassMainWindow::OnFileChangeKey(){ void KeepassMainWindow::OnFileChangeKey(){
/* CPasswordDialog dlg(this,db,false,true);
CPasswordDialog dlg(this,true,false,true); if(dlg.exec())
dlg.setWindowTitle(db->file->fileName()); setStateFileModified(true);
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_cast<IFilePasswordAuth*>db;
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);
}
*/
} }
void KeepassMainWindow::OnFileExit(){ void KeepassMainWindow::OnFileExit(){
@ -866,18 +785,18 @@ void KeepassMainWindow::OnQuickSearch(){
} }
void KeepassMainWindow::OnColumnVisibilityChanged(bool value){ void KeepassMainWindow::OnColumnVisibilityChanged(bool value){
config.Columns[0]=ViewColumnsTitleAction->isChecked(); config.Columns[0]=ViewColumnsTitleAction->isChecked();
config.Columns[1]=ViewColumnsUsernameAction->isChecked(); config.Columns[1]=ViewColumnsUsernameAction->isChecked();
config.Columns[2]=ViewColumnsUrlAction->isChecked(); config.Columns[2]=ViewColumnsUrlAction->isChecked();
config.Columns[3]=ViewColumnsPasswordAction->isChecked(); config.Columns[3]=ViewColumnsPasswordAction->isChecked();
config.Columns[4]=ViewColumnsCommentAction->isChecked(); config.Columns[4]=ViewColumnsCommentAction->isChecked();
config.Columns[5]=ViewColumnsExpireAction->isChecked(); config.Columns[5]=ViewColumnsExpireAction->isChecked();
config.Columns[6]=ViewColumnsCreationAction->isChecked(); config.Columns[6]=ViewColumnsCreationAction->isChecked();
config.Columns[7]=ViewColumnsLastChangeAction->isChecked(); config.Columns[7]=ViewColumnsLastChangeAction->isChecked();
config.Columns[8]=ViewColumnsLastAccessAction->isChecked(); config.Columns[8]=ViewColumnsLastAccessAction->isChecked();
config.Columns[9]=ViewColumnsAttachmentAction->isChecked(); config.Columns[9]=ViewColumnsAttachmentAction->isChecked();
//EntryView->updateColumns(); //EntryView->updateColumns();
//if(FileOpen) EntryView->updateItems(); //if(FileOpen) EntryView->updateItems();
} }
void KeepassMainWindow::OnUsernPasswVisibilityChanged(bool value){ void KeepassMainWindow::OnUsernPasswVisibilityChanged(bool value){
@ -891,7 +810,7 @@ setStateFileModified(true);
} }
void KeepassMainWindow::closeEvent(QCloseEvent* e){ void KeepassMainWindow::closeEvent(QCloseEvent* e){
if(!ShutingDown){ if(!ShutingDown && config.MinimizeToTray){
e->ignore(); e->ignore();
hide(); hide();
return; return;
@ -918,10 +837,11 @@ void KeepassMainWindow::closeEvent(QCloseEvent* e){
void KeepassMainWindow::OnExtrasSettings(){ void KeepassMainWindow::OnExtrasSettings(){
CSettingsDlg dlg(this); CSettingsDlg dlg(this);
dlg.exec(); if(dlg.exec()==1){
EntryView->setAlternatingRowColors(config.AlternatingRowColors); EntryView->setAlternatingRowColors(config.AlternatingRowColors);
//Group::UI_ExpandByDefault=config.ExpandGroupTree; SysTray->setVisible(config.ShowSysTrayIcon);
}
} }
void KeepassMainWindow::OnHelpAbout(){ void KeepassMainWindow::OnHelpAbout(){

@ -46,88 +46,80 @@
#include "ui_MainWindow.h" #include "ui_MainWindow.h"
class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{
Q_OBJECT Q_OBJECT
public: public:
KeepassMainWindow (const QString& ArgFile,QWidget *parent=0, Qt::WFlags flags=0); KeepassMainWindow (const QString& ArgFile,QWidget *parent=0, Qt::WFlags flags=0);
StandardDatabase* db; IDatabase* db;
bool Start; bool Start;
signals: signals:
void entryChanged(); void entryChanged();
private slots: private slots:
void OnFileNewKdb(); void OnFileNewKdb();
void OnFileNewKxdb(); void OnFileNewKxdb();
void OnFileOpen(); void OnFileOpen();
void OnFileClose(); void OnFileClose();
bool OnFileSave(); bool OnFileSave();
bool OnFileSaveAs(); bool OnFileSaveAs();
void OnFileSettings(); void OnFileSettings();
void OnFileChangeKey(); void OnFileChangeKey();
void OnFileExit(); void OnFileExit();
void OnImportFromPwm(); void OnImportFromPwm();
void OnImportFromKWalletXml(); void OnImportFromKWalletXml();
void OnExportToTxt(); void OnExportToTxt();
void OnEditOpenUrl(); void OnEditOpenUrl();
void OnSearch(); void OnSearch();
void OnGroupSearch(); void OnGroupSearch();
void OnViewShowToolbar(bool); void OnViewShowToolbar(bool);
void OnViewShowEntryDetails(bool); void OnViewShowEntryDetails(bool);
void OnViewToolbarIconSize16(bool); void OnViewToolbarIconSize16(bool);
void OnViewToolbarIconSize22(bool); void OnViewToolbarIconSize22(bool);
void OnViewToolbarIconSize28(bool); void OnViewToolbarIconSize28(bool);
void OnGroupSelectionChanged(IGroupHandle*); void OnGroupSelectionChanged(IGroupHandle*);
void OnQuickSearch(); void OnQuickSearch();
void OnColumnVisibilityChanged(bool show); void OnColumnVisibilityChanged(bool show);
void OnUsernPasswVisibilityChanged(bool hide); void OnUsernPasswVisibilityChanged(bool hide);
void OnFileModified(); void OnFileModified();
void OnExtrasSettings(); void OnExtrasSettings();
void OnExtrasPasswordGen(); void OnExtrasPasswordGen();
void OnHelpAbout(); void OnHelpAbout();
void OnHelpHandbook(); void OnHelpHandbook();
void OnItemExpanded(QTreeWidgetItem*); void OnItemExpanded(QTreeWidgetItem*);
void OnItemCollaped(QTreeWidgetItem*); void OnItemCollaped(QTreeWidgetItem*);
void OnShowSearchResults(); void OnShowSearchResults();
void OnEntryChanged(SelectionState); void OnEntryChanged(SelectionState);
void OnSysTrayActivated(QSystemTrayIcon::ActivationReason); void OnSysTrayActivated(QSystemTrayIcon::ActivationReason);
private: private:
SelectionState GroupSelection, EntrySelection; void closeEvent(QCloseEvent* event);
bool FileOpen; SelectionState GroupSelection, EntrySelection;
bool ModFlag; bool FileOpen;
QList<quint32> SearchResults; bool ModFlag;
inline void setupToolbar(); QList<quint32> SearchResults;
inline void setupIcons(); inline void setupToolbar();
inline void setupConnections(); inline void setupIcons();
inline void setupMenus(); inline void setupConnections();
void setStateFileOpen(bool); inline void setupMenus();
void setStateFileModified(bool); void setStateFileOpen(bool);
void setStateGroupSelected(SelectionState s); void setStateFileModified(bool);
void setStateEntrySelected(SelectionState s); void setStateGroupSelected(SelectionState s);
void openDatabase(QString filename,bool IsStart=false); void setStateEntrySelected(SelectionState s);
void setupDatabaseConnections(IDatabase* DB); void openDatabase(QString filename,bool IsAuto=false);
bool closeDatabase(); void setupDatabaseConnections(IDatabase* DB);
void search(IGroupHandle* Group); bool closeDatabase();
void removeFromSearchResults(int sID); void search(IGroupHandle* Group);
void updateDetailView(); void removeFromSearchResults(int sID);
QLineEdit* QuickSearchEdit; void updateDetailView();
QLabel* StatusBarGeneral; QLineEdit* QuickSearchEdit;
QLabel* StatusBarSelection; QLabel* StatusBarGeneral;
QToolBar* toolBar; QLabel* StatusBarSelection;
QSystemTrayIcon* SysTray; QToolBar* toolBar;
QAction* ViewShowToolbarAction; QSystemTrayIcon* SysTray;
QMenu* SysTrayMenu; QAction* ViewShowToolbarAction;
bool ShutingDown; QMenu* SysTrayMenu;
protected: bool ShutingDown;
void closeEvent(QCloseEvent* event);
}; };
#endif #endif

@ -39,6 +39,7 @@ QString GnomePlugin::openExistingFileDialog(QWidget* parent,QString title,QStrin
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
NULL); NULL);
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(FileDlg),CSTR(dir)); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(FileDlg),CSTR(dir));
GtkFileFilter** filters=parseFilterStrings(Filters); GtkFileFilter** filters=parseFilterStrings(Filters);