[git] GPGME - branch, master, updated. gpgme-1.6.0-311-gdf04b23

by Andre Heinecke cvs at cvs.gnupg.org
Thu Aug 25 14:40:35 CEST 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GnuPG Made Easy".

The branch, master has been updated
       via  df04b232b8897f030534f8c3fbc87064edf8ae7d (commit)
       via  94420b05775122b25885c66ac67f77c59d01644d (commit)
      from  de7b67f9b2e6bd43a036fa0bcc6a8ca4f5b10986 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit df04b232b8897f030534f8c3fbc87064edf8ae7d
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Thu Aug 25 14:35:09 2016 +0200

    qt: Add test for wkspublishjob
    
    * lang/qt/tests/t-wkspublish.cpp: New.
    * lang/qt/tests/Makefile.am: Update accordingly.
    
    --
    Most tests are disabled by default as tey require
    an online connection.
    Define DO_ONLINE_TESTS to enable the tests.

diff --git a/lang/qt/tests/Makefile.am b/lang/qt/tests/Makefile.am
index 85f6fa6..90f2978 100644
--- a/lang/qt/tests/Makefile.am
+++ b/lang/qt/tests/Makefile.am
@@ -25,10 +25,10 @@ TESTS_ENVIRONMENT = GNUPGHOME=$(abs_builddir)
 EXTRA_DIST = initial.test
 
 TESTS = initial.test t-keylist t-keylocate t-ownertrust t-tofuinfo \
-        t-encrypt
+        t-encrypt t-wkspublish
 
 moc_files = t-keylist.moc t-keylocate.moc t-ownertrust.moc t-tofuinfo.moc \
-            t-encrypt.moc t-support.hmoc
+            t-encrypt.moc t-support.hmoc t-wkspublish.moc
 
 AM_LDFLAGS = -no-install
 
@@ -55,6 +55,7 @@ t_keylocate_SOURCES = t-keylocate.cpp $(support_src)
 t_ownertrust_SOURCES = t-ownertrust.cpp $(support_src)
 t_tofuinfo_SOURCES = t-tofuinfo.cpp $(support_src)
 t_encrypt_SOURCES = t-encrypt.cpp $(support_src)
+t_wkspublish_SOURCES = t-wkspublish.cpp $(support_src)
 run_keyformailboxjob_SOURCES = run-keyformailboxjob.cpp
 
 nodist_t_keylist_SOURCES = $(moc_files)
@@ -62,7 +63,7 @@ nodist_t_keylist_SOURCES = $(moc_files)
 BUILT_SOURCES = $(moc_files)
 
 noinst_PROGRAMS = t-keylist t-keylocate t-ownertrust t-tofuinfo t-encrypt \
-    run-keyformailboxjob
+    run-keyformailboxjob t-wkspublish
 
 CLEANFILES = secring.gpg pubring.gpg pubring.kbx trustdb.gpg dirmngr.conf \
 	gpg-agent.conf pubring.kbx~ S.gpg-agent gpg.conf pubring.gpg~ \
