cpp: Add support for gpgme_op_revsig

* lang/cpp/src/context.cpp, lang/cpp/src/context.h
(Context::revokeSignature, Context::startRevokeSignature): New.
* lang/cpp/src/context.cpp
(getLFSeparatedListOfStrings, getLFSeparatedListOfUserIds): New.
(getLFSeparatedListOfFingerprintsFromSubkeys): Extracted second part
of function to getLFSeparatedListOfStrings.
--

GnuPG-bug-id: 5094
This commit is contained in:
Ingo Klöcker 2020-10-28 12:48:31 +01:00
parent f3407d0ee4
commit 4166d263e4
3 changed files with 61 additions and 12 deletions

4
NEWS
View File

@ -9,6 +9,8 @@ Noteworthy changes in version 1.14.1 (unreleased)
* cpp: Support for set expire operations in the C++ bindings. [#5003] * cpp: Support for set expire operations in the C++ bindings. [#5003]
* cpp: Support for revoking key signatures in the C++ bindings. [#5094]
* qt: Extended ChangeExpiryJob to support changing the expiry of * qt: Extended ChangeExpiryJob to support changing the expiry of
subkeys. [#4717] subkeys. [#4717]
@ -29,6 +31,8 @@ Noteworthy changes in version 1.14.1 (unreleased)
cpp: StatusConsumer NEW. cpp: StatusConsumer NEW.
cpp: StatusConsumerAssuanTransaction NEW. cpp: StatusConsumerAssuanTransaction NEW.
cpp: Context::cancelPendingOperationImmediately NEW. cpp: Context::cancelPendingOperationImmediately NEW.
cpp: Context::revokeSignature NEW.
cpp: Context::startRevokeSignature NEW.
qt: operator<<(QDebug debug, const GpgME::Error &err) NEW. qt: operator<<(QDebug debug, const GpgME::Error &err) NEW.

View File

@ -1532,6 +1532,22 @@ Error Context::startCreateSubkey(const Key &k, const char *algo,
k.impl(), algo, reserved, expires, flags)); k.impl(), algo, reserved, expires, flags));
} }
static std::string getLFSeparatedListOfStrings(const std::vector<std::string> &strings)
{
if (strings.empty()) {
return std::string();
}
return std::accumulate(
std::next(strings.begin()),
strings.end(),
strings[0],
[](const std::string &a, const std::string &b) {
return a + '\n' + b;
}
);
}
static std::string getLFSeparatedListOfFingerprintsFromSubkeys(const std::vector<Subkey> &subkeys) static std::string getLFSeparatedListOfFingerprintsFromSubkeys(const std::vector<Subkey> &subkeys)
{ {
if (subkeys.empty()) { if (subkeys.empty()) {
@ -1546,18 +1562,7 @@ static std::string getLFSeparatedListOfFingerprintsFromSubkeys(const std::vector
} }
} }
if (fprs.empty()) { return getLFSeparatedListOfStrings(fprs);
return std::string();
}
return std::accumulate(
std::next(fprs.begin()),
fprs.end(),
fprs[0],
[](const std::string &a, const std::string &b) {
return a + '\n' + b;
}
);
} }
Error Context::setExpire(const Key &k, unsigned long expires, Error Context::setExpire(const Key &k, unsigned long expires,
@ -1588,6 +1593,41 @@ Error Context::startSetExpire(const Key &k, unsigned long expires,
k.impl(), expires, subfprs.c_str(), 0)); k.impl(), expires, subfprs.c_str(), 0));
} }
static std::string getLFSeparatedListOfUserIds(const std::vector<UserID> &userIds)
{
if (userIds.empty()) {
return std::string();
}
std::vector<std::string> uids;
uids.reserve(userIds.size());
for (auto &userId : userIds) {
if (userId.id()) {
uids.push_back(std::string(userId.id()));
}
}
return getLFSeparatedListOfStrings(uids);
}
Error Context::revokeSignature(const Key &key, const Key &signingKey,
const std::vector<UserID> &userIds)
{
const unsigned int flags = userIds.size() > 1 ? GPGME_REVSIG_LFSEP : 0;
const std::string uids = getLFSeparatedListOfUserIds(userIds);
return Error(d->lasterr = gpgme_op_revsig(d->ctx,
key.impl(), signingKey.impl(), uids.c_str(), flags));
}
Error Context::startRevokeSignature(const Key &key, const Key &signingKey,
const std::vector<UserID> &userIds)
{
const unsigned int flags = userIds.size() > 1 ? GPGME_REVSIG_LFSEP : 0;
const std::string uids = getLFSeparatedListOfUserIds(userIds);
return Error(d->lasterr = gpgme_op_revsig_start(d->ctx,
key.impl(), signingKey.impl(), uids.c_str(), flags));
}
Error Context::setFlag(const char *name, const char *value) Error Context::setFlag(const char *name, const char *value)
{ {
return Error(d->lasterr = gpgme_set_ctx_flag(d->ctx, name, value)); return Error(d->lasterr = gpgme_set_ctx_flag(d->ctx, name, value));

View File

@ -285,6 +285,11 @@ public:
const std::vector<Subkey> &subkeys = std::vector<Subkey>(), const std::vector<Subkey> &subkeys = std::vector<Subkey>(),
const SetExpireFlags flags = SetExpireDefault); const SetExpireFlags flags = SetExpireDefault);
Error revokeSignature(const Key &key, const Key &signingKey,
const std::vector<UserID> &userIds = std::vector<UserID>());
Error startRevokeSignature(const Key &key, const Key &signingKey,
const std::vector<UserID> &userIds = std::vector<UserID>());
// using TofuInfo::Policy // using TofuInfo::Policy
Error setTofuPolicy(const Key &k, unsigned int policy); Error setTofuPolicy(const Key &k, unsigned int policy);
Error setTofuPolicyStart(const Key &k, unsigned int policy); Error setTofuPolicyStart(const Key &k, unsigned int policy);