diff --git a/lib/db.h b/lib/db.h index ba66c4ac..29d87313 100644 --- a/lib/db.h +++ b/lib/db.h @@ -55,11 +55,11 @@ class db void init_header(db_header_t *db, int ver, int len, enum pki_type type, QString name); - bool verify_magic(void); void convert_header(db_header_t *h); void fileIOerr(QString s); public: + bool verify_magic(void); off_t head_offset; db(QString, int mode = S_IRUSR | S_IWUSR); ~db(); diff --git a/lib/pki_crl.cpp b/lib/pki_crl.cpp index 4dac574c..ff78c8f5 100644 --- a/lib/pki_crl.cpp +++ b/lib/pki_crl.cpp @@ -40,7 +40,7 @@ QString pki_crl::getFriendlyClassName() return tr("certificate revokation list"); } -void pki_crl::fload(const QString fname ) +void pki_crl::fload(const QString fname) { FILE *fp = fopen(QString2filename(fname), "r"); X509_CRL *_crl; diff --git a/lib/pki_multi.cpp b/lib/pki_multi.cpp index 08d7efb4..5ce46542 100644 --- a/lib/pki_multi.cpp +++ b/lib/pki_multi.cpp @@ -13,9 +13,11 @@ #include "pki_pkcs7.h" #include "pki_pkcs12.h" #include "pki_crl.h" +#include "load_obj.h" #include "exception.h" #include "func.h" #include "widgets/MainWindow.h" +#include pki_multi::pki_multi(const QString name) :pki_base(name) @@ -146,3 +148,33 @@ void pki_multi::fromPEM_BIO(BIO *bio, QString name) } } } + +void pki_multi::probeAnything(const QString fname) +{ + pki_base *item = NULL; + load_base *lb; + QList lbs; + + lbs << new load_cert() << new load_pkcs7() << new load_pkcs12() + << new load_crl() << new load_req() << new load_key(); + + fload(fname); + if (multi.count() > 0) + return; + + foreach(lb, lbs) { + try { + item = lb->loadItem(fname); + if (item) { + multi.append(item); + return; + } + } catch (errorEx &err) { + ; // ignore + } + } + while (!lbs.isEmpty()) + delete lbs.takeFirst(); + +#warning delete lbs +} diff --git a/lib/pki_multi.h b/lib/pki_multi.h index 148be6ee..dc833d5d 100644 --- a/lib/pki_multi.h +++ b/lib/pki_multi.h @@ -24,7 +24,9 @@ class pki_multi: public pki_base ~pki_multi(); void fromPEM_BIO(BIO *bio, QString name); void fload(const QString fname); + void probeAnything(const QString fname); pki_base *pull(); + }; #endif diff --git a/lib/pki_pkcs12.cpp b/lib/pki_pkcs12.cpp index a2f37342..5461149c 100644 --- a/lib/pki_pkcs12.cpp +++ b/lib/pki_pkcs12.cpp @@ -77,8 +77,8 @@ pki_pkcs12::pki_pkcs12(const QString fname, pem_password_cb *cb) key->bogusEncryptKey(); } PKCS12_free(pkcs12); - } - else fopen_error(fname); + } else + fopen_error(fname); } pki_pkcs12::~pki_pkcs12() diff --git a/lib/pki_x509.cpp b/lib/pki_x509.cpp index 9ef6e0b5..bf0f0fac 100644 --- a/lib/pki_x509.cpp +++ b/lib/pki_x509.cpp @@ -99,7 +99,7 @@ void pki_x509::fload(const QString fname) cert = _cert; autoIntName(); if (getIntName().isEmpty()) - setIntName(rmslashdot(fname)); + setIntName(rmslashdot(fname)); trust = 1; efftrust = 1; } diff --git a/widgets/MW_menu.cpp b/widgets/MW_menu.cpp index f208ae6f..de570288 100644 --- a/widgets/MW_menu.cpp +++ b/widgets/MW_menu.cpp @@ -82,24 +82,27 @@ void MainWindow::init_menu() scardList += token; } +void MainWindow::changeDB(QString fname) +{ + if (fname.isEmpty()) + return; + close_database(); + homedir = fname.mid(0, fname.lastIndexOf(QDir::separator())); + dbfile = fname; + init_database(); +} + void MainWindow::new_database() { load_db l; QString selectedFilter; QString fname = QFileDialog::getSaveFileName(this, l.caption, homedir, l.filter, &selectedFilter, QFileDialog::DontConfirmOverwrite); - - if (fname.isEmpty()) - return; - - close_database(); - homedir = fname.mid(0, fname.lastIndexOf(QDir::separator()) ); // make sure that, if the 3 letter extension was left selected // in Qt's OS X file open dialog, // the filename actually ends with that extension. // Otherwise usability breaks in jarring ways. - dbfile = getFullFilename(fname, selectedFilter); - init_database(); + changeDB(getFullFilename(fname, selectedFilter)); } void MainWindow::load_database() @@ -107,14 +110,7 @@ void MainWindow::load_database() load_db l; QString fname = QFileDialog::getOpenFileName(this, l.caption, homedir, l.filter); - - if (fname.isEmpty()) - return; - - close_database(); - homedir = fname.mid(0, fname.lastIndexOf(QDir::separator()) ); - dbfile = fname; - init_database(); + changeDB(fname); } void MainWindow::import_dbdump() diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index 81328996..022457a7 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -271,30 +271,39 @@ void MainWindow::read_cmdline() { int cnt = 1, opt = 0, force_load = 0; char *arg = NULL; - pki_base *item = NULL; - load_base *lb = NULL; exitApp = 0; ImportMulti *dlgi = new ImportMulti(this); while (cnt < qApp->argc()) { arg = qApp->argv()[cnt]; if (arg[0] == '-') { // option - if (lb) - delete lb; - opt = 1; lb = NULL; + opt = 1; switch (arg[1]) { - case 'c' : lb = new load_cert(); break; - case 'r' : lb = new load_req(); break; - case 'k' : lb = new load_key(); break; - case 'p' : lb = new load_pkcs12(); break; - case '7' : lb = new load_pkcs7(); break; - case 'l' : lb = new load_crl(); break; - case 't' : lb = new load_temp(); break; - case 'P' : lb = new load_pem(); break; - case 'd' : force_load=1; break; - case 'v' : cmd_version(); opt=0; break; - case 'x' : exitApp = 1; opt=0; break; - case 'h' : cmd_help(NULL); opt=0; break; - default : cmd_help(CCHAR(tr("no such option: %1").arg(arg))); + case 'c': + case 'r': + case 'k': + case 'p': + case '7': + case 'l': + case 't': + case 'P': + break; + case 'd': + force_load=1; + break; + case 'v': + cmd_version(); + opt=0; + break; + case 'x': + exitApp = 1; + opt=0; + break; + case 'h': + cmd_help(NULL); + opt=0; + break; + default: + cmd_help(CCHAR(tr("no such option: %1").arg(arg))); } if (arg[2] != '\0' && opt==1) { arg+=2; @@ -304,28 +313,12 @@ void MainWindow::read_cmdline() } } QString file = filename2QString(arg); - if (lb) { - item = NULL; - try { - item = lb->loadItem(file); - dlgi->addItem(item); - } - catch (errorEx &err) { - if (item) { - delete item; - item = NULL; - } - } + if (force_load) { + changeDB(file); } else { - if (QFile::exists(file) || force_load) { - dbfile = file; - homedir = dbfile.left(dbfile.lastIndexOf(QDir::separator())); - init_database(); - } else { - cmd_help(CCHAR(tr("Database file does not exist: '%1'").arg(arg))); - } + pki_multi *pki = probeAnything(file); + dlgi->addItem(pki); } - cnt++; } dlgi->execute(1); /* force showing of import dialog */ @@ -850,3 +843,20 @@ void MainWindow::connNewX509(NewX509 *nx) connect( nx, SIGNAL(showReq(QString)), reqs, SLOT(showItem(QString))); } +pki_multi *MainWindow::probeAnything(QString file) +{ + pki_multi *pki = new pki_multi(); + + if (file.endsWith(".xdb")) { + try { + db mydb(file); + mydb.verify_magic(); + changeDB(file); + return pki; + } catch (errorEx &err) { + } + } + pki->probeAnything(file); + return pki; +} + diff --git a/widgets/MainWindow.h b/widgets/MainWindow.h index 62827614..92b548f9 100644 --- a/widgets/MainWindow.h +++ b/widgets/MainWindow.h @@ -25,6 +25,7 @@ #define DBFILE "xca.xdb" class db_x509; +class pki_multi; class MainWindow: public QMainWindow, public Ui::MainWindow { @@ -46,6 +47,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow NIDlist *read_nidlist(QString name); QLabel *statusLabel; QString homedir; + void changeDB(QString fname); public: static db_x509 *certs; @@ -81,6 +83,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow void setItemEnabled(bool enable); QString updateDbPassword(QString newdb, char *pass); void enableTokenMenu(bool enable); + pki_multi *probeAnything(QString file); public slots: void init_database();