Cpp / Qt: Reduce boost usage (memory and tuple)
[gpgme.git] / lang / cpp / src / key.h
1 /*
2   key.h - wraps a gpgme key
3   Copyright (C) 2003, 2005 Klarälvdalens Datakonsult AB
4
5   This file is part of GPGME++.
6
7   GPGME++ is free software; you can redistribute it and/or
8   modify it under the terms of the GNU Library General Public
9   License as published by the Free Software Foundation; either
10   version 2 of the License, or (at your option) any later version.
11
12   GPGME++ is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU Library General Public License for more details.
16
17   You should have received a copy of the GNU Library General Public License
18   along with GPGME++; see the file COPYING.LIB.  If not, write to the
19   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20   Boston, MA 02110-1301, USA.
21 */
22
23 // -*- c++ -*-
24 #ifndef __GPGMEPP_KEY_H__
25 #define __GPGMEPP_KEY_H__
26
27 #include "global.h"
28 #include "notation.h"
29
30 #include "gpgmefw.h"
31
32 #include <memory>
33 #include <sys/time.h>
34
35 #include <vector>
36 #include <algorithm>
37 #include <string>
38
39 namespace GpgME
40 {
41
42 class Context;
43
44 class Subkey;
45 class UserID;
46
47 typedef std::shared_ptr< std::remove_pointer<gpgme_key_t>::type > shared_gpgme_key_t;
48
49 //
50 // class Key
51 //
52
53 class GPGMEPP_EXPORT Key
54 {
55     friend class ::GpgME::Context;
56     struct Null {
57                 Null() {}
58         };
59 public:
60     Key();
61     /* implicit */ Key(const Null &);
62     Key(const shared_gpgme_key_t &key);
63     Key(gpgme_key_t key, bool acquireRef);
64
65     static const Null null;
66
67     const Key &operator=(Key other)
68     {
69         swap(other);
70         return *this;
71     }
72
73     const Key &mergeWith(const Key &other);
74
75     void swap(Key &other)
76     {
77         using std::swap;
78         swap(this->key, other.key);
79     }
80
81     bool isNull() const
82     {
83         return !key;
84     }
85
86     UserID userID(unsigned int index) const;
87     Subkey subkey(unsigned int index) const;
88
89     unsigned int numUserIDs() const;
90     unsigned int numSubkeys() const;
91
92     std::vector<UserID> userIDs() const;
93     std::vector<Subkey> subkeys() const;
94
95     bool isRevoked() const;
96     bool isExpired() const;
97     bool isDisabled() const;
98     bool isInvalid() const;
99
100     bool canEncrypt() const;
101     /*!
102       This function contains a workaround for old gpgme's: all secret
103       OpenPGP keys canSign() == true, which canReallySign() doesn't
104       have. I don't have time to find what breaks when I remove this
105       workaround, but since Kleopatra merges secret into public keys,
106       the workaround is not necessary there (and actively harms), I've
107       added a new function instead.
108      */
109     bool canSign() const;
110     bool canReallySign() const;
111     bool canCertify() const;
112     bool canAuthenticate() const;
113     bool isQualified() const;
114
115     bool hasSecret() const;
116     GPGMEPP_DEPRECATED bool isSecret() const
117     {
118         return hasSecret();
119     }
120
121     /*!
122       @return true if this is a X.509 root certificate (currently
123       equivalent to something like
124       strcmp( chainID(), subkey(0).fingerprint() ) == 0 )
125     */
126     bool isRoot() const;
127
128     enum OwnerTrust { Unknown = 0, Undefined = 1, Never = 2,
129                       Marginal = 3, Full = 4, Ultimate = 5
130                     };
131
132     OwnerTrust ownerTrust() const;
133     char ownerTrustAsString() const;
134
135     Protocol protocol() const;
136     const char *protocolAsString() const;
137
138     const char *issuerSerial() const;
139     const char *issuerName() const;
140     const char *chainID() const;
141
142     const char *keyID() const;
143     const char *shortKeyID() const;
144     const char *primaryFingerprint() const;
145
146     unsigned int keyListMode() const;
147
148 private:
149     gpgme_key_t impl() const
150     {
151         return key.get();
152     }
153     shared_gpgme_key_t key;
154 };
155
156 //
157 // class Subkey
158 //
159
160 class GPGMEPP_EXPORT Subkey
161 {
162 public:
163     Subkey();
164     Subkey(const shared_gpgme_key_t &key, gpgme_sub_key_t subkey);
165     Subkey(const shared_gpgme_key_t &key, unsigned int idx);
166
167     const Subkey &operator=(Subkey other)
168     {
169         swap(other);
170         return *this;
171     }
172
173     void swap(Subkey &other)
174     {
175         using std::swap;
176         swap(this->key, other.key);
177         swap(this->subkey, other.subkey);
178     }
179
180     bool isNull() const
181     {
182         return !key || !subkey;
183     }
184
185     Key parent() const;
186
187     const char *keyID() const;
188     const char *fingerprint() const;
189
190     time_t creationTime() const;
191     time_t expirationTime() const;
192     bool neverExpires() const;
193
194     bool isRevoked() const;
195     bool isExpired() const;
196     bool isInvalid() const;
197     bool isDisabled() const;
198
199     bool canEncrypt() const;
200     bool canSign() const;
201     bool canCertify() const;
202     bool canAuthenticate() const;
203     bool isQualified() const;
204     bool isCardKey() const;
205
206     bool isSecret() const;
207
208     unsigned int publicKeyAlgorithm() const;
209     const char *publicKeyAlgorithmAsString() const;
210
211     unsigned int length() const;
212
213     const char *cardSerialNumber() const;
214
215 private:
216     shared_gpgme_key_t key;
217     gpgme_sub_key_t subkey;
218 };
219
220 //
221 // class UserID
222 //
223
224 class GPGMEPP_EXPORT UserID
225 {
226 public:
227     class Signature;
228
229     UserID();
230     UserID(const shared_gpgme_key_t &key, gpgme_user_id_t uid);
231     UserID(const shared_gpgme_key_t &key, unsigned int idx);
232
233     const UserID &operator=(UserID other)
234     {
235         swap(other);
236         return *this;
237     }
238
239     void swap(UserID &other)
240     {
241         using std::swap;
242         swap(this->key, other.key);
243         swap(this->uid, other.uid);
244     }
245
246     bool isNull() const
247     {
248         return !key || !uid;
249     }
250
251     Key parent() const;
252
253     unsigned int numSignatures() const;
254     Signature signature(unsigned int index) const;
255     std::vector<Signature> signatures() const;
256
257     const char *id() const;
258     const char *name() const;
259     const char *email() const;
260     const char *comment() const;
261
262     enum Validity { Unknown = 0, Undefined = 1, Never = 2,
263                     Marginal = 3, Full = 4, Ultimate = 5
264                   };
265
266     Validity validity() const;
267     char validityAsString() const;
268
269     bool isRevoked() const;
270     bool isInvalid() const;
271
272 private:
273     shared_gpgme_key_t key;
274     gpgme_user_id_t uid;
275 };
276
277 //
278 // class UserID::Signature
279 //
280
281 class GPGMEPP_EXPORT UserID::Signature
282 {
283 public:
284     typedef GPGMEPP_DEPRECATED GpgME::Notation Notation;
285
286     Signature();
287     Signature(const shared_gpgme_key_t &key, gpgme_user_id_t uid, gpgme_key_sig_t sig);
288     Signature(const shared_gpgme_key_t &key, gpgme_user_id_t uid, unsigned int idx);
289
290     const Signature &operator=(Signature other)
291     {
292         swap(other);
293         return *this;
294     }
295
296     void swap(Signature &other)
297     {
298         using std::swap;
299         swap(this->key, other.key);
300         swap(this->uid, other.uid);
301         swap(this->sig, other.sig);
302     }
303
304     bool isNull() const
305     {
306         return !sig || !uid || !key ;
307     }
308
309     UserID parent() const;
310
311     const char *signerKeyID() const;
312
313     const char *algorithmAsString() const;
314     unsigned int algorithm() const;
315     time_t creationTime() const;
316     time_t expirationTime() const;
317     bool neverExpires() const;
318
319     bool isRevokation() const;
320     bool isInvalid() const;
321     bool isExpired() const;
322     bool isExportable() const;
323
324     const char *signerUserID() const;
325     const char *signerName() const;
326     const char *signerEmail() const;
327     const char *signerComment() const;
328
329     unsigned int certClass() const;
330
331     enum Status { NoError = 0, SigExpired, KeyExpired,
332                   BadSignature, NoPublicKey, GeneralError
333                 };
334     Status status() const;
335     std::string statusAsString() const;
336
337     const char *policyURL() const;
338
339     unsigned int numNotations() const;
340     GpgME::Notation notation(unsigned int idx) const;
341     std::vector<GpgME::Notation> notations() const;
342
343 private:
344     shared_gpgme_key_t key;
345     gpgme_user_id_t uid;
346     gpgme_key_sig_t sig;
347 };
348
349 } // namespace GpgME
350
351 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Key)
352 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Subkey)
353 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(UserID)
354 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(UserID::Signature)
355
356 #endif // __GPGMEPP_KEY_H__