Give access to key capabilities
authorWerner Koch <wk@gnupg.org>
Thu, 15 Mar 2001 13:09:41 +0000 (13:09 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 15 Mar 2001 13:09:41 +0000 (13:09 +0000)
gpgme/ChangeLog
gpgme/gpgme.h
gpgme/key.c
gpgme/key.h
gpgme/keylist.c
gpgme/posix-util.c
gpgme/rungpg.c
tests/t-keylist.c

index 9f1f83ba5f7ceb324fe0c90d275582c587d29724..45607f9e61954846f6b25b3a9149df95a2876e31 100644 (file)
@@ -1,3 +1,20 @@
+2001-03-15  Werner Koch  <wk@gnupg.org>
+
+       * rungpg.c: Included time.h.
+
+       * key.h: New keyflags for capabilities.
+       * keylist.c (set_mainkey_capability, set_subkey_capability): New.
+       (keylist_colon_handler): Parse them.
+       * gpgme.h: New attribute values for capabilties.
+       * key.c (gpgme_key_get_string_attr): Return them.
+       (capabilities_to_string): New.
+       (gpgme_key_get_ulong_attr): Return the global caps.
+
+2001-03-14  Werner Koch  <wk@gnupg.org>
+
+       * w32-io.c (destroy_reader,destroy_writer): Fixed syntax error. 
+       Thanks to Jan Oliver Wagner.
+
 2001-03-13  Werner Koch  <wk@gnupg.org>
 
        * context.h: Add invalid and revoke flags to user_id structure.
index 562af198de3a5ee1bfecc1c22c97d5142025e1bb..f1744f02a9f68f4c0547a7004233dba54fc080bf 100644 (file)
@@ -133,7 +133,11 @@ typedef enum {
     GPGME_ATTR_KEY_REVOKED = 16,
     GPGME_ATTR_KEY_INVALID = 17,
     GPGME_ATTR_UID_REVOKED = 18,
-    GPGME_ATTR_UID_INVALID = 19
+    GPGME_ATTR_UID_INVALID = 19,
+    GPGME_ATTR_KEY_CAPS    = 20,
+    GPGME_ATTR_CAN_ENCRYPT = 21,
+    GPGME_ATTR_CAN_SIGN    = 22,
+    GPGME_ATTR_CAN_CERTIFY = 23
 } GpgmeAttr;
 
 typedef enum {
index 35a54043872c3ac11a5ec7244f6d3ca9f8b06608..6f8f03b6b953455b4e56db49bf0f883dfcee0976 100644 (file)
@@ -455,6 +455,24 @@ gpgme_key_get_as_xml ( GpgmeKey key )
 }
 
 
+static const char *
+capabilities_to_string (struct subkey_s *k)
+{
+    static char *strings[8] = {
+        "",
+        "c",
+        "s",
+        "sc",
+        "e",
+        "ec",
+        "es",
+        "esc"
+    };
+    return strings[  (!!k->flags.can_encrypt << 2)
+                   | (!!k->flags.can_sign    << 1)
+                   | (!!k->flags.can_certify     ) ];
+}
+
 const char *
 gpgme_key_get_string_attr ( GpgmeKey key, GpgmeAttr what,
                             const void *reserved, int idx )
@@ -536,11 +554,20 @@ gpgme_key_get_string_attr ( GpgmeKey key, GpgmeAttr what,
       case GPGME_ATTR_KEY_INVALID:
       case GPGME_ATTR_UID_REVOKED:
       case GPGME_ATTR_UID_INVALID:
+      case GPGME_ATTR_CAN_ENCRYPT:
+      case GPGME_ATTR_CAN_SIGN:
+      case GPGME_ATTR_CAN_CERTIFY:
         break;
       case GPGME_ATTR_IS_SECRET:
         if (key->secret)
             val = "1";
         break;
+      case GPGME_ATTR_KEY_CAPS:    
+        for (k=&key->keys; k && idx; k=k->next, idx-- )
+            ;
+        if (k) 
+            val = capabilities_to_string (k);
+        break;
     }
     return val;
 }
@@ -613,6 +640,15 @@ gpgme_key_get_ulong_attr ( GpgmeKey key, GpgmeAttr what,
         if (u)
             val = u->invalid;
         break;
+      case GPGME_ATTR_CAN_ENCRYPT:
+        val = key->gloflags.can_encrypt;
+        break;
+      case GPGME_ATTR_CAN_SIGN:
+        val = key->gloflags.can_sign;
+        break;
+      case GPGME_ATTR_CAN_CERTIFY:
+        val = key->gloflags.can_encrypt;
+        break;
       default:
         break;
     }
index 83d46ed257b07ecad1a79957ebfd6415ab051134..5e9d4c6d3f94ab25dd9dd47d123836554c6e3ace 100644 (file)
@@ -33,6 +33,9 @@ struct subkey_s {
         unsigned int expired:1 ;
         unsigned int disabled:1 ;
         unsigned int invalid:1 ;
+        unsigned int can_encrypt:1;
+        unsigned int can_sign:1;
+        unsigned int can_certify:1;
     } flags;
     unsigned int key_algo;
     unsigned int key_len;
@@ -47,6 +50,9 @@ struct gpgme_key_s {
         unsigned int expired:1 ;
         unsigned int disabled:1 ;
         unsigned int invalid:1 ;
+        unsigned int can_encrypt:1;
+        unsigned int can_sign:1;
+        unsigned int can_certify:1;
     } gloflags; 
     unsigned int ref_count;
     unsigned int secret:1;
