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