From aa03205fe5e8a8fa2b0feecb8a142aff2a1b25df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= Date: Tue, 4 Aug 2020 16:22:37 +0200 Subject: cpp: Add support for gpgme_op_setexpire * lang/cpp/src/context.cpp (Context::setExpire, Context::startSetExpire): New. (Context::getLFSeparatedListOfFingerprintsFromSubkeys): New helper. * lang/cpp/src/context.h (Context::SetExpireFlags): New enum. (Context::setExpire, Context::startSetExpire): Add prototypes. (Context::getLFSeparatedListOfFingerprintsFromSubkeys): Add as private helper. -- GnuPG-bug-id: 5003 --- lang/cpp/src/context.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'lang/cpp/src/context.cpp') diff --git a/lang/cpp/src/context.cpp b/lang/cpp/src/context.cpp index 2560a338..6b657f60 100644 --- a/lang/cpp/src/context.cpp +++ b/lang/cpp/src/context.cpp @@ -51,6 +51,7 @@ #include #include +#include #ifndef NDEBUG #include using std::cerr; @@ -1526,6 +1527,62 @@ Error Context::startCreateSubkey(const Key &k, const char *algo, k.impl(), algo, reserved, expires, flags)); } +std::string Context::getLFSeparatedListOfFingerprintsFromSubkeys(const std::vector &subkeys) +{ + if (subkeys.empty()) { + return std::string(); + } + + std::vector fprs; + fprs.reserve(subkeys.size()); + for (auto &it : subkeys) { + if (it.fingerprint()) { + fprs.push_back(std::string(it.fingerprint())); + } + } + + if (fprs.empty()) { + 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, + const std::vector &subkeys, + const Context::SetExpireFlags flags) +{ + std::string subfprs; + if (flags & Context::SetExpireAllSubkeys) { + subfprs = "*"; + } else { + subfprs = getLFSeparatedListOfFingerprintsFromSubkeys(subkeys); + } + return Error(d->lasterr = gpgme_op_setexpire(d->ctx, + k.impl(), expires, subfprs.c_str(), 0)); +} + +Error Context::startSetExpire(const Key &k, unsigned long expires, + const std::vector &subkeys, + const Context::SetExpireFlags flags) +{ + std::string subfprs; + if (flags & Context::SetExpireAllSubkeys) { + subfprs = "*"; + } else { + subfprs = getLFSeparatedListOfFingerprintsFromSubkeys(subkeys); + } + return Error(d->lasterr = gpgme_op_setexpire_start(d->ctx, + k.impl(), expires, subfprs.c_str(), 0)); +} + Error Context::setFlag(const char *name, const char *value) { return Error(d->lasterr = gpgme_set_ctx_flag(d->ctx, name, value)); -- cgit v1.2.3