diff --git a/lang/qt/tests/t-wkspublish.cpp b/lang/qt/tests/t-wkspublish.cpp
new file mode 100644
index 0000000..7039f3c
--- /dev/null
+++ b/lang/qt/tests/t-wkspublish.cpp
@@ -0,0 +1,280 @@
+/* t-wkspublish.cpp
+
+    This file is part of qgpgme, the Qt API binding for gpgme
+    Copyright (c) 2016 Intevation GmbH
+
+    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.
+
+    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.
+
+    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 <QDebug>
+#include <QTest>
+#include <QSignalSpy>
+#include <QTemporaryDir>
+#include "wkspublishjob.h"
+#include "keygenerationjob.h"
+#include "keygenerationresult.h"
+#include "importjob.h"
+#include "importresult.h"
+#include "protocol.h"
+#include "engineinfo.h"
+#include "context.h"
+
+#include "t-support.h"
+
+using namespace QGpgME;
+using namespace GpgME;
+
+//#define DO_ONLINE_TESTS
+
+#define TEST_ADDRESS "testuser2 at test.gnupg.org"
+
+static const char *testSecKey =
+"-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+"\n"
+"lHgEV77hVhMJKyQDAwIIAQEHAgMEN3qKqBr9EecnfUnpw8RS8DHAjJqhwm2HAoEE\n"
+"3yfQQ9w8uB/bKm5dqW4HML3JWRH8YoJaKSVrJY2D1FZUY+vHlgABAKDwEAB0HND8\n"
+"5kbxiJmqKIuuNqCJ2jHgs9G0xk4GdKvZEdq0JlRlc3QgVXNlciAyIDx0ZXN0dXNl\n"
+"cjJAdGVzdC5nbnVwZy5vcmc+iHkEExMIACEFAle+4VYCGwMFCwkIBwIGFQgJCgsC\n"
+"BBYCAwECHgECF4AACgkQRVRoUEJO+6zgFQD7BF3pnS3w3A7J9y+Y3kyGfmscXFWJ\n"
+"Kme1PAsAlVSm1y4A+weReMvWFYHJH257v94yhStmV8egGoybsNDttNAW53cbnHwE\n"
+"V77hVhIJKyQDAwIIAQEHAgMEX+6cF0HEn4g3ztFvwHyr7uwXMVYUGL3lE3mjhnV3\n"
+"SbY6Dmy3OeFVnEVkawHqSv+HobpQTeEqNoQHAoIiXFCRlgMBCAcAAP9FykiyDspm\n"
+"T33XWRPD+LAOmaIU7CIhfv9+lVkeExlU1w+qiGEEGBMIAAkFAle+4VYCGwwACgkQ\n"
+"RVRoUEJO+6xjhgD/ZJ/MwYZJPk/xPYhTP8+wF+tErVNA8w3pP9D69dgUPdcA/izZ\n"
+"Pji6YetVhgsyaHc4PrKynsk5G6nM3KkAOehUQsX8\n"
+"=S/Wa\n"
+"-----END PGP PRIVATE KEY BLOCK-----\n";
+
+static const char *testResponse =
+"From key-submission at test.gnupg.org Thu Aug 25 12:15:54 2016\n"
+"Return-Path: <webkey at g10code.com>\n"
+"From: key-submission at test.gnupg.org\n"
+"To: testuser2 at test.gnupg.org\n"
+"Subject: Confirm your key publication\n"
+"X-Wks-Loop: webkey.g10code.com\n"
+"MIME-Version: 1.0\n"
+"Content-Type: multipart/encrypted; protocol=\"application/pgp-encrypted\";\n"
+"	boundary=\"=-=01-wbu5fr9nu6fix5tcojjo=-=\"\n"
+"Date: Thu, 25 Aug 2016 12:15:54 +0000\n"
+"Message-Id: <E1bctZa-0004LE-Fr at kerckhoffs.g10code.com>\n"
+"Sender:  <webkey at g10code.com>\n"
+"X-Kolab-Scheduling-Message: FALSE\n"
+"\n"
+" \n"
+"\n"
+"--=-=01-wbu5fr9nu6fix5tcojjo=-=\n"
+"Content-Type: application/pgp-encrypted\n"
+"\n"
+"Version: 1\n"
+"\n"
+"--=-=01-wbu5fr9nu6fix5tcojjo=-=\n"
+"Content-Type: application/octet-stream\n"
+"\n"
+"-----BEGIN PGP MESSAGE-----\n"
+"Version: GnuPG v2\n"
+"\n"
+"hH4D8pSp7hUsFUASAgMEg0w39E6d0TkFYxLbT6n3YcoKTT+Ur/c7Sn1ECyL7Rnuk\n"
+"cmPO0adt3JxueK7Oz5COlk32SECFODdF3cQuDhkGxzC6Sfc4SfisdILmNhaT/MeW\n"
+"8a+yE4skSK70absif4kw5XkvxXNxHeIHfAteP50jPJLSwEsBTEceb9cRMoP7s8w0\n"
+"lYyi+RWQ7UKlKKywtcRCL4ow2H7spjx+a+3FzNOAoy7K0/thhLVRk8z+iuPi0/4n\n"
+"Z2Ql60USLLUlfV2ZIpXdCd+5GjTJsnGhDos1pas5TZcOOAxO12Cg5TcqHISOaqa8\n"
+"6BqxcKCU3NypIynOKHj375KArSs0WsEH8HWHyBBHB+NYtNpnTAuHNKxM+JtNxf+U\n"
+"NfD2zptS6kyiHLw+4zjL5pEV7RHS2PBwWBDS6vhnyybNwckleya96U04iYiGRYGE\n"
+"lUUR6Fl8H6x04dItFH1/jJA6Ppcu4FoYou04HADWCqJXPTgztjiW1/9QoCeXl5lm\n"
+"CcOCcuw7lXp+qTejuns=\n"
+"=SsWX\n"
+"-----END PGP MESSAGE-----\n"
+"\n"
+"--=-=01-wbu5fr9nu6fix5tcojjo=-=--\n";
+
+
+class WKSPublishTest : public QGpgMETest
+{
+    Q_OBJECT
+
+Q_SIGNALS:
+    void asyncDone();
+
+private Q_SLOTS:
+    void testUnsupported()
+    {
+        // First check if it is supported
+        auto job = openpgp()->wksPublishJob();
+        connect(job, &WKSPublishJob::result, this,
+                [this] (Error err, QByteArray out, QByteArray errout, QString, Error) {
+            Q_ASSERT(err);
+            Q_EMIT asyncDone();
+        });
+        job->startCheck ("testuser1 at localhost");
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        Q_ASSERT(spy.wait());
+    }
+#ifdef DO_ONLINE_TESTS
+private Q_SLOTS:
+#else
+private:
+#endif
+    void testWSKPublishSupport()
+    {
+        // First check if it is supported
+        auto job = openpgp()->wksPublishJob();
+        connect(job, &WKSPublishJob::result, this,
+                [this] (Error err, QByteArray out, QByteArray errout, QString, Error) {
+            if (GpgME::engineInfo(GpgME::GpgEngine).engineVersion() < "2.0.16") {
+                std::cout << err;
+                Q_ASSERT(err);
+            } else {
+                Q_ASSERT(!err);
+            }
+            Q_EMIT asyncDone();
+        });
+        job->startCheck ("testuser1 at test.gnupg.org");
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        Q_ASSERT(spy.wait());
+    }
+
+    void testWKSPublishErrors() {
+        if (GpgME::engineInfo(GpgME::GpgEngine).engineVersion() < "2.0.16") {
+            /* Not supported */
+            return;
+        }
+        auto job = openpgp()->wksPublishJob();
+        connect(job, &WKSPublishJob::result, this,
+                [this] (Error err, QByteArray out, QByteArray errout, QString, Error) {
+            Q_ASSERT(err);
+            Q_EMIT asyncDone();
+        });
+        job->startCreate("AB874F24E98EBB8487EE7B170F8E3D97FE7011B7",
+                         QStringLiteral("Foo at bar.baz"));
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        Q_ASSERT(spy.wait());
+    }
+
+    void testWKSPublishCreate() {
+        if (GpgME::engineInfo(GpgME::GpgEngine).engineVersion() < "2.0.16") {
+            /* Not supported */
+            return;
+        }
+        auto ctx = Context::createForProtocol(OpenPGP);
+        /* First generate a test key */
+        const QString args = QStringLiteral("<GnupgKeyParms format=\"internal\">\n"
+                                        "%no-protection\n"
+                                        "%transient-key\n"
+                                        "key-type:      ECDSA\n"
+                                        "key-curve:     brainpoolP256r1\n"
+                                        "key-usage:     sign\n"
+                                        "subkey-type:   ECDH\n"
+                                        "subkey-curve:  brainpoolP256r1\n"
+                                        "subkey-usage:  encrypt\n"
+                                        "name-email:    %1\n"
+                                        "name-real:     Test User\n"
+                                        "</GnupgKeyParms>").arg(TEST_ADDRESS);
+
+        auto keygenjob = openpgp()->keyGenerationJob();
+        QByteArray fpr;
+        connect(keygenjob, &KeyGenerationJob::result, this,
+                [this, &fpr](KeyGenerationResult result, QByteArray pubkeyData, QString, Error)
+        {
+            Q_ASSERT(!result.error());
+            fpr = QByteArray(result.fingerprint());
+            Q_ASSERT(!fpr.isEmpty());
+            Q_EMIT asyncDone();
+        });
+        keygenjob->start(args);
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        Q_ASSERT(spy.wait());
+
+        /* Then try to create a request. */
+        auto job = openpgp()->wksPublishJob();
+        connect(job, &WKSPublishJob::result, this,
+                [this] (Error err, QByteArray out, QByteArray errout, QString, Error) {
+            Q_ASSERT(!err);
+            Q_EMIT asyncDone();
+            const QString outstr = QString(out);
+            Q_ASSERT(outstr.contains(
+                     QStringLiteral("-----BEGIN PGP PUBLIC KEY BLOCK-----")));
+            Q_ASSERT(outstr.contains(
+                     QStringLiteral("Content-Type: application/pgp-keys")));
+            Q_ASSERT(outstr.contains(
+                     QStringLiteral("From: " TEST_ADDRESS)));
+        });
+        job->startCreate(fpr.constData(), QLatin1String(TEST_ADDRESS));
+        Q_ASSERT(spy.wait());
+    }
+
+    void testWKSPublishRecieve() {
+        if (GpgME::engineInfo(GpgME::GpgEngine).engineVersion() < "2.0.16") {
+            /* Not supported */
+            return;
+        }
+        auto importjob = openpgp()->importJob();
+        connect(importjob, &ImportJob::result, this,
+                [this](ImportResult result, QString, Error)
+        {
+            Q_ASSERT(!result.error());
+            Q_ASSERT(!result.imports().empty());
+            Q_ASSERT(result.numSecretKeysImported());
+            Q_EMIT asyncDone();
+        });
+        importjob->start(QByteArray(testSecKey));
+        QSignalSpy spy (this, SIGNAL(asyncDone()));
+        Q_ASSERT(spy.wait());
+
+        /* Get a response. */
+        auto job = openpgp()->wksPublishJob();
+        connect(job, &WKSPublishJob::result, this,
+                [this] (Error err, QByteArray out, QByteArray errout, QString, Error) {
+            Q_ASSERT(!err);
+            Q_EMIT asyncDone();
+            const QString outstr = QString(out);
+            Q_ASSERT(outstr.contains(
+                     QStringLiteral("-----BEGIN PGP MESSAGE-----")));
+            Q_ASSERT(outstr.contains(
+                     QStringLiteral("Content-Type: multipart/encrypted;")));
+            Q_ASSERT(outstr.contains(
+                     QStringLiteral("From: " TEST_ADDRESS)));
+        });
+        job->startRecieve(QByteArray(testResponse));
+        Q_ASSERT(spy.wait());
+    }
+
+    void initTestCase()
+    {
+        QGpgMETest::initTestCase();
+        const QString gpgHome = qgetenv("GNUPGHOME");
+        qputenv("GNUPGHOME", mDir.path().toUtf8());
+        Q_ASSERT(mDir.isValid());
+        QFile agentConf(mDir.path() + QStringLiteral("/gpg-agent.conf"));
+        Q_ASSERT(agentConf.open(QIODevice::WriteOnly));
+        agentConf.write("allow-loopback-pinentry");
+        agentConf.close();
+    }
+private:
+    QTemporaryDir mDir;
+};
+
+QTEST_MAIN(WKSPublishTest)
+
+#include "t-wkspublish.moc"

