diff options
author | Ingo Klöcker <[email protected]> | 2020-08-04 14:22:37 +0000 |
---|---|---|
committer | Ingo Klöcker <[email protected]> | 2020-08-04 14:53:29 +0000 |
commit | aa03205fe5e8a8fa2b0feecb8a142aff2a1b25df (patch) | |
tree | 7796f204a9d1f22925fd05431cab41519bc2893c /lang/cpp/src | |
parent | cpp: Add ostream operator for subkey (diff) | |
download | gpgme-aa03205fe5e8a8fa2b0feecb8a142aff2a1b25df.tar.gz gpgme-aa03205fe5e8a8fa2b0feecb8a142aff2a1b25df.zip |
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
Diffstat (limited to 'lang/cpp/src')
-rw-r--r-- | lang/cpp/src/context.cpp | 57 | ||||
-rw-r--r-- | lang/cpp/src/context.h | 16 |
2 files changed, 72 insertions, 1 deletions
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 <gpgme.h> #include <istream> +#include <numeric> #ifndef NDEBUG #include <iostream> 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<Subkey> &subkeys) +{ + if (subkeys.empty()) { + return std::string(); + } + + std::vector<std::string> 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<Subkey> &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<Subkey> &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)); diff --git a/lang/cpp/src/context.h b/lang/cpp/src/context.h index 70f1c429..ebf5adb2 100644 --- a/lang/cpp/src/context.h +++ b/lang/cpp/src/context.h @@ -27,6 +27,7 @@ #include "global.h" #include "error.h" +#include "key.h" #include "verificationresult.h" // for Signature::Notation #include <memory> @@ -37,7 +38,6 @@ namespace GpgME { -class Key; class Data; class TrustItem; class ProgressProvider; @@ -273,6 +273,18 @@ public: unsigned long expires = 0, unsigned int flags = 0); + enum SetExpireFlags { + SetExpireDefault = 0, + SetExpireAllSubkeys = 1 + }; + + Error setExpire(const Key &k, unsigned long expires, + const std::vector<Subkey> &subkeys = std::vector<Subkey>(), + const SetExpireFlags flags = SetExpireDefault); + Error startSetExpire(const Key &k, unsigned long expires, + const std::vector<Subkey> &subkeys = std::vector<Subkey>(), + const SetExpireFlags flags = SetExpireDefault); + // using TofuInfo::Policy Error setTofuPolicy(const Key &k, unsigned int policy); Error setTofuPolicyStart(const Key &k, unsigned int policy); @@ -488,6 +500,8 @@ private: // on the "Friendlyness" of context to access the gpgme types. gpgme_key_t *getKeysFromRecipients(const std::vector<Key> &recipients); + std::string getLFSeparatedListOfFingerprintsFromSubkeys(const std::vector<Subkey> &subkeys); + private: Private *const d; |