Qt: Add DefaultKeyGenerationJob
authorAndre Heinecke <aheinecke@intevation.de>
Thu, 11 Aug 2016 15:57:14 +0000 (17:57 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Thu, 11 Aug 2016 16:00:14 +0000 (18:00 +0200)
* lang/qt/src/defaultkeygenerationjob.cpp,
lang/qt/src/defaultkeygenerationjob.h: New.
* lang/qt/src/Makefile.am: Update accordingly.

--
The defaultkeygenerationjob makes it easier to just generate a key
in the future this should probably use quick-gen key but since this
is not exposed in gpgme we hardcode the defaults and do it with
the params file.

This is also the first job that uses a new and better architecture
without backend abstraction and the pimpl pattern instead of
a specialized subclass.

This is an adoption of kde's libkleo commit f49b7157
Thanks dvratil@kde.org

lang/qt/src/Makefile.am
lang/qt/src/defaultkeygenerationjob.cpp [new file with mode: 0644]
lang/qt/src/defaultkeygenerationjob.h [new file with mode: 0644]

index 59d8abc..840557e 100644 (file)
@@ -33,7 +33,8 @@ qgpgme_sources = \
     qgpgmesecretkeyexportjob.cpp qgpgmesignencryptjob.cpp \
     qgpgmesignjob.cpp qgpgmesignkeyjob.cpp qgpgmeverifydetachedjob.cpp \
     qgpgmeverifyopaquejob.cpp threadedjobmixin.cpp \
-    qgpgmekeyformailboxjob.cpp gpgme_backend_debug.cpp
+    qgpgmekeyformailboxjob.cpp gpgme_backend_debug.cpp \
+    defaultkeygenerationjob.cpp
 
 # If you add one here make sure that you also add one in camelcase
 qgpgme_headers= \
@@ -66,7 +67,8 @@ qgpgme_headers= \
     keygenerationjob.h \
     keylistjob.h \
     listallkeysjob.h \
-    verifydetachedjob.h
+    verifydetachedjob.h \
+    defaultkeygenerationjob.h
 
 camelcase_headers= \
     AddUserIDJob \
@@ -97,7 +99,8 @@ camelcase_headers= \
     KeyListJob \
     ListAllKeysJob \
     VerifyDetachedJob \
-    KeyForMailboxJob
+    KeyForMailboxJob \
+    DefaultKeyGenerationJob
 
 private_qgpgme_headers = \
     qgpgme_export.h \
@@ -180,7 +183,8 @@ qgpgme_moc_sources = \
     verifydetachedjob.moc \
     verifyopaquejob.moc \
     keyformailboxjob.moc \
-    qgpgmekeyformailboxjob.moc
+    qgpgmekeyformailboxjob.moc \
+    defaultkeygenerationjob.moc
 
 qgpgmeincludedir = $(includedir)/qgpgme
 qgpgmeinclude_HEADERS = $(qgpgme_headers)
diff --git a/lang/qt/src/defaultkeygenerationjob.cpp b/lang/qt/src/defaultkeygenerationjob.cpp
new file mode 100644 (file)
index 0000000..727eabb
--- /dev/null
@@ -0,0 +1,123 @@
+/* defaultkeygenerationjob.cpp
+
+    Copyright (c) 2016 Klarälvdalens Datakonsult AB
+
+    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 "defaultkeygenerationjob.h"
+#include "protocol.h"
+#include "keygenerationjob.h"
+
+#include <QPointer>
+#include <QEvent>
+
+using namespace QGpgME;
+
+namespace QGpgME {
+
+class DefaultKeyGenerationJob::Private
+{
+public:
+    Private()
+    {}
+
+    ~Private()
+    {
+        if (job) {
+            job->deleteLater();
+        }
+    }
+
+    QPointer<KeyGenerationJob> job;
+};
+}
+
+
+DefaultKeyGenerationJob::DefaultKeyGenerationJob(QObject* parent)
+    : Job(parent)
+    , d(new DefaultKeyGenerationJob::Private())
+{
+}
+
+DefaultKeyGenerationJob::~DefaultKeyGenerationJob()
+{
+    delete d;
+}
+
+QString DefaultKeyGenerationJob::auditLogAsHtml() const
+{
+    return d->job ? d->job->auditLogAsHtml() : QString();
+}
+
+GpgME::Error DefaultKeyGenerationJob::auditLogError() const
+{
+    return d->job ? d->job->auditLogError() : GpgME::Error();
+}
+
+void DefaultKeyGenerationJob::slotCancel()
+{
+    if (d->job) {
+        d->job->slotCancel();
+    }
+}
+
+GpgME::Error DefaultKeyGenerationJob::start(const QString &email, const QString &name)
+{
+    const QString args = QStringLiteral("<GnupgKeyParms format=\"internal\">\n"
+                                        "%ask-passphrase\n"
+                                        "key-type:      RSA\n"
+                                        "key-length:    2048\n"
+                                        "key-usage:     sign\n"
+                                        "subkey-type:   RSA\n"
+                                        "subkey-length: 2048\n"
+                                        "subkey-usage:  encrypt\n"
+                                        "name-email:    %1\n"
+                                        "name-real:     %2\n"
+                                        "</GnupgKeyParms>").arg(email, name);
+
+    d->job = openpgp()->keyGenerationJob();
+    d->job->installEventFilter(this);
+    connect(d->job, &KeyGenerationJob::result,
+            this, &DefaultKeyGenerationJob::result);
+    connect(d->job, &KeyGenerationJob::done,
+            this, &DefaultKeyGenerationJob::done);
+    connect(d->job, &KeyGenerationJob::done,
+            this, &QObject::deleteLater);
+    return d->job->start(args);
+}
+
+bool DefaultKeyGenerationJob::eventFilter(QObject *watched, QEvent *event)
+{
+    // Intercept the KeyGenerationJob's deferred delete event. We want the job
+    // to live at least as long as we do so we can delegate calls to it. We will
+    // delete the job manually afterwards.
+    if (watched == d->job && event->type() == QEvent::DeferredDelete) {
+        return true;
+    }
+
+    return Job::eventFilter(watched, event);
+}
diff --git a/lang/qt/src/defaultkeygenerationjob.h b/lang/qt/src/defaultkeygenerationjob.h
new file mode 100644 (file)
index 0000000..5b7334c
--- /dev/null
@@ -0,0 +1,76 @@
+/* defaultkeygenerationjob.h
+
+    Copyright (c) 2016 Klarälvdalens Datakonsult AB
+
+    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_DEFAULTKEYGENERATION_H
+#define QGPGME_DEFAULTKEYGENERATION_H
+
+#include "job.h"
+
+#include "qgpgme_export.h"
+
+namespace GpgME {
+class KeyGenerationResult;
+}
+
+namespace QGpgME{
+
+/**
+ * Generates a PGP RSA/2048 bit key pair for given name and email address.
+ */
+class QGPGME_EXPORT DefaultKeyGenerationJob : public Job
+{
+    Q_OBJECT
+public:
+    explicit DefaultKeyGenerationJob(QObject *parent = Q_NULLPTR);
+    ~DefaultKeyGenerationJob();
+
+    GpgME::Error start(const QString &email, const QString &name);
+
+    QString auditLogAsHtml() const Q_DECL_OVERRIDE;
+    GpgME::Error auditLogError() const Q_DECL_OVERRIDE;
+
+
+public Q_SLOTS:
+    void slotCancel() Q_DECL_OVERRIDE;
+
+Q_SIGNALS:
+    void result(const GpgME::KeyGenerationResult &result, const QByteArray &pubkeyData,
+                const QString &auditLogAsHtml, const GpgME::Error &auditLogError);
+
+protected:
+    bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE;
+
+private:
+    class Private;
+    Private * const d;
+};
+
+}
+
+#endif