Fix preference setting in new keys
[gnupg.git] / g10 / gpg.c
index cce9f6e..2b7b4be 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, 2009 Free Software Foundation, Inc.
+ *               2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -53,6 +53,7 @@
 #include "keyserver-internal.h"
 #include "exec.h"
 #include "gc-opt-flags.h"
+#include "asshelp.h"
 
 #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
 #define MY_O_BINARY  O_BINARY
@@ -146,6 +147,7 @@ enum cmd_and_opt_values
     aCardStatus,
     aCardEdit,
     aChangePIN,
+    aPasswd,
     aServer,
 
     oTextmode,
@@ -207,10 +209,10 @@ enum cmd_and_opt_values
     oCompressLevel,
     oBZ2CompressLevel,
     oBZ2DecompressLowmem,
-    oPasswd,
-    oPasswdFD,
-    oPasswdFile,
-    oPasswdRepeat,
+    oPassphrase,
+    oPassphraseFD,
+    oPassphraseFile,
+    oPassphraseRepeat,
     oCommandFD,
     oCommandFile,
     oQuickRandom,
@@ -390,6 +392,7 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_c (oFingerprint, "fingerprint", N_("list keys and fingerprints")),
   ARGPARSE_c (aListSecretKeys, "list-secret-keys", N_("list secret keys")),
   ARGPARSE_c (aKeygen,    "gen-key",  N_("generate a new key pair")),
