Qt: Add keyLocateJob and test for it
authorAndre Heinecke <aheinecke@intevation.de>
Fri, 13 May 2016 11:16:12 +0000 (13:16 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Fri, 13 May 2016 11:16:12 +0000 (13:16 +0200)
* configure.ac (LIBQGPGME_LT_REVISION): Bump.
* lang/qt/src/protocol.h (locateKeysJob): Add Job.
* lang/qt/src/protocol_p.h (locateKeysJob): Implement.
* lang/qt/tests/Makefile.am: Add t-keylocate.
* lang/qt/tests/t-keylocate.cpp: New.

configure.ac
lang/qt/src/protocol.h
lang/qt/src/protocol_p.h
lang/qt/tests/Makefile.am
lang/qt/tests/t-keylocate.cpp [new file with mode: 0644]

index 87b9e97..eefa1de 100644 (file)
@@ -67,7 +67,7 @@ LIBGPGMEPP_LT_REVISION=0
 
 LIBQGPGME_LT_CURRENT=6
 LIBQGPGME_LT_AGE=0
-LIBQGPGME_LT_REVISION=0
+LIBQGPGME_LT_REVISION=1
 
 # If the API is changed in an incompatible way: increment the next counter.
 GPGME_CONFIG_API_VERSION=1
index 5162fe6..e5153b5 100644 (file)
@@ -96,6 +96,20 @@ public:
     virtual ChangeOwnerTrustJob  *changeOwnerTrustJob() const = 0;
     virtual AddUserIDJob         *addUserIDJob() const = 0;
     virtual SpecialJob           *specialJob(const char *type, const QMap<QString, QVariant> &args) const = 0;
+
+    /** A key locate job.
+     *
+     * This tries to find a key in local
+     * and remote sources, if the key was remote it is imported
+     * by GnuPG. Same as KeyListJob but intended to be used
+     * to locate keys automatically. This ends up calling --locate-keys.
+     *
+     * Only available for OpenPGP
+     *
+     * Results are validated. As if keyListJob was called
+     * with both includeSigs and validate options.
+     */
+    virtual KeyListJob *locateKeysJob() const = 0;
 };
 
 /** Obtain a reference to the OpenPGP Protocol.
index d6c5625..9fcbc8b 100644 (file)
@@ -365,6 +365,18 @@ public:
         return new QGpgME::QGpgMEAddUserIDJob(context);
     }
 
+    QGpgME::KeyListJob *locateKeysJob() const Q_DECL_OVERRIDE
+    {
+        if (mProtocol != GpgME::OpenPGP) {
+            return Q_NULLPTR;
+        }
+        GpgME::Context *context = GpgME::Context::createForProtocol(mProtocol);
+        if (!context) {
+            return Q_NULLPTR;
+        }
+        context->setKeyListMode(GpgME::Extern | GpgME::Local | GpgME::Signatures | GpgME::Validate);
+        return new QGpgME::QGpgMEKeyListJob(context);
+    }
 };
 
 }
index 6da9d29..4a14e63 100644 (file)
@@ -24,9 +24,9 @@ TESTS_ENVIRONMENT = GNUPGHOME=$(abs_builddir)
 
 EXTRA_DIST = initial.test
 
-TESTS = initial.test t-keylist
+TESTS = initial.test t-keylist t-keylocate
 
-moc_files = t-keylist.moc
+moc_files = t-keylist.moc t-keylocate.moc
 
 AM_LDFLAGS = -no-install
 
@@ -47,12 +47,13 @@ check-local: ./pubring-stamp
 initial.test : check-local
 
 t_keylist_SOURCES = t-keylist.cpp
+t_keylocate_SOURCES = t-keylocate.cpp
 
 nodist_t_keylist_SOURCES = $(moc_files)
 
 BUILT_SOURCES = $(moc_files)
 
-noinst_PROGRAMS = t-keylist
+noinst_PROGRAMS = t-keylist t-keylocate
 
 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-keylocate.cpp b/lang/qt/tests/t-keylocate.cpp
new file mode 100644 (file)
index 0000000..12ab551
--- /dev/null
@@ -0,0 +1,129 @@
+/* t-keylocate.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 "keylistjob.h"
+#include "protocol.h"
+#include "keylistresult.h"
+
+using namespace QGpgME;
+using namespace GpgME;
+
+class KeyLocateTest : public QObject
+{
+    Q_OBJECT
+
+Q_SIGNALS:
+    void asyncDone();
+
+private Q_SLOTS:
+
+#ifdef DO_ONLINE_TESTS
+    void testDaneKeyLocate()
+    {
+        QTemporaryDir dir;
+        const QString oldHome = qgetenv("GNUPGHOME");
+        qputenv("GNUPGHOME", dir.path().toUtf8());
+        /* Could do this with gpgconf but this is not a gpgconf test ;-) */
+        QFile conf(dir.path() + QStringLiteral("/gpg.conf"));
+        Q_ASSERT(conf.open(QIODevice::WriteOnly));
+        conf.write("auto-key-locate dane");
+        conf.close();
+
+        auto *job = openpgp()->locateKeysJob();
+        mTestpattern = QStringLiteral("wk@gnupg.org");
+        connect(job, &KeyListJob::result, job, [this, job](KeyListResult result, std::vector<Key> keys, QString, Error)
+        {
+            Q_ASSERT(!result.error());
+            Q_ASSERT(keys.size() == 1);
+
+            Key k = keys.front();
+            Q_ASSERT(k.numUserIDs());
+            bool found = false;
+            Q_FOREACH (const UserID uid, k.userIDs()) {
+                const QString mailBox = QString::fromUtf8(uid.email());
+                if (mTestpattern.toLower() == mailBox.toLower()) {
+                    found = true;
+                }
+            }
+            Q_ASSERT(found);
+            Q_EMIT asyncDone();
+        });
+        job->start(QStringList() << mTestpattern);
+        QSignalSpy spy (this, &KeyLocateTest::asyncDone);
+        Q_ASSERT(spy.wait());
+        qputenv("GNUPGHOME", oldHome.toUtf8());
+    }
+#endif
+
+    void testKeyLocateSingle()
+    {
+        auto *job = openpgp()->locateKeysJob();
+        mTestpattern = QStringLiteral("alfa@example.net");
+
+        connect(job, &KeyListJob::result, job, [this, job](KeyListResult result, std::vector<Key> keys, QString, Error)
+        {
+            Q_ASSERT(!result.isNull());
+            Q_ASSERT(!result.isTruncated());
+            Q_ASSERT(!result.error());
+            Q_ASSERT(keys.size() == 1);
+
+            Key k = keys.front();
+            Q_ASSERT(k.numUserIDs());
+            bool found = false;
+            Q_FOREACH (const UserID uid, k.userIDs()) {
+                const QString mailBox = QString::fromUtf8(uid.email());
+                if (mTestpattern.toLower() == mailBox.toLower()) {
+                    found = true;
+                }
+            }
+            Q_ASSERT(found);
+            Q_EMIT asyncDone();
+        });
+        job->start(QStringList() << mTestpattern);
+        QSignalSpy spy (this, &KeyLocateTest::asyncDone);
+        Q_ASSERT(spy.wait());
+    }
+
+    void initTestCase()
+    {
+        const QString gpgHome = qgetenv("GNUPGHOME");
+        QVERIFY2(!gpgHome.isEmpty(), "GNUPGHOME environment variable is not set.");
+    }
+private:
+    QString mTestpattern;
+};
+
+QTEST_MAIN(KeyLocateTest)
+
+#include "t-keylocate.moc"