mirror of
git://git.gnupg.org/gnupg.git
synced 2025-05-16 08:33:24 +02:00
gpg-agent: Use "pinentry-basic" as fallback.
* common/homedir.c (get_default_pinentry_name): New. (gnupg_module_name): Use that for the default pinentry. (gnupg_module_name_flush_some): New. * agent/gpg-agent.c (agent_sighup_action): Flush some module names. * agent/call-pinentry.c (start_pinentry): Do not modify opt.pinentry_program. -- The idea with this change is that under Windows we can install a simple native Windows pinentry as "pinentry-basic" and a full GUI version may then later install pinentry-gtk etc which would then automatically be used. Unfortunately installing another pinentry from a different package would clobber the GnuPG core directory which is not nice. To fix that we would need to agree on standard installation directories for GUIs to also look there. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
05428d1256
commit
0de5c6a9a7
@ -205,6 +205,7 @@ static int
|
|||||||
start_pinentry (ctrl_t ctrl)
|
start_pinentry (ctrl_t ctrl)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
const char *full_pgmname;
|
||||||
const char *pgmname;
|
const char *pgmname;
|
||||||
assuan_context_t ctx;
|
assuan_context_t ctx;
|
||||||
const char *argv[5];
|
const char *argv[5];
|
||||||
@ -257,11 +258,11 @@ start_pinentry (ctrl_t ctrl)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!opt.pinentry_program || !*opt.pinentry_program)
|
full_pgmname = opt.pinentry_program;
|
||||||
opt.pinentry_program = gnupg_module_name (GNUPG_MODULE_NAME_PINENTRY);
|
if (!full_pgmname || !*full_pgmname)
|
||||||
pgmname = opt.pinentry_program;
|
full_pgmname = gnupg_module_name (GNUPG_MODULE_NAME_PINENTRY);
|
||||||
if ( !(pgmname = strrchr (opt.pinentry_program, '/')))
|
if ( !(pgmname = strrchr (full_pgmname, '/')))
|
||||||
pgmname = opt.pinentry_program;
|
pgmname = full_pgmname;
|
||||||
else
|
else
|
||||||
pgmname++;
|
pgmname++;
|
||||||
|
|
||||||
@ -269,7 +270,7 @@ start_pinentry (ctrl_t ctrl)
|
|||||||
the resource bundle. For other systems we stick to the usual
|
the resource bundle. For other systems we stick to the usual
|
||||||
convention of supplying only the name of the program. */
|
convention of supplying only the name of the program. */
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
argv[0] = opt.pinentry_program;
|
argv[0] = full_pgmname;
|
||||||
#else /*!__APPLE__*/
|
#else /*!__APPLE__*/
|
||||||
argv[0] = pgmname;
|
argv[0] = pgmname;
|
||||||
#endif /*__APPLE__*/
|
#endif /*__APPLE__*/
|
||||||
@ -310,13 +311,13 @@ start_pinentry (ctrl_t ctrl)
|
|||||||
that atfork is used to change the environment for pinentry. We
|
that atfork is used to change the environment for pinentry. We
|
||||||
start the server in detached mode to suppress the console window
|
start the server in detached mode to suppress the console window
|
||||||
under Windows. */
|
under Windows. */
|
||||||
rc = assuan_pipe_connect (ctx, opt.pinentry_program, argv,
|
rc = assuan_pipe_connect (ctx, full_pgmname, argv,
|
||||||
no_close_list, atfork_cb, ctrl,
|
no_close_list, atfork_cb, ctrl,
|
||||||
ASSUAN_PIPE_CONNECT_DETACHED);
|
ASSUAN_PIPE_CONNECT_DETACHED);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
log_error ("can't connect to the PIN entry module '%s': %s\n",
|
log_error ("can't connect to the PIN entry module '%s': %s\n",
|
||||||
opt.pinentry_program, gpg_strerror (rc));
|
full_pgmname, gpg_strerror (rc));
|
||||||
assuan_release (ctx);
|
assuan_release (ctx);
|
||||||
return unlock_pinentry (gpg_error (GPG_ERR_NO_PIN_ENTRY));
|
return unlock_pinentry (gpg_error (GPG_ERR_NO_PIN_ENTRY));
|
||||||
}
|
}
|
||||||
|
@ -1827,9 +1827,14 @@ agent_sighup_action (void)
|
|||||||
{
|
{
|
||||||
log_info ("SIGHUP received - "
|
log_info ("SIGHUP received - "
|
||||||
"re-reading configuration and flushing cache\n");
|
"re-reading configuration and flushing cache\n");
|
||||||
|
|
||||||
agent_flush_cache ();
|
agent_flush_cache ();
|
||||||
reread_configuration ();
|
reread_configuration ();
|
||||||
agent_reload_trustlist ();
|
agent_reload_trustlist ();
|
||||||
|
/* We flush the module name cache so that after installing a
|
||||||
|
"pinentry" binary that one can be used in case the
|
||||||
|
"pinentry-basic" fallback was in use. */
|
||||||
|
gnupg_module_name_flush_some ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#ifdef HAVE_W32_SYSTEM
|
#ifdef HAVE_W32_SYSTEM
|
||||||
#include <winsock2.h> /* Due to the stupid mingw64 requirement to
|
#include <winsock2.h> /* Due to the stupid mingw64 requirement to
|
||||||
@ -607,6 +608,41 @@ dirmngr_user_socket_name (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return the default pinentry name. If RESET is true the internal
|
||||||
|
cache is first flushed. */
|
||||||
|
static const char *
|
||||||
|
get_default_pinentry_name (int reset)
|
||||||
|
{
|
||||||
|
static char *name;
|
||||||
|
|
||||||
|
if (reset)
|
||||||
|
{
|
||||||
|
xfree (name);
|
||||||
|
name = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
{
|
||||||
|
name = xstrconcat (gnupg_bindir (),
|
||||||
|
DIRSEP_S "pinentry" EXEEXT_S, NULL);
|
||||||
|
if (access (name, F_OK) && errno == ENOENT)
|
||||||
|
{
|
||||||
|
char *name2;
|
||||||
|
name2 = xstrconcat (gnupg_bindir (),
|
||||||
|
DIRSEP_S "pinentry-basic" EXEEXT_S, NULL);
|
||||||
|
if (access (name2, F_OK))
|
||||||
|
xfree (name2); /* Does not exist. */
|
||||||
|
else /* Switch to pinentry-basic. */
|
||||||
|
{
|
||||||
|
xfree (name);
|
||||||
|
name = name2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return the file name of a helper tool. WHICH is one of the
|
/* Return the file name of a helper tool. WHICH is one of the
|
||||||
GNUPG_MODULE_NAME_foo constants. */
|
GNUPG_MODULE_NAME_foo constants. */
|
||||||
const char *
|
const char *
|
||||||
@ -630,9 +666,9 @@ gnupg_module_name (int which)
|
|||||||
|
|
||||||
case GNUPG_MODULE_NAME_PINENTRY:
|
case GNUPG_MODULE_NAME_PINENTRY:
|
||||||
#ifdef GNUPG_DEFAULT_PINENTRY
|
#ifdef GNUPG_DEFAULT_PINENTRY
|
||||||
return GNUPG_DEFAULT_PINENTRY;
|
return GNUPG_DEFAULT_PINENTRY; /* (Set by a configure option) */
|
||||||
#else
|
#else
|
||||||
X(bindir, "pinentry");
|
return get_default_pinentry_name (0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case GNUPG_MODULE_NAME_SCDAEMON:
|
case GNUPG_MODULE_NAME_SCDAEMON:
|
||||||
@ -683,3 +719,12 @@ gnupg_module_name (int which)
|
|||||||
}
|
}
|
||||||
#undef X
|
#undef X
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Flush some of the cached module names. This is for example used by
|
||||||
|
gpg-agent to allow configuring a different pinentry. */
|
||||||
|
void
|
||||||
|
gnupg_module_name_flush_some (void)
|
||||||
|
{
|
||||||
|
(void)get_default_pinentry_name (1);
|
||||||
|
}
|
||||||
|
@ -254,6 +254,7 @@ const char *dirmngr_user_socket_name (void);
|
|||||||
#define GNUPG_MODULE_NAME_GPGCONF 10
|
#define GNUPG_MODULE_NAME_GPGCONF 10
|
||||||
#define GNUPG_MODULE_NAME_DIRMNGR_LDAP 11
|
#define GNUPG_MODULE_NAME_DIRMNGR_LDAP 11
|
||||||
const char *gnupg_module_name (int which);
|
const char *gnupg_module_name (int which);
|
||||||
|
void gnupg_module_name_flush_some (void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -445,8 +445,10 @@ This option does nothing yet.
|
|||||||
|
|
||||||
@item --pinentry-program @var{filename}
|
@item --pinentry-program @var{filename}
|
||||||
@opindex pinentry-program
|
@opindex pinentry-program
|
||||||
Use program @var{filename} as the PIN entry. The default is installation
|
Use program @var{filename} as the PIN entry. The default is
|
||||||
dependent.
|
installation dependent. With the default configuration the name of
|
||||||
|
the default pinentry is @file{pinentry}; if that file does not exist
|
||||||
|
but a @file{pinentry-basic} exist the latter is used.
|
||||||
|
|
||||||
@item --pinentry-touch-file @var{filename}
|
@item --pinentry-touch-file @var{filename}
|
||||||
@opindex pinentry-touch-file
|
@opindex pinentry-touch-file
|
||||||
|
Loading…
x
Reference in New Issue
Block a user