Fixes pertaining to revocation creation with subkey-only exported card keys
[gnupg.git] / g10 / pkclist.c
index 359a3de..6558f0d 100644 (file)
@@ -16,7 +16,8 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
  */
 
 #include <config.h>
@@ -190,7 +191,18 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
 
   keyid_from_pk (pk, keyid);
   for(;;) {
-    /* a string with valid answers */
+    /* A string with valid answers.
+
+       Note to translators: These are the allowed answers in lower and
+       uppercase.  Below you will find the matching strings which
+       should be translated accordingly and the letter changed to
+       match the one in the answer string.
+    
+         i = please show me more information
+         m = back to the main menu
+         s = skip this key
+        q = quit
+    */
     const char *ans = _("iImMqQsS");
 
     if( !did_help ) 
@@ -205,7 +217,7 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
                        keystr(keyid), datestr_from_pk( pk ) );
            p=get_user_id_native(keyid);
            tty_printf(_("      \"%s\"\n"),p);
-           m_free(p);
+           xfree(p);
 
             keyblock = get_pubkeyblock (keyid);
             if (!keyblock)
@@ -238,31 +250,43 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
             tty_printf("\n");
            release_kbnode (keyblock);
           }
-       /* This string also used in keyedit.c:sign_uids */
-        tty_printf (_(
-                     "Please decide how far you trust this user to correctly\n"
-                     "verify other users' keys (by looking at passports,\n"
-                     "checking fingerprints from different sources...)?\n\n"));
+
+       if(opt.trust_model==TM_DIRECT)
+         {
+           tty_printf(_("How much do you trust that this key actually "
+                        "belongs to the named user?\n"));
+           tty_printf("\n");
+         }
+       else
+         {
+           /* This string also used in keyedit.c:trustsig_prompt */
+           tty_printf(_("Please decide how far you trust this user to"
+                        " correctly verify other users' keys\n"
+                        "(by looking at passports, checking fingerprints from"
+                        " different sources, etc.)\n"));
+           tty_printf("\n");
+         }
+
        if(min_num<=1)
-         tty_printf (_(" %d = I don't know or won't say\n"), 1);
+         tty_printf (_("  %d = I don't know or won't say\n"), 1);
        if(min_num<=2)
-         tty_printf (_(" %d = I do NOT trust\n"), 2);
+         tty_printf (_("  %d = I do NOT trust\n"), 2);
        if(min_num<=3)
-         tty_printf (_(" %d = I trust marginally\n"), 3);
+         tty_printf (_("  %d = I trust marginally\n"), 3);
        if(min_num<=4)
-         tty_printf (_(" %d = I trust fully\n"), 4);
+         tty_printf (_("  %d = I trust fully\n"), 4);
         if (mode)
-          tty_printf (_(" %d = I trust ultimately\n"), 5);
+          tty_printf (_("  %d = I trust ultimately\n"), 5);
 #if 0
        /* not yet implemented */
-        tty_printf (_(" i = please show me more information\n") );
+        tty_printf ("  i = please show me more information\n");
 #endif
         if( mode )
-          tty_printf(_(" m = back to the main menu\n"));
+          tty_printf(_("  m = back to the main menu\n"));
         else
          {
-           tty_printf(_(" s = skip this key\n"));
-           tty_printf(_(" q = quit\n"));
+           tty_printf(_("  s = skip this key\n"));
+           tty_printf(_("  q = quit\n"));
          }
         tty_printf("\n");
        if(minimum)
@@ -325,9 +349,9 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
         quit = 1;
         break ; /* back to the menu */
       }
-    m_free(p); p = NULL;
+    xfree(p); p = NULL;
   }
-  m_free(p);
+  xfree(p);
   return show? -2: quit? -1 : changed;
 }
 
@@ -460,7 +484,7 @@ do_we_trust_pre( PKT_public_key *pk, unsigned int trustlevel )
 int
 check_signatures_trust( PKT_signature *sig )
 {
-  PKT_public_key *pk = m_alloc_clear( sizeof *pk );
+  PKT_public_key *pk = xmalloc_clear( sizeof *pk );
   unsigned int trustlevel;
   int rc=0;
 
@@ -495,7 +519,7 @@ check_signatures_trust( PKT_signature *sig )
                   " designated revoker!\n"));
       else
        log_info(_("WARNING: This key has been revoked by its owner!\n"));
