* key.h (struct certsig_s): New. Use it in gpgme_key_s.
authorWerner Koch <wk@gnupg.org>
Wed, 14 Aug 2002 14:01:09 +0000 (14:01 +0000)
committerWerner Koch <wk@gnupg.org>
Wed, 14 Aug 2002 14:01:09 +0000 (14:01 +0000)
* key.c (gpgme_key_release): Release it. We need to add more code
of course.
(_gpgme_key_append_name): Use memset to intialize the struct.
* gpgme.h (GPGME_KEYLIST_MODE_SIGS): New.
* rungpg.c (_gpgme_gpg_op_keylist): Include sigs in listing depending
non the list mode.

* key.c (gpgme_key_get_string_attr): Use GPGME_ATTR_TYPE to return
information about the key type (PGP or X.509).
(gpgme_key_get_ulong_attr): Likewise.

* keylist.c (keylist_colon_handler): Include 1 in the check for
valid algorithms so that RSA is usable.  Store the issuer name and
serial number also for "crs" records.  Parse the expire date for
subkeys.
(set_userid_flags): Put them onto the last appended key.

gpgme/ChangeLog
gpgme/context.h
gpgme/gpgme.h
gpgme/key.c
gpgme/key.h
gpgme/keylist.c
gpgme/rungpg.c

index 8d565549ed7f6c2a3e160c6a60b9952735c5b13e..d80bdb74d18444d09044396922803309ca5ad3ea 100644 (file)
@@ -1,3 +1,23 @@
+2002-08-14  Werner Koch  <wk@gnupg.org>
+
+       * key.h (struct certsig_s): New.  Use it in gpgme_key_s.
+       * key.c (gpgme_key_release): Release it. We need to add more code
+       of course.
+       (_gpgme_key_append_name): Use memset to intialize the struct.
+       * gpgme.h (GPGME_KEYLIST_MODE_SIGS): New.
+       * rungpg.c (_gpgme_gpg_op_keylist): Include sigs in listing depending
+       non the list mode.
+       
+       * key.c (gpgme_key_get_string_attr): Use GPGME_ATTR_TYPE to return
+       information about the key type (PGP or X.509).
+       (gpgme_key_get_ulong_attr): Likewise.
+
+       * keylist.c (keylist_colon_handler): Include 1 in the check for
+       valid algorithms so that RSA is usable.  Store the issuer name and
+       serial number also for "crs" records.  Parse the expire date for
+       subkeys.
+       (set_userid_flags): Put them onto the last appended key.
+
 2002-07-29  Marcus Brinkmann  <marcus@g10code.de>
 
        * rungpg.c (_gpgme_gpg_op_edit): Use --with-colons.
index 3e68cbf4a51bb57f0af1b4521783a3abced1b715..dbafc6148a2197098951c02e458fa4746f8f0020 100644 (file)
@@ -130,11 +130,17 @@ struct gpgme_data_s {
     char *private_buffer;
 };
 
