aboutsummaryrefslogtreecommitdiffstats
path: root/lang/cpp/src/verificationresult.cpp
diff options
context:
space:
mode:
authorAndre Heinecke <[email protected]>2016-10-10 15:38:43 +0000
committerAndre Heinecke <[email protected]>2016-10-10 15:38:43 +0000
commitb6b820bff14a9aa8fa67755b246c90062ffdba14 (patch)
tree6eaf3d66600389c3383b6daf682205166fbbce69 /lang/cpp/src/verificationresult.cpp
parentcpp: Return null key if the signature had no key (diff)
downloadgpgme-b6b820bff14a9aa8fa67755b246c90062ffdba14.tar.gz
gpgme-b6b820bff14a9aa8fa67755b246c90062ffdba14.zip
Add convenience function to get key from sig
* lang/cpp/src/verificationresult.cpp (Signature::key(bool, bool)): New. Can be used to search / update the key associcated with this signature. -- By using update a caller can ensure that an incomplete key obtainable through the new key() function is fully loaded. With search the key can be looked up in the internal keyring. As the results are cached this can be done in the crypto thread and the result then better used in the UI thread.
Diffstat (limited to '')
-rw-r--r--lang/cpp/src/verificationresult.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/lang/cpp/src/verificationresult.cpp b/lang/cpp/src/verificationresult.cpp
index a7b073e6..23c458e1 100644
--- a/lang/cpp/src/verificationresult.cpp
+++ b/lang/cpp/src/verificationresult.cpp
@@ -29,6 +29,7 @@
#include "result_p.h"
#include "util.h"
#include "key.h"
+#include "context.h"
#include <gpgme.h>
@@ -121,6 +122,7 @@ public:
std::vector<GpgME::Key> keys;
std::vector<char *> purls;
std::string file_name;
+ Protocol proto;
};
GpgME::VerificationResult::VerificationResult(gpgme_ctx_t ctx, int error)
@@ -145,6 +147,10 @@ void GpgME::VerificationResult::init(gpgme_ctx_t ctx)
return;
}
d.reset(new Private(res));
+ gpgme_protocol_t proto = gpgme_get_protocol(ctx);
+ d->proto = proto == GPGME_PROTOCOL_OpenPGP ? OpenPGP :
+ proto == GPGME_PROTOCOL_CMS ? CMS :
+ UnknownProtocol;
}
make_standard_stuff(VerificationResult)
@@ -386,6 +392,32 @@ GpgME::Key GpgME::Signature::key() const
return d->keys[idx];
}
+GpgME::Key GpgME::Signature::key(bool search, bool update) const
+{
+ if (isNull()) {
+ return Key();
+ }
+
+ GpgME::Key ret = key();
+ if (ret.isNull() && search) {
+ auto ctx = Context::createForProtocol (d->proto);
+ if (ctx) {
+ ctx->setKeyListMode(KeyListMode::Local |
+ KeyListMode::Signatures |
+ KeyListMode::SignatureNotations |
+ KeyListMode::Validate |
+ KeyListMode::WithTofu);
+ Error e;
+ ret = d->keys[idx] = ctx->key(fingerprint(), e, false);
+ delete ctx;
+ }
+ }
+ if (update) {
+ ret.update();
+ }
+ return ret;
+}
+
class GpgME::Notation::Private
{
public: