From 6154859afc83a367bd1bd72747cd2c1961dbfec5 Mon Sep 17 00:00:00 2001 From: tariq Date: Thu, 16 Mar 2006 08:09:08 +0000 Subject: [PATCH] Finished PasswordDlg, Added Text Export git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@56 b624d157-de02-0410-bad0-e51aec6abb33 --- src/PwmConfig.cpp | 5 +-- src/dialogs/PasswordDlg.cpp | 63 +++++++++++++++++++++++++++---------- src/dialogs/SettingsDlg.cpp | 24 +++++++++----- src/dialogs/SettingsDlg.h | 13 +------- src/export/Export_Txt.cpp | 62 ++++++++++++++++++++++++++++++++++++ src/export/Export_Txt.h | 31 ++++++++++++++++++ src/forms/MainWindow.ui | 11 ++++--- src/forms/PasswordDlg.ui | 4 +-- src/forms/SettingsDlg.ui | 2 +- src/lib/EntryView.cpp | 7 ++++- src/lib/EntryView.h | 1 + src/mainwindow.cpp | 32 +++++++++++++++++-- src/mainwindow.h | 1 + src/src.pro | 2 ++ 14 files changed, 209 insertions(+), 49 deletions(-) create mode 100644 src/export/Export_Txt.cpp create mode 100644 src/export/Export_Txt.h diff --git a/src/PwmConfig.cpp b/src/PwmConfig.cpp index 199d086..c52e0f2 100755 --- a/src/PwmConfig.cpp +++ b/src/PwmConfig.cpp @@ -41,7 +41,7 @@ ini.ReadFile(); ClipboardTimeOut=ini.GetValueI("Options","ClipboardTimeOut",20); Toolbar=ini.GetValueB("UI","ShowToolbar",true); EntryDetails=ini.GetValueB("UI","ShowEntryDetails",true); -OpenLast=ini.GetValueB("Options","OpenLast",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,104,176").c_str()); @@ -68,7 +68,7 @@ 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("Option","LastKeyType",(int)PASSWORD); +LastKeyType=(tKeyType)ini.GetValueI("Options","LastKeyType",(int)PASSWORD); if(!OpenLast)RememberLastKey=false; return true; } @@ -77,6 +77,7 @@ 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); else ini.SetValue("Options","LastFile",""); ini.SetValue("UI","Columns",(const char*)CreateColumnString(),true); diff --git a/src/dialogs/PasswordDlg.cpp b/src/dialogs/PasswordDlg.cpp index 9897b70..e2f9267 100755 --- a/src/dialogs/PasswordDlg.cpp +++ b/src/dialogs/PasswordDlg.cpp @@ -36,6 +36,32 @@ CPasswordDialog::CPasswordDialog(QWidget* parent, const char* name, bool modal, { setupUi(this); createBanner(Banner,Icon_Key32x32,tr("Database Key")); + +QDir media(config.MountDir); +if(media.exists()){ + QStringList Paths; + Paths=media.entryList("*",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){ + switch(config.LastKeyType){ + case PASSWORD: setStatePasswordOnly(); break; + 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&) ) ); @@ -56,19 +82,6 @@ if(!ChangeKeyMode){ connect( ButtonBrowse, SIGNAL( clicked() ), this, SLOT( OnButtonBrowse_Set() ) ); } - - -QDir media(config.MountDir); -if(media.exists()){ - QStringList Paths; - Paths=media.entryList("*",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.ShowPasswords)ChangeEchoMode(); } @@ -79,6 +92,7 @@ ButtonBrowse->setEnabled(false); Label_KeyFile->setEnabled(false); Label_Password->setEnabled(true); Edit_Password->setEnabled(true); +Edit_PasswordRep->setEnabled(true); ButtonChangeEchoMode->setEnabled(true); KeyType=PASSWORD; } @@ -90,6 +104,7 @@ ButtonBrowse->setEnabled(true); Label_KeyFile->setEnabled(true); Label_Password->setEnabled(false); Edit_Password->setEnabled(false); +Edit_PasswordRep->setEnabled(false); ButtonChangeEchoMode->setEnabled(false); KeyType=KEYFILE; } @@ -101,6 +116,7 @@ ButtonBrowse->setEnabled(true); Label_KeyFile->setEnabled(true); Label_Password->setEnabled(true); Edit_Password->setEnabled(true); +Edit_PasswordRep->setEnabled(true); ButtonChangeEchoMode->setEnabled(true); KeyType=BOTH; } @@ -192,14 +208,22 @@ if(KeyType==BOTH || KeyType==KEYFILE){ return;} } } + +if(config.RememberLastKey){ + config.LastKeyLocation=keyfile; + config.LastKeyType=KeyType; +} 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); + QMessageBox::warning(this,tr("Error"),tr("Please enter a password or select a key file."),tr("OK"),"","",0,0); return;} QFile file(keyfile); @@ -224,10 +248,15 @@ if(QFileInfo(file).isDir()){ return;} } } +if(config.RememberLastKey){ + config.LastKeyLocation=keyfile; + config.LastKeyType=KeyType; +} done(1); } void CPasswordDialog::OnPasswordChanged(const QString &txt){ +Edit_PasswordRep->setText(""); if(CheckBox_Both->isChecked() || txt==QString()) setStateBoth(); else @@ -263,10 +292,12 @@ if(state==Qt::Unchecked){ } void CPasswordDialog::ChangeEchoMode(){ -if(Edit_Password->echoMode()==QLineEdit::Normal) +if(Edit_Password->echoMode()==QLineEdit::Normal){ Edit_Password->setEchoMode(QLineEdit::Password); -else + Edit_PasswordRep->setEchoMode(QLineEdit::Password);} +else{ Edit_Password->setEchoMode(QLineEdit::Normal); + Edit_PasswordRep->setEchoMode(QLineEdit::Normal);} } diff --git a/src/dialogs/SettingsDlg.cpp b/src/dialogs/SettingsDlg.cpp index ee5c130..be7b2ae 100755 --- a/src/dialogs/SettingsDlg.cpp +++ b/src/dialogs/SettingsDlg.cpp @@ -31,11 +31,12 @@ CSettingsDlg::CSettingsDlg(QWidget* parent, const char* name, bool modal, Qt::WF : QDialog(parent,name, modal,fl) { setupUi(this); -connect( ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) ); -connect( ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); -connect( ButtonColor1, SIGNAL( clicked() ), this, SLOT( OnColor1() ) ); -connect( ButtonColor2, SIGNAL( clicked() ), this, SLOT( OnColor2() ) ); -connect( ButtonTextColor, SIGNAL( clicked() ), this, SLOT( OnTextColor() ) ); +connect(ButtonOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) ); +connect(ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); +connect(ButtonColor1, SIGNAL( clicked() ), this, SLOT( OnColor1() ) ); +connect(ButtonColor2, SIGNAL( clicked() ), this, SLOT( OnColor2() ) ); +connect(ButtonTextColor, SIGNAL( clicked() ), this, SLOT( OnTextColor() ) ); +connect(CheckBox_OpenLast,SIGNAL(stateChanged(int)),this,SLOT(OnCeckBoxOpenLastChanged(int))); createBanner(Banner,Icon_Settings32x32,tr("Settings")); CheckBox_OpenLast->setChecked(config.OpenLast); SpinBox_ClipboardTime->setValue(config.ClipboardTimeOut); @@ -58,13 +59,12 @@ pixmColor2->setPixmap(*px2); color1=config.BannerColor1; color2=config.BannerColor2; textcolor=config.BannerTextColor; - CheckBox_ShowPasswords->setChecked(config.ShowPasswords); Edit_BrowserCmd->setText(config.OpenUrlCommand); CheckBox_ExpandGroupTree->setChecked(config.ExpandGroupTree); CheckBox_AlternatingRowColors->setChecked(config.AlternatingRowColors); Edit_MountDir->setText(config.MountDir); - +CheckBox_RememberLastKey->setChecked(config.RememberLastKey); } CSettingsDlg::~CSettingsDlg() @@ -85,6 +85,7 @@ config.AlternatingRowColors=CheckBox_AlternatingRowColors->isChecked(); config.MountDir=Edit_MountDir->text(); if(config.MountDir!="" && config.MountDir.right(1)!="/") config.MountDir+="/"; +config.RememberLastKey=CheckBox_RememberLastKey->isChecked(); close(); } @@ -132,7 +133,14 @@ createBanner(Banner,Icon_Settings32x32,tr("Settings"),color1,color2,textcolor); } } - +void CSettingsDlg::OnCeckBoxOpenLastChanged(int state){ +if(state==Qt::Checked){ + CheckBox_RememberLastKey->setEnabled(true); +}else{ + CheckBox_RememberLastKey->setEnabled(false); + CheckBox_RememberLastKey->setChecked(false); +} +} /*$SPECIALIZATION$*/ diff --git a/src/dialogs/SettingsDlg.h b/src/dialogs/SettingsDlg.h index 1f3c90b..afcb7d4 100755 --- a/src/dialogs/SettingsDlg.h +++ b/src/dialogs/SettingsDlg.h @@ -20,7 +20,6 @@ #include "main.h" #ifndef SETTINGSDLG_H #define SETTINGSDLG_H - #include "ui_SettingsDlg.h" #include @@ -31,24 +30,14 @@ class CSettingsDlg : public QDialog, public Ui_SettingsDialog public: CSettingsDlg(QWidget* parent = 0, const char* name = 0, bool modal = FALSE, Qt::WFlags fl = 0 ); ~CSettingsDlg(); - /*$PUBLIC_FUNCTIONS$*/ - -public slots: - /*$PUBLIC_SLOTS$*/ - -protected: - /*$PROTECTED_FUNCTIONS$*/ - -protected slots: - /*$PROTECTED_SLOTS$*/ public slots: virtual void OnCancel(); -public slots: virtual void OnOK(); virtual void OnTextColor(); virtual void OnColor2(); virtual void OnColor1(); + void OnCeckBoxOpenLastChanged(int state); private: QColor color1,color2,textcolor; diff --git a/src/export/Export_Txt.cpp b/src/export/Export_Txt.cpp new file mode 100644 index 0000000..4f7694f --- /dev/null +++ b/src/export/Export_Txt.cpp @@ -0,0 +1,62 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include +#include "main.h" +#include "../lib/SecString.h" +#include "Export_Txt.h" + +QString EntryTemplate=QString("\n\ + Title: %1\n\ + Username: %2\n\ + Url: %3\n\ + Password: %4\n\ + Comment: %5\n\ +"); + +QString GroupTemplate=QString("\n\ +*** Group: %1 ***\n\ +"); + +bool Export_Txt::exportFile(const QString& filename,PwDatabase* db,QString& err){ +QFile file(filename); +if(!file.open(QIODevice::Truncate | QIODevice::WriteOnly)){ + err+=tr("Could not open file (FileError=%1)").arg(file.error()); + return false; +} + +for(int g=0;gGroups.size();g++){ + file.write(GroupTemplate.arg(db->Groups[g].Name).utf8()); + for(int e=0;eEntries.size();e++){ + if(db->Groups[g].ID==db->Entries[e].GroupID){ + db->Entries[e].Password.unlock(); + file.write(EntryTemplate.arg(db->Entries[e].Title) + .arg(db->Entries[e].UserName) + .arg(db->Entries[e].URL) + .arg(db->Entries[e].Password.string()) + .arg(db->Entries[e].Additional) + .utf8()); + db->Entries[e].Password.lock(); + } + } +} +file.close(); +} \ No newline at end of file diff --git a/src/export/Export_Txt.h b/src/export/Export_Txt.h new file mode 100644 index 0000000..200e2a6 --- /dev/null +++ b/src/export/Export_Txt.h @@ -0,0 +1,31 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _EXPORT_TXT_H_ +#define _EXPORT_TXT_H_ +#include +#include "PwManager.h" + +class Export_Txt:public QObject{ +public: + bool exportFile(const QString& filename,PwDatabase* db,QString& err); + +}; + +#endif diff --git a/src/forms/MainWindow.ui b/src/forms/MainWindow.ui index d0b7dd4..ff59d63 100644 --- a/src/forms/MainWindow.ui +++ b/src/forms/MainWindow.ui @@ -79,6 +79,9 @@ false + + true + @@ -509,16 +512,16 @@ - KeepassGroupView + KeepassEntryView QTreeWidget -
../../src/lib/GroupView.h
+
../../src/lib/EntryView.h
0
- KeepassEntryView + KeepassGroupView QTreeWidget -
../../src/lib/EntryView.h
+
../../src/lib/GroupView.h
0
diff --git a/src/forms/PasswordDlg.ui b/src/forms/PasswordDlg.ui index b293482..5fdcb9d 100644 --- a/src/forms/PasswordDlg.ui +++ b/src/forms/PasswordDlg.ui @@ -137,7 +137,7 @@ Qt::Vertical - + 10 @@ -164,7 +164,7 @@ - TextLabel + Password Repet.: diff --git a/src/forms/SettingsDlg.ui b/src/forms/SettingsDlg.ui index 5165da0..7e0b360 100644 --- a/src/forms/SettingsDlg.ui +++ b/src/forms/SettingsDlg.ui @@ -509,7 +509,7 @@ Alt+Ö - + 30 diff --git a/src/lib/EntryView.cpp b/src/lib/EntryView.cpp index ed260b6..bbb23d9 100644 --- a/src/lib/EntryView.cpp +++ b/src/lib/EntryView.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2006 by Tarek Saidi * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * @@ -37,6 +37,7 @@ KeepassEntryView::KeepassEntryView(QWidget* parent):QTreeWidget(parent){ AutoResizeColumns=true; +IsSearchGroup=false; int sum=0; for(int i=0;iEntries.size();i++){ } void KeepassEntryView::showSearchResults(QList& results){ +IsSearchGroup=true; clear(); Items.clear(); for(int j=0; jbuttons() & Qt::LeftButton)) return; if ((event->pos() - DragStartPos).manhattanLength() < QApplication::startDragDistance()) diff --git a/src/lib/EntryView.h b/src/lib/EntryView.h index eb39a97..df6a714 100644 --- a/src/lib/EntryView.h +++ b/src/lib/EntryView.h @@ -53,6 +53,7 @@ private: QPoint DragStartPos; QList DragItems; QPixmap DragPixmap; + bool IsSearchGroup; protected: virtual void contextMenuEvent(QContextMenuEvent *event); virtual void paintEvent(QPaintEvent* event); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index cbff4af..9d0ec01 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -42,6 +42,7 @@ #include "lib/IniReader.h" #include "import/Import_PwManager.h" #include "import/Import_KWalletXml.h" +#include "export/Export_Txt.h" #include "dialogs/AboutDlg.h" #include "dialogs/EditGroupDlg.h" @@ -97,6 +98,7 @@ void KeepassMainWindow::setupConnections(){ connect(FileExitAction, SIGNAL(triggered()), this, SLOT(OnFileExit())); connect(FileImpPwmAction, SIGNAL(triggered()), this, SLOT(OnImportFromPwm())); connect(FileImpKWalletXmlAction, SIGNAL(triggered()), this,SLOT(OnImportFromKWalletXml())); + connect(FileExpPlainTextAction,SIGNAL(triggered()),this,SLOT(OnExportToTxt())); connect(EditNewGroupAction, SIGNAL(triggered()), this, SLOT(OnEditNewGroup())); connect(EditEditGroupAction, SIGNAL(triggered()), this, SLOT(OnEditEditGroup())); @@ -587,6 +589,15 @@ void KeepassMainWindow::OnFileExit(){ close(); } +void KeepassMainWindow::OnExportToTxt(){ +QString filename=QFileDialog::getSaveFileName(this,tr("Export To..."),QDir::homePath(),"*.txt"); +if(filename==QString())return; +Export_Txt exp; +QString err; +exp.exportFile(filename,db,err); + +} + void KeepassMainWindow::OnImportFromPwm(){ if(FileOpen) if(!closeDatabase())return; @@ -669,9 +680,24 @@ if(cur){ } void KeepassMainWindow::OnEntryItemDoubleClicked(QTreeWidgetItem* item,int column){ -if(column) return; -if(!config.Columns[0]) return; -editEntry(static_cast(item)->pEntry); +int i=0; +int c=-1; +for(i;i(item)->pEntry; +switch(i){ + case 0: editEntry(entry); + break; + case 1: OnEditUsernameToClipboard(); + break; + case 2: OnEditOpenUrl(); + break; + case 3: OnEditPasswordToClipboard(); + break; +} } void KeepassMainWindow::OnEntrySelectionChanged(){ diff --git a/src/mainwindow.h b/src/mainwindow.h index 85fd828..e7f61d1 100755 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -63,6 +63,7 @@ private slots: void OnFileExit(); void OnImportFromPwm(); void OnImportFromKWalletXml(); + void OnExportToTxt(); void OnEditNewGroup(); void OnEditEditGroup(); void OnEditDeleteGroup(); diff --git a/src/src.pro b/src/src.pro index 69f6bc9..9107bc0 100755 --- a/src/src.pro +++ b/src/src.pro @@ -35,6 +35,7 @@ HEADERS += lib/IniReader.h \ crypto/twoclass.h \ crypto/twofish.h \ import/Import_PwManager.h \ + export/Export_Txt.h \ crypto/blowfish.h \ crypto/sha1.h \ import/Import_KWalletXml.h \ @@ -68,6 +69,7 @@ SOURCES += lib/IniReader.cpp \ crypto/twoclass.cpp \ crypto/twofish.cpp \ import/Import_PwManager.cpp \ + export/Export_Txt.cpp \ crypto/blowfish.cpp \ crypto/sha1.cpp \ import/Import_KWalletXml.cpp \