g10: Don't leak memory if we fail to initialize a new database handle.
[gnupg.git] / g10 / pkclist.c
index 295ee06..41c126e 100644 (file)
@@ -176,6 +176,7 @@ show_revocation_reason( PKT_public_key *pk, int mode )
  *       0 = nothing changed
  *       1 = new ownertrust now in new_trust
  */
+#ifndef NO_TRUST_MODELS
 static int
 do_edit_ownertrust (PKT_public_key *pk, int mode,
                     unsigned *new_trust, int defer_help )
@@ -187,7 +188,8 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
   int show=0;
   int min_num;
   int did_help=defer_help;
-  unsigned int minimum=get_min_ownertrust(pk);
+  unsigned int minimum = tdb_get_min_ownertrust (pk);
+  char pkstrbuf[PUBKEY_STRING_SIZE];
 
   switch(minimum)
     {
@@ -202,7 +204,7 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
   for(;;) {
     /* A string with valid answers.
 
-       Note to translators: These are the allowed answers in lower and
+       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.
@@ -221,8 +223,8 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
             KBNODE keyblock, un;
 
             tty_printf(_("No trust value assigned to:\n"));
-           tty_printf("%4u%c/%s %s\n",nbits_from_pk( pk ),
-                      pubkey_letter( pk->pubkey_algo ),
+           tty_printf("%s/%s %s\n",
+                       pubkey_string (pk, pkstrbuf, sizeof pkstrbuf),
                        keystr(keyid), datestr_from_pk( pk ) );
            p=get_user_id_native(keyid);
            tty_printf(_("      \"%s\"\n"),p);
@@ -256,7 +258,7 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
                tty_printf(_("  aka \"%s\"\n"),p);
              }
 
-            print_fingerprint (pk, 2);
+            print_fingerprint (NULL, pk, 2);
             tty_printf("\n");
            release_kbnode (keyblock);
           }
@@ -364,12 +366,15 @@ do_edit_ownertrust (PKT_public_key *pk, int mode,
   xfree(p);
   return show? -2: quit? -1 : changed;
 }
+#endif /*!NO_TRUST_MODELS*/
+
 
 /*
  * Display a menu to change the ownertrust of the key PK (which should
  * be a primary key).
  * For mode values see do_edit_ownertrust ()
  */
+#ifndef NO_TRUST_MODELS
 int
 edit_ownertrust (PKT_public_key *pk, int mode )
 {
@@ -395,6 +400,7 @@ edit_ownertrust (PKT_public_key *pk, int mode )
         }
     }
 }
+#endif /*!NO_TRUST_MODELS*/
 
 
 /****************
@@ -414,7 +420,7 @@ do_we_trust( PKT_public_key *pk, unsigned int trustlevel )
   if( opt.trust_model==TM_ALWAYS )
     {
       if( opt.verbose )
-       log_info("No trust check due to `--trust-model always' option\n");
+       log_info("No trust check due to '--trust-model always' option\n");
       return 1;
     }
 
@@ -464,7 +470,7 @@ do_we_trust_pre( PKT_public_key *pk, unsigned int trustlevel )
   if( !opt.batch && !rc )
     {
       print_pubkey_info(NULL,pk);
-      print_fingerprint (pk, 2);
+      print_fingerprint (NULL, pk, 2);
       tty_printf("\n");
 
       tty_printf(
@@ -514,7 +520,7 @@ check_signatures_trust( PKT_signature *sig )
   if (rc)
     { /* this should not happen */
       log_error("Ooops; the key vanished  - can't check the trust\n");
-      rc = G10ERR_NO_PUBKEY;
+      rc = GPG_ERR_NO_PUBKEY;
       goto leave;
     }
 
@@ -523,7 +529,7 @@ check_signatures_trust( PKT_signature *sig )
       if( !opt.quiet )
         log_info(_("WARNING: Using untrusted key!\n"));
       if (opt.with_fingerprint)
-        print_fingerprint (pk, 1);
+        print_fingerprint (NULL, pk, 1);
       goto leave;
     }
 
