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. 12
      src/PwmConfig.cpp
  3. 47
      src/PwmConfig.h
  4. 17
      src/StandardDatabase.cpp
  5. 5
      src/StandardDatabase.h
  6. 98
      src/dialogs/PasswordDlg.cpp
  7. 12
      src/dialogs/PasswordDlg.h
  8. 26
      src/dialogs/SettingsDlg.cpp
  9. 22
      src/forms/SettingsDlg.ui
  10. 1
      src/main.cpp
  11. 132
      src/mainwindow.cpp
  12. 14
      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{
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.

@ -74,7 +74,11 @@ 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;
@ -118,6 +122,12 @@ 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);}

@ -20,48 +20,53 @@
#ifndef _PWMCONFIG_H_
#define _PWMCONFIG_H_
#include <QColor>
#include "main.h"
#include "lib/IniReader.h"
#include <qcolor.h>
class CConfig{
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;
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 SearchOptions[9];
bool PwGenOptions[10];
int PwGenLength;
QString PwGenCharList;
bool Columns[10];
bool ShowPasswords;
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;
bool ShowSysTrayIcon;
bool MinimizeToTray;
bool SaveFileDlgHistory;
bool EnableBookmarkMenu;
QString PwGenCharList;
QString MountDir;
QString LastKeyLocation;
int ToolbarIconSize;
QString OpenUrlCommand;
QString Language;
QString LastFile;
QColor BannerColor1;
QColor BannerColor2;
QColor BannerTextColor;
IntegrPluginType IntegrPlugin;
tKeyType LastKeyType;
bool loadFromIni(QString filename);
bool saveToIni(QString filename);

@ -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<IEntryHandle*> StandardDatabase::entries(){
@ -1511,6 +1517,7 @@ bool StandardDatabase::createKeyFile(const QString& filename,int length, bool He
}
file.close();
delete [] key;
return true;
}

@ -139,6 +139,7 @@ public:
QList<StdGroup*> Childs;
QList<StdEntry*> 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<IEntryHandle*> search(IGroupHandle* Group,const QString& SearchString, bool CaseSensitve, bool RegExp,bool Recursive,bool* Fields);
virtual QFile* file(){return File;}

@ -31,11 +31,12 @@
#include <QMessageBox>
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"));
db=DB;
QDir media(config.MountDir);
if(media.exists()){
QStringList Paths;
@ -60,7 +61,6 @@ if(config.RememberLastKey && !ChangeKeyMode){
}
}
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&) ) );
@ -91,6 +91,7 @@ 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);
@ -103,6 +104,7 @@ 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);
@ -115,6 +117,7 @@ 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);
@ -158,7 +161,8 @@ 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==""){
@ -171,20 +175,6 @@ void CPasswordDialog::OnOK(){
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;
@ -212,13 +202,15 @@ void CPasswordDialog::OnOK(){
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{
}
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{
}
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);
@ -227,53 +219,71 @@ void CPasswordDialog::OnOK(){
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;}
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;}
return;
}
if(keyfile!=QString()){
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";
}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;}
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);
}
bool CPasswordDialog::doAuth(){
IFilePasswordAuth* DbAuth=dynamic_cast<IFilePasswordAuth*>(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;
}
done(1);
return true;
}
void CPasswordDialog::OnPasswordChanged(const QString &txt){

@ -17,11 +17,13 @@
* 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
{
@ -29,18 +31,18 @@ class CPasswordDialog : public QDialog, public Ui_PasswordDlg
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 = 0, bool modal = false,
bool ShowExitButton = false, bool KeyMode_Set=false, Qt::WFlags fl = 0 );
CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButton = false, bool KeyMode_Set=false);
public slots:
void OnOK();

@ -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();

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

@ -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("/"));

@ -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,6 +201,7 @@ void KeepassMainWindow::setupIcons(){
EditAutoTypeAction->setIcon(*Icon_AutoType);
HelpHandbookAction->setIcon(*Icon_Help);
SysTray->setIcon(QIcon(AppDir+"/../share/keepass/icons/keepassx_large.png"));
if(config.ShowSysTrayIcon)
SysTray->show();
}
@ -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<IDatabase*>(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<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;
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<IFilePasswordAuth*>(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<IDatabase*>(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<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;
}
}
db=dynamic_cast<IDatabase*>(db_new);
setWindowTitle(tr("%1 - KeePassX").arg(tr("[new]")));
GroupView->db=db;
EntryView->db=db;
@ -439,6 +372,10 @@ void KeepassMainWindow::OnFileNewKdb(){
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_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);
CPasswordDialog dlg(this,db,false,true);
if(dlg.exec())
setStateFileModified(true);
}
*/
}
void KeepassMainWindow::OnFileExit(){
@ -891,7 +810,7 @@ setStateFileModified(true);
}
void KeepassMainWindow::closeEvent(QCloseEvent* e){
if(!ShutingDown){
if(!ShutingDown && config.MinimizeToTray){
e->ignore();
hide();
return;
@ -919,9 +838,10 @@ void KeepassMainWindow::closeEvent(QCloseEvent* e){
void KeepassMainWindow::OnExtrasSettings(){
CSettingsDlg dlg(this);
dlg.exec();
if(dlg.exec()==1){
EntryView->setAlternatingRowColors(config.AlternatingRowColors);
//Group::UI_ExpandByDefault=config.ExpandGroupTree;
SysTray->setVisible(config.ShowSysTrayIcon);
}
}
void KeepassMainWindow::OnHelpAbout(){

@ -46,13 +46,11 @@
#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;
IDatabase* db;
bool Start;
signals:
@ -95,6 +93,7 @@ private slots:
void OnSysTrayActivated(QSystemTrayIcon::ActivationReason);
private:
void closeEvent(QCloseEvent* event);
SelectionState GroupSelection, EntrySelection;
bool FileOpen;
bool ModFlag;
@ -107,7 +106,7 @@ private:
void setStateFileModified(bool);
void setStateGroupSelected(SelectionState s);
void setStateEntrySelected(SelectionState s);
void openDatabase(QString filename,bool IsStart=false);
void openDatabase(QString filename,bool IsAuto=false);
void setupDatabaseConnections(IDatabase* DB);
bool closeDatabase();
void search(IGroupHandle* Group);
@ -121,13 +120,6 @@ private:
QAction* ViewShowToolbarAction;
QMenu* SysTrayMenu;
bool ShutingDown;
protected:
void closeEvent(QCloseEvent* event);
};
#endif

@ -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);