From 5da025fb7d42e4c82d7f3c3a7460e2ac1b8698d0 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 26 Apr 2018 21:20:46 +0200 Subject: Less gpgme in the interfaces --- .../mimetreeparser/applicationpgpencrypted.cpp | 2 +- .../mime/mimetreeparser/applicationpkcs7mime.cpp | 8 +-- .../src/domain/mime/mimetreeparser/messagepart.cpp | 64 +++++++++++++++------- .../src/domain/mime/mimetreeparser/messagepart.h | 18 ++++-- .../mime/mimetreeparser/multipartencrypted.cpp | 6 +- .../domain/mime/mimetreeparser/multipartsigned.cpp | 10 ++-- .../src/domain/mime/mimetreeparser/partmetadata.h | 34 +++++------- framework/src/domain/mime/partmodel.cpp | 15 +++-- 8 files changed, 88 insertions(+), 69 deletions(-) diff --git a/framework/src/domain/mime/mimetreeparser/applicationpgpencrypted.cpp b/framework/src/domain/mime/mimetreeparser/applicationpgpencrypted.cpp index 122a7577..a912c9c9 100644 --- a/framework/src/domain/mime/mimetreeparser/applicationpgpencrypted.cpp +++ b/framework/src/domain/mime/mimetreeparser/applicationpgpencrypted.cpp @@ -59,7 +59,7 @@ MessagePart::Ptr ApplicationPGPEncryptedBodyPartFormatter::process(Interface::Bo } EncryptedMessagePart::Ptr mp(new EncryptedMessagePart(part.objectTreeParser(), - data->decodedText(), GpgME::OpenPGP, + data->decodedText(), OpenPGP, part.nodeHelper()->fromAsString(data), node, data)); mp->setIsEncrypted(true); return mp; diff --git a/framework/src/domain/mime/mimetreeparser/applicationpkcs7mime.cpp b/framework/src/domain/mime/mimetreeparser/applicationpkcs7mime.cpp index f65aa938..4780439b 100644 --- a/framework/src/domain/mime/mimetreeparser/applicationpkcs7mime.cpp +++ b/framework/src/domain/mime/mimetreeparser/applicationpkcs7mime.cpp @@ -24,8 +24,6 @@ #include "objecttreeparser.h" #include "messagepart.h" -#include - #include #include @@ -56,7 +54,7 @@ MessagePart::Ptr ApplicationPkcs7MimeBodyPartFormatter::process(Interface::BodyP const QString smimeType = node->contentType()->parameter(QStringLiteral("smime-type")).toLower(); if (smimeType == QLatin1String("certs-only")) { - return CertMessagePart::Ptr(new CertMessagePart(part.objectTreeParser(), node, GpgME::CMS)); + return CertMessagePart::Ptr(new CertMessagePart(part.objectTreeParser(), node, CMS)); } bool isSigned = (smimeType == QLatin1String("signed-data")); @@ -79,7 +77,7 @@ MessagePart::Ptr ApplicationPkcs7MimeBodyPartFormatter::process(Interface::BodyP } auto _mp = EncryptedMessagePart::Ptr(new EncryptedMessagePart(part.objectTreeParser(), - node->decodedText(), GpgME::CMS, + node->decodedText(), CMS, part.nodeHelper()->fromAsString(node), node)); mp = _mp; _mp->setIsEncrypted(true); @@ -125,7 +123,7 @@ MessagePart::Ptr ApplicationPkcs7MimeBodyPartFormatter::process(Interface::BodyP const QTextCodec *aCodec(part.objectTreeParser()->codecFor(signTestNode)); const QByteArray signaturetext = signTestNode->decodedContent(); auto mp = SignedMessagePart::Ptr(new SignedMessagePart(part.objectTreeParser(), - aCodec->toUnicode(signaturetext), GpgME::CMS, + aCodec->toUnicode(signaturetext), CMS, part.nodeHelper()->fromAsString(node), signTestNode, signTestNode)); } return mp; diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.cpp b/framework/src/domain/mime/mimetreeparser/messagepart.cpp index f4a962f7..9750ea9e 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.cpp +++ b/framework/src/domain/mime/mimetreeparser/messagepart.cpp @@ -47,24 +47,38 @@ static GpgME::Data fromBA(const QByteArray &ba) return {ba.data(), static_cast(ba.size()), false}; } -static QSharedPointer gpgContext(GpgME::Protocol protocol) + +static GpgME::Protocol toGpgMe(CryptoProtocol p) +{ + switch (p) { + case UnknownProtocol: + return GpgME::UnknownProtocol; + case CMS: + return GpgME::CMS; + case OpenPGP: + return GpgME::OpenPGP; + } + return GpgME::UnknownProtocol; +} + +static QSharedPointer gpgContext(CryptoProtocol protocol) { GpgME::initializeLibrary(); - auto error = GpgME::checkEngine(protocol); + auto error = GpgME::checkEngine(toGpgMe(protocol)); if (error) { qWarning() << "Engine check failed: " << error.asString(); } - auto ctx = QSharedPointer(GpgME::Context::createForProtocol(protocol)); + auto ctx = QSharedPointer(GpgME::Context::createForProtocol(toGpgMe(protocol))); Q_ASSERT(ctx); return ctx; } -static GpgME::VerificationResult verifyDetachedSignature(GpgME::Protocol protocol, const QByteArray &signature, const QByteArray &text) +static GpgME::VerificationResult verifyDetachedSignature(CryptoProtocol protocol, const QByteArray &signature, const QByteArray &text) { return gpgContext(protocol)->verifyDetachedSignature(fromBA(signature), fromBA(text)); } -static GpgME::VerificationResult verifyOpaqueSignature(GpgME::Protocol protocol, const QByteArray &signature, QByteArray &outdata) +static GpgME::VerificationResult verifyOpaqueSignature(CryptoProtocol protocol, const QByteArray &signature, QByteArray &outdata) { QGpgME::QByteArrayDataProvider out; GpgME::Data wrapper(&out); @@ -74,7 +88,7 @@ static GpgME::VerificationResult verifyOpaqueSignature(GpgME::Protocol protocol, } -static std::pair decryptAndVerify(GpgME::Protocol protocol, const QByteArray &ciphertext, QByteArray &outdata) +static std::pair decryptAndVerify(CryptoProtocol protocol, const QByteArray &ciphertext, QByteArray &outdata) { QGpgME::QByteArrayDataProvider out; GpgME::Data wrapper(&out); @@ -83,12 +97,12 @@ static std::pair decryptAndVe return res; } -static void importKeys(GpgME::Protocol protocol, const QByteArray &certData) +static void importKeys(CryptoProtocol protocol, const QByteArray &certData) { gpgContext(protocol)->importKeys(fromBA(certData)); } -static GpgME::KeyListResult listKeys(GpgME::Protocol protocol, const char *pattern, bool secretOnly, std::vector &keys) { +static GpgME::KeyListResult listKeys(CryptoProtocol protocol, const char *pattern, bool secretOnly, std::vector &keys) { auto ctx = gpgContext(protocol); if (const GpgME::Error err = ctx->startKeyListing(pattern, secretOnly)) { return GpgME::KeyListResult( 0, err ); @@ -464,7 +478,7 @@ void TextMessagePart::parseContent() auto body = mNode->decodedContent(); const auto blocks = prepareMessageForDecryption(body); - const auto cryptProto = GpgME::OpenPGP; + const auto cryptProto = OpenPGP; if (!blocks.isEmpty()) { @@ -715,7 +729,7 @@ QString AlternativeMessagePart::htmlContent() const //-----CertMessageBlock---------------------- -CertMessagePart::CertMessagePart(ObjectTreeParser *otp, KMime::Content *node, const GpgME::Protocol cryptoProto) +CertMessagePart::CertMessagePart(ObjectTreeParser *otp, KMime::Content *node, const CryptoProtocol cryptoProto) : MessagePart(otp, QString(), node) , mProtocol(cryptoProto) { @@ -744,7 +758,7 @@ QString CertMessagePart::text() const //-----SignedMessageBlock--------------------- SignedMessagePart::SignedMessagePart(ObjectTreeParser *otp, const QString &text, - const GpgME::Protocol cryptoProto, + const CryptoProtocol cryptoProto, const QString &fromAddress, KMime::Content *node, KMime::Content *signedData) : MessagePart(otp, text, node) @@ -754,7 +768,8 @@ SignedMessagePart::SignedMessagePart(ObjectTreeParser *otp, { mMetaData.isSigned = true; mMetaData.isGoodSignature = false; - mMetaData.keyTrust = GpgME::Signature::Unknown; + //FIXME + // mMetaData.keyTrust = GpgME::Signature::Unknown; mMetaData.status = tr("Wrong Crypto Plug-In."); mMetaData.status_code = GPGME_SIG_STAT_NONE; } @@ -805,7 +820,13 @@ void SignedMessagePart::sigStatusToMetaData(const GpgME::Signature &signature) mMetaData.status_code = signatureToStatus(signature); mMetaData.isGoodSignature = mMetaData.status_code & GPGME_SIG_STAT_GOOD; // save extended signature status flags - mMetaData.sigSummary = signature.summary(); + auto summary = signature.summary(); + mMetaData.keyMissing = summary & GpgME::Signature::KeyMissing; + mMetaData.keyExpired = summary & GpgME::Signature::KeyExpired; + mMetaData.keyRevoked = summary & GpgME::Signature::KeyRevoked; + mMetaData.sigExpired = summary & GpgME::Signature::SigExpired; + mMetaData.crlMissing = summary & GpgME::Signature::CrlMissing; + mMetaData.crlTooOld = summary & GpgME::Signature::CrlTooOld; if (mMetaData.isGoodSignature && !key.keyID()) { // Search for the key by its fingerprint so that we can check for trust etc. @@ -832,7 +853,8 @@ void SignedMessagePart::sigStatusToMetaData(const GpgME::Signature &signature) if (mMetaData.keyId.isEmpty()) { mMetaData.keyId = signature.fingerprint(); } - mMetaData.keyTrust = signature.validity(); + auto keyTrust = signature.validity(); + mMetaData.keyIsTrusted = keyTrust & GpgME::Signature::Full || keyTrust & GpgME::Signature::Ultimate; if (key.numUserIDs() > 0 && key.userID(0).id()) { mMetaData.signer = prettifyDN(key.userID(0).id()); } @@ -899,7 +921,8 @@ void SignedMessagePart::startVerificationDetached(const QByteArray &text, KMime: } mMetaData.isSigned = false; - mMetaData.keyTrust = GpgME::Signature::Unknown; + //FIXME + // mMetaData.keyTrust = GpgME::Signature::Unknown; mMetaData.status = tr("Wrong Crypto Plug-In."); mMetaData.status_code = GPGME_SIG_STAT_NONE; @@ -920,7 +943,8 @@ void SignedMessagePart::startVerificationDetached(const QByteArray &text, KMime: void SignedMessagePart::setVerificationResult(const GpgME::VerificationResult &result, bool parseText, const QByteArray &plainText) { auto signatures = result.signatures(); - mMetaData.auditLogError = result.error(); + // FIXME + // mMetaData.auditLogError = result.error(); if (!signatures.empty()) { mMetaData.isSigned = true; sigStatusToMetaData(signatures.front()); @@ -955,7 +979,7 @@ QString SignedMessagePart::htmlContent() const //-----CryptMessageBlock--------------------- EncryptedMessagePart::EncryptedMessagePart(ObjectTreeParser *otp, const QString &text, - const GpgME::Protocol cryptoProto, + const CryptoProtocol cryptoProto, const QString &fromAddress, KMime::Content *node, KMime::Content *encryptedNode) : MessagePart(otp, text, node) @@ -967,7 +991,8 @@ EncryptedMessagePart::EncryptedMessagePart(ObjectTreeParser *otp, mMetaData.isGoodSignature = false; mMetaData.isEncrypted = false; mMetaData.isDecryptable = false; - mMetaData.keyTrust = GpgME::Signature::Unknown; + //FIXME + // mMetaData.keyTrust = GpgME::Signature::Unknown; mMetaData.status = tr("Wrong Crypto Plug-In."); mMetaData.status_code = GPGME_SIG_STAT_NONE; } @@ -1021,7 +1046,8 @@ bool EncryptedMessagePart::okDecryptMIME(KMime::Content &data) { mError = NoError; mMetaData.errorText.clear(); - mMetaData.auditLogError = GpgME::Error(); + //FIXME + // mMetaData.auditLogError = GpgME::Error(); mMetaData.auditLog.clear(); const QByteArray ciphertext = data.decodedContent(); diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.h b/framework/src/domain/mime/mimetreeparser/messagepart.h index b2714f09..31864ee5 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.h +++ b/framework/src/domain/mime/mimetreeparser/messagepart.h @@ -57,6 +57,12 @@ class MultiPartAlternativeBodyPartFormatter; class SignedMessagePart; class EncryptedMessagePart; +enum CryptoProtocol { + UnknownProtocol, + OpenPGP, + CMS +}; + class MessagePart : public QObject { Q_OBJECT @@ -262,14 +268,14 @@ class CertMessagePart : public MessagePart Q_OBJECT public: typedef QSharedPointer Ptr; - CertMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, const GpgME::Protocol cryptoProto); + CertMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, const CryptoProtocol cryptoProto); virtual ~CertMessagePart(); QString text() const Q_DECL_OVERRIDE; void import(); private: - const GpgME::Protocol mProtocol; + const CryptoProtocol mProtocol; friend class DefaultRendererPrivate; }; @@ -298,7 +304,7 @@ public: typedef QSharedPointer Ptr; EncryptedMessagePart(ObjectTreeParser *otp, const QString &text, - const GpgME::Protocol protocol, + const CryptoProtocol protocol, const QString &fromAddress, KMime::Content *node, KMime::Content *encryptedNode = nullptr); @@ -327,7 +333,7 @@ private: bool okDecryptMIME(KMime::Content &data); protected: - const GpgME::Protocol mProtocol; + const CryptoProtocol mProtocol; QString mFromAddress; QByteArray mVerifiedText; std::vector mDecryptRecipients; @@ -345,7 +351,7 @@ public: typedef QSharedPointer Ptr; SignedMessagePart(ObjectTreeParser *otp, const QString &text, - const GpgME::Protocol protocol, + const CryptoProtocol protocol, const QString &fromAddress, KMime::Content *node, KMime::Content *signedData); @@ -367,7 +373,7 @@ private: void setVerificationResult(const GpgME::VerificationResult &result, bool parseText, const QByteArray &plainText); protected: - GpgME::Protocol mProtocol; + CryptoProtocol mProtocol; QString mFromAddress; KMime::Content *mSignedData; diff --git a/framework/src/domain/mime/mimetreeparser/multipartencrypted.cpp b/framework/src/domain/mime/mimetreeparser/multipartencrypted.cpp index 30fe4bc0..2e36366c 100644 --- a/framework/src/domain/mime/mimetreeparser/multipartencrypted.cpp +++ b/framework/src/domain/mime/mimetreeparser/multipartencrypted.cpp @@ -49,18 +49,18 @@ MessagePart::Ptr MultiPartEncryptedBodyPartFormatter::process(Interface::BodyPar return MessagePart::Ptr(); } - GpgME::Protocol useThisCryptProto = GpgME::UnknownProtocol; + CryptoProtocol useThisCryptProto = UnknownProtocol; /* ATTENTION: This code is to be replaced by the new 'auto-detect' feature. -------------------------------------- */ KMime::Content *data = findTypeInDirectChilds(node, "application/octet-stream"); if (data) { - useThisCryptProto = GpgME::OpenPGP; + useThisCryptProto = OpenPGP; } else { data = findTypeInDirectChilds(node, "application/pkcs7-mime"); if (data) { - useThisCryptProto = GpgME::CMS; + useThisCryptProto = CMS; } } /* diff --git a/framework/src/domain/mime/mimetreeparser/multipartsigned.cpp b/framework/src/domain/mime/mimetreeparser/multipartsigned.cpp index 5c00e7dc..b511afce 100644 --- a/framework/src/domain/mime/mimetreeparser/multipartsigned.cpp +++ b/framework/src/domain/mime/mimetreeparser/multipartsigned.cpp @@ -24,8 +24,6 @@ #include -#include - #include "mimetreeparser_debug.h" #include @@ -67,16 +65,16 @@ MessagePart::Ptr MultiPartSignedBodyPartFormatter::process(Interface::BodyPart & protocolContentType = signatureContentType; } - GpgME::Protocol protocol = GpgME::UnknownProtocol; + CryptoProtocol protocol = UnknownProtocol; if (protocolContentType == QLatin1String("application/pkcs7-signature") || protocolContentType == QLatin1String("application/x-pkcs7-signature")) { - protocol = GpgME::CMS; + protocol = CMS; } else if (protocolContentType == QLatin1String("application/pgp-signature") || protocolContentType == QLatin1String("application/x-pgp-signature")) { - protocol = GpgME::OpenPGP; + protocol = OpenPGP; } - if (protocol == GpgME::UnknownProtocol) { + if (protocol == UnknownProtocol) { return MessagePart::Ptr(new MimeMessagePart(part.objectTreeParser(), signedData, false)); } diff --git a/framework/src/domain/mime/mimetreeparser/partmetadata.h b/framework/src/domain/mime/mimetreeparser/partmetadata.h index 813ef4cb..44a9cf7e 100644 --- a/framework/src/domain/mime/mimetreeparser/partmetadata.h +++ b/framework/src/domain/mime/mimetreeparser/partmetadata.h @@ -16,8 +16,6 @@ #ifndef __MIMETREEPARSER_PARTMETADATA_H__ #define __MIMETREEPARSER_PARTMETADATA_H__ -#include - #include #include @@ -27,35 +25,29 @@ namespace MimeTreeParser class PartMetaData { public: - PartMetaData() - : sigSummary(GpgME::Signature::None), - isSigned(false), - isGoodSignature(false), - isEncrypted(false), - isDecryptable(false), - technicalProblem(false), - isEncapsulatedRfc822Message(false) - { - } - GpgME::Signature::Summary sigSummary; + bool keyMissing = false; + bool keyExpired = false; + bool keyRevoked = false; + bool sigExpired = false; + bool crlMissing = false; + bool crlTooOld = false; QString signClass; QString signer; QStringList signerMailAddresses; QByteArray keyId; - GpgME::Signature::Validity keyTrust; + bool keyIsTrusted = false; QString status; // to be used for unknown plug-ins int status_code; // to be used for i18n of OpenPGP and S/MIME CryptPlugs QString errorText; QDateTime creationTime; QString decryptionError; QString auditLog; - GpgME::Error auditLogError; - bool isSigned : 1; - bool isGoodSignature : 1; - bool isEncrypted : 1; - bool isDecryptable : 1; - bool technicalProblem : 1; - bool isEncapsulatedRfc822Message : 1; + bool isSigned = false; + bool isGoodSignature =false; + bool isEncrypted = false; + bool isDecryptable = false; + bool technicalProblem = false; + bool isEncapsulatedRfc822Message = false; }; } diff --git a/framework/src/domain/mime/partmodel.cpp b/framework/src/domain/mime/partmodel.cpp index 7b90ca8b..da2802c6 100644 --- a/framework/src/domain/mime/partmodel.cpp +++ b/framework/src/domain/mime/partmodel.cpp @@ -160,18 +160,17 @@ SignatureInfo *signatureInfo(MimeTreeParser::MessagePart *messagePart) } for (const auto &p : signatureParts) { signatureInfo->keyId = p->partMetaData()->keyId; - signatureInfo->keyMissing = p->partMetaData()->sigSummary & GpgME::Signature::KeyMissing; - signatureInfo->keyExpired = p->partMetaData()->sigSummary & GpgME::Signature::KeyExpired; - signatureInfo->keyRevoked = p->partMetaData()->sigSummary & GpgME::Signature::KeyRevoked; - signatureInfo->sigExpired = p->partMetaData()->sigSummary & GpgME::Signature::SigExpired; - signatureInfo->crlMissing = p->partMetaData()->sigSummary & GpgME::Signature::CrlMissing; - signatureInfo->crlTooOld = p->partMetaData()->sigSummary & GpgME::Signature::CrlTooOld; + signatureInfo->keyMissing = p->partMetaData()->keyMissing; + signatureInfo->keyExpired = p->partMetaData()->keyExpired; + signatureInfo->keyRevoked = p->partMetaData()->keyRevoked; + signatureInfo->sigExpired = p->partMetaData()->sigExpired; + signatureInfo->crlMissing = p->partMetaData()->crlMissing; + signatureInfo->crlTooOld = p->partMetaData()->crlTooOld; signatureInfo->signer = p->partMetaData()->signer; signatureInfo->signClass = p->partMetaData()->signClass; signatureInfo->signerMailAddresses = p->partMetaData()->signerMailAddresses; signatureInfo->signatureIsGood = p->partMetaData()->isGoodSignature; - signatureInfo->keyIsTrusted = p->partMetaData()->keyTrust & GpgME::Signature::Full || - p->partMetaData()->keyTrust & GpgME::Signature::Ultimate; + signatureInfo->keyIsTrusted = p->partMetaData()->keyIsTrusted; } return signatureInfo; } -- cgit v1.2.3