Cpp: Add support for all EncryptionFlags
[gpgme.git] / lang / cpp / src / context.h
1 /*
2   context.h - wraps a gpgme key context
3   Copyright (C) 2003, 2007 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_CONTEXT_H__
25 #define __GPGMEPP_CONTEXT_H__
26
27 #include "global.h"
28
29 #include "error.h"
30 #include "verificationresult.h" // for Signature::Notation
31
32 #include <memory>
33 #include <vector>
34 #include <utility>
35 #include <iosfwd>
36
37 namespace GpgME
38 {
39
40 class Key;
41 class Data;
42 class TrustItem;
43 class ProgressProvider;
44 class PassphraseProvider;
45 class EventLoopInteractor;
46 class EditInteractor;
47 class AssuanTransaction;
48
49 class AssuanResult;
50 class KeyListResult;
51 class KeyGenerationResult;
52 class ImportResult;
53 class DecryptionResult;
54 class VerificationResult;
55 class SigningResult;
56 class EncryptionResult;
57 class VfsMountResult;
58
59 class EngineInfo;
60
61 class GPGMEPP_EXPORT Context
62 {
63     explicit Context(gpgme_ctx_t);
64 public:
65     //using GpgME::Protocol;
66
67     //
68     // Creation and destruction:
69     //
70
71     static Context *createForProtocol(Protocol proto);
72     static std::unique_ptr<Context> createForEngine(Engine engine, Error *err = 0);
73     virtual ~Context();
74
75     //
76     // Context Attributes
77     //
78
79     Protocol protocol() const;
80
81     void setArmor(bool useArmor);
82     bool armor() const;
83
84     void setTextMode(bool useTextMode);
85     bool textMode() const;
86
87     void setOffline(bool useOfflineMode);
88     bool offline() const;
89
90     enum CertificateInclusion {
91         DefaultCertificates = -256,
92         AllCertificatesExceptRoot = -2,
93         AllCertificates = -1,
94         NoCertificates = 0,
95         OnlySenderCertificate = 1
96     };
97     void setIncludeCertificates(int which);
98     int includeCertificates() const;
99
100     //using GpgME::KeyListMode;
101     void setKeyListMode(unsigned int keyListMode);
102     void addKeyListMode(unsigned int keyListMode);
103     unsigned int keyListMode() const;
104
105     void setPassphraseProvider(PassphraseProvider *provider);
106     PassphraseProvider *passphraseProvider() const;
107
108     void setProgressProvider(ProgressProvider *provider);
109     ProgressProvider *progressProvider() const;
110
111     void setManagedByEventLoopInteractor(bool managed);
112     bool managedByEventLoopInteractor() const;
113
114     GpgME::Error setLocale(int category, const char *value);
115
116     EngineInfo engineInfo() const;
117     GpgME::Error setEngineFileName(const char *filename);
118     GpgME::Error setEngineHomeDirectory(const char *filename);
119
120     enum PinentryMode{
121         PinentryDefault = 0,
122         PinentryAsk = 1,
123         PinentryCancel = 2,
124         PinentryError = 3,
125         PinentryLoopback = 4
126     };
127     GpgME::Error setPinentryMode(PinentryMode which);
128     PinentryMode pinentryMode() const;
129
130 private:
131     friend class ::GpgME::EventLoopInteractor;
132     void installIOCallbacks(gpgme_io_cbs *iocbs);
133     void uninstallIOCallbacks();
134
135 public:
136     //
137     //
138     // Key Management
139     //
140     //
141
142     //
143     // Key Listing
144     //
145
146     GpgME::Error startKeyListing(const char *pattern = 0, bool secretOnly = false);
147     GpgME::Error startKeyListing(const char *patterns[], bool secretOnly = false);
148
149     Key nextKey(GpgME::Error &e);
150
151     KeyListResult endKeyListing();
152     KeyListResult keyListResult() const;
153
154     Key key(const char *fingerprint, GpgME::Error &e, bool secret = false);
155
156     //
157     // Key Generation
158     //
159
160     KeyGenerationResult generateKey(const char *parameters, Data &pubKey);
161     GpgME::Error startKeyGeneration(const char *parameters, Data &pubkey);
162     KeyGenerationResult keyGenerationResult() const;
163
164     //
165     // Key Export
166     //
167
168     GpgME::Error exportPublicKeys(const char *pattern, Data &keyData);
169     GpgME::Error exportPublicKeys(const char *pattern[], Data &keyData);
170     GpgME::Error startPublicKeyExport(const char *pattern, Data &keyData);
171     GpgME::Error startPublicKeyExport(const char *pattern[], Data &keyData);
172
173     //
174     // Key Import
175     //
176
177     ImportResult importKeys(const Data &data);
178     ImportResult importKeys(const std::vector<Key> &keys);
179     GpgME::Error startKeyImport(const Data &data);
180     GpgME::Error startKeyImport(const std::vector<Key> &keys);
181     ImportResult importResult() const;
182
183     //
184     // Key Deletion
185     //
186
187     GpgME::Error deleteKey(const Key &key, bool allowSecretKeyDeletion = false);
188     GpgME::Error startKeyDeletion(const Key &key, bool allowSecretKeyDeletion = false);
189
190     //
191     // Passphrase changing
192     //
193
194     GpgME::Error passwd(const Key &key);
195     GpgME::Error startPasswd(const Key &key);
196
197     //
198     // Key Editing
199     //
200
201     GpgME::Error edit(const Key &key, std::unique_ptr<EditInteractor> function, Data &out);
202     GpgME::Error startEditing(const Key &key, std::unique_ptr<EditInteractor> function, Data &out);
203
204     EditInteractor *lastEditInteractor() const;
205     std::unique_ptr<EditInteractor> takeLastEditInteractor();
206
207     //
208     // SmartCard Editing
209     //
210
211     GpgME::Error cardEdit(const Key &key, std::unique_ptr<EditInteractor> function, Data &out);
212     GpgME::Error startCardEditing(const Key &key, std::unique_ptr<EditInteractor> function, Data &out);
213
214     EditInteractor *lastCardEditInteractor() const;
215     std::unique_ptr<EditInteractor> takeLastCardEditInteractor();
216
217     //
218     // Trust Item Management
219     //
220
221     GpgME::Error startTrustItemListing(const char *pattern, int maxLevel);
222     TrustItem nextTrustItem(GpgME::Error &e);
223     GpgME::Error endTrustItemListing();
224
225     //
226     // Assuan Transactions
227     //
228
229     AssuanResult assuanTransact(const char *command, std::unique_ptr<AssuanTransaction> transaction);
230     AssuanResult assuanTransact(const char *command);
231     GpgME::Error startAssuanTransaction(const char *command, std::unique_ptr<AssuanTransaction> transaction);
232     GpgME::Error startAssuanTransaction(const char *command);
233     AssuanResult assuanResult() const;
234
235     AssuanTransaction *lastAssuanTransaction() const;
236     std::unique_ptr<AssuanTransaction> takeLastAssuanTransaction();
237
238     //
239     //
240     // Crypto Operations
241     //
242     //
243
244     //
245     // Decryption
246     //
247
248     DecryptionResult decrypt(const Data &cipherText, Data &plainText);
249     GpgME::Error startDecryption(const Data &cipherText, Data &plainText);
250     DecryptionResult decryptionResult() const;
251
252     //
253     // Signature Verification
254     //
255
256     VerificationResult verifyDetachedSignature(const Data &signature, const Data &signedText);
257     VerificationResult verifyOpaqueSignature(const Data &signedData, Data &plainText);
258     GpgME::Error startDetachedSignatureVerification(const Data &signature, const Data &signedText);
259     GpgME::Error startOpaqueSignatureVerification(const Data &signedData, Data &plainText);
260     VerificationResult verificationResult() const;
261
262     //
263     // Combined Decryption and Signature Verification
264     //
265
266     std::pair<DecryptionResult, VerificationResult> decryptAndVerify(const Data &cipherText, Data &plainText);
267     GpgME::Error startCombinedDecryptionAndVerification(const Data &cipherText, Data &plainText);
268     // use verificationResult() and decryptionResult() to retrieve the result objects...
269
270     //
271     // Signing
272     //
273
274     void clearSigningKeys();
275     GpgME::Error addSigningKey(const Key &signer);
276     Key signingKey(unsigned int index) const;
277     std::vector<Key> signingKeys() const;
278
279     void clearSignatureNotations();
280     GpgME::Error addSignatureNotation(const char *name, const char *value, unsigned int flags = 0);
281     GpgME::Error addSignaturePolicyURL(const char *url, bool critical = false);
282     const char *signaturePolicyURL() const;
283     Notation signatureNotation(unsigned int index) const;
284     std::vector<Notation> signatureNotations() const;
285
286     //using GpgME::SignatureMode;
287     SigningResult sign(const Data &plainText, Data &signature, SignatureMode mode);
288     GpgME::Error startSigning(const Data &plainText, Data &signature, SignatureMode mode);
289     SigningResult signingResult() const;
290
291     //
292     // Encryption
293     //
294
295     enum EncryptionFlags {
296         None = 0,
297         AlwaysTrust = 1,
298         NoEncryptTo = 2,
299         Prepare = 4,
300         ExpectSign = 8,
301         NoCompress = 16,
302         Symmetric = 32
303     };
304     EncryptionResult encrypt(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags);
305     GpgME::Error encryptSymmetrically(const Data &plainText, Data &cipherText);
306     GpgME::Error startEncryption(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags);
307     EncryptionResult encryptionResult() const;
308
309     //
310     // Combined Signing and Encryption
311     //
312
313     std::pair<SigningResult, EncryptionResult> signAndEncrypt(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags);
314     GpgME::Error startCombinedSigningAndEncryption(const std::vector<Key> &recipients, const Data &plainText, Data &cipherText, EncryptionFlags flags);
315     // use encryptionResult() and signingResult() to retrieve the result objects...
316
317     //
318     //
319     // Audit Log
320     //
321     //
322     enum AuditLogFlags {
323         HtmlAuditLog = 1,
324         AuditLogWithHelp = 128
325     };
326     GpgME::Error startGetAuditLog(Data &output, unsigned int flags = 0);
327     GpgME::Error getAuditLog(Data &output, unsigned int flags = 0);
328
329     //
330     //
331     // G13 crypto container operations
332     //
333     //
334     GpgME::Error createVFS(const char *containerFile, const std::vector<Key> &recipients);
335     VfsMountResult mountVFS(const char *containerFile, const char *mountDir);
336
337     //
338     //
339     // Run Control
340     //
341     //
342
343     bool poll();
344     GpgME::Error wait();
345     GpgME::Error lastError() const;
346     GpgME::Error cancelPendingOperation();
347
348     class Private;
349     const Private *impl() const
350     {
351         return d;
352     }
353     Private *impl()
354     {
355         return d;
356     }
357 private:
358     Private *const d;
359
360 private: // disable...
361     Context(const Context &);
362     const Context &operator=(const Context &);
363 };
364
365 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Context::CertificateInclusion incl);
366 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Context::EncryptionFlags flags);
367 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Context::AuditLogFlags flags);
368
369 } // namespace GpgME
370
371 #endif // __GPGMEPP_CONTEXT_H__