From fa3772aa7ddea5725cc7e7db42d017567e4cc14c Mon Sep 17 00:00:00 2001 From: zcarsten Date: Tue, 22 Jul 2003 19:23:13 +0000 Subject: Initial revision --- (limited to 'noncore/apps/zsafe/zsafe.cpp') diff --git a/noncore/apps/zsafe/zsafe.cpp b/noncore/apps/zsafe/zsafe.cpp new file mode 100644 index 0000000..bd03031 --- a/dev/null +++ b/noncore/apps/zsafe/zsafe.cpp @@ -0,0 +1,3492 @@ +/**************************************************************************** +** +** Created: Sat Apr 6 17:57:45 2002 +** +** Author: Carsten Schneider +** +** $Id$ +** +** Homepage: http://home.t-online.de/home/CarstenSchneider/zsafe/index.html +** +** Compile Flags: +** Zaurus arm : none +** Linux Desktop : -DDESKTOP +** Windows Desktop: -DDESKTOP -DWIN32 +** +****************************************************************************/ +#include "zsafe.h" +#include "newdialog.h" +#include "searchdialog.h" +#include "categorydialog.h" +#include "passworddialog.h" +#include "infoform.h" +#include "zlistview.h" +#include "shadedlistitem.h" + +#ifndef DESKTOP +#include "scqtfileedit.h" +#endif + +#include + +#include + +#include +#include +#include +#include +#ifndef WIN32 +#include +#endif +#include +#include + +#include +#include + +#ifdef DESKTOP +#include +#ifndef WIN32 +#include +#else +#include "qsettings.h" +#endif +#include +#else +#include +#include +#include +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "krc2.h" + +#include "wait.h" + +extern int DeskW, DeskH; +#ifdef DESKTOP +extern QApplication *appl; +#else +extern QPEApplication *appl; +#endif + + +#ifdef DESKTOP +#ifndef WIN32 +const QString APP_KEY="/.zsafe/"; +#else +const QString APP_KEY=""; +#endif +#else +const QString APP_KEY=""; +#endif + +// include xmp images +#include "pics/zsafe/copy.xpm" +#include "pics/zsafe/cut.xpm" +#include "pics/zsafe/edit.xpm" +#include "pics/zsafe/editdelete.xpm" +#include "pics/zsafe/find.xpm" +#include "pics/zsafe/folder_open.xpm" +#include "pics/zsafe/help_icon.xpm" +#include "pics/zsafe/new.xpm" +#include "pics/zsafe/paste.xpm" +#include "pics/zsafe/quit_icon.xpm" +#include "pics/zsafe/save.xpm" +#include "pics/zsafe/trash.xpm" +#include "pics/zsafe/expand.xpm" +#include "pics/zsafe/export.xpm" +#include "pics/zsafe/import.xpm" +#include "pics/zsafe/zsafe.xpm" + +static const char* const bank_cards_data[] = { +"14 14 16 1", +". c None", +"# c #000000", +"b c #0000de", +"a c #0000e6", +"j c #41de83", +"k c #4acecd", +"h c #4aced5", +"g c #5a40cd", +"d c #5a44d5", +"l c #9440d5", +"m c #b4ce4a", +"n c #cd4883", +"e c #d5ae10", +"f c #de3ce6", +"i c #e640e6", +"c c #ffffff", +"..............", +".###########..", +".#ababababa#..", +".#babbbabbb#..", +".#ccccccccc#..", +".#cdcefcghc#..", +".#ccccccccc#..", +".#cicjkclic#..", +".#ccccccccc#..", +".#cmchlcnec#..", +".#ccccccccc#..", +".###########..", +"..............", +".............."}; + + +static const char* const passwords_data[] = { +"16 16 20 1", +". c None", +"# c #000000", +"r c #000083", +"p c #0000c5", +"q c #0000ff", +"n c #008100", +"l c #00c200", +"m c #00ff00", +"j c #838100", +"a c #c55900", +"h c #c5c200", +"o c #c5c2ff", +"k c #c5ffc5", +"f c #ff0000", +"d c #ff8100", +"b c #ffaa5a", +"e c #ffc2c5", +"c c #ffdeac", +"i c #ffff00", +"g c #ffffc5", +"............###.", +"...........#abb#", +"..........#cbab#", +".........#cbdd#.", +"######..#cbdd#..", +"#eeff#..#add#...", +"#eeff#######....", +"#ccdbdd#........", +"#dddbdd###......", +"#gghihhjj#......", +"#hhhihhjj###....", +"#kklmllnnnn#....", +"#lllmllnnnn#....", +"#oopqpprprr#....", +"#oopqpprprr#....", +"############...."}; + +static const char* const software_data[] = { +"16 16 5 1", +". c None", +"# c #000000", +"b c #838183", +"c c #c5ffff", +"a c #ffffff", +"................", +".##############.", +"#aaaaaaaaaaaaaa#", +"#abbbbbbbbbbbbb#", +"#ab##########ab#", +"#ab#c########ab#", +"#ab#c#c######ab#", +"#ab##########ab#", +"#ab##########ab#", +"#ab##########ab#", +"#ab##########ab#", +"#ab##########ab#", +"#aaaaaaaaaaaaab#", +"#bbbbbbbbbbbbbb#", +".##############.", +"................"}; + +static const char* const general_data[] = { +"14 14 98 2", +"Qt c None", +".k c #000000", +"#x c #080808", +"#F c #101008", +"#q c #101010", +"#i c #101410", +"## c #101810", +".m c #181818", +".3 c #181c18", +".I c #182018", +".T c #202420", +"#D c #202820", +"#y c #292c29", +".c c #293029", +".d c #313031", +"#E c #313429", +"#r c #313831", +".j c #393c31", +"#j c #394039", +"#C c #414841", +".w c #4a554a", +".a c #4a594a", +".# c #525052", +".l c #52594a", +"#f c #525952", +"#v c #525d52", +".O c #5a4c4a", +".9 c #5a595a", +".A c #5a5d52", +".B c #624c52", +".0 c #625552", +"#o c #626562", +".R c #626962", +"#. c #626d5a", +"#p c #626d62", +".2 c #627162", +"#h c #6a6d62", +"#z c #6a7562", +"#w c #6a756a", +".C c #73656a", +".P c #73696a", +"#a c #737d6a", +".U c #738573", +".E c #7b817b", +"#B c #7b857b", +"#s c #7b897b", +"#n c #7b917b", +".b c #838d83", +".7 c #839583", +".n c #8b7d7b", +"#g c #8b8583", +".g c #8b858b", +".r c #8b898b", +".s c #8b8d8b", +".i c #8b9183", +".8 c #8b918b", +"#A c #8b9d8b", +".S c #8ba183", +".Z c #94918b", +".N c #949994", +".F c #949d94", +".x c #94a18b", +".v c #94a194", +".Y c #94aa94", +".h c #9c999c", +".Q c #9ca19c", +"#u c #9ca59c", +".H c #9caa9c", +"#e c #9cb29c", +"#m c #a4b29c", +"#t c #a4b2a4", +".M c #a4b69c", +"#l c #a4b6a4", +".z c #a4baa4", +".f c #aca5ac", +".q c #acaaac", +"#d c #acbeac", +".6 c #acc2ac", +".o c #b4b2b4", +".t c #b4beb4", +"#k c #b4c2ac", +".5 c #b4cab4", +".D c #bdb6bd", +".G c #bdc6b4", +"#c c #bdceb4", +".X c #bdd2bd", +".4 c #bdd6bd", +".1 c #c5bec5", +".e c #c5c2c5", +".u c #c5cac5", +"#b c #c5d6c5", +".J c #c5dec5", +".p c #cdcacd", +".W c #cddecd", +".L c #cde2cd", +".K c #d5eacd", +".V c #d5ead5", +".y c #d5eed5", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQt.#.a.b.cQtQtQtQtQtQtQt", +"QtQt.d.e.f.g.h.i.c.j.dQt.kQt", +".a.l.m.n.o.p.q.r.s.t.u.v.wQt", +".x.y.z.A.B.C.D.p.q.E.F.G.H.I", +".I.J.K.L.M.N.O.P.o.p.Q.R.S.T", +"Qt.U.V.L.W.X.Y.Z.0.P.1.s.2.3", +"Qt.3.X.W.4.X.5.6.7.8.9.s#.##", +"QtQt#a.X#b#c.5.6#d#e#f#g#h#i", +"QtQtQt#j.7#k.6#d#l#m#n#o#p#q", +"QtQtQtQt.k#r#s#m#t.H#u#v#w#x", +"QtQtQtQtQtQt.k#y#z.v#A#B#C#x", +"QtQtQtQtQtQtQtQt.k#D.w#s#E.k", +"QtQtQtQtQtQtQtQtQtQtQt#x#FQt"}; + +// exit ZSafe and clear the clipboard for security reasons + void ZSafe::exitZs (int ec) + { + QClipboard *cb = QApplication::clipboard(); + cb->clear(); + + exit (ec); + } + + +// save the configuration into the file + void ZSafe::saveConf () + { + if (conf) + { + delete conf; + +#ifdef DESKTOP +#ifndef WIN32 + conf = new QSettings (); + conf->insertSearchPath (QSettings::Unix, QDir::homeDirPath()); +#else + conf = new QSettings (cfgFile); + conf->insertSearchPath (QSettings::Unix, cfgFile); +#endif +#else + conf = new Config (cfgFile, Config::File); + conf->setGroup ("zsafe"); +#endif + } + } + + +/* + * Constructs a ZSafe which is a child of 'parent', with the + * name 'name' and widget flags set to 'f' + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +ZSafe::ZSafe( QWidget* parent, const char* name, bool modal, WFlags fl ) + : QDialog( parent, name, modal, fl ) +{ + IsCut = false; + IsCopy = false; + modified = false; + + // set the config file + cfgFile=QDir::homeDirPath(); + cfgFile += "/.zsafe.cfg"; + // set the icon path + QString qpedir ((const char *)getenv("QPEDIR")); +#ifdef DESKTOP + iconPath = QDir::homeDirPath() + "/pics/"; +#else + if (qpedir.isEmpty()) + iconPath = "/home/QtPalmtop/pics/"; + else + iconPath = qpedir + "/pics/"; +#endif + + // create a zsafe configuration object +#ifdef DESKTOP +#ifndef WIN32 + conf = new QSettings (); + conf->insertSearchPath (QSettings::Unix, QDir::homeDirPath()); +#else + conf = new QSettings (cfgFile); + conf->insertSearchPath (QSettings::Unix, cfgFile); +#endif +#else + conf = new Config (cfgFile, Config::File); + conf->setGroup ("zsafePrefs"); +#endif +#ifdef DESKTOP +// #ifndef WIN32 + expandTree = conf->readBoolEntry(APP_KEY+"expandTree", false); +// #endif +#else + expandTree = conf->readNumEntry(APP_KEY+"expandTree", 0); +#endif +#ifndef DESKTOP + conf->setGroup ("zsafe"); +#endif + + QPixmap copy_img((const char**) copy_xpm); + QPixmap cut_img((const char**) cut_xpm); + QPixmap edit_img((const char**) edit_xpm); + QPixmap editdelete_img((const char**) editdelete_xpm); + QPixmap find_img((const char**) find_xpm); + QPixmap folder_open_img((const char**) folder_open_xpm); + QPixmap help_icon_img((const char**) help_icon_xpm); + QPixmap new_img((const char**) new_xpm); + QPixmap paste_img((const char**) paste_xpm); + QPixmap quit_icon_img((const char**) quit_icon_xpm); + QPixmap save_img((const char**) save_xpm); + QPixmap trash_img((const char**) trash_xpm); + QPixmap expand_img((const char**) expand_xpm); + QPixmap export_img((const char**) export_xpm); + QPixmap import_img((const char**) import_xpm); + + QPixmap bank_cards( ( const char** ) bank_cards_data ); + QPixmap passwords( ( const char** ) passwords_data ); + QPixmap software( ( const char** ) software_data ); + QPixmap general( ( const char** ) general_data ); + if ( !name ) + setName( "ZSafe" ); + +#ifdef DESKTOP +#ifdef WIN32 + setGeometry(100, 150, DeskW, DeskH-30 ); +#else + resize( DeskW, DeskH-30 ); +#endif + // setMinimumSize( QSize( DeskW, DeskH-30 ) ); + // setMaximumSize( QSize( DeskW, DeskH-30 ) ); +#else + resize( DeskW, DeskH-30 ); + // setMinimumSize( QSize( DeskW, DeskH-30 ) ); + // setMaximumSize( QSize( 440, 290 ) ); + // setMaximumSize( QSize( DeskW+400, DeskH+200 ) ); +#endif + // setCaption( tr( "ZSafe" ) ); + + filename = conf->readEntry(APP_KEY+"document"); + if (filename.isEmpty() || filename.isNull()) + { + + // check if the directory application exists, if not + // create it +// #ifndef WIN32 + // QString d1("Documents/application"); +// #else + QString d1(QDir::homeDirPath() + "/Documents/application"); +// #endif + QDir pd1(d1); + if (!pd1.exists()) + { + QDir pd1("Documents"); + if (!pd1.mkdir("application", FALSE)) + { + QMessageBox::critical( 0, tr("ZSafe"), + tr("Can't create directory\n%1\n\nZSafe will now exit.").arg(d1)); + exitZs (1); + } + } +// #ifndef WIN32 + // QString d2("Documents/application/zsafe"); +// #else + QString d2(QDir::homeDirPath() + "/Documents/application/zsafe"); +// #endif + QDir pd2(d2); + if (!pd2.exists()) + { + QDir pd2("Documents/application"); + if (!pd2.mkdir("zsafe", FALSE)) + { + QMessageBox::critical( 0, tr("ZSafe"), + tr("Can't create directory\n%1\n\nZSafe will now exit.").arg(d2)); + exitZs (1); + } + } + + + // set the default filename + filename=d2 + "/passwords.zsf"; + + // save the current filename to the config file + conf->writeEntry(APP_KEY+"document", filename); + saveConf(); + } + + //if (filename == "INVALIDPWD") + //filename = ""; + + QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); +#ifdef WIN32 + this->setCaption("Qt ZSafe: " + ti); +#else + this->setCaption("ZSafe: " + ti); +#endif + + selectedItem = NULL; + lastSearchedCategory = NULL; + lastSearchedItem = NULL; + lastSearchedName = ""; + lastSearchedUsername = ""; + lastSearchedComment = ""; + + infoForm = new InfoForm(); + categoryDialog = NULL; + + // add a menu bar + QMenuBar *menu = new QMenuBar( this ); + + // add file menu + // QPopupMenu *file = new QPopupMenu( this ); + file = new QPopupMenu( this ); + +// #ifdef DESKTOP + file->insertItem( new_img, tr("&New document"), this, SLOT(newDocument()) ); + file->insertItem( folder_open_img, tr("&Open document"), this, SLOT(loadDocument()) ); + file->insertItem( save_img, tr("&Save document as .."), this, SLOT(saveDocumentAs()) ); + file->insertSeparator(); +// #endif + + file->insertItem( save_img, tr("&Save document"), this, SLOT(saveDocumentWithoutPwd()) ); + file->insertItem( save_img, tr("S&ave document with new Password"), this, + SLOT(saveDocumentWithPwd()) ); + file->insertSeparator(); + file->insertItem( export_img, tr("&Export text file"), this, SLOT(writeAllEntries()) ); + file->insertItem( import_img, tr("&Import text file"), this, SLOT(readAllEntries()) ); + file->insertItem( trash_img, tr("&Remove text file"), this, SLOT(removeAsciiFile()) ); + file->insertSeparator(); + file->insertItem( expand_img, tr("&Open entries expanded"), this, + SLOT(setExpandFlag()), 0, 'o'); + file->setItemChecked('o', expandTree); + file->insertSeparator(); + file->insertItem( quit_icon_img, tr("E&xit"), this, SLOT(quitMe()) ); + menu->insertItem( tr("&File"), file ); + + QPopupMenu *cat = new QPopupMenu( this ); + cat->insertItem( new_img, tr("&New"), this, SLOT(addCategory()) ); + cat->insertItem( edit_img, tr("&Edit"), this, SLOT(editCategory()) ); + cat->insertItem( trash_img, tr("&Delete"), this, SLOT(delCategory()) ); + menu->insertItem( tr("&Category"), cat ); + + QPopupMenu *it = new QPopupMenu( this ); + it->insertItem( cut_img, tr("&Cut"), this, SLOT(cutItem()) ); + it->insertItem( copy_img, tr("C&opy"), this, SLOT(copyItem()) ); + it->insertItem( paste_img, tr("&Paste"), this, SLOT(pasteItem()) ); + it->insertSeparator(); + it->insertItem( new_img, tr("&New"), this, SLOT(newPwd()) ); + it->insertItem( edit_img, tr("&Edit"), this, SLOT(editPwd()) ); + it->insertItem( trash_img, tr("&Delete"), this, SLOT(deletePwd()) ); + it->insertItem( find_img, tr("&Search"), this, SLOT(findPwd()) ); + menu->insertItem( tr("&Entry"), it ); + + QPopupMenu *help = new QPopupMenu( this ); + help->insertItem( help_icon_img, tr("&About"), this, SLOT(about()) ); + menu->insertItem( tr("&Help"), help ); + + // toolbar icons + + New = new QToolButton( menu, "New" ); + New->setGeometry( QRect( DeskW-84, 2, 20, 20 ) ); + New->setMouseTracking( TRUE ); + New->setText( tr( "" ) ); + New->setPixmap( new_img ); + QToolTip::add( New, tr( "New entry" ) ); + + Edit = new QToolButton( menu, "Edit" ); + Edit->setGeometry( QRect( DeskW-64, 2, 20, 20 ) ); + Edit->setText( tr( "" ) ); + Edit->setPixmap( edit_img ); + QToolTip::add( Edit, tr( "Edit category or entry" ) ); + + Delete = new QToolButton( menu, "Delete" ); + Delete->setGeometry( QRect( DeskW-44, 2, 20, 20 ) ); + Delete->setText( tr( "" ) ); + Delete->setPixmap( trash_img ); + QToolTip::add( Delete, tr( "Delete category or entry" ) ); + + Find = new QToolButton( menu, "Find" ); + Find->setGeometry( QRect( DeskW-24, 2, 20, 20 ) ); + Find->setText( tr( "" ) ); + Find->setPixmap( find_img ); + QToolTip::add( Find, tr( "Find entry" ) ); + +/* + QBoxLayout * h = new QHBoxLayout( this ); + h->addWidget (menu); + h->addWidget (New); + h->addWidget (Edit); + h->addWidget (Delete); + h->addWidget (Find); +*/ + + ListView = new ZListView( this, "ListView" ); + ListView->addColumn( tr( "Name" ) ); + ListView->addColumn( tr( "Field 2" ) ); + ListView->addColumn( tr( "Field 3" ) ); + ListView->addColumn( tr( "Comment" ) ); + ListView->addColumn( tr( "Field 4" ) ); + ListView->addColumn( tr( "Field 5" ) ); + ListView->setAllColumnsShowFocus(TRUE); + +#ifdef DESKTOP + ListView->setResizePolicy(QScrollView::AutoOneFit); + // ListView->setGeometry( QRect( 0, 22, this->width(), this->height() - 30 ) ); +#else + ListView->setResizePolicy(QScrollView::AutoOneFit); + // ListView->setGeometry( QRect( 0, 22, + // this->width(), this->height() - 30 ) ); + // ListView->setMaximumSize( QSize( 440, 290 ) ); +#endif + ListView->setVScrollBarMode( QListView::Auto ); + + QBoxLayout * l = new QVBoxLayout( this ); + l->addWidget (menu); + l->addWidget (ListView); + +#ifndef DESKTOP + // start a timer (100 ms) to load the default document + docuTimer.start( 100, true ); + connect( &docuTimer, SIGNAL(timeout()), SLOT( slotLoadDocu() ) ); + raiseFlag = true; + connect( &raiseTimer, SIGNAL(timeout()), SLOT( slotRaiseTimer() ) ); +#else + // open the default document + openDocument(filename); +#endif + + // signals and slots connections for QTollButton + connect( New, SIGNAL( clicked() ), this, SLOT( newPwd() ) ); + connect( Edit, SIGNAL( clicked() ), this, SLOT( editPwd() ) ); + connect( Delete, SIGNAL( clicked() ), this, SLOT( deletePwd() ) ); + connect( Find, SIGNAL( clicked() ), this, SLOT( findPwd() ) ); + // signals and slots connections for QListView + connect( ListView, SIGNAL( selectionChanged( QListViewItem* ) ), + this, SLOT( listViewSelected( QListViewItem* ) ) ); + connect( ListView, SIGNAL( doubleClicked( QListViewItem* ) ), + this, SLOT( showInfo( QListViewItem* ) ) ); + connect( ListView, SIGNAL( returnPressed( QListViewItem* ) ), + this, SLOT( showInfo( QListViewItem* ) ) ); + +} + +const QColor *ZSafe::evenRowColor = &Qt::white; +// const QColor *ZSafe::oddRowColor = &Qt::lightGray; +const QColor *ZSafe::oddRowColor = new QColor(216,240,255); + +/* + * Destroys the object and frees any allocated resources + */ +ZSafe::~ZSafe() +{ + // no need to delete child widgets, Qt does it all for us + quitMe(); +} + +// load the default document +void ZSafe::slotLoadDocu() +{ + openDocument (filename); +} + +void ZSafe::deletePwd() +{ + + if (!selectedItem) + return; + if (!isCategory(selectedItem)) + { + switch( QMessageBox::information( this, tr("ZSafe"), + tr("Do you want to delete?"), + tr("&Delete"), tr("D&on't Delete"), + 0 // Enter == button 0 + ) ) { // Escape == button 2 + case 0: // Delete clicked, Alt-S or Enter pressed. + // Delete + modified = true; + selectedItem->parent()->takeItem(selectedItem); + selectedItem = NULL; + break; + case 1: // Don't delete + break; + } + } + else + { + delCategory(); + } +} + +void ZSafe::editPwd() +{ + if (!selectedItem) + return; + if (!isCategory(selectedItem)) + { + // open the 'New Entry' dialog + NewDialog *dialog = new NewDialog(this, tr("Edit Entry"), TRUE); +#ifdef WIN32 + dialog->setCaption ("Qt " + tr("Edit Entry")); + dialog->setGeometry(200, 250, 220, 310 ); +#endif + + // set the labels + dialog->Name->setText(getFieldLabel (selectedItem, "1", tr("Name"))); + dialog->Username->setText(getFieldLabel (selectedItem, "2", tr("Username"))); + dialog->Password->setText(getFieldLabel (selectedItem, "3", tr("Password"))); + dialog->Comment->setText(getFieldLabel (selectedItem, "4", tr("Comment"))); + dialog->Field5Label->setText(getFieldLabel (selectedItem,"5", tr("Field 4"))); + dialog->Field6Label->setText(getFieldLabel (selectedItem,"6", tr("Field 5"))); + + // set the fields + dialog->NameField->setText(selectedItem->text (0)); + dialog->UsernameField->setText(selectedItem->text (1)); + dialog->PasswordField->setText(selectedItem->text (2)); + QString comment = selectedItem->text (3); + comment.replace (QRegExp("
"), "\n"); + dialog->Field5->setText(selectedItem->text (4)); + dialog->Field6->setText(selectedItem->text (5)); + dialog->CommentField->insertLine(comment); + dialog->CommentField->setCursorPosition(0,0); +#ifdef DESKTOP +#ifndef WIN32 + dialog->show(); +#endif +#else + dialog->showMaximized(); +#endif + DialogCode result = (DialogCode) dialog->exec(); + +#ifdef DESKTOP + result = Accepted; +#endif + if (result == Accepted) + { + modified = true; + // edit the selected item + QString name = dialog->NameField->text(); + selectedItem->setText (0, tr (name)); + QString user = dialog->UsernameField->text(); + selectedItem->setText (1, tr (user)); + QString pwd = dialog->PasswordField->text(); + selectedItem->setText (2, tr (pwd)); + QString comment = dialog->CommentField->text(); + comment.replace (QRegExp("\n"), "
"); + selectedItem->setText (3, tr (comment)); + QString f5 = dialog->Field5->text(); + selectedItem->setText (4, tr (f5)); + QString f6 = dialog->Field6->text(); + selectedItem->setText (5, tr (f6)); + } + + delete dialog; + } + else + { + editCategory(); + } +} + +void ZSafe::newPwd() +{ + if (!selectedItem) + return; + + if (!isCategory(selectedItem)) + selectedItem = selectedItem->parent(); + + if (isCategory(selectedItem)) + { + QString cat = selectedItem->text(0); + + // open the 'New Entry' dialog + NewDialog *dialog = new NewDialog(this, tr("New Entry"), TRUE); +#ifdef WIN32 + dialog->setCaption ("Qt " + tr("New Entry")); + dialog->setGeometry(200, 250, 220, 310 ); +#endif + // set the labels + dialog->Name->setText(getFieldLabel (selectedItem, "1", tr("Name"))); + dialog->Username->setText(getFieldLabel (selectedItem, "2", tr("Username"))); + dialog->Password->setText(getFieldLabel (selectedItem, "3", tr("Password"))); + dialog->Comment->setText(getFieldLabel (selectedItem, "4", tr("Comment"))); + dialog->Field5Label->setText(getFieldLabel (selectedItem,"5", tr("Field 4"))); + dialog->Field6Label->setText(getFieldLabel (selectedItem,"6", tr("Field 5"))); +retype: +#ifdef DESKTOP +#ifndef WIN32 + dialog->show(); +#endif +#else + dialog->showMaximized(); +#endif + DialogCode result = (DialogCode) dialog->exec(); +#ifdef DESKTOP + result = Accepted; +#endif + + if (result == Accepted) + { + + QString name = dialog->NameField->text(); + if (cat == name) + { + QMessageBox::critical( 0, tr("ZSafe"), + tr("Entry name must be different\nfrom the category name.") ); + goto retype; // it's not a good programming style :-) + } + + modified = true; + // add the new item + QListViewItem *i = new ShadedListItem (0, selectedItem); + i->setOpen (TRUE); + + i->setText (0, tr (name)); + QString user = dialog->UsernameField->text(); + i->setText (1, tr (user)); + QString pwd = dialog->PasswordField->text(); + i->setText (2, tr (pwd)); + QString comment = dialog->CommentField->text(); + comment.replace (QRegExp("\n"), "
"); + i->setText (3, tr (comment)); + QString f5 = dialog->Field5->text(); + i->setText (4, tr (f5)); + QString f6 = dialog->Field6->text(); + i->setText (5, tr (f6)); + } + + delete dialog; + } +} + +void ZSafe::findPwd() +{ + + // open the 'Search' dialog + SearchDialog *dialog = new SearchDialog(this, tr("Search"), TRUE); +#ifdef WIN32 + dialog->setCaption ("Qt " + tr("Search")); +#endif + +#ifdef DESKTOP +#endif + if (lastSearchedName) + dialog->NameField->setText(lastSearchedName); + else + dialog->NameField->setText(""); + if (lastSearchedUsername) + dialog->UsernameField->setText(lastSearchedUsername); + else + dialog->UsernameField->setText(""); + if (lastSearchedComment) + dialog->CommentField->setText(lastSearchedComment); + else + dialog->CommentField->setText(""); + DialogCode result = (DialogCode) dialog->exec(); +#ifdef DESKTOP + result = Accepted; +#endif + + QString name; + QString username; + QString comment; + if (result == Accepted) + { + name = dialog->NameField->text(); + username = dialog->UsernameField->text(); + comment = dialog->CommentField->text(); + qWarning (name); + } + else + { + delete dialog; + return; + } + + if (!name.isEmpty() && name != lastSearchedName || + lastSearchedName.isEmpty() && !name.isEmpty()) + { + // set search at the beginning if a new name is given + lastSearchedCategory = NULL; + lastSearchedItem = NULL; + } + lastSearchedName = name; + if (!username.isEmpty() && username != lastSearchedUsername || + lastSearchedUsername.isEmpty() && !username.isEmpty()) + { + // set search at the beginning if a new name is given + lastSearchedCategory = NULL; + lastSearchedItem = NULL; + } + lastSearchedUsername = username; + if (!comment.isEmpty() && comment != lastSearchedComment || + lastSearchedComment.isEmpty() && !comment.isEmpty()) + { + // set search at the beginning if a new name is given + lastSearchedCategory = NULL; + lastSearchedItem = NULL; + } + lastSearchedComment = comment; + + ListView->clearSelection(); + + bool found=FALSE; + // step through all categories + QListViewItem *i; + if (lastSearchedCategory) + i = lastSearchedCategory; + else + i = ListView->firstChild(); + for (; + i != NULL; + i = i->nextSibling()) + { + qWarning (i->text(0)); + i->setSelected(FALSE); + + // step through all subitems + QListViewItem *si; + if (lastSearchedItem) + si = lastSearchedItem; + else + si = i->firstChild(); + // for (si = i->firstChild(); + for (; + si != NULL; + si = si->nextSibling()) + { + qWarning (si->text(0)); + if (si->isSelected()) + si->setSelected(FALSE); + // ListView->repaintItem(si); + + bool n=TRUE; + bool u=TRUE; + bool c=TRUE; + if (!name.isEmpty()) + n = (si->text(0)).contains (name, FALSE); + if (!username.isEmpty()) + u = (si->text(1)).contains (username, FALSE); + if (!comment.isEmpty()) + c = (si->text(3)).contains (comment, FALSE); + + if ((n && u && c ) && !found) + { + qWarning ("Found"); + selectedItem = si; + si->setSelected(TRUE); + ListView->setCurrentItem(si); + ListView->ensureItemVisible(si); + ListView->triggerUpdate(); + + lastSearchedCategory = i; + // set to the next item + lastSearchedItem = si->nextSibling(); + if (!lastSearchedItem) + { + // no next item within category -> set next category + lastSearchedCategory = i->nextSibling(); + if (!lastSearchedCategory) + lastSearchedItem = NULL; // END + } + + found = TRUE; + delete dialog; + update(); + return; + } + } + lastSearchedCategory = i->nextSibling(); + lastSearchedItem = NULL; + } + lastSearchedCategory = NULL; + lastSearchedItem = NULL; + delete dialog; + update(); + QMessageBox::information( this, tr("ZSafe"), + tr("Entry not found"), tr("&OK"), 0); + +} + +QString ZSafe::getFieldLabel (QListViewItem *_item, QString field, QString def) +{ + QString category; + if (_item) + { + if (isCategory(_item)) + { + category = _item->text(0); + } + else + { + QListViewItem *cat = _item->parent(); + category = cat->text(0); + } + } + else + { + return def; + } + + QString app_key = APP_KEY; +#ifndef DESKTOP +#ifndef WIN32 + conf->setGroup ("fieldDefs"); +#endif +#else +#ifndef WIN32 + app_key += "/fieldDefs/"; +#endif +#endif +// #ifndef WIN32 + QString label = conf->readEntry(app_key+category+"-field"+field,def); +// #else +// QString label(def); +// #endif + +#ifndef DESKTOP + conf->setGroup ("zsafe"); +#endif + return label; +} + +QString ZSafe::getFieldLabel (QString category, QString field, QString def) +{ + QString app_key = APP_KEY; +#ifndef DESKTOP + conf->setGroup ("fieldDefs"); +#else +#ifndef WIN32 + app_key += "/fieldDefs/"; +#endif +#endif +// #ifndef WIN32 + QString label = conf->readEntry(app_key+category+"-field"+field, + def); +// #else + // QString label(def); +// #endif +#ifndef DESKTOP + conf->setGroup ("zsafe"); +#endif + return label; +} + +void ZSafe::showInfo( QListViewItem *_item) +{ + if (!_item) + return; + if (selectedItem != NULL) + selectedItem->setSelected(FALSE); + + selectedItem = _item; + selectedItem->setSelected(TRUE); + + if (!isCategory(_item)) + { +/* + QString label=selectedItem->text(0); + label+="\n"; + label+=selectedItem->text(1); + label+="\n"; + label+=selectedItem->text(2); + label+="\n"; + label+=selectedItem->text(3); +*/ + + QString text; + QString entry; + + text = "
"; + text += selectedItem->text(0); + text += "

