aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--configure.ac2
-rw-r--r--lang/qt/src/protocol.h14
-rw-r--r--lang/qt/src/protocol_p.h12
-rw-r--r--lang/qt/tests/Makefile.am7
-rw-r--r--lang/qt/tests/t-keylocate.cpp129
5 files changed, 160 insertions, 4 deletions
diff --git a/configure.ac b/configure.ac
index 87b9e976..eefa1de4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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
diff --git a/lang/qt/src/protocol.h b/lang/qt/src/protocol.h
index 5162fe6a..e5153b50 100644
--- a/lang/qt/src/protocol.h
+++ b/lang/qt/src/protocol.h
@@ -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.
diff --git a/lang/qt/src/protocol_p.h b/lang/qt/src/protocol_p.h
index d6c5625a..9fcbc8b7 100644
--- a/lang/qt/src/protocol_p.h
+++ b/lang/qt/src/protocol_p.h
@@ -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);
+ }
};
}
diff --git a/lang/qt/tests/Makefile.am b/lang/qt/tests/Makefile.am
index 6da9d29c..4a14e63d 100644
--- a/lang/qt/tests/Makefile.am
+++ b/lang/qt/tests/Makefile.am
@@ -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
index 00000000..12ab551a
--- /dev/null
+++ b/lang/qt/tests/t-keylocate.cpp
@@ -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("[email protected]");
+ 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("[email protected]");
+
+ 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"