Fix for bug 537
[gnupg.git] / g10 / keylist.c
index 610a839..95d452e 100644 (file)
@@ -1,4 +1,4 @@
-/* keylist.c
+/* keylist.c - print keys
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
  *               2004, 2005 Free Software Foundation, Inc.
  *
 #include <errno.h>
 #include <assert.h>
 
+#include "gpg.h"
 #include "options.h"
 #include "packet.h"
 #include "errors.h"
 #include "keydb.h"
-#include "memory.h"
 #include "photoid.h"
 #include "util.h"
 #include "ttyio.h"
@@ -41,7 +41,7 @@
 #include "status.h"
 
 static void list_all(int);
-static void list_one( STRLIST names, int secret);
+static void list_one( strlist_t names, int secret);
 static void print_card_serialno (PKT_secret_key *sk);
 
 struct sig_stats
@@ -58,7 +58,7 @@ static FILE *attrib_fp=NULL;
  * If list is NULL, all available keys are listed
  */
 void
-public_key_list( STRLIST list )
+public_key_list( strlist_t list )
 {
   if(opt.with_colons)
     {
@@ -110,7 +110,7 @@ public_key_list( STRLIST list )
 }
 
 void
-secret_key_list( STRLIST list )
+secret_key_list( strlist_t list )
 {
     check_trustdb_stale ();
 
@@ -249,7 +249,7 @@ show_policy_url(PKT_signature *sig,int indent,int mode)
   const byte *p;
   size_t len;
   int seq=0,crit;
-  FILE *fp=mode?log_stream():stdout;
+  FILE *fp=mode?log_get_stream():stdout;
 
   while((p=enum_sig_subpkt(sig->hashed,SIGSUBPKT_POLICY,&len,&seq,&crit)))
     {
@@ -290,7 +290,7 @@ show_keyserver_url(PKT_signature *sig,int indent,int mode)
   const byte *p;
   size_t len;
   int seq=0,crit;
-  FILE *fp=mode?log_stream():stdout;
+  FILE *fp=mode?log_get_stream():stdout;
 
   while((p=enum_sig_subpkt(sig->hashed,SIGSUBPKT_PREF_KS,&len,&seq,&crit)))
     {
@@ -332,71 +332,55 @@ show_keyserver_url(PKT_signature *sig,int indent,int mode)
 void
 show_notation(PKT_signature *sig,int indent,int mode,int which)
 {
-  const byte *p;
-  size_t len;
-  int seq=0,crit;
-  FILE *fp=mode?log_stream():stdout;
+  FILE *fp=mode?log_get_stream():stdout;
+  struct notation *nd,*notations;
 
   if(which==0)
     which=3;
 
-  /* There may be multiple notations in the same sig. */
-
-  while((p=enum_sig_subpkt(sig->hashed,SIGSUBPKT_NOTATION,&len,&seq,&crit)))
-    if(len>=8)
-      {
-       int n1,n2;
+  notations=sig_to_notation(sig);
 
-       n1=(p[4]<<8)|p[5];
-       n2=(p[6]<<8)|p[7];
-
-       if(8+n1+n2!=len)
-         {
-           log_info(_("WARNING: invalid notation data found\n"));
-           continue;
-         }
-
-       if(mode!=2)
-         {
-           int has_at=!!memchr(p+8,'@',n1);
+  /* There may be multiple notations in the same sig. */
+  for(nd=notations;nd;nd=nd->next)
+    {
+      if(mode!=2)
+       {
+         int has_at=!!strchr(nd->name,'@');
+
+         if((which&1 && !has_at) || (which&2 && has_at))
+           {
+             int i;
+             const char *str;
+
+             for(i=0;i<indent;i++)
+               putchar(' ');
+
+             if(nd->flags.critical)
+               str=_("Critical signature notation: ");
+             else
+               str=_("Signature notation: ");
+             if(mode)
+               log_info("%s",str);
+             else
+               printf("%s",str);
+             /* This is all UTF8 */
+             print_utf8_string(fp,nd->name,strlen(nd->name));
+             fprintf(fp,"=");
+             print_utf8_string(fp,nd->value,strlen(nd->value));
+             fprintf(fp,"\n");
+           }
+       }
 
-           if((which&1 && !has_at) || (which&2 && has_at))
-             {
-               int i;
-               const char *str;
-
-               for(i=0;i<indent;i++)
-                 putchar(' ');
-
-               /* This is UTF8 */
-               if(crit)
-                 str=_("Critical signature notation: ");
-               else
-                 str=_("Signature notation: ");
-               if(mode)
-                 log_info("%s",str);
-               else
-                 printf("%s",str);
-               print_utf8_string(fp,p+8,n1);
-               fprintf(fp,"=");
-
-               if(*p&0x80)
-                 print_utf8_string(fp,p+8+n1,n2);
-               else
-                 fprintf(fp,"[ %s ]",_("not human readable"));
-
-               fprintf(fp,"\n");
-             }
-         }
+      if(mode)
+       {
+         write_status_buffer(STATUS_NOTATION_NAME,
+                             nd->name,strlen(nd->name),0);
+         write_status_buffer(STATUS_NOTATION_DATA,
+                             nd->value,strlen(nd->value),50);
+       }
+    }
 
-       if(mode)
-         {
-           write_status_buffer ( STATUS_NOTATION_NAME, p+8   , n1, 0 );
-           write_status_buffer ( STATUS_NOTATION_DATA, p+8+n1, n2, 50 );
-         }
-      }
-  else
-    log_info(_("WARNING: invalid notation data found\n"));
+  free_notation(notations);
 }
 
 static void
@@ -478,7 +462,7 @@ list_all( int secret )
 
 
 static void
-list_one( STRLIST names, int secret )
+list_one( strlist_t names, int secret )
 {
     int rc = 0;
     KBNODE keyblock = NULL;
@@ -931,12 +915,13 @@ list_keyblock_print ( KBNODE keyblock, int secret, int fpr, void *opaque )
            if( stats ) {
                 /*fflush(stdout);*/
                rc = check_key_signature( keyblock, node, NULL );
-               switch( rc ) {
-                case 0:                 sigrc = '!'; break;
-                case G10ERR_BAD_SIGN:   stats->inv_sigs++; sigrc = '-'; break;
-                case G10ERR_NO_PUBKEY: 
-                case G10ERR_UNU_PUBKEY: stats->no_key++; continue;
-                default:                stats->oth_err++; sigrc = '%'; break;
+               switch( gpg_err_code (rc) ) {
+                case 0:                sigrc = '!'; break;
+                case GPG_ERR_BAD_SIGNATURE:
+                   stats->inv_sigs++; sigrc = '-'; break;
+                case GPG_ERR_NO_PUBKEY: 
+                case GPG_ERR_UNUSABLE_PUBKEY: stats->no_key++; continue;
+                default:               stats->oth_err++; sigrc = '%'; break;
                }
 
                /* TODO: Make sure a cached sig record here still has
@@ -1009,6 +994,29 @@ list_keyblock_print ( KBNODE keyblock, int secret, int fpr, void *opaque )
     putchar('\n');
 }
 
+void
+print_revokers(PKT_public_key *pk)
+{
+  /* print the revoker record */
+  if( !pk->revkey && pk->numrevkeys )
+    BUG();
+  else
+    {
+      int i,j;
+
+      for (i=0; i < pk->numrevkeys; i++)
+       {
+         byte *p;
+
+         printf ("rvk:::%d::::::", pk->revkey[i].algid);
+         p = pk->revkey[i].fpr;
+         for (j=0; j < 20; j++, p++ )
+           printf ("%02X", *p);
+         printf (":%02x%s:\n", pk->revkey[i].class,
+                 (pk->revkey[i].class&0x40)?"s":"");
+       }
+    }
+}
 
 static void
 list_keyblock_colon( KBNODE keyblock, int secret, int fpr )
@@ -1073,7 +1081,7 @@ list_keyblock_colon( KBNODE keyblock, int secret, int fpr )
             putchar( get_ownertrust_info(pk) );
            putchar(':');
     }
-    
+
     if (opt.fixed_list_mode) {
         /* do not merge the first uid with the primary key */
         putchar(':');
@@ -1094,6 +1102,8 @@ list_keyblock_colon( KBNODE keyblock, int secret, int fpr )
           putchar(':'); /* End of field 15. */
         }
         putchar('\n');
+       if(pk)
+         print_revokers(pk);
         if( fpr )
             print_fingerprint( pk, sk, 0 );
         if( opt.with_key_data )
@@ -1101,7 +1111,6 @@ list_keyblock_colon( KBNODE keyblock, int secret, int fpr )
         any = 1;
     }
 
-
     for( kbctx=NULL; (node=walk_kbnode( keyblock, &kbctx, 0)) ; ) {
        if( node->pkt->pkttype == PKT_USER_ID && !opt.fast_list_mode ) {
            PKT_user_id *uid=node->pkt->pkt.user_id;
@@ -1297,12 +1306,12 @@ list_keyblock_colon( KBNODE keyblock, int secret, int fpr )
 
                rc = check_key_signature2( keyblock, node, NULL, signer_pk,
                                           NULL, NULL, NULL );
-               switch( rc ) {
-                 case 0:                  sigrc = '!'; break;
-                 case G10ERR_BAD_SIGN:    sigrc = '-'; break;
-                 case G10ERR_NO_PUBKEY: 
-                 case G10ERR_UNU_PUBKEY:  sigrc = '?'; break;
-                 default:                 sigrc = '%'; break;
+               switch ( gpg_err_code (rc) ) {
+                 case 0:                       sigrc = '!'; break;
+                 case GPG_ERR_BAD_SIGNATURE:   sigrc = '-'; break;
+                 case GPG_ERR_NO_PUBKEY: 
+                 case GPG_ERR_UNUSABLE_PUBKEY: sigrc = '?'; break;
+                 default:                      sigrc = '%'; break;
                }
 
                if(opt.no_sig_cache)
@@ -1492,7 +1501,7 @@ print_fingerprint (PKT_public_key *pk, PKT_secret_key *sk, int mode )
       }
 
     if (mode == 1) {
-        fp = log_stream ();
+        fp = log_get_stream ();
        if(primary)
          text = _("Primary key fingerprint:");
        else