commit 94420b05775122b25885c66ac67f77c59d01644d
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Thu Aug 25 14:29:41 2016 +0200

    qt: Add WKSPublishJob
    
    * lang/qt/src/Makefile.am: Add new files.
    * lang/qt/src/job.cpp: Include moc / subclass stub.
    * lang/qt/src/protocol.h: Add virtual for new job.
    * lang/qt/src/protocol_p.h: Add job.
    * lang/qt/src/wkspublishjob.h: Interface for WKSPublishJob.
    * lang/qt/src/qgpgmewkspublishjob.cpp,
    lang/qt/src/qgpgmewkspublishjob.h: New.
    
    --
    The Job was originally intended to be used with a SpawnEngine
    Context but QProcess was a better fit for the job.
    
    Usage is similar to the client tool. check, create, recieve.

diff --git a/lang/qt/src/Makefile.am b/lang/qt/src/Makefile.am
index 840557e..8f6d773 100644
--- a/lang/qt/src/Makefile.am
+++ b/lang/qt/src/Makefile.am
@@ -34,7 +34,7 @@ qgpgme_sources = \
     qgpgmesignjob.cpp qgpgmesignkeyjob.cpp qgpgmeverifydetachedjob.cpp \
     qgpgmeverifyopaquejob.cpp threadedjobmixin.cpp \
     qgpgmekeyformailboxjob.cpp gpgme_backend_debug.cpp \
