diff --git a/agent/ChangeLog b/agent/ChangeLog index 06d7b85bf..cd19f35cf 100644 --- a/agent/ChangeLog +++ b/agent/ChangeLog @@ -1,3 +1,11 @@ +2007-02-14 Werner Koch + + * gpg-agent.c: New option --pinentry-touch-file. + (get_agent_socket_name): New. + * agent.h (opt): Add pinentry_touch_file. + * call-pinentry.c (start_pinentry): Send new option to the + pinentry. + 2007-01-31 Moritz Schulte (wk) * command-ssh.c (stream_read_string): Initialize LENGTH to zero. diff --git a/agent/agent.h b/agent/agent.h index c86ec1e5f..15830de27 100644 --- a/agent/agent.h +++ b/agent/agent.h @@ -72,6 +72,10 @@ struct int disable_scdaemon; /* Never use the SCdaemon. */ int no_grab; /* Don't let the pinentry grab the keyboard */ + /* The name of the file pinentry shall tocuh before exiting. If + this is not set the filoe name of the standard socket is used. */ + const char *pinentry_touch_file; + /* The default and maximum TTL of cache entries. */ unsigned long def_cache_ttl; /* Default. */ unsigned long def_cache_ttl_ssh; /* for SSH. */ @@ -186,6 +190,7 @@ cache_mode_t; /*-- gpg-agent.c --*/ void agent_exit (int rc) JNLIB_GCC_A_NR; /* Also implemented in other tools */ +const char *get_agent_socket_name (void); /*-- command.c --*/ gpg_error_t agent_write_status (ctrl_t ctrl, const char *keyword, ...); diff --git a/agent/call-pinentry.c b/agent/call-pinentry.c index bb3b5deb5..8b527b2d5 100644 --- a/agent/call-pinentry.c +++ b/agent/call-pinentry.c @@ -181,6 +181,7 @@ start_pinentry (ctrl_t ctrl) int no_close_list[3]; int i; pth_event_t evt; + const char *tmpstr; evt = pth_event (PTH_EVENT_TIME, pth_timeout (LOCK_TIMEOUT, 0)); if (!pth_mutex_acquire (&entry_lock, 0, evt)) @@ -297,6 +298,30 @@ start_pinentry (ctrl_t ctrl) if (rc) return unlock_pinentry (rc); } + + + /* Tell the pinentry the name of a file it shall touch after having + messed with the tty. This is optional and only supported by + newer pinentries and thus we do no error checking. */ + tmpstr = opt.pinentry_touch_file; + if (tmpstr && !strcmp (tmpstr, "/dev/null")) + tmpstr = NULL; + else if (!tmpstr) + tmpstr = get_agent_socket_name (); + if (tmpstr) + { + char *optstr; + + if (asprintf (&optstr, "OPTION touch-file=%s", tmpstr ) < 0 ) + ; + else + { + assuan_transact (entry_ctx, optstr, NULL, NULL, NULL, NULL, NULL, + NULL); + free (optstr); + } + } + return 0; } diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 72a4013d6..c88e22cc1 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -78,6 +78,7 @@ enum cmd_and_opt_values oBatch, oPinentryProgram, + oPinentryTouchFile, oDisplay, oTTYname, oTTYtype, @@ -131,6 +132,7 @@ static ARGPARSE_OPTS opts[] = { { oPinentryProgram, "pinentry-program", 2 , N_("|PGM|use PGM as the PIN-Entry program") }, + { oPinentryTouchFile, "pinentry-touch-file", 2 , "@" }, { oScdaemonProgram, "scdaemon-program", 2 , N_("|PGM|use PGM as the SCdaemon program") }, { oDisableScdaemon, "disable-scdaemon", 0, N_("do not use the SCdaemon") }, @@ -401,6 +403,7 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread) opt.debug = 0; opt.no_grab = 0; opt.pinentry_program = NULL; + opt.pinentry_touch_file = NULL; opt.scdaemon_program = NULL; opt.def_cache_ttl = DEFAULT_CACHE_TTL; opt.def_cache_ttl_ssh = DEFAULT_CACHE_TTL_SSH; @@ -437,6 +440,7 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread) case oNoGrab: opt.no_grab = 1; break; case oPinentryProgram: opt.pinentry_program = pargs->r.ret_str; break; + case oPinentryTouchFile: opt.pinentry_touch_file = pargs->r.ret_str; break; case oScdaemonProgram: opt.scdaemon_program = pargs->r.ret_str; break; case oDisableScdaemon: opt.disable_scdaemon = 1; break; @@ -1186,6 +1190,16 @@ reread_configuration (void) } +/* Return the file name of the socket we are using for native + requests. */ +const char * +get_agent_socket_name (void) +{ + const char *s = socket_name; + + return (s && *s)? s : NULL; +} + /* Create a name for the socket. With USE_STANDARD_SOCKET given as diff --git a/doc/ChangeLog b/doc/ChangeLog index 1feda1bca..96dd2f66a 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,7 @@ +2007-02-14 Werner Koch + + * gpg-agent.texi (Agent Options): Doc --pinentry-touch-file. + 2007-02-05 Werner Koch * debugging.texi (Common Problems): Tell how to export a private diff --git a/doc/gpg-agent.texi b/doc/gpg-agent.texi index 12c870588..4119d6601 100644 --- a/doc/gpg-agent.texi +++ b/doc/gpg-agent.texi @@ -344,6 +344,17 @@ shorter than this value a warning will be displayed. Defaults to 8. Use program @var{filename} as the PIN entry. The default is installation dependend and can be shown with the @code{--version} command. +@item --pinentry-touch-file @var{filename} +@opindex pinentry-touch-file +By default the file name of the socket gpg-agent is listening for +requests is passed to Pinentry, so that it can touch that file before +exiting (it does this only in curses mode). This option changes the +file passed to Pinentry to @var{filename}. The special name +@code{/dev/null} may be used to completely disable this feature. Note +that Pinentry will not create that file, it will only change the +modification and access time. + + @item --scdaemon-program @var{filename} @opindex scdaemon-program Use program @var{filename} as the Smartcard daemon. The default is diff --git a/doc/scdaemon.texi b/doc/scdaemon.texi index 91b056aeb..6eb2f1656 100644 --- a/doc/scdaemon.texi +++ b/doc/scdaemon.texi @@ -311,7 +311,7 @@ used by @command{gpgsm}. @subsection The DINSIG card application ``dinsig'' This is an application as described in the German draft standard -@emph{DIN V 66291-1}. It is intended to be used by cards supporteing +@emph{DIN V 66291-1}. It is intended to be used by cards supporting the German signature law and its bylaws (SigG and SigV). @node PKCS#15 Card