From 654768c0b5016ef678b9b26aea1a2417938204af Mon Sep 17 00:00:00 2001 From: Sune Vuorela Date: Thu, 13 Apr 2023 14:33:47 +0200 Subject: [PATCH] Use parsed distinguished name from poppler This gives us the possibility to get rid of the "poor man's" parser in certificateviewer.cpp once we can start requiring the newer poppler. --- core/signatureutils.cpp | 10 ++++++++ core/signatureutils.h | 10 ++++++++ generators/poppler/pdfsignatureutils.cpp | 18 +++++++++++++++ generators/poppler/pdfsignatureutils.h | 2 ++ gui/certificatemodel.cpp | 29 ++++++++++++++++++++++++ gui/certificatemodel.h | 4 +++- part/certificateviewer.cpp | 17 +++++++++++--- 7 files changed, 86 insertions(+), 4 deletions(-) diff --git a/core/signatureutils.cpp b/core/signatureutils.cpp index 454a8493f..1c71257c0 100644 --- a/core/signatureutils.cpp +++ b/core/signatureutils.cpp @@ -43,6 +43,16 @@ QString CertificateInfo::subjectInfo(EntityInfoKey) const return QString(); } +QVector> CertificateInfo::splitIssuerDN() const +{ + return {}; +} + +QVector> CertificateInfo::splitSubjectDN() const +{ + return {}; +} + QString CertificateInfo::nickName() const { return QString(); diff --git a/core/signatureutils.h b/core/signatureutils.h index c17c5133d..0aa48fbb0 100644 --- a/core/signatureutils.h +++ b/core/signatureutils.h @@ -71,11 +71,21 @@ public: */ virtual QString issuerInfo(EntityInfoKey key) const; + /** + * The issuer distinguished name, parsed and split up + */ + virtual QVector> splitIssuerDN() const; + /** * Information about the subject */ virtual QString subjectInfo(EntityInfoKey key) const; + /** + * The subject distinguished name, parsed and split up + */ + virtual QVector> splitSubjectDN() const; + /** * The certificate internal database nickname */ diff --git a/generators/poppler/pdfsignatureutils.cpp b/generators/poppler/pdfsignatureutils.cpp index e03400f02..e1e9b6f02 100644 --- a/generators/poppler/pdfsignatureutils.cpp +++ b/generators/poppler/pdfsignatureutils.cpp @@ -46,6 +46,24 @@ QString PopplerCertificateInfo::subjectInfo(PopplerCertificateInfo::EntityInfoKe return !str.isEmpty() ? str : i18n("Not Available"); } +QVector> PopplerCertificateInfo::splitIssuerDN() const +{ +#if POPPLER_VERSION_MACRO >= QT_VERSION_CHECK(23, 05, 0) + return m_info.splitIssuerDN(); +#else + return {}; +#endif +} + +QVector> PopplerCertificateInfo::splitSubjectDN() const +{ +#if POPPLER_VERSION_MACRO >= QT_VERSION_CHECK(23, 05, 0) + return m_info.splitSubjectDN(); +#else + return {}; +#endif +} + QString PopplerCertificateInfo::nickName() const { return m_info.nickName(); diff --git a/generators/poppler/pdfsignatureutils.h b/generators/poppler/pdfsignatureutils.h index 285226b2c..792ea5a9c 100644 --- a/generators/poppler/pdfsignatureutils.h +++ b/generators/poppler/pdfsignatureutils.h @@ -23,7 +23,9 @@ public: int version() const override; QByteArray serialNumber() const override; QString issuerInfo(EntityInfoKey) const override; + QVector> splitIssuerDN() const override; QString subjectInfo(EntityInfoKey) const override; + QVector> splitSubjectDN() const override; QString nickName() const override; QDateTime validityStart() const override; QDateTime validityEnd() const override; diff --git a/gui/certificatemodel.cpp b/gui/certificatemodel.cpp index 6daadeaca..c00957697 100644 --- a/gui/certificatemodel.cpp +++ b/gui/certificatemodel.cpp @@ -104,6 +104,33 @@ QString CertificateModel::propertyVisibleValue(CertificateModel::Property p) con return QString(); } +QVariant CertificateModel::propertyVisibleDetailValue(CertificateModel::Property p) const +{ + switch (p) { + case CertificateModel::Issuer: { + // let's see if we have a pre-parsed one + auto preParsed = m_certificateInfo.splitIssuerDN(); + if (!preParsed.isEmpty()) { + return QVariant::fromValue(preParsed); + } else { + return propertyVisibleValue(p); + } + } + case CertificateModel::Subject: { + // let's see if we have a pre-parsed one + auto preParsed = m_certificateInfo.splitSubjectDN(); + if (!preParsed.isEmpty()) { + return QVariant::fromValue(preParsed); + } else { + return propertyVisibleValue(p); + } + } + default: + return propertyVisibleValue(p); + } + return QVariant(); +} + QVariant CertificateModel::data(const QModelIndex &index, int role) const { const int row = index.row(); @@ -126,6 +153,8 @@ QVariant CertificateModel::data(const QModelIndex &index, int role) const return m_certificateProperties[row]; case PropertyVisibleValueRole: return propertyVisibleValue(m_certificateProperties[row]); + case PropertyVisibleDetailRole: + return propertyVisibleDetailValue(m_certificateProperties[row]); } return QVariant(); diff --git a/gui/certificatemodel.h b/gui/certificatemodel.h index a3897f287..7de3f4126 100644 --- a/gui/certificatemodel.h +++ b/gui/certificatemodel.h @@ -19,7 +19,7 @@ class CertificateModel : public QAbstractTableModel public: explicit CertificateModel(const Okular::CertificateInfo &certInfo, QObject *parent = nullptr); - enum { PropertyKeyRole = Qt::UserRole, PropertyVisibleValueRole }; + enum { PropertyKeyRole = Qt::UserRole, PropertyVisibleValueRole, PropertyVisibleDetailRole }; enum Property { Version, SerialNumber, Issuer, IssuedOn, ExpiresOn, Subject, PublicKey, KeyUsage, IssuerName, IssuerEmail, IssuerOrganization, SubjectName, SubjectEmail, SubjectOrganization, Sha1, Sha256 }; Q_ENUM(Property) @@ -32,6 +32,8 @@ public: Q_INVOKABLE QString propertyVisibleValue(CertificateModel::Property p) const; Q_INVOKABLE bool exportCertificateTo(const QString &path); + QVariant propertyVisibleDetailValue(CertificateModel::Property p) const; + private: QVector m_certificateProperties; const Okular::CertificateInfo &m_certificateInfo; diff --git a/part/certificateviewer.cpp b/part/certificateviewer.cpp index eaf51ec7b..990b3d694 100644 --- a/part/certificateviewer.cpp +++ b/part/certificateviewer.cpp @@ -204,9 +204,20 @@ void CertificateViewer::updateText(const QModelIndex &index) text = m_certificateModel->data(index, CertificateModel::PropertyVisibleValueRole).toString(); break; case CertificateModel::Issuer: - case CertificateModel::Subject: - text = splitDNAttributes(m_certificateModel->data(index, CertificateModel::PropertyVisibleValueRole).toString()); - break; + case CertificateModel::Subject: { + auto data = m_certificateModel->data(index, CertificateModel::PropertyVisibleDetailRole); + if (data.canConvert>>()) { + auto vector = data.value>>(); + for (auto &&pair : vector) { + if (!text.isEmpty()) { + text += QLatin1Char('\n'); + } + text += pair.first + QLatin1Char('=') + pair.second; + } + } else { + text = splitDNAttributes(data.toString()); + } + } break; case CertificateModel::PublicKey: text = QString::fromLatin1(m_certificateInfo.publicKey().toHex(' ')); break;