-    defaultkeygenerationjob.cpp
+    defaultkeygenerationjob.cpp qgpgmewkspublishjob.cpp
 
 # If you add one here make sure that you also add one in camelcase
 qgpgme_headers= \
@@ -68,7 +68,8 @@ qgpgme_headers= \
     keylistjob.h \
     listallkeysjob.h \
     verifydetachedjob.h \
-    defaultkeygenerationjob.h
+    defaultkeygenerationjob.h \
+    wkspublishjob.h
 
 camelcase_headers= \
     AddUserIDJob \
@@ -100,7 +101,8 @@ camelcase_headers= \
     ListAllKeysJob \
     VerifyDetachedJob \
     KeyForMailboxJob \
-    DefaultKeyGenerationJob
+    DefaultKeyGenerationJob \
+    WKSPublishJob
 
 private_qgpgme_headers = \
     qgpgme_export.h \
@@ -130,6 +132,7 @@ private_qgpgme_headers = \
     qgpgmeverifydetachedjob.h \
     qgpgmeverifyopaquejob.h \
     qgpgmekeyformailboxjob.h \
+    qgpgmewkspublishjob.h \
     specialjob.h \
     threadedjobmixin.h
 
@@ -175,6 +178,7 @@ qgpgme_moc_sources = \
     qgpgmesignkeyjob.moc \
     qgpgmeverifydetachedjob.moc \
     qgpgmeverifyopaquejob.moc \
