From 6ac9389361ff4f103ee84d3db9d6c2b7e8204b4f Mon Sep 17 00:00:00 2001 From: Christian Hohnstaedt Date: Thu, 1 Oct 2015 11:59:58 +0200 Subject: [PATCH] Make OID resolver Non-modal and let other widgets display details - column items with context menus - double-click labels of the DN and X509v3 extensions --- ui/NewX509.ui | 29 ++++++----- ui/OidResolver.ui | 103 +++++++++++++++++----------------------- widgets/MW_menu.cpp | 9 +--- widgets/MainWindow.cpp | 15 +++++- widgets/MainWindow.h | 10 +++- widgets/NewX509.cpp | 21 +++++--- widgets/OidResolver.cpp | 5 +- widgets/OidResolver.h | 2 +- widgets/XcaTreeView.cpp | 25 +++++++++- widgets/XcaTreeView.h | 5 ++ widgets/clicklabel.cpp | 24 ++++++---- widgets/clicklabel.h | 24 +++++++--- widgets/distname.cpp | 12 +++-- 13 files changed, 176 insertions(+), 108 deletions(-) diff --git a/ui/NewX509.ui b/ui/NewX509.ui index b4433db1..94fdeba1 100644 --- a/ui/NewX509.ui +++ b/ui/NewX509.ui @@ -68,7 +68,7 @@ - 0 + 2 @@ -769,7 +769,7 @@ - + @@ -805,7 +805,7 @@ - + @@ -855,7 +855,7 @@ - + @@ -917,7 +917,7 @@ - + @@ -1176,16 +1176,16 @@ - + - + - + @@ -1194,16 +1194,16 @@ - + - + - + - + @@ -1302,6 +1302,11 @@ deleteCurrentRow() + + DoubleClickLabel + QLabel +
widgets/clicklabel.h
+
fromReqCB diff --git a/ui/OidResolver.ui b/ui/OidResolver.ui index 80e948e7..de90bae5 100644 --- a/ui/OidResolver.ui +++ b/ui/OidResolver.ui @@ -1,17 +1,17 @@ OidResolver - + 0 0 - 400 - 266 + 401 + 241 - Dialog + Form @@ -38,7 +38,7 @@ - Enter The OID, the Nid, or one of the textual representations + Enter the OID, the Nid, or one of the textual representations @@ -65,6 +65,9 @@ + + QFormLayout::AllNonFixedFieldsGrow + @@ -74,6 +77,12 @@ + + + 0 + 0 + + 0 @@ -81,19 +90,18 @@ - - - - - - - - Short name + + + + 0 + 0 + + 0 @@ -114,6 +122,12 @@ + + + 0 + 0 + + 0 @@ -137,6 +151,12 @@ + + + 0 + 0 + + 0 @@ -151,18 +171,15 @@ + + + + Short name + + + - - - - Qt::Horizontal - - - QDialogButtonBox::Ok - - - @@ -174,38 +191,6 @@ - - buttonBox - accepted() - OidResolver - accept() - - - 227 - 161 - - - 157 - 188 - - - - - buttonBox - rejected() - OidResolver - reject() - - - 295 - 167 - - - 286 - 188 - - - input textChanged(QString) @@ -213,12 +198,12 @@ searchOid(QString) - 131 - 65 + 207 + 103 - 398 - 12 + 144 + 47 diff --git a/widgets/MW_menu.cpp b/widgets/MW_menu.cpp index c09defdb..2d49be1d 100644 --- a/widgets/MW_menu.cpp +++ b/widgets/MW_menu.cpp @@ -143,7 +143,7 @@ void MainWindow::init_menu() SLOT(undelete())); extra->addAction(tr("Generate DH parameter"), this, SLOT(generateDHparam())); - extra->addAction(tr("OID Resolver"), this, SLOT(resolveOID())); + extra->addAction(tr("OID Resolver"), resolver, SLOT(show())); help = menuBar()->addMenu(tr("&Help") ); help->addAction(tr("&Content"), this, SLOT(help()), @@ -402,10 +402,3 @@ QString MainWindow::getOptFlags() flags << "disable_netscape"; return flags.join(","); } - -void MainWindow::resolveOID() -{ - OidResolver *o = new OidResolver(this); - o->exec(); - delete o; -} diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index e634fb45..152c4fed 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -61,6 +61,8 @@ QString MainWindow::mandatory_dn; QString MainWindow::explicit_dn; QString MainWindow::explicit_dn_default = QString("C,ST,L,O,OU,CN,emailAddress"); +OidResolver *MainWindow::resolver = NULL; + void MainWindow::enableTokenMenu(bool enable) { foreach(QWidget *w, scardList) { @@ -89,7 +91,10 @@ MainWindow::MainWindow(QWidget *parent) statusBar()->addWidget(dbindex, 1); setupUi(this); - setWindowTitle(tr(XCA_TITLE)); + setWindowTitle(XCA_TITLE); + + resolver = new OidResolver(NULL); + resolver->setWindowTitle(XCA_TITLE); wdList << keyButtons << reqButtons << certButtons << tempButtons << crlButtons; @@ -558,6 +563,14 @@ MainWindow::~MainWindow() #endif } +void MainWindow::closeEvent(QCloseEvent *e) +{ + if (resolver) { + delete resolver; + } + QMainWindow::closeEvent(e); +} + QString makeSalt(void) { unsigned char rand[2]; diff --git a/widgets/MainWindow.h b/widgets/MainWindow.h index 05d53037..358681b4 100644 --- a/widgets/MainWindow.h +++ b/widgets/MainWindow.h @@ -9,6 +9,7 @@ #define __MAINWINDOW_H #include "NewX509.h" +#include "OidResolver.h" #include "ui_MainWindow.h" #include "lib/db_key.h" #include "lib/db_x509req.h" @@ -69,6 +70,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow Q_OBJECT private: + static OidResolver *resolver; QString workingdir; QString string_opt; QString pkcs11path; @@ -122,6 +124,10 @@ class MainWindow: public QMainWindow, public Ui::MainWindow int initPass(); void read_cmdline(int argc, char *argv[]); void load_engine(); + static OidResolver *getResolver() + { + return resolver; + } static void Error(errorEx &err); void cmd_version(); void cmd_help(const char* msg); @@ -160,6 +166,9 @@ class MainWindow: public QMainWindow, public Ui::MainWindow void openURLs(); void changeEvent(QEvent *event); + protected slots: + void closeEvent(QCloseEvent * event); + private slots: void setOptions(); void manageToken(); @@ -169,6 +178,5 @@ class MainWindow: public QMainWindow, public Ui::MainWindow void initPin(); void generateDHparam(); void open_database(QAction* a); - void resolveOID(); }; #endif diff --git a/widgets/NewX509.cpp b/widgets/NewX509.cpp index 8618d48c..0838b45d 100644 --- a/widgets/NewX509.cpp +++ b/widgets/NewX509.cpp @@ -142,11 +142,11 @@ NewX509::NewX509(QWidget *parent) QWidget::setTabOrder(description, extDNlist); QWidget *old = description; foreach(int nid, expl_dn_nid) { - QLabel *label; + DoubleClickLabel *label; QLineEdit *edit; QString trans = dn_translations[nid]; - label = new QLabel(this); + label = new DoubleClickLabel(this); if (translate_dn && !trans.isEmpty()) { label->setText(trans); label->setToolTip(QString("[%1] %2") @@ -156,6 +156,9 @@ NewX509::NewX509(QWidget *parent) label->setToolTip(QString("[%1] %2") .arg(OBJ_nid2sn(nid)).arg(trans)); } + label->setClickText(OBJ_nid2sn(nid)); + connect(label, SIGNAL(doubleClicked(QString)), + MainWindow::getResolver(), SLOT(searchOid(QString))); edit = new QLineEdit(this); setupLineEditByNid(nid, edit); nameEdits << nameEdit(nid, edit, label); @@ -181,11 +184,11 @@ NewX509::NewX509(QWidget *parent) old = reqSubChange; n = 0; foreach(int nid, attr_nid) { - QLabel *label; + DoubleClickLabel *label; QLineEdit *edit; QString trans = dn_translations[nid]; - label = new QLabel(this); + label = new DoubleClickLabel(this); if (translate_dn && !trans.isEmpty()) { label->setText(trans); label->setToolTip(QString(OBJ_nid2sn(nid))); @@ -193,6 +196,9 @@ NewX509::NewX509(QWidget *parent) label->setText(QString(OBJ_nid2ln(nid))); label->setToolTip(trans); } + label->setClickText(OBJ_nid2sn(nid)); + connect(label, SIGNAL(doubleClicked(QString)), + MainWindow::getResolver(), SLOT(searchOid(QString))); edit = new QLineEdit(this); attrEdits << nameEdit(nid, edit, label); setupLineEditByNid(nid, edit); @@ -212,7 +218,7 @@ NewX509::NewX509(QWidget *parent) pt = none; notAfter->setEndDate(true); - QMap nidLabel; + QMap nidLabel; nidLabel[NID_subject_alt_name] = sanLbl; nidLabel[NID_issuer_alt_name] = ianLbl; nidLabel[NID_crl_distribution_points] = crldpLbl; @@ -226,13 +232,16 @@ NewX509::NewX509(QWidget *parent) nidLabel[NID_netscape_comment] = nsCommentLbl; foreach(int nid, nidLabel.keys()) { - QLabel *l = nidLabel[nid]; + DoubleClickLabel *l = nidLabel[nid]; l->setText(translate_dn ? dn_translations[nid] : OBJ_nid2ln(nid)); if (l->toolTip().isEmpty()) { l->setToolTip(translate_dn ? OBJ_nid2ln(nid) : dn_translations[nid]); } + l->setClickText(OBJ_nid2sn(nid)); + connect(l, SIGNAL(doubleClicked(QString)), + MainWindow::getResolver(), SLOT(searchOid(QString))); } QMap nidGroupBox; diff --git a/widgets/OidResolver.cpp b/widgets/OidResolver.cpp index 2a959754..7044e76e 100644 --- a/widgets/OidResolver.cpp +++ b/widgets/OidResolver.cpp @@ -12,7 +12,7 @@ #include "lib/exception.h" OidResolver::OidResolver(QWidget *parent) - :QDialog(parent) + :QWidget(parent) { setWindowTitle(tr(XCA_TITLE)); setupUi(this); @@ -23,6 +23,7 @@ void OidResolver::searchOid(QString s) bool ok; int n; + input->setText(s); s = s.trimmed(); n = s.toUInt(&ok); if (!ok) @@ -49,4 +50,6 @@ void OidResolver::searchOid(QString s) } } ign_openssl_error(); + show(); + raise(); } diff --git a/widgets/OidResolver.h b/widgets/OidResolver.h index 8d42e7e2..6bbf1dc2 100644 --- a/widgets/OidResolver.h +++ b/widgets/OidResolver.h @@ -10,7 +10,7 @@ #include "ui_OidResolver.h" -class OidResolver: public QDialog, public Ui::OidResolver +class OidResolver: public QWidget, public Ui::OidResolver { Q_OBJECT diff --git a/widgets/XcaTreeView.cpp b/widgets/XcaTreeView.cpp index d53e4a5f..bb8745f2 100644 --- a/widgets/XcaTreeView.cpp +++ b/widgets/XcaTreeView.cpp @@ -274,7 +274,19 @@ void XcaTreeView::pem2clipboard(void) basemodel->pem2clipboard(getSelectedIndexes()); } -void XcaTreeView::contextMenu(QContextMenuEvent *e, QMenu *parent, int) +void XcaTreeView::headerDetails(void) +{ + if (curr_hd && curr_hd->id > 0 && mainwin) + mainwin->getResolver()->searchOid(QString::number(curr_hd->id)); +} + +void XcaTreeView::columnRemove(void) +{ + if (curr_hd->action) + curr_hd->action->setChecked(false); +} + +void XcaTreeView::contextMenu(QContextMenuEvent *e, QMenu *parent, int col) { int shown = 0; tipMenu *menu, *dn, *v3ext, *current, *v3ns; @@ -287,6 +299,15 @@ void XcaTreeView::contextMenu(QContextMenuEvent *e, QMenu *parent, int) v3ext = new tipMenu(tr("X509v3 Extensions"), mainwin); v3ns = new tipMenu(tr("Netscape extensions"), mainwin); menu->addAction(tr("Reset"), basemodel, SLOT(columnResetDefaults())); + if (col >= 0 && col < allHeaders.size()) { + curr_hd = allHeaders[col]; + menu->addAction(tr("Remove Column"), this,SLOT(columnRemove())); + if (curr_hd->id > 0) + menu->addAction(tr("Details"), this, + SLOT(headerDetails())); + } else { + curr_hd = NULL; + } sep = menu->addSeparator(); foreach(hd, allHeaders) { switch (hd->type) { @@ -378,5 +399,5 @@ void XcaTreeView::showContextMenu(QContextMenuEvent *e, fillContextMenu(menu, subExport, index, indexes); - contextMenu(e, menu); + contextMenu(e, menu, -1); } diff --git a/widgets/XcaTreeView.h b/widgets/XcaTreeView.h index 4a55da93..ab78cba6 100644 --- a/widgets/XcaTreeView.h +++ b/widgets/XcaTreeView.h @@ -17,6 +17,9 @@ class XcaTreeView: public QTreeView { Q_OBJECT + + dbheader *curr_hd; + protected: db_base *basemodel; QSortFilterProxyModel *proxy; @@ -56,5 +59,7 @@ class XcaTreeView: public QTreeView void doubleClick(const QModelIndex &m); void load(void); void pem2clipboard(void); + void headerDetails(void); + void columnRemove(void); }; #endif diff --git a/widgets/clicklabel.cpp b/widgets/clicklabel.cpp index c6269c44..21a3dae9 100644 --- a/widgets/clicklabel.cpp +++ b/widgets/clicklabel.cpp @@ -11,8 +11,22 @@ #include #include +void DoubleClickLabel::mouseDoubleClickEvent(QMouseEvent * e) +{ + QWidget::mouseDoubleClickEvent(e); + if (clicktext.isEmpty()) + emit doubleClicked(text()); + else + emit doubleClicked(clicktext); +} + +void DoubleClickLabel::setClickText(QString s) +{ + clicktext = s; +} + ClickLabel::ClickLabel(QWidget *parent) - :QLabel(parent) + :DoubleClickLabel(parent) { QFont fnt( font() ); fnt.setBold(true); @@ -31,12 +45,6 @@ ClickLabel::ClickLabel(QWidget *parent) setTextFormat(Qt::PlainText); } -void ClickLabel::mouseDoubleClickEvent ( QMouseEvent * e ) -{ - QWidget::mouseDoubleClickEvent(e); - emit doubleClicked(text()); -} - void ClickLabel::setColor(const QColor &col) { QPalette pal = palette(); @@ -62,7 +70,7 @@ void ClickLabel::disableToolTip() CopyLabel::CopyLabel(QWidget *parent) - :QLabel(parent) + :DoubleClickLabel(parent) { setFrameShape(QFrame::Panel); setFrameShadow(QFrame::Sunken); diff --git a/widgets/clicklabel.h b/widgets/clicklabel.h index 745fdf8c..d25698ef 100644 --- a/widgets/clicklabel.h +++ b/widgets/clicklabel.h @@ -12,7 +12,23 @@ class QMouseEvent; -class ClickLabel : public QLabel +class DoubleClickLabel : public QLabel +{ + Q_OBJECT + + QString clicktext; + public: + DoubleClickLabel(QWidget *parent) : QLabel(parent) { } + void setClickText(QString s); + + protected: + void mouseDoubleClickEvent ( QMouseEvent * e ); + + signals: + void doubleClicked(QString text); +}; + +class ClickLabel : public DoubleClickLabel { Q_OBJECT @@ -23,14 +39,10 @@ class ClickLabel : public QLabel void disableToolTip(); protected: - void mouseDoubleClickEvent ( QMouseEvent * e ); void setColor(const QColor &col); - - signals: - void doubleClicked(QString text); }; -class CopyLabel : public QLabel +class CopyLabel : public DoubleClickLabel { Q_OBJECT diff --git a/widgets/distname.cpp b/widgets/distname.cpp index fb62f33e..7aed4833 100644 --- a/widgets/distname.cpp +++ b/widgets/distname.cpp @@ -13,7 +13,8 @@ #include "lib/x509name.h" #include "lib/db_x509super.h" #include "lib/base.h" -#include "widgets/clicklabel.h" +#include "clicklabel.h" +#include "MainWindow.h" DistName::DistName(QWidget* parent) : QWidget(parent) @@ -48,7 +49,8 @@ DistName::DistName(QWidget* parent) void DistName::setX509name(const x509name &n) { - QLabel *l1, *l2; + DoubleClickLabel *l1; + QLabel *l2; QStringList sl; for (int i=0; isetTextFormat(Qt::PlainText); l1->setText(label); + l1->setClickText(sl[1]); if (l1->text().isEmpty()) l1->setText(sl[0]); l2->setText(sl[2]); @@ -73,6 +76,9 @@ void DistName::setX509name(const x509name &n) l1->setToolTip(QString("[%1] %2").arg(sl[0]).arg(toolt)); l2->setToolTip(sl[3]); + connect(l1, SIGNAL(doubleClicked(QString)), + MainWindow::getResolver(), SLOT(searchOid(QString))); + DistNameLayout->addWidget(l1, i, 0); DistNameLayout->addWidget(l2, i, 1); }