diff options
-rw-r--r-- | components/mailviewer/contents/ui/MailDataModel.qml | 28 | ||||
-rw-r--r-- | framework/src/domain/mime/partmodel.cpp | 28 | ||||
-rw-r--r-- | framework/src/domain/mime/partmodel.h | 35 |
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 | |||
29 | class PartModelPrivate | 32 | class PartModelPrivate |
30 | { | 33 | { |
31 | public: | 34 | public: |
@@ -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 | ||
67 | class 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 | |||
84 | public: | ||
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 | |||