From 226e51052ae73efa8d9f30729b28de68d35231af Mon Sep 17 00:00:00 2001 From: Andre Heinecke Date: Sat, 2 Apr 2016 04:31:59 -0800 Subject: Add QGpgME code from libkleo * lang/qt/src/Makefile.am, lang/qt/src/abstractimportjob.h, lang/qt/src/adduseridjob.h, lang/qt/src/changeexpiryjob.h, lang/qt/src/changeownertrustjob.h, lang/qt/src/changepasswdjob.h, lang/qt/src/cryptoconfig.h, lang/qt/src/decryptjob.h, lang/qt/src/decryptverifyjob.h, lang/qt/src/deletejob.h, lang/qt/src/downloadjob.h, lang/qt/src/encryptjob.h, lang/qt/src/exportjob.h, lang/qt/src/hierarchicalkeylistjob.h, lang/qt/src/importfromkeyserverjob.h, lang/qt/src/importjob.h, lang/qt/src/job.cpp, lang/qt/src/job.h, lang/qt/src/keygenerationjob.h, lang/qt/src/keylistjob.h, lang/qt/src/listallkeysjob.h, lang/qt/src/multideletejob.h, lang/qt/src/qgpgmeadduseridjob.cpp, lang/qt/src/qgpgmeadduseridjob.h, lang/qt/src/qgpgmebackend.cpp, lang/qt/src/qgpgmebackend.h, lang/qt/src/qgpgmechangeexpiryjob.cpp, lang/qt/src/qgpgmechangeexpiryjob.h, lang/qt/src/qgpgmechangeownertrustjob.cpp, lang/qt/src/qgpgmechangeownertrustjob.h, lang/qt/src/qgpgmechangepasswdjob.cpp, lang/qt/src/qgpgmechangepasswdjob.h, lang/qt/src/qgpgmecryptoconfig.cpp, lang/qt/src/qgpgmecryptoconfig.h, lang/qt/src/qgpgmedecryptjob.cpp, lang/qt/src/qgpgmedecryptjob.h, lang/qt/src/qgpgmedecryptverifyjob.cpp, lang/qt/src/qgpgmedecryptverifyjob.h, lang/qt/src/qgpgmedeletejob.cpp, lang/qt/src/qgpgmedeletejob.h, lang/qt/src/qgpgmedownloadjob.cpp, lang/qt/src/qgpgmedownloadjob.h, lang/qt/src/qgpgmeencryptjob.cpp, lang/qt/src/qgpgmeencryptjob.h, lang/qt/src/qgpgmeexportjob.cpp, lang/qt/src/qgpgmeexportjob.h, lang/qt/src/qgpgmeimportfromkeyserverjob.cpp, lang/qt/src/qgpgmeimportfromkeyserverjob.h, lang/qt/src/qgpgmeimportjob.cpp, lang/qt/src/qgpgmeimportjob.h, lang/qt/src/qgpgmekeygenerationjob.cpp, lang/qt/src/qgpgmekeygenerationjob.h, lang/qt/src/qgpgmekeylistjob.cpp, lang/qt/src/qgpgmekeylistjob.h, lang/qt/src/qgpgmelistallkeysjob.cpp, lang/qt/src/qgpgmelistallkeysjob.h, lang/qt/src/qgpgmenewcryptoconfig.cpp, lang/qt/src/qgpgmenewcryptoconfig.h, lang/qt/src/qgpgmerefreshkeysjob.cpp, lang/qt/src/qgpgmerefreshkeysjob.h, lang/qt/src/qgpgmesecretkeyexportjob.cpp, lang/qt/src/qgpgmesecretkeyexportjob.h, lang/qt/src/qgpgmesignencryptjob.cpp, lang/qt/src/qgpgmesignencryptjob.h, lang/qt/src/qgpgmesignjob.cpp, lang/qt/src/qgpgmesignjob.h, lang/qt/src/qgpgmesignkeyjob.cpp, lang/qt/src/qgpgmesignkeyjob.h, lang/qt/src/qgpgmeverifydetachedjob.cpp, lang/qt/src/qgpgmeverifydetachedjob.h, lang/qt/src/qgpgmeverifyopaquejob.cpp, lang/qt/src/qgpgmeverifyopaquejob.h, lang/qt/src/refreshkeysjob.h, lang/qt/src/signencryptjob.h, lang/qt/src/signjob.h, lang/qt/src/signkeyjob.h, lang/qt/src/specialjob.h, lang/qt/src/threadedjobmixin.cpp, lang/qt/src/threadedjobmixin.h, lang/qt/src/verifydetachedjob.h, lang/qt/src/verifyopaquejob.h: New. * lang/qt/src/Makefile.am: -- The ShowErrorMessage calls were removed and are to be replaced by error signals / error status which the UI should then handle. This allowed to port away from KMessageBox and KLocalizedstring. Additionally this removed the old process bases qgpgmeconfigdialog, and GnuPGProcessBase. Classes using GnuPGProcessbase were changed to KProcess api. This is a first compiling version. API is subject to change to resolve the split between base jobs and qgpgme classes. --- lang/qt/src/qgpgmebackend.cpp | 515 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 515 insertions(+) create mode 100644 lang/qt/src/qgpgmebackend.cpp (limited to 'lang/qt/src/qgpgmebackend.cpp') diff --git a/lang/qt/src/qgpgmebackend.cpp b/lang/qt/src/qgpgmebackend.cpp new file mode 100644 index 00000000..ac771241 --- /dev/null +++ b/lang/qt/src/qgpgmebackend.cpp @@ -0,0 +1,515 @@ +/* + qgpgmebackend.cpp + + This file is part of qgpgme, the Qt API binding for gpgme + Copyright (c) 2004,2005 Klarälvdalens Datakonsult AB + Copyright (c) 2016 Intevation GmbH + + Libkleopatra is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + Libkleopatra is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "qgpgmebackend.h" + +#include "qgpgmecryptoconfig.h" +#include "qgpgmenewcryptoconfig.h" + +#include "qgpgmekeygenerationjob.h" +#include "qgpgmekeylistjob.h" +#include "qgpgmelistallkeysjob.h" +#include "qgpgmedecryptjob.h" +#include "qgpgmedecryptverifyjob.h" +#include "qgpgmerefreshkeysjob.h" +#include "qgpgmedeletejob.h" +#include "qgpgmesecretkeyexportjob.h" +#include "qgpgmedownloadjob.h" +#include "qgpgmesignencryptjob.h" +#include "qgpgmeencryptjob.h" +#include "qgpgmesignjob.h" +#include "qgpgmesignkeyjob.h" +#include "qgpgmeexportjob.h" +#include "qgpgmeverifydetachedjob.h" +#include "qgpgmeimportjob.h" +#include "qgpgmeimportfromkeyserverjob.h" +#include "qgpgmeverifyopaquejob.h" +#include "qgpgmechangeexpiryjob.h" +#include "qgpgmechangeownertrustjob.h" +#include "qgpgmechangepasswdjob.h" +#include "qgpgmeadduseridjob.h" + +#include "error.h" +#include "engineinfo.h" + +#include +#include + +const char QGpgME::QGpgMEBackend::OpenPGP[] = "OpenPGP"; +const char QGpgME::QGpgMEBackend::SMIME[] = "SMIME"; + +namespace +{ + +class Protocol : public QGpgME::Protocol +{ + GpgME::Protocol mProtocol; +public: + explicit Protocol(GpgME::Protocol proto) : mProtocol(proto) {} + + QString name() const Q_DECL_OVERRIDE + { + switch (mProtocol) { + case GpgME::OpenPGP: return QStringLiteral("OpenPGP"); + case GpgME::CMS: return QStringLiteral("SMIME"); + default: return QString(); + } + } + + QString displayName() const Q_DECL_OVERRIDE + { + // ah (2.4.16): Where is this used and isn't this inverted + // with name + switch (mProtocol) { + case GpgME::OpenPGP: return QStringLiteral("gpg"); + case GpgME::CMS: return QStringLiteral("gpgsm"); + default: return QStringLiteral("unknown"); + } + } + + QGpgME::SpecialJob *specialJob(const char *, const QMap &) const Q_DECL_OVERRIDE + { + return 0; + } + + QGpgME::KeyListJob *keyListJob(bool remote, bool includeSigs, bool validate) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + unsigned int mode = context->keyListMode(); + if (remote) { + mode |= GpgME::Extern; + mode &= ~GpgME::Local; + } else { + mode |= GpgME::Local; + mode &= ~GpgME::Extern; + } + if (includeSigs) { + mode |= GpgME::Signatures; + } + if (validate) { + mode |= GpgME::Validate; + } + context->setKeyListMode(mode); + return new QGpgME::QGpgMEKeyListJob(context); + } + + QGpgME::ListAllKeysJob *listAllKeysJob(bool includeSigs, bool validate) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + unsigned int mode = context->keyListMode(); + mode |= GpgME::Local; + mode &= ~GpgME::Extern; + if (includeSigs) { + mode |= GpgME::Signatures; + } + if (validate) { + mode |= GpgME::Validate; + /* Setting the context to offline mode disables CRL / OCSP checks in + this Job. Otherwise we would try to fetch the CRL's for all CMS + keys in the users keyring because GpgME::Validate includes remote + resources by default in the validity check. + This setting only has any effect if gpgsm >= 2.1.6 is used. + */ + context->setOffline(true); + } + context->setKeyListMode(mode); + return new QGpgME::QGpgMEListAllKeysJob(context); + } + + QGpgME::EncryptJob *encryptJob(bool armor, bool textmode) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + context->setArmor(armor); + context->setTextMode(textmode); + return new QGpgME::QGpgMEEncryptJob(context); + } + + QGpgME::DecryptJob *decryptJob() const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMEDecryptJob(context); + } + + QGpgME::SignJob *signJob(bool armor, bool textMode) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + context->setArmor(armor); + context->setTextMode(textMode); + return new QGpgME::QGpgMESignJob(context); + } + + QGpgME::VerifyDetachedJob *verifyDetachedJob(bool textMode) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + context->setTextMode(textMode); + return new QGpgME::QGpgMEVerifyDetachedJob(context); + } + + QGpgME::VerifyOpaqueJob *verifyOpaqueJob(bool textMode) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + context->setTextMode(textMode); + return new QGpgME::QGpgMEVerifyOpaqueJob(context); + } + + QGpgME::KeyGenerationJob *keyGenerationJob() const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMEKeyGenerationJob(context); + } + + QGpgME::ImportJob *importJob() const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMEImportJob(context); + } + + QGpgME::ImportFromKeyserverJob *importFromKeyserverJob() const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMEImportFromKeyserverJob(context); + } + + QGpgME::ExportJob *publicKeyExportJob(bool armor) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + context->setArmor(armor); + return new QGpgME::QGpgMEExportJob(context); + } + + QGpgME::ExportJob *secretKeyExportJob(bool armor, const QString &charset) const Q_DECL_OVERRIDE + { + if (mProtocol != GpgME::CMS) { // fixme: add support for gpg, too + return 0; + } + + // this operation is not supported by gpgme, so we have to call gpgsm ourselves: + return new QGpgME::QGpgMESecretKeyExportJob(armor, charset); + } + + QGpgME::RefreshKeysJob *refreshKeysJob() const Q_DECL_OVERRIDE + { + if (mProtocol != GpgME::CMS) { // fixme: add support for gpg, too + return 0; + } + + // this operation is not supported by gpgme, so we have to call gpgsm ourselves: + return new QGpgME::QGpgMERefreshKeysJob(); + } + + QGpgME::DownloadJob *downloadJob(bool armor) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + context->setArmor(armor); + // this is the hackish interface for downloading from keyserers currently: + context->setKeyListMode(GpgME::Extern); + return new QGpgME::QGpgMEDownloadJob(context); + } + + QGpgME::DeleteJob *deleteJob() const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMEDeleteJob(context); + } + + QGpgME::SignEncryptJob *signEncryptJob(bool armor, bool textMode) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + context->setArmor(armor); + context->setTextMode(textMode); + return new QGpgME::QGpgMESignEncryptJob(context); + } + + QGpgME::DecryptVerifyJob *decryptVerifyJob(bool textMode) const Q_DECL_OVERRIDE + { + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + + context->setTextMode(textMode); + return new QGpgME::QGpgMEDecryptVerifyJob(context); + } + + QGpgME::ChangeExpiryJob *changeExpiryJob() const Q_DECL_OVERRIDE + { + if (mProtocol != GpgME::OpenPGP) { + return 0; // only supported by gpg + } + + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMEChangeExpiryJob(context); + } + + QGpgME::ChangePasswdJob *changePasswdJob() const Q_DECL_OVERRIDE + { + if (!GpgME::hasFeature(GpgME::PasswdFeature, 0)) { + return 0; + } + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMEChangePasswdJob(context); + } + + QGpgME::SignKeyJob *signKeyJob() const Q_DECL_OVERRIDE + { + if (mProtocol != GpgME::OpenPGP) { + return 0; // only supported by gpg + } + + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMESignKeyJob(context); + } + + QGpgME::ChangeOwnerTrustJob *changeOwnerTrustJob() const Q_DECL_OVERRIDE + { + if (mProtocol != GpgME::OpenPGP) { + return 0; // only supported by gpg + } + + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMEChangeOwnerTrustJob(context); + } + + QGpgME::AddUserIDJob *addUserIDJob() const Q_DECL_OVERRIDE + { + if (mProtocol != GpgME::OpenPGP) { + return 0; // only supported by gpg + } + + GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); + if (!context) { + return 0; + } + return new QGpgME::QGpgMEAddUserIDJob(context); + } + +}; + +} + +QGpgME::QGpgMEBackend::QGpgMEBackend() + : mCryptoConfig(0), + mOpenPGPProtocol(0), + mSMIMEProtocol(0) +{ + GpgME::initializeLibrary(); +} + +QGpgME::QGpgMEBackend::~QGpgMEBackend() +{ + delete mCryptoConfig; mCryptoConfig = 0; + delete mOpenPGPProtocol; mOpenPGPProtocol = 0; + delete mSMIMEProtocol; mSMIMEProtocol = 0; +} + +QString QGpgME::QGpgMEBackend::name() const +{ + return QStringLiteral("gpgme"); +} + +QString QGpgME::QGpgMEBackend::displayName() const +{ + return QStringLiteral("GpgME"); +} + +QGpgME::CryptoConfig *QGpgME::QGpgMEBackend::config() const +{ + if (!mCryptoConfig) { +#ifdef _WIN32_WCE // for now... + if (GpgME::hasFeature(GpgME::GpgConfEngineFeature, 0)) { + mCryptoConfig = new QGpgMENewCryptoConfig; + } else +#endif + if (!QGpgMECryptoConfig::gpgConfPath().isEmpty()) { + mCryptoConfig = new QGpgMECryptoConfig(); + } + } + return mCryptoConfig; +} + +static bool check(GpgME::Protocol proto, QString *reason) +{ + if (!GpgME::checkEngine(proto)) { + return true; + } + if (!reason) { + return false; + } + // error, check why: +#if 0 +Port away from localised string or delete. + const GpgME::EngineInfo ei = GpgME::engineInfo(proto); + if (ei.isNull()) { + *reason = i18n("GPGME was compiled without support for %1.", proto == GpgME::CMS ? QLatin1String("S/MIME") : QLatin1String("OpenPGP")); + } else if (ei.fileName() && !ei.version()) { + *reason = i18n("Engine %1 is not installed properly.", QFile::decodeName(ei.fileName())); + } else if (ei.fileName() && ei.version() && ei.requiredVersion()) + *reason = i18n("Engine %1 version %2 installed, " + "but at least version %3 is required.", + QFile::decodeName(ei.fileName()), QLatin1String(ei.version()), QLatin1String(ei.requiredVersion())); + else { + *reason = i18n("Unknown problem with engine for protocol %1.", proto == GpgME::CMS ? QLatin1String("S/MIME") : QLatin1String("OpenPGP")); + } +#endif + return false; +} + +bool QGpgME::QGpgMEBackend::checkForOpenPGP(QString *reason) const +{ + return check(GpgME::OpenPGP, reason); +} + +bool QGpgME::QGpgMEBackend::checkForSMIME(QString *reason) const +{ + return check(GpgME::CMS, reason); +} + +bool QGpgME::QGpgMEBackend::checkForProtocol(const char *name, QString *reason) const +{ + if (qstricmp(name, OpenPGP) == 0) { + return check(GpgME::OpenPGP, reason); + } + if (qstricmp(name, SMIME) == 0) { + return check(GpgME::CMS, reason); + } + if (reason) { + *reason = QStringLiteral("Unsupported protocol \"%1\"").arg(QLatin1String(name)); + } + return false; +} + +QGpgME::Protocol *QGpgME::QGpgMEBackend::openpgp() const +{ + if (!mOpenPGPProtocol) + if (checkForOpenPGP()) { + mOpenPGPProtocol = new ::Protocol(GpgME::OpenPGP); + } + return mOpenPGPProtocol; +} + +QGpgME::Protocol *QGpgME::QGpgMEBackend::smime() const +{ + if (!mSMIMEProtocol) + if (checkForSMIME()) { + mSMIMEProtocol = new ::Protocol(GpgME::CMS); + } + return mSMIMEProtocol; +} + +QGpgME::Protocol *QGpgME::QGpgMEBackend::protocol(const char *name) const +{ + if (qstricmp(name, OpenPGP) == 0) { + return openpgp(); + } + if (qstricmp(name, SMIME) == 0) { + return smime(); + } + return 0; +} + +bool QGpgME::QGpgMEBackend::supportsProtocol(const char *name) const +{ + return qstricmp(name, OpenPGP) == 0 || qstricmp(name, SMIME) == 0; +} + +const char *QGpgME::QGpgMEBackend::enumerateProtocols(int i) const +{ + switch (i) { + case 0: return OpenPGP; + case 1: return SMIME; + default: return 0; + } +} -- cgit v1.2.3 From 7071b2a9c00b85d434d01b6166269ebf48b01b81 Mon Sep 17 00:00:00 2001 From: Andre Heinecke Date: Sun, 3 Apr 2016 01:22:19 -0800 Subject: Qt: Only use GpgME based config class * lang/qt/src/qgpgmecryptoconfig.cpp, lang/qt/src/qgpgmecryptoconfig.h: Removed. * lang/qt/src/qgpgmebackend.cpp: Return newcryptoconfig. -- The GpgME based config class is the way forward and the old class was using KDE Code. Probably needs some bugfixes as previously the new class was only used for Windows CE --- lang/qt/src/qgpgmebackend.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'lang/qt/src/qgpgmebackend.cpp') diff --git a/lang/qt/src/qgpgmebackend.cpp b/lang/qt/src/qgpgmebackend.cpp index ac771241..1167daee 100644 --- a/lang/qt/src/qgpgmebackend.cpp +++ b/lang/qt/src/qgpgmebackend.cpp @@ -33,7 +33,6 @@ #include "qgpgmebackend.h" -#include "qgpgmecryptoconfig.h" #include "qgpgmenewcryptoconfig.h" #include "qgpgmekeygenerationjob.h" @@ -408,14 +407,9 @@ QString QGpgME::QGpgMEBackend::displayName() const QGpgME::CryptoConfig *QGpgME::QGpgMEBackend::config() const { if (!mCryptoConfig) { -#ifdef _WIN32_WCE // for now... if (GpgME::hasFeature(GpgME::GpgConfEngineFeature, 0)) { mCryptoConfig = new QGpgMENewCryptoConfig; - } else -#endif - if (!QGpgMECryptoConfig::gpgConfPath().isEmpty()) { - mCryptoConfig = new QGpgMECryptoConfig(); - } + } } return mCryptoConfig; } -- cgit v1.2.3 From 0991485170ca4ef90fd566540522027d0fc59a72 Mon Sep 17 00:00:00 2001 From: Andre Heinecke Date: Sun, 3 Apr 2016 02:29:14 -0800 Subject: Qt: Add static factor methods for protocol * lang/qt/src/qgpgmebackend.cpp (QGpgME::openpgp, QGpgME::smime): New. * lang/qt/src/qgpgmebackend.h: Declare. * lang/qt/tests/t-keylist.cpp (KeyListTest::testSingleKeyListSync): Use new functions. -- This replaces the cryptobackendfactory functionality from libkleo. --- lang/qt/src/qgpgmebackend.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'lang/qt/src/qgpgmebackend.cpp') diff --git a/lang/qt/src/qgpgmebackend.cpp b/lang/qt/src/qgpgmebackend.cpp index 1167daee..abecde2c 100644 --- a/lang/qt/src/qgpgmebackend.cpp +++ b/lang/qt/src/qgpgmebackend.cpp @@ -507,3 +507,21 @@ const char *QGpgME::QGpgMEBackend::enumerateProtocols(int i) const default: return 0; } } + +static QGpgME::QGpgMEBackend *gpgmeBackend; + +QGpgME::Protocol *QGpgME::openpgp() +{ + if (!gpgmeBackend) { + gpgmeBackend = new QGpgME::QGpgMEBackend(); + } + return gpgmeBackend->openpgp(); +} + +QGpgME::Protocol *QGpgME::smime() +{ + if (!gpgmeBackend) { + gpgmeBackend = new QGpgME::QGpgMEBackend(); + } + return gpgmeBackend->smime(); +} -- cgit v1.2.3 From 20b02a7dd49c7ede148245d8a5319b2ba9ce7673 Mon Sep 17 00:00:00 2001 From: Andre Heinecke Date: Fri, 6 May 2016 14:20:45 +0200 Subject: Qt: Fix library name in Copyright headers -- Files are not part of libkleopatra anymore. --- lang/qt/src/qgpgmebackend.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lang/qt/src/qgpgmebackend.cpp') diff --git a/lang/qt/src/qgpgmebackend.cpp b/lang/qt/src/qgpgmebackend.cpp index abecde2c..27cd178c 100644 --- a/lang/qt/src/qgpgmebackend.cpp +++ b/lang/qt/src/qgpgmebackend.cpp @@ -5,12 +5,12 @@ Copyright (c) 2004,2005 Klarälvdalens Datakonsult AB Copyright (c) 2016 Intevation GmbH - Libkleopatra is free software; you can redistribute it and/or + QGpgME is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - Libkleopatra is distributed in the hope that it will be useful, + QGpgME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -- cgit v1.2.3 From 56c4d9ea9520c95612e525b2fa1359db6fa88f4a Mon Sep 17 00:00:00 2001 From: Andre Heinecke Date: Tue, 10 May 2016 14:05:10 +0200 Subject: Qt: Make Protocol class public API * lang/qt/src/Makefile.am (qgpgme_headers): Add protocol.h (private_qgpgme_headers): Add protocol_p.h * lang/qt/src/protocol.h: New. From QGpgMEBackend. * lang/qt/src/protocol_p.h: New. From QGpgMEBackend. * lang/qt/src/qgpgmebackend.h, lang/qt/src/qgpgmebackend.cpp (Protocol): Removed. -- The backend class does not make much sense anymore as we only have the GpgME backend obviously. It's purpose was for Libkleo's Backend abstraction. --- lang/qt/src/qgpgmebackend.cpp | 346 ++---------------------------------------- 1 file changed, 11 insertions(+), 335 deletions(-) (limited to 'lang/qt/src/qgpgmebackend.cpp') diff --git a/lang/qt/src/qgpgmebackend.cpp b/lang/qt/src/qgpgmebackend.cpp index 27cd178c..797e58a6 100644 --- a/lang/qt/src/qgpgmebackend.cpp +++ b/lang/qt/src/qgpgmebackend.cpp @@ -33,351 +33,18 @@ #include "qgpgmebackend.h" -#include "qgpgmenewcryptoconfig.h" - -#include "qgpgmekeygenerationjob.h" -#include "qgpgmekeylistjob.h" -#include "qgpgmelistallkeysjob.h" -#include "qgpgmedecryptjob.h" -#include "qgpgmedecryptverifyjob.h" -#include "qgpgmerefreshkeysjob.h" -#include "qgpgmedeletejob.h" -#include "qgpgmesecretkeyexportjob.h" -#include "qgpgmedownloadjob.h" -#include "qgpgmesignencryptjob.h" -#include "qgpgmeencryptjob.h" -#include "qgpgmesignjob.h" -#include "qgpgmesignkeyjob.h" -#include "qgpgmeexportjob.h" -#include "qgpgmeverifydetachedjob.h" -#include "qgpgmeimportjob.h" -#include "qgpgmeimportfromkeyserverjob.h" -#include "qgpgmeverifyopaquejob.h" -#include "qgpgmechangeexpiryjob.h" -#include "qgpgmechangeownertrustjob.h" -#include "qgpgmechangepasswdjob.h" -#include "qgpgmeadduseridjob.h" #include "error.h" #include "engineinfo.h" +#include "protocol_p.h" + #include #include const char QGpgME::QGpgMEBackend::OpenPGP[] = "OpenPGP"; const char QGpgME::QGpgMEBackend::SMIME[] = "SMIME"; -namespace -{ - -class Protocol : public QGpgME::Protocol -{ - GpgME::Protocol mProtocol; -public: - explicit Protocol(GpgME::Protocol proto) : mProtocol(proto) {} - - QString name() const Q_DECL_OVERRIDE - { - switch (mProtocol) { - case GpgME::OpenPGP: return QStringLiteral("OpenPGP"); - case GpgME::CMS: return QStringLiteral("SMIME"); - default: return QString(); - } - } - - QString displayName() const Q_DECL_OVERRIDE - { - // ah (2.4.16): Where is this used and isn't this inverted - // with name - switch (mProtocol) { - case GpgME::OpenPGP: return QStringLiteral("gpg"); - case GpgME::CMS: return QStringLiteral("gpgsm"); - default: return QStringLiteral("unknown"); - } - } - - QGpgME::SpecialJob *specialJob(const char *, const QMap &) const Q_DECL_OVERRIDE - { - return 0; - } - - QGpgME::KeyListJob *keyListJob(bool remote, bool includeSigs, bool validate) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - unsigned int mode = context->keyListMode(); - if (remote) { - mode |= GpgME::Extern; - mode &= ~GpgME::Local; - } else { - mode |= GpgME::Local; - mode &= ~GpgME::Extern; - } - if (includeSigs) { - mode |= GpgME::Signatures; - } - if (validate) { - mode |= GpgME::Validate; - } - context->setKeyListMode(mode); - return new QGpgME::QGpgMEKeyListJob(context); - } - - QGpgME::ListAllKeysJob *listAllKeysJob(bool includeSigs, bool validate) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - unsigned int mode = context->keyListMode(); - mode |= GpgME::Local; - mode &= ~GpgME::Extern; - if (includeSigs) { - mode |= GpgME::Signatures; - } - if (validate) { - mode |= GpgME::Validate; - /* Setting the context to offline mode disables CRL / OCSP checks in - this Job. Otherwise we would try to fetch the CRL's for all CMS - keys in the users keyring because GpgME::Validate includes remote - resources by default in the validity check. - This setting only has any effect if gpgsm >= 2.1.6 is used. - */ - context->setOffline(true); - } - context->setKeyListMode(mode); - return new QGpgME::QGpgMEListAllKeysJob(context); - } - - QGpgME::EncryptJob *encryptJob(bool armor, bool textmode) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - context->setArmor(armor); - context->setTextMode(textmode); - return new QGpgME::QGpgMEEncryptJob(context); - } - - QGpgME::DecryptJob *decryptJob() const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMEDecryptJob(context); - } - - QGpgME::SignJob *signJob(bool armor, bool textMode) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - context->setArmor(armor); - context->setTextMode(textMode); - return new QGpgME::QGpgMESignJob(context); - } - - QGpgME::VerifyDetachedJob *verifyDetachedJob(bool textMode) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - context->setTextMode(textMode); - return new QGpgME::QGpgMEVerifyDetachedJob(context); - } - - QGpgME::VerifyOpaqueJob *verifyOpaqueJob(bool textMode) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - context->setTextMode(textMode); - return new QGpgME::QGpgMEVerifyOpaqueJob(context); - } - - QGpgME::KeyGenerationJob *keyGenerationJob() const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMEKeyGenerationJob(context); - } - - QGpgME::ImportJob *importJob() const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMEImportJob(context); - } - - QGpgME::ImportFromKeyserverJob *importFromKeyserverJob() const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMEImportFromKeyserverJob(context); - } - - QGpgME::ExportJob *publicKeyExportJob(bool armor) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - context->setArmor(armor); - return new QGpgME::QGpgMEExportJob(context); - } - - QGpgME::ExportJob *secretKeyExportJob(bool armor, const QString &charset) const Q_DECL_OVERRIDE - { - if (mProtocol != GpgME::CMS) { // fixme: add support for gpg, too - return 0; - } - - // this operation is not supported by gpgme, so we have to call gpgsm ourselves: - return new QGpgME::QGpgMESecretKeyExportJob(armor, charset); - } - - QGpgME::RefreshKeysJob *refreshKeysJob() const Q_DECL_OVERRIDE - { - if (mProtocol != GpgME::CMS) { // fixme: add support for gpg, too - return 0; - } - - // this operation is not supported by gpgme, so we have to call gpgsm ourselves: - return new QGpgME::QGpgMERefreshKeysJob(); - } - - QGpgME::DownloadJob *downloadJob(bool armor) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - context->setArmor(armor); - // this is the hackish interface for downloading from keyserers currently: - context->setKeyListMode(GpgME::Extern); - return new QGpgME::QGpgMEDownloadJob(context); - } - - QGpgME::DeleteJob *deleteJob() const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMEDeleteJob(context); - } - - QGpgME::SignEncryptJob *signEncryptJob(bool armor, bool textMode) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - context->setArmor(armor); - context->setTextMode(textMode); - return new QGpgME::QGpgMESignEncryptJob(context); - } - - QGpgME::DecryptVerifyJob *decryptVerifyJob(bool textMode) const Q_DECL_OVERRIDE - { - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - - context->setTextMode(textMode); - return new QGpgME::QGpgMEDecryptVerifyJob(context); - } - - QGpgME::ChangeExpiryJob *changeExpiryJob() const Q_DECL_OVERRIDE - { - if (mProtocol != GpgME::OpenPGP) { - return 0; // only supported by gpg - } - - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMEChangeExpiryJob(context); - } - - QGpgME::ChangePasswdJob *changePasswdJob() const Q_DECL_OVERRIDE - { - if (!GpgME::hasFeature(GpgME::PasswdFeature, 0)) { - return 0; - } - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMEChangePasswdJob(context); - } - - QGpgME::SignKeyJob *signKeyJob() const Q_DECL_OVERRIDE - { - if (mProtocol != GpgME::OpenPGP) { - return 0; // only supported by gpg - } - - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMESignKeyJob(context); - } - - QGpgME::ChangeOwnerTrustJob *changeOwnerTrustJob() const Q_DECL_OVERRIDE - { - if (mProtocol != GpgME::OpenPGP) { - return 0; // only supported by gpg - } - - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMEChangeOwnerTrustJob(context); - } - - QGpgME::AddUserIDJob *addUserIDJob() const Q_DECL_OVERRIDE - { - if (mProtocol != GpgME::OpenPGP) { - return 0; // only supported by gpg - } - - GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol); - if (!context) { - return 0; - } - return new QGpgME::QGpgMEAddUserIDJob(context); - } - -}; - -} QGpgME::QGpgMEBackend::QGpgMEBackend() : mCryptoConfig(0), @@ -510,6 +177,15 @@ const char *QGpgME::QGpgMEBackend::enumerateProtocols(int i) const static QGpgME::QGpgMEBackend *gpgmeBackend; +QGpgME::CryptoConfig *QGpgME::cryptoConfig() +{ + if (!gpgmeBackend) { + gpgmeBackend = new QGpgME::QGpgMEBackend(); + } + return gpgmeBackend->config(); + +} + QGpgME::Protocol *QGpgME::openpgp() { if (!gpgmeBackend) { -- cgit v1.2.3