summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-08-27 15:41:24 -0600
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-08-27 15:41:24 -0600
commit2154b6b541d49ba0a85c286da0486888d1b918c4 (patch)
tree44ff1b66edf0bb1db740eaf6a0c2b89ac178e8f2
parent2f5288fd8884020b5c37f1732c3365be9edc44d9 (diff)
downloadkube-2154b6b541d49ba0a85c286da0486888d1b918c4.tar.gz
kube-2154b6b541d49ba0a85c286da0486888d1b918c4.zip
Expose some signature details in a tooltip.
We'll want a proper UI for that at some point, but this is a start.
-rw-r--r--components/mailviewer/contents/ui/MailDataModel.qml28
-rw-r--r--framework/src/domain/mime/partmodel.cpp28
-rw-r--r--framework/src/domain/mime/partmodel.h35
3 files changed, 91 insertions, 0 deletions
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 {
43 return Kube.Colors.lightgrey 43 return Kube.Colors.lightgrey
44 } 44 }
45 45
46 function getDetails(signatureDetails)
47 {
48 var details = qsTr("Signature") + ":\n"
49 details += qsTr("Key Id") + ": " + model.signatureDetails.keyId + "\n"
50 if (model.signatureDetails.keyMissing) {
51 details += qsTr("Key details are not available.") + "\n"
52 }
53 if (model.signatureDetails.keyIsTrusted) {
54 details += qsTr("You are trusting this key.") + "\n"
55 }
56 return details
57 }
58
46 Row { 59 Row {
47 anchors { 60 anchors {
48 top: parent.top 61 top: parent.top
@@ -61,6 +74,21 @@ DelegateModel {
61 width: Kube.Units.smallSpacing 74 width: Kube.Units.smallSpacing
62 color: getColor(model.securityLevel) 75 color: getColor(model.securityLevel)
63 opacity: 0.5 76 opacity: 0.5
77 Kube.ToolTip {
78 id: tooltip
79 text: getDetails(model.signatureDetails)
80 visible: mouseArea.containsMouse
81 }
82 Kube.SelectableItem {
83 visualParent: border
84 text: tooltip.text
85 }
86 MouseArea {
87 id: mouseArea
88 anchors.fill: parent
89 hoverEnabled: true
90 acceptedButtons: Qt.NoButton
91 }
64 } 92 }
65 93
66 Loader { 94 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 @@
26#include <QMimeDatabase> 26#include <QMimeDatabase>
27#include <QTextDocument> 27#include <QTextDocument>
28 28
29#include <gpgme++/key.h>
30#include <gpgme.h>
31
29class PartModelPrivate 32class PartModelPrivate
30{ 33{
31public: 34public:
@@ -90,6 +93,7 @@ QHash<int, QByteArray> PartModel::roleNames() const
90 roles[ErrorString] = "errorString"; 93 roles[ErrorString] = "errorString";
91 roles[IsErrorRole] = "error"; 94 roles[IsErrorRole] = "error";
92 roles[SenderRole] = "sender"; 95 roles[SenderRole] = "sender";
96 roles[SignatureDetails] = "signatureDetails";
93 roles[DateRole] = "date"; 97 roles[DateRole] = "date";
94 return roles; 98 return roles;
95} 99}
@@ -232,6 +236,30 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
232 //No info 236 //No info
233 return "unknown"; 237 return "unknown";
234 } 238 }
239 case SignatureDetails: {
240 auto signatureInfo = new SignatureInfo;
241
242 const auto signatureParts = messagePart->signatures();
243 if (signatureParts.size() > 1) {
244 qWarning() << "Can't deal with more than one signature";
245 }
246 for (const auto &p : signatureParts) {
247 signatureInfo->mKeyId = p->partMetaData()->keyId;
248 signatureInfo->mKeyMissing = p->partMetaData()->sigSummary & GpgME::Signature::KeyMissing;
249 signatureInfo->mKeyExpired = p->partMetaData()->sigSummary & GpgME::Signature::KeyExpired;
250 signatureInfo->mKeyRevoked = p->partMetaData()->sigSummary & GpgME::Signature::KeyRevoked;
251 signatureInfo->mSigExpired = p->partMetaData()->sigSummary & GpgME::Signature::SigExpired;
252 signatureInfo->mCrlMissing = p->partMetaData()->sigSummary & GpgME::Signature::CrlMissing;
253 signatureInfo->mCrlTooOld = p->partMetaData()->sigSummary & GpgME::Signature::CrlTooOld;
254 signatureInfo->mSigner = p->partMetaData()->signer;
255 signatureInfo->mSignClass = p->partMetaData()->signClass;
256 signatureInfo->mSignerMailAddresses = p->partMetaData()->signerMailAddresses;
257 signatureInfo->mSignatureIsGood = p->partMetaData()->isGoodSignature;
258 signatureInfo->mKeyIsTrusted = p->partMetaData()->keyTrust & GpgME::Signature::Full ||
259 p->partMetaData()->keyTrust & GpgME::Signature::Ultimate;
260 }
261 return QVariant::fromValue(signatureInfo);
262 }
235 case ErrorType: 263 case ErrorType:
236 return messagePart->error(); 264 return messagePart->error();
237 case ErrorString: { 265 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:
45 IsSignedRole, 45 IsSignedRole,
46 IsErrorRole, 46 IsErrorRole,
47 SecurityLevelRole, 47 SecurityLevelRole,
48 SignatureDetails,
49 EncryptionDetails,
48 ErrorType, 50 ErrorType,
49 ErrorString, 51 ErrorString,
50 SenderRole, 52 SenderRole,
@@ -62,3 +64,36 @@ private:
62 std::unique_ptr<PartModelPrivate> d; 64 std::unique_ptr<PartModelPrivate> d;
63}; 65};
64 66
67class SignatureInfo : public QObject
68{
69 Q_OBJECT
70 Q_PROPERTY(QByteArray keyId MEMBER mKeyId CONSTANT)
71 Q_PROPERTY(bool keyMissing MEMBER mKeyMissing CONSTANT)
72 Q_PROPERTY(bool keyRevoked MEMBER mKeyRevoked CONSTANT)
73 Q_PROPERTY(bool keyExpired MEMBER mKeyExpired CONSTANT)
74 Q_PROPERTY(bool sigExpired MEMBER mSigExpired CONSTANT)
75 Q_PROPERTY(bool crlMissing MEMBER mCrlMissing CONSTANT)
76 Q_PROPERTY(bool crlTooOld MEMBER mCrlTooOld CONSTANT)
77
78 Q_PROPERTY(QString signer MEMBER mSigner CONSTANT)
79 Q_PROPERTY(QString signClass MEMBER mSignClass CONSTANT)
80 Q_PROPERTY(QStringList signerMailAddresses MEMBER mSignerMailAddresses CONSTANT)
81 Q_PROPERTY(bool signatureIsGood MEMBER mSignatureIsGood CONSTANT)
82 Q_PROPERTY(bool keyIsTrusted MEMBER mKeyIsTrusted CONSTANT)
83
84public:
85 bool mKeyRevoked = false;
86 bool mKeyExpired = false;
87 bool mSigExpired = false;
88 bool mKeyMissing = false;
89 bool mCrlMissing = false;
90 bool mCrlTooOld = false;
91 QByteArray mKeyId;
92
93 QString mSigner;
94 QString mSignClass;
95 QStringList mSignerMailAddresses;
96 bool mSignatureIsGood = false;
97 bool mKeyIsTrusted = false;
98};
99