Allow for default algorithms in a parameter file
[gnupg.git] / g10 / gpg.c
index 9af97fb..4581488 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -1,6 +1,6 @@
 /* gpg.c - The GnuPG utility (main for gpg)
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
- *               2006, 2007, 2008 Free Software Foundation, Inc.
+ *               2006, 2007, 2008, 2009 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -394,6 +394,7 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_c (aSignKey,  "sign-key"   ,N_("sign a key")),
   ARGPARSE_c (aLSignKey, "lsign-key"  ,N_("sign a key locally")),
   ARGPARSE_c (aEditKey,  "edit-key"   ,N_("sign or edit a key")),
+  ARGPARSE_c (aEditKey,  "key-edit"   ,"@"),
   ARGPARSE_c (aGenRevoke, "gen-revoke",N_("generate a revocation certificate")),
   ARGPARSE_c (aDesigRevoke, "desig-revoke","@" ),
   ARGPARSE_c (aExport, "export"           , N_("export keys") ),
@@ -804,9 +805,7 @@ my_strusage( int level )
        break;
       case 13: p = VERSION; break;
       case 17: p = PRINTABLE_OS_NAME; break;
-      case 19: p =
-           _("Please report bugs to <gnupg-bugs@gnu.org>.\n");
-       break;
+      case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
 
     case 20:
       if (!ver_gcry)
@@ -955,6 +954,17 @@ make_username( const char *string )
 }
 
 
+static void
+set_opt_session_env (const char *name, const char *value)
+{
+  gpg_error_t err;
+  
+  err = session_env_setenv (opt.session_env, name, value);
+  if (err)
+    log_fatal ("error setting session environment: %s\n",
+               gpg_strerror (err));
+}
+
 /* Setup the debugging.  With a LEVEL of NULL only the active debug
    flags are propagated to the subsystems.  With LEVEL set, a specific
    set of debug flags is set; thus overriding all flags already
@@ -962,19 +972,30 @@ make_username( const char *string )
 static void
 set_debug (const char *level)
 {
+  int numok = (level && digitp (level));
+  int numlvl = numok? atoi (level) : 0;
+
   if (!level)
     ;
-  else if (!strcmp (level, "none"))
+  else if (!strcmp (level, "none") || (numok && numlvl < 1))
     opt.debug = 0;
-  else if (!strcmp (level, "basic"))
+  else if (!strcmp (level, "basic") || (numok && numlvl <= 2))
     opt.debug = DBG_MEMSTAT_VALUE;
-  else if (!strcmp (level, "advanced"))
+  else if (!strcmp (level, "advanced") || (numok && numlvl <= 5))
     opt.debug = DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE;
-  else if (!strcmp (level, "expert"))
+  else if (!strcmp (level, "expert")  || (numok && numlvl <= 8))
     opt.debug = (DBG_MEMSTAT_VALUE|DBG_TRUST_VALUE|DBG_EXTPROG_VALUE
                  |DBG_CACHE_VALUE|DBG_FILTER_VALUE|DBG_PACKET_VALUE);
-  else if (!strcmp (level, "guru"))
-    opt.debug = ~0;
+  else if (!strcmp (level, "guru") || numok)
+    {
+      opt.debug = ~0;
+      /* Unless the "guru" string has been used we don't want to allow
+         hashing debugging.  The rationale is that people tend to
+         select the highest debug value and would then clutter their
+         disk with debug files which may reveal confidential data.  */ 
+      if (numok)
+        opt.debug &= ~(DBG_HASHING_VALUE);
+    }
   else
     {
       log_error (_("invalid debug-level `%s' given\n"), level);
@@ -992,6 +1013,22 @@ set_debug (const char *level)
   if (opt.debug & DBG_IOBUF_VALUE )
     iobuf_debug_mode = 1;
   gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
+
+  if (opt.debug)
+    log_info ("enabled debug flags:%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+              (opt.debug & DBG_PACKET_VALUE )? " packet":"",    
+              (opt.debug & DBG_MPI_VALUE    )? " mpi":"",    
+              (opt.debug & DBG_CIPHER_VALUE )? " cipher":"",    
+              (opt.debug & DBG_FILTER_VALUE )? " filter":"", 
+              (opt.debug & DBG_IOBUF_VALUE  )? " iobuf":"", 
+              (opt.debug & DBG_MEMORY_VALUE )? " memory":"", 
+              (opt.debug & DBG_CACHE_VALUE  )? " cache":"", 
+              (opt.debug & DBG_MEMSTAT_VALUE)? " memstat":"", 
+              (opt.debug & DBG_TRUST_VALUE  )? " trust":"", 
+              (opt.debug & DBG_HASHING_VALUE)? " hashing":"", 
+              (opt.debug & DBG_EXTPROG_VALUE)? " extprog":"", 
+              (opt.debug & DBG_CARD_IO_VALUE)? " cardio":"",
+              (opt.debug & DBG_ASSUAN_VALUE )? " assuan":"");
 }
 
 