+/* Forward declaration of a structure to store certification
+   signatures. */
+struct certsig_s;
+
+/* Structure to store user IDs. */
 struct user_id_s {
     struct user_id_s *next;
     unsigned int revoked:1;
     unsigned int invalid:1;
     GpgmeValidity validity; 
+    struct certsig_s *certsigs;
     const char *name_part;    /* all 3 point into strings behind name */
     const char *email_part;   /* or to read-only strings */
     const char *comment_part;
index 0073c92da945088e9d23ee532114e2bd12c9f867..826375efbae03806fa65b6113d572946d85ae034 100644 (file)
@@ -302,14 +302,14 @@ typedef enum  {
     GPGME_STATUS_EXPSIG             ,
     GPGME_STATUS_EXPKEYSIG          ,
     GPGME_STATUS_TRUNCATED          ,
-    GPGME_STATUS_ERROR              ,
+    GPGME_STATUS_ERROR              
 } GpgmeStatusCode;
 
 
 /* The available keylist mode flags.  */
-#define GPGME_KEYLIST_MODE_LOCAL 1
+#define GPGME_KEYLIST_MODE_LOCAL  1
 #define GPGME_KEYLIST_MODE_EXTERN 2
-
+#define GPGME_KEYLIST_MODE_SIGS   4
 
 /* Types for callback functions.  */
 
index f65568d83545fa6141d5540324915b7705355a6e..a455f3f5ec27c761725e325306e5172089617676 100644 (file)
@@ -392,6 +392,7 @@ _gpgme_key_add_secret_subkey (GpgmeKey key)
 void
 gpgme_key_release (GpgmeKey key)
 {
+  struct certsig_s *c, *c2;
   struct user_id_s *u, *u2;
   struct subkey_s *k, *k2;
 
@@ -417,6 +418,11 @@ gpgme_key_release (GpgmeKey key)
   for (u = key->uids; u; u = u2)
     {
       u2 = u->next;
+      for (c = u->certsigs; c; c = c2)
+        {
+          c2 = c->next;
+          xfree (c);
+        }
       xfree (u);
     }
   xfree (key->issuer_serial);
@@ -580,16 +586,10 @@ _gpgme_key_append_name (GpgmeKey key, const char *s)
   /* We can malloc a buffer of the same length, because the converted
      string will never be larger. Actually we allocate it twice the
      size, so that we are able to store the parsed stuff there too.  */
-  uid = xtrymalloc ( sizeof *uid + 2*strlen (s)+3);
+  uid = xtrymalloc (sizeof *uid + 2*strlen (s)+3);
   if (!uid)
     return mk_error (Out_Of_Core);
-  uid->revoked = 0;
-  uid->invalid = 0;
-  uid->validity = 0;
-  uid->name_part = NULL;
-  uid->email_part = NULL;
-  uid->comment_part = NULL;
-  uid->next = NULL;
+  memset (uid, 0, sizeof *uid);
   d = uid->name;
 
   while (*s)
@@ -897,6 +897,9 @@ gpgme_key_get_string_attr (GpgmeKey key, GpgmeAttr what,
       if (k) 
        val = pkalgo_to_string (k->key_algo);
       break;
+    case GPGME_ATTR_TYPE:
+      val = key->x509? "X.509":"PGP";
+      break;
     case GPGME_ATTR_LEN:     
     case GPGME_ATTR_CREATED: 
     case GPGME_ATTR_EXPIRE:  
@@ -961,7 +964,6 @@ gpgme_key_get_string_attr (GpgmeKey key, GpgmeAttr what,
         }
       break;
     case GPGME_ATTR_LEVEL:
-    case GPGME_ATTR_TYPE:
     case GPGME_ATTR_KEY_REVOKED:
     case GPGME_ATTR_KEY_INVALID:
     case GPGME_ATTR_KEY_EXPIRED:
@@ -1047,6 +1049,9 @@ gpgme_key_get_ulong_attr (GpgmeKey key, GpgmeAttr what,
       if (k) 
        val = (unsigned long) k->key_len;
       break;
+    case GPGME_ATTR_TYPE:
+      val = key->x509? 1:0;
+      break;
     case GPGME_ATTR_CREATED: 
       for (k = &key->keys; k && idx; k = k->next, idx--)
        ;
@@ -1121,3 +1126,4 @@ gpgme_key_get_ulong_attr (GpgmeKey key, GpgmeAttr what,
     }
   return val;
 }
+
index e827217db1bb9945edc37e17bd3ea580dbd6a8f4..2c1114e06fd70f491670ced46433be1e592ce50a 100644 (file)
 #include "types.h"
 #include "context.h"
 
+struct certsig_s {
+  struct certsig_s *next;
+  struct {
+    unsigned int revoked:1 ;
+    unsigned int expired:1 ;
+    unsigned int invalid:1 ;
+  } flags;
+  char keyid[16+1]; 
+  time_t timestamp;  /* -1 for invalid, 0 for not available */
+  time_t expires_at; /* 0 for does not expires */
+};
+
 struct subkey_s {
   struct subkey_s *next;
   unsigned int secret:1;
index 27a04b8b1cda91f31fc8eb110c212d6b2db88ce7..d3dbbb52d39cd8d321333c00289d064d85f7d320 100644 (file)
@@ -149,18 +149,24 @@ set_mainkey_trust_info (GpgmeKey key, const char *s)
 static void
 set_userid_flags (GpgmeKey key, const char *s)
 {
+  struct user_id_s *u = key->uids;
+
+  assert (u);
+  while (u->next)
+    u = u->next;
+
   /* Look at letters and stop at the first digit.  */
   for (; *s && !my_isdigit (*s); s++)
     {
       switch (*s)
        {
-       case 'r': key->uids->revoked  = 1; break;
-       case 'i': key->uids->invalid  = 1; break;
+       case 'r': u->revoked  = 1; break;
+       case 'i': u->invalid  = 1; break;
 
-       case 'n': key->uids->validity = GPGME_VALIDITY_NEVER; break;
-       case 'm': key->uids->validity = GPGME_VALIDITY_MARGINAL; break;
-       case 'f': key->uids->validity = GPGME_VALIDITY_FULL; break;
-       case 'u': key->uids->validity = GPGME_VALIDITY_ULTIMATE; break;
+       case 'n': u->validity = GPGME_VALIDITY_NEVER; break;
+       case 'm': u->validity = GPGME_VALIDITY_MARGINAL; break;
+       case 'f': u->validity = GPGME_VALIDITY_FULL; break;
+       case 'u': u->validity = GPGME_VALIDITY_ULTIMATE; break;
         }
     }
 }
@@ -374,7 +380,7 @@ keylist_colon_handler (GpgmeCtx ctx, char *line)
                 break;
            case 4: /* pubkey algo */
              i = atoi (p);
-             if (i > 1 && i < 128)
+             if (i >= 1 && i < 128)
                key->keys.key_algo = i;
              break;
               case 5: /* long keyid */
@@ -388,7 +394,7 @@ keylist_colon_handler (GpgmeCtx ctx, char *line)
              key->keys.expires_at = parse_timestamp (p);
              break;
            case 8: /* X.509 serial number */
-              if (rectype == RT_CRT)
+              if (rectype == RT_CRT || rectype == RT_CRS)
                 {
                   key->issuer_serial = xtrystrdup (p);
                  if (!key->issuer_serial)
@@ -400,7 +406,7 @@ keylist_colon_handler (GpgmeCtx ctx, char *line)
              break;
            case 10: /* not used for gpg due to --fixed-list-mode option 
                        but gpgsm stores the issuer name */
-              if (rectype == RT_CRT)
+              if (rectype == RT_CRT || rectype == RT_CRS)
                 {
                   key->issuer_name = xtrystrdup (p);
                  if (!key->issuer_name)
@@ -431,7 +437,7 @@ keylist_colon_handler (GpgmeCtx ctx, char *line)
                 break;
               case 4: /* pubkey algo */
                 i = atoi (p);
-                if (i > 1 && i < 128)
+                if (i >= 1 && i < 128)
                  sk->key_algo = i;
                 break;
               case 5: /* long keyid */
@@ -442,6 +448,7 @@ keylist_colon_handler (GpgmeCtx ctx, char *line)
                 sk->timestamp = parse_timestamp (p);
                 break;
               case 7: /* expiration time (seconds) */
+                sk->expires_at = parse_timestamp (p);
                 break;
               case 8: /* reserved (LID) */
                 break;
@@ -473,7 +480,7 @@ keylist_colon_handler (GpgmeCtx ctx, char *line)
              else
                {
                  if (trust_info)
-                 set_userid_flags (key, trust_info);
+                    set_userid_flags (key, trust_info);
                }
              pend = NULL;  /* we can stop here */
              break;
index bf5e48b634ec92b5e23324feab8a824de66fe12c..68842ec4b765dedb3b888ff1efd228a691fc91cb 100644 (file)
@@ -1674,7 +1674,10 @@ _gpgme_gpg_op_keylist (GpgObject gpg, const char *pattern, int secret_only,
   if (!err)
     err = _gpgme_gpg_add_arg (gpg, "--with-fingerprint");
   if (!err)
-    err = _gpgme_gpg_add_arg (gpg, secret_only ? "--list-secret-keys"
+    err = _gpgme_gpg_add_arg (gpg, 
+                              (keylist_mode & GPGME_KEYLIST_MODE_SIGS)?
+                              "--check-sigs" :
+                              secret_only ? "--list-secret-keys"
                              : "--list-keys");
   
   /* Tell the gpg object about the data */