qt: Add job for refreshing OpenPGP keys via WKD
* lang/qt/src/wkdrefreshjob.cpp, lang/qt/src/wkdrefreshjob.h, lang/qt/src/wkdrefreshjob_p.h, lang/qt/src/qgpgmewkdrefreshjob.cpp, lang/qt/src/qgpgmewkdrefreshjob.h: New. * lang/qt/src/protocol.h (class Protocol): Add pure virtual member function wkdRefreshJob * lang/qt/src/protocol_p.h (Protocol::wkdRefreshJob): ... and implement it. * lang/qt/src/Makefile.am: Update accordingly. * lang/qt/tests/run-wkdrefreshjob.cpp: New. * lang/qt/tests/Makefile.am: Add new test runner. -- This job allows updating keys via WKD. Only user IDs that were originally retrieved via WKD (i.e. which have origin WKD) are considered. GnuPG-bug-id: 6672
This commit is contained in:
parent
fb03a5b3df
commit
2ad36f7114
6
NEWS
6
NEWS
@ -1,6 +1,12 @@
|
|||||||
Noteworthy changes in version 1.22.1 (unreleased)
|
Noteworthy changes in version 1.22.1 (unreleased)
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
|
|
||||||
|
* qt: Support refreshing keys via WKD. [T6672]
|
||||||
|
|
||||||
|
* Interface changes relative to the 1.22.0 release:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
qt: Protocol::wkdRefreshJob NEW.
|
||||||
|
qt: WKDRefreshJob NEW.
|
||||||
|
|
||||||
Noteworthy changes in version 1.22.0 (2023-08-21)
|
Noteworthy changes in version 1.22.0 (2023-08-21)
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
|
@ -56,6 +56,7 @@ qgpgme_sources = \
|
|||||||
qgpgmesignencryptarchivejob.cpp \
|
qgpgmesignencryptarchivejob.cpp \
|
||||||
qgpgmesignjob.cpp qgpgmesignkeyjob.cpp qgpgmeverifydetachedjob.cpp \
|
qgpgmesignjob.cpp qgpgmesignkeyjob.cpp qgpgmeverifydetachedjob.cpp \
|
||||||
qgpgmeverifyopaquejob.cpp qgpgmewkdlookupjob.cpp threadedjobmixin.cpp \
|
qgpgmeverifyopaquejob.cpp qgpgmewkdlookupjob.cpp threadedjobmixin.cpp \
|
||||||
|
qgpgmewkdrefreshjob.cpp \
|
||||||
qgpgmekeyformailboxjob.cpp qgpgme_debug.cpp \
|
qgpgmekeyformailboxjob.cpp qgpgme_debug.cpp \
|
||||||
qgpgmetofupolicyjob.cpp qgpgmequickjob.cpp \
|
qgpgmetofupolicyjob.cpp qgpgmequickjob.cpp \
|
||||||
defaultkeygenerationjob.cpp qgpgmewkspublishjob.cpp \
|
defaultkeygenerationjob.cpp qgpgmewkspublishjob.cpp \
|
||||||
@ -64,7 +65,8 @@ qgpgme_sources = \
|
|||||||
signencryptjob.cpp \
|
signencryptjob.cpp \
|
||||||
signencryptarchivejob.cpp \
|
signencryptarchivejob.cpp \
|
||||||
dn.cpp cryptoconfig.cpp wkdlookupresult.cpp \
|
dn.cpp cryptoconfig.cpp wkdlookupresult.cpp \
|
||||||
util.cpp
|
util.cpp \
|
||||||
|
wkdrefreshjob.cpp
|
||||||
|
|
||||||
# If you add one here make sure that you also add one in camelcase
|
# If you add one here make sure that you also add one in camelcase
|
||||||
qgpgme_headers= \
|
qgpgme_headers= \
|
||||||
@ -115,6 +117,7 @@ qgpgme_headers= \
|
|||||||
tofupolicyjob.h \
|
tofupolicyjob.h \
|
||||||
wkdlookupjob.h \
|
wkdlookupjob.h \
|
||||||
wkdlookupresult.h \
|
wkdlookupresult.h \
|
||||||
|
wkdrefreshjob.h \
|
||||||
wkspublishjob.h \
|
wkspublishjob.h \
|
||||||
gpgcardjob.h \
|
gpgcardjob.h \
|
||||||
dn.h
|
dn.h
|
||||||
@ -166,6 +169,7 @@ camelcase_headers= \
|
|||||||
DefaultKeyGenerationJob \
|
DefaultKeyGenerationJob \
|
||||||
WKDLookupJob \
|
WKDLookupJob \
|
||||||
WKDLookupResult \
|
WKDLookupResult \
|
||||||
|
WKDRefreshJob \
|
||||||
WKSPublishJob \
|
WKSPublishJob \
|
||||||
TofuPolicyJob \
|
TofuPolicyJob \
|
||||||
GpgCardJob
|
GpgCardJob
|
||||||
@ -211,6 +215,7 @@ private_qgpgme_headers = \
|
|||||||
qgpgmeverifydetachedjob.h \
|
qgpgmeverifydetachedjob.h \
|
||||||
qgpgmeverifyopaquejob.h \
|
qgpgmeverifyopaquejob.h \
|
||||||
qgpgmewkdlookupjob.h \
|
qgpgmewkdlookupjob.h \
|
||||||
|
qgpgmewkdrefreshjob.h \
|
||||||
qgpgmekeyformailboxjob.h \
|
qgpgmekeyformailboxjob.h \
|
||||||
qgpgmewkspublishjob.h \
|
qgpgmewkspublishjob.h \
|
||||||
qgpgmetofupolicyjob.h \
|
qgpgmetofupolicyjob.h \
|
||||||
@ -220,7 +225,8 @@ private_qgpgme_headers = \
|
|||||||
signencryptjob_p.h \
|
signencryptjob_p.h \
|
||||||
signencryptarchivejob_p.h \
|
signencryptarchivejob_p.h \
|
||||||
threadedjobmixin.h \
|
threadedjobmixin.h \
|
||||||
util.h
|
util.h \
|
||||||
|
wkdrefreshjob_p.h
|
||||||
|
|
||||||
qgpgme_moc_sources = \
|
qgpgme_moc_sources = \
|
||||||
abstractimportjob.moc \
|
abstractimportjob.moc \
|
||||||
@ -275,6 +281,7 @@ qgpgme_moc_sources = \
|
|||||||
qgpgmeverifydetachedjob.moc \
|
qgpgmeverifydetachedjob.moc \
|
||||||
qgpgmeverifyopaquejob.moc \
|
qgpgmeverifyopaquejob.moc \
|
||||||
qgpgmewkdlookupjob.moc \
|
qgpgmewkdlookupjob.moc \
|
||||||
|
qgpgmewkdrefreshjob.moc \
|
||||||
qgpgmewkspublishjob.moc \
|
qgpgmewkspublishjob.moc \
|
||||||
tofupolicyjob.moc \
|
tofupolicyjob.moc \
|
||||||
qgpgmetofupolicyjob.moc \
|
qgpgmetofupolicyjob.moc \
|
||||||
@ -291,6 +298,7 @@ qgpgme_moc_sources = \
|
|||||||
verifydetachedjob.moc \
|
verifydetachedjob.moc \
|
||||||
verifyopaquejob.moc \
|
verifyopaquejob.moc \
|
||||||
wkdlookupjob.moc \
|
wkdlookupjob.moc \
|
||||||
|
wkdrefreshjob.moc \
|
||||||
keyformailboxjob.moc \
|
keyformailboxjob.moc \
|
||||||
wkspublishjob.moc \
|
wkspublishjob.moc \
|
||||||
qgpgmekeyformailboxjob.moc \
|
qgpgmekeyformailboxjob.moc \
|
||||||
|
@ -77,6 +77,7 @@ class GpgCardJob;
|
|||||||
class ReceiveKeysJob;
|
class ReceiveKeysJob;
|
||||||
class RevokeKeyJob;
|
class RevokeKeyJob;
|
||||||
class SetPrimaryUserIDJob;
|
class SetPrimaryUserIDJob;
|
||||||
|
class WKDRefreshJob;
|
||||||
|
|
||||||
/** The main entry point for QGpgME Comes in OpenPGP and SMIME(CMS) flavors.
|
/** The main entry point for QGpgME Comes in OpenPGP and SMIME(CMS) flavors.
|
||||||
*
|
*
|
||||||
@ -198,6 +199,8 @@ public:
|
|||||||
virtual SignArchiveJob *signArchiveJob(bool armor = false) const = 0;
|
virtual SignArchiveJob *signArchiveJob(bool armor = false) const = 0;
|
||||||
virtual SignEncryptArchiveJob *signEncryptArchiveJob(bool armor = false) const = 0;
|
virtual SignEncryptArchiveJob *signEncryptArchiveJob(bool armor = false) const = 0;
|
||||||
virtual DecryptVerifyArchiveJob *decryptVerifyArchiveJob() const = 0;
|
virtual DecryptVerifyArchiveJob *decryptVerifyArchiveJob() const = 0;
|
||||||
|
|
||||||
|
virtual WKDRefreshJob *wkdRefreshJob() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Obtain a reference to the OpenPGP Protocol.
|
/** Obtain a reference to the OpenPGP Protocol.
|
||||||
|
@ -71,6 +71,7 @@
|
|||||||
#include "qgpgmereceivekeysjob.h"
|
#include "qgpgmereceivekeysjob.h"
|
||||||
#include "qgpgmerevokekeyjob.h"
|
#include "qgpgmerevokekeyjob.h"
|
||||||
#include "qgpgmesetprimaryuseridjob.h"
|
#include "qgpgmesetprimaryuseridjob.h"
|
||||||
|
#include "qgpgmewkdrefreshjob.h"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
@ -557,6 +558,17 @@ public:
|
|||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QGpgME::WKDRefreshJob *wkdRefreshJob() const override
|
||||||
|
{
|
||||||
|
if (mProtocol != GpgME::OpenPGP) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
if (auto context = GpgME::Context::createForProtocol(mProtocol)) {
|
||||||
|
return new QGpgME::QGpgMEWKDRefreshJob{context};
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
147
lang/qt/src/qgpgmewkdrefreshjob.cpp
Normal file
147
lang/qt/src/qgpgmewkdrefreshjob.cpp
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
/*
|
||||||
|
qgpgmewkdrefreshjob.cpp
|
||||||
|
|
||||||
|
This file is part of qgpgme, the Qt API binding for gpgme
|
||||||
|
Copyright (c) 2023 g10 Code GmbH
|
||||||
|
Software engineering by Ingo Klöcker <dev@ingo-kloecker.de>
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "qgpgmewkdrefreshjob.h"
|
||||||
|
|
||||||
|
#include "debug.h"
|
||||||
|
#include "qgpgme_debug.h"
|
||||||
|
#include "qgpgmekeylistjob.h"
|
||||||
|
#include "wkdrefreshjob_p.h"
|
||||||
|
|
||||||
|
#include <context.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
using namespace QGpgME;
|
||||||
|
using namespace GpgME;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
class QGpgMEWKDRefreshJobPrivate : public WKDRefreshJobPrivate
|
||||||
|
{
|
||||||
|
QGpgMEWKDRefreshJob *q = nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
QGpgMEWKDRefreshJobPrivate(QGpgMEWKDRefreshJob *qq)
|
||||||
|
: q{qq}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~QGpgMEWKDRefreshJobPrivate() override = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
GpgME::Error startIt() override;
|
||||||
|
|
||||||
|
void startNow() override
|
||||||
|
{
|
||||||
|
q->run();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static QStringList toEmailAddressesOriginatingFromWKD(const std::vector<GpgME::Key> &keys)
|
||||||
|
{
|
||||||
|
const QStringList emails = std::accumulate(keys.begin(), keys.end(), QStringList{}, [](QStringList &emails, const Key &key) {
|
||||||
|
const auto userIDs = key.userIDs();
|
||||||
|
emails = std::accumulate(std::begin(userIDs), std::end(userIDs), emails, [](QStringList &emails, const UserID &userID) {
|
||||||
|
if (!userID.isRevoked() && !userID.addrSpec().empty() && userID.origin() == Key::OriginWKD) {
|
||||||
|
emails.push_back(QString::fromStdString(userID.addrSpec()));
|
||||||
|
}
|
||||||
|
return emails;
|
||||||
|
});
|
||||||
|
return emails;
|
||||||
|
});
|
||||||
|
return emails;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QGpgMEWKDRefreshJob::QGpgMEWKDRefreshJob(Context *context)
|
||||||
|
: mixin_type{context}
|
||||||
|
{
|
||||||
|
setJobPrivate(this, std::unique_ptr<QGpgMEWKDRefreshJobPrivate>{new QGpgMEWKDRefreshJobPrivate{this}});
|
||||||
|
lateInitialization();
|
||||||
|
}
|
||||||
|
|
||||||
|
QGpgMEWKDRefreshJob::~QGpgMEWKDRefreshJob() = default;
|
||||||
|
|
||||||
|
static ImportResult locate_external_keys(Context *ctx, const std::vector<Key> &keys)
|
||||||
|
{
|
||||||
|
const auto emails = toEmailAddressesOriginatingFromWKD(keys);
|
||||||
|
qCDebug(QGPGME_LOG) << __func__ << "locating external keys for" << emails;
|
||||||
|
if (emails.empty()) {
|
||||||
|
return ImportResult{};
|
||||||
|
}
|
||||||
|
|
||||||
|
Context::KeyListModeSaver saver{ctx};
|
||||||
|
ctx->setKeyListMode(GpgME::LocateExternal);
|
||||||
|
ctx->setFlag("auto-key-locate", "clear,wkd");
|
||||||
|
std::vector<Key> dummy;
|
||||||
|
auto job = std::unique_ptr<KeyListJob>{new QGpgMEKeyListJob{ctx}};
|
||||||
|
(void) job->exec(emails, false, dummy);
|
||||||
|
qCDebug(QGPGME_LOG) << __func__ << "number of keys:" << dummy.size();
|
||||||
|
std::for_each(dummy.cbegin(), dummy.cend(), [](const Key &k) {
|
||||||
|
qCDebug(QGPGME_LOG) << __func__ << toLogString(k).c_str();
|
||||||
|
});
|
||||||
|
const auto result = ctx->importResult();
|
||||||
|
qCDebug(QGPGME_LOG) << __func__ << "result:" << toLogString(result).c_str();
|
||||||
|
job.release();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QGpgMEWKDRefreshJob::result_type refresh_keys(Context *ctx, const std::vector<Key> &keys)
|
||||||
|
{
|
||||||
|
const auto result = locate_external_keys(ctx, keys);
|
||||||
|
|
||||||
|
return std::make_tuple(result, QString{}, Error{});
|
||||||
|
}
|
||||||
|
|
||||||
|
GpgME::Error QGpgMEWKDRefreshJobPrivate::startIt()
|
||||||
|
{
|
||||||
|
if (m_keys.empty()) {
|
||||||
|
return Error::fromCode(GPG_ERR_INV_VALUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
q->run([=](Context *ctx) {
|
||||||
|
return refresh_keys(ctx, m_keys);
|
||||||
|
});
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "qgpgmewkdrefreshjob.moc"
|
64
lang/qt/src/qgpgmewkdrefreshjob.h
Normal file
64
lang/qt/src/qgpgmewkdrefreshjob.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
qgpgmewkdrefreshjob.h
|
||||||
|
|
||||||
|
This file is part of qgpgme, the Qt API binding for gpgme
|
||||||
|
Copyright (c) 2023 g10 Code GmbH
|
||||||
|
Software engineering by Ingo Klöcker <dev@ingo-kloecker.de>
|
||||||
|
|
||||||
|
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_QGPGMEWKDREFRESHJOB_H__
|
||||||
|
#define __QGPGME_QGPGMEWKDREFRESHJOB_H__
|
||||||
|
|
||||||
|
#include "threadedjobmixin.h"
|
||||||
|
#include "wkdrefreshjob.h"
|
||||||
|
|
||||||
|
#include <importresult.h>
|
||||||
|
|
||||||
|
namespace QGpgME
|
||||||
|
{
|
||||||
|
|
||||||
|
class QGpgMEWKDRefreshJob
|
||||||
|
#ifdef Q_MOC_RUN
|
||||||
|
: public WKDRefreshJob
|
||||||
|
#else
|
||||||
|
: public _detail::ThreadedJobMixin<WKDRefreshJob, std::tuple<GpgME::ImportResult, QString, GpgME::Error>>
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
#ifdef Q_MOC_RUN
|
||||||
|
public Q_SLOTS:
|
||||||
|
void slotFinished();
|
||||||
|
#endif
|
||||||
|
public:
|
||||||
|
explicit QGpgMEWKDRefreshJob(GpgME::Context *context);
|
||||||
|
~QGpgMEWKDRefreshJob() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __QGPGME_QGPGMEWKDREFRESHJOB_H__
|
57
lang/qt/src/wkdrefreshjob.cpp
Normal file
57
lang/qt/src/wkdrefreshjob.cpp
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
wkdrefreshjob.cpp
|
||||||
|
|
||||||
|
This file is part of qgpgme, the Qt API binding for gpgme
|
||||||
|
Copyright (c) 2023 g10 Code GmbH
|
||||||
|
Software engineering by Ingo Klöcker <dev@ingo-kloecker.de>
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wkdrefreshjob.h"
|
||||||
|
#include "wkdrefreshjob_p.h"
|
||||||
|
|
||||||
|
using namespace QGpgME;
|
||||||
|
|
||||||
|
WKDRefreshJob::WKDRefreshJob(QObject *parent)
|
||||||
|
: AbstractImportJob{parent}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WKDRefreshJob::~WKDRefreshJob() = default;
|
||||||
|
|
||||||
|
GpgME::Error WKDRefreshJob::start(const std::vector<GpgME::Key> &keys)
|
||||||
|
{
|
||||||
|
auto d = jobPrivate<WKDRefreshJobPrivate>(this);
|
||||||
|
d->m_keys = keys;
|
||||||
|
return d->startIt();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "wkdrefreshjob.moc"
|
71
lang/qt/src/wkdrefreshjob.h
Normal file
71
lang/qt/src/wkdrefreshjob.h
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
wkdrefreshjob.h
|
||||||
|
|
||||||
|
This file is part of qgpgme, the Qt API binding for gpgme
|
||||||
|
Copyright (c) 2023 g10 Code GmbH
|
||||||
|
Software engineering by Ingo Klöcker <dev@ingo-kloecker.de>
|
||||||
|
|
||||||
|
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_WKDREFRESHJOB_H__
|
||||||
|
#define __QGPGME_WKDREFRESHJOB_H__
|
||||||
|
|
||||||
|
#include "abstractimportjob.h"
|
||||||
|
#include "qgpgme_export.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace GpgME
|
||||||
|
{
|
||||||
|
class Error;
|
||||||
|
class Key;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace QGpgME
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This job refreshes OpenPGP keys via WKD. Only user IDs that have WKD set as
|
||||||
|
* origin are used for the WKD lookup. Revoked user IDs are ignored.
|
||||||
|
*/
|
||||||
|
class QGPGME_EXPORT WKDRefreshJob : public AbstractImportJob
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
protected:
|
||||||
|
explicit WKDRefreshJob(QObject *parent);
|
||||||
|
public:
|
||||||
|
~WKDRefreshJob() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a refresh of the \a keys.
|
||||||
|
*/
|
||||||
|
GpgME::Error start(const std::vector<GpgME::Key> &keys);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __QGPGME_WKDREFRESHJOB_H__
|
51
lang/qt/src/wkdrefreshjob_p.h
Normal file
51
lang/qt/src/wkdrefreshjob_p.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
wkdrefreshjob_p.h
|
||||||
|
|
||||||
|
This file is part of qgpgme, the Qt API binding for gpgme
|
||||||
|
Copyright (c) 2023 g10 Code GmbH
|
||||||
|
Software engineering by Ingo Klöcker <dev@ingo-kloecker.de>
|
||||||
|
|
||||||
|
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_WKDREFRESHJOB_P_H__
|
||||||
|
#define __QGPGME_WKDREFRESHJOB_P_H__
|
||||||
|
|
||||||
|
#include "job_p.h"
|
||||||
|
|
||||||
|
#include <key.h>
|
||||||
|
|
||||||
|
namespace QGpgME
|
||||||
|
{
|
||||||
|
|
||||||
|
struct WKDRefreshJobPrivate : public JobPrivate
|
||||||
|
{
|
||||||
|
std::vector<GpgME::Key> m_keys;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __QGPGME_WKDREFRESHJOB_P_H__
|
@ -97,6 +97,7 @@ run_keyformailboxjob_SOURCES = run-keyformailboxjob.cpp
|
|||||||
run_receivekeysjob_SOURCES = run-receivekeysjob.cpp
|
run_receivekeysjob_SOURCES = run-receivekeysjob.cpp
|
||||||
run_refreshkeysjob_SOURCES = run-refreshkeysjob.cpp
|
run_refreshkeysjob_SOURCES = run-refreshkeysjob.cpp
|
||||||
run_signarchivejob_SOURCES = run-signarchivejob.cpp
|
run_signarchivejob_SOURCES = run-signarchivejob.cpp
|
||||||
|
run_wkdrefreshjob_SOURCES = run-wkdrefreshjob.cpp
|
||||||
|
|
||||||
nodist_t_keylist_SOURCES = $(moc_files)
|
nodist_t_keylist_SOURCES = $(moc_files)
|
||||||
|
|
||||||
@ -112,7 +113,8 @@ noinst_PROGRAMS = \
|
|||||||
run-decryptverifyarchivejob \
|
run-decryptverifyarchivejob \
|
||||||
run-encryptarchivejob \
|
run-encryptarchivejob \
|
||||||
run-importjob run-exportjob run-receivekeysjob run-refreshkeysjob \
|
run-importjob run-exportjob run-receivekeysjob run-refreshkeysjob \
|
||||||
run-signarchivejob
|
run-signarchivejob \
|
||||||
|
run-wkdrefreshjob
|
||||||
|
|
||||||
|
|
||||||
CLEANFILES = secring.gpg pubring.gpg pubring.kbx trustdb.gpg dirmngr.conf \
|
CLEANFILES = secring.gpg pubring.gpg pubring.kbx trustdb.gpg dirmngr.conf \
|
||||||
|
121
lang/qt/tests/run-wkdrefreshjob.cpp
Normal file
121
lang/qt/tests/run-wkdrefreshjob.cpp
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
run-wkdrefreshjob.cpp
|
||||||
|
|
||||||
|
This file is part of QGpgME's test suite.
|
||||||
|
Copyright (c) 2023 g10 Code GmbH
|
||||||
|
Software engineering by Ingo Klöcker <dev@ingo-kloecker.de>
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <protocol.h>
|
||||||
|
#include <wkdrefreshjob.h>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include <context.h>
|
||||||
|
#include <importresult.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace GpgME;
|
||||||
|
|
||||||
|
std::ostream &operator<<(std::ostream &os, const QString &s)
|
||||||
|
{
|
||||||
|
return os << s.toLocal8Bit().constData();
|
||||||
|
}
|
||||||
|
|
||||||
|
Key getOpenPGPKey(const QString &keyId, Error &err)
|
||||||
|
{
|
||||||
|
Key key;
|
||||||
|
|
||||||
|
auto ctx = Context::create(GpgME::OpenPGP);
|
||||||
|
if (!ctx) {
|
||||||
|
err = Error::fromCode(GPG_ERR_GENERAL);
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
key = ctx->key(keyId.toLatin1().constData(), err);
|
||||||
|
if (err.code() == GPG_ERR_EOF) {
|
||||||
|
err = Error{};
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
GpgME::initializeLibrary();
|
||||||
|
|
||||||
|
if (argc != 2) {
|
||||||
|
std::cerr << "Usage: " << argv[0] << " KEYID" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
QCoreApplication app{argc, argv};
|
||||||
|
const auto keyId = qApp->arguments().last();
|
||||||
|
|
||||||
|
Error err;
|
||||||
|
const auto key = getOpenPGPKey(keyId, err);
|
||||||
|
if (err.code() == GPG_ERR_AMBIGUOUS_NAME) {
|
||||||
|
std::cerr << "Error: Multiple OpenPGP keys matching '" << keyId << "' found" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (key.isNull()) {
|
||||||
|
std::cerr << "Error: No OpenPGP key matching '" << keyId << "' found" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (err) {
|
||||||
|
std::cerr << "Error while getting OpenPGP key: " << err.asString() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
std::cout << "Refreshing OpenPGP key " << key.userID(0).id() << std::endl;
|
||||||
|
|
||||||
|
auto job = QGpgME::openpgp()->wkdRefreshJob();
|
||||||
|
if (!job) {
|
||||||
|
std::cerr << "Error: Could not create job to refresh OpenPGP key" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
QObject::connect(job, &QGpgME::WKDRefreshJob::result, &app, [](const GpgME::ImportResult &result, const QString &, const GpgME::Error &) {
|
||||||
|
if (result.isNull()) {
|
||||||
|
std::cout << "Empty result. Lookup via WKD failed or no user ID was originally retrieved via WKD." << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cout << "Result: " << result << std::endl;
|
||||||
|
}
|
||||||
|
qApp->quit();
|
||||||
|
});
|
||||||
|
err = job->start({key});
|
||||||
|
if (err) {
|
||||||
|
std::cerr << "Error: " << err.asString() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user