diff --git a/MainWindow.cpp b/MainWindow.cpp index 3b9ef071..1153dd4f 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -88,7 +88,8 @@ MainWindow::MainWindow(QWidget *parent, const char *name ) } dbfile = baseDir + QDir::separator() + dbfile; #endif - dbenv = new DbEnv(DB_CXX_NO_EXCEPTIONS | DB_INIT_TXN ); + dbenv = new DbEnv(DB_CXX_NO_EXCEPTIONS); + dbenv->open(NULL, DB_RECOVER | DB_INIT_TXN | DB_INIT_MPOOL | DB_INIT_LOG | DB_INIT_LOCK | DB_CREATE , 0600 ); ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); settings = new db_base(dbenv, dbfile.latin1(), "settings"); @@ -132,6 +133,7 @@ MainWindow::~MainWindow() delete(certs); delete(temps); delete(settings); + dbenv->close(0); } @@ -284,4 +286,11 @@ void MainWindow::Error(errorEx &err) QMessageBox::warning(this,tr(XCA_TITLE), tr("The following error occured:") + "\n" + QString::fromLatin1(err.getCString())); } - + +void MainWindow::crashApp() +{ + pki_base * nullpointer = NULL; + CERR("------> CRASHING the Application <----------"); + nullpointer->getDescription(); +} + diff --git a/MainWindow.h b/MainWindow.h index c98bfc17..e5822068 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -194,6 +194,7 @@ class MainWindow: public MainWindow_UI void setCrlDays(); void setTemplate(); void genCrl(); + void crashApp(); signals: void keyDone(QString name); }; diff --git a/MainWindowX509Req.cpp b/MainWindowX509Req.cpp index c06d8d2c..b639db34 100644 --- a/MainWindowX509Req.cpp +++ b/MainWindowX509Req.cpp @@ -64,18 +64,23 @@ void MainWindow::newReq(pki_temp *temp) delete dlg; return; } - pki_key *key = (pki_key *)keys->getSelectedPKI(dlg->keyList->currentText().latin1()); - string cn = dlg->commonName->text().latin1(); - string c = dlg->countryName->text().latin1(); - string l = dlg->localityName->text().latin1(); - string st = dlg->stateOrProvinceName->text().latin1(); - string o = dlg->organisationName->text().latin1(); - string ou = dlg->organisationalUnitName->text().latin1(); - string email = dlg->emailAddress->text().latin1(); - string desc = dlg->description->text().latin1(); - pki_x509req *req = new pki_x509req(key, cn,c,l,st,o,ou,email,desc, ""); - insertReq(req); - keys->updateView(); + try { + pki_key *key = (pki_key *)keys->getSelectedPKI(dlg->keyList->currentText().latin1()); + string cn = dlg->commonName->text().latin1(); + string c = dlg->countryName->text().latin1(); + string l = dlg->localityName->text().latin1(); + string st = dlg->stateOrProvinceName->text().latin1(); + string o = dlg->organisationName->text().latin1(); + string ou = dlg->organisationalUnitName->text().latin1(); + string email = dlg->emailAddress->text().latin1(); + string desc = dlg->description->text().latin1(); + pki_x509req *req = new pki_x509req(key, cn,c,l,st,o,ou,email,desc, ""); + insertReq(req); + keys->updateView(); + } + catch (errorEx &err) { + Error(err); + } } @@ -94,7 +99,7 @@ void MainWindow::showDetailsReq(QListViewItem *item) void MainWindow::showDetailsReq(pki_x509req *req) { if (!req) return; - if (opensslError(req)) return; + try { ReqDetail_UI *dlg = new ReqDetail_UI(this,0,true); dlg->descr->setText(req->getDescription().c_str()); dlg->setCaption(tr(XCA_TITLE)); @@ -117,28 +122,44 @@ void MainWindow::showDetailsReq(pki_x509req *req) dlg->dnOU->setText(req->getDN(NID_organizationalUnitName).c_str()); dlg->dnEmail->setText(req->getDN(NID_pkcs9_emailAddress).c_str()); dlg->image->setPixmap(*csrImg); - if ( !dlg->exec()) { - delete dlg; - return; - } - string ndesc = dlg->descr->text().latin1(); - if (ndesc != req->getDescription()) { - reqs->renamePKI(req, ndesc); + if (dlg->exec()) { + string ndesc = dlg->descr->text().latin1(); + if (ndesc != req->getDescription()) { + reqs->renamePKI(req, ndesc); + } } + delete dlg; + } + catch (errorEx &err) { + Error(err); + } } void MainWindow::deleteReq() { - pki_x509req *req = (pki_x509req *)reqs->getSelectedPKI(); + pki_x509req *req; + try { + req = (pki_x509req *)reqs->getSelectedPKI(); + } + catch (errorEx &err) { + Error(err); + return; + } + if (!req) return; - if (opensslError(req)) return; if (QMessageBox::information(this,tr(XCA_TITLE), tr("Really want to delete the Certificate signing request") +":\n'" + QString::fromLatin1(req->getDescription().c_str()) + "'\n", "Delete", "Cancel") ) return; - reqs->deletePKI(req); - keys->updateView(); + try { + pki_key *pkey = req->getKey(); + reqs->deletePKI(req); + if (pkey) keys->updateViewPKI(pkey); + } + catch (errorEx &err) { + Error(err); + } } void MainWindow::loadReq() @@ -155,15 +176,28 @@ void MainWindow::loadReq() delete dlg; if (s.isEmpty()) return; s=QDir::convertSeparators(s); - pki_x509req *req = new pki_x509req(s.latin1()); - if (opensslError(req)) return; - insertReq(req); - keys->updateView(); + try { + pki_x509req *req = new pki_x509req(s.latin1()); + insertReq(req); + pki_key *pkey = req->getKey(); + if (pkey) keys->updateViewPKI(pkey); + } + catch (errorEx &err) { + Error(err); + } } void MainWindow::writeReq() { - pki_x509req *req = (pki_x509req *)reqs->getSelectedPKI(); + pki_x509req *req; + try { + req = (pki_x509req *)reqs->getSelectedPKI(); + } + catch (errorEx &err) { + Error(err); + return; + } + if (!req) return; QStringList filt; filt.append("PKCS#10 CSR ( *.pem *.der )"); @@ -179,16 +213,23 @@ void MainWindow::writeReq() delete dlg; if (s.isEmpty()) return; s=QDir::convertSeparators(s); - if (opensslError(req)) return; - - req->writeReq(s.latin1(),true); - if (opensslError(req)) return; + try { + req->writeReq(s.latin1(),true); + } + catch (errorEx &err) { + Error(err); + } } void MainWindow::insertReq(pki_x509req *req) { - if (opensslError(req)) return; - pki_x509 *oldreq = (pki_x509 *)reqs->findPKI(req); + pki_x509 *oldreq; + try { + oldreq = (pki_x509 *)reqs->findPKI(req); + } + catch (errorEx &err) { + Error(err); + } if (oldreq) { QMessageBox::information(this,tr(XCA_TITLE), tr("The certificate signing request already exists in the database as") +":\n'" + @@ -197,8 +238,13 @@ void MainWindow::insertReq(pki_x509req *req) delete(req); return; } - reqs->findKey(req); - reqs->insertPKI(req); + try { + reqs->findKey(req); + reqs->insertPKI(req); + } + catch (errorEx &err) { + Error(err); + } } @@ -223,20 +269,30 @@ void MainWindow::showPopupReq(QListViewItem *item, const QPoint &pt, int x) { void MainWindow::renameReq(QListViewItem *item, int col, const QString &text) { - pki_base *pki = reqs->getSelectedPKI(item); - string txt = text.latin1(); - reqs->renamePKI(pki, txt); + try { + pki_base *pki = reqs->getSelectedPKI(item); + string txt = text.latin1(); + reqs->renamePKI(pki, txt); + } + catch (errorEx &err) { + Error(err); + } } void MainWindow::startRenameReq() { + try { #ifdef qt3 - pki_base *pki = reqs->getSelectedPKI(); - if (!pki) return; - QListViewItem *item = (QListViewItem *)pki->getPointer(); - item->startRename(0); + pki_base *pki = reqs->getSelectedPKI(); + if (!pki) return; + QListViewItem *item = (QListViewItem *)pki->getPointer(); + item->startRename(0); #else - renamePKI(reqs); + renamePKI(reqs); #endif + } + catch (errorEx &err) { + Error(err); + } } diff --git a/MainWindow_UI.ui b/MainWindow_UI.ui index 6de93ddd..ddb800ee 100644 --- a/MainWindow_UI.ui +++ b/MainWindow_UI.ui @@ -12,7 +12,7 @@ 0 0 - 776 + 772 604 @@ -843,13 +843,9 @@ name PushButton13_2_2_5 - - enabled - false - text - Import + C R A S H @@ -1133,24 +1129,12 @@ MainWindow_UI deleteTemp() - - PushButton25_2_2 - clicked() - MainWindow_UI - alterTemp() - tempList rightButtonPressed(QListViewItem*,const QPoint&,int) MainWindow_UI showPopupTemp(QListViewItem *, const QPoint &, int) - - tempList - doubleClicked(QListViewItem*) - MainWindow_UI - alterTemp() - PushButton13_2_2 clicked() @@ -1175,7 +1159,13 @@ MainWindow_UI newSerTemp() - alterTemp() + + PushButton13_2_2_5 + clicked() + MainWindow_UI + crashApp() + + crashApp() deleteCert() deleteKey() deleteReq() diff --git a/lib/db_base.cpp b/lib/db_base.cpp index ec6b8040..bdb653aa 100644 --- a/lib/db_base.cpp +++ b/lib/db_base.cpp @@ -74,10 +74,10 @@ db_base::~db_base() } -Dbc *db_base::getCursor() +Dbc *db_base::getCursor(DbTxn *tid) { Dbc *cursor; - if (int x = data->cursor(NULL, &cursor, 0)) { + if (int x = data->cursor(tid, &cursor, 0)) { data->err(x,"DB new Cursor"); return NULL; } @@ -197,8 +197,10 @@ void db_base::putInt(string key, int dat) void db_base::loadContainer() { + DbTxn *tid = NULL; + dbenv->txn_begin(NULL, &tid, 0); unsigned char *p; - Dbc *cursor = getCursor(); + Dbc *cursor = getCursor(tid); Dbt *k = new Dbt(); Dbt *d = new Dbt(); string desc; @@ -226,6 +228,8 @@ void db_base::loadContainer() delete (d); freeCursor(cursor); preprocess(); + tid->commit(0); + } @@ -249,10 +253,16 @@ bool db_base::updateView() bool db_base::insertPKI(pki_base *pki) { - bool s = _writePKI(pki, false); + DbTxn *tid = NULL; + dbenv->txn_begin(NULL, &tid, 0); + bool s = _writePKI(pki, false, tid); if (s) { inToCont(pki); updateView(); + tid->commit(0); + } + else { + tid->abort(); } return s; } @@ -294,7 +304,7 @@ bool db_base::_writePKI(pki_base *pki, bool overwrite, DbTxn *tid) } -bool db_base::_removePKI(pki_base *pki, DbTxn *tid = NULL) +bool db_base::_removePKI(pki_base *pki, DbTxn *tid) { string desc = pki->getDescription(); return removeItem(desc, tid); @@ -314,12 +324,18 @@ bool db_base::removeItem(string key, DbTxn *tid) bool db_base::deletePKI(pki_base *pki) { - bool s = _removePKI(pki); + DbTxn *tid = NULL; + dbenv->txn_begin(NULL, &tid, 0); + bool s = _removePKI(pki, tid); if (s) { remFromCont(pki); updateView(); + tid->commit(0); delete(pki); } + else { + tid->abort(); + } return s; } @@ -327,24 +343,24 @@ bool db_base::renamePKI(pki_base *pki, string desc) { string oldname = pki->getDescription(); DbTxn *tid = NULL; - //dbenv->txn_begin(NULL, &tid, 0); + dbenv->txn_begin(NULL, &tid, 0); if (! _removePKI(pki, tid)) { - //tid->abort(); + tid->abort(); return false; } pki->setDescription(desc); if (! _writePKI(pki, false, tid)) { - //tid->abort(); + tid->abort(); return false; } // rename the pki in the listView ..... QListViewItem * item = (QListViewItem *)pki->getPointer(); if (!item) { - //tid->abort(); + tid->abort(); return false; } item->setText(0, pki->getDescription().c_str()); - //tid->commit(0); + tid->commit(0); updateViewPKI(pki); return true; } @@ -363,8 +379,16 @@ void db_base::inToCont(pki_base *pki) bool db_base::updatePKI(pki_base *pki) { - bool s = _writePKI(pki, true); - if (s) updateViewPKI(pki); + DbTxn *tid = NULL; + dbenv->txn_begin(NULL, &tid, 0); + bool s = _writePKI(pki, true, tid); + if (s) { + updateViewPKI(pki); + tid->commit(0); + } + else { + tid->abort(); + } return s; } diff --git a/lib/db_base.h b/lib/db_base.h index 880afbff..470ab211 100644 --- a/lib/db_base.h +++ b/lib/db_base.h @@ -90,9 +90,9 @@ class db_base: public QObject DbEnv *dbenv; QListView *listView; QList container; - bool _writePKI(pki_base *pki, bool overwrite, DbTxn *tid = NULL); + bool _writePKI(pki_base *pki, bool overwrite, DbTxn *tid ); bool _removePKI(pki_base *pki, DbTxn *tid ); - bool removeItem(string k, DbTxn *tid = NULL); + bool removeItem(string k, DbTxn *tid); public: db_base(DbEnv *dbe, string DBfile, string db); virtual ~db_base(); @@ -115,7 +115,7 @@ class db_base: public QObject virtual void preprocess() {return;} virtual void remFromCont(pki_base *pki); virtual void inToCont(pki_base *pki); - Dbc *getCursor(); + Dbc *getCursor(DbTxn *tid); bool freeCursor(Dbc *cursor); void *getData(void* key, int length, int *dsize); void *getData(string key, int *dsize);