[gmime] Fixed logic to select correct gpg subkey for signing/encrypting



commit 96f23da05a4df623e4eefacc925801e0a1738d58
Author: Jeffrey Stedfast <jestedfa microsoft com>
Date:   Mon Mar 9 18:49:52 2020 -0400

    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

 gmime/gmime-gpgme-utils.c | 27 +++++++++++++++++----------
 1 file 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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]