Add minimalistic protected-headers support
[gpgol.git] / src / cryptcontroller.h
1 /* @file cryptcontroller.h
2  * @brief Helper to handle sign and encrypt
3  *
4  * Copyright (C) 2018 Intevation GmbH
5  *
6  * This file is part of GpgOL.
7  *
8  * GpgOL is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * GpgOL is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, see <http://www.gnu.org/licenses/>.
20  */
21 #ifndef CRYPTCONTROLLER_H
22 #define CRYPTCONTROLLER_H
23
24 #ifdef HAVE_CONFIG_H
25 #include <config.h>
26 #endif
27
28 #include <gpgme++/data.h>
29
30 class Mail;
31 class Overlay;
32
33 namespace GpgME
34 {
35   class SigningResult;
36   class Error;
37 } // namespace GpgME
38
39 class CryptController
40 {
41 public:
42   /** @brief Construct a Crypthelper for a Mail object. */
43   CryptController (Mail *mail, bool encrypt, bool sign,
44                    GpgME::Protocol proto);
45   ~CryptController ();
46
47   /** @brief Collect the data from the mail into the internal
48       data structures.
49
50       @returns 0 on success.
51       */
52   int collect_data ();
53
54   /** @brief Does the actual crypto work according to op.
55       Can be called in a different thread then the UI Thread.
56
57       An operational error is returned in the passed err
58       variable.
59
60       @returns 0 on success.
61   */
62   int do_crypto (GpgME::Error &err);
63
64   /** @brief Update the MAPI structure of the mail with
65     the result. */
66   int update_mail_mapi ();
67
68   /** @brief Get an inline body as std::string. */
69   std::string get_inline_data ();
70
71   /** @brief Get the protocol. Valid after do_crypto. */
72   GpgME::Protocol get_protocol () const { return m_proto; }
73
74   /** @brief check weather something was encrypted. */
75   bool is_encrypter () const { return m_encrypt; }
76
77 private:
78   int resolve_keys ();
79   int resolve_keys_cached ();
80   int parse_output (GpgME::Data &resolverOutput);
81   int lookup_fingerprints (const std::string &sigFpr,
82                            const std::vector<std::string> recpFprs);
83
84   void parse_micalg (const GpgME::SigningResult &sResult);
85
86   void start_crypto_overlay ();
87
88 private:
89   Mail *m_mail;
90   GpgME::Data m_input, m_bodyInput, m_signedData, m_output;
91   std::string m_micalg;
92   bool m_encrypt, m_sign, m_crypto_success;
93   GpgME::Protocol m_proto;
94   GpgME::Key m_signer_key;
95   std::vector<GpgME::Key> m_recipients;
96   std::unique_ptr<Overlay> m_overlay;
97   std::vector<std::string> m_recipient_addrs;
98 };
99
100 #endif