From 86f565e12bc3ef6aa2e1da0582480b9dd282c673 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 7 Dec 2017 16:46:22 +0100 Subject: Simplified verifySignature --- .../src/domain/mime/mimetreeparser/messagepart.cpp | 136 ++++++++------------- .../src/domain/mime/mimetreeparser/messagepart.h | 7 +- 2 files changed, 51 insertions(+), 92 deletions(-) diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.cpp b/framework/src/domain/mime/mimetreeparser/messagepart.cpp index a4fc7265..89e71a68 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.cpp +++ b/framework/src/domain/mime/mimetreeparser/messagepart.cpp @@ -700,95 +700,18 @@ bool SignedMessagePart::isSigned() const return mMetaData.isSigned; } -bool SignedMessagePart::okVerify(const QByteArray &data, const QByteArray &signature, KMime::Content *textNode) +CryptoBodyPartMemento *SignedMessagePart::verifySignature(const QByteArray &data, const QByteArray &signature) { - mMetaData.isSigned = false; - mMetaData.keyTrust = GpgME::Signature::Unknown; - mMetaData.status = tr("Wrong Crypto Plug-In."); - mMetaData.status_code = GPGME_SIG_STAT_NONE; - - const QByteArray mementoName = "verification"; - - //TODO for the async case remember the memento - CryptoBodyPartMemento *m = nullptr; - Q_ASSERT(!m || mCryptoProto); //No CryptoPlugin and having a bodyPartMemento -> there is something completely wrong - - if (!m && mCryptoProto) { - if (!signature.isEmpty()) { - QGpgME::VerifyDetachedJob *job = mCryptoProto->verifyDetachedJob(); - if (job) { - m = new VerifyDetachedBodyPartMemento(job, mCryptoProto->keyListJob(), signature, data); - } - } else { - QGpgME::VerifyOpaqueJob *job = mCryptoProto->verifyOpaqueJob(); - if (job) { - m = new VerifyOpaqueBodyPartMemento(job, mCryptoProto->keyListJob(), data); - } - } - if (m) { - // if (mOtp->allowAsync()) { - // QObject::connect(m, &CryptoBodyPartMemento::update, - // nodeHelper, &NodeHelper::update); - // // QObject::connect(m, SIGNAL(update(MimeTreeParser::UpdateMode)), - // // _source->sourceObject(), SLOT(update(MimeTreeParser::UpdateMode))); - - // if (m->start()) { - // mMetaData.inProgress = true; - // mOtp->mHasPendingAsyncJobs = true; - // } - // //FIXME delete memento once done - // } else { - m->exec(); - // } - } - //only relevant in async case - // } else if (m->isRunning()) { - // mMetaData.inProgress = true; - // mOtp->mHasPendingAsyncJobs = true; - // } else { - // mMetaData.inProgress = false; - // mOtp->mHasPendingAsyncJobs = false; - } - - if (m && !mMetaData.inProgress) { - if (!signature.isEmpty()) { - mVerifiedText = data; - } - setVerificationResult(m, textNode); - } - - if (!m && !mMetaData.inProgress) { - QString errorMsg; - QString cryptPlugLibName; - QString cryptPlugDisplayName; - if (mCryptoProto) { - cryptPlugLibName = mCryptoProto->name(); - cryptPlugDisplayName = mCryptoProto->displayName(); + if (!signature.isEmpty()) { + if (QGpgME::VerifyDetachedJob *job = mCryptoProto->verifyDetachedJob()) { + return new VerifyDetachedBodyPartMemento(job, mCryptoProto->keyListJob(), signature, data); } - - if (!mCryptoProto) { - if (cryptPlugDisplayName.isEmpty()) { - errorMsg = tr("No appropriate crypto plug-in was found."); - } else { - errorMsg = tr("%1 is either 'OpenPGP' or 'S/MIME'", - "No %1 plug-in was found.").arg( - cryptPlugDisplayName); - } - } else { - errorMsg = tr("Crypto plug-in \"%1\" cannot verify signatures.").arg( - cryptPlugLibName); + } else { + if (QGpgME::VerifyOpaqueJob *job = mCryptoProto->verifyOpaqueJob()) { + return new VerifyOpaqueBodyPartMemento(job, mCryptoProto->keyListJob(), data); } - mMetaData.errorText = tr("The message is signed, but the " - "validity of the signature cannot be " - "verified.
" - "Reason: %1").arg(errorMsg); - } - //TODO don't delete in async case - if (m) { - delete m; } - - return mMetaData.isSigned; + return nullptr; } static int signatureToStatus(const GpgME::Signature &sig) @@ -929,7 +852,48 @@ void SignedMessagePart::startVerificationDetached(const QByteArray &text, KMime: parseInternal(textNode, false); } - okVerify(text, signature, textNode); + mMetaData.isSigned = false; + mMetaData.keyTrust = GpgME::Signature::Unknown; + mMetaData.status = tr("Wrong Crypto Plug-In."); + mMetaData.status_code = GPGME_SIG_STAT_NONE; + + CryptoBodyPartMemento *m = verifySignature(text, signature); + m->exec(); + + if (m && !mMetaData.inProgress) { + if (!signature.isEmpty()) { + mVerifiedText = text; + } + setVerificationResult(m, textNode); + } + + if (!m && !mMetaData.inProgress) { + QString errorMsg; + QString cryptPlugLibName; + QString cryptPlugDisplayName; + if (mCryptoProto) { + cryptPlugLibName = mCryptoProto->name(); + cryptPlugDisplayName = mCryptoProto->displayName(); + } + + if (!mCryptoProto) { + if (cryptPlugDisplayName.isEmpty()) { + errorMsg = tr("No appropriate crypto plug-in was found."); + } else { + errorMsg = tr("%1 is either 'OpenPGP' or 'S/MIME'", + "No %1 plug-in was found.").arg( + cryptPlugDisplayName); + } + } else { + errorMsg = tr("Crypto plug-in \"%1\" cannot verify signatures.").arg( + cryptPlugLibName); + } + mMetaData.errorText = tr("The message is signed, but the " + "validity of the signature cannot be " + "verified.
" + "Reason: %1").arg(errorMsg); + } + delete m; if (!mMetaData.isSigned) { mMetaData.creationTime = QDateTime(); diff --git a/framework/src/domain/mime/mimetreeparser/messagepart.h b/framework/src/domain/mime/mimetreeparser/messagepart.h index 5cd186e6..2e0aac21 100644 --- a/framework/src/domain/mime/mimetreeparser/messagepart.h +++ b/framework/src/domain/mime/mimetreeparser/messagepart.h @@ -373,12 +373,7 @@ public: QString htmlContent() const Q_DECL_OVERRIDE; private: - /** Handles the verification of data - * If signature is empty it is handled as inline signature otherwise as detached signature mode. - * Returns true if the verfication was successfull and the block is signed. - * If used in async mode, check if mMetaData.inProgress is true, it inicates a running verification process. - */ - bool okVerify(const QByteArray &data, const QByteArray &signature, KMime::Content *textNode); + CryptoBodyPartMemento *verifySignature(const QByteArray &data, const QByteArray &signature); void sigStatusToMetaData(); -- cgit v1.2.3