@@ -1572,11 +1609,15 @@ gpgconf_list (const char *configfile)
   printf ("default-key:%lu:\n", GC_OPT_FLAG_NONE);
   printf ("encrypt-to:%lu:\n", GC_OPT_FLAG_NONE);
   printf ("auto-key-locate:%lu:\n", GC_OPT_FLAG_NONE);
-  printf ("allow-pka-lookup:%lu:\n", GC_OPT_FLAG_NONE);
   printf ("log-file:%lu:\n", GC_OPT_FLAG_NONE);
   printf ("debug-level:%lu:\"none:\n", GC_OPT_FLAG_DEFAULT);
   printf ("group:%lu:\n", GC_OPT_FLAG_NONE);
 
+  /* The next one is an info only item and should match the macros at
+     the top of keygen.c.  */
+  printf ("default_pubkey_algo:%lu:\"%s:\n", GC_OPT_FLAG_DEFAULT,
+          "RSA-2048");
+
   xfree (configfile_esc);
 }
 
@@ -1893,7 +1934,7 @@ main (int argc, char **argv)
     int eyes_only=0;
     int multifile=0;
     int pwfd = -1;
-    int with_fpr = 0; /* make an option out of --fingerprint */
+    int fpr_maybe_cmd = 0; /* --fingerprint maybe a command.  */
     int any_explicit_recipient = 0;
     int require_secmem=0,got_secmem=0;
 
@@ -1936,6 +1977,10 @@ main (int argc, char **argv)
 
     create_dotlock(NULL); /* Register locking cleanup. */
 
+    opt.session_env = session_env_new ();
+    if (!opt.session_env)
+      log_fatal ("error allocating session environment block: %s\n",
+                 strerror (errno));
 
     opt.command_fd = -1; /* no command fd */
     opt.compress_level = -1; /* defaults to standard compress level */
@@ -2242,8 +2287,13 @@ main (int argc, char **argv)
 
          case oWithFingerprint:
             opt.with_fingerprint = 1;
-            with_fpr=1; /*fall thru*/
-         case oFingerprint: opt.fingerprint++; break;
+            opt.fingerprint++;
+            break;
+         case oFingerprint:
+            opt.fingerprint++;
+            fpr_maybe_cmd = 1;
+            break;
+
          case oSecretKeyring:
             append_to_strlist( &sec_nrings, pargs.r.ret_str);
             break;
@@ -2816,12 +2866,23 @@ main (int argc, char **argv)
            pers_compress_list=pargs.r.ret_str;
            break;
           case oAgentProgram: opt.agent_program = pargs.r.ret_str;  break;
-          case oDisplay: opt.display = pargs.r.ret_str; break;
-          case oTTYname: opt.ttyname = pargs.r.ret_str; break;
-          case oTTYtype: opt.ttytype = pargs.r.ret_str; break;
+
+          case oDisplay:
+            set_opt_session_env ("DISPLAY", pargs.r.ret_str);
+            break;
+          case oTTYname:
+            set_opt_session_env ("GPG_TTY", pargs.r.ret_str);
+            break;
+          case oTTYtype:
+            set_opt_session_env ("TERM", pargs.r.ret_str);
+            break;
+          case oXauthority:
+            set_opt_session_env ("XAUTHORITY", pargs.r.ret_str);
+            break;
+
           case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
           case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
-          case oXauthority: opt.xauthority = pargs.r.ret_str; break;
+
          case oGroup: add_group(pargs.r.ret_str); break;
          case oUnGroup: rm_group(pargs.r.ret_str); break;
          case oNoGroups:
@@ -2936,15 +2997,15 @@ main (int argc, char **argv)
        fprintf(stderr, "%s\n", strusage(15) );
     }
 #ifdef IS_DEVELOPMENT_VERSION
-    if( !opt.batch )
+    if (!opt.batch)
       {
        const char *s;
 
-       if((s=strusage(20)))
+       if((s=strusage(25)))
          log_info("%s\n",s);
-       if((s=strusage(21)))
+       if((s=strusage(26)))
          log_info("%s\n",s);
-       if((s=strusage(22)))
+       if((s=strusage(27)))
          log_info("%s\n",s);
       }
 #endif
