aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Klöcker <[email protected]>2024-08-26 10:45:08 +0000
committerIngo Klöcker <[email protected]>2024-08-26 12:08:17 +0000
commit409e314582273be36b9b6516e89f142f2e99e682 (patch)
tree109ad45531c1a66b7ec3e862d466e9506f366c42
parentNew context flag "proc-all-sigs". (diff)
downloadgpgme-409e314582273be36b9b6516e89f142f2e99e682.tar.gz
gpgme-409e314582273be36b9b6516e89f142f2e99e682.zip
qt: Add support for new context flag "proc-all-sigs"
* lang/qt/src/decryptverifyarchivejob.cpp, lang/qt/src/decryptverifyarchivejob.h (DecryptVerifyArchiveJob): Add member functions setProcessAllSignatures, processAllSignatures. * lang/qt/src/decryptverifyarchivejob_p.h (DecryptVerifyArchiveJobPrivate): Add member m_processAllSignatures. * lang/qt/src/decryptverifyjob.cpp, lang/qt/src/decryptverifyjob.h (DecryptVerifyJob): Add member functions setProcessAllSignatures, processAllSignatures. * lang/qt/src/decryptverifyjob_p.h (DecryptVerifyJobPrivate): Add member m_processAllSignatures. * lang/qt/src/qgpgmedecryptverifyarchivejob.cpp (decrypt_verify_from_file_name): Add argument "processAllSignatures". Set context flag "proc-all-sigs" if requested. (QGpgMEDecryptVerifyArchiveJob::start): Set context flag "proc-all-sigs" if requested. (QGpgMEDecryptVerifyArchiveJobPrivate::startIt): Pass m_processAllSignatures to decrypt_verify_from_file_name. * lang/qt/src/qgpgmedecryptverifyjob.cpp (decrypt_verify_from_filename): Add argument "processAllSignatures". Set context flag "proc-all-sigs" if requested. (QGpgMEDecryptVerifyJob::start, QGpgMEDecryptVerifyJob::exec): Set context flag "proc-all-sigs" if requested. (QGpgMEDecryptVerifyJobPrivate::startIt): Pass m_processAllSignatures to decrypt_verify_from_filename. * lang/qt/src/qgpgmeverifydetachedjob.cpp (verify_from_filename): Add argument "processAllSignatures". Set context flag "proc-all-sigs" if requested. (QGpgMEVerifyDetachedJob::start, QGpgMEVerifyDetachedJob::exec): Set context flag "proc-all-sigs" if requested. (QGpgMEVerifyDetachedJobPrivate::startIt): Pass m_processAllSignatures to decrypt_verify_from_filename. * lang/qt/src/qgpgmeverifyopaquejob.cpp (verify_from_filename): Add argument "processAllSignatures". Set context flag "proc-all-sigs" if requested. (QGpgMEVerifyOpaqueJob::start, QGpgMEVerifyOpaqueJob::exec): Set context flag "proc-all-sigs" if requested. (QGpgMEVerifyOpaqueJobPrivate::startIt): Pass m_processAllSignatures to decrypt_verify_from_filename. * lang/qt/src/verifydetachedjob.cpp, lang/qt/src/verifydetachedjob.h (VerifyDetachedJob): Add member functions setProcessAllSignatures, processAllSignatures. * lang/qt/src/verifydetachedjob_p.h (VerifyDetachedJobPrivate): Add member m_processAllSignatures. * lang/qt/src/verifyopaquejob.cpp, lang/qt/src/verifyopaquejob.h (VerifyOpaqueJob): Add member functions setProcessAllSignatures, processAllSignatures. * lang/qt/src/verifyopaquejob_p.h (VerifyOpaqueJobPrivate): Add member m_processAllSignatures. * lang/qt/tests/run-decryptverifyarchivejob.cpp, lang/qt/tests/run-decryptverifyjob.cpp, lang/qt/tests/run-verifydetachedjob.cpp, lang/qt/tests/run-verifyopaquejob.cpp (struct CommandLineOptions): Add member processAllSignatures. (parseCommandLine): Add command line option --process-all-signatures. (main): Pass new option to the job. -- The new option processAllSignatures is added to all jobs that verify data signatures. By enabling this option, one can tell gpg not to stop checking signatures after the first bad signature. GnuPG-bug-id: 6870
-rw-r--r--NEWS11
-rw-r--r--lang/qt/src/decryptverifyarchivejob.cpp12
-rw-r--r--lang/qt/src/decryptverifyarchivejob.h14
-rw-r--r--lang/qt/src/decryptverifyarchivejob_p.h1
-rw-r--r--lang/qt/src/decryptverifyjob.cpp12
-rw-r--r--lang/qt/src/decryptverifyjob.h14
-rw-r--r--lang/qt/src/decryptverifyjob_p.h1
-rw-r--r--lang/qt/src/qgpgmedecryptverifyarchivejob.cpp11
-rw-r--r--lang/qt/src/qgpgmedecryptverifyjob.cpp17
-rw-r--r--lang/qt/src/qgpgmeverifydetachedjob.cpp17
-rw-r--r--lang/qt/src/qgpgmeverifyopaquejob.cpp17
-rw-r--r--lang/qt/src/verifydetachedjob.cpp12
-rw-r--r--lang/qt/src/verifydetachedjob.h14
-rw-r--r--lang/qt/src/verifydetachedjob_p.h1
-rw-r--r--lang/qt/src/verifyopaquejob.cpp12
-rw-r--r--lang/qt/src/verifyopaquejob.h14
-rw-r--r--lang/qt/src/verifyopaquejob_p.h1
-rw-r--r--lang/qt/tests/run-decryptverifyarchivejob.cpp4
-rw-r--r--lang/qt/tests/run-decryptverifyjob.cpp4
-rw-r--r--lang/qt/tests/run-verifydetachedjob.cpp6
-rw-r--r--lang/qt/tests/run-verifyopaquejob.cpp4
21 files changed, 191 insertions, 8 deletions
diff --git a/NEWS b/NEWS
index 9a4eeeba..fdca7ab1 100644
--- a/NEWS
+++ b/NEWS
@@ -42,6 +42,9 @@ Noteworthy changes in version 1.24.0 (unrelease)
* qt: Add support for enabling and disabling keys. [T7239]
+ * qt: Add support for new context flag "proc-all-sigs" to the jobs that
+ verify data signatures.
+
* Interface changes relative to the 1.23.2 release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GPGME_ENCRYPT_FILE NEW.
@@ -63,10 +66,14 @@ Noteworthy changes in version 1.24.0 (unrelease)
cpp: Key::revocationKeys NEW.
cpp: Error::asStdString NEW.
cpp: Error::asString DEPRECATED.
+ qt: DecryptVerifyArchiveJob::setProcessAllSignatures NEW.
+ qt: DecryptVerifyArchiveJob::processAllSignatures NEW.
qt: DecryptVerifyJob::setInputFile NEW.
qt: DecryptVerifyJob::inputFile NEW.
qt: DecryptVerifyJob::setOutputFile NEW.
qt: DecryptVerifyJob::outputFile NEW.
+ qt: DecryptVerifyJob::setProcessAllSignatures NEW.
+ qt: DecryptVerifyJob::processAllSignatures NEW.
qt: EncryptJob::setRecipients NEW.
qt: EncryptJob::recipients NEW.
qt: EncryptJob::setInputFile NEW.
@@ -99,10 +106,14 @@ Noteworthy changes in version 1.24.0 (unrelease)
qt: VerifyDetachedJob::signatureFile NEW.
qt: VerifyDetachedJob::setSignedFile NEW.
qt: VerifyDetachedJob::signedFile NEW.
+ qt: VerifyDetachedJob::setProcessAllSignatures NEW.
+ qt: VerifyDetachedJob::processAllSignatures NEW.
qt: VerifyOpaqueJob::setInputFile NEW.
qt: VerifyOpaqueJob::inputFile NEW.
qt: VerifyOpaqueJob::setOutputFile NEW.
qt: VerifyOpaqueJob::outputFile NEW.
+ qt: VerifyOpaqueJob::setProcessAllSignatures NEW.
+ qt: VerifyOpaqueJob::processAllSignatures NEW.
qt: ImportJob::setImportOptions NEW.
qt: ImportJob::importOptions NEW.
qt: QuickJob::startSetKeyEnabled NEW.
diff --git a/lang/qt/src/decryptverifyarchivejob.cpp b/lang/qt/src/decryptverifyarchivejob.cpp
index b1699c3d..d427e1fd 100644
--- a/lang/qt/src/decryptverifyarchivejob.cpp
+++ b/lang/qt/src/decryptverifyarchivejob.cpp
@@ -56,6 +56,18 @@ bool DecryptVerifyArchiveJob::isSupported()
return (gpgVersion >= "2.4.1") || (gpgVersion >= "2.2.42" && gpgVersion < "2.3.0");
}
+void DecryptVerifyArchiveJob::setProcessAllSignatures (bool processAll)
+{
+ auto d = jobPrivate<DecryptVerifyArchiveJobPrivate>(this);
+ d->m_processAllSignatures = processAll;
+}
+
+bool DecryptVerifyArchiveJob::processAllSignatures() const
+{
+ auto d = jobPrivate<DecryptVerifyArchiveJobPrivate>(this);
+ return d->m_processAllSignatures;
+}
+
void DecryptVerifyArchiveJob::setInputFile(const QString &path)
{
auto d = jobPrivate<DecryptVerifyArchiveJobPrivate>(this);
diff --git a/lang/qt/src/decryptverifyarchivejob.h b/lang/qt/src/decryptverifyarchivejob.h
index f80170c5..3139ae66 100644
--- a/lang/qt/src/decryptverifyarchivejob.h
+++ b/lang/qt/src/decryptverifyarchivejob.h
@@ -60,6 +60,20 @@ public:
static bool isSupported();
/**
+ * Enables processing of all signatures if \a processAll is true.
+ *
+ * By default, gpg (in batch mode used by GpgME) stops the verification of
+ * data signatures when a bad signature is encountered. This can be changed
+ * by setting this flag. It's equivalent to setting the context flag
+ * "proc-all-sigs".
+ *
+ * This is only supported for OpenPGP and requires GnuPG 2.2.45, 2.4.6, or
+ * 2.5.1.
+ */
+ void setProcessAllSignatures(bool processAll);
+ bool processAllSignatures() const;
+
+ /**
* Sets the path of the file to read the archive from.
*
* Used if the job is started with startIt().
diff --git a/lang/qt/src/decryptverifyarchivejob_p.h b/lang/qt/src/decryptverifyarchivejob_p.h
index e0823d23..bce093db 100644
--- a/lang/qt/src/decryptverifyarchivejob_p.h
+++ b/lang/qt/src/decryptverifyarchivejob_p.h
@@ -43,6 +43,7 @@ struct DecryptVerifyArchiveJobPrivate : public JobPrivate
{
QString m_inputFilePath;
QString m_outputDirectory;
+ bool m_processAllSignatures = false;
};
}
diff --git a/lang/qt/src/decryptverifyjob.cpp b/lang/qt/src/decryptverifyjob.cpp
index f369f1d5..f96305b9 100644
--- a/lang/qt/src/decryptverifyjob.cpp
+++ b/lang/qt/src/decryptverifyjob.cpp
@@ -47,6 +47,18 @@ DecryptVerifyJob::DecryptVerifyJob(QObject *parent)
DecryptVerifyJob::~DecryptVerifyJob() = default;
+void DecryptVerifyJob::setProcessAllSignatures (bool processAll)
+{
+ auto d = jobPrivate<DecryptVerifyJobPrivate>(this);
+ d->m_processAllSignatures = processAll;
+}
+
+bool DecryptVerifyJob::processAllSignatures() const
+{
+ auto d = jobPrivate<DecryptVerifyJobPrivate>(this);
+ return d->m_processAllSignatures;
+}
+
void DecryptVerifyJob::setInputFile(const QString &path)
{
auto d = jobPrivate<DecryptVerifyJobPrivate>(this);
diff --git a/lang/qt/src/decryptverifyjob.h b/lang/qt/src/decryptverifyjob.h
index 710fc80e..73dbea15 100644
--- a/lang/qt/src/decryptverifyjob.h
+++ b/lang/qt/src/decryptverifyjob.h
@@ -82,6 +82,20 @@ public:
~DecryptVerifyJob() override;
/**
+ * Enables processing of all signatures if \a processAll is true.
+ *
+ * By default, gpg (in batch mode used by GpgME) stops the verification of
+ * data signatures when a bad signature is encountered. This can be changed
+ * by setting this flag. It's equivalent to setting the context flag
+ * "proc-all-sigs".
+ *
+ * This is only supported for OpenPGP and requires GnuPG 2.2.45, 2.4.6, or
+ * 2.5.1.
+ */
+ void setProcessAllSignatures(bool processAll);
+ bool processAllSignatures() const;
+
+ /**
* Sets the path of the file to decrypt (and verify).
*
* Used if the job is started with startIt().
diff --git a/lang/qt/src/decryptverifyjob_p.h b/lang/qt/src/decryptverifyjob_p.h
index bbd30b59..10701da1 100644
--- a/lang/qt/src/decryptverifyjob_p.h
+++ b/lang/qt/src/decryptverifyjob_p.h
@@ -43,6 +43,7 @@ struct DecryptVerifyJobPrivate : public JobPrivate
{
QString m_inputFilePath;
QString m_outputFilePath;
+ bool m_processAllSignatures = false;
};
}
diff --git a/lang/qt/src/qgpgmedecryptverifyarchivejob.cpp b/lang/qt/src/qgpgmedecryptverifyarchivejob.cpp
index eda4bfd8..10f07e53 100644
--- a/lang/qt/src/qgpgmedecryptverifyarchivejob.cpp
+++ b/lang/qt/src/qgpgmedecryptverifyarchivejob.cpp
@@ -119,7 +119,8 @@ static QGpgMEDecryptVerifyArchiveJob::result_type decrypt_verify_from_io_device(
static QGpgMEDecryptVerifyArchiveJob::result_type decrypt_verify_from_file_name(Context *ctx,
const QString &inputFile,
- const QString &outputDirectory)
+ const QString &outputDirectory,
+ bool processAllSignatures)
{
Data indata;
#ifdef Q_OS_WIN
@@ -128,6 +129,9 @@ static QGpgMEDecryptVerifyArchiveJob::result_type decrypt_verify_from_file_name(
indata.setFileName(QFile::encodeName(inputFile).constData());
#endif
+ if (processAllSignatures) {
+ ctx->setFlag("proc-all-sigs", "1");
+ }
return decrypt_verify(ctx, indata, outputDirectory);
}
@@ -137,6 +141,9 @@ GpgME::Error QGpgMEDecryptVerifyArchiveJob::start(const std::shared_ptr<QIODevic
return Error::fromCode(GPG_ERR_INV_VALUE);
}
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
run(std::bind(&decrypt_verify_from_io_device,
std::placeholders::_1,
std::placeholders::_2,
@@ -153,7 +160,7 @@ GpgME::Error QGpgMEDecryptVerifyArchiveJobPrivate::startIt()
}
q->run([=](Context *ctx) {
- return decrypt_verify_from_file_name(ctx, m_inputFilePath, m_outputDirectory);
+ return decrypt_verify_from_file_name(ctx, m_inputFilePath, m_outputDirectory, m_processAllSignatures);
});
return {};
diff --git a/lang/qt/src/qgpgmedecryptverifyjob.cpp b/lang/qt/src/qgpgmedecryptverifyjob.cpp
index 24930693..e8d2ad4e 100644
--- a/lang/qt/src/qgpgmedecryptverifyjob.cpp
+++ b/lang/qt/src/qgpgmedecryptverifyjob.cpp
@@ -145,7 +145,8 @@ static QGpgMEDecryptVerifyJob::result_type decrypt_verify_qba(Context *ctx, cons
static QGpgMEDecryptVerifyJob::result_type decrypt_verify_from_filename(Context *ctx,
const QString &inputFilePath,
- const QString &outputFilePath)
+ const QString &outputFilePath,
+ bool processAllSignatures)
{
Data indata;
#ifdef Q_OS_WIN
@@ -166,6 +167,9 @@ static QGpgMEDecryptVerifyJob::result_type decrypt_verify_from_filename(Context
outdata.setFileName(QFile::encodeName(partFileGuard.tempFileName()).constData());
#endif
+ if (processAllSignatures) {
+ ctx->setFlag("proc-all-sigs", "1");
+ }
const auto results = ctx->decryptAndVerify(indata, outdata);
const auto &decryptionResult = results.first;
const auto &verificationResult = results.second;
@@ -182,18 +186,27 @@ static QGpgMEDecryptVerifyJob::result_type decrypt_verify_from_filename(Context
Error QGpgMEDecryptVerifyJob::start(const QByteArray &cipherText)
{
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
run(std::bind(&decrypt_verify_qba, std::placeholders::_1, cipherText));
return Error();
}
void QGpgMEDecryptVerifyJob::start(const std::shared_ptr<QIODevice> &cipherText, const std::shared_ptr<QIODevice> &plainText)
{
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
run(std::bind(&decrypt_verify, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4), cipherText, plainText);
}
std::pair<GpgME::DecryptionResult, GpgME::VerificationResult>
QGpgME::QGpgMEDecryptVerifyJob::exec(const QByteArray &cipherText, QByteArray &plainText)
{
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
const result_type r = decrypt_verify_qba(context(), cipherText);
plainText = std::get<2>(r);
return std::make_pair(std::get<0>(r), std::get<1>(r));
@@ -206,7 +219,7 @@ GpgME::Error QGpgMEDecryptVerifyJobPrivate::startIt()
}
q->run([=](Context *ctx) {
- return decrypt_verify_from_filename(ctx, m_inputFilePath, m_outputFilePath);
+ return decrypt_verify_from_filename(ctx, m_inputFilePath, m_outputFilePath, m_processAllSignatures);
});
return {};
diff --git a/lang/qt/src/qgpgmeverifydetachedjob.cpp b/lang/qt/src/qgpgmeverifydetachedjob.cpp
index 1f6e47cd..91d89f96 100644
--- a/lang/qt/src/qgpgmeverifydetachedjob.cpp
+++ b/lang/qt/src/qgpgmeverifydetachedjob.cpp
@@ -131,7 +131,8 @@ static QGpgMEVerifyDetachedJob::result_type verify_detached_qba(Context *ctx, co
static QGpgMEVerifyDetachedJob::result_type verify_from_filename(Context *ctx,
const QString &signatureFilePath,
- const QString &signedFilePath)
+ const QString &signedFilePath,
+ bool processAllSignatures)
{
Data signatureData;
#ifdef Q_OS_WIN
@@ -147,6 +148,9 @@ static QGpgMEVerifyDetachedJob::result_type verify_from_filename(Context *ctx,
signedData.setFileName(QFile::encodeName(signedFilePath).constData());
#endif
+ if (processAllSignatures) {
+ ctx->setFlag("proc-all-sigs", "1");
+ }
const auto verificationResult = ctx->verifyDetachedSignature(signatureData, signedData);
Error ae;
@@ -156,18 +160,27 @@ static QGpgMEVerifyDetachedJob::result_type verify_from_filename(Context *ctx,
Error QGpgMEVerifyDetachedJob::start(const QByteArray &signature, const QByteArray &signedData)
{
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
run(std::bind(&verify_detached_qba, std::placeholders::_1, signature, signedData));
return Error();
}
void QGpgMEVerifyDetachedJob::start(const std::shared_ptr<QIODevice> &signature, const std::shared_ptr<QIODevice> &signedData)
{
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
run(std::bind(&verify_detached, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4), signature, signedData);
}
GpgME::VerificationResult QGpgME::QGpgMEVerifyDetachedJob::exec(const QByteArray &signature,
const QByteArray &signedData)
{
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
const result_type r = verify_detached_qba(context(), signature, signedData);
return std::get<0>(r);
}
@@ -179,7 +192,7 @@ GpgME::Error QGpgMEVerifyDetachedJobPrivate::startIt()
}
q->run([=](Context *ctx) {
- return verify_from_filename(ctx, m_signatureFilePath, m_signedFilePath);
+ return verify_from_filename(ctx, m_signatureFilePath, m_signedFilePath, m_processAllSignatures);
});
return {};
diff --git a/lang/qt/src/qgpgmeverifyopaquejob.cpp b/lang/qt/src/qgpgmeverifyopaquejob.cpp
index 19e61e37..0cca9f72 100644
--- a/lang/qt/src/qgpgmeverifyopaquejob.cpp
+++ b/lang/qt/src/qgpgmeverifyopaquejob.cpp
@@ -136,7 +136,8 @@ static QGpgMEVerifyOpaqueJob::result_type verify_opaque_qba(Context *ctx, const
static QGpgMEVerifyOpaqueJob::result_type verify_from_filename(Context *ctx,
const QString &inputFilePath,
- const QString &outputFilePath)
+ const QString &outputFilePath,
+ bool processAllSignatures)
{
Data indata;
#ifdef Q_OS_WIN
@@ -157,6 +158,9 @@ static QGpgMEVerifyOpaqueJob::result_type verify_from_filename(Context *ctx,
outdata.setFileName(QFile::encodeName(partFileGuard.tempFileName()).constData());
#endif
+ if (processAllSignatures) {
+ ctx->setFlag("proc-all-sigs", "1");
+ }
const auto verificationResult = ctx->verifyOpaqueSignature(indata, outdata);
if (!verificationResult.error().code()) {
@@ -171,17 +175,26 @@ static QGpgMEVerifyOpaqueJob::result_type verify_from_filename(Context *ctx,
Error QGpgMEVerifyOpaqueJob::start(const QByteArray &signedData)
{
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
run(std::bind(&verify_opaque_qba, std::placeholders::_1, signedData));
return Error();
}
void QGpgMEVerifyOpaqueJob::start(const std::shared_ptr<QIODevice> &signedData, const std::shared_ptr<QIODevice> &plainText)
{
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
run(std::bind(&verify_opaque, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4), signedData, plainText);
}
GpgME::VerificationResult QGpgME::QGpgMEVerifyOpaqueJob::exec(const QByteArray &signedData, QByteArray &plainText)
{
+ if (processAllSignatures()) {
+ context()->setFlag("proc-all-sigs", "1");
+ }
const result_type r = verify_opaque_qba(context(), signedData);
plainText = std::get<1>(r);
return std::get<0>(r);
@@ -194,7 +207,7 @@ GpgME::Error QGpgMEVerifyOpaqueJobPrivate::startIt()
}
q->run([=](Context *ctx) {
- return verify_from_filename(ctx, m_inputFilePath, m_outputFilePath);
+ return verify_from_filename(ctx, m_inputFilePath, m_outputFilePath, m_processAllSignatures);
});
return {};
diff --git a/lang/qt/src/verifydetachedjob.cpp b/lang/qt/src/verifydetachedjob.cpp
index 11e630c1..68fe7f21 100644
--- a/lang/qt/src/verifydetachedjob.cpp
+++ b/lang/qt/src/verifydetachedjob.cpp
@@ -47,6 +47,18 @@ VerifyDetachedJob::VerifyDetachedJob(QObject *parent)
VerifyDetachedJob::~VerifyDetachedJob() = default;
+void VerifyDetachedJob::setProcessAllSignatures (bool processAll)
+{
+ auto d = jobPrivate<VerifyDetachedJobPrivate>(this);
+ d->m_processAllSignatures = processAll;
+}
+
+bool VerifyDetachedJob::processAllSignatures() const
+{
+ auto d = jobPrivate<VerifyDetachedJobPrivate>(this);
+ return d->m_processAllSignatures;
+}
+
void VerifyDetachedJob::setSignatureFile(const QString &path)
{
auto d = jobPrivate<VerifyDetachedJobPrivate>(this);
diff --git a/lang/qt/src/verifydetachedjob.h b/lang/qt/src/verifydetachedjob.h
index c8c516bf..b5b668e3 100644
--- a/lang/qt/src/verifydetachedjob.h
+++ b/lang/qt/src/verifydetachedjob.h
@@ -79,6 +79,20 @@ public:
~VerifyDetachedJob() override;
/**
+ * Enables processing of all signatures if \a processAll is true.
+ *
+ * By default, gpg (in batch mode used by GpgME) stops the verification of
+ * data signatures when a bad signature is encountered. This can be changed
+ * by setting this flag. It's equivalent to setting the context flag
+ * "proc-all-sigs".
+ *
+ * This is only supported for OpenPGP and requires GnuPG 2.2.45, 2.4.6, or
+ * 2.5.1.
+ */
+ void setProcessAllSignatures(bool processAll);
+ bool processAllSignatures() const;
+
+ /**
* Sets the path of the file containing the signature to verify.
*
* Used if the job is started with startIt().
diff --git a/lang/qt/src/verifydetachedjob_p.h b/lang/qt/src/verifydetachedjob_p.h
index 1fedc8fb..cc594210 100644
--- a/lang/qt/src/verifydetachedjob_p.h
+++ b/lang/qt/src/verifydetachedjob_p.h
@@ -43,6 +43,7 @@ struct VerifyDetachedJobPrivate : public JobPrivate
{
QString m_signatureFilePath;
QString m_signedFilePath;
+ bool m_processAllSignatures = false;
};
}
diff --git a/lang/qt/src/verifyopaquejob.cpp b/lang/qt/src/verifyopaquejob.cpp
index 1ae8e75b..dced4595 100644
--- a/lang/qt/src/verifyopaquejob.cpp
+++ b/lang/qt/src/verifyopaquejob.cpp
@@ -47,6 +47,18 @@ VerifyOpaqueJob::VerifyOpaqueJob(QObject *parent)
VerifyOpaqueJob::~VerifyOpaqueJob() = default;
+void VerifyOpaqueJob::setProcessAllSignatures (bool processAll)
+{
+ auto d = jobPrivate<VerifyOpaqueJobPrivate>(this);
+ d->m_processAllSignatures = processAll;
+}
+
+bool VerifyOpaqueJob::processAllSignatures() const
+{
+ auto d = jobPrivate<VerifyOpaqueJobPrivate>(this);
+ return d->m_processAllSignatures;
+}
+
void VerifyOpaqueJob::setInputFile(const QString &path)
{
auto d = jobPrivate<VerifyOpaqueJobPrivate>(this);
diff --git a/lang/qt/src/verifyopaquejob.h b/lang/qt/src/verifyopaquejob.h
index 8dd73141..e006886b 100644
--- a/lang/qt/src/verifyopaquejob.h
+++ b/lang/qt/src/verifyopaquejob.h
@@ -81,6 +81,20 @@ public:
~VerifyOpaqueJob() override;
/**
+ * Enables processing of all signatures if \a processAll is true.
+ *
+ * By default, gpg (in batch mode used by GpgME) stops the verification of
+ * data signatures when a bad signature is encountered. This can be changed
+ * by setting this flag. It's equivalent to setting the context flag
+ * "proc-all-sigs".
+ *
+ * This is only supported for OpenPGP and requires GnuPG 2.2.45, 2.4.6, or
+ * 2.5.1.
+ */
+ void setProcessAllSignatures(bool processAll);
+ bool processAllSignatures() const;
+
+ /**
* Sets the path of the file to verify.
*
* Used if the job is started with startIt().
diff --git a/lang/qt/src/verifyopaquejob_p.h b/lang/qt/src/verifyopaquejob_p.h
index 3dce6dec..9686f01c 100644
--- a/lang/qt/src/verifyopaquejob_p.h
+++ b/lang/qt/src/verifyopaquejob_p.h
@@ -43,6 +43,7 @@ struct VerifyOpaqueJobPrivate : public JobPrivate
{
QString m_inputFilePath;
QString m_outputFilePath;
+ bool m_processAllSignatures = false;
};
}
diff --git a/lang/qt/tests/run-decryptverifyarchivejob.cpp b/lang/qt/tests/run-decryptverifyarchivejob.cpp
index 36d023ec..6d5615c0 100644
--- a/lang/qt/tests/run-decryptverifyarchivejob.cpp
+++ b/lang/qt/tests/run-decryptverifyarchivejob.cpp
@@ -56,6 +56,7 @@ std::ostream &operator<<(std::ostream &os, const QString &s)
}
struct CommandLineOptions {
+ bool processAllSignatures = false;
QString outputDirectory;
QString archiveName;
};
@@ -69,6 +70,7 @@ CommandLineOptions parseCommandLine(const QStringList &arguments)
parser.addHelpOption();
parser.addOptions({
{{"C", "directory"}, "Extract the files into the directory DIRECTORY.", "DIRECTORY"},
+ {"process-all-signatures", "Don't stop signature checking after bad signature."},
});
parser.addPositionalArgument("archive", "The archive to decrypt and extract");
@@ -79,6 +81,7 @@ CommandLineOptions parseCommandLine(const QStringList &arguments)
parser.showHelp(1);
}
+ options.processAllSignatures = parser.isSet("process-all-signatures");
options.outputDirectory = parser.value("directory");
options.archiveName = args.first();
@@ -104,6 +107,7 @@ int main(int argc, char **argv)
std::cerr << "Error: Could not create job" << std::endl;
return 1;
}
+ job->setProcessAllSignatures(options.processAllSignatures);
job->setInputFile(options.archiveName);
job->setOutputDirectory(options.outputDirectory);
QObject::connect(job, &QGpgME::DecryptVerifyArchiveJob::result, &app, [](const GpgME::DecryptionResult &decryptionResult, const GpgME::VerificationResult &verificationResult, const QString &auditLog, const GpgME::Error &) {
diff --git a/lang/qt/tests/run-decryptverifyjob.cpp b/lang/qt/tests/run-decryptverifyjob.cpp
index da8ec9fe..805bad68 100644
--- a/lang/qt/tests/run-decryptverifyjob.cpp
+++ b/lang/qt/tests/run-decryptverifyjob.cpp
@@ -58,6 +58,7 @@ std::ostream &operator<<(std::ostream &os, const QString &s)
}
struct CommandLineOptions {
+ bool processAllSignatures = false;
QString inputFile;
QString outputFile;
std::chrono::seconds cancelTimeout{0};
@@ -73,6 +74,7 @@ CommandLineOptions parseCommandLine(const QStringList &arguments)
parser.addOptions({
{{"o", "output"}, "Write output to FILE.", "FILE"},
{"cancel-after", "Cancel the running job after SECONDS seconds.", "SECONDS"},
+ {"process-all-signatures", "Don't stop signature checking after bad signature."},
});
parser.addPositionalArgument("file", "File to decrypt", "FILE");
@@ -83,6 +85,7 @@ CommandLineOptions parseCommandLine(const QStringList &arguments)
parser.showHelp(1);
}
+ options.processAllSignatures = parser.isSet("process-all-signatures");
options.inputFile = args.front();
options.outputFile = parser.value("output");
if (parser.isSet("cancel-after")) {
@@ -146,6 +149,7 @@ int main(int argc, char **argv)
std::shared_ptr<QFile> input;
GpgME::Error err;
+ job->setProcessAllSignatures(options.processAllSignatures);
if (output) {
input.reset(new QFile{options.inputFile});
input->open(QIODevice::ReadOnly);
diff --git a/lang/qt/tests/run-verifydetachedjob.cpp b/lang/qt/tests/run-verifydetachedjob.cpp
index 60ba5470..17a719e9 100644
--- a/lang/qt/tests/run-verifydetachedjob.cpp
+++ b/lang/qt/tests/run-verifydetachedjob.cpp
@@ -56,6 +56,7 @@ std::ostream &operator<<(std::ostream &os, const QString &s)
}
struct CommandLineOptions {
+ bool processAllSignatures = false;
QString signatureFile;
QString signedFile;
};
@@ -67,6 +68,9 @@ CommandLineOptions parseCommandLine(const QStringList &arguments)
QCommandLineParser parser;
parser.setApplicationDescription("Test program for VerifyDetachedJob");
parser.addHelpOption();
+ parser.addOptions({
+ {"process-all-signatures", "Don't stop signature checking after bad signature."},
+ });
parser.addPositionalArgument("signature", "Detached SIGNATURE to verify", "SIGNATURE");
parser.addPositionalArgument("signed file", "FILE containing the signed data", "FILE");
@@ -77,6 +81,7 @@ CommandLineOptions parseCommandLine(const QStringList &arguments)
parser.showHelp(1);
}
+ options.processAllSignatures = parser.isSet("process-all-signatures");
options.signatureFile = args[0];
options.signedFile = args[1];
@@ -110,6 +115,7 @@ int main(int argc, char **argv)
std::shared_ptr<QFile> input;
GpgME::Error err;
+ job->setProcessAllSignatures(options.processAllSignatures);
job->setSignatureFile(options.signatureFile);
job->setSignedFile(options.signedFile);
err = job->startIt();
diff --git a/lang/qt/tests/run-verifyopaquejob.cpp b/lang/qt/tests/run-verifyopaquejob.cpp
index 09578430..a3245b4f 100644
--- a/lang/qt/tests/run-verifyopaquejob.cpp
+++ b/lang/qt/tests/run-verifyopaquejob.cpp
@@ -57,6 +57,7 @@ std::ostream &operator<<(std::ostream &os, const QString &s)
}
struct CommandLineOptions {
+ bool processAllSignatures = false;
QString inputFile;
QString outputFile;
std::chrono::seconds cancelTimeout{0};
@@ -72,6 +73,7 @@ CommandLineOptions parseCommandLine(const QStringList &arguments)
parser.addOptions({
{{"o", "output"}, "Write output to FILE.", "FILE"},
{"cancel-after", "Cancel the running job after SECONDS seconds.", "SECONDS"},
+ {"process-all-signatures", "Don't stop signature checking after bad signature."},
});
parser.addPositionalArgument("file", "File to verify", "FILE");
@@ -82,6 +84,7 @@ CommandLineOptions parseCommandLine(const QStringList &arguments)
parser.showHelp(1);
}
+ options.processAllSignatures = parser.isSet("process-all-signatures");
options.inputFile = args.front();
options.outputFile = parser.value("output");
if (parser.isSet("cancel-after")) {
@@ -143,6 +146,7 @@ int main(int argc, char **argv)
std::shared_ptr<QFile> input;
GpgME::Error err;
+ job->setProcessAllSignatures(options.processAllSignatures);
if (output) {
input.reset(new QFile{options.inputFile});
input->open(QIODevice::ReadOnly);