diff --git a/messagecomposer/src/composer/composer.cpp b/messagecomposer/src/composer/composer.cpp --- a/messagecomposer/src/composer/composer.cpp +++ b/messagecomposer/src/composer/composer.cpp @@ -274,6 +274,7 @@ seJob->setSigningKeys(signers); seJob->setEncryptionKeys(recipients.second); seJob->setRecipients(recipients.first); + seJob->setSkeletonMessage(skeletonMessage); subJob = seJob; } else { diff --git a/messagecomposer/src/job/signencryptjob.h b/messagecomposer/src/job/signencryptjob.h --- a/messagecomposer/src/job/signencryptjob.h +++ b/messagecomposer/src/job/signencryptjob.h @@ -57,12 +57,18 @@ void setEncryptionKeys(const std::vector &keys) override; void setRecipients(const QStringList &rec) override; + void setSkeletonMessage(KMime::Message *skeletonMessage); + + void setProtectedHeaders(bool protectedHeaders); + void setProtectedHeadersObvoscate(bool protectedHeadersObvoscate); + Q_REQUIRED_RESULT std::vector encryptionKeys() const override; Q_REQUIRED_RESULT QStringList recipients() const override; Q_REQUIRED_RESULT KMime::Content *origContent(); protected Q_SLOTS: + void doStart() override; void process() override; private: diff --git a/messagecomposer/src/job/signencryptjob.cpp b/messagecomposer/src/job/signencryptjob.cpp --- a/messagecomposer/src/job/signencryptjob.cpp +++ b/messagecomposer/src/job/signencryptjob.cpp @@ -21,7 +21,7 @@ #include "job/signencryptjob.h" #include "contentjobbase_p.h" -#include "utils/util.h" +#include "job/protectedheaders.h" #include "utils/util_p.h" #include @@ -54,6 +54,10 @@ QStringList recipients; Kleo::CryptoMessageFormat format; KMime::Content *content = nullptr; + KMime::Message *skeletonMessage = nullptr; + + bool protectedHeaders = true; + bool protectedHeadersObvoscate = false; // copied from messagecomposer.cpp bool binaryHint(Kleo::CryptoMessageFormat f) @@ -130,6 +134,27 @@ d->recipients = recipients; } +void SignEncryptJob::setSkeletonMessage(KMime::Message *skeletonMessage) +{ + Q_D(SignEncryptJob); + + d->skeletonMessage = skeletonMessage; +} + +void SignEncryptJob::setProtectedHeaders(bool protectedHeaders) +{ + Q_D(SignEncryptJob); + + d->protectedHeaders = protectedHeaders; +} + +void SignEncryptJob::setProtectedHeadersObvoscate(bool protectedHeadersObvoscate) +{ + Q_D(SignEncryptJob); + + d->protectedHeadersObvoscate = protectedHeadersObvoscate; +} + QStringList SignEncryptJob::recipients() const { Q_D(const SignEncryptJob); @@ -144,6 +169,28 @@ return d->encKeys; } +void SignEncryptJob::doStart() +{ + Q_D(SignEncryptJob); + Q_ASSERT(d->resultContent == nullptr); // Not processed before. + + if (d->protectedHeaders && d->skeletonMessage && d->format & Kleo::OpenPGPMIMEFormat) { + ProtectedHeadersJob *pJob = new ProtectedHeadersJob; + pJob->setContent(d->content); + pJob->setSkeletonMessage(d->skeletonMessage); + pJob->setObvoscate(d->protectedHeadersObvoscate); + QObject::connect(pJob, &ProtectedHeadersJob::finished, this, [d, pJob](KJob *job) { + if (job->error()) { + return; + } + d->content = pJob->content(); + }); + appendSubjob(pJob); + } + + ContentJobBase::doStart(); +} + void SignEncryptJob::process() { Q_D(SignEncryptJob);