cpp: Add convenience API to obtain remarks
* lang/cpp/src/key.h, lang/cpp/src/key.cpp (UserID::remark): New. -- A remark made by one key on another is a signature notation on a user id certification signature with the name "rem@gnupg.org". This helps with: GnuPG-Bug-Id: T4734
This commit is contained in:
parent
0224408c63
commit
83ecf1686a
@ -723,6 +723,56 @@ TofuInfo UserID::tofuInfo() const
|
|||||||
return TofuInfo(uid->tofu);
|
return TofuInfo(uid->tofu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gpgme_key_sig_t find_last_valid_sig_for_keyid (gpgme_user_id_t uid,
|
||||||
|
const char *keyid)
|
||||||
|
{
|
||||||
|
if (!keyid) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
gpgme_key_sig_t ret = NULL;
|
||||||
|
for (gpgme_key_sig_t s = uid->signatures ; s ; s = s->next) {
|
||||||
|
if (s->keyid && !strcmp(keyid, s->keyid)) {
|
||||||
|
if (!s->expired && !s->revoked && !s->invalid && !s->status) {
|
||||||
|
if (!ret) {
|
||||||
|
ret = s;
|
||||||
|
} else if (ret && ret->timestamp <= s->timestamp) {
|
||||||
|
/* Equals because when the timestamps are the same we prefer
|
||||||
|
the last in the list */
|
||||||
|
ret = s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *UserID::remark(const Key &remarker, Error &err) const
|
||||||
|
{
|
||||||
|
if (!uid || remarker.isNull()) {
|
||||||
|
err = Error::fromCode(GPG_ERR_GENERAL);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(parent().keyListMode() & GPGME_KEYLIST_MODE_SIG_NOTATIONS) ||
|
||||||
|
!(parent().keyListMode() & GPGME_KEYLIST_MODE_SIGS)) {
|
||||||
|
err = Error::fromCode(GPG_ERR_NO_DATA);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
gpgme_key_sig_t s = find_last_valid_sig_for_keyid(uid, remarker.keyID());
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (gpgme_sig_notation_t n = s->notations; n ; n = n->next) {
|
||||||
|
if (n->name && !strcmp(n->name, "rem@gnupg.org")) {
|
||||||
|
return n->value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// class Signature
|
// class Signature
|
||||||
|
@ -413,6 +413,23 @@ public:
|
|||||||
*
|
*
|
||||||
* @returns the last update time. */
|
* @returns the last update time. */
|
||||||
time_t lastUpdate() const;
|
time_t lastUpdate() const;
|
||||||
|
|
||||||
|
/*! Get a remark made by the key provided.
|
||||||
|
* A remark is a signature notation on
|
||||||
|
* this user id made by the key with the
|
||||||
|
* name "rem@gnupg.org". Returns an error if the
|
||||||
|
* parent key of this user id was not listed with the
|
||||||
|
* keylist mode flags for signatures and signature notations.
|
||||||
|
*
|
||||||
|
* @param key The key for which comments should be searched.
|
||||||
|
* @param error Set to GPG_ERR_NO_DATA if the keylist did
|
||||||
|
* not include signature notations.
|
||||||
|
*
|
||||||
|
* @returns The value of the comment or NULL if none exists.
|
||||||
|
**/
|
||||||
|
const char *remark(const Key &key,
|
||||||
|
Error &error) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
shared_gpgme_key_t key;
|
shared_gpgme_key_t key;
|
||||||
gpgme_user_id_t uid;
|
gpgme_user_id_t uid;
|
||||||
|
Loading…
Reference in New Issue
Block a user