+    qgpgmewkspublishjob.moc \
     refreshkeysjob.moc \
     signencryptjob.moc \
     signjob.moc \
@@ -183,6 +187,7 @@ qgpgme_moc_sources = \
     verifydetachedjob.moc \
     verifyopaquejob.moc \
     keyformailboxjob.moc \
+    wkspublishjob.moc \
     qgpgmekeyformailboxjob.moc \
     defaultkeygenerationjob.moc
 
diff --git a/lang/qt/src/job.cpp b/lang/qt/src/job.cpp
index 8e50647..6b355a0 100644
--- a/lang/qt/src/job.cpp
+++ b/lang/qt/src/job.cpp
@@ -56,6 +56,7 @@
 #include "adduseridjob.h"
 #include "specialjob.h"
 #include "keyformailboxjob.h"
+#include "wkspublishjob.h"
 
 #include <QCoreApplication>
 #include <QDebug>
@@ -122,6 +123,7 @@ make_job_subclass(RefreshKeysJob)
 make_job_subclass(AddUserIDJob)
 make_job_subclass(SpecialJob)
 make_job_subclass(KeyForMailboxJob)
+make_job_subclass(WKSPublishJob)
 
 #undef make_job_subclass
 
@@ -151,3 +153,4 @@ make_job_subclass(KeyForMailboxJob)
 #include "adduseridjob.moc"
 #include "specialjob.moc"
 #include "keyformailboxjob.moc"
+#include "wkspublishjob.moc"
diff --git a/lang/qt/src/protocol.h b/lang/qt/src/protocol.h
index 23b9d93..b2dee1d 100644
--- a/lang/qt/src/protocol.h
+++ b/lang/qt/src/protocol.h
@@ -63,6 +63,7 @@ class ChangePasswdJob;
 class AddUserIDJob;
 class SpecialJob;
 class KeyForMailboxJob;
+class WKSPublishJob;
 
 /** The main entry point for QGpgME Comes in OpenPGP and SMIME(CMS) flavors.
  *
@@ -148,6 +149,9 @@ public:
     virtual KeyListJob *locateKeysJob() const = 0;
     /** Find the best key to use for a mailbox. */
     virtual KeyForMailboxJob *keyForMailboxJob() const = 0;