-      log_info(_("         This could mean that the signature is forgery.\n"));
+      log_info(_("         This could mean that the signature is forged.\n"));
       show_revocation_reason( pk, 0 );
     }
   else if ((trustlevel & TRUST_FLAG_SUB_REVOKED) ) 
@@ -508,6 +532,55 @@ check_signatures_trust( PKT_signature *sig )
   if ((trustlevel & TRUST_FLAG_DISABLED))
     log_info (_("Note: This key has been disabled.\n"));
 
+  /* If we have PKA information adjust the trustlevel. */
+  if (sig->pka_info && sig->pka_info->valid)
+    {
+      unsigned char fpr[MAX_FINGERPRINT_LEN];
+      PKT_public_key *primary_pk;
+      size_t fprlen;
+      int okay;
+
+
+      primary_pk = xmalloc_clear (sizeof *primary_pk);
+      get_pubkey (primary_pk, pk->main_keyid);
+      fingerprint_from_pk (primary_pk, fpr, &fprlen);
+      free_public_key (primary_pk);
+
+      if ( fprlen == 20 && !memcmp (sig->pka_info->fpr, fpr, 20) )
+        {
+          okay = 1;
+          log_info (_("Note: Verified signer's address is `%s'\n"),
+                    sig->pka_info->email);
+        }
+      else
+        {
+          okay = 0;
+          log_info (_("Note: Signer's address `%s' "
+                      "does not match DNS entry\n"), sig->pka_info->email);
+        }
+
+      switch ( (trustlevel & TRUST_MASK) ) 
+        {
+        case TRUST_UNKNOWN: 
+        case TRUST_UNDEFINED:
+        case TRUST_MARGINAL:
+          if (okay)
+            {
+              trustlevel = ((trustlevel & ~TRUST_MASK) | TRUST_FULLY);
+              log_info ("trustlevel adjusted to FULL due to valid PKA info\n");
+            }
+          /* (fall through) */
+        case TRUST_FULLY:
+          if (!okay)
+            {
+              trustlevel = ((trustlevel & ~TRUST_MASK) | TRUST_NEVER);
+              log_info ("trustlevel adjusted to NEVER due to bad PKA info\n");
+            }
+          break;
+        }
+    }
+
+  /* Now let the user know what up with the trustlevel. */
   switch ( (trustlevel & TRUST_MASK) ) 
     {
     case TRUST_EXPIRED:
@@ -575,7 +648,7 @@ release_pk_list( PK_LIST pk_list )
     for( ; pk_list; pk_list = pk_rover ) {
        pk_rover = pk_list->next;
        free_public_key( pk_list->pk );
-       m_free( pk_list );
+       xfree( pk_list );
     }
 }
 
@@ -604,10 +677,10 @@ default_recipient(void)
     int i;
 
     if( opt.def_recipient )
-       return m_strdup( opt.def_recipient );
+       return xstrdup( opt.def_recipient );
     if( !opt.def_recipient_self )
        return NULL;
-    sk = m_alloc_clear( sizeof *sk );
+    sk = xmalloc_clear( sizeof *sk );
     i = get_seckey_byname( sk, NULL, 0 );
     if( i ) {
        free_secret_key( sk );
@@ -616,7 +689,7 @@ default_recipient(void)
     n = MAX_FINGERPRINT_LEN;
     fingerprint_from_sk( sk, fpr, &n );
     free_secret_key( sk );
-    p = m_alloc( 2*n+3 );
+    p = xmalloc( 2*n+3 );
     *p++ = '0';
     *p++ = 'x';
     for(i=0; i < n; i++ )
@@ -703,7 +776,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
              }
          }
        else if( (use & PUBKEY_USAGE_ENC) && !opt.no_encrypt_to ) {
-           pk = m_alloc_clear( sizeof *pk );
+           pk = xmalloc_clear( sizeof *pk );
            pk->req_usage = use;
            /* We can encrypt-to a disabled key */
            if( (rc = get_pubkey_byname( pk, rov->d, NULL, NULL, 1 )) ) {
@@ -723,7 +796,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                }
                else {
                    PK_LIST r;
-                   r = m_alloc( sizeof *r );
+                   r = xmalloc( sizeof *r );
                    r->pk = pk; pk = NULL;
                    r->next = pk_list;
                    r->flags = (rov->flags&2)?1:0;
@@ -763,7 +836,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                "You did not specify a user ID. (you may use \"-r\")\n"));
        for(;;) {
            rc = 0;
-           m_free(answer);
+           xfree(answer);
            if( have_def_rec ) {
                answer = def_rec;
                def_rec = NULL;
@@ -796,7 +869,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                        size_t n;
                        char *p = get_user_id( keyid, &n );
                        tty_print_utf8_string( p, n );
-                       m_free(p);
+                       xfree(p);
                      }
                    tty_printf("\"\n");
                  }
