Changes to make use of code taken from libassuan. This replaces the
[gnupg.git] / g10 / g10.c
index 2a17214..fefb8ab 100644 (file)
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -1,6 +1,6 @@
 /* g10.c - The GnuPG utility (main for gpg)
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
- *               2004 Free Software Foundation, Inc.
+ *               2004, 2005 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -108,8 +108,6 @@ enum cmd_and_opt_values
     aSignSym,
     aSignKey,
     aLSignKey,
-    aNRSignKey,
-    aNRLSignKey,
     aListConfig,
     aGPGConfList,
     aListPackets,
@@ -203,6 +201,8 @@ enum cmd_and_opt_values
     oPGP6,
     oPGP7,
     oPGP8,
+    oRFC2440Text,
+    oNoRFC2440Text,
     oCipherAlgo,
     oDigestAlgo,
     oCertDigestAlgo,
@@ -218,6 +218,8 @@ enum cmd_and_opt_values
     oNoVerbose,
     oTrustDBName,
     oNoSecmemWarn,
+    oRequireSecmem,
+    oNoRequireSecmem,
     oNoPermissionWarn,
     oNoMDCWarn,
     oNoArmor,
@@ -380,8 +382,6 @@ static ARGPARSE_OPTS opts[] = {
                                    N_("remove keys from the secret keyring")},
     { aSignKey,  "sign-key"   ,256, N_("sign a key")},
     { aLSignKey, "lsign-key"  ,256, N_("sign a key locally")},
-    { aNRSignKey, "nrsign-key"  ,256, "@"},
-    { aNRLSignKey, "nrlsign-key"  ,256, "@"},
     { aEditKey,  "edit-key"   ,256, N_("sign or edit a key")},
     { aGenRevoke, "gen-revoke",256, N_("generate a revocation certificate")},
     { aDesigRevoke, "desig-revoke",256, "@" },
@@ -509,6 +509,8 @@ static ARGPARSE_OPTS opts[] = {
     { oPGP6, "pgp6", 0, "@"},
     { oPGP7, "pgp7", 0, "@"},
     { oPGP8, "pgp8", 0, "@"},
+    { oRFC2440Text, "rfc2440-text", 0, "@"},
+    { oNoRFC2440Text, "no-rfc2440-text", 0, "@"},
     { oS2KMode, "s2k-mode", 1, "@"},
     { oS2KDigest, "s2k-digest-algo", 2, "@"},
     { oS2KCipher, "s2k-cipher-algo", 2, "@"},
@@ -517,6 +519,7 @@ static ARGPARSE_OPTS opts[] = {
     { oDigestAlgo, "digest-algo", 2, "@"},
     { oCertDigestAlgo, "cert-digest-algo", 2 , "@" },
     { oCompressAlgo,"compress-algo", 2, "@"},
+    { oCompressAlgo, "compression-algo", 2, "@"}, /* Alias */
     { oThrowKeyids, "throw-keyid", 0, "@"},
     { oThrowKeyids, "throw-keyids", 0, "@"},
     { oNoThrowKeyids, "no-throw-keyid", 0, "@" },
