From 2154b6b541d49ba0a85c286da0486888d1b918c4 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 27 Aug 2017 15:41:24 -0600 Subject: Expose some signature details in a tooltip. We'll want a proper UI for that at some point, but this is a start. --- .../mailviewer/contents/ui/MailDataModel.qml | 28 +++++++++++++++++ framework/src/domain/mime/partmodel.cpp | 28 +++++++++++++++++ framework/src/domain/mime/partmodel.h | 35 ++++++++++++++++++++++ 3 files changed, 91 insertions(+) diff --git a/components/mailviewer/contents/ui/MailDataModel.qml b/components/mailviewer/contents/ui/MailDataModel.qml index a626a35a..32188a04 100644 --- a/components/mailviewer/contents/ui/MailDataModel.qml +++ b/components/mailviewer/contents/ui/MailDataModel.qml @@ -43,6 +43,19 @@ DelegateModel { return Kube.Colors.lightgrey } + function getDetails(signatureDetails) + { + var details = qsTr("Signature") + ":\n" + details += qsTr("Key Id") + ": " + model.signatureDetails.keyId + "\n" + if (model.signatureDetails.keyMissing) { + details += qsTr("Key details are not available.") + "\n" + } + if (model.signatureDetails.keyIsTrusted) { + details += qsTr("You are trusting this key.") + "\n" + } + return details + } + Row { anchors { top: parent.top @@ -61,6 +74,21 @@ DelegateModel { width: Kube.Units.smallSpacing color: getColor(model.securityLevel) opacity: 0.5 + Kube.ToolTip { + id: tooltip + text: getDetails(model.signatureDetails) + visible: mouseArea.containsMouse + } + Kube.SelectableItem { + visualParent: border + text: tooltip.text + } + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + acceptedButtons: Qt.NoButton + } } Loader { diff --git a/framework/src/domain/mime/partmodel.cpp b/framework/src/domain/mime/partmodel.cpp index 331ef379..bf11b52d 100644 --- a/framework/src/domain/mime/partmodel.cpp +++ b/framework/src/domain/mime/partmodel.cpp @@ -26,6 +26,9 @@ #include #include +#include +#include + class PartModelPrivate { public: @@ -90,6 +93,7 @@ QHash PartModel::roleNames() const roles[ErrorString] = "errorString"; roles[IsErrorRole] = "error"; roles[SenderRole] = "sender"; + roles[SignatureDetails] = "signatureDetails"; roles[DateRole] = "date"; return roles; } @@ -232,6 +236,30 @@ QVariant PartModel::data(const QModelIndex &index, int role) const //No info return "unknown"; } + case SignatureDetails: { + auto signatureInfo = new SignatureInfo; + + const auto signatureParts = messagePart->signatures(); + if (signatureParts.size() > 1) { + qWarning() << "Can't deal with more than one signature"; + } + for (const auto &p : signatureParts) { + signatureInfo->mKeyId = p->partMetaData()->keyId; + signatureInfo->mKeyMissing = p->partMetaData()->sigSummary & GpgME::Signature::KeyMissing; + signatureInfo->mKeyExpired = p->partMetaData()->sigSummary & GpgME::Signature::KeyExpired; + signatureInfo->mKeyRevoked = p->partMetaData()->sigSummary & GpgME::Signature::KeyRevoked; + signatureInfo->mSigExpired = p->partMetaData()->sigSummary & GpgME::Signature::SigExpired; + signatureInfo->mCrlMissing = p->partMetaData()->sigSummary & GpgME::Signature::CrlMissing; + signatureInfo->mCrlTooOld = p->partMetaData()->sigSummary & GpgME::Signature::CrlTooOld; + signatureInfo->mSigner = p->partMetaData()->signer; + signatureInfo->mSignClass = p->partMetaData()->signClass; + signatureInfo->mSignerMailAddresses = p->partMetaData()->signerMailAddresses; + signatureInfo->mSignatureIsGood = p->partMetaData()->isGoodSignature; + signatureInfo->mKeyIsTrusted = p->partMetaData()->keyTrust & GpgME::Signature::Full || + p->partMetaData()->keyTrust & GpgME::Signature::Ultimate; + } + return QVariant::fromValue(signatureInfo); + } case ErrorType: return messagePart->error(); case ErrorString: { diff --git a/framework/src/domain/mime/partmodel.h b/framework/src/domain/mime/partmodel.h index 3c6378a2..c925c291 100644 --- a/framework/src/domain/mime/partmodel.h +++ b/framework/src/domain/mime/partmodel.h @@ -45,6 +45,8 @@ public: IsSignedRole, IsErrorRole, SecurityLevelRole, + SignatureDetails, + EncryptionDetails, ErrorType, ErrorString, SenderRole, @@ -62,3 +64,36 @@ private: std::unique_ptr d; }; +class SignatureInfo : public QObject +{ + Q_OBJECT + Q_PROPERTY(QByteArray keyId MEMBER mKeyId CONSTANT) + Q_PROPERTY(bool keyMissing MEMBER mKeyMissing CONSTANT) + Q_PROPERTY(bool keyRevoked MEMBER mKeyRevoked CONSTANT) + Q_PROPERTY(bool keyExpired MEMBER mKeyExpired CONSTANT) + Q_PROPERTY(bool sigExpired MEMBER mSigExpired CONSTANT) + Q_PROPERTY(bool crlMissing MEMBER mCrlMissing CONSTANT) + Q_PROPERTY(bool crlTooOld MEMBER mCrlTooOld CONSTANT) + + Q_PROPERTY(QString signer MEMBER mSigner CONSTANT) + Q_PROPERTY(QString signClass MEMBER mSignClass CONSTANT) + Q_PROPERTY(QStringList signerMailAddresses MEMBER mSignerMailAddresses CONSTANT) + Q_PROPERTY(bool signatureIsGood MEMBER mSignatureIsGood CONSTANT) + Q_PROPERTY(bool keyIsTrusted MEMBER mKeyIsTrusted CONSTANT) + +public: + bool mKeyRevoked = false; + bool mKeyExpired = false; + bool mSigExpired = false; + bool mKeyMissing = false; + bool mCrlMissing = false; + bool mCrlTooOld = false; + QByteArray mKeyId; + + QString mSigner; + QString mSignClass; + QStringList mSignerMailAddresses; + bool mSignatureIsGood = false; + bool mKeyIsTrusted = false; +}; + -- cgit v1.2.3