index a42cde85f0f01fc085108caadd2dab7ffa65ba8c..19eaa2a36237c2e7901b86a05b66cb6ce8f3f7d6 100644 (file)
@@ -135,6 +135,34 @@ set_subkey_trust_info ( struct subkey_s *k, const char *s )
     }
 }
 
+static void
+set_mainkey_capability ( GpgmeKey key, const char *s )
+{
+    for (; *s ; s++ ) {
+        switch (*s) {
+          case 'e': key->keys.flags.can_encrypt = 1; break;
+          case 's': key->keys.flags.can_sign = 1; break;
+          case 'c': key->keys.flags.can_certify = 1; break;
+          case 'E': key->gloflags.can_encrypt = 1; break;
+          case 'S': key->gloflags.can_sign = 1; break;
+          case 'C': key->gloflags.can_certify = 1; break;
+        }
+    }
+}
+
+static void
+set_subkey_capability ( struct subkey_s *k, const char *s )
+{
+    for (; *s; s++ ) {
+        switch (*s) {
+          case 'e': k->flags.can_encrypt = 1; break;
+          case 's': k->flags.can_sign = 1; break;
+          case 'c': k->flags.can_certify = 1; break;
+        }
+    }
+}
+
+
 
 /* Note: we are allowed to modify line */
 static void
@@ -245,9 +273,12 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
                 break;
               case 10: /* not used due to --fixed-list-mode option */
                 break;
-              case 11:  /* signature class  */
+              case 11: /* signature class  */
                 break;
-              case 12:
+              case 12: /* capabilities */
+                set_mainkey_capability (key, p );
+                break;
+              case 13:
                 pend = NULL;  /* we can stop here */
                 break;
             }
@@ -284,7 +315,10 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
                 break;
               case 11:  /* signature class  */
                 break;
-              case 12:
+              case 12: /* capability */
+                set_subkey_capability ( sk, p );
+                break;
+              case 13:
                 pend = NULL;  /* we can stop here */
                 break;
             }
index 3c0c692aefa123413b169850262114e3ef9ed2c6..38fb2f032490261dae5b1912b8e504522b188cc6 100644 (file)
@@ -33,6 +33,9 @@
 const char *
 _gpgme_get_gpg_path (void)
 {
+    /*   #warning Forced to development version
+    return "/home/wk/work/gnupg-stable/g10/gpg";
+    */
     return GPG_PATH;
 }
 
index 404f7feccadffae0d2ecf10bf88660ea22effefe..bed8aaca27490425832d03256551730a8ea8f67c 100644 (file)
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <assert.h>
 #include <errno.h>
+#include <time.h>
 #include <sys/time.h>
 #include <sys/types.h>
 #include <signal.h>
index fb7b79d530599872c17003ecbe3cf308809f9d97..317990c6b03beaf0e4b2901e6b4fc89a4a3636c7 100644 (file)
@@ -54,10 +54,17 @@ doit ( GpgmeCtx ctx, const char *pattern )
         else
             fputs("<!-- Ooops: gpgme_key_get_as_xml failed -->\n", stdout );
 
-        s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID, NULL, 0 );
-        printf ("<!-- keyid=%s -->\n", s );
-        s = gpgme_key_get_string_attr (key, GPGME_ATTR_ALGO, NULL, 0 );
-        printf ("<!-- algo=%s -->\n", s );
+        
+        for (i=0; ; i++ ) {
+            s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID, NULL, i );
+            if (!s)
+                break;
+            printf ("<!-- keyid.%d=%s -->\n", i, s );
+            s = gpgme_key_get_string_attr (key, GPGME_ATTR_ALGO, NULL, i );
+            printf ("<!-- algo.%d=%s -->\n", i, s );
+            s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEY_CAPS, NULL, i );
+            printf ("<!-- caps.%d=%s -->\n", i, s );
+        }
         for (i=0; ; i++ ) {
             s = gpgme_key_get_string_attr (key, GPGME_ATTR_NAME, NULL, i );
             if (!s)
@@ -68,6 +75,15 @@ doit ( GpgmeCtx ctx, const char *pattern )
             s = gpgme_key_get_string_attr (key, GPGME_ATTR_COMMENT, NULL, i );
             printf ("<!-- comment.%d=%s -->\n", i, s );
         }
+        
+        fputs ("<!-- usable for:", stdout );
+        if ( gpgme_key_get_ulong_attr (key, GPGME_ATTR_CAN_ENCRYPT, NULL, 0 ))
+            fputs (" encryption", stdout);
+        if ( gpgme_key_get_ulong_attr (key, GPGME_ATTR_CAN_SIGN, NULL, 0 ))
+            fputs (" signing", stdout);
+        if ( gpgme_key_get_ulong_attr (key, GPGME_ATTR_CAN_CERTIFY, NULL, 0 ))
+            fputs (" certification", stdout);
+        fputs (" -->\n", stdout );
 
         printf ("<!-- End key object (%p) -->\n", key );
         gpgme_key_release (key);
@@ -97,6 +113,7 @@ main (int argc, char **argv )
 
     err = gpgme_new (&ctx);
     fail_if_err (err);
+    gpgme_set_keylist_mode (ctx, 1); /* no validity calculation */
     do {
         fprintf (stderr, "** pattern=`%s'\n", pattern );
         doit ( ctx, pattern );