@@ -807,14 +880,14 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                cpr_kill_prompt();
              }
            if( !answer || !*answer ) {
-               m_free(answer);
+               xfree(answer);
                break;
            }
            if(expand_id(answer,&backlog,0))
              continue;
            if( pk )
                free_public_key( pk );
-           pk = m_alloc_clear( sizeof *pk );
+           pk = xmalloc_clear( sizeof *pk );
            pk->req_usage = use;
            rc = get_pubkey_byname( pk, answer, NULL, NULL, 0 );
            if( rc )
@@ -827,7 +900,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                                   "already set as default recipient\n") );
                    }
                    else {
-                       PK_LIST r = m_alloc( sizeof *r );
+                       PK_LIST r = xmalloc( sizeof *r );
                        r->pk = pk; pk = NULL;
                        r->next = pk_list;
                        r->flags = 0; /* no throwing default ids */
@@ -852,7 +925,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                        }
                        else {
                            PK_LIST r;
-                           r = m_alloc( sizeof *r );
+                           r = xmalloc( sizeof *r );
                            r->pk = pk; pk = NULL;
                            r->next = pk_list;
                            r->flags = 0; /* no throwing interactive ids */
@@ -863,7 +936,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                    }
                }
            }
-           m_free(def_rec); def_rec = NULL;
+           xfree(def_rec); def_rec = NULL;
            have_def_rec = 0;
        }
        if( pk ) {
@@ -872,12 +945,12 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
        }
     }
     else if( !any_recipients && (def_rec = default_recipient()) ) {
-       pk = m_alloc_clear( sizeof *pk );
+       pk = xmalloc_clear( sizeof *pk );
        pk->req_usage = use;
        /* The default recipient may be disabled */
        rc = get_pubkey_byname( pk, def_rec, NULL, NULL, 1 );
        if( rc )
-           log_error(_("unknown default recipient `%s'\n"), def_rec );
+           log_error(_("unknown default recipient \"%s\"\n"), def_rec );
        else if( !(rc=check_pubkey_algo2(pk->pubkey_algo, use)) ) {
          /* Mark any_recipients here since the default recipient
              would have been used if it wasn't already there.  It
@@ -887,7 +960,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
          if (key_present_in_pk_list(pk_list, pk) == 0)
            log_info(_("skipped: public key already set as default recipient\n"));
          else {
-           PK_LIST r = m_alloc( sizeof *r );
+           PK_LIST r = xmalloc( sizeof *r );
            r->pk = pk; pk = NULL;
            r->next = pk_list;
            r->flags = 0; /* no throwing default ids */
@@ -898,7 +971,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
            free_public_key( pk );
            pk = NULL;
        }
-       m_free(def_rec); def_rec = NULL;
+       xfree(def_rec); def_rec = NULL;
     }
     else {
        any_recipients = 0;
@@ -906,7 +979,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
            if( (remusr->flags & 1) )
                continue; /* encrypt-to keys are already handled */
 
-           pk = m_alloc_clear( sizeof *pk );
+           pk = xmalloc_clear( sizeof *pk );
            pk->req_usage = use;
            if( (rc = get_pubkey_byname( pk, remusr->d, NULL, NULL, 0 )) ) {
                free_public_key( pk ); pk = NULL;
@@ -947,7 +1020,7 @@ build_pk_list( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use )
                    }
                    else {
                        PK_LIST r;
-                       r = m_alloc( sizeof *r );
+                       r = xmalloc( sizeof *r );
                        r->pk = pk; pk = NULL;
                        r->next = pk_list;
                        r->flags = (remusr->flags&2)?1:0;