@@ -542,7 +545,6 @@ static ARGPARSE_OPTS opts[] = {
 
   /* hidden options */
     { aListOwnerTrust, "list-ownertrust", 256, "@"}, /* deprecated */
-    { oCompressAlgo, "compression-algo", 1, "@"}, /* alias */
     { aPrintMDs, "print-mds" , 256, "@"}, /* old */
     { aListTrustDB, "list-trustdb",0 , "@"},
     /* Not yet used */
@@ -557,6 +559,8 @@ static ARGPARSE_OPTS opts[] = {
     { oNoVerbose, "no-verbose", 0, "@"},
     { oTrustDBName, "trustdb-name", 2, "@" },
     { oNoSecmemWarn, "no-secmem-warning", 0, "@" },
+    { oRequireSecmem,"require-secmem", 0, "@" },
+    { oNoRequireSecmem,"no-require-secmem", 0, "@" },
     { oNoPermissionWarn, "no-permission-warning", 0, "@" },
     { oNoMDCWarn, "no-mdc-warning", 0, "@" },
     { oNoArmor, "no-armor",   0, "@"},
@@ -835,7 +839,7 @@ static void
 i18n_init(void)
 {
 #ifdef USE_SIMPLE_GETTEXT
-    set_gettext_file( PACKAGE );
+    set_gettext_file (PACKAGE, "Software\\GNU\\GnuPG");
 #else
 #ifdef ENABLE_NLS
     setlocale( LC_ALL, "" );
@@ -1614,6 +1618,7 @@ main( int argc, char **argv )
     int pwfd = -1;
     int with_fpr = 0; /* make an option out of --fingerprint */
     int any_explicit_recipient = 0;
+    int require_secmem=0,got_secmem=0;
 #ifdef USE_SHM_COPROCESSING
     ulong requested_shm_size=0;
 #endif
@@ -1667,14 +1672,8 @@ main( int argc, char **argv )
     opt.min_cert_level=2;
     set_screen_dimensions();
     opt.keyid_format=KF_SHORT;
-#if defined (_WIN32)
-    set_homedir ( read_w32_registry_string( NULL,
-                                    "Software\\GNU\\GnuPG", "HomeDir" ));
-#else
-    set_homedir ( getenv("GNUPGHOME") );
-#endif
-    if( !*opt.homedir )
-       set_homedir ( GNUPG_HOMEDIR );
+    opt.rfc2440_text=1;
+    set_homedir ( default_homedir () );
 
 #ifdef ENABLE_CARD_SUPPORT
 # ifdef _WIN32
@@ -1746,7 +1745,7 @@ main( int argc, char **argv )
     }
 #endif
     /* initialize the secure memory. */
-    secmem_init( 32768 );
+    got_secmem=secmem_init( 32768 );
     maybe_setuid = 0;
     /* Okay, we are now working under our real uid */
 
@@ -1899,8 +1898,6 @@ main( int argc, char **argv )
          case aKeygen: set_cmd( &cmd, aKeygen); greeting=1; break;
          case aSignKey: set_cmd( &cmd, aSignKey); break;
          case aLSignKey: set_cmd( &cmd, aLSignKey); break;
-         case aNRSignKey: set_cmd( &cmd, aNRSignKey); break;
-         case aNRLSignKey: set_cmd( &cmd, aNRLSignKey); break;
          case aStore: set_cmd( &cmd, aStore); break;
          case aEditKey: set_cmd( &cmd, aEditKey); greeting=1; break;
          case aClearsign: set_cmd( &cmd, aClearsign); break;
@@ -2091,17 +2088,18 @@ main( int argc, char **argv )
            opt.force_v4_certs = 0;
            opt.escape_from = 1;
            break;
-         case oRFC2440:
          case oOpenPGP:
-           /* TODO: When 2440bis becomes a RFC, these may need
-               changing. */
+         case oRFC2440:
+           /* TODO: When 2440bis becomes a RFC, set new values for
+              oOpenPGP. */
+           opt.rfc2440_text=1;
            opt.compliance = CO_RFC2440;
            opt.allow_non_selfsigned_uid = 1;
            opt.allow_freeform_uid = 1;
            opt.pgp2_workarounds = 0;
            opt.escape_from = 0;
            opt.force_v3_sigs = 0;
-           opt.compress_keys = 0;          /* not mandated  but we do it */
+           opt.compress_keys = 0;          /* not mandated, but we do it */
            opt.compress_sigs = 0;          /* ditto. */
            opt.not_dash_escaped = 0;
            opt.def_cipher_algo = 0;
@@ -2118,6 +2116,8 @@ main( int argc, char **argv )
          case oPGP8:  opt.compliance = CO_PGP8;  break;
          case oGnuPG: opt.compliance = CO_GNUPG; break;
          case oCompressSigs: opt.compress_sigs = 1; break;
+         case oRFC2440Text: opt.rfc2440_text=1; break;
+         case oNoRFC2440Text: opt.rfc2440_text=0; break;
          case oRunAsShmCP:
 #ifndef __riscos__
 # ifndef USE_SHM_COPROCESSING
@@ -2284,6 +2284,8 @@ main( int argc, char **argv )
            break;
          case oCertDigestAlgo: cert_digest_string = m_strdup(pargs.r.ret_str); break;
          case oNoSecmemWarn: secmem_set_flags( secmem_get_flags() | 1 ); break;
+         case oRequireSecmem: require_secmem=1; break;
+         case oNoRequireSecmem: require_secmem=0; break;
          case oNoPermissionWarn: opt.no_perm_warn=1; break;
          case oNoMDCWarn: opt.no_mdc_warn=1; break;
           case oDisplayCharset:
@@ -2377,7 +2379,7 @@ main( int argc, char **argv )
            break;
          case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
          case oExecPath:
-           if(set_exec_path(pargs.r.ret_str,0))
+           if(set_exec_path(pargs.r.ret_str))
              log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
            else
              opt.exec_path_set=1;
@@ -2589,6 +2591,14 @@ main( int argc, char **argv )
                        "--no-literal" );
     }
 
