diff options
author | Rémi Nicole <nicole@kolabsystems.com> | 2018-03-09 13:32:10 +0100 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2018-03-09 13:32:24 +0100 |
commit | d5b5c33a0cb3fbe02d011a14f2028249220b0656 (patch) | |
tree | db0ebb30db599a6889ea6066ec33bf5f862c8444 /framework/src/domain/mime/mailcrypto.h | |
parent | 93e9c10d1894797b5826bbdfcc324f4235c9e193 (diff) | |
download | kube-d5b5c33a0cb3fbe02d011a14f2028249220b0656.tar.gz kube-d5b5c33a0cb3fbe02d011a14f2028249220b0656.zip |
Automatic key import / export + Expected monad
Summary:
There are many things going on here (perhaps a bit much for a single patch):
- When an attachment is of mime type "application/pgp-keys", a button is added to import the key to GPG
- When sending a mail and crypto is enabled (encryption, signing or both), the public key of the first private key found is sent as an un-encrypted attachment (T6994)
- The `mailcrypto.{h,cpp}` was, for the most part, rewritten
- Introduction of the expected monad, inspired by what was proposed for C++ [here](https://isocpp.org/files/papers/n4015.pdf), but not at all a strict implementation of this specification. We may want to add some more features of this standard later.
The rationale for some of the choices:
- I found mailcrypto a bit hard to edit to add new features, and a great part was commented code to prepare for the support the SMIME crypto format, which would (in my current knowledge) not be used for sending emails.
- One thing I found that may be missing in the code base was a standardized way of handling errors in C++ code. Since exceptions are disabled I think that the functional way is the way to go. After some research I found the Expected monad / tagged union / sum type, which seemed to suit the problem particularly well.
In the long run, I hope we would move the entire code base to use `Expected` to indicate if a function might fail.
Of course every choice made here is to be considered as a proposition for doing things / RFC, critics wholeheartedly accepted.
Reviewers: cmollekopf
Tags: #kube
Maniphest Tasks: T6994, T8147, T6995
Differential Revision: https://phabricator.kde.org/D11158
Diffstat (limited to 'framework/src/domain/mime/mailcrypto.h')
-rw-r--r-- | framework/src/domain/mime/mailcrypto.h | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/framework/src/domain/mime/mailcrypto.h b/framework/src/domain/mime/mailcrypto.h index 0a6c2f4c..832f68ec 100644 --- a/framework/src/domain/mime/mailcrypto.h +++ b/framework/src/domain/mime/mailcrypto.h | |||
@@ -19,19 +19,24 @@ | |||
19 | 19 | ||
20 | #pragma once | 20 | #pragma once |
21 | 21 | ||
22 | #include <QByteArray> | 22 | #include "framework/src/errors.h" |
23 | |||
23 | #include <KMime/Message> | 24 | #include <KMime/Message> |
24 | #include <gpgme++/key.h> | 25 | #include <gpgme++/key.h> |
26 | |||
27 | #include <QByteArray> | ||
28 | |||
25 | #include <functional> | 29 | #include <functional> |
30 | #include <memory> | ||
31 | |||
32 | namespace MailCrypto { | ||
33 | |||
34 | Expected<GpgME::Error, std::unique_ptr<KMime::Content>> | ||
35 | processCrypto(std::unique_ptr<KMime::Content> content, const std::vector<GpgME::Key> &signingKeys, | ||
36 | const std::vector<GpgME::Key> &encryptionKeys, const GpgME::Key &attachedKey); | ||
37 | |||
38 | std::vector<GpgME::Key> findKeys(const QStringList &filter, bool findPrivate = false, bool remote = false); | ||
39 | |||
40 | void importKeys(const std::vector<GpgME::Key> &keys); | ||
26 | 41 | ||
27 | namespace MailCrypto | 42 | }; // namespace MailCrypto |
28 | { | ||
29 | enum Protocol { | ||
30 | OPENPGP, | ||
31 | SMIME | ||
32 | }; | ||
33 | KMime::Content *processCrypto(KMime::Content *content, const std::vector<GpgME::Key> &signingKeys, const std::vector<GpgME::Key> &encryptionKeys, MailCrypto::Protocol protocol); | ||
34 | KMime::Content *sign(KMime::Content *content, const std::vector<GpgME::Key> &signers); | ||
35 | std::vector<GpgME::Key> findKeys(const QStringList &filter, bool findPrivate = false, bool remote = false, Protocol protocol = OPENPGP); | ||
36 | void importKeys(const std::vector<GpgME::Key> &keys); | ||
37 | }; | ||