From a97b8f9add7ff2f3101fb57f51eda948a08426f1 Mon Sep 17 00:00:00 2001 From: Christian Hohnstaedt Date: Thu, 13 Nov 2014 19:29:58 +0100 Subject: [PATCH] Select whether to translate established x509 terms --- lib/db_x509super.cpp | 29 ++++++++++++- lib/db_x509super.h | 3 ++ lib/headerlist.h | 3 +- lib/pki_scard.cpp | 4 +- misc/dn.txt | 14 +++---- ui/NewX509.ui | 51 +++++++++++------------ ui/Options.ui | 11 ++++- widgets/CertDetail.cpp | 11 +++++ widgets/MW_database.cpp | 15 ++++++- widgets/MW_menu.cpp | 43 +++++++++++++++---- widgets/MainWindow.h | 1 + widgets/NewX509.cpp | 92 +++++++++++++++++++++++++++-------------- widgets/NewX509.h | 2 +- widgets/Options.cpp | 3 ++ widgets/distname.cpp | 25 +++++++---- 15 files changed, 219 insertions(+), 88 deletions(-) diff --git a/lib/db_x509super.cpp b/lib/db_x509super.cpp index 4e5baebc..7a99f644 100644 --- a/lib/db_x509super.cpp +++ b/lib/db_x509super.cpp @@ -11,6 +11,9 @@ #include "ui_About.h" #include +bool db_x509name::translate_dn = false; +QMap db_x509name::dn_translations; + db_x509name::db_x509name(QString db, MainWindow *mw) :db_base(db, mw) { @@ -20,9 +23,33 @@ db_x509name::db_x509name(QString db, MainWindow *mw) new dbheader(HD_subject_hash, false, tr("Subject hash"), tr("Hash to lookup certs in directories")); + if (dn_translations.size() == 0) { + dn_translations[NID_countryName] = tr("Country code"); + dn_translations[NID_stateOrProvinceName] = tr("State or Province"); + dn_translations[NID_localityName] = tr("Locality"); + dn_translations[NID_organizationName] = tr("Organisation"); + dn_translations[NID_organizationalUnitName] = tr("Organisational unit"); + dn_translations[NID_commonName] = tr("Common name"); + dn_translations[NID_pkcs9_emailAddress] = tr("E-Mail address"); + dn_translations[NID_serialNumber] = tr("Serial number"); + dn_translations[NID_givenName] = tr("Given name"); + dn_translations[NID_surname] = tr("Surname"); + dn_translations[NID_title] = tr("Title"); + dn_translations[NID_initials] = tr("Initials"); + dn_translations[NID_description] = tr("Description"); + dn_translations[NID_role] = tr("Role"); + dn_translations[NID_pseudonym] = tr("Pseudonym"); + dn_translations[NID_generationQualifier] = tr("Generation Qualifier"); + dn_translations[NID_x500UniqueIdentifier] = tr("x500 Unique Identifier"); + dn_translations[NID_name] = tr("Name"); + dn_translations[NID_dnQualifier] = tr("DN Qualifier"); + dn_translations[NID_pkcs9_unstructuredName] = tr("Unstructured name"); + dn_translations[NID_pkcs9_challengePassword] = tr("Challenge password"); + } + for (int i=0; i < dn_nid.count(); i++) { int nid = dn_nid[i]; - dbheader *h = new dbheader(nid, nid == NID_commonName); + dbheader *h = new dbheader(nid, nid == NID_commonName, QString(), dn_translations[nid]); h->type = dbheader::hd_x509name; allHeaders << h; } diff --git a/lib/db_x509super.h b/lib/db_x509super.h index f95186df..74da3b2c 100644 --- a/lib/db_x509super.h +++ b/lib/db_x509super.h @@ -12,11 +12,14 @@ #include "db_key.h" #include "pki_x509super.h" #include +#include class db_x509name: public db_base { Q_OBJECT public: + static bool translate_dn; + static QMap dn_translations; db_x509name(QString db, MainWindow *mw); }; diff --git a/lib/headerlist.h b/lib/headerlist.h index 7453fec2..21e783ea 100644 --- a/lib/headerlist.h +++ b/lib/headerlist.h @@ -89,7 +89,8 @@ class dbheader tooltip = atip; if (id > 0 && name.isEmpty()) { name = OBJ_nid2ln(aid); - tooltip = OBJ_nid2sn(aid); + tooltip = QString("[%1] %2").arg(OBJ_nid2sn(aid)) + .arg(tooltip); } show = showDefault = ashow; } diff --git a/lib/pki_scard.cpp b/lib/pki_scard.cpp index d4f2ec68..42ae73f9 100644 --- a/lib/pki_scard.cpp +++ b/lib/pki_scard.cpp @@ -261,7 +261,7 @@ pk11_attlist pki_scard::objectAttributesNoId(EVP_PKEY *pk, bool priv) const pk11_attr_data(CKA_EC_PARAMS, ba); break; default: - throw errorEx(tr("Only RSA and EC keys can be stored on tokens")); + throw errorEx(QString("Unkown Keytype %d").arg(pk->type)); } return attrs; @@ -410,7 +410,7 @@ void pki_scard::store_token(slotid slot, EVP_PKEY *pkey) break; } default: - throw errorEx(tr("Only RSA, DSA and EC keys can be stored on tokens")); + throw errorEx(QString("Unkown Keytype %d").arg(pkey->type)); } diff --git a/misc/dn.txt b/misc/dn.txt index 7c99265f..a6c31d21 100644 --- a/misc/dn.txt +++ b/misc/dn.txt @@ -6,15 +6,15 @@ O OU CN emailAddress -SN -title -description -name +serialNumber givenName +surname +title initials -dnQualifier +description role +pseudonym +name +dnQualifier generationQualifier x500UniqueIdentifier -pseudonym -serialNumber diff --git a/ui/NewX509.ui b/ui/NewX509.ui index 91c17b6f..37201c49 100644 --- a/ui/NewX509.ui +++ b/ui/NewX509.ui @@ -26,9 +26,6 @@ false - - Create - @@ -71,7 +68,7 @@ - 0 + 2 @@ -525,7 +522,7 @@ - + Basic constraints @@ -582,7 +579,7 @@ The basic constraints should always be critical - &Critical + Critical @@ -778,7 +775,7 @@ - + subject alternative name @@ -821,7 +818,7 @@ - + issuer alternative name @@ -878,7 +875,7 @@ - + Authority Info Access @@ -947,7 +944,7 @@ - + CRL distribution point @@ -980,7 +977,7 @@ 0 - + Key usage @@ -997,7 +994,7 @@ - &Critical + Critical @@ -1060,7 +1057,7 @@ - + Extended key usage @@ -1077,7 +1074,7 @@ - C&ritical + Critical @@ -1231,7 +1228,7 @@ - + CA Revocation URL @@ -1244,7 +1241,7 @@ - + Revocation URL @@ -1254,7 +1251,7 @@ - + SSL server name @@ -1270,7 +1267,7 @@ - + Certificate renewal URL @@ -1280,7 +1277,7 @@ - + Comment @@ -1290,7 +1287,7 @@ - + CA policy URL @@ -1300,7 +1297,7 @@ - + Base URL @@ -1315,7 +1312,7 @@ - If you know a more pretty one tell me + If you know a more pretty one tell me @@ -1402,6 +1399,11 @@ + + hashBox + QComboBox +
widgets/hashBox.h
+
Validity QDateTimeEdit @@ -1412,11 +1414,6 @@ localTime(int) - - hashBox - QComboBox -
widgets/hashBox.h
-
kvView QTableView diff --git a/ui/Options.ui b/ui/Options.ui index 2461d372..62f7d00d 100644 --- a/ui/Options.ui +++ b/ui/Options.ui @@ -35,7 +35,7 @@ - 1 + 0 @@ -96,6 +96,13 @@ + + + + Translate established x509 terms (%1 -> %2) + + + @@ -243,7 +250,7 @@
- PKCS#11 provider + PKCS#11 provider diff --git a/widgets/CertDetail.cpp b/widgets/CertDetail.cpp index 3cbdaf63..aa756627 100644 --- a/widgets/CertDetail.cpp +++ b/widgets/CertDetail.cpp @@ -186,12 +186,23 @@ void CertDetail::setReq(pki_x509req *req) for (int i = 0; igetReq(), i); + nid = OBJ_obj2nid(att->object); if (X509_REQ_extension_nid(nid)) { continue; } label = new QLabel(this); + trans = db_x509name::dn_translations[nid]; + if (db_x509name::translate_dn && !trans.isEmpty()) { + label->setText(trans); + label->setToolTip(QString(OBJ_nid2sn(nid))); + } else { + label->setText(QString(OBJ_nid2ln(nid))); + label->setToolTip(trans); + } + label->setText(QString(OBJ_nid2ln(nid))); label->setToolTip(QString(OBJ_nid2sn(nid))); attrLayout->addWidget(label, i, 0); diff --git a/widgets/MW_database.cpp b/widgets/MW_database.cpp index d1d7f3f6..05f47a57 100644 --- a/widgets/MW_database.cpp +++ b/widgets/MW_database.cpp @@ -149,11 +149,24 @@ int MainWindow::init_database() } } mydb.first(); - if (!mydb.find(setting, "optionflags")) { + if (!mydb.find(setting, "optionflags1")) { if ((p = (char *)mydb.load(NULL))) { setOptFlags((QString(p))); free(p); } + } else { + /* Different optionflags, since setOptFlags() + * does an abort() for unknown flags in + * older versions. *Another stupid idea* + * This is for backward compatibility + */ + mydb.first(); + if (!mydb.find(setting, "optionflags")) { + if ((p = (char *)mydb.load(NULL))) { + setOptFlags_old((QString(p))); + free(p); + } + } } mydb.first(); if (!mydb.find(setting, "defaultkey")) { diff --git a/widgets/MW_menu.cpp b/widgets/MW_menu.cpp index e2bdaa07..679b0ebf 100644 --- a/widgets/MW_menu.cpp +++ b/widgets/MW_menu.cpp @@ -15,6 +15,7 @@ #include "lib/pki_evp.h" #include "lib/pki_scard.h" #include "lib/func.h" +#include "lib/db_x509super.h" #include "ui_Options.h" #include "widgets/hashBox.h" #include @@ -197,6 +198,8 @@ void MainWindow::setOptions() pki_base::suppress_messages ? Qt::Checked : Qt::Unchecked); opt->noColorize->setCheckState( pki_x509::dont_colorize_expiries ? Qt::Checked : Qt::Unchecked); + opt->transDnEntries->setCheckState( + db_x509name::translate_dn ? Qt::Checked : Qt::Unchecked); if (!opt->exec()) { delete opt; @@ -227,11 +230,12 @@ void MainWindow::setOptions() QString flags = getOptFlags(); pki_base::suppress_messages = opt->suppress->checkState(); pki_x509::dont_colorize_expiries = opt->noColorize->checkState(); + db_x509name::translate_dn = opt->transDnEntries->checkState(); if (flags != getOptFlags()) { flags = getOptFlags(); mydb.set((const unsigned char *)(CCHAR(flags)), - flags.length()+1, 1, setting, "optionflags"); + flags.length()+1, 1, setting, "optionflags1"); mydb.first(); if (!mydb.find(setting, "suppress")) mydb.erase(); @@ -257,13 +261,14 @@ void MainWindow::setOptions() * S: Suppress success messages * C: Don't colorize success messages */ -void MainWindow::setOptFlags(QString flags) +void MainWindow::setOptFlags_old(QString flags) { int s = flags.size(), i; QByteArray b = flags.toAscii(); pki_base::suppress_messages = false; pki_x509::dont_colorize_expiries = false; + db_x509name::translate_dn = false; for (i=0; isetKeys(keys); extDNlist->setInfoLabel(extDNinfo); @@ -112,27 +112,18 @@ NewX509::NewX509(QWidget *parent) tempList->insertItems(0, strings); // setup Extended keyusage - for (i=0; i < eku_nid.count(); i++) - ekeyUsage->addItem(OBJ_nid2ln(eku_nid[i])); + foreach(int nid, eku_nid) + ekeyUsage->addItem(OBJ_nid2ln(nid)); // setup Authority Info Access - for (i=0; i < aia_nid.count(); i++) - aiaOid->addItem(OBJ_nid2ln(aia_nid[i])); + foreach(int nid, aia_nid) + aiaOid->addItem(OBJ_nid2ln(nid)); // init the X509 v3 context X509V3_set_ctx(&ext_ctx, NULL , NULL, NULL, NULL, 0); X509V3_set_ctx_nodb(&ext_ctx); // Setup dnWidget - QMap tooltips; - tooltips[NID_countryName] = tr("Country code"); - tooltips[NID_stateOrProvinceName] = tr("State or Province"); - tooltips[NID_localityName] = tr("Locality"); - tooltips[NID_organizationName] = tr("Organisation"); - tooltips[NID_organizationalUnitName] = tr("Organisational unit"); - tooltips[NID_commonName] = tr("Common name"); - tooltips[NID_pkcs9_emailAddress] = tr("E-Mail address"); - if (dnWidget->layout()) delete dnWidget->layout(); QGridLayout *dnLayout = new QGridLayout(dnWidget); @@ -149,16 +140,22 @@ NewX509::NewX509(QWidget *parent) dnLayout->addWidget(description, 0, 1); QWidget::setTabOrder(description, extDNlist); - QLineEdit *old = description; + QWidget *old = description; foreach(int nid, expl_dn_nid) { QLabel *label; QLineEdit *edit; + QString trans = db_x509name::dn_translations[nid]; label = new QLabel(this); - label->setText(OBJ_nid2ln(nid)); - label->setToolTip(QString("[%1] %2"). - arg(OBJ_nid2sn(nid)).arg(tooltips[nid])); - + if (db_x509name::translate_dn && !trans.isEmpty()) { + label->setText(trans); + label->setToolTip(QString("[%1] %2") + .arg(OBJ_nid2sn(nid)).arg(OBJ_nid2ln(nid))); + } else { + label->setText(OBJ_nid2ln(nid)); + label->setToolTip(QString("[%1] %2") + .arg(OBJ_nid2sn(nid)).arg(trans)); + } edit = new QLineEdit(this); setupLineEditByNid(nid, edit); nameEdits << nameEdit(nid, edit, label); @@ -181,19 +178,31 @@ NewX509::NewX509(QWidget *parent) attrLayout->setAlignment(Qt::AlignTop); attrLayout->setSpacing(6); attrLayout->setMargin(0); - attr_edit.clear(); - for (i=0; i < attr_nid.count(); i++) { + old = reqSubChange; + n = 0; + foreach(int nid, attr_nid) { QLabel *label; QLineEdit *edit; - int nid = attr_nid[i]; + QString trans = db_x509name::dn_translations[nid]; + label = new QLabel(this); - label->setText(QString(OBJ_nid2ln(nid))); - label->setToolTip(QString(OBJ_nid2sn(nid))); + if (db_x509name::translate_dn && !trans.isEmpty()) { + label->setText(trans); + label->setToolTip(QString(OBJ_nid2sn(nid))); + } else { + label->setText(QString(OBJ_nid2ln(nid))); + label->setToolTip(trans); + } edit = new QLineEdit(this); - attr_edit << edit; - attrLayout->addWidget(label, i, 0); - attrLayout->addWidget(edit, i, 1); + attrEdits << nameEdit(nid, edit, label); setupLineEditByNid(nid, edit); + + attrLayout->addWidget(label, n, 0); + attrLayout->addWidget(edit, n, 1); + + QWidget::setTabOrder(old, edit); + old = edit; + n++; } // last polish on_certList_currentIndexChanged(0); @@ -202,6 +211,29 @@ NewX509::NewX509(QWidget *parent) attrWidget->hide(); pt = none; notAfter->setEndDate(true); + if (db_x509name::translate_dn) { + QList gb; + gb << distNameBox << bcBox << keyIdentBox << kuBox << ekuBox; + foreach(QGroupBox *g, gb) { + QString tt = g->toolTip(); + g->setToolTip(g->title()); + g->setTitle(tt); + } + QList labels; + labels << sanLbl << ianLbl << crldpLbl << aiaLbl << + nsBaseLbl << nsRevLbl << nsCaRevLbl << nsRenewLbl << + nsCaPolicyLbl << nsSslServerLbl << nsCommentLbl; + foreach(QLabel *l, labels) { + QString tt = l->toolTip(); + l->setToolTip(l->text()); + l->setText(tt); + } + QList cbList; + cbList << bcCritical << kuCritical << ekuCritical; + foreach(QCheckBox* cb, cbList) { + cb->setText(tr("Critical")); + } + } } void NewX509::setRequest() @@ -255,8 +287,8 @@ void NewX509::setupLineEditByNid(int nid, QLineEdit *l) void NewX509::addReqAttributes(pki_x509req *req) { - for (int i=0; i < attr_nid.count(); i++) { - req->addAttribute(attr_nid[i], attr_edit[i]->text()); + foreach(nameEdit e, attrEdits) { + req->addAttribute(e.nid, e.edit->text()); } } diff --git a/widgets/NewX509.h b/widgets/NewX509.h index 4f4a32b7..b096cd29 100644 --- a/widgets/NewX509.h +++ b/widgets/NewX509.h @@ -47,7 +47,7 @@ class NewX509: public QDialog, public Ui::NewX509 NIDlist aia_nid; NIDlist attr_nid; NIDlist expl_dn_nid; - QList attr_edit; + QList attrEdits; QList nameEdits; X509V3_CTX ext_ctx; void editV3ext(QLineEdit *le, QString types, int n); diff --git a/widgets/Options.cpp b/widgets/Options.cpp index f279812d..a2e23c70 100644 --- a/widgets/Options.cpp +++ b/widgets/Options.cpp @@ -36,6 +36,9 @@ Options::Options(MainWindow *parent) << tr("All strings"); mbstring->addItems(s); searchP11 = NULL; + transDnEntries->setText(transDnEntries->text() + .arg(OBJ_nid2ln(NID_commonName)) + .arg(db_x509name::dn_translations[NID_commonName])); } Options::~Options() diff --git a/widgets/distname.cpp b/widgets/distname.cpp index 07a4c725..8e38ab4c 100644 --- a/widgets/distname.cpp +++ b/widgets/distname.cpp @@ -11,6 +11,7 @@ #include #include #include "lib/x509name.h" +#include "lib/db_x509super.h" #include "lib/base.h" #include "widgets/clicklabel.h" @@ -50,20 +51,30 @@ void DistName::setX509name(const x509name &n) QLabel *l1, *l2; QStringList sl; for (int i=0; isetTextFormat(Qt::PlainText); + QString toolt, label, trans; + int nid = n.nid(i); + trans = db_x509name::dn_translations[nid]; sl = n.entryList(i); - l1->setText(sl[1]); + if (db_x509name::translate_dn && !trans.isEmpty()) { + label = trans; + toolt = sl[1]; + } else { + toolt = trans; + label = sl[1]; + } + l1 = new QLabel(this); + l2 = new CopyLabel(this); + l1->setTextFormat(Qt::PlainText); + l1->setText(label); if (l1->text().isEmpty()) l1->setText(sl[0]); l2->setText(sl[2]); - l1->setToolTip(sl[0]); + l1->setToolTip(QString("[%1] %2").arg(sl[0]).arg(toolt)); l2->setToolTip(sl[3]); - DistNameLayout->addWidget( l1, i, 0 ); - DistNameLayout->addWidget( l2, i, 1 ); + DistNameLayout->addWidget(l1, i, 0); + DistNameLayout->addWidget(l2, i, 1); } rfc2253->setText(n.oneLine(XN_FLAG_RFC2253)); rfc2253->setCursorPosition(0);