From a29eae612c79d23c9916345d76b6753aab8f7e16 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 25 Apr 2018 21:20:40 +0200 Subject: Starting to isolate our gpgme++ usage. So we can destroy it. --- .../src/domain/mime/mimetreeparser/messagepart.cpp | 90 ++++++++++++++-------- .../src/domain/mime/mimetreeparser/messagepart.h | 2 +- .../domain/mime/mimetreeparser/objecttreeparser.h | 1 - framework/src/domain/mime/partmodel.cpp | 1 - 4 files changed, 57 insertions(+), 37 deletions(-) diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.cpp b/framework/src/domain/mime/mimetreeparser/messagepart.cpp index 9b677d86..f4a962f7 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.cpp +++ b/framework/src/domain/mime/mimetreeparser/messagepart.cpp @@ -59,6 +59,53 @@ static QSharedPointer gpgContext(GpgME::Protocol protocol) return ctx; } +static GpgME::VerificationResult verifyDetachedSignature(GpgME::Protocol 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) +{ + QGpgME::QByteArrayDataProvider out; + GpgME::Data wrapper(&out); + const auto result = gpgContext(protocol)->verifyOpaqueSignature(fromBA(signature), wrapper); + outdata = out.data(); + return result; +} + + +static std::pair decryptAndVerify(GpgME::Protocol protocol, const QByteArray &ciphertext, QByteArray &outdata) +{ + QGpgME::QByteArrayDataProvider out; + GpgME::Data wrapper(&out); + const std::pair res = gpgContext(protocol)->decryptAndVerify(fromBA(ciphertext), wrapper); + outdata = out.data(); + return res; +} + +static void importKeys(GpgME::Protocol protocol, const QByteArray &certData) +{ + gpgContext(protocol)->importKeys(fromBA(certData)); +} + +static GpgME::KeyListResult listKeys(GpgME::Protocol 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 ); + } + + GpgME::Error err; + do { + keys.push_back( ctx->nextKey(err)); + } while ( !err ); + + keys.pop_back(); + + const GpgME::KeyListResult result = ctx->endKeyListing(); + ctx->cancelPendingOperation(); + return result; +} + //------MessagePart----------------------- MessagePart::MessagePart(ObjectTreeParser *otp, const QString &text, KMime::Content *node) @@ -670,7 +717,7 @@ QString AlternativeMessagePart::htmlContent() const CertMessagePart::CertMessagePart(ObjectTreeParser *otp, KMime::Content *node, const GpgME::Protocol cryptoProto) : MessagePart(otp, QString(), node) - , mCryptoProto(cryptoProto) + , mProtocol(cryptoProto) { if (!mNode) { qCWarning(MIMETREEPARSER_LOG) << "not a valid node"; @@ -686,8 +733,7 @@ CertMessagePart::~CertMessagePart() void CertMessagePart::import() { const QByteArray certData = mNode->decodedContent(); - auto ctx = gpgContext(mCryptoProto); - const auto result = ctx->importKeys(fromBA(certData)); + importKeys(mProtocol, certData); } QString CertMessagePart::text() const @@ -753,23 +799,6 @@ QString prettifyDN(const char *uid) return QGpgME::DN(uid).prettyDN(); } -static GpgME::KeyListResult listKeys(GpgME::Context * ctx, const char *pattern, bool secretOnly, std::vector &keys) { - if (const GpgME::Error err = ctx->startKeyListing(pattern, secretOnly)) { - return GpgME::KeyListResult( 0, err ); - } - - GpgME::Error err; - do { - keys.push_back( ctx->nextKey(err)); - } while ( !err ); - - keys.pop_back(); - - const GpgME::KeyListResult result = ctx->endKeyListing(); - ctx->cancelPendingOperation(); - return result; -} - void SignedMessagePart::sigStatusToMetaData(const GpgME::Signature &signature) { GpgME::Key key; @@ -779,10 +808,9 @@ void SignedMessagePart::sigStatusToMetaData(const GpgME::Signature &signature) mMetaData.sigSummary = signature.summary(); if (mMetaData.isGoodSignature && !key.keyID()) { - auto ctx = gpgContext(mProtocol); // Search for the key by its fingerprint so that we can check for trust etc. std::vector found_keys; - auto res = listKeys(ctx.data(), signature.fingerprint(), false, found_keys); + auto res = listKeys(mProtocol, signature.fingerprint(), false, found_keys); if (res.error()) { qCDebug(MIMETREEPARSER_LOG) << "Error while searching key for Fingerprint: " << signature.fingerprint(); } @@ -875,16 +903,13 @@ void SignedMessagePart::startVerificationDetached(const QByteArray &text, KMime: mMetaData.status = tr("Wrong Crypto Plug-In."); mMetaData.status_code = GPGME_SIG_STAT_NONE; - auto ctx = gpgContext(mProtocol); - if (!signature.isEmpty()) { - auto result = ctx->verifyDetachedSignature(fromBA(signature), fromBA(text)); + auto result = verifyDetachedSignature(mProtocol, signature, text); setVerificationResult(result, false, text); } else { - QGpgME::QByteArrayDataProvider out; - GpgME::Data outdata(&out); - auto result = ctx->verifyOpaqueSignature(fromBA(text), outdata); - setVerificationResult(result, false, out.data()); + QByteArray outdata; + auto result = verifyOpaqueSignature(mProtocol, text, outdata); + setVerificationResult(result, false, outdata); } if (!mMetaData.isSigned) { @@ -1000,11 +1025,8 @@ bool EncryptedMessagePart::okDecryptMIME(KMime::Content &data) mMetaData.auditLog.clear(); const QByteArray ciphertext = data.decodedContent(); - auto ctx = gpgContext(mProtocol); - QGpgME::QByteArrayDataProvider out; - GpgME::Data outdata(&out); - const std::pair res = ctx->decryptAndVerify(fromBA(ciphertext), outdata); - const QByteArray &plainText = out.data(); + QByteArray plainText; + const auto res = decryptAndVerify(mProtocol, ciphertext, plainText); const GpgME::DecryptionResult &decryptResult = res.first; const GpgME::VerificationResult &verifyResult = res.second; mMetaData.isSigned = verifyResult.signatures().size() > 0; diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.h b/framework/src/domain/mime/mimetreeparser/messagepart.h index 8cd74717..b2714f09 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.h +++ b/framework/src/domain/mime/mimetreeparser/messagepart.h @@ -269,7 +269,7 @@ public: void import(); private: - const GpgME::Protocol mCryptoProto; + const GpgME::Protocol mProtocol; friend class DefaultRendererPrivate; }; diff --git a/framework/src/domain/mime/mimetreeparser/objecttreeparser.h b/framework/src/domain/mime/mimetreeparser/objecttreeparser.h index 695d5356..ad67205b 100644 --- a/framework/src/domain/mime/mimetreeparser/objecttreeparser.h +++ b/framework/src/domain/mime/mimetreeparser/objecttreeparser.h @@ -37,7 +37,6 @@ #include "nodehelper.h" #include "messagepart.h" -#include #include class QString; diff --git a/framework/src/domain/mime/partmodel.cpp b/framework/src/domain/mime/partmodel.cpp index 4583e2a6..7b90ca8b 100644 --- a/framework/src/domain/mime/partmodel.cpp +++ b/framework/src/domain/mime/partmodel.cpp @@ -25,7 +25,6 @@ #include #include -#include #include class PartModelPrivate -- cgit v1.2.3