@@ -572,14 +578,14 @@ check_signatures_trust( PKT_signature *sig )
         {
           okay = 1;
           write_status_text (STATUS_PKA_TRUST_GOOD, sig->pka_info->email);
-          log_info (_("Note: Verified signer's address is `%s'\n"),
+          log_info (_("Note: Verified signer's address is '%s'\n"),
                     sig->pka_info->email);
         }
       else
         {
           okay = 0;
           write_status_text (STATUS_PKA_TRUST_BAD, sig->pka_info->email);
-          log_info (_("Note: Signer's address `%s' "
+          log_info (_("Note: Signer's address '%s' "
                       "does not match DNS entry\n"), sig->pka_info->email);
         }
 
@@ -611,7 +617,7 @@ check_signatures_trust( PKT_signature *sig )
     {
     case TRUST_EXPIRED:
       log_info(_("Note: This key has expired!\n"));
-      print_fingerprint (pk, 1);
+      print_fingerprint (NULL, pk, 1);
       break;
 
     default:
@@ -625,7 +631,7 @@ check_signatures_trust( PKT_signature *sig )
                  " a trusted signature!\n"));
       log_info(_("         There is no indication that the "
                  "signature belongs to the owner.\n" ));
-      print_fingerprint (pk, 1);
+      print_fingerprint (NULL, pk, 1);
       break;
 
     case TRUST_NEVER:
@@ -634,7 +640,7 @@ check_signatures_trust( PKT_signature *sig )
       log_info(_("WARNING: We do NOT trust this key!\n"));
       log_info(_("         The signature is probably a FORGERY.\n"));
       if (opt.with_fingerprint)
-        print_fingerprint (pk, 1);
+        print_fingerprint (NULL, pk, 1);
       rc = gpg_error (GPG_ERR_BAD_SIGNATURE);
       break;
 
@@ -644,19 +650,19 @@ check_signatures_trust( PKT_signature *sig )
                  " sufficiently trusted signatures!\n"));
       log_info(_("         It is not certain that the"
                  " signature belongs to the owner.\n" ));
-      print_fingerprint (pk, 1);
+      print_fingerprint (NULL, pk, 1);
       break;
 
     case TRUST_FULLY:
       write_status( STATUS_TRUST_FULLY );
       if (opt.with_fingerprint)
-        print_fingerprint (pk, 1);
+        print_fingerprint (NULL, pk, 1);
       break;
 
     case TRUST_ULTIMATE:
       write_status( STATUS_TRUST_ULTIMATE );
       if (opt.with_fingerprint)
-        print_fingerprint (pk, 1);
+        print_fingerprint (NULL, pk, 1);
       break;
     }
 
@@ -796,9 +802,18 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
   rc = get_pubkey_byname (ctrl, NULL, pk, name, NULL, NULL, 0, 0);
   if (rc)
     {
+      int code;
+
       /* Key not found or other error. */
-      log_error (_("%s: skipped: %s\n"), name, g10_errstr(rc) );
-      send_status_inv_recp (0, name);
+      log_error (_("%s: skipped: %s\n"), name, gpg_strerror (rc) );
+      switch (gpg_err_code (rc))
+        {
+        case GPG_ERR_NO_SECKEY:
+        case GPG_ERR_NO_PUBKEY:   code =  1; break;
+        case GPG_ERR_INV_USER_ID: code = 14; break;
+        default: code = 0; break;
+        }
+      send_status_inv_recp (code, name);
       free_public_key (pk);
       return rc;
     }
@@ -807,8 +822,8 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
   if (rc)
     {
       /* Key found but not usable for us (e.g. sign-only key). */
-      send_status_inv_recp (0, name);
-      log_error (_("%s: skipped: %s\n"), name, g10_errstr(rc) );
+      send_status_inv_recp (3, name); /* Wrong key usage */
+      log_error (_("%s: skipped: %s\n"), name, gpg_strerror (rc) );
       free_public_key (pk);
       return rc;
     }
@@ -818,10 +833,10 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
   if ( (trustlevel & TRUST_FLAG_DISABLED) )
     {
       /* Key has been disabled. */
-      send_status_inv_recp (0, name);
+      send_status_inv_recp (13, name);
       log_info (_("%s: skipped: public key is disabled\n"), name);
       free_public_key (pk);
-      return G10ERR_UNU_PUBKEY;
+      return GPG_ERR_UNUSABLE_PUBKEY;
     }
 
   if ( !do_we_trust_pre (pk, trustlevel) )
@@ -829,7 +844,7 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
       /* We don't trust this key.  */
       send_status_inv_recp (10, name);
       free_public_key (pk);
-      return G10ERR_UNU_PUBKEY;
+      return GPG_ERR_UNUSABLE_PUBKEY;
     }
   /* Note: do_we_trust may have changed the trustlevel. */
 