+#ifndef ENABLE_AGENT_SUPPORT   
+    if (opt.use_agent) {
+      log_info(_("NOTE: %s is not available in this version\n"),
+               "--use-agent");
+      opt.use_agent = 0;
+    }
+#endif /*!ENABLE_AGENT_SUPPORT*/
+
     if (opt.set_filesize)
        log_info(_("NOTE: %s is not for normal use!\n"), "--set-filesize");
     if( opt.batch )
@@ -2596,6 +2606,13 @@ main( int argc, char **argv )
 
     secmem_set_flags( secmem_get_flags() & ~2 ); /* resume warnings */
 
+    if(require_secmem && !got_secmem)
+      {
+       log_info(_("will not run with insecure memory due to %s\n"),
+                "--require-secmem");
+       g10_exit(2);
+      }
+
     set_debug();
 
     /* Do these after the switch(), so they can override settings. */
@@ -2915,7 +2932,7 @@ main( int argc, char **argv )
        case the secrings are stored on a floppy.
        
        We always need to add the keyrings if we are running under
-       SELinux, thi is so that the rings are added to the list of
+       SELinux, this is so that the rings are added to the list of
        secured files. */
     if( ALWAYS_ADD_KEYRINGS 
         || (cmd != aDeArmor && cmd != aEnArmor
@@ -2926,12 +2943,12 @@ main( int argc, char **argv )
                 && cmd != aVerify && cmd != aSym))
           {
             if (!sec_nrings || default_keyring) /* add default secret rings */
-              keydb_add_resource ("secring" EXTSEP_S "gpg", 0, 1);
+              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", 0, 0);
+           keydb_add_resource ("pubring" EXTSEP_S "gpg", 4, 0);
        for(sl = nrings; sl; sl = sl->next )
            keydb_add_resource ( sl->d, sl->flags, 0 );
       }
@@ -3136,13 +3153,6 @@ main( int argc, char **argv )
        if( argc != 1 )
          wrong_args(_("--lsign-key user-id"));
        /* fall through */
-      case aNRSignKey:
-       if( argc != 1 )
-         wrong_args(_("--nrsign-key user-id"));
-       /* fall through */
-      case aNRLSignKey:
-       if( argc != 1 )
-         wrong_args(_("--nrlsign-key user-id"));
 
        sl=NULL;
 
@@ -3150,10 +3160,6 @@ main( int argc, char **argv )
          append_to_strlist(&sl,"sign");
        else if(cmd==aLSignKey)
          append_to_strlist(&sl,"lsign");
-       else if(cmd==aNRSignKey)
-         append_to_strlist(&sl,"nrsign");
-       else if(cmd==aNRLSignKey)
-         append_to_strlist(&sl,"nrlsign");
        else
          BUG();