diff options
author | Jeffrey Stedfast <jestedfa@microsoft.com> | 2020-03-09 18:49:52 -0400 |
---|---|---|
committer | Jeffrey Stedfast <jestedfa@microsoft.com> | 2020-03-09 18:49:52 -0400 |
commit | 96f23da05a4df623e4eefacc925801e0a1738d58 (patch) | |
tree | f772b3ac92f32a24c520318d588ca30d321a17f3 | |
parent | 0f6a7d86935a2b5b4c7bf1be00d4cded9c768c0e (diff) | |
download | gmime-96f23da05a4df623e4eefacc925801e0a1738d58.tar.gz |
Fixed logic to select correct gpg subkey for signing/encrypting
Some keys may have multiple subkeys that can be used for signing
or encrypting. Just because one of them may have expired or may
be revoked doesn't mean they all are. Keep looking to see if
another subkey can be used insead.
Fixes issue #88
-rw-r--r-- | gmime/gmime-gpgme-utils.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/gmime/gmime-gpgme-utils.c b/gmime/gmime-gpgme-utils.c index b86a1011..041dd020 100644 --- a/gmime/gmime-gpgme-utils.c +++ b/gmime/gmime-gpgme-utils.c @@ -129,18 +129,25 @@ g_mime_gpgme_get_key_by_name (gpgme_ctx_t ctx, const char *name, gboolean secret if (KEY_IS_OK (key)) { subkey = key->subkeys; - while (subkey && ((secret && !subkey->can_sign) || (!secret && !subkey->can_encrypt))) - subkey = subkey->next; - - if (subkey) { - if (KEY_IS_OK (subkey) && (subkey->expires == 0 || subkey->expires > now)) - break; + while (subkey) { + if ((secret && subkey->can_sign) || (!secret && subkey->can_encrypt)) { + if (KEY_IS_OK (subkey) && (subkey->expires == 0 || subkey->expires > now)) { + errval = GPG_ERR_NO_ERROR; + break; + } + + if (subkey->expired) + errval = GPG_ERR_KEY_EXPIRED; + } - if (subkey->expired) - errval = GPG_ERR_KEY_EXPIRED; - else - errval = GPG_ERR_BAD_KEY; + subkey = subkey->next; } + + if (subkey) + break; + + if (errval == GPG_ERR_NO_ERROR) + errval = GPG_ERR_BAD_KEY; } else { if (key->expired) errval = GPG_ERR_KEY_EXPIRED; |