autoimport from cmdline

This commit is contained in:
Christian Hohnstaedt 2010-03-22 18:40:29 +01:00
parent abbf284e53
commit 01c8b89edd
9 changed files with 102 additions and 59 deletions

View File

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

View File

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

View File

@ -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 <qlist.h>
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<load_base *> 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
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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