diff --git a/src/Database.h b/src/Database.h index 7566289..fd539b6 100644 --- a/src/Database.h +++ b/src/Database.h @@ -79,17 +79,53 @@ static bool UI_ExpandByDefault; class Database{ public: Database(); + virtual ~Database(){}; + virtual bool openDatabase(QString filename, QString& err)=0; + virtual bool saveDatabase()=0; + virtual bool closeDatabase()=0; + virtual void newDatabase()=0; + + virtual bool CalcMasterKeyByPassword(QString& password)=0; + virtual bool CalcMasterKeyByFile(QString filename)=0; + virtual bool CalcMasterKeyByFileAndPw(QString filename, QString& password)=0; + virtual bool createKeyFile(const QString& filename)=0; + + virtual CGroup& group(unsigned long index)=0; + virtual void setGroup(unsigned long index,CGroup& group)=0; + virtual int numGroups()=0; + virtual CGroup* addGroup(CGroup* parent)=0; + virtual void deleteGroup(CGroup* pGroup)=0; + virtual void deleteGroup(unsigned long ID)=0; + virtual void moveGroup(CGroup* group, CGroup* DstGroup, int pos=-1)=0; + virtual void moveGroupDirectly(CGroup* group, CGroup* DstGroup)=0; //inserts group directly behind DstGroup on the same level + virtual int getGroupIndex(CGroup* group)=0; + virtual int getGroupIndex(unsigned long ID)=0; + virtual int getNumberOfChilds(CGroup* pGroup)=0; + virtual QList getChildIds(CGroup* pGroup)=0; + + virtual CEntry& entry(unsigned long index)=0; + virtual void setEntry(unsigned long index,CEntry& Entry)=0; + virtual int numEntries()=0; + virtual CEntry* cloneEntry(CEntry* pEntry)=0; + virtual void deleteEntry(CEntry* pEntry)=0; + virtual void moveEntry(CEntry* pEntry,CGroup* pDstGroup)=0; + virtual CEntry* addEntry()=0; + virtual CEntry* addEntry(CEntry* NewEntry)=0; + virtual void merge(Database* db2)=0; + virtual bool isParentGroup(CGroup* Group,CGroup* PotenialParent)=0; + virtual QString getError()=0; //get first error + virtual QString getErrors()=0; //get all errors in a \n seperated String + Q_UINT32 CryptoAlgorithmus; Q_UINT32 KeyEncRounds; QFile* file; bool modflag; int SearchGroupID; - QListGroups; - QListEntries; protected: Q_UINT8 MasterKey[32]; Q_UINT8 TransformedMasterKey[32]; + }; #endif diff --git a/src/PwManager.cpp b/src/PwManager.cpp index 018f0ae..8347b7d 100755 --- a/src/PwManager.cpp +++ b/src/PwManager.cpp @@ -536,10 +536,6 @@ PwDatabase::PwDatabase(){ SearchGroupID=-1; } -PwDatabase::~PwDatabase(){ - -} - void PwDatabase::newDatabase(){ file=new QFile(); } @@ -941,18 +937,18 @@ return i; } -void PwDatabase::merge(PwDatabase* db){ -for(int i=0;iGroups.size();i++){ +void PwDatabase::merge(Database* db){ +for(int i=0;inumGroups();i++){ int NewGroupID; - if(isGroupIdInUse(db->Groups[i].ID)==true) NewGroupID=getNewGroupId(); - else NewGroupID=db->Groups[i].ID; - for(int j=0;jEntries.size();j++){ - if(db->Entries[j].GroupID==db->Groups[i].ID){ - Entries.push_back(db->Entries[j]); + if(isGroupIdInUse(db->group(i).ID)==true) NewGroupID=getNewGroupId(); + else NewGroupID=db->group(i).ID; + for(int j=0;jnumEntries();j++){ + if(db->entry(j).GroupID==db->group(i).ID){ + Entries.push_back(db->entry(j)); Entries.back().GroupID=NewGroupID; Entries.back().sID=getNewEntrySid();} } - Groups.push_back(db->Groups[i]); + Groups.push_back(db->group(i)); Groups.back().ID=NewGroupID; } } @@ -1122,6 +1118,24 @@ for(i=GroupIndex+1; i getChildIds(CGroup* pGroup); + CEntry& entry(unsigned long index); + void setEntry(unsigned long index,CEntry& Entry); + int numEntries(); CEntry* cloneEntry(CEntry* pEntry); void deleteEntry(CEntry* pEntry); void moveEntry(CEntry* pEntry,CGroup* pDstGroup); CEntry* addEntry(); CEntry* addEntry(CEntry* NewEntry); - void merge(PwDatabase* db2); + void merge(Database* db2); bool isParentGroup(CGroup* Group,CGroup* PotenialParent); QString getError(); //get first error QString getErrors(); //get all errors in a \n seperated String - + QListGroups; + QListEntries; private: bool IsMetaStream(CEntry& Entry); bool parseMetaStream(const CEntry& Entry); @@ -87,6 +93,7 @@ private: bool convHexToBinaryKey(char* HexKey, char* dst); QStringList Errors; QList UnkownMetaStreams; + }; diff --git a/src/PwmConfig.cpp b/src/PwmConfig.cpp index b4bcd30..9eb612f 100755 --- a/src/PwmConfig.cpp +++ b/src/PwmConfig.cpp @@ -44,9 +44,9 @@ EntryDetails=ini.GetValueB("UI","ShowEntryDetails",true); OpenLast=ini.GetValueB("Options","RememberLastFile",true); LastFile=ini.GetValue("Options","LastFile","").c_str(); ParseColumnString(ini.GetValue("UI","Columns","1111100000").c_str(),Columns); -BannerColor1=ParseColorString(ini.GetValue("Options","BannerColor1","0,104,176").c_str()); -BannerColor2=ParseColorString(ini.GetValue("Options","BannerColor2","213,239,255").c_str()); -BannerTextColor=ParseColorString(ini.GetValue("Options","BannerTextColor","4,0,80").c_str()); +BannerColor1=ParseColorString(ini.GetValue("Options","BannerColor1","0,85,127").c_str()); +BannerColor2=ParseColorString(ini.GetValue("Options","BannerColor2","0,117,175").c_str()); +BannerTextColor=ParseColorString(ini.GetValue("Options","BannerTextColor","222,222,222").c_str()); ShowPasswords=ini.GetValueB("Options","ShowPasswords",false); OpenUrlCommand=ini.GetValue("Options","UrlCmd","kfmclient openURL %1").c_str(); Language=ini.GetValue("Options","LangFile","").c_str(); diff --git a/src/dialogs/EditEntryDlg.cpp b/src/dialogs/EditEntryDlg.cpp index da37b26..538eab7 100755 --- a/src/dialogs/EditEntryDlg.cpp +++ b/src/dialogs/EditEntryDlg.cpp @@ -43,7 +43,7 @@ -CEditEntryDlg::CEditEntryDlg(PwDatabase* _db, CEntry* _entry,QWidget* parent, const char* name, bool modal, Qt::WFlags fl) +CEditEntryDlg::CEditEntryDlg(Database* _db, CEntry* _entry,QWidget* parent, const char* name, bool modal, Qt::WFlags fl) : QDialog(parent,name, modal,fl) { Q_ASSERT(_db); @@ -143,11 +143,11 @@ Combo_IconPicker->setCurrentItem(entry->ImageID); void CEditEntryDlg::InitGroupComboBox(){ QString tmp; int i; -for(i=0;i!=db->Groups.size();i++){ +for(i=0;i!=db->numGroups();i++){ tmp=""; - for(int j=0;jGroups[i].Level;j++)tmp+=" "; -Combo_Group->insertItem(EntryIcons[db->Groups[i].ImageID], - tmp+db->Groups[i].Name,i); + for(int j=0;jgroup(i).Level;j++)tmp+=" "; +Combo_Group->insertItem(EntryIcons[db->group(i).ImageID], + tmp+db->group(i).Name,i); } Combo_Group->setCurrentItem(db->getGroupIndex(entry->GroupID)); } @@ -190,7 +190,7 @@ QString s=Edit_Password->text(); entry->Password.setString(s,true); entry->Additional=Edit_Comment->text(); if(Combo_Group->currentItem()!=db->getGroupIndex(entry->GroupID)){ - db->moveEntry(entry,&db->Groups[Combo_Group->currentItem()]); + db->moveEntry(entry,&db->group(Combo_Group->currentItem())); EntryMoved=true; ModFlag=true; } entry->ImageID=Combo_IconPicker->currentItem(); diff --git a/src/dialogs/EditEntryDlg.h b/src/dialogs/EditEntryDlg.h index 50bd2a3..bb51888 100755 --- a/src/dialogs/EditEntryDlg.h +++ b/src/dialogs/EditEntryDlg.h @@ -31,7 +31,7 @@ class CEditEntryDlg : public QDialog, public Ui_EditEntryDialog Q_OBJECT public: - CEditEntryDlg(PwDatabase* _db, CEntry* _entry,QWidget* parent = 0, const char* name = 0, bool modal = FALSE, Qt::WFlags fl = 0); + CEditEntryDlg(Database* _db, CEntry* _entry,QWidget* parent = 0, const char* name = 0, bool modal = FALSE, Qt::WFlags fl = 0); ~CEditEntryDlg(); virtual void showEvent(QShowEvent *); /*$PUBLIC_FUNCTIONS$*/ @@ -48,7 +48,7 @@ protected slots: public: CEntry* entry; -PwDatabase* db; +Database* db; QPixmap* banner_pixmap; bool ModFlag; diff --git a/src/dialogs/SearchDlg.cpp b/src/dialogs/SearchDlg.cpp index 17909a4..4714fe6 100755 --- a/src/dialogs/SearchDlg.cpp +++ b/src/dialogs/SearchDlg.cpp @@ -27,7 +27,7 @@ #include #include -CSearchDlg::CSearchDlg(PwDatabase* _db,CGroup* pGroup,QWidget* parent, const char* name, bool modal, Qt::WFlags fl) +CSearchDlg::CSearchDlg(Database* _db,CGroup* pGroup,QWidget* parent, const char* name, bool modal, Qt::WFlags fl) : QDialog(parent,name, modal,fl) { setupUi(this); @@ -80,30 +80,30 @@ if(txt==""){ QMessageBox::information(this,tr("Notice"),tr("Please enter a search string."),tr("OK")); return;} -for(int i=0;iEntries.size();i++){ +for(int i=0;inumEntries();i++){ if(group){ if(checkBox_Recursive->isChecked()){ QList groups=db->getChildIds(group); groups << group->ID; bool IsInAnyGroup=false; for(int j=0; jEntries[i].GroupID == groups[j]){IsInAnyGroup=true; break;}} + if(db->entry(i).GroupID == groups[j]){IsInAnyGroup=true; break;}} if(!IsInAnyGroup)continue; } else - if(db->Entries[i].GroupID != group->ID)continue; + if(db->entry(i).GroupID != group->ID)continue; } bool hit=false; - if(checkBox_Title->isChecked()) hit=hit||search(db->Entries[i].Title); - if(checkBox_Username->isChecked()) hit=hit||search(db->Entries[i].UserName); - if(checkBox_URL->isChecked()) hit=hit||search(db->Entries[i].URL); - if(checkBox_Comment->isChecked()) hit=hit||search(db->Entries[i].Additional); - if(checkBox_Attachment->isChecked()) hit=hit||search(db->Entries[i].BinaryDesc); - db->Entries[i].Password.unlock(); - if(checkBox_Password->isChecked()) hit=hit||search(db->Entries[i].Password.string()); - db->Entries[i].Password.lock(); - if(hit)Hits.push_back(db->Entries[i].sID); + if(checkBox_Title->isChecked()) hit=hit||search(db->entry(i).Title); + if(checkBox_Username->isChecked()) hit=hit||search(db->entry(i).UserName); + if(checkBox_URL->isChecked()) hit=hit||search(db->entry(i).URL); + if(checkBox_Comment->isChecked()) hit=hit||search(db->entry(i).Additional); + if(checkBox_Attachment->isChecked()) hit=hit||search(db->entry(i).BinaryDesc); + db->entry(i).Password.unlock(); + if(checkBox_Password->isChecked()) hit=hit||search(db->entry(i).Password.string()); + db->entry(i).Password.lock(); + if(hit)Hits.push_back(db->entry(i).sID); } done(1); diff --git a/src/dialogs/SearchDlg.h b/src/dialogs/SearchDlg.h index 8b1c9a3..dadf7f5 100755 --- a/src/dialogs/SearchDlg.h +++ b/src/dialogs/SearchDlg.h @@ -27,7 +27,7 @@ class CSearchDlg : public QDialog, public Ui_Search_Dlg { Q_OBJECT public: - CSearchDlg(PwDatabase* _db, CGroup* pGroup=NULL,QWidget* parent = 0, const char* name = 0, + CSearchDlg(Database* _db, CGroup* pGroup=NULL,QWidget* parent = 0, const char* name = 0, bool modal = FALSE, Qt::WFlags fl = 0 ); ~CSearchDlg(); QList Hits; @@ -40,7 +40,7 @@ private: QString txt; CGroup* group; bool regexp; - PwDatabase* db; + Database* db; bool search(const QString& str); }; diff --git a/src/export/Export_Txt.cpp b/src/export/Export_Txt.cpp index f85163a..dd1c2a5 100644 --- a/src/export/Export_Txt.cpp +++ b/src/export/Export_Txt.cpp @@ -36,27 +36,27 @@ QString GroupTemplate=QString("\n\ *** Group: %1 ***\n\ "); -bool Export_Txt::exportFile(const QString& filename,PwDatabase* db,QString& err){ +bool Export_Txt::exportFile(const QString& filename,Database* 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.replace('\n',"\n ")) +for(int g=0;gnumGroups();g++){ + file.write(GroupTemplate.arg(db->group(g).Name).utf8()); + for(int e=0;enumEntries();e++){ + if(db->group(g).ID==db->entry(e).GroupID){ + db->entry(e).Password.unlock(); + file.write(EntryTemplate.arg(db->entry(e).Title) + .arg(db->entry(e).UserName) + .arg(db->entry(e).URL) + .arg(db->entry(e).Password.string()) + .arg(db->entry(e).Additional.replace('\n',"\n ")) .utf8()); - db->Entries[e].Password.lock(); + db->entry(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 index 200e2a6..0600609 100644 --- a/src/export/Export_Txt.h +++ b/src/export/Export_Txt.h @@ -24,7 +24,7 @@ class Export_Txt:public QObject{ public: - bool exportFile(const QString& filename,PwDatabase* db,QString& err); + bool exportFile(const QString& filename,Database* db,QString& err); }; diff --git a/src/import/Import_KWalletXml.cpp b/src/import/Import_KWalletXml.cpp index e10412a..f43a31f 100755 --- a/src/import/Import_KWalletXml.cpp +++ b/src/import/Import_KWalletXml.cpp @@ -25,7 +25,7 @@ #include using namespace std; -bool Import_KWalletXml::importFile(QString FileName,PwDatabase* pwm,QString& err){ +bool Import_KWalletXml::importFile(QString FileName,Database* pwm,QString& err){ QFile file(FileName); if(!file.exists()){ err+=QObject::tr("File not found."); diff --git a/src/import/Import_KWalletXml.h b/src/import/Import_KWalletXml.h index be38e54..6be1c36 100755 --- a/src/import/Import_KWalletXml.h +++ b/src/import/Import_KWalletXml.h @@ -24,7 +24,7 @@ class Import_KWalletXml{ public: - bool importFile(QString FileName,PwDatabase* db,QString& err); + bool importFile(QString FileName,Database* db,QString& err); private: }; diff --git a/src/import/Import_PwManager.cpp b/src/import/Import_PwManager.cpp index 9f2b51b..26b7258 100755 --- a/src/import/Import_PwManager.cpp +++ b/src/import/Import_PwManager.cpp @@ -27,7 +27,7 @@ #include "Import_PwManager.h" using namespace std; -bool Import_PwManager::importFile(QString filename, QString password, PwDatabase* db, QString& err){ +bool Import_PwManager::importFile(QString filename, QString password, Database* db, QString& err){ database=db; QFile file(filename); char* buffer=NULL; diff --git a/src/import/Import_PwManager.h b/src/import/Import_PwManager.h index dd4710b..b20e3be 100755 --- a/src/import/Import_PwManager.h +++ b/src/import/Import_PwManager.h @@ -26,16 +26,16 @@ class Import_PwManager{ public: -bool importFile(QString FileName, QString Password,PwDatabase* db,QString& err); +bool importFile(QString FileName, QString Password,Database* db,QString& err); private: bool KeyFlag; // true=Password, false=Chipcard int Compression; // 0=none, 1=gzip, 2=bzip2 unsigned char KeyHash[20]; unsigned char DataHash[20]; - PwDatabase* database; + Database* database; bool parseXmlContent(char* content); bool xml_parseEntryAttributes(QDomElement* EntryTag,CGroup* parent); }; -#endif \ No newline at end of file +#endif diff --git a/src/lib/EntryView.cpp b/src/lib/EntryView.cpp index bbb23d9..de41e59 100644 --- a/src/lib/EntryView.cpp +++ b/src/lib/EntryView.cpp @@ -104,9 +104,9 @@ Items.clear(); if(!db)return; if(!GroupID)return; CurrentGroup=GroupID; -for(int i=0;iEntries.size();i++){ - if(db->Entries[i].GroupID==GroupID) - setEntry(&db->Entries[i]); +for(int i=0;inumEntries();i++){ + if(db->entry(i).GroupID==GroupID) + setEntry(&db->entry(i)); } } @@ -115,9 +115,9 @@ IsSearchGroup=true; clear(); Items.clear(); for(int j=0; jEntries.size();i++){ - if(db->Entries[i].sID == results[j]) - setEntry(&db->Entries[i]); + for(int i=0; inumEntries();i++){ + if(db->entry(i).sID == results[j]) + setEntry(&db->entry(i)); } } } diff --git a/src/lib/EntryView.h b/src/lib/EntryView.h index df6a714..8616711 100644 --- a/src/lib/EntryView.h +++ b/src/lib/EntryView.h @@ -41,7 +41,7 @@ public: void updateColumns(); void refreshItems(); void showSearchResults(QList& results); - PwDatabase* db; + Database* db; vectorItems; QMenu *ContextMenu; private: @@ -76,4 +76,4 @@ CEntry* pEntry; }; -#endif \ No newline at end of file +#endif diff --git a/src/lib/GroupView.cpp b/src/lib/GroupView.cpp index c34c3b4..45295f0 100644 --- a/src/lib/GroupView.cpp +++ b/src/lib/GroupView.cpp @@ -209,29 +209,29 @@ void KeepassGroupView::updateItems(){ clear(); Items.clear(); -for(int i=0; iGroups.size();i++){ -if(db->Groups[i].Level==0){ +for(int i=0; inumGroups();i++){ +if(db->group(i).Level==0){ if(Items.size()) Items.push_back(new GroupViewItem(this,getLastSameLevelItem(0))); else Items.push_back(new GroupViewItem(this)); - Items.back()->setText(0,db->Groups[i].Name); - Items.back()->pGroup=&db->Groups[i]; + Items.back()->setText(0,db->group(i).Name); + Items.back()->pGroup=&db->group(i); } else{ - if(db->Groups[i].Level>db->Groups[i-1].Level){ - Items.push_back(new GroupViewItem(Items.back(),getLastSameLevelItem(db->Groups[i].Level))); - Items.back()->setText(0,db->Groups[i].Name); - Items.back()->pGroup=&db->Groups[i]; + if(db->group(i).Level>db->group(i-1).Level){ + Items.push_back(new GroupViewItem(Items.back(),getLastSameLevelItem(db->group(i).Level))); + Items.back()->setText(0,db->group(i).Name); + Items.back()->pGroup=&db->group(i); } - if(db->Groups[i].Level<=db->Groups[i-1].Level){ + if(db->group(i).Level<=db->group(i-1).Level){ GroupItemItr j; for(j=Items.end()-1;j!=Items.begin();j--){ - if((*j)->pGroup->LevelGroups[i].Level)break;} - Items.push_back(new GroupViewItem((*j),getLastSameLevelItem(db->Groups[i].Level))); - Items.back()->setText(0,db->Groups[i].Name); - Items.back()->pGroup=&db->Groups[i]; + if((*j)->pGroup->Levelgroup(i).Level)break;} + Items.push_back(new GroupViewItem((*j),getLastSameLevelItem(db->group(i).Level))); + Items.back()->setText(0,db->group(i).Name); + Items.back()->pGroup=&db->group(i); } } -Items.back()->setIcon(0,EntryIcons[db->Groups[i].ImageID]); +Items.back()->setIcon(0,EntryIcons[db->group(i).ImageID]); } for(int i=0;iItems; QMenu *ContextMenu; @@ -77,4 +77,4 @@ CGroup* pGroup; }; -#endif \ No newline at end of file +#endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9edc338..8a9c00c 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -464,7 +464,7 @@ if(EntryView->selectedItems().size()!=1){ CEntry& entry=*((EntryViewItem*)(EntryView->selectedItems()[0]))->pEntry; QString str=tr("Group: %1 Title: %2 Username: %3 URL: %4 Password: %5 Creation: %6 Last Change: %7 LastAccess: %8 Expires: %9"); //todo: a "CGroup* PwDatabase::getGroup(CEntry*)" method would be a good idea -str=str.arg(db->Groups[db->getGroupIndex(entry.GroupID)].Name).arg(entry.Title); +str=str.arg(db->group(db->getGroupIndex(entry.GroupID)).Name).arg(entry.Title); if(!config.ListView_HideUsernames) str=str.arg(entry.UserName); else str=str.arg("****"); @@ -626,7 +626,6 @@ if(filename==QString())return; Export_Txt exp; QString err; exp.exportFile(filename,db,err); - } void KeepassMainWindow::OnImportFromPwm(){ diff --git a/src/mainwindow.h b/src/mainwindow.h index 80515aa..b854ef5 100755 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -49,7 +49,7 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ Q_OBJECT public: KeepassMainWindow (const QString& ArgFile,QWidget *parent=0, Qt::WFlags flags=0); - PwDatabase* db; + Database* db; bool Start; signals: @@ -136,4 +136,4 @@ protected: -#endif \ No newline at end of file +#endif