5#include "composer/autocryptkeyresolvercore.h"
7#include <Akonadi/ContactSearchJob>
8#include <MessageComposer/ContactPreference>
9#include <MessageCore/AutocryptStorage>
11#include <messagecomposer_debug.h>
15class MessageComposer::AutocryptKeyResolverCorePrivate
18 QStringList autocrypt_keys;
19 QStringList gossip_keys;
22AutocryptKeyResolverCore::AutocryptKeyResolverCore(
bool encrypt,
bool sign, GpgME::Protocol format)
23 :
Kleo::KeyResolverCore(encrypt, sign, format)
24 , d(new AutocryptKeyResolverCorePrivate)
28AutocryptKeyResolverCore::~AutocryptKeyResolverCore() =
default;
30Kleo::KeyResolverCore::Result AutocryptKeyResolverCore::resolve()
32 auto result = Kleo::KeyResolverCore::resolve();
34 if ((result.flags & Kleo::KeyResolverCore::AllResolved)) {
35 qCDebug(MESSAGECOMPOSER_LOG) <<
"We found already for all recipient keys and we don't need to add Autocrypt keys.";
39 if (!(result.flags & Kleo::KeyResolverCore::OpenPGPOnly)) {
40 qCWarning(MESSAGECOMPOSER_LOG) <<
"Autocrypt is only defined for OpenPGP not for SMIME";
44 Kleo::KeyResolver::Solution *solution = &result.solution;
46 if (solution->
protocol != GpgME::OpenPGP) {
47 solution = &result.alternative;
50 Q_ASSERT(solution->
protocol == GpgME::OpenPGP);
52 bool allResolved =
true;
53 const auto storage = MessageCore::AutocryptStorage::self();
59 if (recipient == normalizedSender()) {
64 const auto rec = storage->getRecipient(recipient.toUtf8());
65 GpgME::Key autocryptKey;
67 const auto key = rec->gpgKey();
68 if (!key.isBad() && key.canEncrypt()) {
69 d->autocrypt_keys.push_back(recipient);
70 autocryptKey = std::move(key);
72 const auto gossipKey = rec->gossipKey();
73 if (!gossipKey.isBad() && gossipKey.canEncrypt()) {
74 d->gossip_keys.push_back(recipient);
75 autocryptKey = std::move(gossipKey);
79 if (!autocryptKey.isNull()) {
80 keys.push_back(autocryptKey);
86 result.flags = Kleo::KeyResolverCore::SolutionFlags(result.flags | Kleo::KeyResolverCore::AllResolved);
87 if (solution == &result.alternative) {
88 const auto _tmp = std::move(result.solution);
89 result.solution = std::move(result.alternative);
90 result.alternative = std::move(_tmp);
97bool AutocryptKeyResolverCore::isAutocryptKey(
const QString &recipient)
const
99 return d->autocrypt_keys.contains(recipient) || isGossipKey(recipient);
102bool AutocryptKeyResolverCore::isGossipKey(
const QString &recipient)
const
104 return d->gossip_keys.contains(recipient);
Simple interface that both EncryptJob and SignEncryptJob implement so the composer can extract some e...
QList< Key > keys() const const
QMap< QString, std::vector< GpgME::Key > > encryptionKeys