qt: Add job for creating signed archives
* lang/qt/src/signarchivejob.cpp, lang/qt/src/signarchivejob.h, lang/qt/src/signarchivejob_p.h, lang/qt/src/qgpgmesignarchivejob.cpp, lang/qt/src/qgpgmesignarchivejob.h: New. * lang/qt/src/protocol.h (class Protocol): Add pure virtual member function signArchiveJob * lang/qt/src/protocol_p.h (Protocol::signArchiveJob): ... and implement it. * lang/qt/src/Makefile.am: Update accordingly. * lang/qt/tests/run-signarchivejob.cpp: New. * lang/qt/tests/Makefile.am: Add new test runner. -- GnuPG-bug-id: 6342
This commit is contained in:
parent
2faa031af2
commit
8d672b3b7e
@ -49,6 +49,7 @@ qgpgme_sources = \
|
||||
qgpgmerefreshsmimekeysjob.cpp \
|
||||
qgpgmerevokekeyjob.cpp \
|
||||
qgpgmesetprimaryuseridjob.cpp \
|
||||
qgpgmesignarchivejob.cpp \
|
||||
qgpgmesignencryptjob.cpp \
|
||||
qgpgmesignjob.cpp qgpgmesignkeyjob.cpp qgpgmeverifydetachedjob.cpp \
|
||||
qgpgmeverifyopaquejob.cpp qgpgmewkdlookupjob.cpp threadedjobmixin.cpp \
|
||||
@ -56,6 +57,7 @@ qgpgme_sources = \
|
||||
qgpgmetofupolicyjob.cpp qgpgmequickjob.cpp \
|
||||
defaultkeygenerationjob.cpp qgpgmewkspublishjob.cpp \
|
||||
qgpgmegpgcardjob.cpp changeexpiryjob.cpp encryptjob.cpp importjob.cpp \
|
||||
signarchivejob.cpp \
|
||||
signencryptjob.cpp \
|
||||
dn.cpp cryptoconfig.cpp wkdlookupresult.cpp \
|
||||
util.cpp
|
||||
@ -89,6 +91,7 @@ qgpgme_headers= \
|
||||
revokekeyjob.h \
|
||||
setprimaryuseridjob.h \
|
||||
specialjob.h \
|
||||
signarchivejob.h \
|
||||
signjob.h \
|
||||
signkeyjob.h \
|
||||
signencryptjob.h \
|
||||
@ -137,6 +140,7 @@ camelcase_headers= \
|
||||
RevokeKeyJob \
|
||||
SetPrimaryUserIDJob \
|
||||
SpecialJob \
|
||||
SignArchiveJob \
|
||||
SignJob \
|
||||
SignKeyJob \
|
||||
SignEncryptJob \
|
||||
@ -189,6 +193,7 @@ private_qgpgme_headers = \
|
||||
qgpgmerefreshsmimekeysjob.h \
|
||||
qgpgmerevokekeyjob.h \
|
||||
qgpgmesetprimaryuseridjob.h \
|
||||
qgpgmesignarchivejob.h \
|
||||
qgpgmesignencryptjob.h \
|
||||
qgpgmesignjob.h \
|
||||
qgpgmesignkeyjob.h \
|
||||
@ -200,6 +205,7 @@ private_qgpgme_headers = \
|
||||
qgpgmetofupolicyjob.h \
|
||||
qgpgmegpgcardjob.h \
|
||||
qgpgmequickjob.h \
|
||||
signarchivejob_p.h \
|
||||
signencryptjob_p.h \
|
||||
threadedjobmixin.h \
|
||||
util.h
|
||||
@ -247,6 +253,7 @@ qgpgme_moc_sources = \
|
||||
qgpgmerefreshsmimekeysjob.moc \
|
||||
qgpgmerevokekeyjob.moc \
|
||||
qgpgmesetprimaryuseridjob.moc \
|
||||
qgpgmesignarchivejob.moc \
|
||||
qgpgmesignencryptjob.moc \
|
||||
qgpgmesignjob.moc \
|
||||
qgpgmesignkeyjob.moc \
|
||||
@ -260,6 +267,7 @@ qgpgme_moc_sources = \
|
||||
refreshkeysjob.moc \
|
||||
revokekeyjob.moc \
|
||||
setprimaryuseridjob.moc \
|
||||
signarchivejob.moc \
|
||||
signencryptjob.moc \
|
||||
signjob.moc \
|
||||
signkeyjob.moc \
|
||||
|
@ -53,6 +53,7 @@ class DeleteJob;
|
||||
class EncryptArchiveJob;
|
||||
class EncryptJob;
|
||||
class DecryptJob;
|
||||
class SignArchiveJob;
|
||||
class SignJob;
|
||||
class SignKeyJob;
|
||||
class VerifyDetachedJob;
|
||||
@ -192,6 +193,7 @@ public:
|
||||
virtual SetPrimaryUserIDJob *setPrimaryUserIDJob() const = 0;
|
||||
|
||||
virtual EncryptArchiveJob *encryptArchiveJob(bool armor = false) const = 0;
|
||||
virtual SignArchiveJob *signArchiveJob(bool armor = false) const = 0;
|
||||
};
|
||||
|
||||
/** Obtain a reference to the OpenPGP Protocol.
|
||||
|
@ -48,6 +48,7 @@
|
||||
#include "qgpgmesignencryptjob.h"
|
||||
#include "qgpgmeencryptarchivejob.h"
|
||||
#include "qgpgmeencryptjob.h"
|
||||
#include "qgpgmesignarchivejob.h"
|
||||
#include "qgpgmesignjob.h"
|
||||
#include "qgpgmesignkeyjob.h"
|
||||
#include "qgpgmeexportjob.h"
|
||||
@ -519,6 +520,18 @@ public:
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QGpgME::SignArchiveJob *signArchiveJob(bool armor) const override
|
||||
{
|
||||
if (mProtocol != GpgME::OpenPGP) {
|
||||
return nullptr;
|
||||
}
|
||||
if (auto context = GpgME::Context::createForProtocol(mProtocol)) {
|
||||
context->setArmor(armor);
|
||||
return new QGpgME::QGpgMESignArchiveJob{context};
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
141
lang/qt/src/qgpgmesignarchivejob.cpp
Normal file
141
lang/qt/src/qgpgmesignarchivejob.cpp
Normal file
@ -0,0 +1,141 @@
|
||||
/*
|
||||
qgpgmesignarchivejob.cpp
|
||||
|
||||
This file is part of qgpgme, the Qt API binding for gpgme
|
||||
Copyright (c) 2004,2007,2008 Klarälvdalens Datakonsult AB
|
||||
Copyright (c) 2016 by Bundesamt für Sicherheit in der Informationstechnik
|
||||
Software engineering by Intevation GmbH
|
||||
Copyright (c) 2022,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 "qgpgmesignarchivejob.h"
|
||||
|
||||
#include "dataprovider.h"
|
||||
#include "signarchivejob_p.h"
|
||||
#include "filelistdataprovider.h"
|
||||
|
||||
#include <data.h>
|
||||
|
||||
using namespace QGpgME;
|
||||
using namespace GpgME;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
class QGpgMESignArchiveJobPrivate : public SignArchiveJobPrivate
|
||||
{
|
||||
QGpgMESignArchiveJob *q = nullptr;
|
||||
|
||||
public:
|
||||
QGpgMESignArchiveJobPrivate(QGpgMESignArchiveJob *qq)
|
||||
: q{qq}
|
||||
{
|
||||
}
|
||||
|
||||
~QGpgMESignArchiveJobPrivate() override = default;
|
||||
|
||||
private:
|
||||
void start() override
|
||||
{
|
||||
q->run();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
QGpgMESignArchiveJob::QGpgMESignArchiveJob(Context *context)
|
||||
: mixin_type{context}
|
||||
{
|
||||
setJobPrivate(this, std::unique_ptr<QGpgMESignArchiveJobPrivate>{new QGpgMESignArchiveJobPrivate{this}});
|
||||
lateInitialization();
|
||||
}
|
||||
|
||||
static QGpgMESignArchiveJob::result_type sign(Context *ctx,
|
||||
QThread *thread,
|
||||
const std::vector<Key> &signers,
|
||||
const std::vector<QString> &paths,
|
||||
const std::weak_ptr<QIODevice> &output_,
|
||||
const QString &baseDirectory)
|
||||
{
|
||||
const std::shared_ptr<QIODevice> output = output_.lock();
|
||||
const _detail::ToThreadMover ctMover(output, thread);
|
||||
|
||||
QGpgME::FileListDataProvider in{paths};
|
||||
Data indata(&in);
|
||||
if (!baseDirectory.isEmpty()) {
|
||||
indata.setFileName(baseDirectory.toStdString());
|
||||
}
|
||||
|
||||
QGpgME::QIODeviceDataProvider out{output};
|
||||
Data outdata(&out);
|
||||
|
||||
ctx->clearSigningKeys();
|
||||
for (const Key &signer : signers) {
|
||||
if (!signer.isNull()) {
|
||||
if (const Error err = ctx->addSigningKey(signer)) {
|
||||
return std::make_tuple(SigningResult{err}, QString{}, Error{});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const SigningResult res = ctx->sign(indata, outdata, GpgME::SignArchive);
|
||||
Error ae;
|
||||
const QString log = _detail::audit_log_as_html(ctx, ae);
|
||||
return std::make_tuple(res, log, ae);
|
||||
}
|
||||
|
||||
GpgME::Error QGpgMESignArchiveJob::start(const std::vector<GpgME::Key> &signers,
|
||||
const std::vector<QString> &paths,
|
||||
const std::shared_ptr<QIODevice> &output)
|
||||
{
|
||||
if (!output) {
|
||||
return Error::fromCode(GPG_ERR_INV_VALUE);
|
||||
}
|
||||
|
||||
run(std::bind(&sign,
|
||||
std::placeholders::_1,
|
||||
std::placeholders::_2,
|
||||
signers,
|
||||
paths,
|
||||
std::placeholders::_3,
|
||||
baseDirectory()),
|
||||
output);
|
||||
return {};
|
||||
}
|
||||
|
||||
void QGpgMESignArchiveJob::resultHook(const result_type &tuple)
|
||||
{
|
||||
mResult = std::get<0>(tuple);
|
||||
}
|
||||
|
||||
#include "qgpgmesignarchivejob.moc"
|
76
lang/qt/src/qgpgmesignarchivejob.h
Normal file
76
lang/qt/src/qgpgmesignarchivejob.h
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
qgpgmesignarchivejob.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_QGPGMESIGNARCHIVEJOB_H__
|
||||
#define __QGPGME_QGPGMESIGNARCHIVEJOB_H__
|
||||
|
||||
#include "signarchivejob.h"
|
||||
|
||||
#include "threadedjobmixin.h"
|
||||
|
||||
#include <signingresult.h>
|
||||
#include <key.h>
|
||||
|
||||
namespace QGpgME
|
||||
{
|
||||
|
||||
class QGpgMESignArchiveJob
|
||||
#ifdef Q_MOC_RUN
|
||||
: public SignArchiveJob
|
||||
#else
|
||||
: public _detail::ThreadedJobMixin<SignArchiveJob, std::tuple<GpgME::SigningResult, QString, GpgME::Error>>
|
||||
#endif
|
||||
{
|
||||
Q_OBJECT
|
||||
#ifdef Q_MOC_RUN
|
||||
public Q_SLOTS:
|
||||
void slotFinished();
|
||||
#endif
|
||||
public:
|
||||
explicit QGpgMESignArchiveJob(GpgME::Context *context);
|
||||
~QGpgMESignArchiveJob() = default;
|
||||
|
||||
GpgME::Error start(const std::vector<GpgME::Key> &signers,
|
||||
const std::vector<QString> &paths,
|
||||
const std::shared_ptr<QIODevice> &output) override;
|
||||
|
||||
/* from ThreadedJobMixin */
|
||||
void resultHook(const result_type &r) override;
|
||||
|
||||
private:
|
||||
GpgME::SigningResult mResult;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // __QGPGME_QGPGMESIGNARCHIVEJOB_H__
|
62
lang/qt/src/signarchivejob.cpp
Normal file
62
lang/qt/src/signarchivejob.cpp
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
signarchivejob.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 "signarchivejob.h"
|
||||
#include "signarchivejob_p.h"
|
||||
|
||||
using namespace QGpgME;
|
||||
|
||||
SignArchiveJob::SignArchiveJob(QObject *parent)
|
||||
: Job{parent}
|
||||
{
|
||||
}
|
||||
|
||||
SignArchiveJob::~SignArchiveJob() = default;
|
||||
|
||||
void SignArchiveJob::setBaseDirectory(const QString &baseDirectory)
|
||||
{
|
||||
auto d = jobPrivate<SignArchiveJobPrivate>(this);
|
||||
d->m_baseDirectory = baseDirectory;
|
||||
}
|
||||
|
||||
QString SignArchiveJob::baseDirectory() const
|
||||
{
|
||||
auto d = jobPrivate<SignArchiveJobPrivate>(this);
|
||||
return d->m_baseDirectory;
|
||||
}
|
||||
|
||||
#include "signarchivejob.moc"
|
88
lang/qt/src/signarchivejob.h
Normal file
88
lang/qt/src/signarchivejob.h
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
signarchivejob.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_SIGNARCHIVEJOB_H__
|
||||
#define __QGPGME_SIGNARCHIVEJOB_H__
|
||||
|
||||
#include "job.h"
|
||||
|
||||
#ifdef BUILDING_QGPGME
|
||||
# include "context.h"
|
||||
#else
|
||||
# include <gpgme++/context.h>
|
||||
#endif
|
||||
|
||||
namespace GpgME
|
||||
{
|
||||
class Key;
|
||||
}
|
||||
|
||||
namespace QGpgME
|
||||
{
|
||||
|
||||
/**
|
||||
* Abstract base class for job for creating signed archives
|
||||
*/
|
||||
class QGPGME_EXPORT SignArchiveJob : public Job
|
||||
{
|
||||
Q_OBJECT
|
||||
protected:
|
||||
explicit SignArchiveJob(QObject *parent);
|
||||
public:
|
||||
~SignArchiveJob() override;
|
||||
|
||||
void setBaseDirectory(const QString &baseDirectory);
|
||||
QString baseDirectory() const;
|
||||
|
||||
/**
|
||||
* Starts the creation of a signed archive.
|
||||
*
|
||||
* Creates a signed archive with the files and directories in \a paths.
|
||||
* The archive is signed with the keys in \a signers or with the default
|
||||
* key, if \a signers is empty. The signed archive is written to \a output.
|
||||
*
|
||||
* Emits result() when the job has finished.
|
||||
*/
|
||||
virtual GpgME::Error start(const std::vector<GpgME::Key> &signers,
|
||||
const std::vector<QString> &paths,
|
||||
const std::shared_ptr<QIODevice> &output) = 0;
|
||||
|
||||
Q_SIGNALS:
|
||||
void result(const GpgME::SigningResult &result,
|
||||
const QString &auditLogAsHtml = {},
|
||||
const GpgME::Error &auditLogError = {});
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // __QGPGME_SIGNARCHIVEJOB_H__
|
49
lang/qt/src/signarchivejob_p.h
Normal file
49
lang/qt/src/signarchivejob_p.h
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
signarchivejob_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_SIGNARCHIVEJOB_P_H__
|
||||
#define __QGPGME_SIGNARCHIVEJOB_P_H__
|
||||
|
||||
#include "job_p.h"
|
||||
|
||||
namespace QGpgME
|
||||
{
|
||||
|
||||
struct SignArchiveJobPrivate : public JobPrivate
|
||||
{
|
||||
QString m_baseDirectory;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // __QGPGME_SIGNARCHIVEJOB_P_H__
|
@ -92,6 +92,7 @@ run_importjob_SOURCES = run-importjob.cpp
|
||||
run_keyformailboxjob_SOURCES = run-keyformailboxjob.cpp
|
||||
run_receivekeysjob_SOURCES = run-receivekeysjob.cpp
|
||||
run_refreshkeysjob_SOURCES = run-refreshkeysjob.cpp
|
||||
run_signarchivejob_SOURCES = run-signarchivejob.cpp
|
||||
|
||||
nodist_t_keylist_SOURCES = $(moc_files)
|
||||
|
||||
@ -104,7 +105,9 @@ noinst_PROGRAMS = \
|
||||
t-trustsignatures t-changeexpiryjob t-wkdlookup t-import t-revokekey \
|
||||
t-setprimaryuserid \
|
||||
run-encryptarchivejob \
|
||||
run-importjob run-exportjob run-receivekeysjob run-refreshkeysjob
|
||||
run-importjob run-exportjob run-receivekeysjob run-refreshkeysjob \
|
||||
run-signarchivejob
|
||||
|
||||
|
||||
CLEANFILES = secring.gpg pubring.gpg pubring.kbx trustdb.gpg dirmngr.conf \
|
||||
gpg-agent.conf pubring.kbx~ S.gpg-agent gpg.conf pubring.gpg~ \
|
||||
|
145
lang/qt/tests/run-signarchivejob.cpp
Normal file
145
lang/qt/tests/run-signarchivejob.cpp
Normal file
@ -0,0 +1,145 @@
|
||||
/*
|
||||
run-signarchivejob.cpp
|
||||
|
||||
This file is part of QGpgME's test suite.
|
||||
Copyright (c) 2023 by 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,
|
||||
version 2, as published by the Free Software Foundation.
|
||||
|
||||
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 <signarchivejob.h>
|
||||
|
||||
#include <QCommandLineParser>
|
||||
#include <QCoreApplication>
|
||||
#include <QDebug>
|
||||
#include <QFile>
|
||||
|
||||
#include <context.h>
|
||||
#include <signingresult.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
using namespace GpgME;
|
||||
|
||||
std::ostream &operator<<(std::ostream &os, const QString &s)
|
||||
{
|
||||
return os << s.toLocal8Bit().constData();
|
||||
}
|
||||
|
||||
struct CommandLineOptions {
|
||||
bool armor;
|
||||
QString archiveName;
|
||||
QString baseDirectory;
|
||||
std::vector<QString> filesAndDirectories;
|
||||
};
|
||||
|
||||
CommandLineOptions parseCommandLine(const QStringList &arguments)
|
||||
{
|
||||
CommandLineOptions options;
|
||||
|
||||
QCommandLineParser parser;
|
||||
parser.setApplicationDescription("Test program for SignArchiveJob");
|
||||
parser.addHelpOption();
|
||||
parser.addOptions({
|
||||
{{"o", "output"}, "Write output to FILE.", "FILE"},
|
||||
{{"a", "armor"}, "Create ASCII armored output."},
|
||||
{{"C", "directory"}, "Change to DIRECTORY before creating the archive.", "DIRECTORY"},
|
||||
});
|
||||
parser.addPositionalArgument("files", "Files and directories to add to the archive", "[files] [directories]");
|
||||
|
||||
parser.process(arguments);
|
||||
|
||||
const auto args = parser.positionalArguments();
|
||||
if (args.empty()) {
|
||||
parser.showHelp(1);
|
||||
}
|
||||
|
||||
options.armor = parser.isSet("armor");
|
||||
options.archiveName = parser.value("output");
|
||||
options.baseDirectory = parser.value("directory");
|
||||
std::copy(args.begin(), args.end(), std::back_inserter(options.filesAndDirectories));
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
std::shared_ptr<QIODevice> createOutput(const QString &fileName)
|
||||
{
|
||||
std::shared_ptr<QFile> output;
|
||||
|
||||
if (fileName.isEmpty()) {
|
||||
output.reset(new QFile);
|
||||
output->open(stdout, QIODevice::WriteOnly);
|
||||
} else {
|
||||
if (QFile::exists(fileName)) {
|
||||
qCritical() << "File" << fileName << "exists. Bailing out.";
|
||||
} else {
|
||||
output.reset(new QFile{fileName});
|
||||
output->open(QIODevice::WriteOnly);
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
GpgME::initializeLibrary();
|
||||
|
||||
QCoreApplication app{argc, argv};
|
||||
app.setApplicationName("run-signarchivejob");
|
||||
|
||||
const auto options = parseCommandLine(app.arguments());
|
||||
|
||||
auto output = createOutput(options.archiveName);
|
||||
if (!output) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto job = QGpgME::openpgp()->signArchiveJob(options.armor);
|
||||
if (!job) {
|
||||
std::cerr << "Error: Could not create job" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
job->setBaseDirectory(options.baseDirectory);
|
||||
QObject::connect(job, &QGpgME::SignArchiveJob::result, &app, [](const GpgME::SigningResult &result, const QString &auditLog, const GpgME::Error &) {
|
||||
std::cerr << "Diagnostics: " << auditLog << std::endl;
|
||||
std::cerr << "Result: " << result << std::endl;
|
||||
qApp->quit();
|
||||
});
|
||||
|
||||
const auto err = job->start({}, options.filesAndDirectories, output);
|
||||
if (err) {
|
||||
std::cerr << "Error: Starting the job failed: " << err.asString() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return app.exec();
|
||||
}
|
Loading…
Reference in New Issue
Block a user