+  ARGPARSE_c (aGenRevoke, "gen-revoke",N_("generate a revocation certificate")),
   ARGPARSE_c (aDeleteKeys,"delete-keys", 
               N_("remove keys from the public keyring")),
   ARGPARSE_c (aDeleteSecretKeys, "delete-secret-keys",
@@ -398,7 +401,7 @@ static ARGPARSE_OPTS opts[] = {
   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 (aPasswd,   "passwd",     N_("change a passphrase")),
   ARGPARSE_c (aDesigRevoke, "desig-revoke","@" ),
   ARGPARSE_c (aExport, "export"           , N_("export keys") ),
   ARGPARSE_c (aSendKeys, "send-keys"     , N_("export keys to a key server") ),
@@ -600,10 +603,10 @@ static ARGPARSE_OPTS opts[] = {
               "delete-secret-and-public-keys", "@"),
   ARGPARSE_c (aRebuildKeydbCaches, "rebuild-keydb-caches", "@"),
 
-  ARGPARSE_s_s (oPasswd, "passphrase", "@"),
-  ARGPARSE_s_i (oPasswdFD, "passphrase-fd", "@"),
-  ARGPARSE_s_s (oPasswdFile, "passphrase-file", "@"),
-  ARGPARSE_s_i (oPasswdRepeat, "passphrase-repeat", "@"),
+  ARGPARSE_s_s (oPassphrase,      "passphrase", "@"),
+  ARGPARSE_s_i (oPassphraseFD,    "passphrase-fd", "@"),
+  ARGPARSE_s_s (oPassphraseFile,  "passphrase-file", "@"),
+  ARGPARSE_s_i (oPassphraseRepeat,"passphrase-repeat", "@"),
   ARGPARSE_s_i (oCommandFD, "command-fd", "@"),
   ARGPARSE_s_s (oCommandFile, "command-file", "@"),
   ARGPARSE_s_n (oQuickRandom, "debug-quick-random", "@"),
@@ -1104,7 +1107,7 @@ open_info_file (const char *fname, int for_write, int binary)
 /*   if (is_secured_filename (fname)) */
 /*     { */
 /*       fd = -1; */
-/*       errno = EPERM; */
+/*       gpg_err_set_errno (EPERM); */
 /*     } */
 /*   else */
 /*     { */
@@ -1239,7 +1242,7 @@ rm_group(char *name)
 
    Returns true if the item is unsafe. */
 static int
-check_permissions(const char *path,int item)
+check_permissions (const char *path, int item)
 {
 #if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM)
   static int homedir_cache=-1;
@@ -1425,12 +1428,15 @@ check_permissions(const char *path,int item)
 
   return ret;
 
-#endif /* HAVE_STAT && !HAVE_DOSISH_SYSTEM */
-
+#else /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
+  (void)path;
+  (void)item;
   return 0;
+#endif /*!(HAVE_STAT && !HAVE_DOSISH_SYSTEM)*/
 }
 
 
+/* Print the OpenPGP defined algo numbers.  */
 static void
 print_algo_numbers(int (*checker)(int))
 {
@@ -1493,9 +1499,10 @@ list_config(char *items)
            {
              strlist_t sl;
 
-             printf("cfg:group:");
-             print_string(stdout,iter->name,strlen(iter->name),':');
-             printf(":");
+             es_fprintf (es_stdout, "cfg:group:");
+             es_write_sanitized (es_stdout, iter->name, strlen(iter->name),
+                                  ":", NULL);
+             es_putc (':', es_stdout);
 
              for(sl=iter->values;sl;sl=sl->next)
                {
@@ -1513,7 +1520,7 @@ list_config(char *items)
       if(show_all || ascii_strcasecmp(name,"version")==0)
        {
          printf("cfg:version:");
-         print_string(stdout,VERSION,strlen(VERSION),':');
+         es_write_sanitized (es_stdout, VERSION, strlen(VERSION), ":", NULL);
          printf("\n");
          any=1;
        }
@@ -1795,33 +1802,6 @@ parse_trust_model(const char *model)
 }
 
 
-/* Pack an s2k iteration count into the form specified in 2440.  If
-   we're in between valid values, round up. */
-static unsigned char
-encode_s2k_iterations(int iterations)
-{
-  unsigned char c=0,result;
-  unsigned int count;
-
-  if(iterations<=1024)
-    return 0;
-
-  if(iterations>=65011712)
-    return 255;
-
-  /* Need count to be in the range 16-31 */
-  for(count=iterations>>6;count>=32;count>>=1)
-    c++;
-
-  result=(c<<4)|(count-16);
-
-  if(S2K_DECODE_COUNT(result)<iterations)
-    result++;
-
-  return result;
-}
-
-
 /* This fucntion called to initialized a new control object.  It is
    assumed that this object has been zeroed out before calling this
    function. */
@@ -1910,7 +1890,7 @@ main (int argc, char **argv)
     char *username;
     int may_coredump;
     strlist_t sl, remusr= NULL, locusr=NULL;
-    strlist_t nrings=NULL, sec_nrings=NULL;
+    strlist_t nrings = NULL;
     armor_filter_context_t *afx = NULL;
     int detached_sig = 0;
     FILE *configfp = NULL;
@@ -1962,7 +1942,7 @@ main (int argc, char **argv)
 
     /* Make sure that our subsystems are ready.  */
     i18n_init();
-    init_common_subsystems ();
+    init_common_subsystems (&argc, &argv);
 
     /* Check that the libraries are suitable.  Do it right here because the
        option parsing may need services of the library.  */
@@ -1995,7 +1975,7 @@ main (int argc, char **argv)
     opt.cert_digest_algo = 0;
     opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
     opt.s2k_mode = 3; /* iterated+salted */
-    opt.s2k_count = 96; /* 65536 iterations */
+    opt.s2k_count = 0; /* Auto-calibrate when needed.  */
 #ifdef USE_CAST5
     opt.s2k_cipher_algo = CIPHER_ALGO_CAST5;
 #else
@@ -2023,7 +2003,7 @@ main (int argc, char **argv)
     opt.def_sig_expire="0";
     opt.def_cert_expire="0";
     set_homedir ( default_homedir () );
-    opt.passwd_repeat=1;
+    opt.passphrase_repeat=1;
 
     /* Check whether we have a config file on the command line.  */
     orig_argc = argc;
@@ -2094,8 +2074,8 @@ main (int argc, char **argv)
     malloc_hooks.realloc = gcry_realloc;
     malloc_hooks.free = gcry_free;
     assuan_set_malloc_hooks (&malloc_hooks);
-    assuan_set_assuan_log_prefix (log_get_prefix (NULL));
     assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
+    setup_libassuan_logging (&opt.debug);
  
     /* Try for a version specific config file first */
     default_configname = get_default_configname ();
@@ -2130,7 +2110,7 @@ main (int argc, char **argv)
           {
             fclose (configfp);
             configfp = NULL;
-            errno = EPERM;
+            gpg_err_set_errno (EPERM);
           }
        if( !configfp ) {
            if( default_config ) {
@@ -2208,6 +2188,7 @@ main (int argc, char **argv)
          case aDeleteSecretKeys:
          case aDeleteSecretAndPublicKeys:
          case aDeleteKeys:
+          case aPasswd:
             set_cmd (&cmd, pargs.r_opt);
             greeting=1;
             break;
@@ -2302,8 +2283,9 @@ main (int argc, char **argv)
             break;
 
          case oSecretKeyring:
-            append_to_strlist( &sec_nrings, pargs.r.ret_str);
+            /* Ignore this old option.  */
             break;
+
          case oOptions:
            /* config files may not be nested (silently ignore them) */
            if( !configfp ) {
@@ -2518,7 +2500,10 @@ main (int argc, char **argv)
          case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
          case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
          case oS2KCount:
-           opt.s2k_count=encode_s2k_iterations(pargs.r.ret_int);
+           if (pargs.r.ret_int)
+              opt.s2k_count = encode_s2k_iterations (pargs.r.ret_int);
+            else
+              opt.s2k_count = 0;  /* Auto-calibrate when needed.  */
            break;
           case oSimpleSKChecksum: opt.simple_sk_checksum = 1; break;
          case oNoEncryptTo: opt.no_encrypt_to = 1; break;
@@ -2582,16 +2567,16 @@ main (int argc, char **argv)
          case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
          case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
          case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
-         case oPasswd:
+         case oPassphrase:
            set_passphrase_from_string(pargs.r.ret_str);
            break;
-         case oPasswdFD:
+         case oPassphraseFD:
             pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
             break;
-         case oPasswdFile:
+         case oPassphraseFile:
             pwfd = open_info_file (pargs.r.ret_str, 0, 1);
             break;
-         case oPasswdRepeat: opt.passwd_repeat=pargs.r.ret_int; break;
+         case oPassphraseRepeat: opt.passphrase_repeat=pargs.r.ret_int; break;
          case oCommandFD:
             opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0);
             break;
@@ -3401,22 +3386,12 @@ main (int argc, char **argv)
     if( ALWAYS_ADD_KEYRINGS 
         || (cmd != aDeArmor && cmd != aEnArmor && cmd != aGPGConfTest) ) 
       {
-        if (ALWAYS_ADD_KEYRINGS
-            || (cmd != aCheckKeys && cmd != aListSigs && cmd != aListKeys
-                && cmd != aVerify && cmd != aSym && cmd != aLocateKeys))
-          {
-            if (!sec_nrings || default_keyring) /* add default secret rings */
-              keydb_add_resource ("secring" EXTSEP_S "gpg", 4, 1);
-            for (sl = sec_nrings; sl; sl = sl->next)
-              keydb_add_resource ( sl->d, 0, 1 );
-          }
-       if( !nrings || default_keyring )  /* add default ring */
-           keydb_add_resource ("pubring" EXTSEP_S "gpg", 4, 0);
-       for(sl = nrings; sl; sl = sl->next )
-           keydb_add_resource ( sl->d, sl->flags, 0 );
+       if (!nrings || default_keyring)  /* Add default ring. */
+           keydb_add_resource ("pubring" EXTSEP_S "gpg", 4);
+       for (sl = nrings; sl; sl = sl->next )
+          keydb_add_resource (sl->d, sl->flags);
       }
     FREE_STRLIST(nrings);
-    FREE_STRLIST(sec_nrings);
 
     if (cmd == aGPGConfTest)
       g10_exit(0);
@@ -3665,6 +3640,17 @@ main (int argc, char **argv)
        xfree(username);
        break;
 
+      case aPasswd:
+        if (argc != 1)
+          wrong_args (_("--passwd <user-id>"));
+        else
+          {
+            username = make_username (fname);
+            keyedit_passwd (username);
+            xfree (username);
+          }
+        break;
+
       case aDeleteKeys:
       case aDeleteSecretKeys:
       case aDeleteSecretAndPublicKeys:
@@ -3836,29 +3822,30 @@ main (int argc, char **argv)
        {   int mode = argc < 2 ? 0 : atoi(*argv);
 
            if( mode == 1 && argc == 2 ) {
-               mpi_print( stdout, generate_public_prime( atoi(argv[1]) ), 1);
+               mpi_print (es_stdout,
+                           generate_public_prime( atoi(argv[1]) ), 1);
            }
            else if( mode == 2 && argc == 3 ) {
-               mpi_printstdout, generate_elg_prime(
+               mpi_print (es_stdout, generate_elg_prime(
                                             0, atoi(argv[1]),
                                             atoi(argv[2]), NULL,NULL ), 1);
            }
            else if( mode == 3 && argc == 3 ) {
                MPI *factors;
-               mpi_printstdout, generate_elg_prime(
+               mpi_print (es_stdout, generate_elg_prime(
                                             1, atoi(argv[1]),
                                             atoi(argv[2]), NULL,&factors ), 1);
                putchar('\n');
-               mpi_printstdout, factors[0], 1 ); /* print q */
+               mpi_print (es_stdout, factors[0], 1 ); /* print q */
            }
            else if( mode == 4 && argc == 3 ) {
                MPI g = mpi_alloc(1);
-               mpi_printstdout, generate_elg_prime(
+               mpi_print (es_stdout, generate_elg_prime(
                                                 0, atoi(argv[1]),
                                                 atoi(argv[2]), g, NULL ), 1);
                putchar('\n');
-               mpi_printstdout, g, 1 );
-               mpi_free(g);
+               mpi_print (es_stdout, g, 1 );
+               mpi_free (g);
            }
            else
                wrong_args("--gen-prime mode bits [qbits] ");
@@ -3995,7 +3982,7 @@ main (int argc, char **argv)
       case aCardStatus:
         if (argc)
             wrong_args ("--card-status");
-        card_status (stdout, NULL, 0);
+        card_status (es_stdout, NULL, 0);
         break;
 
       case aCardEdit:
@@ -4034,8 +4021,10 @@ main (int argc, char **argv)
        if( argc > 1 )
            wrong_args(_("[filename]"));
        /* Issue some output for the unix newbie */
-       if( !fname && !opt.outfile && isatty( fileno(stdin) )
-               && isatty( fileno(stdout) ) && isatty( fileno(stderr) ) )
+       if (!fname && !opt.outfile
+            && gnupg_isatty (fileno (stdin))
+            && gnupg_isatty (fileno (stdout))
+            && gnupg_isatty (fileno (stderr)))
            log_info(_("Go ahead and type your message ...\n"));
 
        a = iobuf_open(fname);
@@ -4043,7 +4032,7 @@ main (int argc, char **argv)
           {
             iobuf_close (a);
             a = NULL;
-            errno = EPERM;
+            gpg_err_set_errno (EPERM);
           }
        if( !a )
            log_error(_("can't open `%s'\n"), print_fname_stdin(fname));
@@ -4230,7 +4219,7 @@ print_mds( const char *fname, int algo )
           {
             fclose (fp);
             fp = NULL;
-            errno = EPERM;
+            gpg_err_set_errno (EPERM);
           }
     }
     if( !fp ) {