mirror of
git://git.gnupg.org/gnupg.git
synced 2025-02-01 16:33:02 +01:00
gpg: Pass --homedir to gpg-agent.
* agent/gpg-agent.c (main): Make sure homedir is absolute. * common/asshelp.c (lock_spawning): Create lock file with an absolute name. (start_new_gpg_agent): Use an absolute name for the socket and pass option --homedir to the agent. (start_new_dirmngr): Use an absolute name for the --homedir. -- This patch makes gpg's --homedir option behave again like in older versions. This is done by starting a new agent for each different home directory. Note that this assumes --use-standard-socket is used which is the default for 2.1.
This commit is contained in:
parent
71a54313ad
commit
fdd938a5bb
@ -885,6 +885,10 @@ main (int argc, char **argv )
|
|||||||
if (nogreeting )
|
if (nogreeting )
|
||||||
greeting = 0;
|
greeting = 0;
|
||||||
|
|
||||||
|
/* Turn the homedir into an absolute one. */
|
||||||
|
opt.homedir = make_absfilename (opt.homedir, NULL);
|
||||||
|
|
||||||
|
|
||||||
if (greeting)
|
if (greeting)
|
||||||
{
|
{
|
||||||
es_fprintf (es_stderr, "%s %s; %s\n",
|
es_fprintf (es_stderr, "%s %s; %s\n",
|
||||||
|
@ -301,7 +301,7 @@ lock_spawning (lock_spawn_t *lock, const char *homedir, const char *name,
|
|||||||
|
|
||||||
*lock = NULL;
|
*lock = NULL;
|
||||||
|
|
||||||
fname = make_filename
|
fname = make_absfilename_try
|
||||||
(homedir,
|
(homedir,
|
||||||
!strcmp (name, "agent")? "gnupg_spawn_agent_sentinel":
|
!strcmp (name, "agent")? "gnupg_spawn_agent_sentinel":
|
||||||
!strcmp (name, "dirmngr")? "gnupg_spawn_dirmngr_sentinel":
|
!strcmp (name, "dirmngr")? "gnupg_spawn_dirmngr_sentinel":
|
||||||
@ -382,17 +382,19 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
|
|||||||
if (!infostr || !*infostr)
|
if (!infostr || !*infostr)
|
||||||
{
|
{
|
||||||
char *sockname;
|
char *sockname;
|
||||||
const char *argv[3];
|
const char *argv[5];
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int excode;
|
int excode;
|
||||||
|
|
||||||
/* First check whether we can connect at the standard
|
/* First check whether we can connect at the standard
|
||||||
socket. */
|
socket. */
|
||||||
sockname = make_filename (homedir, GPG_AGENT_SOCK_NAME, NULL);
|
sockname = make_absfilename (homedir, GPG_AGENT_SOCK_NAME, NULL);
|
||||||
err = assuan_socket_connect (ctx, sockname, 0, 0);
|
err = assuan_socket_connect (ctx, sockname, 0, 0);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
|
char *abs_homedir;
|
||||||
|
|
||||||
/* With no success start a new server. */
|
/* With no success start a new server. */
|
||||||
if (!agent_program || !*agent_program)
|
if (!agent_program || !*agent_program)
|
||||||
agent_program = gnupg_module_name (GNUPG_MODULE_NAME_AGENT);
|
agent_program = gnupg_module_name (GNUPG_MODULE_NAME_AGENT);
|
||||||
@ -405,6 +407,20 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
|
|||||||
status_cb (status_cb_arg, STATUS_PROGRESS,
|
status_cb (status_cb_arg, STATUS_PROGRESS,
|
||||||
"starting_agent ? 0 0", NULL);
|
"starting_agent ? 0 0", NULL);
|
||||||
|
|
||||||
|
/* We better pass an absolute home directory to the agent
|
||||||
|
just in casee gpg-agent does not convert the passed name
|
||||||
|
to an absolute one (which it should do). */
|
||||||
|
abs_homedir = make_absfilename_try (homedir, NULL);
|
||||||
|
if (!abs_homedir)
|
||||||
|
{
|
||||||
|
gpg_error_t tmperr = gpg_err_make (errsource,
|
||||||
|
gpg_err_code_from_syserror ());
|
||||||
|
log_error ("error building filename: %s\n",gpg_strerror (tmperr));
|
||||||
|
xfree (sockname);
|
||||||
|
assuan_release (ctx);
|
||||||
|
return tmperr;
|
||||||
|
}
|
||||||
|
|
||||||
if (fflush (NULL))
|
if (fflush (NULL))
|
||||||
{
|
{
|
||||||
gpg_error_t tmperr = gpg_err_make (errsource,
|
gpg_error_t tmperr = gpg_err_make (errsource,
|
||||||
@ -413,11 +429,14 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
|
|||||||
strerror (errno));
|
strerror (errno));
|
||||||
xfree (sockname);
|
xfree (sockname);
|
||||||
assuan_release (ctx);
|
assuan_release (ctx);
|
||||||
|
xfree (abs_homedir);
|
||||||
return tmperr;
|
return tmperr;
|
||||||
}
|
}
|
||||||
|
|
||||||
argv[0] = "--use-standard-socket-p";
|
argv[0] = "--homedir";
|
||||||
argv[1] = NULL;
|
argv[1] = abs_homedir;
|
||||||
|
argv[2] = "--use-standard-socket-p";
|
||||||
|
argv[3] = NULL;
|
||||||
err = gnupg_spawn_process_fd (agent_program, argv, -1, -1, -1, &pid);
|
err = gnupg_spawn_process_fd (agent_program, argv, -1, -1, -1, &pid);
|
||||||
if (err)
|
if (err)
|
||||||
log_debug ("starting '%s' for testing failed: %s\n",
|
log_debug ("starting '%s' for testing failed: %s\n",
|
||||||
@ -438,9 +457,11 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
|
|||||||
here. */
|
here. */
|
||||||
lock_spawn_t lock;
|
lock_spawn_t lock;
|
||||||
|
|
||||||
argv[0] = "--daemon";
|
argv[0] = "--homedir";
|
||||||
argv[1] = "--use-standard-socket";
|
argv[1] = abs_homedir;
|
||||||
argv[2] = NULL;
|
argv[2] = "--use-standard-socket";
|
||||||
|
argv[3] = "--daemon";
|
||||||
|
argv[4] = NULL;
|
||||||
|
|
||||||
if (!(err = lock_spawning (&lock, homedir, "agent", verbose))
|
if (!(err = lock_spawning (&lock, homedir, "agent", verbose))
|
||||||
&& assuan_socket_connect (ctx, sockname, 0, 0))
|
&& assuan_socket_connect (ctx, sockname, 0, 0))
|
||||||
@ -492,9 +513,11 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
|
|||||||
else
|
else
|
||||||
pgmname++;
|
pgmname++;
|
||||||
|
|
||||||
argv[0] = pgmname;
|
argv[0] = pgmname; /* (Assuan expects a standard argv.) */
|
||||||
argv[1] = "--server";
|
argv[1] = "--homedir";
|
||||||
argv[2] = NULL;
|
argv[2] = abs_homedir;
|
||||||
|
argv[3] = "--server";
|
||||||
|
argv[4] = NULL;
|
||||||
|
|
||||||
i=0;
|
i=0;
|
||||||
if (log_get_fd () != -1)
|
if (log_get_fd () != -1)
|
||||||
@ -506,6 +529,7 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
|
|||||||
err = assuan_pipe_connect (ctx, agent_program, argv,
|
err = assuan_pipe_connect (ctx, agent_program, argv,
|
||||||
no_close_list, NULL, NULL, 0);
|
no_close_list, NULL, NULL, 0);
|
||||||
}
|
}
|
||||||
|
xfree (abs_homedir);
|
||||||
}
|
}
|
||||||
xfree (sockname);
|
xfree (sockname);
|
||||||
}
|
}
|
||||||
@ -646,7 +670,15 @@ start_new_dirmngr (assuan_context_t *r_ctx,
|
|||||||
status_cb (status_cb_arg, STATUS_PROGRESS,
|
status_cb (status_cb_arg, STATUS_PROGRESS,
|
||||||
"starting_dirmngr ? 0 0", NULL);
|
"starting_dirmngr ? 0 0", NULL);
|
||||||
|
|
||||||
abs_homedir = make_filename (homedir, NULL);
|
abs_homedir = make_absfilename (homedir, NULL);
|
||||||
|
if (!abs_homedir)
|
||||||
|
{
|
||||||
|
gpg_error_t tmperr = gpg_err_make (errsource,
|
||||||
|
gpg_err_code_from_syserror ());
|
||||||
|
log_error ("error building filename: %s\n",gpg_strerror (tmperr));
|
||||||
|
assuan_release (ctx);
|
||||||
|
return tmperr;
|
||||||
|
}
|
||||||
|
|
||||||
if (fflush (NULL))
|
if (fflush (NULL))
|
||||||
{
|
{
|
||||||
|
@ -600,7 +600,7 @@ dirmngr_sys_socket_name (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return the user socket name used by DirMngr. If a a user specific
|
/* Return the user socket name used by DirMngr. If a user specific
|
||||||
dirmngr installation is not supported, NULL is returned. */
|
dirmngr installation is not supported, NULL is returned. */
|
||||||
const char *
|
const char *
|
||||||
dirmngr_user_socket_name (void)
|
dirmngr_user_socket_name (void)
|
||||||
@ -611,7 +611,7 @@ dirmngr_user_socket_name (void)
|
|||||||
static char *name;
|
static char *name;
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
name = make_filename (default_homedir (), DIRMNGR_SOCK_NAME, NULL);
|
name = make_absfilename (default_homedir (), DIRMNGR_SOCK_NAME, NULL);
|
||||||
return name;
|
return name;
|
||||||
#endif /*!HAVE_W32_SYSTEM*/
|
#endif /*!HAVE_W32_SYSTEM*/
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user