@@ -837,7 +852,8 @@ find_and_check_key (ctrl_t ctrl, const char *name, unsigned int use,
      list.  */
   if (!key_present_in_pk_list (*pk_list_addr, pk))
     {
-      log_info (_("%s: skipped: public key already present\n"), name);
+      if (!opt.quiet)
+        log_info (_("%s: skipped: public key already present\n"), name);
       free_public_key (pk);
     }
   else
@@ -892,6 +908,7 @@ build_pk_list (ctrl_t ctrl,
   int any_recipients=0;
   strlist_t rov,remusr;
   char *def_rec = NULL;
+  char pkstrbuf[PUBKEY_STRING_SIZE];
 
   /* Try to expand groups if any have been defined. */
   if (opt.grouplist)
@@ -911,7 +928,7 @@ build_pk_list (ctrl_t ctrl,
 
           /* Hidden recipients are not allowed while in PGP mode,
              issue a warning and switch into GnuPG mode. */
-          if ((rov->flags&2) && (PGP2 || PGP6 || PGP7 || PGP8))
+          if ((rov->flags&2) && (PGP6 || PGP7 || PGP8))
             {
               log_info(_("you may not use %s while in %s mode\n"),
                        "--hidden-recipient",
@@ -928,13 +945,13 @@ build_pk_list (ctrl_t ctrl,
           pk->req_usage = use;
 
           /* We explicitly allow encrypt-to to an disabled key; thus
-             we pass 1for the second last argument and 1 as the last
+             we pass 1 for the second last argument and 1 as the last
              argument to disable AKL. */
           if ( (rc = get_pubkey_byname (ctrl,
                                         NULL, pk, rov->d, NULL, NULL, 1, 1)) )
             {
               free_public_key ( pk ); pk = NULL;
-              log_error (_("%s: skipped: %s\n"), rov->d, g10_errstr(rc) );
+              log_error (_("%s: skipped: %s\n"), rov->d, gpg_strerror (rc) );
               send_status_inv_recp (0, rov->d);
               goto fail;
             }
@@ -945,8 +962,9 @@ build_pk_list (ctrl_t ctrl,
               if (key_present_in_pk_list(pk_list, pk) == 0)
                 {
                   free_public_key (pk); pk = NULL;
-                  log_info (_("%s: skipped: public key already present\n"),
-                            rov->d);
+                  if (!opt.quiet)
+                    log_info (_("%s: skipped: public key already present\n"),
+                              rov->d);
                 }
               else
                 {
@@ -960,7 +978,7 @@ build_pk_list (ctrl_t ctrl,
                   /* Hidden encrypt-to recipients are not allowed while
                      in PGP mode, issue a warning and switch into
                      GnuPG mode. */
-                  if ((r->flags&1) && (PGP2 || PGP6 || PGP7 || PGP8))
+                  if ((r->flags&1) && (PGP6 || PGP7 || PGP8))
                     {
                       log_info(_("you may not use %s while in %s mode\n"),
                                "--hidden-encrypt-to",
@@ -972,11 +990,10 @@ build_pk_list (ctrl_t ctrl,
             }
           else
             {
-              /* The public key is not usable for encryption or not
-                 available. */
+              /* The public key is not usable for encryption. */
               free_public_key( pk ); pk = NULL;
-              log_error(_("%s: skipped: %s\n"), rov->d, g10_errstr(rc) );
-              send_status_inv_recp (0, rov->d);
+              log_error(_("%s: skipped: %s\n"), rov->d, gpg_strerror (rc) );
+              send_status_inv_recp (3, rov->d); /* Wrong key usage */
               goto fail;
             }
         }
@@ -1025,11 +1042,11 @@ build_pk_list (ctrl_t ctrl,
                   u32 keyid[2];
 
                   keyid_from_pk(iter->pk,keyid);
-                  tty_printf("%4u%c/%s %s \"",
-                             nbits_from_pk(iter->pk),
-                             pubkey_letter(iter->pk->pubkey_algo),
-                             keystr(keyid),
-                             datestr_from_pk(iter->pk));
+                  tty_printf ("%s/%s %s \"",
+                              pubkey_string (iter->pk,
+                                             pkstrbuf, sizeof pkstrbuf),
+                              keystr(keyid),
+                              datestr_from_pk (iter->pk));
 
                   if (iter->pk->user_id)
                     tty_print_utf8_string(iter->pk->user_id->name,
@@ -1193,7 +1210,7 @@ build_pk_list (ctrl_t ctrl,
     {
       log_error(_("no valid addressees\n"));
       write_status_text (STATUS_NO_RECP, "0");
-      rc = G10ERR_NO_USER_ID;
+      rc = GPG_ERR_NO_USER_ID;
     }
 
  fail:
@@ -1327,10 +1344,7 @@ select_algo_from_prefs(PK_LIST pk_list, int preftype,
             dropped from 4880 but is still relevant to GPG's 1991
             support.  All this doesn't mean IDEA is actually
             available, of course. */
-         if(PGP2 && pkr->pk->version<4 && pkr->pk->selfsigversion<4)
-           implicit=CIPHER_ALGO_IDEA;
-         else
-           implicit=CIPHER_ALGO_3DES;
+          implicit=CIPHER_ALGO_3DES;
 
          break;
 
@@ -1342,12 +1356,7 @@ select_algo_from_prefs(PK_LIST pk_list, int preftype,
             mode, and that's the only time PREFTYPE_HASH is used
             anyway. -dms */
 
-         /* MD5 is there for v3 keys with v3 selfsigs when --pgp2 is
-            on. */
-         if(PGP2 && pkr->pk->version<4 && pkr->pk->selfsigversion<4)
-           implicit=DIGEST_ALGO_MD5;
-         else
-           implicit=DIGEST_ALGO_SHA1;
+          implicit=DIGEST_ALGO_SHA1;
 
          break;