|
Packit |
d7e8d0 |
/*
|
|
Packit |
d7e8d0 |
qgpgmelistallkeysjob.cpp
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
This file is part of qgpgme, the Qt API binding for gpgme
|
|
Packit |
d7e8d0 |
Copyright (c) 2004,2008 Klarälvdalens Datakonsult AB
|
|
Packit |
d7e8d0 |
Copyright (c) 2016 by Bundesamt für Sicherheit in der Informationstechnik
|
|
Packit |
d7e8d0 |
Software engineering by Intevation GmbH
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
QGpgME is free software; you can redistribute it and/or
|
|
Packit |
d7e8d0 |
modify it under the terms of the GNU General Public License as
|
|
Packit |
d7e8d0 |
published by the Free Software Foundation; either version 2 of the
|
|
Packit |
d7e8d0 |
License, or (at your option) any later version.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
QGpgME is distributed in the hope that it will be useful,
|
|
Packit |
d7e8d0 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
d7e8d0 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
d7e8d0 |
General Public License for more details.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
You should have received a copy of the GNU General Public License
|
|
Packit |
d7e8d0 |
along with this program; if not, write to the Free Software
|
|
Packit |
d7e8d0 |
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
In addition, as a special exception, the copyright holders give
|
|
Packit |
d7e8d0 |
permission to link the code of this program with any edition of
|
|
Packit |
d7e8d0 |
the Qt library by Trolltech AS, Norway (or with modified versions
|
|
Packit |
d7e8d0 |
of Qt that use the same license as Qt), and distribute linked
|
|
Packit |
d7e8d0 |
combinations including the two. You must obey the GNU General
|
|
Packit |
d7e8d0 |
Public License in all respects for all of the code used other than
|
|
Packit |
d7e8d0 |
Qt. If you modify this file, you may extend this exception to
|
|
Packit |
d7e8d0 |
your version of the file, but you are not obligated to do so. If
|
|
Packit |
d7e8d0 |
you do not wish to do so, delete this exception statement from
|
|
Packit |
d7e8d0 |
your version.
|
|
Packit |
d7e8d0 |
*/
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
d7e8d0 |
#include "config.h"
|
|
Packit |
d7e8d0 |
#endif
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
#include "qgpgmelistallkeysjob.h"
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
#include "key.h"
|
|
Packit |
d7e8d0 |
#include "context.h"
|
|
Packit |
d7e8d0 |
#include "keylistresult.h"
|
|
Packit |
d7e8d0 |
#include <gpg-error.h>
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
#include <algorithm>
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
#include <cstdlib>
|
|
Packit |
d7e8d0 |
#include <cstring>
|
|
Packit |
d7e8d0 |
#include <cassert>
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
using namespace QGpgME;
|
|
Packit |
d7e8d0 |
using namespace GpgME;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
QGpgMEListAllKeysJob::QGpgMEListAllKeysJob(Context *context)
|
|
Packit |
d7e8d0 |
: mixin_type(context),
|
|
Packit |
d7e8d0 |
mResult()
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
lateInitialization();
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
QGpgMEListAllKeysJob::~QGpgMEListAllKeysJob() {}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
static KeyListResult do_list_keys(Context *ctx, std::vector<Key> &keys, bool secretOnly)
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
const char **pat = 0;
|
|
Packit |
d7e8d0 |
if (const Error err = ctx->startKeyListing(pat, secretOnly)) {
|
|
Packit |
d7e8d0 |
return KeyListResult(0, err);
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
Error err;
|
|
Packit |
d7e8d0 |
do {
|
|
Packit |
d7e8d0 |
keys.push_back(ctx->nextKey(err));
|
|
Packit |
d7e8d0 |
} while (!err);
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
keys.pop_back();
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
const KeyListResult result = ctx->endKeyListing();
|
|
Packit |
d7e8d0 |
ctx->cancelPendingOperation();
|
|
Packit |
d7e8d0 |
return result;
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
namespace
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
template <typename ForwardIterator, typename BinaryPredicate>
|
|
Packit |
d7e8d0 |
ForwardIterator unique_by_merge(ForwardIterator first, ForwardIterator last, BinaryPredicate pred)
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
first = std::adjacent_find(first, last, pred);
|
|
Packit |
d7e8d0 |
if (first == last) {
|
|
Packit |
d7e8d0 |
return last;
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
ForwardIterator dest = first;
|
|
Packit |
d7e8d0 |
dest->mergeWith(*++first);
|
|
Packit |
d7e8d0 |
while (++first != last)
|
|
Packit |
d7e8d0 |
if (pred(*dest, *first)) {
|
|
Packit |
d7e8d0 |
dest->mergeWith(*first);
|
|
Packit |
d7e8d0 |
} else {
|
|
Packit |
d7e8d0 |
*++dest = *first;
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
return ++dest;
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
static void merge_keys(std::vector<Key> &merged, std::vector<Key> &pub, std::vector<Key> &sec)
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
merged.reserve(pub.size() + sec.size());
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
std::merge(pub.begin(), pub.end(),
|
|
Packit |
d7e8d0 |
sec.begin(), sec.end(),
|
|
Packit |
d7e8d0 |
std::back_inserter(merged),
|
|
Packit |
d7e8d0 |
ByFingerprint<std::less>());
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
merged.erase(unique_by_merge(merged.begin(), merged.end(), ByFingerprint<std::equal_to>()),
|
|
Packit |
d7e8d0 |
merged.end());
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
static QGpgMEListAllKeysJob::result_type list_keys(Context *ctx, bool mergeKeys)
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
std::vector<Key> pub, sec, merged;
|
|
Packit |
d7e8d0 |
KeyListResult r;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
r.mergeWith(do_list_keys(ctx, pub, false));
|
|
Packit |
d7e8d0 |
std::sort(pub.begin(), pub.end(), ByFingerprint<std::less>());
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
r.mergeWith(do_list_keys(ctx, sec, true));
|
|
Packit |
d7e8d0 |
std::sort(sec.begin(), sec.end(), ByFingerprint<std::less>());
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
if (mergeKeys) {
|
|
Packit |
d7e8d0 |
merge_keys(merged, pub, sec);
|
|
Packit |
d7e8d0 |
} else {
|
|
Packit |
d7e8d0 |
merged.swap(pub);
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
return std::make_tuple(r, merged, sec, QString(), Error());
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
Error QGpgMEListAllKeysJob::start(bool mergeKeys)
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
run(std::bind(&list_keys, std::placeholders::_1, mergeKeys));
|
|
Packit |
d7e8d0 |
return Error();
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
KeyListResult QGpgMEListAllKeysJob::exec(std::vector<Key> &pub, std::vector<Key> &sec, bool mergeKeys)
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
const result_type r = list_keys(context(), mergeKeys);
|
|
Packit |
d7e8d0 |
resultHook(r);
|
|
Packit |
d7e8d0 |
pub = std::get<1>(r);
|
|
Packit |
d7e8d0 |
sec = std::get<2>(r);
|
|
Packit |
d7e8d0 |
return std::get<0>(r);
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
void QGpgMEListAllKeysJob::resultHook(const result_type &tuple)
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
mResult = std::get<0>(tuple);
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
#if 0
|
|
Packit |
d7e8d0 |
void QGpgMEListAllKeysJob::showErrorDialog(QWidget *parent, const QString &caption) const
|
|
Packit |
d7e8d0 |
{
|
|
Packit |
d7e8d0 |
if (!mResult.error() || mResult.error().isCanceled()) {
|
|
Packit |
d7e8d0 |
return;
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
const QString msg = i18n("<qt>An error occurred while fetching "
|
|
Packit |
d7e8d0 |
"the keys from the backend:"
|
|
Packit |
d7e8d0 |
"%1 </qt>",
|
|
Packit |
d7e8d0 |
QString::fromLocal8Bit(mResult.error().asString()));
|
|
Packit |
d7e8d0 |
KMessageBox::error(parent, msg, caption);
|
|
Packit |
d7e8d0 |
}
|
|
Packit |
d7e8d0 |
#endif
|
|
Packit |
d7e8d0 |
#include "qgpgmelistallkeysjob.moc"
|