Qt: Make Protocol class public API
[gpgme.git] / lang / qt / src / protocol_p.h
1 /*
2     protocol_p.h
3
4     This file is part of qgpgme, the Qt API binding for gpgme
5     Copyright (c) 2004,2005 Klarälvdalens Datakonsult AB
6     Copyright (c) 2016 Intevation GmbH
7
8     QGpgME is free software; you can redistribute it and/or
9     modify it under the terms of the GNU General Public License as
10     published by the Free Software Foundation; either version 2 of the
11     License, or (at your option) any later version.
12
13     QGpgME 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 GNU
16     General Public License for more details.
17
18     You should have received a copy of the GNU General Public License
19     along with this program; if not, write to the Free Software
20     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21
22     In addition, as a special exception, the copyright holders give
23     permission to link the code of this program with any edition of
24     the Qt library by Trolltech AS, Norway (or with modified versions
25     of Qt that use the same license as Qt), and distribute linked
26     combinations including the two.  You must obey the GNU General
27     Public License in all respects for all of the code used other than
28     Qt.  If you modify this file, you may extend this exception to
29     your version of the file, but you are not obligated to do so.  If
30     you do not wish to do so, delete this exception statement from
31     your version.
32 */
33 #ifndef __QGPGME_PROTOCOL_P_H__
34 #define __QGPGME_PROTOCOL_P_H__
35 #include "qgpgmenewcryptoconfig.h"
36
37 #include "qgpgmekeygenerationjob.h"
38 #include "qgpgmekeylistjob.h"
39 #include "qgpgmelistallkeysjob.h"
40 #include "qgpgmedecryptjob.h"
41 #include "qgpgmedecryptverifyjob.h"
42 #include "qgpgmerefreshkeysjob.h"
43 #include "qgpgmedeletejob.h"
44 #include "qgpgmesecretkeyexportjob.h"
45 #include "qgpgmedownloadjob.h"
46 #include "qgpgmesignencryptjob.h"
47 #include "qgpgmeencryptjob.h"
48 #include "qgpgmesignjob.h"
49 #include "qgpgmesignkeyjob.h"
50 #include "qgpgmeexportjob.h"
51 #include "qgpgmeverifydetachedjob.h"
52 #include "qgpgmeimportjob.h"
53 #include "qgpgmeimportfromkeyserverjob.h"
54 #include "qgpgmeverifyopaquejob.h"
55 #include "qgpgmechangeexpiryjob.h"
56 #include "qgpgmechangeownertrustjob.h"
57 #include "qgpgmechangepasswdjob.h"
58 #include "qgpgmeadduseridjob.h"
59
60 namespace
61 {
62
63 class Protocol : public QGpgME::Protocol
64 {
65     GpgME::Protocol mProtocol;
66 public:
67     explicit Protocol(GpgME::Protocol proto) : mProtocol(proto) {}
68
69     QString name() const Q_DECL_OVERRIDE
70     {
71         switch (mProtocol) {
72         case GpgME::OpenPGP: return QStringLiteral("OpenPGP");
73         case GpgME::CMS:     return QStringLiteral("SMIME");
74         default:             return QString();
75         }
76     }
77
78     QString displayName() const Q_DECL_OVERRIDE
79     {
80         // ah (2.4.16): Where is this used and isn't this inverted
81         // with name
82         switch (mProtocol) {
83         case GpgME::OpenPGP: return QStringLiteral("gpg");
84         case GpgME::CMS:     return QStringLiteral("gpgsm");
85         default:             return QStringLiteral("unknown");
86         }
87     }
88
89     QGpgME::SpecialJob *specialJob(const char *, const QMap<QString, QVariant> &) const Q_DECL_OVERRIDE
90     {
91         return 0;
92     }
93
94     QGpgME::KeyListJob *keyListJob(bool remote, bool includeSigs, bool validate) const Q_DECL_OVERRIDE
95     {
96         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
97         if (!context) {
98             return 0;
99         }
100
101         unsigned int mode = context->keyListMode();
102         if (remote) {
103             mode |= GpgME::Extern;
104             mode &= ~GpgME::Local;
105         } else {
106             mode |= GpgME::Local;
107             mode &= ~GpgME::Extern;
108         }
109         if (includeSigs) {
110             mode |= GpgME::Signatures;
111         }
112         if (validate) {
113             mode |= GpgME::Validate;
114         }
115         context->setKeyListMode(mode);
116         return new QGpgME::QGpgMEKeyListJob(context);
117     }
118
119     QGpgME::ListAllKeysJob *listAllKeysJob(bool includeSigs, bool validate) const Q_DECL_OVERRIDE
120     {
121         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
122         if (!context) {
123             return 0;
124         }
125
126         unsigned int mode = context->keyListMode();
127         mode |= GpgME::Local;
128         mode &= ~GpgME::Extern;
129         if (includeSigs) {
130             mode |= GpgME::Signatures;
131         }
132         if (validate) {
133             mode |= GpgME::Validate;
134             /* Setting the context to offline mode disables CRL / OCSP checks in
135                this Job. Otherwise we would try to fetch the CRL's for all CMS
136                keys in the users keyring because GpgME::Validate includes remote
137                resources by default in the validity check.
138                This setting only has any effect if gpgsm >= 2.1.6 is used.
139                */
140             context->setOffline(true);
141         }
142         context->setKeyListMode(mode);
143         return new QGpgME::QGpgMEListAllKeysJob(context);
144     }
145
146     QGpgME::EncryptJob *encryptJob(bool armor, bool textmode) const Q_DECL_OVERRIDE
147     {
148         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
149         if (!context) {
150             return 0;
151         }
152
153         context->setArmor(armor);
154         context->setTextMode(textmode);
155         return new QGpgME::QGpgMEEncryptJob(context);
156     }
157
158     QGpgME::DecryptJob *decryptJob() const Q_DECL_OVERRIDE
159     {
160         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
161         if (!context) {
162             return 0;
163         }
164         return new QGpgME::QGpgMEDecryptJob(context);
165     }
166
167     QGpgME::SignJob *signJob(bool armor, bool textMode) const Q_DECL_OVERRIDE
168     {
169         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
170         if (!context) {
171             return 0;
172         }
173
174         context->setArmor(armor);
175         context->setTextMode(textMode);
176         return new QGpgME::QGpgMESignJob(context);
177     }
178
179     QGpgME::VerifyDetachedJob *verifyDetachedJob(bool textMode) const Q_DECL_OVERRIDE
180     {
181         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
182         if (!context) {
183             return 0;
184         }
185
186         context->setTextMode(textMode);
187         return new QGpgME::QGpgMEVerifyDetachedJob(context);
188     }
189
190     QGpgME::VerifyOpaqueJob *verifyOpaqueJob(bool textMode) const Q_DECL_OVERRIDE
191     {
192         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
193         if (!context) {
194             return 0;
195         }
196
197         context->setTextMode(textMode);
198         return new QGpgME::QGpgMEVerifyOpaqueJob(context);
199     }
200
201     QGpgME::KeyGenerationJob *keyGenerationJob() const Q_DECL_OVERRIDE
202     {
203         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
204         if (!context) {
205             return 0;
206         }
207         return new QGpgME::QGpgMEKeyGenerationJob(context);
208     }
209
210     QGpgME::ImportJob *importJob() const Q_DECL_OVERRIDE
211     {
212         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
213         if (!context) {
214             return 0;
215         }
216         return new QGpgME::QGpgMEImportJob(context);
217     }
218
219     QGpgME::ImportFromKeyserverJob *importFromKeyserverJob() const Q_DECL_OVERRIDE
220     {
221         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
222         if (!context) {
223             return 0;
224         }
225         return new QGpgME::QGpgMEImportFromKeyserverJob(context);
226     }
227
228     QGpgME::ExportJob *publicKeyExportJob(bool armor) const Q_DECL_OVERRIDE
229     {
230         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
231         if (!context) {
232             return 0;
233         }
234
235         context->setArmor(armor);
236         return new QGpgME::QGpgMEExportJob(context);
237     }
238
239     QGpgME::ExportJob *secretKeyExportJob(bool armor, const QString &charset) const Q_DECL_OVERRIDE
240     {
241         if (mProtocol != GpgME::CMS) { // fixme: add support for gpg, too
242             return 0;
243         }
244
245         // this operation is not supported by gpgme, so we have to call gpgsm ourselves:
246         return new QGpgME::QGpgMESecretKeyExportJob(armor, charset);
247     }
248
249     QGpgME::RefreshKeysJob *refreshKeysJob() const Q_DECL_OVERRIDE
250     {
251         if (mProtocol != GpgME::CMS) { // fixme: add support for gpg, too
252             return 0;
253         }
254
255         // this operation is not supported by gpgme, so we have to call gpgsm ourselves:
256         return new QGpgME::QGpgMERefreshKeysJob();
257     }
258
259     QGpgME::DownloadJob *downloadJob(bool armor) const Q_DECL_OVERRIDE
260     {
261         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
262         if (!context) {
263             return 0;
264         }
265
266         context->setArmor(armor);
267         // this is the hackish interface for downloading from keyserers currently:
268         context->setKeyListMode(GpgME::Extern);
269         return new QGpgME::QGpgMEDownloadJob(context);
270     }
271
272     QGpgME::DeleteJob *deleteJob() const Q_DECL_OVERRIDE
273     {
274         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
275         if (!context) {
276             return 0;
277         }
278         return new QGpgME::QGpgMEDeleteJob(context);
279     }
280
281     QGpgME::SignEncryptJob *signEncryptJob(bool armor, bool textMode) const Q_DECL_OVERRIDE
282     {
283         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
284         if (!context) {
285             return 0;
286         }
287
288         context->setArmor(armor);
289         context->setTextMode(textMode);
290         return new QGpgME::QGpgMESignEncryptJob(context);
291     }
292
293     QGpgME::DecryptVerifyJob *decryptVerifyJob(bool textMode) const Q_DECL_OVERRIDE
294     {
295         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
296         if (!context) {
297             return 0;
298         }
299
300         context->setTextMode(textMode);
301         return new QGpgME::QGpgMEDecryptVerifyJob(context);
302     }
303
304     QGpgME::ChangeExpiryJob *changeExpiryJob() const Q_DECL_OVERRIDE
305     {
306         if (mProtocol != GpgME::OpenPGP) {
307             return 0;    // only supported by gpg
308         }
309
310         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
311         if (!context) {
312             return 0;
313         }
314         return new QGpgME::QGpgMEChangeExpiryJob(context);
315     }
316
317     QGpgME::ChangePasswdJob *changePasswdJob() const Q_DECL_OVERRIDE
318     {
319         if (!GpgME::hasFeature(GpgME::PasswdFeature, 0)) {
320             return 0;
321         }
322         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
323         if (!context) {
324             return 0;
325         }
326         return new QGpgME::QGpgMEChangePasswdJob(context);
327     }
328
329     QGpgME::SignKeyJob *signKeyJob() const Q_DECL_OVERRIDE
330     {
331         if (mProtocol != GpgME::OpenPGP) {
332             return 0;    // only supported by gpg
333         }
334
335         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
336         if (!context) {
337             return 0;
338         }
339         return new QGpgME::QGpgMESignKeyJob(context);
340     }
341
342     QGpgME::ChangeOwnerTrustJob *changeOwnerTrustJob() const Q_DECL_OVERRIDE
343     {
344         if (mProtocol != GpgME::OpenPGP) {
345             return 0;    // only supported by gpg
346         }
347
348         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
349         if (!context) {
350             return 0;
351         }
352         return new QGpgME::QGpgMEChangeOwnerTrustJob(context);
353     }
354
355     QGpgME::AddUserIDJob *addUserIDJob() const Q_DECL_OVERRIDE
356     {
357         if (mProtocol != GpgME::OpenPGP) {
358             return 0;    // only supported by gpg
359         }
360
361         GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
362         if (!context) {
363             return 0;
364         }
365         return new QGpgME::QGpgMEAddUserIDJob(context);
366     }
367
368 };
369
370 }
371 #endif