Fix two encoding issues
[gpgol.git] / src / keycache.h
1 #ifndef KEYCACHE_H
2 #define KEYCACHE_H
3
4 /* @file keycache.h
5  * @brief Internal keycache
6  *
7  * Copyright (C) 2018 Intevation GmbH
8  *
9  * This file is part of GpgOL.
10  *
11  * GpgOL is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * GpgOL is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * along with this program; if not, see <http://www.gnu.org/licenses/>.
23  */
24
25 #include "config.h"
26
27 #include <memory>
28 #include <vector>
29
30 #include <gpgme++/global.h>
31
32 namespace GpgME
33 {
34   class Key;
35 };
36
37 class Mail;
38
39 class KeyCache
40 {
41 protected:
42     /** Internal ctor */
43     explicit KeyCache ();
44
45 public:
46     /** Get the KeyCache */
47     static KeyCache* instance ();
48
49     /* Try to find a key for signing in the internal secret key
50        cache. If no proper key is found a Null key is
51        returned.*/
52     GpgME::Key getSigningKey (const char *addr, GpgME::Protocol proto) const;
53
54     /* Get the keys for recipents. The keys
55        are taken from the internal cache. If
56        one recipient can't be resolved an empty
57        list is returned.
58        */
59     std::vector<GpgME::Key> getEncryptionKeys (const std::vector<std::string> &recipients,
60                                                GpgME::Protocol proto) const;
61
62     /* Start a key location in a background thread filling
63        the key cache.
64
65        The mail argument is used to add / remove the
66        locator thread counter.
67
68        async
69        */
70     void startLocate (const std::vector<std::string> &addrs, Mail *mail) const;
71
72     /* Look for a secret key for the addr.
73
74        async
75     */
76     void startLocateSecret (const char *addr, Mail *mail) const;
77
78     /* Start a key location in a background thread filling
79        the key cache.
80
81        async
82        */
83     void startLocate (const char *addr, Mail *mail) const;
84
85     /* Check that a mail is resolvable through the keycache.
86      *
87      * For OpenPGP only the recipients are checked as we can
88      * generate a new key for the sender.
89      **/
90     bool isMailResolvable (Mail *mail);
91
92     /* Search / Update a key in the cache. This is meant to be
93        called e.g. after a verify to update the key.
94
95        async
96
97        A known issue is that a get right after it might
98        still return an outdated key but the get after that
99        would return the updated one. This is acceptable as
100        it only poses a minor problem with TOFU while we
101        can show the correct state in the tooltip. */
102     void update (const char *fpr, GpgME::Protocol proto);
103
104     /* Get a cached key. If block is true it will block
105        if the key is currently searched for.
106
107        This function will not search a key. Call update
108        to insert keys into the cache */
109     GpgME::Key getByFpr (const char *fpr, bool block = true) const;
110
111     /* Import key data from the address book for the address mbox.
112        Keys imported this way take precedence over other keys for
113        this mail address regardless of validity.
114
115        The mail argument is used to add / remove the
116        locator thread counter.
117
118        async
119     */
120     void importFromAddrBook (const std::string &mbox,
121                              const char *key_data,
122                              Mail *mail) const;
123
124     // Internal for thread
125     void setSmimeKey(const std::string &mbox, const GpgME::Key &key);
126     void setPgpKey(const std::string &mbox, const GpgME::Key &key);
127     void setSmimeKeySecret(const std::string &mbox, const GpgME::Key &key);
128     void setPgpKeySecret(const std::string &mbox, const GpgME::Key &key);
129     void onUpdateJobDone(const char *fpr, const GpgME::Key &key);
130     void onAddrBookImportJobDone (const std::string &fpr,
131                                   const std::vector<std::string> &result_fprs);
132
133 private:
134
135     class Private;
136     std::shared_ptr<Private> d;
137 };
138
139 #endif