@@ -2959,15 +3020,6 @@ main (int argc, char **argv)
         log_set_prefix (NULL, 1|2|4);
       }
 
-#ifdef USE_CAMELLIA    
-    /* We better also print a runtime warning if people build it with
-       support for Camellia (which is not yet defined by OpenPGP). */
-    log_info ("WARNING: This version has been built with support for the "
-              "Camellia cipher.\n");
-    log_info ("         It is for testing only and is NOT for production "
-              "use!\n");
-#endif
-
     /* Older Libgcrypts fail with an assertion during DSA key
        generation.  Better disable DSA2 entirely. */
     if (opt.flags.dsa2 && !gcry_check_version ("1.4.0") )
@@ -3093,6 +3145,7 @@ main (int argc, char **argv)
       }
     else if(PGP6)
       {
+       opt.disable_mdc=1;
        opt.escape_from=1;
        opt.force_v3_sigs=1;
        opt.ask_sig_expire=0;
@@ -3174,11 +3227,6 @@ main (int argc, char **argv)
        keygen_set_std_prefs(opt.def_preference_list,0))
       log_error(_("invalid default preferences\n"));
 
-    /* We provide defaults for the personal digest list.  This is
-       SHA-1. */
-    if(!pers_digest_list)
-      pers_digest_list="h2";
-
     if(pers_cipher_list &&
        keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM))
       log_error(_("invalid personal cipher preferences\n"));
@@ -3300,9 +3348,12 @@ main (int argc, char **argv)
        xfree(p);
     }
 
-    if( !cmd && opt.fingerprint && !with_fpr ) {
-       set_cmd( &cmd, aListKeys);
-    }
+    /* If there is no command but the --fingerprint is given, default
+       to the --list-keys command.  */
+    if (!cmd && fpr_maybe_cmd)
+      {
+       set_cmd (&cmd, aListKeys);
+      }
 
 
     if( opt.verbose > 1 )
@@ -3355,8 +3406,8 @@ main (int argc, char **argv)
       case aGenRandom:
       case aDeArmor:
       case aEnArmor:
-      case aFixTrustDB:
        break;
+      case aFixTrustDB:
       case aExportOwnerTrust: rc = setup_trustdb( 0, trustdb_name ); break;
       case aListTrustDB: rc = setup_trustdb( argc? 1:0, trustdb_name ); break;
       default: rc = setup_trustdb(1, trustdb_name ); break;
@@ -3562,7 +3613,7 @@ main (int argc, char **argv)
 
        append_to_strlist( &sl, "save" );
        username = make_username( fname );
-       keyedit_menu(fname, locusr, sl, 0, 0 );
+       keyedit_menu (username, locusr, sl, 0, 0 );
        xfree(username);
        free_strlist(sl);
        break;
@@ -3878,9 +3929,7 @@ main (int argc, char **argv)
        break;
 
       case aFixTrustDB:
-       log_error("this command is not yet implemented.\n");
-       log_error("A workaround is to use \"--export-ownertrust\", remove\n");
-       log_error("the trustdb file and do an \"--import-ownertrust\".\n" );
+        how_to_fix_the_trustdb ();
        break;
 
       case aListTrustPath:
@@ -4187,7 +4236,8 @@ print_mds( const char *fname, int algo )
             else {
                 print_hashline( md, GCRY_MD_MD5, fname );
                 print_hashline( md, GCRY_MD_SHA1, fname );
-                print_hashline( md, GCRY_MD_RMD160, fname );
+                if (!gcry_md_test_algo (GCRY_MD_RMD160))
+                    print_hashline( md, GCRY_MD_RMD160, fname );
                 if (!gcry_md_test_algo (GCRY_MD_SHA224))
                     print_hashline (md, GCRY_MD_SHA224, fname);
                 if (!gcry_md_test_algo (GCRY_MD_SHA256))
@@ -4204,7 +4254,8 @@ print_mds( const char *fname, int algo )
             else {
                 print_hex( md, GCRY_MD_MD5, fname );
                 print_hex( md, GCRY_MD_SHA1, fname );
-                print_hex( md, GCRY_MD_RMD160, fname );
+                if (!gcry_md_test_algo (GCRY_MD_RMD160))
+                    print_hex( md, GCRY_MD_RMD160, fname );
                 if (!gcry_md_test_algo (GCRY_MD_SHA224))
                     print_hex (md, GCRY_MD_SHA224, fname);
                 if (!gcry_md_test_algo (GCRY_MD_SHA256))
@@ -4314,4 +4365,3 @@ add_keyserver_url( const char *string, int which )
   if(critical)
     sl->flags |= 1;    
 }
-