diff --git a/changelog b/changelog index e8c47d2d..a9526870 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,4 @@ + * autodetect and load any type of PEM files * fix version number in exported *.xca template * fix import of older XCA templates * add support for predefined templates as there was in 0.5.1 diff --git a/img/.gitignore b/img/.gitignore new file mode 100644 index 00000000..6b3401d2 --- /dev/null +++ b/img/.gitignore @@ -0,0 +1,2 @@ +img.rc +imgres.cpp diff --git a/lib/base.h b/lib/base.h index 1518cc71..5a91d8ad 100644 --- a/lib/base.h +++ b/lib/base.h @@ -22,7 +22,8 @@ #define D2I_CLASHT(f, t, a, PP, s) f(t,a,(unsigned char **)PP,s) #endif -#define CCHAR(x) ((const char *)(x).toAscii().constData()) +//#define CCHAR(x) ((const char *)(x).toAscii().constData()) +#define CCHAR(x) qPrintable(x) #endif #define TRACE printf("File: "__FILE__" Func: %s Line: %d\n",__func__, __LINE__); diff --git a/lib/load_obj.cpp b/lib/load_obj.cpp index 71716cb6..e45a05d2 100644 --- a/lib/load_obj.cpp +++ b/lib/load_obj.cpp @@ -224,3 +224,87 @@ load_db::load_db() filter = QObject::tr("XCA Databases ( *.xdb );;") + filter; caption = QObject::tr("Open XCA Database"); } + +/* General PEM loader */ +static load_base *getload(QString text) +{ + int pos; +#define D5 "-----" + pos = text.indexOf(D5 "BEGIN "); + if (pos <0) + return NULL; + text = text.remove(0, pos + 11); + printf("Text B: %s\n", CCHAR(text)); + if (text.startsWith(PEM_STRING_X509_OLD D5) || + text.startsWith(PEM_STRING_X509 D5) || + text.startsWith(PEM_STRING_X509_TRUSTED D5)) + return new load_cert(); + + if (text.startsWith(PEM_STRING_PKCS7 D5)) + return new load_pkcs7(); + + if (text.startsWith(PEM_STRING_X509_REQ_OLD D5) || + text.startsWith(PEM_STRING_X509_REQ D5)) + return new load_req(); + + if (text.startsWith(PEM_STRING_X509_CRL D5)) + return new load_crl(); + + if (text.startsWith(PEM_STRING_EVP_PKEY D5) || + text.startsWith(PEM_STRING_PUBLIC D5) || + text.startsWith(PEM_STRING_RSA D5) || + text.startsWith(PEM_STRING_RSA_PUBLIC D5) || + text.startsWith(PEM_STRING_DSA D5) || + text.startsWith(PEM_STRING_DSA_PUBLIC D5) || + text.startsWith(PEM_STRING_PKCS8 D5) || + text.startsWith(PEM_STRING_PKCS8INF D5)) + return new load_key(); + + return NULL; +} + +load_pem::load_pem() + :load_base() +{ + filter = QObject::tr("Pem files ( *.pem );;") + filter; + caption = QObject::tr("Load PEM encoded file"); +} + +pki_base * load_pem::loadItem(QString fname) +{ + char buf[100]; + int len; + FILE * fp; + QString text; + pki_base *item = NULL; + load_base *lb = NULL; + + try { + fp = fopen(CCHAR(fname), "r"); + if (!fp) + throw errorEx(QObject::tr("File open error: ") + fname); + len = fread(buf, 1, 99, fp); + fclose(fp); + if (len < 11) + throw errorEx(QObject::tr("File corrupted: ") + fname); + buf[len] = '\0'; + text = buf; + lb = getload(text); + if (!lb) + throw errorEx(QObject::tr("Unknown PEM file: ") + fname); + printf("CAPTION = '%s' for %s \n", CCHAR(lb->caption), + CCHAR(fname)); + item = lb->loadItem(fname); + delete lb; + printf("LOAD success: %s\n", CCHAR(fname)); + } + catch (errorEx &err) { + MainWindow::Error(err); + if (item) + delete item; + item = NULL; + if (lb) + delete lb; + } + return item; +}; diff --git a/lib/load_obj.h b/lib/load_obj.h index 656eac2b..18afdfdc 100644 --- a/lib/load_obj.h +++ b/lib/load_obj.h @@ -119,4 +119,11 @@ class load_db: public load_base load_db(); }; +class load_pem: public load_base +{ + public: + load_pem(); + pki_base * loadItem(QString s); +}; + #endif diff --git a/widgets/MW_help.cpp b/widgets/MW_help.cpp index 3b13642f..4495868d 100644 --- a/widgets/MW_help.cpp +++ b/widgets/MW_help.cpp @@ -70,6 +70,7 @@ fprintf(stderr, " -v show version information and exit\n" " -7 expect all following non-option arguments to be PKCS#7 files\n" " -l expect all following non-option arguments to be Revocation lists\n" " -t expect all following non-option arguments to be XCA templates\n" +" -P expect all following non-option arguments to be PEM encoded 'thingies'\n" " -d expect the following argument to be the database name to use\n" " -x Exit after processing all commandline options\n\n"); diff --git a/widgets/MW_menu.cpp b/widgets/MW_menu.cpp index 1abd7962..b1e2b100 100644 --- a/widgets/MW_menu.cpp +++ b/widgets/MW_menu.cpp @@ -90,6 +90,8 @@ void MainWindow::init_menu() SLOT(on_BNimportTemp_clicked()) ); import->addAction(tr("Revocation list"), this, SLOT(on_BNimportCrl_clicked()) ); + import->addAction(tr("PEM file"), this, + SLOT(loadPem()) ); help = menuBar()->addMenu(tr("&Help") ); help->addAction(tr("&Content"), this, SLOT(help()), Qt::Key_F1 ); diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index 562a2167..df6b6cd0 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -195,8 +195,7 @@ void MainWindow::read_cmdline() pki_base *item = NULL; load_base *lb = NULL; exitApp = 0; - ImportMulti *dlgi = NULL; - dlgi = new ImportMulti(this); + ImportMulti *dlgi = new ImportMulti(this); while (cnt < qApp->argc()) { arg = qApp->argv()[cnt]; if (arg[0] == '-') { // option @@ -211,6 +210,7 @@ void MainWindow::read_cmdline() 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' : fprintf(stderr, XCA_TITLE " Version " VER "\n"); opt=0; exitApp=1; break; @@ -249,6 +249,12 @@ void MainWindow::read_cmdline() delete dlgi; } +void MainWindow::loadPem() +{ + load_pem l; + if (keys) + keys->load_default(l); +} MainWindow::~MainWindow() { diff --git a/widgets/MainWindow.h b/widgets/MainWindow.h index db0b0627..778fa46f 100644 --- a/widgets/MainWindow.h +++ b/widgets/MainWindow.h @@ -66,7 +66,6 @@ #define DBFILE "xca.xdb" - class db_x509; class MainWindow: public QMainWindow, public Ui::MainWindow @@ -127,6 +126,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow void help(); void import_dbdump(); void undelete(); + void loadPem(); private slots: void on_keyView_doubleClicked(const QModelIndex &m);