File indexing completed on 2024-06-23 05:19:21

0001 /*
0002   SPDX-FileCopyrightText: 2014-2024 Laurent Montel <montel@kde.org>
0003 
0004   SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "verifydetachedbodypartmemento.h"
0008 
0009 #include <QGpgME/KeyListJob>
0010 #include <QGpgME/VerifyDetachedJob>
0011 
0012 #include <gpgme++/keylistresult.h>
0013 
0014 #include <cassert>
0015 
0016 using namespace QGpgME;
0017 using namespace GpgME;
0018 using namespace MimeTreeParser;
0019 
0020 VerifyDetachedBodyPartMemento::VerifyDetachedBodyPartMemento(VerifyDetachedJob *job, KeyListJob *klj, const QByteArray &signature, const QByteArray &plainText)
0021     : CryptoBodyPartMemento()
0022     , m_signature(signature)
0023     , m_plainText(plainText)
0024     , m_job(job)
0025     , m_keylistjob(klj)
0026 {
0027     assert(m_job);
0028 }
0029 
0030 VerifyDetachedBodyPartMemento::~VerifyDetachedBodyPartMemento()
0031 {
0032     if (m_job) {
0033         m_job->slotCancel();
0034     }
0035     if (m_keylistjob) {
0036         m_keylistjob->slotCancel();
0037     }
0038 }
0039 
0040 bool VerifyDetachedBodyPartMemento::start()
0041 {
0042     assert(m_job);
0043 #ifdef DEBUG_SIGNATURE
0044     qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento started";
0045 #endif
0046     connect(m_job.data(), &VerifyDetachedJob::result, this, &VerifyDetachedBodyPartMemento::slotResult);
0047     if (const Error err = m_job->start(m_signature, m_plainText)) {
0048         m_vr = VerificationResult(err);
0049 #ifdef DEBUG_SIGNATURE
0050         qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento stopped with error";
0051 #endif
0052         return false;
0053     }
0054     setRunning(true);
0055     return true;
0056 }
0057 
0058 void VerifyDetachedBodyPartMemento::exec()
0059 {
0060     assert(m_job);
0061     setRunning(true);
0062 #ifdef DEBUG_SIGNATURE
0063     qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento execed";
0064 #endif
0065     saveResult(m_job->exec(m_signature, m_plainText));
0066     m_job->deleteLater(); // exec'ed jobs don't delete themselves
0067     m_job = nullptr;
0068 #ifdef DEBUG_SIGNATURE
0069     qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento after execed";
0070 #endif
0071     if (canStartKeyListJob()) {
0072         std::vector<GpgME::Key> keys;
0073         m_keylistjob->exec(keyListPattern(), /*secretOnly=*/false, keys);
0074         if (!keys.empty()) {
0075             m_key = keys.back();
0076         }
0077     }
0078     if (m_keylistjob) {
0079         m_keylistjob->deleteLater(); // exec'ed jobs don't delete themselves
0080     }
0081     m_keylistjob = nullptr;
0082     setRunning(false);
0083 }
0084 
0085 bool VerifyDetachedBodyPartMemento::canStartKeyListJob() const
0086 {
0087     if (!m_keylistjob) {
0088         return false;
0089     }
0090     const char *const fpr = m_vr.signature(0).fingerprint();
0091     return fpr && *fpr;
0092 }
0093 
0094 QStringList VerifyDetachedBodyPartMemento::keyListPattern() const
0095 {
0096     assert(canStartKeyListJob());
0097     return QStringList(QString::fromLatin1(m_vr.signature(0).fingerprint()));
0098 }
0099 
0100 void VerifyDetachedBodyPartMemento::saveResult(const VerificationResult &vr)
0101 {
0102     assert(m_job);
0103 #ifdef DEBUG_SIGNATURE
0104     qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento::saveResult called";
0105 #endif
0106     m_vr = vr;
0107     setAuditLog(m_job->auditLogError(), m_job->auditLogAsHtml());
0108 }
0109 
0110 void VerifyDetachedBodyPartMemento::slotResult(const VerificationResult &vr)
0111 {
0112 #ifdef DEBUG_SIGNATURE
0113     qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento::slotResult called";
0114 #endif
0115     saveResult(vr);
0116     m_job = nullptr;
0117     if (canStartKeyListJob() && startKeyListJob()) {
0118 #ifdef DEBUG_SIGNATURE
0119         qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento: canStartKeyListJob && startKeyListJob";
0120 #endif
0121         return;
0122     }
0123     if (m_keylistjob) {
0124         m_keylistjob->deleteLater();
0125     }
0126     m_keylistjob = nullptr;
0127     setRunning(false);
0128     notify();
0129 }
0130 
0131 bool VerifyDetachedBodyPartMemento::startKeyListJob()
0132 {
0133     assert(canStartKeyListJob());
0134     if (const GpgME::Error err = m_keylistjob->start(keyListPattern())) {
0135         return false;
0136     }
0137     connect(m_keylistjob.data(), &Job::done, this, &VerifyDetachedBodyPartMemento::slotKeyListJobDone);
0138     connect(m_keylistjob.data(), &KeyListJob::nextKey, this, &VerifyDetachedBodyPartMemento::slotNextKey);
0139     return true;
0140 }
0141 
0142 void VerifyDetachedBodyPartMemento::slotNextKey(const GpgME::Key &key)
0143 {
0144 #ifdef DEBUG_SIGNATURE
0145     qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento::slotNextKey called";
0146 #endif
0147     m_key = key;
0148 }
0149 
0150 void VerifyDetachedBodyPartMemento::slotKeyListJobDone()
0151 {
0152 #ifdef DEBUG_SIGNATURE
0153     qCDebug(MIMETREEPARSER_LOG) << "tokoe: VerifyDetachedBodyPartMemento::slotKeyListJobDone called";
0154 #endif
0155     m_keylistjob = nullptr;
0156     setRunning(false);
0157     notify();
0158 }
0159 
0160 #include "moc_verifydetachedbodypartmemento.cpp"