database transactions implemented

exceptionhandling completed
This commit is contained in:
chris 2002-10-14 22:11:48 +00:00
parent 43211bf1b1
commit b26f3dcdb1
6 changed files with 162 additions and 82 deletions

View File

@ -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();
}

View File

@ -194,6 +194,7 @@ class MainWindow: public MainWindow_UI
void setCrlDays();
void setTemplate();
void genCrl();
void crashApp();
signals:
void keyDone(QString name);
};

View File

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

View File

@ -12,7 +12,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>776</width>
<width>772</width>
<height>604</height>
</rect>
</property>
@ -843,13 +843,9 @@
<name>name</name>
<cstring>PushButton13_2_2_5</cstring>
</property>
<property stdset="1">
<name>enabled</name>
<bool>false</bool>
</property>
<property stdset="1">
<name>text</name>
<string>Import</string>
<string>C R A S H</string>
</property>
</widget>
<widget>
@ -1133,24 +1129,12 @@
<receiver>MainWindow_UI</receiver>
<slot>deleteTemp()</slot>
</connection>
<connection>
<sender>PushButton25_2_2</sender>
<signal>clicked()</signal>
<receiver>MainWindow_UI</receiver>
<slot>alterTemp()</slot>
</connection>
<connection>
<sender>tempList</sender>
<signal>rightButtonPressed(QListViewItem*,const QPoint&amp;,int)</signal>
<receiver>MainWindow_UI</receiver>
<slot>showPopupTemp(QListViewItem *, const QPoint &amp;, int)</slot>
</connection>
<connection>
<sender>tempList</sender>
<signal>doubleClicked(QListViewItem*)</signal>
<receiver>MainWindow_UI</receiver>
<slot>alterTemp()</slot>
</connection>
<connection>
<sender>PushButton13_2_2</sender>
<signal>clicked()</signal>
@ -1175,7 +1159,13 @@
<receiver>MainWindow_UI</receiver>
<slot>newSerTemp()</slot>
</connection>
<slot access="public">alterTemp()</slot>
<connection>
<sender>PushButton13_2_2_5</sender>
<signal>clicked()</signal>
<receiver>MainWindow_UI</receiver>
<slot>crashApp()</slot>
</connection>
<slot access="public">crashApp()</slot>
<slot access="public">deleteCert()</slot>
<slot access="public">deleteKey()</slot>
<slot access="public">deleteReq()</slot>

View File

@ -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;
}

View File

@ -90,9 +90,9 @@ class db_base: public QObject
DbEnv *dbenv;
QListView *listView;
QList<pki_base> 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);