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"