"; + + entry = selectedItem->text(1); + if (!entry.isEmpty() && entry.compare(" ")) + { + text += ""; + text += getFieldLabel (selectedItem, "2", tr("Username")); + text += ":
"; + text += entry; + text += "
"; + // text += "
"; + } + + entry = selectedItem->text(2); + if (!entry.isEmpty() && entry.compare(" ")) + { + text += ""; + text += getFieldLabel (selectedItem, "3", tr("Password")); + text += ":
"; + text += entry; + text += "
"; + // text += "
"; + } + + entry = selectedItem->text(4); + if (!entry.isEmpty() && entry.compare(" ")) + { + text += ""; + text += getFieldLabel (selectedItem, "5", tr("Field 4")); + text += ":
"; + text += entry; + text += "
"; + // text += "
"; + } + + entry = selectedItem->text(5); + if (!entry.isEmpty() && entry.compare(" ")) + { + text += ""; + text += getFieldLabel (selectedItem, "6", tr("Field 5")); + text += ":
"; + text += entry; + text += "
"; + // text += "
"; + } + + entry = selectedItem->text(3); + if (!entry.isEmpty() && entry.compare(" ")) + { + text += ""; + text += getFieldLabel (selectedItem, "4", tr("Comment")); + text += ":
"; + QString comment = selectedItem->text(3); + comment.replace (QRegExp("\n"), "
"); + text += comment; + // text += "
"; + } + + text += ""; + + infoForm->InfoText->setText(text); + infoForm->hide(); +#ifdef DESKTOP + infoForm->show(); +#else + infoForm->showMaximized(); +#endif + + } +} + +void ZSafe::listViewSelected( QListViewItem *_item) +{ + if (!_item) + return; + if (selectedItem != NULL) + selectedItem->setSelected(FALSE); + + selectedItem = _item; + +#ifndef DESKTOP + // set the column text dependent on the selected item + ListView->setColumnText(0, getFieldLabel (selectedItem, "1", tr("Name"))); + ListView->setColumnText(1, getFieldLabel (selectedItem, "2", tr("Field 2"))); + ListView->setColumnText(2, getFieldLabel (selectedItem, "3", tr("Field 3"))); + ListView->setColumnText(3, getFieldLabel (selectedItem, "4", tr("Comment"))); + ListView->setColumnText(4, getFieldLabel (selectedItem, "5", tr("Field 4"))); + ListView->setColumnText(5, getFieldLabel (selectedItem, "6", tr("Field 5"))); +#endif +#ifdef WIN32 + // set the column text dependent on the selected item + ListView->setColumnText(0, getFieldLabel (selectedItem, "1", tr("Name"))); + ListView->setColumnText(1, getFieldLabel (selectedItem, "2", tr("Field 2"))); + ListView->setColumnText(2, getFieldLabel (selectedItem, "3", tr("Field 3"))); + ListView->setColumnText(3, getFieldLabel (selectedItem, "4", tr("Comment"))); + ListView->setColumnText(4, getFieldLabel (selectedItem, "5", tr("Field 4"))); + ListView->setColumnText(5, getFieldLabel (selectedItem, "6", tr("Field 5"))); +#endif + +} + +bool ZSafe::isCategory(QListViewItem *_item) +{ + QString categoryName = _item->text (0); + if (categories.find ((const char *)categoryName)) + return TRUE; + else + return FALSE; +} + +void ZSafe::removeAsciiFile() +{ + // QString fn = filename + ".txt"; + // open the file dialog +#ifndef DESKTOP + QString fn = ScQtFileEdit::getOpenFileName(this, + tr ("Remove text file"), + QDir::homeDirPath() + "/Documents/application/zsafe", + "*.txt"); +#else + QString fn = QFileDialog::getOpenFileName( + QDir::homeDirPath() + "/Documents/application/zsafe", + "ZSafe (*.txt)", + this, + "ZSafe File Dialog" + "Choose a text file" ); +#endif + + if (fn && fn.length() > 0 ) + { + QFile f( fn ); + if ( !f.remove() ) + { + qWarning( QString("Could not remove file %1").arg(fn), + 2000 ); + QMessageBox::critical( 0, tr("ZSafe"), + tr("Could not remove text file.") ); + return; + } + } +} + +void ZSafe::writeAllEntries() +{ + if (filename.isEmpty()) + { + QMessageBox::critical( 0, tr("ZSafe"), + tr("No document defined.\nYou have to create a new document")); + return; + } + + // open the file dialog +#ifndef DESKTOP + QString fn = ScQtFileEdit::getSaveAsFileName(this, + tr ("Export text file"), + QDir::homeDirPath() + "/Documents/application/zsafe", + "*.txt"); +#else + QString fn = QFileDialog::getSaveFileName( + QDir::homeDirPath() + "/Documents/application/zsafe", + "ZSafe (*.txt)", + this, + "ZSafe File Dialog" + "Choose a text file" ); +#endif + + // open the new document + if (fn && fn.length() > 0 ) + { + QFile f( fn ); + if ( !f.open( IO_WriteOnly ) ) { + qWarning( QString("Could not write to file %1").arg(fn), + 2000 ); + QMessageBox::critical( 0, "ZSafe", + QString("Could not export to text file.") ); + return; + } + QTextStream t( &f ); + + QListViewItem *i; + // step through all categories + for (i = ListView->firstChild(); + i != NULL; + i = i->nextSibling()) + { + // step through all subitems + QListViewItem *si; + for (si = i->firstChild(); + si != NULL; + si = si->nextSibling()) + { + QString oneEntry; + oneEntry += "\""; + oneEntry += i->text(0); + oneEntry += "\";"; + oneEntry += "\""; + oneEntry += si->text(0); + oneEntry += "\";"; + oneEntry += "\""; + oneEntry += si->text(1); + oneEntry += "\";"; + oneEntry += "\""; + oneEntry += si->text(2); + oneEntry += "\";"; + oneEntry += "\""; + QString comment = si->text(3); + comment.replace (QRegExp("\n"), "
"); + oneEntry += comment; + oneEntry += "\";"; + oneEntry += "\""; + oneEntry += si->text(4); + oneEntry += "\";"; + oneEntry += "\""; + oneEntry += si->text(5); + oneEntry += "\""; + // qWarning (oneEntry); + t << oneEntry << endl; + + // qWarning (si->text(0)); + } + } + f.close(); + } +} + +void ZSafe::readAllEntries() +{ + if (filename.isEmpty()) + { + QMessageBox::critical( 0, tr("ZSafe"), + tr("No document defined.\nYou have to create a new document")); + return; + } + + // open the file dialog +#ifndef DESKTOP + QString fn = ScQtFileEdit::getOpenFileName(this, + tr ("Import text file"), + QDir::homeDirPath() + "/Documents/application/zsafe", + "*.txt"); +#else + QString fn = QFileDialog::getOpenFileName( + QDir::homeDirPath() + "/Documents/application/zsafe", + "ZSafe (*.txt)", + this, + "ZSafe File Dialog" + "Choose a text file" ); +#endif + + if (fn && fn.length() > 0 ) + { + QFile f( fn ); + if ( !f.open( IO_ReadOnly ) ) + { + qWarning( QString("Could not read file %1").arg(fn), + 2000 ); + QMessageBox::critical( 0, "ZSafe", + QString("Could not import text file.") ); + return; + } + + modified = true; + + // clear the password list + selectedItem = NULL; + QListViewItem *i; + // step through all categories + for (i = ListView->firstChild(); + i != NULL; + i = i->nextSibling()) + { + // step through all subitems + QListViewItem *si; + for (si = i->firstChild(); + si != NULL; ) + // si = si->nextSibling()) + { + QListViewItem *_si = si; + si = si->nextSibling(); + i->takeItem(_si); // remove from view list + if (_si) delete _si; + } + } + + qWarning ("ReadAllEntries(): "); + + QTextStream t(&f); + while ( !t.eof() ) + { + QString s = t.readLine(); + s.replace (QRegExp("\";\""), "\"|\""); + // char buffer[1024]; +#ifndef WIN32 + char buffer[s.length()+1]; +#else + char buffer[4048]; +#endif + strcpy (buffer, s); + + QString name; + QString user; + QString password; + QString comment; + QString field5=""; + QString field6=""; + + // separete the entries + char *i = strtok (buffer, "|"); + QString category(&i[1]); + category.truncate(category.length() -1); + + int idx=0; + while ((i = strtok (NULL, "|")) != NULL) + { + switch (idx) + { + case 0: + name = &i[1]; + name.truncate(name.length() -1); + // name + break; + case 1: + // user + user = &i[1]; + user.truncate(user.length() -1); + break; + case 2: + // password + password = &i[1]; + password.truncate(password.length() -1); + break; + case 3: + // comment + comment = &i[1]; + comment.truncate(comment.length() -1); + break; + case 4: + // field5 + field5 = &i[1]; + field5.truncate(field5.length() -1); + break; + case 5: + // field6 + field6 = &i[1]; + field6.truncate(field6.length() -1); + break; + } + idx++; + } + + Category *cat= categories.find (category); + if (cat) + { + // use the existend item + QListViewItem *catItem = cat->getListItem(); + if (catItem) + { + QListViewItem * item = new ShadedListItem( 0, catItem ); + item->setText( 0, tr( name ) ); + item->setText( 1, tr( user ) ); + item->setText( 2, tr( password ) ); + item->setText( 3, tr( comment ) ); + item->setText( 4, tr( field5 ) ); + item->setText( 5, tr( field6 ) ); + catItem->setOpen( TRUE ); + } + } + else + { + QListViewItem *catI = new ShadedListItem( 1, ListView ); + // create and insert a new item + QListViewItem * item = new ShadedListItem( 0, catI ); + item->setText( 0, tr( name ) ); + item->setText( 1, tr( user ) ); + item->setText( 2, tr( password ) ); + item->setText( 3, tr( comment ) ); + item->setText( 4, tr( field5 ) ); + item->setText( 5, tr( field6 ) ); + catI->setOpen( TRUE ); + + Category *c1 = new Category(); + c1->setCategoryName(category); + + QString icon; + QString fullIconPath; + QPixmap *pix; +// #ifndef WIN32 + icon = conf->readEntry(APP_KEY+category); +// #endif + bool isIconAv = false; + if (!icon.isEmpty() && !icon.isNull()) + { + // build the full path + fullIconPath = iconPath + icon; + pix = new QPixmap (fullIconPath); + if (pix) + { + QImage img = pix->convertToImage(); + pix->convertFromImage(img.smoothScale(14,14)); + c1->setIconName (icon); + c1->setIcon (*pix); + isIconAv = true; + } + } + if (!isIconAv) + { + c1->setIcon (*getPredefinedIcon(category)); + } + c1->setListItem (catI); + c1->initListItem(); + categories.insert (c1->getCategoryName(), c1); + } + + } + f.close(); + + } + else + { + } + +} + +#ifdef UNUSED +void ZSafe::writeAllEntries() +{ + // open the file for writing + QString fn = filename + ".txt"; + QFile f( fn ); + if ( !f.open( IO_WriteOnly ) ) { + qWarning( QString("Could not write to file %1").arg(fn), + 2000 ); + QMessageBox::critical( 0, tr("ZSafe"), + tr("Could not export to text file.") ); + return; + } + QTextStream t( &f ); + + QListViewItem *i; + // step through all categories + for (i = ListView->firstChild(); + i != NULL; + i = i->nextSibling()) + { + // step through all subitems + QListViewItem *si; + for (si = i->firstChild(); + si != NULL; + si = si->nextSibling()) + { + QString oneEntry; + oneEntry += "\""; + oneEntry += i->text(0); + oneEntry += "\";"; + oneEntry += "\""; + oneEntry += si->text(0); + oneEntry += "\";"; + oneEntry += "\""; + oneEntry += si->text(1); + oneEntry += "\";"; + oneEntry += "\""; + oneEntry += si->text(2); + oneEntry += "\";"; + oneEntry += "\""; + // oneEntry += si->text(3); + QString comment = si->text(3); + comment.replace (QRegExp("\n"), "
"); + oneEntry += comment; + oneEntry += "\""; + // qWarning (oneEntry); + t << oneEntry << endl; + + // qWarning (si->text(0)); + } + } + f.close(); +} + +void ZSafe::readAllEntries() +{ + QString fn = filename + ".txt"; + QFile f( fn ); + if ( !f.open( IO_ReadOnly ) ) + { + qWarning( QString("Could not read file %1").arg(fn), + 2000 ); + QMessageBox::critical( 0, tr("ZSafe"), + tr("Could not import text file.") ); + return; + } + + modified = true; + + // clear the password list + selectedItem = NULL; + QListViewItem *i; + // step through all categories + for (i = ListView->firstChild(); + i != NULL; + i = i->nextSibling()) + { + // step through all subitems + QListViewItem *si; + for (si = i->firstChild(); + si != NULL; ) + // si = si->nextSibling()) + { + QListViewItem *_si = si; + si = si->nextSibling(); + i->takeItem(_si); // remove from view list + if (_si) delete _si; + } + } + + qWarning ("ReadAllEntries(): "); + + QTextStream t(&f); + while ( !t.eof() ) + { + QString s = t.readLine(); + s.replace (QRegExp("\";\""), "\"|\""); + // char buffer[1024]; + int len=s.length()+1; +#ifdef WIN32 + char buffer[512]; +#else + char buffer[len]; +#endif + strcpy (buffer, s); + + QString name; + QString user; + QString password; + QString comment; + + // separete the entries + char *i = strtok (buffer, "|"); + QString category(&i[1]); + category.truncate(category.length() -1); + + int idx=0; + while (i = strtok (NULL, "|")) + { + switch (idx) + { + case 0: + name = &i[1]; + name.truncate(name.length() -1); + // name + break; + case 1: + // user + user = &i[1]; + user.truncate(user.length() -1); + break; + case 2: + // password + password = &i[1]; + password.truncate(password.length() -1); + break; + case 3: + // comment + comment = &i[1]; + comment.truncate(comment.length() -1); + break; + } + idx++; + } + + Category *cat= categories.find (category); + if (cat) + { + // use the existend item + QListViewItem *catItem = cat->getListItem(); + if (catItem) + { + QListViewItem * item = new ShadedListItem( 0, catItem ); + item->setText( 0, tr( name ) ); + item->setText( 1, tr( user ) ); + item->setText( 2, tr( password ) ); + item->setText( 3, tr( comment ) ); + catItem->setOpen( TRUE ); + } + } + else + { + QListViewItem *catI = new ShadedListItem( 1, ListView ); + // create and insert a new item + QListViewItem * item = new ShadedListItem( 0, catI ); + item->setText( 0, tr( name ) ); + item->setText( 1, tr( user ) ); + item->setText( 2, tr( password ) ); + item->setText( 3, tr( comment ) ); + catI->setOpen( TRUE ); + + Category *c1 = new Category(); + c1->setCategoryName(category); + + QString icon; + QString fullIconPath; + QPixmap *pix; +// #ifndef WIN32 + icon = conf->readEntry(APP_KEY+category); +// #endif + bool isIconAv = false; + if (!icon.isEmpty() && !icon.isNull()) + { + // build the full path + fullIconPath = iconPath + icon; + pix = new QPixmap (fullIconPath); + if (pix) + { + QImage img = pix->convertToImage(); + pix->convertFromImage(img.smoothScale(14,14)); + c1->setIconName (icon); + c1->setIcon (*pix); + isIconAv = true; + } + } + if (!isIconAv) + { + c1->setIcon (*getPredefinedIcon(category)); + } + c1->setListItem (catI); + c1->initListItem(); + categories.insert (c1->getCategoryName(), c1); + } + + } + f.close(); + +} +#endif // UNUSED + +void ZSafe::resume(int) +{ + qWarning ("Resume"); + // hide the main window + + infoForm->hide(); + // open zsafe again + m_password = ""; + selectedItem = NULL; + + // clear the password list + QListViewItem *i; + // step through all categories + for (i = ListView->firstChild(); + i != NULL; + i = i->nextSibling()) + { + // step through all subitems + QListViewItem *si; + for (si = i->firstChild(); + si != NULL; ) + { + QListViewItem *_si = si; + si = si->nextSibling(); + i->takeItem(_si); // remove from view list + if (_si) delete _si; + } + } + + // ask for password and read again + openDocument(filename); +} + +//--------------------------------------------- + + +bool ZSafe::openDocument(const char* _filename, const char* ) +{ + int retval; + char* entry[FIELD_SIZE]; +// #ifndef WIN32 + int validationFlag = conf->readNumEntry(APP_KEY+"valzsafe", 1); +// #else + // int validationFlag = 1; +// #endif + + int pwdOk = 0; + int numberOfTries = 3; + for (int i=0; i < numberOfTries; i++) + { + QFile f(_filename); + if (f.exists()) + { + // ask with a dialog for the password + if (m_password.isEmpty()) + getDocPassword(tr("Enter Password")); + if (m_password.isEmpty() && validationFlag == 0) + { + qWarning ("Wrong password"); + QMessageBox::critical( 0, tr("ZSafe"), + tr("Wrong password.\n\nZSafe will now exit.") ); + exitZs (1); + } + + retval = loadInit(_filename, m_password); + if (retval != PWERR_GOOD) + { + qWarning ("Error loading Document"); + return false; + } + } + else + { +#ifdef WIN32 + this->setCaption("Qt ZSafe"); +#else + this->setCaption("ZSafe"); +#endif + filename = ""; + return false; + } + + + // load the validation entry + if (validationFlag == 0) + { + pwdOk = 1; + break; + } + + retval = loadEntry(entry); + if (retval == 1 && + !strcmp (entry[0], "ZSAFECATEGORY") && + !strcmp (entry[1], "name") && + !strcmp (entry[2], "username") && + !strcmp (entry[3], "password") && + !strcmp (entry[4], "comment") ) + { + for (int count = 0; count < FIELD_SIZE; count++) free(entry[count]); + pwdOk = 1; + break; + } + else + // for (int count = 0; count < FIELD_SIZE; count++) free(entry[count]); + fclose (fd); + m_password = ""; + + if (i < numberOfTries - 1) + { + switch( QMessageBox::warning( this, tr("ZSafe"), + tr("Wrong password.\nEnter again?"), + tr("&Yes"), tr("&No."), + 0 + ) ) + { + case 1: // No + exitZs (1); + break; + case 0: // Yes + continue; + } + } + } + if (pwdOk == 0) + { + // unset the document entry + conf->writeEntry(APP_KEY+"document", "INVALIDPWD"); + if (conf) + delete conf; + + exitZs (1); + } + + + retval = loadEntry(entry); + + int numberOfEntries=0; + while (retval == 1) { + + QString category(entry[0]); + QString name(entry[1]); + QString user(entry[2]); + QString password(entry[3]); + QString comment(entry[4]); + QString field5(entry[5]); + QString field6(entry[6]); + // add the subitems to the categories + + Category *cat= categories.find (category); + if (cat) + { + // use the existend item + QListViewItem *catItem = cat->getListItem(); + if (catItem) + { + QListViewItem * item = new ShadedListItem( 0, catItem ); + item->setText( 0, tr( name ) ); + item->setText( 1, tr( user ) ); + item->setText( 2, tr( password ) ); + item->setText( 3, tr( comment ) ); + item->setText( 4, tr( field5 ) ); + item->setText( 5, tr( field6 ) ); + if (expandTree) + catItem->setOpen( TRUE ); + numberOfEntries++; + } + } + else + { + QListViewItem *catI = new ShadedListItem( 1, ListView ); + // create and insert a new item + QListViewItem * item = new ShadedListItem( 0, catI ); + item->setText( 0, tr( name ) ); + item->setText( 1, tr( user ) ); + item->setText( 2, tr( password ) ); + item->setText( 3, tr( comment ) ); + item->setText( 4, tr( field5 ) ); + item->setText( 5, tr( field6 ) ); + if (expandTree) + catI->setOpen( TRUE ); + + Category *c1 = new Category(); + c1->setCategoryName(category); + + QString icon; + QString fullIconPath; + QPixmap *pix; +// #ifndef WIN32 + icon = conf->readEntry(APP_KEY+category); +// #endif + bool isIconAv = false; + if (!icon.isEmpty() && !icon.isNull()) + { + // build the full path + fullIconPath = iconPath + icon; + pix = new QPixmap (fullIconPath); + if (pix) + { + QImage img = pix->convertToImage(); + pix->convertFromImage(img.smoothScale(14,14)); + c1->setIconName (icon); + c1->setIcon (*pix); + isIconAv = true; + } + } + if (!isIconAv) + { + c1->setIcon (*getPredefinedIcon(category)); + } + + c1->setListItem (catI); + c1->initListItem(); + categories.insert (c1->getCategoryName(), c1); + numberOfEntries++; + } + + for (int count = 0; count < FIELD_SIZE; count++) { + free(entry[count]); + } + retval = loadEntry(entry); + if (retval == 2) { + // m_parent->slotStatusHelpMsg("Last entry loaded"); + } + } // end while + + if (numberOfEntries == 0) + { + + switch( QMessageBox::warning( this, tr("ZSafe"), + tr("Empty document or\nwrong password.\nContinue?"), + tr("&No"), tr("&Yes."), + 0 + ) ) { + case 0: // No + retval = loadFinalize(); + exitZs (1); + break; + case 1: // Yes + break; + } + } + + retval = loadFinalize(); + + return true; +} + +int ZSafe::loadInit(const char* _filename, const char *password) +{ + unsigned int j = 0; + unsigned int keylength=0; + int count=0, count2=0, count3=0; + unsigned char charbuf[8]; + unsigned short ciphertext[4]; + char key[128]; + Krc2* krc2 = new Krc2(); + + fd = fopen (_filename, "rb"); + + QFileInfo f (_filename); + load_buffer_length = f.size(); + load_buffer_length = ((load_buffer_length / 1024)+1) * 1024 * 2; + + if (fd == NULL) + return PWERR_OPEN; + + buffer = (char *)malloc(load_buffer_length); + for (j = 0; password[j] != '\0'; j++) { + key[j] = password[j]; + } + keylength = j; + krc2->rc2_expandkey (key, keylength, 128); + +#ifndef WIN32 + size = read(fileno (fd), (unsigned char *) (charbuf + count), 8); +#else + printf ("LoadInit() read1"); + size = fread ((unsigned char *) (charbuf + count), sizeof(unsigned char), 8, fd); +#endif + + if (size < 8) + return PWERR_DATA; + + for (count = 0; count < 4; count++) { + count2 = count << 1; + iv[count] = charbuf[count2] << 8; + iv[count] += charbuf[count2 + 1]; + } + + size = 0; + bufferIndex = 0; +#ifndef WIN32 + while ((count = read (fileno (fd), (unsigned char *) charbuf, 8)) > 0) { + while (count < 8) { + count2 = read (fileno (fd), (unsigned char *) (charbuf + count), 8); +#else + printf ("LoadInit() read2"); + while ((count = fread ((unsigned char *) (charbuf), sizeof(unsigned char), 8, fd)) > 0) { + while (count < 8) { + count2 = fread ((unsigned char *) (charbuf + count), sizeof(unsigned char), 8, fd); +#endif + if (count2 == 0) { + return PWERR_DATA; + } + count += count2; + } /* while (count < 8) */ + + size += 8; + for (count2 = 0; count2 < 8; count2 += 2) { + count3 = count2 >> 1; + ciphertext[count3] = charbuf[count2] << 8; + ciphertext[count3] += charbuf[count2 + 1]; + + plaintext[count3] = ciphertext[count3] ^ iv[count3]; + iv[count3] = plaintext[count3]; + } /* for (count2) */ + + krc2->rc2_decrypt (plaintext); + memcpy ((unsigned char *) (buffer + bufferIndex), plaintext, 8); + bufferIndex += 8; + buffer[bufferIndex + 1] = '\0'; + } /* while ((count = read (fileno (fd), (unsigned char *) charbuf, 8)) > 0) */ + size -= buffer[size - 1]; + lastcount = 0; + + /* This will point to the starting index */ + bufferIndex = 0; + return PWERR_GOOD; +} + +int ZSafe::loadEntry(char *entry[FIELD_SIZE]) +{ + /* Strip off PKCS 5 padding + * Should check to make sure it's good here + */ + int count, count1=0; + + for (count = lastcount; count < size; count++) { + if ((unsigned char) (buffer[count]) == 255) { + if (buffer[bufferIndex] == '\0') { + bufferIndex++; + } + entry[count1] = (char *) malloc (count - bufferIndex + 1); + memcpy (entry[count1], (unsigned char *) (buffer + bufferIndex), count - bufferIndex); + entry[count1][count - bufferIndex] = '\0'; + count++; + bufferIndex = count; + count1++; + if (count1 == FIELD_SIZE) { + lastcount = count; + return 1; + } + } /* if ((unsigned char) (buffer[count]) == 255) */ + } /* for (count = 0; count < size; count++) */ + + return 2; +} + +int ZSafe::loadFinalize(void) +{ + fclose (fd); + if (buffer) free(buffer); + return PWERR_GOOD; +} + +bool ZSafe::saveDocument(const char* _filename, + bool withPwd, + const char* ) +{ + if (filename.isEmpty()) + { + QMessageBox::critical( 0, tr("ZSafe"), + tr("No document defined.\nYou have to create a new document")); + return false; + } + + // if (m_password.isEmpty()) + // withPwd = true; // the document must be saved with a valid password + if (withPwd) + { + bool pwdOk = FALSE; + while (!pwdOk) + { + getDocPassword(tr("Enter Password")); + if (m_password.isEmpty()) + { + + QMessageBox::critical( 0, tr("ZSafe"), + tr("Password is empty.\nPlease enter again.")); + continue; + } + + QString firstPasswd = m_password; + + getDocPassword(tr("Reenter Password")); + if (m_password.isEmpty()) + { + QMessageBox::critical( 0, tr("ZSafe"), + tr("Password is empty.\nPlease enter again.")); + continue; + } + if (firstPasswd != m_password) + { + + QMessageBox::critical( 0, tr("ZSafe"), + tr("Passwords must be identical.\nPlease enter again.")); + continue; + } + pwdOk = TRUE; + modified = false; + } + } + else if (modified) + { + QString fns(_filename); + fns = fns.right (fns.length() - fns.findRev ('/') - 1); + switch( QMessageBox::information( this, tr("ZSafe"), + tr("Do you want to save ") + fns + tr("\nbefore continuing?"), + tr("&Save"), + tr("&Don't Save"), + 0 // Enter == button 0 + ) ) + { // Escape == button 2 + case 0: // Save clicked, Alt-S or Enter pressed. + modified = false; + break; + case 1: // Don't Save clicked or Alt-D pressed + modified = false; + return true; + } + } + modified = false; + + if (m_password.isEmpty()) + return false; + + int retval = saveInit(_filename, m_password); + // int retval = saveInit(_filename, "test"); + if (retval != PWERR_GOOD) { + return false; + } + + char* entry[FIELD_SIZE]; + + // save the validation entry + { + int i=0; + entry[i] = (char*)malloc(strlen("ZSAFECATEGORY")+1); + strcpy(entry[i++], "ZSAFECATEGORY"); + entry[i] = (char*)malloc(strlen("name")+1); + strcpy(entry[i++], "name"); + entry[i] = (char*)malloc(strlen("username")+1); + strcpy(entry[i++], "username"); + entry[i] = (char*)malloc(strlen("password")+1); + strcpy(entry[i++], "password"); + entry[i] = (char*)malloc(strlen("comment")+1); + strcpy(entry[i++], "comment"); + + entry[i] = (char*)malloc(strlen("field5")+1); + strcpy(entry[i++], "field5"); + entry[i] = (char*)malloc(strlen("field6")+1); + strcpy(entry[i++], "field6"); + + retval = saveEntry(entry); + for (int z=0; zwriteEntry(APP_KEY+"valzsafe", 1); +// #endif + saveConf(); + } + + QListViewItem *i; + // step through all categories + for (i = ListView->firstChild(); + i != NULL; + i = i->nextSibling()) + { + // step through all subitems + QListViewItem *si; + for (si = i->firstChild(); + si != NULL; + si = si->nextSibling()) + { + int j=0; + entry[j] = (char*)malloc(strlen(i->text(0))+1); + strcpy(entry[j++], i->text(0)); + entry[j] = (char*)malloc(strlen(si->text(0))+1); + strcpy(entry[j++], si->text(0)); + entry[j] = (char*)malloc(strlen(si->text(1))+1); + strcpy(entry[j++], si->text(1)); + entry[j] = (char*)malloc(strlen(si->text(2))+1); + strcpy(entry[j++], si->text(2)); + entry[j] = (char*)malloc(strlen(si->text(3))+1); + strcpy(entry[j++], si->text(3)); + + entry[j] = (char*)malloc(strlen(si->text(4))+1); + strcpy(entry[j++], si->text(4)); + entry[j] = (char*)malloc(strlen(si->text(5))+1); + strcpy(entry[j++], si->text(5)); + + retval = saveEntry(entry); + for (int z=0; zclose(); +} + +void ZSafe::getDocPassword(QString title) +{ +qWarning ("getDocPassword"); + // open the 'Password' dialog + PasswordForm *dialog = new PasswordForm(this, title, TRUE); + newPwdDialog = dialog; + newPwdDialogResult = false; + + connect( dialog->PasswordField, SIGNAL( returnPressed() ), + this, SLOT( setPasswordDialogDone() ) ); + + // CS: !!! + // int pos = filename.findRev ('/'); + QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); +#ifdef WIN32 + dialog->setCaption("Qt " + ti); +#else + dialog->setCaption(ti); +#endif + // dialog->setCaption(title); + + dialog->PasswordField->setFocus(); + DialogCode result = (DialogCode) dialog->exec(); +#ifdef DESKTOP + result = Accepted; +#endif + + QString password; + if (result == Accepted || newPwdDialogResult) + { + m_password = dialog->PasswordField->text(); + } + else + { + exitZs (1); + } +} + +int ZSafe::saveInit(const char *_filename, const char *password) +{ + char key[128]; + unsigned int j = 0; + unsigned int keylength; + // int val; + int count2; + Krc2* krc2 = new Krc2(); + + /* first we should check the permissions of the filename */ +/* + if (QFile::exists(_filename)) { + val = checkFile(_filename); + if (val != PWERR_GOOD) + return val; + } else + { + val = creat (_filename, (S_IRUSR | S_IWUSR)); + if (val == -1) + return PWERR_OPEN; + else + close(val); + } +*/ + QFileInfo f (_filename); + save_buffer_length = f.size(); + save_buffer_length = ((save_buffer_length / 1024)+1) * 1024; + + fd = fopen (_filename, "wb"); + if (fd == NULL) + return PWERR_OPEN; + + buffer = (char*)malloc(save_buffer_length); + + /* make the key ready */ + for (j = 0; password[j] != '\0'; j++) { + key[j] = password[j]; + } + keylength = j; + krc2->rc2_expandkey (key, keylength, 128); + + /* First, we make the IV */ + for (count2 = 0; count2 < 4; count2++) { + iv[count2] = rand (); + putc ((unsigned char) (iv[count2] >> 8), fd); + putc ((unsigned char) (iv[count2] & 0xff), fd); + } + + bufferIndex = 0; + return PWERR_GOOD; +} + + +int ZSafe::saveEntry(char *entry[FIELD_SIZE]) +{ + char *text1; + int count2, count3; + unsigned short ciphertext[4]; + Krc2* krc2 = new Krc2(); + + buffer = (char*)memset(buffer, '\0', save_buffer_length); + + for (count2 = 0; count2 < FIELD_SIZE; count2++) { + text1 = entry[count2]; + if (strlen (text1) == 0) { + strncat(buffer, " ", strlen(" ")); + } else { + strncat(buffer, text1, strlen(text1)); + } + /* Use 255 as the marker. \n is too tough to test for */ + buffer[strlen (buffer)] = 255; + } /*for (count2 = 0; count2 < 5; count2++)*/ + count2 = 0; + /* I'm using CBC mode and encrypting the data straight from top down. + * At the bottom, encrypted, I will append an MD5 hash of the file, eventually. + * PKCS 5 padding (explained at the code section + */ + while (count2 < (int)strlen (buffer)) { +#ifndef WORDS_BIGENDIAN + plaintext[bufferIndex] = buffer[count2 + 1] << 8; + plaintext[bufferIndex] += buffer[count2] & 0xff; +#endif +#ifdef WORDS_BIGENDIAN + plaintext[bufferIndex] = buffer[count2] << 8; + plaintext[bufferIndex] += buffer[count2 + 1] & 0xff; +#endif + bufferIndex++; + if (bufferIndex == 4) { + krc2->rc2_encrypt (plaintext); + + for (count3 = 0; count3 < 4; count3++) { + ciphertext[count3] = iv[count3] ^ plaintext[count3]; + + /* Now store the ciphertext as the iv */ + iv[count3] = plaintext[count3]; + + /* reset the buffer index */ + bufferIndex = 0; + if (putc ((unsigned char) (ciphertext[count3] >> 8), fd) == EOF) return PWERR_DATA; + if (putc ((unsigned char) (ciphertext[count3] & 0xff), fd) == EOF) return PWERR_DATA; + } /*for (count3 = 0; count3 < 5; count3++)*/ + } /*if (bufferIndex == 5)*/ + /* increment a short, not a byte */ + count2 += 2; + } /*while (count2 < strlen (buffer))*/ + int ret = PWERR_GOOD; + return ret; +} + +int ZSafe::saveFinalize(void) +{ + int count1, retval = PWERR_GOOD; + unsigned short ciphertext[4]; + Krc2* krc2 = new Krc2(); + + /* Tack on the PKCS 5 padding + * How it works is we fill up the last n bytes with the value n + * + * So, if we have, say, 13 bytes, 8 of which are used, we have 5 left + * over, leaving us 3 short, so we fill it in with 3's. + * + * If we come out even, we fill it with 8 8s + * + * um, except that in this instance we are using 4 shorts instead of 8 bytes. + * so, half everything + */ + for (count1 = bufferIndex; count1 < 4; count1++) { + plaintext[count1] = (4 - bufferIndex); + } + krc2->rc2_encrypt (plaintext); + for (count1 = 0; count1 < 4; count1++) { + ciphertext[count1] = iv[count1] ^ plaintext[count1]; + if (putc ((unsigned char) (ciphertext[count1] >> 8), fd) == EOF) retval = PWERR_DATA; + if (putc ((unsigned char) (ciphertext[count1] & 0xff), fd) == EOF) retval = PWERR_DATA; + } + + fclose (fd); + free(buffer); + return retval; +} + +void ZSafe::quitMe () +{ + qWarning ("QUIT..."); + + if (modified) + { + switch( QMessageBox::information( this, tr("ZSafe"), + tr("Do you want to save\nbefore exiting?"), + tr("&Save"), + tr("S&ave with\nnew\npassword"), + tr("&Don't Save"), + 0 // Enter == button 0 + ) ) + { // Escape == button 2 + case 0: // Save clicked, Alt-S or Enter pressed. + // save + modified = false; + saveDocument(filename, FALSE); + exitZs (1); + break; + case 1: // + // Save with new password + modified = false; + saveDocument(filename, TRUE); + exitZs (1); + break; + case 2: // Don't Save clicked or Alt-D pressed + // don't save but exitZs + exitZs (1); + break; + } + } + exitZs (1); + +} + +void ZSafe::categoryFieldActivated( const QString& category) +{ + if (categoryDialog) + setCategoryDialogFields(categoryDialog, category); +} + +void ZSafe::addCategory() +{ + if (filename.isEmpty()) + { + QMessageBox::critical( 0, tr("ZSafe"), + tr("No document defined.\nYou have to create a new document")); + return; + } + else + { + // open the 'Category' dialog + bool initIcons = false; + // open the 'Category' dialog + CategoryDialog *dialog; + if (categoryDialog) + { + dialog = categoryDialog; + } + else + { + categoryDialog = new CategoryDialog(this, tr("Category"), TRUE); +#ifdef WIN32 + categoryDialog->setCaption ("Qt " + tr("Category")); +#endif + dialog = categoryDialog; + connect( dialog->CategoryField, + SIGNAL( activated ( const QString &)), + this, SLOT( categoryFieldActivated( const QString & ) ) ); + initIcons = true; + } + +#ifdef DESKTOP +#ifndef WIN32 + QStringList list = conf->entryList( APP_KEY+"/fieldDefs" ); +#else + // read all categories from the config file and store + // into a list + QFile f (cfgFile); + QStringList list; + if ( f.open(IO_ReadOnly) ) { // file opened successfully + QTextStream t( &f ); // use a text stream + QString s; + int n = 1; + while ( !t.eof() ) { // until end of file... + s = t.readLine(); // line of text excluding '\n' + list.append(s); + } + f.close(); + } +#endif +#else + // read all categories from the config file and store + // into a list + QFile f (cfgFile); + QStringList list; + if ( f.open(IO_ReadOnly) ) { // file opened successfully + QTextStream t( &f ); // use a text stream + QString s; + while ( !t.eof() ) { // until end of file... + s = t.readLine(); // line of text excluding '\n' + list.append(s); + } + f.close(); + } +#endif + QStringList::Iterator it = list.begin(); + QString categ; + dialog->CategoryField->clear(); // remove all items + while( it != list.end() ) + { + QString *cat = new QString (*it); + if (cat->contains("-field1", FALSE)) + { +#ifdef DESKTOP +#ifndef WIN32 + categ = cat->section ("-field1", 0, 0); +#else + int pos = cat->find ("-field1"); + categ = cat->left (pos); +#endif +#else + int pos = cat->find ("-field1"); + cat->truncate(pos); + categ = *cat; +#endif + if (!categ.isEmpty()) + { + dialog->CategoryField->insertItem (categ, -1); + } + } + ++it; + } + + + setCategoryDialogFields(dialog); + + // CategoryDialog *dialog = new CategoryDialog(this, "Category", TRUE); + + if (initIcons) + { + Wait waitDialog(this, tr("Wait dialog")); + waitDialog.waitLabel->setText(tr("Gathering icons...")); + waitDialog.show(); + qApp->processEvents(); + +#ifdef DESKTOP + QDir d(iconPath); +#else + QDir d(QPEApplication::qpeDir() + "/pics/"); +#endif + d.setFilter( QDir::Files); + + const QFileInfoList *list = d.entryInfoList(); + QFileInfoListIterator it( *list ); // create list iterator + QFileInfo *fi; // pointer for traversing + + dialog->IconField->insertItem("predefined"); + while ( (fi=it.current()) ) { // for each file... + QString fileName = fi->fileName(); + if(fileName.right(4) == ".png"){ + fileName = fileName.mid(0,fileName.length()-4); +#ifdef DESKTOP + QPixmap imageOfFile; + imageOfFile.load(iconPath + fi->fileName()); +#else + QPixmap imageOfFile(Resource::loadPixmap(fileName)); +#endif + QImage foo = imageOfFile.convertToImage(); + foo = foo.smoothScale(16,16); + imageOfFile.convertFromImage(foo); + dialog->IconField->insertItem(imageOfFile,fileName); + } + ++it; + } + waitDialog.hide(); + } + +#ifndef WIN32 + dialog->show(); +#endif +#ifndef DESKTOP + // dialog->move (20, 100); +#endif + DialogCode result = (DialogCode) dialog->exec(); +#ifdef DESKTOP + result = Accepted; +#endif + + QString category; + QString icon; + QString fullIconPath; + QPixmap *pix; + if (result == Accepted) + { + modified = true; + category = dialog->CategoryField->currentText(); + icon = dialog->IconField->currentText()+".png"; + + qWarning (category); + + QListViewItem *li = new ShadedListItem( 1, ListView ); + Category *c1 = new Category(); + c1->setCategoryName(category); + + // if (!icon.isEmpty() && !icon.isNull()) + if (icon != "predefined.png") + { + // build the full path + fullIconPath = iconPath + icon; + pix = new QPixmap (fullIconPath); + // pix->resize(14, 14); + if (pix) + { + // save the full pixmap name into the config file +// #ifndef WIN32 + conf->writeEntry(APP_KEY+category, icon); +// #endif + saveConf(); + QImage img = pix->convertToImage(); + pix->convertFromImage(img.smoothScale(14,14)); + c1->setIcon (*pix); + c1->setIconName(icon); + } + else + { + QPixmap folder( ( const char** ) general_data ); + c1->setIcon (folder); + } + } + else + { + c1->setIcon (*getPredefinedIcon(category)); + } + + c1->setListItem (li); + c1->initListItem(); + categories.insert (c1->getCategoryName(), c1); + + saveCategoryDialogFields(dialog); + } + else + { + // delete dialog; + dialog->hide(); + return; + } + + } + +} + +void ZSafe::delCategory() +{ + if (!selectedItem) + return; + if (isCategory(selectedItem)) + { + switch( QMessageBox::information( this, tr("ZSafe"), + tr("Do you want to delete?"), + tr("&Delete"), tr("D&on't Delete"), + 0 // Enter == button 0 + ) ) { // Escape == button 2 + case 0: // Delete clicked, Alt-S or Enter pressed. + // Delete from the category list + modified = true; + categories.remove (selectedItem->text(0)); +// #ifndef WIN32 + conf->removeEntry (selectedItem->text(0)); +// #endif + saveConf(); + + // Delete the selected item and all subitems + // step through all subitems + QListViewItem *si; + for (si = selectedItem->firstChild(); + si != NULL; ) + { + QListViewItem *_si = si; + si = si->nextSibling(); + selectedItem->takeItem(_si); // remove from view list + if (_si) delete _si; + } + ListView->takeItem(selectedItem); + delete selectedItem; + + selectedItem = NULL; + break; + case 1: // Don't delete + break; + } + + } +} + +void ZSafe::setCategoryDialogFields(CategoryDialog *dialog) +{ + dialog->Field1->setText(getFieldLabel (selectedItem, "1", tr("Name"))); + dialog->Field2->setText(getFieldLabel (selectedItem, "2", tr("Username"))); + dialog->Field3->setText(getFieldLabel (selectedItem, "3", tr("Password"))); + dialog->Field4->setText(getFieldLabel (selectedItem, "4", tr("Comment"))); + dialog->Field5->setText(getFieldLabel (selectedItem, "5", tr("Field 4"))); + dialog->Field6->setText(getFieldLabel (selectedItem, "6", tr("Field 5"))); +} + +void ZSafe::setCategoryDialogFields(CategoryDialog *dialog, QString category) +{ + dialog->Field1->setText(getFieldLabel (category, "1", tr("Name"))); + dialog->Field2->setText(getFieldLabel (category, "2", tr("Username"))); + dialog->Field3->setText(getFieldLabel (category, "3", tr("Password"))); + dialog->Field4->setText(getFieldLabel (category, "4", tr("Comment"))); + dialog->Field5->setText(getFieldLabel (category, "5", tr("Field 4"))); + dialog->Field6->setText(getFieldLabel (category, "6", tr("Field 5"))); +} + +void ZSafe::saveCategoryDialogFields(CategoryDialog *dialog) +{ + QString app_key = APP_KEY; +#ifndef DESKTOP + conf->setGroup ("fieldDefs"); +#else +#ifndef WIN32 + app_key += "/fieldDefs/"; +#endif +#endif + QString category = dialog->CategoryField->currentText(); +// #ifndef WIN32 + conf->writeEntry(app_key+category+"-field1", dialog->Field1->text()); + conf->writeEntry(app_key+category+"-field2", dialog->Field2->text()); + conf->writeEntry(app_key+category+"-field3", dialog->Field3->text()); + conf->writeEntry(app_key+category+"-field4", dialog->Field4->text()); + conf->writeEntry(app_key+category+"-field5", dialog->Field5->text()); + conf->writeEntry(app_key+category+"-field6", dialog->Field6->text()); +// #endif + saveConf(); +#ifndef DESKTOP + conf->setGroup ("zsafe"); +#endif +} + +void ZSafe::editCategory() +{ + if (!selectedItem) + return; + if (isCategory(selectedItem)) + { + QString category = selectedItem->text(0); + bool initIcons = false; + // open the 'Category' dialog + CategoryDialog *dialog; + if (categoryDialog) + { + dialog = categoryDialog; + } + else + { + categoryDialog = new CategoryDialog(this, tr("Category"), TRUE); +#ifdef WIN32 + categoryDialog->setCaption ("Qt " + tr("Category")); +#endif + dialog = categoryDialog; + connect( dialog->CategoryField, + SIGNAL( activated ( const QString &)), + this, SLOT( categoryFieldActivated( const QString & ) ) ); + initIcons = true; + } + setCategoryDialogFields(dialog); + +#ifdef DESKTOP +#ifndef WIN32 + QStringList list = conf->entryList( APP_KEY+"/fieldDefs" ); +#else + // read all categories from the config file and store + // into a list + QFile f (cfgFile); + QStringList list; + if ( f.open(IO_ReadOnly) ) { // file opened successfully + QTextStream t( &f ); // use a text stream + QString s; + int n = 1; + while ( !t.eof() ) { // until end of file... + s = t.readLine(); // line of text excluding '\n' + list.append(s); + } + f.close(); + } +#endif +#else + // read all categories from the config file and store + // into a list + QFile f (cfgFile); + QStringList list; + if ( f.open(IO_ReadOnly) ) { // file opened successfully + QTextStream t( &f ); // use a text stream + QString s; + while ( !t.eof() ) { // until end of file... + s = t.readLine(); // line of text excluding '\n' + list.append(s); + } + f.close(); + } +#endif + QStringList::Iterator it = list.begin(); + QString categ; + dialog->CategoryField->clear(); // remove all items + int i=0; + bool foundCategory = false; + while( it != list.end() ) + { + QString *cat = new QString (*it); + if (cat->contains("-field1", FALSE)) + { +#ifdef DESKTOP +#ifndef WIN32 + categ = cat->section ("-field1", 0, 0); +#else + int pos = cat->find ("-field1"); + categ = cat->left (pos); +#endif +#else + int pos = cat->find ("-field1"); + cat->truncate(pos); + categ = *cat; +#endif + if (!categ.isEmpty()) + { + dialog->CategoryField->insertItem (categ, i); + if (category.compare(categ) == 0) + { + dialog->CategoryField->setCurrentItem(i); + foundCategory = true; + } + i++; + } + } + ++it; + } + if (!foundCategory) + { + dialog->CategoryField->insertItem (category, i); + dialog->CategoryField->setCurrentItem(i); + } + + QString icon; + Category *cat= categories.find (selectedItem->text(0)); + if (cat) + { + icon = cat->getIconName(); + } + + if (initIcons) + { + + Wait waitDialog(this, tr("Wait dialog")); + waitDialog.waitLabel->setText(tr("Gathering icons...")); + waitDialog.show(); + qApp->processEvents(); + +#ifdef DESKTOP + QDir d(iconPath); +#else + QDir d(QPEApplication::qpeDir() + "/pics/"); +#endif + d.setFilter( QDir::Files); + + const QFileInfoList *list = d.entryInfoList(); + int i=0; + QFileInfoListIterator it( *list ); // create list iterator + QFileInfo *fi; // pointer for traversing + if (icon.isEmpty() || icon.isNull()) + { + dialog->IconField->setCurrentItem(0); + } + + dialog->IconField->insertItem("predefined"); + while ( (fi=it.current()) ) { // for each file... + QString fileName = fi->fileName(); + if(fileName.right(4) == ".png") + { + fileName = fileName.mid(0,fileName.length()-4); +#ifdef DESKTOP + QPixmap imageOfFile; + imageOfFile.load(iconPath + fi->fileName()); +#else + QPixmap imageOfFile(Resource::loadPixmap(fileName)); +#endif + QImage foo = imageOfFile.convertToImage(); + foo = foo.smoothScale(16,16); + imageOfFile.convertFromImage(foo); + dialog->IconField->insertItem(imageOfFile,fileName); + if(fileName+".png"==icon) + dialog->IconField->setCurrentItem(i+1); + ++i; + } + ++it; + } + waitDialog.hide(); + } + else + { +#ifdef DESKTOP + // QDir d(QDir::homeDirPath() + "/pics/"); + QDir d(iconPath); +#else + QDir d(QPEApplication::qpeDir() + "/pics/"); +#endif + d.setFilter( QDir::Files); + + const QFileInfoList *list = d.entryInfoList(); + int i=0; + QFileInfoListIterator it( *list ); // create list iterator + QFileInfo *fi; // pointer for traversing + if (icon.isEmpty() || icon.isNull()) + { + dialog->IconField->setCurrentItem(0); + } + else + { + + while ( (fi=it.current()) ) + { // for each file... + QString fileName = fi->fileName(); + if(fileName.right(4) == ".png") + { + fileName = fileName.mid(0,fileName.length()-4); + + + if(fileName+".png"==icon) + { + dialog->IconField->setCurrentItem(i+1); + break; + } + ++i; + } + ++it; + } + } + } + + // dialog->show(); +#ifndef DESKTOP + // dialog->move (20, 100); +#endif + DialogCode result = (DialogCode) dialog->exec(); +#ifdef DESKTOP + result = Accepted; +#endif + + QString fullIconPath; + QPixmap *pix; + if (result == Accepted) + { + modified = true; + if (category != dialog->CategoryField->currentText()) + { + categories.remove (category); +// #ifndef WIN32 + conf->removeEntry(category); +// #endif + saveConf(); + } + + category = dialog->CategoryField->currentText(); + icon = dialog->IconField->currentText()+".png"; + + if (cat) + { + qWarning("Category found"); + + // if (!icon.isEmpty() && !icon.isNull()) + if (icon != "predefined.png") + { + // build the full path + fullIconPath = iconPath + icon; + pix = new QPixmap (fullIconPath); + if (pix) + { + // save the full pixmap name into the config file +// #ifndef WIN32 + conf->writeEntry(APP_KEY+category, icon); +// #endif + saveConf(); + QImage img = pix->convertToImage(); + pix->convertFromImage(img.smoothScale(14,14)); + cat->setIconName (icon); + cat->setIcon (*pix); + } + } + else + { +// #ifndef WIN32 + conf->removeEntry (category); +// #endif + saveConf(); + cat->setIcon (*getPredefinedIcon(category)); + } + + // change the category name of the selected category + QListViewItem *catItem = cat->getListItem(); + if (catItem) + { + qWarning (category); + catItem->setText( 0, tr( category ) ); + cat->setCategoryName (tr(category)); + cat->initListItem(); + categories.insert (category, cat); + } + } + saveCategoryDialogFields(dialog); + } + else + { + // delete dialog; + dialog->hide(); + return; + } + + } +} + +void ZSafe::cutItem() +{ + if (!selectedItem) + return; + if (!isCategory(selectedItem)) + { + IsCut = true; + copiedItem = selectedItem; + } +} + +void ZSafe::copyItem() +{ + if (!selectedItem) + return; + if (!isCategory(selectedItem)) + { + IsCopy = true; + copiedItem = selectedItem; + } +} + +// paste item into category +void ZSafe::pasteItem() +{ + if (!selectedItem) + return; + if (isCategory(selectedItem)) + { + modified = true; + if (IsCut) + { + if (copiedItem) + { + // add the new item + QListViewItem *i = new ShadedListItem (0, selectedItem); + // i->setOpen (TRUE); + i->setText (0, copiedItem->text(0)); + i->setText (1, copiedItem->text(1)); + i->setText (2, copiedItem->text(2)); + i->setText (3, copiedItem->text(3)); + i->setText (4, copiedItem->text(4)); + i->setText (5, copiedItem->text(5)); + selectedItem->setOpen( TRUE ); + + // remove the cutted item + copiedItem->parent()->takeItem(copiedItem); + selectedItem = NULL; + } + } + else if (IsCopy) + { + if (copiedItem) + { + // add the new item + QListViewItem *i = new ShadedListItem (0, selectedItem); + // i->setOpen (TRUE); + i->setText (0, copiedItem->text(0)); + i->setText (1, copiedItem->text(1)); + i->setText (2, copiedItem->text(2)); + i->setText (3, copiedItem->text(3)); + i->setText (4, copiedItem->text(4)); + i->setText (5, copiedItem->text(5)); + selectedItem->setOpen( TRUE ); + } + } + } + IsCut = false; + IsCopy = false; +} + +void ZSafe::newDocument() +{ + + // open the file dialog +#ifndef DESKTOP + QString newFile = ScQtFileEdit::getSaveAsFileName(this, + tr ("Create new ZSafe document"), + QDir::homeDirPath() + "/Documents/application/zsafe", + "*.zsf"); +#else + QString newFile = QFileDialog::getSaveFileName( + QDir::homeDirPath() + "/Documents/application/zsafe", + "ZSafe (*.zsf)", + this, + "ZSafe File Dialog" + "Choose a ZSafe file" ); +#endif + + // open the new document + if (newFile && newFile.length() > 0 ) + { + // save the previous opened document + if (!filename.isEmpty()) + saveDocument(filename, FALSE); + + modified = true; + + // clear the password list + QListViewItem *i; + QListViewItem *c = NULL; + // step through all categories + for (i = ListView->firstChild(); + i != NULL; + i = i->nextSibling()) + { + if (c) delete c; // delete the previous category + + c = i; + // step through all subitems + QListViewItem *si; + for (si = i->firstChild(); + si != NULL; ) + { + QListViewItem *_si = si; + si = si->nextSibling(); + i->takeItem(_si); // remove from view list + if (_si) delete _si; + } + } + if (c) delete c; // delete the previous category + categories.clear(); + + // m_password = ""; + // selectedItem = NULL; + + filename = newFile; + + // save the current filename to the config file + conf->writeEntry(APP_KEY+"document", filename); + saveConf(); + QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); +#ifdef WIN32 + this->setCaption("Qt ZSafe: " + ti); +#else + this->setCaption("ZSafe: " + ti); +#endif + + // openDocument(filename); + + QMessageBox::information( this, tr("ZSafe"), + tr("Now you have to enter\na password twice for your\nnewly created document."), tr("&OK"), 0); + + saveDocumentWithPwd(); + } +} + +void ZSafe::loadDocument() +{ + + // open the file dialog +#ifndef DESKTOP + QString newFile = ScQtFileEdit::getOpenFileName(this, + tr ("Open ZSafe document"), + QDir::homeDirPath() + "/Documents/application/zsafe", + "*.zsf"); +#else + QString newFile = QFileDialog::getOpenFileName( + QDir::homeDirPath() + "/Documents/application/zsafe", + "ZSafe (*.zsf)", + this, + "ZSafe File Dialog" + "Choose a ZSafe file" ); +#endif + + // open the new document + if (newFile && newFile.length() > 0 ) + { + // save the previous opened document + if (!filename.isEmpty()) + saveDocument(filename, FALSE); + + // clear the password list + QListViewItem *i; + QListViewItem *c = NULL; + // step through all categories + for (i = ListView->firstChild(); + i != NULL; + i = i->nextSibling()) + { + if (c) delete c; // delete the previous category + + c = i; + // step through all subitems + QListViewItem *si; + for (si = i->firstChild(); + si != NULL; ) + { + QListViewItem *_si = si; + si = si->nextSibling(); + i->takeItem(_si); // remove from view list + if (_si) delete _si; + } + } + if (c) delete c; // delete the previous category + categories.clear(); + m_password = ""; + selectedItem = NULL; + filename = newFile; + + // save the current filename to the config file + conf->writeEntry(APP_KEY+"document", filename); + saveConf(); + QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); +#ifdef WIN32 + this->setCaption("Qt ZSafe: " + ti); +#else + this->setCaption("ZSafe: " + ti); +#endif + + openDocument(filename); + } +} + +void ZSafe::saveDocumentAs() +{ + +#ifndef DESKTOP + QString newFile = ScQtFileEdit::getSaveAsFileName(this, + tr ("Save ZSafe document as.."), + QDir::homeDirPath() + "/Documents/application/zsafe", + "*.zsf"); +#else + // open the file dialog + QString newFile = QFileDialog::getSaveFileName( + QDir::homeDirPath() + "/Documents/application/zsafe", + "ZSafe (*.zsf)", + this, + "ZSafe File Dialog" + "Choose a ZSafe file" ); +#endif + + // open the new document + if (newFile && newFile.length() > 0 ) + { + // save the previous opened document + if (!filename.isEmpty()) + saveDocument(filename, FALSE); + + filename = newFile; + + // save the current filename to the config file + conf->writeEntry(APP_KEY+"document", filename); + saveConf(); + QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); +#ifdef WIN32 + this->setCaption("Qt ZSafe: " + ti); +#else + this->setCaption("ZSafe: " + ti); +#endif + + QMessageBox::information( this, tr("ZSafe"), + tr("Now you have to enter\na password twice for your\nnewly created document."), tr("&OK"), 0); + + saveDocumentWithPwd(); + } +} + +void ZSafe::saveDocumentWithoutPwd() +{ + saveDocument(filename, FALSE); +} + +void ZSafe::saveDocumentWithPwd() +{ + saveDocument(filename, TRUE); +} + +void ZSafe::about() +{ + QString info; + info = "
"; + info += ""; + info += tr("Zaurus Password Manager
"); + info += tr("ZSafe version 2.1.2
"); + info += "
"; + info += tr("by Carsten Schneider
"); + info += "zcarsten@gmx.net
"; + info += "http://z-soft.z-portal.info/zsafe"; + info += "
"; + info += tr("Translations by Robert Ernst
"); + info += "robert.ernst@linux-solutions.at
"; + info += "
"; + info += ""; + + // QMessageBox::information( this, tr("ZSafe"), info, tr("&OK"), 0); + + QMessageBox mb( this, tr("ZSafe")); + mb.setText (info); + mb.setButtonText (QMessageBox::Ok, tr ("&OK")); + QPixmap zsafe_img((const char**) zsafe_xpm); + mb.setIconPixmap (zsafe_img); + mb.exec(); +} + +void ZSafe::setExpandFlag() +{ + expandTree = !expandTree; + file->setItemChecked('o', expandTree); +#ifndef DESKTOP + conf->setGroup ("zsafePrefs"); +#endif +// #ifndef WIN32 + conf->writeEntry (APP_KEY+"expandTree", expandTree); +// #endif + saveConf(); + +} + +void ZSafe::paintEvent( QPaintEvent * ) +{ + if (raiseFlag) + { + raiseFlag = false; + raiseTimer.start (1, true); + if (infoForm->isVisible()) + infoForm->raise(); + } +} + +void ZSafe::resizeEvent ( QResizeEvent * ) +{ + // qWarning ("resizeEvent"); +#ifndef DESKTOP + DeskW = appl->desktop()->width(); + DeskH = appl->desktop()->height(); +#else + DeskW = this->width(); + DeskH = this->height(); +#endif + qWarning( QString("Width : %1").arg(DeskW), 2000 ); + qWarning( QString("Height: %1").arg(DeskH), 2000 ); + + New->setGeometry ( QRect( DeskW-84, 2, 20, 20 ) ); + Edit->setGeometry ( QRect( DeskW-64, 2, 20, 20 ) ); + Delete->setGeometry( QRect( DeskW-44, 2, 20, 20 ) ); + Find->setGeometry ( QRect( DeskW-24, 2, 20, 20 ) ); +} + +void ZSafe::slotRaiseTimer() +{ + if (infoForm->isVisible()) + infoForm->raise(); + raiseFlag = true; +} + +QPixmap * ZSafe::getPredefinedIcon(QString category) +{ + QPixmap *pm; + if (category == "Bank cards") + pm = new QPixmap((const char**)bank_cards_data); + else if (category == "Passwords") + pm = new QPixmap((const char**)passwords_data); + else if (category == "Software") + pm = new QPixmap((const char**)software_data); + else if (category == "General") + pm = new QPixmap((const char**)general_data); + else + pm = new QPixmap((const char**)general_data); + return pm; +} + +void ZSafe::setDocument(const QString& fileref) +{ +#ifndef DESKTOP + // stop the timer to prevent loading of the default document + docuTimer.stop(); + + DocLnk link(fileref); + if ( link.isValid() ) + { + // if (filename != link.file()) + // saveDocument(filename, FALSE); + filename = link.file(); + } + else + { + // if (filename != fileref) + // saveDocument(filename, FALSE); + filename = fileref; + } + // save the current filename to the config file + conf->writeEntry(APP_KEY+"document", filename); + saveConf(); + QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); +#ifdef WIN32 + this->setCaption("Qt ZSafe: " + ti); +#else + this->setCaption("ZSafe: " + ti); +#endif + + // clear the password list + QListViewItem *i; + QListViewItem *c = NULL; + // step through all categories + for (i = ListView->firstChild(); + i != NULL; + i = i->nextSibling()) + { + if (c) delete c; // delete the previous category + + c = i; + // step through all subitems + QListViewItem *si; + for (si = i->firstChild(); + si != NULL; ) + { + QListViewItem *_si = si; + si = si->nextSibling(); + i->takeItem(_si); // remove from view list + if (_si) delete _si; + } + } + if (c) delete c; // delete the previous category + categories.clear(); + + m_password = ""; + selectedItem = NULL; + + openDocument(filename); +#endif +} + + + -- cgit v0.9.0.2