QGpgME 16.1.0.0000485
Qt API for GpgME
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 by Bundesamt für Sicherheit in der Informationstechnik
7 Software engineering by Intevation GmbH
8 Copyright (c) 2022 by g10 Code GmbH
9 Software engineering by Ingo Klöcker <dev@ingo-kloecker.de>
10
11 QGpgME is free software; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License as
13 published by the Free Software Foundation; either version 2 of the
14 License, or (at your option) any later version.
15
16 QGpgME 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 GNU
19 General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
25 In addition, as a special exception, the copyright holders give
26 permission to link the code of this program with any edition of
27 the Qt library by Trolltech AS, Norway (or with modified versions
28 of Qt that use the same license as Qt), and distribute linked
29 combinations including the two. You must obey the GNU General
30 Public License in all respects for all of the code used other than
31 Qt. If you modify this file, you may extend this exception to
32 your version of the file, but you are not obligated to do so. If
33 you do not wish to do so, delete this exception statement from
34 your version.
35*/
36#ifndef __QGPGME_PROTOCOL_P_H__
37#define __QGPGME_PROTOCOL_P_H__
38#include "qgpgmenewcryptoconfig.h"
39
40#include "qgpgmekeygenerationjob.h"
41#include "qgpgmekeylistjob.h"
42#include "qgpgmelistallkeysjob.h"
43#include "qgpgmedecryptjob.h"
44#include "qgpgmedecryptverifyjob.h"
45#include "qgpgmerefreshsmimekeysjob.h"
46#include "qgpgmedeletejob.h"
47#include "qgpgmedownloadjob.h"
48#include "qgpgmesignencryptjob.h"
49#include "qgpgmeencryptjob.h"
50#include "qgpgmesignjob.h"
51#include "qgpgmesignkeyjob.h"
52#include "qgpgmeexportjob.h"
53#include "qgpgmeverifydetachedjob.h"
54#include "qgpgmeimportjob.h"
55#include "qgpgmeimportfromkeyserverjob.h"
56#include "qgpgmeverifyopaquejob.h"
57#include "qgpgmechangeexpiryjob.h"
58#include "qgpgmechangeownertrustjob.h"
59#include "qgpgmechangepasswdjob.h"
60#include "qgpgmeaddexistingsubkeyjob.h"
61#include "qgpgmeadduseridjob.h"
62#include "qgpgmekeyformailboxjob.h"
63#include "qgpgmewkdlookupjob.h"
64#include "qgpgmewkspublishjob.h"
65#include "qgpgmetofupolicyjob.h"
66#include "qgpgmequickjob.h"
67#include "qgpgmereceivekeysjob.h"
68#include "qgpgmerevokekeyjob.h"
69#include "qgpgmesetprimaryuseridjob.h"
70
71namespace
72{
73
74class Protocol : public QGpgME::Protocol
75{
76 GpgME::Protocol mProtocol;
77public:
78 explicit Protocol(GpgME::Protocol proto) : mProtocol(proto) {}
79
80 QString name() const Q_DECL_OVERRIDE
81 {
82 switch (mProtocol) {
83 case GpgME::OpenPGP: return QStringLiteral("OpenPGP");
84 case GpgME::CMS: return QStringLiteral("SMIME");
85 default: return QString();
86 }
87 }
88
89 QString displayName() const Q_DECL_OVERRIDE
90 {
91 // ah (2.4.16): Where is this used and isn't this inverted
92 // with name
93 switch (mProtocol) {
94 case GpgME::OpenPGP: return QStringLiteral("gpg");
95 case GpgME::CMS: return QStringLiteral("gpgsm");
96 default: return QStringLiteral("unknown");
97 }
98 }
99
100 QGpgME::SpecialJob *specialJob(const char *, const QMap<QString, QVariant> &) const Q_DECL_OVERRIDE
101 {
102 return nullptr;
103 }
104
105 QGpgME::KeyListJob *keyListJob(bool remote, bool includeSigs, bool validate) const Q_DECL_OVERRIDE
106 {
107 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
108 if (!context) {
109 return nullptr;
110 }
111
112 unsigned int mode = context->keyListMode();
113 if (remote) {
114 mode |= GpgME::Extern;
115 mode &= ~GpgME::Local;
116 } else {
117 mode |= GpgME::Local;
118 mode &= ~GpgME::Extern;
119 }
120 if (includeSigs) {
121 mode |= GpgME::Signatures;
122 }
123 if (validate) {
124 mode |= GpgME::Validate;
125 }
126 context->setKeyListMode(mode);
127 return new QGpgME::QGpgMEKeyListJob(context);
128 }
129
130 QGpgME::ListAllKeysJob *listAllKeysJob(bool includeSigs, bool validate) const Q_DECL_OVERRIDE
131 {
132 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
133 if (!context) {
134 return nullptr;
135 }
136
137 unsigned int mode = context->keyListMode();
138 mode |= GpgME::Local;
139 mode &= ~GpgME::Extern;
140 if (includeSigs) {
141 mode |= GpgME::Signatures;
142 }
143 if (validate) {
144 mode |= GpgME::Validate;
145 /* Setting the context to offline mode disables CRL / OCSP checks in
146 this Job. Otherwise we would try to fetch the CRL's for all CMS
147 keys in the users keyring because GpgME::Validate includes remote
148 resources by default in the validity check.
149 This setting only has any effect if gpgsm >= 2.1.6 is used.
150 */
151 context->setOffline(true);
152 }
153 context->setKeyListMode(mode);
154 return new QGpgME::QGpgMEListAllKeysJob(context);
155 }
156
157 QGpgME::EncryptJob *encryptJob(bool armor, bool textmode) const Q_DECL_OVERRIDE
158 {
159 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
160 if (!context) {
161 return nullptr;
162 }
163
164 context->setArmor(armor);
165 context->setTextMode(textmode);
166 return new QGpgME::QGpgMEEncryptJob(context);
167 }
168
169 QGpgME::DecryptJob *decryptJob() const Q_DECL_OVERRIDE
170 {
171 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
172 if (!context) {
173 return nullptr;
174 }
175 return new QGpgME::QGpgMEDecryptJob(context);
176 }
177
178 QGpgME::SignJob *signJob(bool armor, bool textMode) const Q_DECL_OVERRIDE
179 {
180 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
181 if (!context) {
182 return nullptr;
183 }
184
185 context->setArmor(armor);
186 context->setTextMode(textMode);
187 return new QGpgME::QGpgMESignJob(context);
188 }
189
190 QGpgME::VerifyDetachedJob *verifyDetachedJob(bool textMode) const Q_DECL_OVERRIDE
191 {
192 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
193 if (!context) {
194 return nullptr;
195 }
196
197 context->setTextMode(textMode);
198 return new QGpgME::QGpgMEVerifyDetachedJob(context);
199 }
200
201 QGpgME::VerifyOpaqueJob *verifyOpaqueJob(bool textMode) const Q_DECL_OVERRIDE
202 {
203 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
204 if (!context) {
205 return nullptr;
206 }
207
208 context->setTextMode(textMode);
209 return new QGpgME::QGpgMEVerifyOpaqueJob(context);
210 }
211
212 QGpgME::KeyGenerationJob *keyGenerationJob() const Q_DECL_OVERRIDE
213 {
214 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
215 if (!context) {
216 return nullptr;
217 }
218 return new QGpgME::QGpgMEKeyGenerationJob(context);
219 }
220
221 QGpgME::ImportJob *importJob() const Q_DECL_OVERRIDE
222 {
223 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
224 if (!context) {
225 return nullptr;
226 }
227 return new QGpgME::QGpgMEImportJob(context);
228 }
229
230 QGpgME::ImportFromKeyserverJob *importFromKeyserverJob() const Q_DECL_OVERRIDE
231 {
232 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
233 if (!context) {
234 return nullptr;
235 }
236 return new QGpgME::QGpgMEImportFromKeyserverJob(context);
237 }
238
239 QGpgME::ReceiveKeysJob *receiveKeysJob() const override
240 {
241 if (mProtocol != GpgME::OpenPGP) {
242 return nullptr;
243 }
244
245 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
246 if (!context) {
247 return nullptr;
248 }
249 return new QGpgME::QGpgMEReceiveKeysJob{context};
250 }
251
252 QGpgME::ExportJob *publicKeyExportJob(bool armor) const Q_DECL_OVERRIDE
253 {
254 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
255 if (!context) {
256 return nullptr;
257 }
258
259 context->setArmor(armor);
260 return new QGpgME::QGpgMEExportJob(context);
261 }
262
263 QGpgME::ExportJob *secretKeyExportJob(bool armor, const QString &) const Q_DECL_OVERRIDE
264 {
265 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
266 if (!context) {
267 return nullptr;
268 }
269
270 context->setArmor(armor);
271 return new QGpgME::QGpgMEExportJob(context, GpgME::Context::ExportSecret);
272 }
273
274 QGpgME::ExportJob *secretSubkeyExportJob(bool armor) const Q_DECL_OVERRIDE
275 {
276 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
277 if (!context) {
278 return nullptr;
279 }
280
281 context->setArmor(armor);
282 return new QGpgME::QGpgMEExportJob(context, GpgME::Context::ExportSecretSubkey);
283 }
284
285 QGpgME::RefreshKeysJob *refreshKeysJob() const Q_DECL_OVERRIDE
286 {
287 if (mProtocol != GpgME::CMS) {
288 return nullptr;
289 }
290
292 }
293
294 QGpgME::DownloadJob *downloadJob(bool armor) const Q_DECL_OVERRIDE
295 {
296 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
297 if (!context) {
298 return nullptr;
299 }
300
301 context->setArmor(armor);
302 // this is the hackish interface for downloading from keyserers currently:
303 context->setKeyListMode(GpgME::Extern);
304 return new QGpgME::QGpgMEDownloadJob(context);
305 }
306
307 QGpgME::DeleteJob *deleteJob() const Q_DECL_OVERRIDE
308 {
309 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
310 if (!context) {
311 return nullptr;
312 }
313 return new QGpgME::QGpgMEDeleteJob(context);
314 }
315
316 QGpgME::SignEncryptJob *signEncryptJob(bool armor, bool textMode) const Q_DECL_OVERRIDE
317 {
318 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
319 if (!context) {
320 return nullptr;
321 }
322
323 context->setArmor(armor);
324 context->setTextMode(textMode);
325 return new QGpgME::QGpgMESignEncryptJob(context);
326 }
327
328 QGpgME::DecryptVerifyJob *decryptVerifyJob(bool textMode) const Q_DECL_OVERRIDE
329 {
330 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
331 if (!context) {
332 return nullptr;
333 }
334
335 context->setTextMode(textMode);
336 return new QGpgME::QGpgMEDecryptVerifyJob(context);
337 }
338
339 QGpgME::ChangeExpiryJob *changeExpiryJob() const Q_DECL_OVERRIDE
340 {
341 if (mProtocol != GpgME::OpenPGP) {
342 return nullptr; // only supported by gpg
343 }
344
345 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
346 if (!context) {
347 return nullptr;
348 }
349 return new QGpgME::QGpgMEChangeExpiryJob(context);
350 }
351
352 QGpgME::ChangePasswdJob *changePasswdJob() const Q_DECL_OVERRIDE
353 {
354 if (!GpgME::hasFeature(GpgME::PasswdFeature, 0)) {
355 return nullptr;
356 }
357 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
358 if (!context) {
359 return nullptr;
360 }
361 return new QGpgME::QGpgMEChangePasswdJob(context);
362 }
363
364 QGpgME::SignKeyJob *signKeyJob() const Q_DECL_OVERRIDE
365 {
366 if (mProtocol != GpgME::OpenPGP) {
367 return nullptr; // only supported by gpg
368 }
369
370 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
371 if (!context) {
372 return nullptr;
373 }
374 return new QGpgME::QGpgMESignKeyJob(context);
375 }
376
377 QGpgME::ChangeOwnerTrustJob *changeOwnerTrustJob() const Q_DECL_OVERRIDE
378 {
379 if (mProtocol != GpgME::OpenPGP) {
380 return nullptr; // only supported by gpg
381 }
382
383 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
384 if (!context) {
385 return nullptr;
386 }
387 return new QGpgME::QGpgMEChangeOwnerTrustJob(context);
388 }
389
390 QGpgME:: AddExistingSubkeyJob *addExistingSubkeyJob() const override
391 {
392 if (mProtocol != GpgME::OpenPGP) {
393 return nullptr; // only supported by gpg
394 }
395
396 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
397 if (!context) {
398 return nullptr;
399 }
400 return new QGpgME::QGpgMEAddExistingSubkeyJob{context};
401 }
402
403 QGpgME::AddUserIDJob *addUserIDJob() const Q_DECL_OVERRIDE
404 {
405 if (mProtocol != GpgME::OpenPGP) {
406 return nullptr; // only supported by gpg
407 }
408
409 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
410 if (!context) {
411 return nullptr;
412 }
413 return new QGpgME::QGpgMEAddUserIDJob(context);
414 }
415
416 QGpgME::KeyListJob *locateKeysJob() const Q_DECL_OVERRIDE
417 {
418 if (mProtocol != GpgME::OpenPGP) {
419 return nullptr;
420 }
421 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
422 if (!context) {
423 return nullptr;
424 }
425 context->setKeyListMode(GpgME::Locate | GpgME::Signatures | GpgME::Validate);
426 return new QGpgME::QGpgMEKeyListJob(context);
427 }
428
429 QGpgME::KeyForMailboxJob *keyForMailboxJob() const Q_DECL_OVERRIDE
430 {
431 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
432 if (!context) {
433 return nullptr;
434 }
435 return new QGpgME::QGpgMEKeyForMailboxJob(context);
436 }
437
438 QGpgME::WKDLookupJob *wkdLookupJob() const Q_DECL_OVERRIDE
439 {
440 if (mProtocol != GpgME::OpenPGP) {
441 return nullptr;
442 }
443 auto context = GpgME::Context::createForEngine(GpgME::AssuanEngine);
444 if (!context) {
445 return nullptr;
446 }
447 return new QGpgME::QGpgMEWKDLookupJob(context.release());
448 }
449
450 QGpgME::WKSPublishJob *wksPublishJob() const Q_DECL_OVERRIDE
451 {
452 if (mProtocol != GpgME::OpenPGP) {
453 return nullptr;
454 }
455 auto context = GpgME::Context::createForEngine(GpgME::SpawnEngine);
456 if (!context) {
457 return nullptr;
458 }
459 return new QGpgME::QGpgMEWKSPublishJob(context.release());
460 }
461
462 QGpgME::TofuPolicyJob *tofuPolicyJob() const Q_DECL_OVERRIDE
463 {
464 if (mProtocol != GpgME::OpenPGP) {
465 return nullptr;
466 }
467 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
468 if (!context) {
469 return nullptr;
470 }
471 return new QGpgME::QGpgMETofuPolicyJob(context);
472 }
473
474 QGpgME::QuickJob *quickJob() const Q_DECL_OVERRIDE
475 {
476 if (mProtocol != GpgME::OpenPGP) {
477 return nullptr;
478 }
479 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
480 if (!context) {
481 return nullptr;
482 }
483 return new QGpgME::QGpgMEQuickJob(context);
484 }
485
486 QGpgME::RevokeKeyJob *revokeKeyJob() const Q_DECL_OVERRIDE
487 {
488 if (mProtocol != GpgME::OpenPGP) {
489 return nullptr;
490 }
491 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
492 if (!context) {
493 return nullptr;
494 }
495 return new QGpgME::QGpgMERevokeKeyJob(context);
496 }
497
499 {
500 if (mProtocol != GpgME::OpenPGP) {
501 return nullptr;
502 }
503 GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
504 if (!context) {
505 return nullptr;
506 }
507 return new QGpgME::QGpgMESetPrimaryUserIDJob{context};
508 }
509};
510
511}
512#endif
Definition: addexistingsubkeyjob.h:53
An abstract base class to asynchronously add UIDs to OpenPGP keys.
Definition: adduseridjob.h:65
An abstract base class to change expiry asynchronously.
Definition: changeexpiryjob.h:72
An abstract base class to change owner trust asynchronously.
Definition: changeownertrustjob.h:63
An abstract base class to change a key's passphrase asynchronously.
Definition: changepasswdjob.h:63
An abstract base class for asynchronous decrypters.
Definition: decryptjob.h:68
An abstract base class for asynchronous combined decrypters and verifiers.
Definition: decryptverifyjob.h:69
An abstract base class for asynchronous deleters.
Definition: deletejob.h:64
An abstract base class for asynchronous downloaders.
Definition: downloadjob.h:70
An abstract base class for asynchronous encrypters.
Definition: encryptjob.h:78
An abstract base class for asynchronous exporters.
Definition: exportjob.h:66
An abstract base class for asynchronous keyserver-importers.
Definition: importfromkeyserverjob.h:67
An abstract base class for asynchronous importers.
Definition: importjob.h:70
Get the best key to use for a Mailbox.
Definition: keyformailboxjob.h:70
An abstract base class for asynchronous key generation.
Definition: keygenerationjob.h:66
An abstract base class for asynchronous key listers.
Definition: keylistjob.h:76
An abstract base class for asynchronously listing all keys.
Definition: listallkeysjob.h:75
Definition: protocol.h:114
virtual KeyListJob * locateKeysJob() const =0
virtual WKSPublishJob * wksPublishJob() const =0
virtual QuickJob * quickJob() const =0
virtual KeyForMailboxJob * keyForMailboxJob() const =0
virtual WKDLookupJob * wkdLookupJob() const =0
virtual SetPrimaryUserIDJob * setPrimaryUserIDJob() const =0
virtual TofuPolicyJob * tofuPolicyJob() const =0
virtual RefreshKeysJob * refreshKeysJob() const =0
Definition: qgpgmeaddexistingsubkeyjob.h:49
Definition: qgpgmeadduseridjob.h:51
Definition: qgpgmechangeexpiryjob.h:51
Definition: qgpgmechangeownertrustjob.h:51
Definition: qgpgmechangepasswdjob.h:51
Definition: qgpgmedecryptjob.h:57
Definition: qgpgmedecryptverifyjob.h:62
Definition: qgpgmedeletejob.h:56
Definition: qgpgmedownloadjob.h:51
Definition: qgpgmeencryptjob.h:62
Definition: qgpgmeexportjob.h:53
Definition: qgpgmeimportfromkeyserverjob.h:57
Definition: qgpgmeimportjob.h:57
Definition: qgpgmekeyformailboxjob.h:59
Definition: qgpgmekeygenerationjob.h:57
Definition: qgpgmekeylistjob.h:62
Definition: qgpgmelistallkeysjob.h:62
Definition: qgpgmequickjob.h:52
Definition: qgpgmereceivekeysjob.h:56
Definition: qgpgmerefreshsmimekeysjob.h:52
Definition: qgpgmerevokekeyjob.h:49
Definition: qgpgmesetprimaryuseridjob.h:49
Definition: qgpgmesignencryptjob.h:69
Definition: qgpgmesignjob.h:62
Definition: qgpgmesignkeyjob.h:53
Definition: qgpgmetofupolicyjob.h:50
Definition: qgpgmeverifydetachedjob.h:57
Definition: qgpgmeverifyopaquejob.h:57
Definition: qgpgmewkdlookupjob.h:51
Definition: qgpgmewkspublishjob.h:54
Definition: quickjob.h:56
Definition: receivekeysjob.h:44
An abstract base class for asynchronous key refreshers.
Definition: refreshkeysjob.h:68
Definition: revokekeyjob.h:52
Definition: setprimaryuseridjob.h:51
An abstract base class for asynchronous combined signing and encrypting.
Definition: signencryptjob.h:83
An abstract base class for asynchronous signing.
Definition: signjob.h:77
An abstract base class to sign keys asynchronously.
Definition: signkeyjob.h:69
An abstract base class for protocol-specific jobs.
Definition: specialjob.h:71
Definition: tofupolicyjob.h:55
An abstract base class for asynchronous verification of detached signatures.
Definition: verifydetachedjob.h:69
An abstract base class for asynchronous verification of opaque signatures.
Definition: verifyopaquejob.h:68
Definition: wkdlookupjob.h:54
Definition: wkspublishjob.h:60
Definition: qgpgmebackend.h:43