From f5551672fb82af31a22e3b649cd270a467dbadd9 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 11 May 2010 18:00:31 +0000 Subject: [PATCH] Update tests. --- agent/ChangeLog | 9 ++++++ agent/agent.h | 3 ++ agent/command.c | 50 +++++++++++++++++++++++-------- agent/gpg-agent.c | 21 ++++++------- doc/gpg-agent.texi | 15 +++++----- tests/openpgp/ChangeLog | 12 +++++++- tests/openpgp/Makefile.am | 8 +++-- tests/openpgp/defs.inc | 24 +++++++++++---- tests/openpgp/genkey1024.test | 4 +-- tests/openpgp/gpg-agent.conf.tmpl | 2 ++ 10 files changed, 106 insertions(+), 42 deletions(-) create mode 100644 tests/openpgp/gpg-agent.conf.tmpl diff --git a/agent/ChangeLog b/agent/ChangeLog index 830b4c2c1..35ea9e038 100644 --- a/agent/ChangeLog +++ b/agent/ChangeLog @@ -1,3 +1,12 @@ +2010-05-11 Werner Koch + + * agent.h (opt): Add field USE_STANDARD_SOCKET. + * gpg-agent.c (use_standard_socket): Remove. Use new option instead. + + * command.c (cmd_killagent, cmd_reloadagent): Provide command also + for non-W32 platforms. + (cmd_getinfo): New subcommands std_session_env and std_startup_env. + 2010-05-03 Werner Koch * gpg-agent.c (check_own_socket_thread): Do not release SOCKNAME diff --git a/agent/agent.h b/agent/agent.h index 3f0c19561..09519d48b 100644 --- a/agent/agent.h +++ b/agent/agent.h @@ -55,6 +55,9 @@ struct int batch; /* Batch mode */ const char *homedir; /* Configuration directory name */ + /* True if we are listening on the standard socket. */ + int use_standard_socket; + /* Environment setting gathered at program start or changed using the Assuan command UPDATESTARTUPTTY. */ session_env_t startup_env; diff --git a/agent/command.c b/agent/command.c index b78dc07d9..082e730bd 100644 --- a/agent/command.c +++ b/agent/command.c @@ -59,10 +59,8 @@ struct server_local_s char *keydesc; /* Allocated description for the next key operation. */ int pause_io_logging; /* Used to suppress I/O logging during a command */ -#ifdef HAVE_W32_SYSTEM int stopme; /* If set to true the agent will be terminated after the end of this session. */ -#endif int allow_pinentry_notify; /* Set if pinentry notifications should be done. */ }; @@ -1591,18 +1589,20 @@ cmd_updatestartuptty (assuan_context_t ctx, char *line) -#ifdef HAVE_W32_SYSTEM static const char hlp_killagent[] = "KILLAGENT\n" "\n" - "Under Windows we start the agent on the fly. Thus it also make\n" - "sense to allow a client to stop the agent."; + "If the agent has been started using a standard socket\n" + "we allow a client to stop the agent."; static gpg_error_t cmd_killagent (assuan_context_t ctx, char *line) { ctrl_t ctrl = assuan_get_pointer (ctx); (void)line; + + if (!opt.use_standard_socket) + return set_error (GPG_ERR_NOT_SUPPORTED, "no --use-standard-socket"); ctrl->server_local->stopme = 1; return gpg_error (GPG_ERR_EOF); @@ -1612,8 +1612,8 @@ cmd_killagent (assuan_context_t ctx, char *line) static const char hlp_reloadagent[] = "RELOADAGENT\n" "\n" - "As signals are inconvenient under Windows, we provide this command\n" - "to allow reloading of the configuration."; + "This command is an alternative to SIGHUP\n" + "to reload the configuration."; static gpg_error_t cmd_reloadagent (assuan_context_t ctx, char *line) { @@ -1623,7 +1623,6 @@ cmd_reloadagent (assuan_context_t ctx, char *line) agent_sighup_action (); return 0; } -#endif /*HAVE_W32_SYSTEM*/ @@ -1639,11 +1638,14 @@ static const char hlp_getinfo[] = " ssh_socket_name - Return the name of the ssh socket.\n" " scd_running - Return OK if the SCdaemon is already running.\n" " s2k_count - Return the calibrated S2K count.\n" + " std_session_env - List the standard session environment.\n" + " std_startup_env - List the standard startup environment.\n" " cmd_has_option\n" " - Returns OK if the command CMD implements the option OPT."; static gpg_error_t cmd_getinfo (assuan_context_t ctx, char *line) { + ctrl_t ctrl = assuan_get_pointer (ctx); int rc = 0; if (!strcmp (line, "version")) @@ -1687,6 +1689,34 @@ cmd_getinfo (assuan_context_t ctx, char *line) snprintf (numbuf, sizeof numbuf, "%lu", get_standard_s2k_count ()); rc = assuan_send_data (ctx, numbuf, strlen (numbuf)); } + else if (!strcmp (line, "std_session_env") + || !strcmp (line, "std_startup_env")) + { + int iterator; + const char *name, *value; + char *string; + + iterator = 0; + while ((name = session_env_list_stdenvnames (&iterator, NULL))) + { + value = session_env_getenv_or_default + (line[5] == 't'? opt.startup_env:ctrl->session_env, name, NULL); + if (value) + { + string = xtryasprintf ("%s=%s", name, value); + if (!string) + rc = gpg_error_from_syserror (); + else + { + rc = assuan_send_data (ctx, string, strlen (string)+1); + if (!rc) + rc = assuan_send_data (ctx, NULL, 0); + } + if (rc) + break; + } + } + } else if (!strncmp (line, "cmd_has_option", 14) && (line[14] == ' ' || line[14] == '\t' || !line[14])) { @@ -1883,10 +1913,8 @@ register_commands (assuan_context_t ctx) { "GETVAL", cmd_getval, hlp_getval }, { "PUTVAL", cmd_putval, hlp_putval }, { "UPDATESTARTUPTTY", cmd_updatestartuptty, hlp_updatestartuptty }, -#ifdef HAVE_W32_SYSTEM { "KILLAGENT", cmd_killagent, hlp_killagent }, { "RELOADAGENT", cmd_reloadagent,hlp_reloadagent }, -#endif { "GETINFO", cmd_getinfo, hlp_getinfo }, { NULL } }; @@ -1993,10 +2021,8 @@ start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd) /* Cleanup. */ assuan_release (ctx); -#ifdef HAVE_W32_SYSTEM if (ctrl->server_local->stopme) agent_exit (0); -#endif xfree (ctrl->server_local); ctrl->server_local = NULL; } diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 6d96b5223..35871ab9a 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -219,9 +219,6 @@ static int shutdown_pending; /* Counter for the currently running own socket checks. */ static int check_own_socket_running; -/* True if we are listening on the standard socket. */ -static int use_standard_socket; - /* It is possible that we are currently running under setuid permissions */ static int maybe_setuid = 1; @@ -631,7 +628,7 @@ main (int argc, char **argv ) /* Set default options. */ parse_rereadable_options (NULL, 0); /* Reset them to default values. */ #ifdef USE_STANDARD_SOCKET - use_standard_socket = 1; + opt.use_standard_socket = 1; #endif shell = getenv ("SHELL"); @@ -782,8 +779,8 @@ main (int argc, char **argv ) case oXauthority: default_xauthority = xstrdup (pargs.r.ret_str); break; - case oUseStandardSocket: use_standard_socket = 1; break; - case oNoUseStandardSocket: use_standard_socket = 0; break; + case oUseStandardSocket: opt.use_standard_socket = 1; break; + case oNoUseStandardSocket: opt.use_standard_socket = 0; break; case oFakedSystemTime: { @@ -862,9 +859,9 @@ main (int argc, char **argv ) if (gpgconf_list == 3) { - if (use_standard_socket && !opt.quiet) + if (opt.use_standard_socket && !opt.quiet) log_info ("configured to use the standard socket\n"); - agent_exit (!use_standard_socket); + agent_exit (!opt.use_standard_socket); } else if (gpgconf_list == 2) agent_exit (0); @@ -1438,7 +1435,7 @@ create_socket_name (char *standard_name, char *template) { char *name, *p; - if (use_standard_socket) + if (opt.use_standard_socket) name = make_filename (opt.homedir, standard_name, NULL); else { @@ -1504,7 +1501,7 @@ create_server_socket (char *name, int is_ssh, assuan_sock_nonce_t *nonce) /* Our error code mapping on W32CE returns EEXIST thus we also test for this. */ - if (use_standard_socket && rc == -1 + if (opt.use_standard_socket && rc == -1 && (errno == EADDRINUSE #ifdef HAVE_W32_SYSTEM || errno == EEXIST @@ -1542,7 +1539,7 @@ create_server_socket (char *name, int is_ssh, assuan_sock_nonce_t *nonce) gpg_strerror (gpg_error_from_errno (errno))); assuan_sock_close (fd); - if (use_standard_socket) + if (opt.use_standard_socket) *name = 0; /* Inhibit removal of the socket by cleanup(). */ agent_exit (2); } @@ -2169,7 +2166,7 @@ check_own_socket (void) char *sockname; pth_attr_t tattr; - if (!use_standard_socket) + if (!opt.use_standard_socket) return; /* This check makes only sense in standard socket mode. */ if (check_own_socket_running || shutdown_pending) diff --git a/doc/gpg-agent.texi b/doc/gpg-agent.texi index bd47eb1ce..7a1757d6c 100644 --- a/doc/gpg-agent.texi +++ b/doc/gpg-agent.texi @@ -433,13 +433,14 @@ named @file{S.gpg-agent}, located in the home directory, and not create a random socket below a temporary directory. Tools connecting to @command{gpg-agent} should first try to connect to the socket given in environment variable @var{GPG_AGENT_INFO} and then fall back to this -socket. This option may not be used if the home directory is mounted as -a remote file system. Note, that @option{--use-standard-socket} is the -default on Windows systems. The default may be changed at build time. -It is possible to test at runtime whether the agent has been configured -for use with the standard socket by issuing the command -@command{gpg-agent --use-standard-socket-p} which returns success if the -standard socket option has been enabled. +socket. This option may not be used if the home directory is mounted on +a remote file system which does not support special files like fifos or +sockets. Note, that @option{--use-standard-socket} is the default on +Windows systems. The default may be changed at build time. It is +possible to test at runtime whether the agent has been configured for +use with the standard socket by issuing the command @command{gpg-agent +--use-standard-socket-p} which returns success if the standard socket +option has been enabled. @item --display @var{string} @itemx --ttyname @var{string} diff --git a/tests/openpgp/ChangeLog b/tests/openpgp/ChangeLog index 68a9671c9..c3c5aa8f5 100644 --- a/tests/openpgp/ChangeLog +++ b/tests/openpgp/ChangeLog @@ -1,3 +1,13 @@ +2010-05-11 Werner Koch + + * genkey1024.test: Use GPG macro. + + * gpg-agent.conf.tmpl: New. + * defs.inc: Create gpg-agent.conf + (GNUPGHOME): Set and export. + (GPG_AGENT_INFO): Unset. + * Makefile.am (CLEANFILES): Add S.gpg-agent + 2010-05-07 Werner Koch * import.test: Add test case for bug#1223. @@ -48,7 +58,7 @@ we support. This is safer than the previous setup which could hide that some ciphers weren't being tested. Plus, this automatically tests any new ciphers libgcrypt supports. - (all_hash_algos): New. + (all_hash_algos): New. * sigs.test: Use it here, and also test with >=160 bit hashes for DSA2. * conventional.test, encrypt.test, encrypt-dsa.test, diff --git a/tests/openpgp/Makefile.am b/tests/openpgp/Makefile.am index 9356cb376..fcce0e32a 100644 --- a/tests/openpgp/Makefile.am +++ b/tests/openpgp/Makefile.am @@ -40,16 +40,20 @@ TESTS = version.test mds.test \ TEST_FILES = pubring.asc secring.asc plain-1o.asc plain-2o.asc plain-3o.asc \ plain-1.asc plain-2.asc plain-3.asc plain-1-pgp.asc \ pubring.pkr.asc secring.skr.asc secdemo.asc pubdemo.asc \ - gpg.conf.tmpl bug537-test.data.asc bug894-test.asc \ + gpg.conf.tmpl gpg-agent.conf.tmpl \ + bug537-test.data.asc bug894-test.asc \ bug1223-good.asc bug1223-bogus.asc DATA_FILES = data-500 data-9000 data-32000 data-80000 plain-large EXTRA_DIST = defs.inc $(TESTS) $(TEST_FILES) \ mkdemodirs signdemokey + +# Note that removing S.gpg-agent forces a running gpg-agent to +# terminate after some time. CLEANFILES = prepared.stamp x y yy z out err $(DATA_FILES) \ plain-1 plain-2 plain-3 trustdb.gpg *.lock .\#lk* \ - *.test.log gpg_dearmor gpg.conf \ + *.test.log gpg_dearmor gpg.conf gpg-agent.conf S.gpg-agent \ pubring.gpg secring.gpg pubring.pkr secring.skr DISTCLEANFILES = pubring.gpg~ random_seed diff --git a/tests/openpgp/defs.inc b/tests/openpgp/defs.inc index 2a7683eb6..da7ee3020 100755 --- a/tests/openpgp/defs.inc +++ b/tests/openpgp/defs.inc @@ -162,13 +162,25 @@ pgmname=`basename $0` [ -z "$srcdir" ] && fatal "not called from make" # Make sure we have a valid option files even with VPATH builds. -if [ -f ./gpg.conf ]; then - : -elif [ -f $srcdir/gpg.conf.tmpl ]; then - cat $srcdir/gpg.conf.tmpl >gpg.conf -fi +for f in gpg.conf gpg-agent.conf; do + if [ -f ./$f ]; then + : + elif [ -f $srcdir/$f.tmpl ]; then + cat $srcdir/$f.tmpl >$f + fi +done -GPG="../../g10/gpg2 --no-permission-warning --homedir . " +# Always work in the current directory +GNUPGHOME=`pwd` +export GNUPGHOME + +# We do not use an external info variable for gpg-agent because we use +# a standard socket in the home directory. This way gpg-agent will be +# started as soon as needed. It is terminated indirectly using a +# Makefile rule. +GPG_AGENT_INFO= + +GPG="../../g10/gpg2 --no-permission-warning " exec 5>&2 2>${pgmname}.log diff --git a/tests/openpgp/genkey1024.test b/tests/openpgp/genkey1024.test index 74c036667..b7f9c1987 100755 --- a/tests/openpgp/genkey1024.test +++ b/tests/openpgp/genkey1024.test @@ -10,7 +10,7 @@ . $srcdir/defs.inc || exit 3 -../../g10/gpg2 --quiet --batch --debug-quick-random --homedir . --gen-key <