Qt: Add testTofuSignCount
* src/lang/qt/tests/t-tofuinfo.cpp(testTofuSignCount): New. (initTestCase): Set gpg-agent loopback pinentry config. (signAndVerify): Helper for tofuTestSignCount. -- Also needs the wait code because of GnuPG-Bug-Id: 2405
This commit is contained in:
parent
efb5059b9b
commit
8fa9b5696c
@ -35,6 +35,12 @@
|
|||||||
#include "tofuinfo.h"
|
#include "tofuinfo.h"
|
||||||
#include "verifyopaquejob.h"
|
#include "verifyopaquejob.h"
|
||||||
#include "verificationresult.h"
|
#include "verificationresult.h"
|
||||||
|
#include "signingresult.h"
|
||||||
|
#include "keylistjob.h"
|
||||||
|
#include "keylistresult.h"
|
||||||
|
#include "qgpgmesignjob.h"
|
||||||
|
#include "key.h"
|
||||||
|
#include "t-support.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
using namespace QGpgME;
|
using namespace QGpgME;
|
||||||
@ -64,6 +70,40 @@ class TofuInfoTest: public QObject
|
|||||||
Q_ASSERT(orig.policy() == other.policy());
|
Q_ASSERT(orig.policy() == other.policy());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void signAndVerify(const QString &what, const GpgME::Key &key, int expected)
|
||||||
|
{
|
||||||
|
Context *ctx = Context::createForProtocol(OpenPGP);
|
||||||
|
ctx->setPassphraseProvider(new TestPassphraseProvider);
|
||||||
|
ctx->setPinentryMode(Context::PinentryLoopback);
|
||||||
|
auto *job = new QGpgMESignJob(ctx);
|
||||||
|
|
||||||
|
std::vector<Key> keys;
|
||||||
|
keys.push_back(key);
|
||||||
|
QByteArray signedData;
|
||||||
|
auto sigResult = job->exec(keys, what.toUtf8(), NormalSignatureMode, signedData);
|
||||||
|
|
||||||
|
Q_ASSERT(!sigResult.error());
|
||||||
|
|
||||||
|
auto verifyJob = openpgp()->verifyOpaqueJob();
|
||||||
|
QByteArray verified;
|
||||||
|
|
||||||
|
auto result = verifyJob->exec(signedData, verified);
|
||||||
|
|
||||||
|
Q_ASSERT(!result.error());
|
||||||
|
Q_ASSERT(verified == what.toUtf8());
|
||||||
|
|
||||||
|
Q_ASSERT(result.numSignatures() == 1);
|
||||||
|
auto sig = result.signatures()[0];
|
||||||
|
|
||||||
|
Q_FOREACH(const TofuInfo stats, sig.tofuInfo()) {
|
||||||
|
Q_ASSERT(!stats.isNull());
|
||||||
|
Q_ASSERT(!strcmp(stats.fingerprint(), sig.fingerprint()));
|
||||||
|
Q_ASSERT(stats.signCount() == expected);
|
||||||
|
}
|
||||||
|
/* FIXME: GnuPG-Bug-Id 2405 makes the wait necessary. */
|
||||||
|
QTest::qWait(1000);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QTemporaryDir mDir;
|
QTemporaryDir mDir;
|
||||||
|
|
||||||
@ -90,9 +130,9 @@ private Q_SLOTS:
|
|||||||
|
|
||||||
auto result = job->exec(data1, plaintext);
|
auto result = job->exec(data1, plaintext);
|
||||||
|
|
||||||
Q_ASSERT(!strcmp(plaintext.constData(), "Just GNU it!\n"));
|
|
||||||
Q_ASSERT(!result.isNull());
|
Q_ASSERT(!result.isNull());
|
||||||
Q_ASSERT(!result.error());
|
Q_ASSERT(!result.error());
|
||||||
|
Q_ASSERT(!strcmp(plaintext.constData(), "Just GNU it!\n"));
|
||||||
|
|
||||||
Q_ASSERT(result.numSignatures() == 1);
|
Q_ASSERT(result.numSignatures() == 1);
|
||||||
Signature sig = result.signatures()[0];
|
Signature sig = result.signatures()[0];
|
||||||
@ -138,6 +178,44 @@ private Q_SLOTS:
|
|||||||
Q_ASSERT(stats.policy() == TofuInfo::PolicyAuto);
|
Q_ASSERT(stats.policy() == TofuInfo::PolicyAuto);
|
||||||
Q_ASSERT(stats.validity() == TofuInfo::LittleHistory);
|
Q_ASSERT(stats.validity() == TofuInfo::LittleHistory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Verify that another call yields the same result */
|
||||||
|
job = openpgp()->verifyOpaqueJob(true);
|
||||||
|
result = job->exec(data1, plaintext);
|
||||||
|
|
||||||
|
Q_ASSERT(!result.isNull());
|
||||||
|
Q_ASSERT(!result.error());
|
||||||
|
|
||||||
|
Q_ASSERT(result.numSignatures() == 1);
|
||||||
|
sig = result.signatures()[0];
|
||||||
|
/* TOFU is always marginal */
|
||||||
|
Q_ASSERT(sig.validity() == Signature::Marginal);
|
||||||
|
|
||||||
|
Q_ASSERT(!sig.tofuInfo().empty());
|
||||||
|
Q_FOREACH(const TofuInfo stats, sig.tofuInfo()) {
|
||||||
|
Q_ASSERT(!stats.isNull());
|
||||||
|
Q_ASSERT(!strcmp(stats.fingerprint(), sig.fingerprint()));
|
||||||
|
Q_ASSERT(stats.signCount() == 1);
|
||||||
|
Q_ASSERT(stats.address());
|
||||||
|
Q_ASSERT(stats.policy() == TofuInfo::PolicyAuto);
|
||||||
|
Q_ASSERT(stats.validity() == TofuInfo::LittleHistory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void testTofuSignCount()
|
||||||
|
{
|
||||||
|
auto *job = openpgp()->keyListJob(false, false, false);
|
||||||
|
std::vector<GpgME::Key> keys;
|
||||||
|
GpgME::KeyListResult result = job->exec(QStringList() << QStringLiteral("zulu@example.net"),
|
||||||
|
true, keys);
|
||||||
|
Q_ASSERT(!keys.empty());
|
||||||
|
Key key = keys[0];
|
||||||
|
Q_ASSERT(!key.isNull());
|
||||||
|
|
||||||
|
signAndVerify(QStringLiteral("Hello"), key, 0);
|
||||||
|
signAndVerify(QStringLiteral("Hello2"), key, 1);
|
||||||
|
signAndVerify(QStringLiteral("Hello3"), key, 2);
|
||||||
|
signAndVerify(QStringLiteral("Hello4"), key, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initTestCase()
|
void initTestCase()
|
||||||
@ -150,6 +228,10 @@ private Q_SLOTS:
|
|||||||
Q_ASSERT(conf.open(QIODevice::WriteOnly));
|
Q_ASSERT(conf.open(QIODevice::WriteOnly));
|
||||||
conf.write("trust-model tofu+pgp");
|
conf.write("trust-model tofu+pgp");
|
||||||
conf.close();
|
conf.close();
|
||||||
|
QFile agentConf(mDir.path() + QStringLiteral("/gpg-agent.conf"));
|
||||||
|
Q_ASSERT(agentConf.open(QIODevice::WriteOnly));
|
||||||
|
agentConf.write("allow-loopback-pinentry");
|
||||||
|
agentConf.close();
|
||||||
Q_ASSERT(QFile::copy(gpgHome + QStringLiteral("/pubring.gpg"),
|
Q_ASSERT(QFile::copy(gpgHome + QStringLiteral("/pubring.gpg"),
|
||||||
mDir.path() + QStringLiteral("/pubring.gpg")));
|
mDir.path() + QStringLiteral("/pubring.gpg")));
|
||||||
Q_ASSERT(QFile::copy(gpgHome + QStringLiteral("/secring.gpg"),
|
Q_ASSERT(QFile::copy(gpgHome + QStringLiteral("/secring.gpg"),
|
||||||
|
Loading…
Reference in New Issue
Block a user