From 0bde2f020dd602ca360f394cd56d3973e857b5cc Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 22 Nov 2017 16:47:08 +0100 Subject: Find signing keys --- framework/src/domain/composercontroller.cpp | 17 ++++++++++++++++- framework/src/domain/composercontroller.h | 3 +++ framework/src/domain/mime/mailcrypto.cpp | 27 +++++++++++++++++++++++++++ framework/src/domain/mime/mailcrypto.h | 5 +++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/framework/src/domain/composercontroller.cpp b/framework/src/domain/composercontroller.cpp index 2a82f0e1..d2b65d06 100644 --- a/framework/src/domain/composercontroller.cpp +++ b/framework/src/domain/composercontroller.cpp @@ -36,6 +36,7 @@ #include "identitiesmodel.h" #include "recepientautocompletionmodel.h" #include "mime/mailtemplates.h" +#include "mime/mailcrypto.h" class IdentitySelector : public Selector { public: @@ -170,9 +171,17 @@ ComposerController::ComposerController() QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSendAction); QObject::connect(this, &ComposerController::subjectChanged, &ComposerController::updateSaveAsDraftAction); QObject::connect(this, &ComposerController::accountIdChanged, &ComposerController::updateSaveAsDraftAction); + QObject::connect(this, &ComposerController::identityChanged, &ComposerController::findPersonalKey); updateSendAction(); } +void ComposerController::findPersonalKey() +{ + auto identity = getIdentity(); + SinkLog() << "Looking for personal key for: " << identity.address(); + mPersonalKeys = MailCrypto::findKeys(QStringList{} << identity.address(), true); +} + void ComposerController::clear() { Controller::clear(); @@ -465,7 +474,13 @@ KMime::Message::Ptr ComposerController::assembleMessage() item->data(ContentRole).toByteArray() }; } - return MailTemplates::createMessage(mExistingMessage, mToModel->stringList(), mCcModel->stringList(), mBccModel->stringList(), getIdentity(), getSubject(), getBody(), getHtmlBody(), attachments); + + std::vector signingKeys; + if (getSign()) { + signingKeys = mPersonalKeys; + } + + return MailTemplates::createMessage(mExistingMessage, mToModel->stringList(), mCcModel->stringList(), mBccModel->stringList(), getIdentity(), getSubject(), getBody(), getHtmlBody(), attachments, signingKeys); } void ComposerController::updateSendAction() diff --git a/framework/src/domain/composercontroller.h b/framework/src/domain/composercontroller.h index 1a355b9a..3a0d4878 100644 --- a/framework/src/domain/composercontroller.h +++ b/framework/src/domain/composercontroller.h @@ -28,6 +28,7 @@ #include #include #include +#include #include "completer.h" #include "selector.h" @@ -111,6 +112,7 @@ public slots: private slots: void updateSendAction(); void updateSaveAsDraftAction(); + void findPersonalKey(); private: enum AttachmentRoles { @@ -135,4 +137,5 @@ private: QSharedPointer mCcModel; QSharedPointer mBccModel; QScopedPointer mAttachmentModel; + std::vector mPersonalKeys; }; diff --git a/framework/src/domain/mime/mailcrypto.cpp b/framework/src/domain/mime/mailcrypto.cpp index ad161a63..19e81b4f 100644 --- a/framework/src/domain/mime/mailcrypto.cpp +++ b/framework/src/domain/mime/mailcrypto.cpp @@ -22,8 +22,10 @@ #include "mailcrypto.h" #include #include +#include #include #include +#include #include /* @@ -452,3 +454,28 @@ KMime::Content *MailCrypto::sign(KMime::Content *content, const std::vector MailCrypto::findKeys(const QStringList &filter, bool findPrivate, Protocol protocol) +{ + const QGpgME::Protocol *const backend = protocol == SMIME ? QGpgME::smime() : QGpgME::openpgp(); + Q_ASSERT(backend); + QGpgME::KeyListJob *job = backend->keyListJob(false); + Q_ASSERT(job); + + std::vector keys; + GpgME::KeyListResult res = job->exec(filter, findPrivate, keys); + + Q_ASSERT(!res.error()); + + qWarning() << "got keys:" << keys.size(); + + for (std::vector< GpgME::Key >::iterator i = keys.begin(); i != keys.end(); ++i) { + qWarning() << "key isnull:" << i->isNull() << "isexpired:" << i->isExpired(); + qWarning() << "key numuserIds:" << i->numUserIDs(); + for (uint k = 0; k < i->numUserIDs(); ++k) { + qWarning() << "userIDs:" << i->userID(k).email(); + } + } + + return keys; +} + diff --git a/framework/src/domain/mime/mailcrypto.h b/framework/src/domain/mime/mailcrypto.h index 2261182d..badf1005 100644 --- a/framework/src/domain/mime/mailcrypto.h +++ b/framework/src/domain/mime/mailcrypto.h @@ -26,5 +26,10 @@ namespace MailCrypto { + enum Protocol { + OPENPGP, + SMIME + }; KMime::Content *sign(KMime::Content *content, const std::vector &signers); + std::vector findKeys(const QStringList &filter, bool findPrivate = false, Protocol protocol = OPENPGP); }; -- cgit v1.2.3