From cb6dc4427dfbc6bfbf3a6505baf80dc33edd9f19 Mon Sep 17 00:00:00 2001 From: Christian Hohnstaedt Date: Wed, 19 Nov 2014 07:46:48 +0100 Subject: [PATCH] SF Feat. Req. #70 ability to search certificates Add a Search line into the status bar to quickly limit the view of items to those matching the wildcard pattern case insensitive. --- changelog | 1 + lib/db_base.cpp | 5 +++-- lib/pki_base.cpp | 12 ++++++++++-- lib/pki_base.h | 3 ++- lib/pki_crl.cpp | 10 ++++++++++ lib/pki_crl.h | 1 + lib/pki_scard.cpp | 14 ++++++++++++++ lib/pki_scard.h | 5 +++-- lib/pki_x509.cpp | 17 +++++++++++++++++ lib/pki_x509.h | 1 + lib/pki_x509req.cpp | 11 +++++++++++ lib/pki_x509req.h | 1 + lib/pki_x509super.cpp | 17 +++++++++++++++++ lib/pki_x509super.h | 2 ++ lib/x509name.cpp | 10 ++++++++++ lib/x509name.h | 1 + lib/x509v3ext.cpp | 7 +++++++ lib/x509v3ext.h | 1 + widgets/MW_database.cpp | 4 ++++ widgets/MainWindow.cpp | 20 ++++++++++++++++++++ widgets/MainWindow.h | 1 + widgets/XcaTreeView.cpp | 16 ++++++++++++++++ widgets/XcaTreeView.h | 3 +++ 23 files changed, 156 insertions(+), 7 deletions(-) diff --git a/changelog b/changelog index cef78ae1..52239e8e 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,4 @@ + * SF Feat. Req. #70 ability to search certificates * SF Feat. Req. #75 show SHA-256 digest * RedHat Bug #1164340 - segfault when viewing a RHEL entitlement certificate diff --git a/lib/db_base.cpp b/lib/db_base.cpp index 82080f89..727e4370 100644 --- a/lib/db_base.cpp +++ b/lib/db_base.cpp @@ -579,9 +579,10 @@ QVariant db_base::data(const QModelIndex &index, int role) const return QVariant(QFont("Monospace")); return QVariant(QApplication::font()); } - case Qt::BackgroundRole: { + case Qt::BackgroundRole: return item->bg_color(hd); - } + case Qt::UserRole: + return item->visible(); } return QVariant(); } diff --git a/lib/pki_base.cpp b/lib/pki_base.cpp index 7f5edf59..0e26f6f8 100644 --- a/lib/pki_base.cpp +++ b/lib/pki_base.cpp @@ -13,6 +13,7 @@ int pki_base::pki_counter = 0; int pki_base::suppress_messages = 0; +QRegExp pki_base::limitPattern; pki_base::pki_base(const QString name, pki_base *p) { @@ -37,7 +38,7 @@ enum pki_type pki_base::getType() pki_base::~pki_base(void) { - while((childCount())) + while (childItems.size() > 0) delete takeFirst(); pki_counter--; } @@ -53,6 +54,13 @@ QString pki_base::getUnderlinedName() const return getIntName().replace(QRegExp("[ &;`/\\\\]+"), "_"); } +bool pki_base::visible() +{ + if (limitPattern.isEmpty()) + return true; + return getIntName().contains(limitPattern); +} + int pki_base::get_pki_counter() { return pki_counter; @@ -130,7 +138,7 @@ void pki_base::insert(int row, pki_base *item) int pki_base::childCount() { - return childItems.count(); + return childItems.size(); } int pki_base::row(void) const diff --git a/lib/pki_base.h b/lib/pki_base.h index df4d90d4..c6170a94 100644 --- a/lib/pki_base.h +++ b/lib/pki_base.h @@ -32,7 +32,6 @@ class pki_base : public QObject enum pki_type pkiType; /* model data */ pki_base *parent; - void my_error(const QString myerr) const; void fopen_error(const QString fname); @@ -44,6 +43,7 @@ class pki_base : public QObject msg_create, }; static int suppress_messages; + static QRegExp limitPattern; QList childItems; pki_base(const QString d = "", pki_base *p = NULL); virtual void fload(const QString) {}; @@ -56,6 +56,7 @@ class pki_base : public QObject return QByteArray(); } virtual bool compare(pki_base *); + virtual bool visible(); virtual ~pki_base(); QString getIntName() const; QString getUnderlinedName() const; diff --git a/lib/pki_crl.cpp b/lib/pki_crl.cpp index 7ffaad14..2ff415c3 100644 --- a/lib/pki_crl.cpp +++ b/lib/pki_crl.cpp @@ -168,6 +168,16 @@ void pki_crl::addV3ext(const x509v3ext &e) pki_openssl_error(); } +bool pki_crl::visible() +{ + extList el; + if (pki_x509name::visible()) + return true; + if (getSigAlg().contains(limitPattern)) + return true; + el.setStack(crl->crl->extensions); + return el.search(limitPattern); +} void pki_crl::sign(pki_key *key, const EVP_MD *md) { diff --git a/lib/pki_crl.h b/lib/pki_crl.h index 3035cec3..31f9d777 100644 --- a/lib/pki_crl.h +++ b/lib/pki_crl.h @@ -69,6 +69,7 @@ class pki_crl: public pki_x509name void setCrlNumber(a1int num); bool getCrlNumber(a1int *num); BIO *pem(BIO *); + bool visible(); }; #endif diff --git a/lib/pki_scard.cpp b/lib/pki_scard.cpp index 3a154dae..444c81d5 100644 --- a/lib/pki_scard.cpp +++ b/lib/pki_scard.cpp @@ -777,3 +777,17 @@ QVariant pki_scard::getIcon(dbheader *hd) return hd->id == HD_internal_name ? QVariant(*icon[0]) : QVariant(); } +bool pki_scard::visible() +{ + QStringList sl; + if (pki_base::visible()) + return true; + + sl << card_serial << card_manufacturer << card_model << + card_label << slot_label << object_id; + foreach(QString s, sl) { + if (s.contains(limitPattern)) + return true; + } + return false; +} diff --git a/lib/pki_scard.h b/lib/pki_scard.h index 9bb280a7..6c8e8299 100644 --- a/lib/pki_scard.h +++ b/lib/pki_scard.h @@ -87,8 +87,9 @@ class pki_scard: public pki_key void deleteFromToken(); void deleteFromToken(slotid slot); void store_token(slotid slot, EVP_PKEY *pkey); - virtual int renameOnToken(slotid slot, QString name); - virtual QString getMsg(msg_type msg); + int renameOnToken(slotid slot, QString name); + QString getMsg(msg_type msg); + bool visible(); }; #endif diff --git a/lib/pki_x509.cpp b/lib/pki_x509.cpp index b9eee035..caa35c88 100644 --- a/lib/pki_x509.cpp +++ b/lib/pki_x509.cpp @@ -899,6 +899,23 @@ const EVP_MD *pki_x509::getDigest() return EVP_get_digestbyobj(cert->sig_alg->algorithm); } +bool pki_x509::visible() +{ + if (pki_x509super::visible()) + return true; + if (getIssuer().search(limitPattern)) + return true; + if (fingerprint(EVP_md5()).contains(limitPattern)) + return true; + if (fingerprint(EVP_sha1()).contains(limitPattern)) + return true; + if (fingerprint(EVP_sha256()).contains(limitPattern)) + return true; + if (getSerial().toHex().contains(limitPattern)) + return true; + return false; +} + QVariant pki_x509::bg_color(dbheader *hd) { #define BG_RED QBrush(QColor(255, 0, 0)) diff --git a/lib/pki_x509.h b/lib/pki_x509.h index 33de828a..b38252a0 100644 --- a/lib/pki_x509.h +++ b/lib/pki_x509.h @@ -137,6 +137,7 @@ class pki_x509 : public pki_x509super void setCrlExpiry(const a1time &time); bool hasExtension(int nid); bool cmpIssuerAndSerial(pki_x509 *refcert); + bool visible(); void updateView(); x509rev getRev(bool reason = true); QString getSigAlg(); diff --git a/lib/pki_x509req.cpp b/lib/pki_x509req.cpp index 4be360e1..8b770799 100644 --- a/lib/pki_x509req.cpp +++ b/lib/pki_x509req.cpp @@ -442,6 +442,17 @@ QVariant pki_x509req::getIcon(dbheader *hd) return QVariant(*icon[pixnum]); } +bool pki_x509req::visible() +{ + if (pki_x509super::visible()) + return true; + if (getAttribute(request, NID_pkcs9_unstructuredName).contains(limitPattern)) + return true; + if (getAttribute(request, NID_pkcs9_challengePassword).contains(limitPattern)) + return true; + return false; +} + void pki_x509req::oldFromData(unsigned char *p, int size) { QByteArray ba((const char *)p, size); diff --git a/lib/pki_x509req.h b/lib/pki_x509req.h index 5b1dca28..c6d47b97 100644 --- a/lib/pki_x509req.h +++ b/lib/pki_x509req.h @@ -76,6 +76,7 @@ class pki_x509req : public pki_x509super QByteArray i2d(); QByteArray i2d_spki(); BIO *pem(BIO *); + bool visible(); }; #endif diff --git a/lib/pki_x509super.cpp b/lib/pki_x509super.cpp index 80fce69b..0346391c 100644 --- a/lib/pki_x509super.cpp +++ b/lib/pki_x509super.cpp @@ -121,6 +121,16 @@ void pki_x509super::opensslConf(QString fname) fwrite_ba(fp, ba, fname); fclose(fp); } + +bool pki_x509super::visible() +{ + if (pki_x509name::visible()) + return true; + if (getSigAlg().contains(limitPattern)) + return true; + return getV3ext().search(limitPattern); +} + // Start class pki_x509name pki_x509name::pki_x509name(const QString name) @@ -148,3 +158,10 @@ QVariant pki_x509name::column_data(dbheader *hd) } return pki_base::column_data(hd); } + +bool pki_x509name::visible() +{ + if (pki_base::visible()) + return true; + return getSubject().search(limitPattern); +} diff --git a/lib/pki_x509super.h b/lib/pki_x509super.h index e9c0253d..6ebe4caf 100644 --- a/lib/pki_x509super.h +++ b/lib/pki_x509super.h @@ -24,6 +24,7 @@ class pki_x509name : public pki_base }; void autoIntName(); QVariant column_data(dbheader *hd); + bool visible(); }; class pki_x509super : public pki_x509name @@ -55,6 +56,7 @@ class pki_x509super : public pki_x509name void delRefKey(pki_key *ref); QVariant column_data(dbheader *hd); void opensslConf(QString fname); + bool visible(); }; #endif diff --git a/lib/x509name.cpp b/lib/x509name.cpp index dbc5d593..8212a39a 100644 --- a/lib/x509name.cpp +++ b/lib/x509name.cpp @@ -229,6 +229,16 @@ QString x509name::checkLength() const return warn; } +bool x509name::search(const QRegExp &pattern) +{ + int i, max = entryCount(); + for (i=0; i int idxByNid(int nid); bool genConf(int nid, QString *single, QString *adv = NULL); void genGenericConf(QString *adv); + bool search(const QRegExp &pattern); }; #endif diff --git a/widgets/MW_database.cpp b/widgets/MW_database.cpp index ebca91b6..99af8fd2 100644 --- a/widgets/MW_database.cpp +++ b/widgets/MW_database.cpp @@ -57,6 +57,9 @@ int MainWindow::init_database() return ret; } + searchEdit->setText(""); + searchEdit->show(); + statusBar()->addWidget(searchEdit, 1); mandatory_dn = ""; explicit_dn = explicit_dn_default; @@ -290,6 +293,7 @@ void MainWindow::close_database() setting, "mw_geometry"); } setItemEnabled(false); + statusBar()->removeWidget(searchEdit); dbindex->clear(); keyView->setModel(NULL); diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index 9df868c2..0e9b4ed6 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -133,6 +133,26 @@ MainWindow::MainWindow(QWidget *parent ) connect(this, SIGNAL(newURLs(QStringList &)), this, SLOT(openURLs(QStringList &))); setAcceptDrops(true); + + searchEdit = new QLineEdit(); +// searchEdit->setMinimumWidth(220); + + connect(searchEdit, SIGNAL(textChanged(const QString &)), + keyView, SLOT(setFilter(const QString&))); + connect(searchEdit, SIGNAL(textChanged(const QString &)), + reqView, SLOT(setFilter(const QString&))); + connect(searchEdit, SIGNAL(textChanged(const QString &)), + certView, SLOT(setFilter(const QString&))); + connect(searchEdit, SIGNAL(textChanged(const QString &)), + tempView, SLOT(setFilter(const QString&))); + connect(searchEdit, SIGNAL(textChanged(const QString &)), + crlView, SLOT(setFilter(const QString&))); + + keyView->setModel(keys); + reqView->setModel(reqs); + certView->setModel(certs); + tempView->setModel(temps); + crlView->setModel(crls); } void MainWindow::dropEvent(QDropEvent *event) diff --git a/widgets/MainWindow.h b/widgets/MainWindow.h index 8ac392c6..d851c310 100644 --- a/widgets/MainWindow.h +++ b/widgets/MainWindow.h @@ -77,6 +77,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow tipMenu *historyMenu; void update_history_menu(); void set_geometry(char *p, db_header_t *head); + QLineEdit *searchEdit; protected: void init_images(); diff --git a/widgets/XcaTreeView.cpp b/widgets/XcaTreeView.cpp index e3fce464..6073fe5f 100644 --- a/widgets/XcaTreeView.cpp +++ b/widgets/XcaTreeView.cpp @@ -13,6 +13,7 @@ #include #include #include +#include XcaTreeView::XcaTreeView(QWidget *parent) @@ -147,6 +148,14 @@ void XcaTreeView::editIdx(const QModelIndex &idx) edit(proxy->mapFromSource(idx)); } +void XcaTreeView::setFilter(const QString &pattern) +{ + pki_base::limitPattern = QRegExp(pattern, + Qt::CaseInsensitive, QRegExp::Wildcard); + // Only to tell the model about the changed filter + proxy->setFilterFixedString(pattern); +} + XcaProxyModel::XcaProxyModel(QWidget *parent) :QSortFilterProxyModel(parent) { @@ -176,6 +185,13 @@ bool XcaProxyModel::lessThan(const QModelIndex &left, return QSortFilterProxyModel::lessThan(left, right); } +bool XcaProxyModel::filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const +{ + QModelIndex idx = sourceModel()->index(sourceRow, 0, sourceParent); + return sourceModel()->data(idx, Qt::UserRole).toBool(); +} + void XcaHeaderView::contextMenuEvent(QContextMenuEvent * e) { XcaTreeView *tv = (XcaTreeView *)parentWidget(); diff --git a/widgets/XcaTreeView.h b/widgets/XcaTreeView.h index d000e5e3..c1bcda1f 100644 --- a/widgets/XcaTreeView.h +++ b/widgets/XcaTreeView.h @@ -51,6 +51,7 @@ class XcaTreeView: public QTreeView void sectionMoved(int idx, int oldI, int newI); void columnsResize(); void editIdx(const QModelIndex &idx); + void setFilter(const QString &pattern); }; class XcaProxyModel: public QSortFilterProxyModel @@ -59,6 +60,8 @@ class XcaProxyModel: public QSortFilterProxyModel public: XcaProxyModel(QWidget *parent = 0); bool lessThan(const QModelIndex &left, const QModelIndex &right) const; + bool filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const; }; #endif