+
+    /** A Job for interacting with gnupg's wks tools. */
+    virtual WKSPublishJob *wksPublishJob() const = 0;
 };
 
 /** Obtain a reference to the OpenPGP Protocol.
diff --git a/lang/qt/src/protocol_p.h b/lang/qt/src/protocol_p.h
index afb4f9c..2ce4182 100644
--- a/lang/qt/src/protocol_p.h
+++ b/lang/qt/src/protocol_p.h
@@ -57,6 +57,7 @@
 #include "qgpgmechangepasswdjob.h"
 #include "qgpgmeadduseridjob.h"
 #include "qgpgmekeyformailboxjob.h"
+#include "qgpgmewkspublishjob.h"
 
 namespace
 {
@@ -387,6 +388,18 @@ public:
         }
         return new QGpgME::QGpgMEKeyForMailboxJob(context);
     }
+
+    QGpgME::WKSPublishJob *wksPublishJob() const Q_DECL_OVERRIDE
+    {
+        if (mProtocol != GpgME::OpenPGP) {
+            return Q_NULLPTR;
+        }
+        auto context = GpgME::Context::createForEngine(GpgME::SpawnEngine);
+        if (!context) {
+            return Q_NULLPTR;
+        }
+        return new QGpgME::QGpgMEWKSPublishJob(context.release());
+    }
 };
 
 }
diff --git a/lang/qt/src/qgpgmewkspublishjob.cpp b/lang/qt/src/qgpgmewkspublishjob.cpp
new file mode 100644
index 0000000..8f97cb5
--- /dev/null
+++ b/lang/qt/src/qgpgmewkspublishjob.cpp
@@ -0,0 +1,189 @@
+/* wkspublishjob.cpp
+
+    Copyright (c) 2016 Intevation GmbH
+
+    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.
+
+    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.
+
+    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 "qgpgmewkspublishjob.h"
+
+#include "context.h"
+#include "key.h"
+#include "util.h"
+
+#include <QFileInfo>
+#include <QDir>
+#include <QProcess>
+
+/* Timeout for the WKS Processes will be 5 Minutes as
+ * they can involve pinentry questions. */
+#define TIMEOUT_VALUE (5*60*1000)
+
+using namespace QGpgME;
+using namespace GpgME;
+
+QGpgMEWKSPublishJob::QGpgMEWKSPublishJob(Context *context)
+    : mixin_type(context)
+{
+    lateInitialization();
+}
+
+QGpgMEWKSPublishJob::~QGpgMEWKSPublishJob() {}
+
+static QString getWKSClient()
+{
+    auto libexecdir = QString::fromLocal8Bit(dirInfo("libexecdir"));
+    if (libexecdir.isEmpty()) {
+        return QString();
+    }
+
+    const QFileInfo fi(QDir(libexecdir).absoluteFilePath(QStringLiteral("gpg-wks-client")));
+    if (fi.exists() && fi.isExecutable()) {
+        return fi.absoluteFilePath();
+    }
+    return QString();
+}
+
+static QGpgMEWKSPublishJob::result_type check_worker(const QString &mail)
+{
+    if (mail.isEmpty()) {
+        return std::make_tuple (Error(make_error(GPG_ERR_INV_ARG)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+
+    const auto wksPath = getWKSClient();
+    if (wksPath.isEmpty()) {
+        return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+
+    /* QProcess instead of engine_spawn because engine_spawn does not communicate
+     * the return value of the process and we are in qt anyway. */
+    QProcess proc;
+    proc.setProgram(wksPath);
+    proc.setArguments(QStringList() << QStringLiteral("--supported") << mail);
+    proc.start();
+    if (!proc.waitForStarted()) {
+        return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+    if (!proc.waitForFinished(TIMEOUT_VALUE)) {
+        return std::make_tuple (Error(make_error(GPG_ERR_TIMEOUT)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+    if (proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0) {
+        return std::make_tuple (Error(), QByteArray(), QByteArray(), QString(), Error());
+    }
+    return std::make_tuple (Error(make_error(GPG_ERR_NOT_ENABLED)),
+                            QByteArray(), QByteArray(), QString(), Error());
+}
+
+static QGpgMEWKSPublishJob::result_type create_worker(const char *fpr, const QString &mail)
+{
+    if (mail.isEmpty() || !fpr) {
+        return std::make_tuple (Error(make_error(GPG_ERR_INV_ARG)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+
+    const auto wksPath = getWKSClient();
+    if (wksPath.isEmpty()) {
+        return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+
+    QProcess proc;
+    proc.setProgram(wksPath);
+    proc.setArguments(QStringList() << QStringLiteral("--create")
+                                    << QLatin1String(fpr)
+                                    << mail);
+    proc.start();
+    if (!proc.waitForStarted()) {
+        return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+
+    if (!proc.waitForFinished(TIMEOUT_VALUE)) {
+        return std::make_tuple (Error(make_error(GPG_ERR_TIMEOUT)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+    if (proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0) {
+        return std::make_tuple (Error(), proc.readAllStandardOutput(),
+                                proc.readAllStandardError(), QString(), Error());
+    }
+    return std::make_tuple (Error(make_error(GPG_ERR_GENERAL)),
+                            proc.readAllStandardOutput(), proc.readAllStandardError(), QString(), Error());
+}
+
+static QGpgMEWKSPublishJob::result_type recieve_worker(const QByteArray &response)
+{
+    if (response.isEmpty()) {
+        return std::make_tuple (Error(make_error(GPG_ERR_INV_ARG)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+
+    const auto wksPath = getWKSClient();
+    if (wksPath.isEmpty()) {
+        return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+
+    QProcess proc;
+    proc.setProgram(wksPath);
+    proc.setArguments(QStringList() << QStringLiteral("--receive"));
+    proc.start();
+    if (!proc.waitForStarted()) {
+        return std::make_tuple (Error(make_error(GPG_ERR_NOT_SUPPORTED)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+    proc.write(response);
+    proc.closeWriteChannel();
+    if (!proc.waitForFinished(TIMEOUT_VALUE)) {
+        return std::make_tuple (Error(make_error(GPG_ERR_TIMEOUT)),
+                                QByteArray(), QByteArray(), QString(), Error());
+    }
+    if (proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0) {
+        return std::make_tuple (Error(), proc.readAllStandardOutput(),
+                                proc.readAllStandardError(), QString(), Error());
+    }
+    return std::make_tuple (Error(make_error(GPG_ERR_GENERAL)),
+                            proc.readAllStandardOutput(), proc.readAllStandardError(), QString(), Error());
+}
+
+void QGpgMEWKSPublishJob::startCheck(const QString &mailbox)
+{
+    run(std::bind(&check_worker, mailbox));
+}
+
+void QGpgMEWKSPublishJob::startCreate(const char *fpr, const QString &mailbox) {
+    run(std::bind(&create_worker, fpr, mailbox));
+}
+
+void QGpgMEWKSPublishJob::startRecieve(const QByteArray &response)
+{
+    run(std::bind(&recieve_worker, response));
+}
+
+#include "qgpgmewkspublishjob.moc"
diff --git a/lang/qt/src/qgpgmewkspublishjob.h b/lang/qt/src/qgpgmewkspublishjob.h
new file mode 100644
index 0000000..1a31149
--- /dev/null
+++ b/lang/qt/src/qgpgmewkspublishjob.h
@@ -0,0 +1,70 @@
+/* qgpgmewkspublishjob.h
+
+    Copyright (c) 2016 Intevation GmbH
+
+    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.
+
+    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.
+
+    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.
+*/
+#ifndef QGPGME_QGPGMEWKSPUBLISHJOB_H
+#define QGPGME_QGPGMEWKSPUBLISHJOB_H
+
+#include "wkspublishjob.h"
+
+#include "threadedjobmixin.h"
+namespace GpgME
+{
+    class Key;
+} // namespace GpgME
+
+namespace QGpgME {
+
+/**
+ * Handles Web Key Service Publishing. Needs WKS tools installed and
+ * server support.
+ */
+class QGpgMEWKSPublishJob
+#ifdef Q_MOC_RUN
+    : public WKSPublishJob
+#else
+    : public _detail::ThreadedJobMixin<WKSPublishJob, std::tuple<GpgME::Error, QByteArray, QByteArray, QString, GpgME::Error> >
+#endif
+{
+    Q_OBJECT
+#ifdef Q_MOC_RUN
+public Q_SLOTS:
+    void slotFinished();
+#endif
+public:
+    explicit QGpgMEWKSPublishJob(GpgME::Context *context);
+    ~QGpgMEWKSPublishJob();
+
+    void startCheck(const QString &mailbox) Q_DECL_OVERRIDE;
+    void startCreate(const char *fpr, const QString &mailbox) Q_DECL_OVERRIDE;
+    void startRecieve(const QByteArray &response) Q_DECL_OVERRIDE;
+};
+
+}
+
+#endif
diff --git a/lang/qt/src/wkspublishjob.h b/lang/qt/src/wkspublishjob.h
new file mode 100644
index 0000000..782112f
--- /dev/null
+++ b/lang/qt/src/wkspublishjob.h
@@ -0,0 +1,101 @@
+/* wkspublishjob.h
+
+    Copyright (c) 2016 Intevation GmbH
+
+    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.
+
+    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.
+
+    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.
+*/
+#ifndef QGPGME_WKSPUBLISHJOB_H
+#define QGPGME_WKSPUBLISHJOB_H
+
+#include "job.h"
+
+#include "qgpgme_export.h"
+
+namespace GpgME
+{
+    class Key;
+} // namespace GpgME
+
+namespace QGpgME {
+
+/**
+ * Handles Web Key Service Publishing. Needs WKS tools installed and
+ * server support.
+ *
+ * Remember that after a result is emited the job is auto deleted
+ * so you can only use it for a single action.
+ */
+class QGPGME_EXPORT WKSPublishJob: public Job
+{
+    Q_OBJECT
+protected:
+    explicit WKSPublishJob(QObject *parent);
+public:
+    ~WKSPublishJob();
+
+
+    /** Start a check if WKS Publishing is supported. As this involves
+     * an HTTP Query it might take a while. Returns GPG_ERR_NOT_SUPPORED
+     * result if GnuPG is too old or the required tools are not installed.
+     *
+     * The error GPG_ERR_NOT_ENABLED indicates that wks-tools failed to
+     * detect a working wks service for this.
+     *
+     * @param the mailbox to check for.
+     **/
+    virtual void startCheck(const QString &mailbox) = 0;
+
+    /** Create a publish request.
+     * The returned Data from the result will contain
+     * the full Mail as returned by gpg-wks-client --create
+     *
+     * @param fpr the fingerprint of the key to create the request for.
+     * @param mailbox A simple mail address without a Name.
+     */
+    virtual void startCreate(const char *fpr, const QString &mailbox) = 0;
+
+    /** Handle a submisson response. The returned Data will contain
+     * the full Mail as returned by gpg-wks-client --create
+     *
+     * @param response The response of the server.
+     **/
+    virtual void startRecieve(const QByteArray &response) = 0;
+
+Q_SIGNALS:
+    /* Result of the operation returned Data and returned Error are
+     * the results from gpg-wks-client's stdout or stderr respectively.
+     *
+     * As usual auditLogAsHtml and auditLogError can be ignored.
+     **/
+    void result(const GpgME::Error &error, const QByteArray &returnedData,
+                const QByteArray &returnedError,
+                const QString &auditLogAsHtml = QString(),
+                const GpgME::Error &auditLogError = GpgME::Error());
+};
+
+}
+
+#endif

-----------------------------------------------------------------------

Summary of changes:
 lang/qt/src/Makefile.am                            |  11 +-
 lang/qt/src/job.cpp                                |   3 +
 lang/qt/src/protocol.h                             |   4 +
 lang/qt/src/protocol_p.h                           |  13 +
 lang/qt/src/qgpgmewkspublishjob.cpp                | 189 ++++++++++++++
 .../{qgpgmedeletejob.h => qgpgmewkspublishjob.h}   |  47 ++--
 lang/qt/src/wkspublishjob.h                        | 101 ++++++++
 lang/qt/tests/Makefile.am                          |   7 +-
 lang/qt/tests/t-wkspublish.cpp                     | 280 +++++++++++++++++++++
 9 files changed, 625 insertions(+), 30 deletions(-)
 create mode 100644 lang/qt/src/qgpgmewkspublishjob.cpp
 copy lang/qt/src/{qgpgmedeletejob.h => qgpgmewkspublishjob.h} (60%)
 create mode 100644 lang/qt/src/wkspublishjob.h
 create mode 100644 lang/qt/tests/t-wkspublish.cpp


hooks/post-receive
-- 
GnuPG Made Easy
http://git.gnupg.org




More information about the Gnupg-commits mailing list