summaryrefslogtreecommitdiff
path: root/xfce4-session/xfsm-startup.c
diff options
context:
space:
mode:
authorMaciej S. Szmigiero <mail@maciej.szmigiero.name>2019-10-09 00:06:01 +0200
committerRomain Bouvier <skunnyk@alteroot.org>2020-05-01 11:35:42 +0200
commitd3c2c37c1e68aecee5a2235bd8facdc91cb1f33e (patch)
tree8e642810fe0d07550a7cb52443902673ee3e09d5 /xfce4-session/xfsm-startup.c
parentd2c164fcfbc8d33d7e72143071c0effd62d740a6 (diff)
downloadxfce4-session-d3c2c37c1e68aecee5a2235bd8facdc91cb1f33e.tar.gz
Add a GnuPG 2.1+ mode
GnuPG 2.1+ comes with significantly rewritten agent support. For example, it no longer supports outputting the GPG_AGENT_INFO environment variable or the "--write-env-file" command line option. Because of that we can't track the gpg-agent we started by its PID, we have to use instead the (upstream-recommended) way to terminate it via a dedicated gpgconf command.
Diffstat (limited to 'xfce4-session/xfsm-startup.c')
-rw-r--r--xfce4-session/xfsm-startup.c76
1 files changed, 34 insertions, 42 deletions
diff --git a/xfce4-session/xfsm-startup.c b/xfce4-session/xfsm-startup.c
index 863a71fb..485e3b7e 100644
--- a/xfce4-session/xfsm-startup.c
+++ b/xfce4-session/xfsm-startup.c
@@ -126,7 +126,8 @@ xfsm_ssh_agent_pid (const gchar *ssh_agent_pid)
static pid_t
xfsm_startup_init_agent (const gchar *cmd,
- const gchar *agent)
+ const gchar *agent,
+ gboolean want_pid)
{
gchar *cmdoutput = NULL;
GError *error = NULL;
@@ -159,7 +160,7 @@ xfsm_startup_init_agent (const gchar *cmd,
value = g_strndup (p + 1, t - p - 1);
/* try to get agent pid from the variable */
- if (pid <= 0)
+ if (want_pid && pid <= 0)
{
if (g_strcmp0 (variable, "SSH_AGENT_PID") == 0)
pid = xfsm_ssh_agent_pid (value);
@@ -184,6 +185,9 @@ xfsm_startup_init_agent (const gchar *cmd,
g_free (cmdoutput);
+ if (!want_pid)
+ pid = 1;
+
if (pid <= 0)
g_warning ("%s returned no PID in the variables", agent);
@@ -191,6 +195,21 @@ xfsm_startup_init_agent (const gchar *cmd,
}
+static void xfsm_gpg_agent_shutdown(gboolean quiet)
+{
+ GError *error = NULL;
+
+ g_spawn_command_line_sync ("gpgconf --kill gpg-agent",
+ NULL, NULL, NULL, &error);
+ if (error)
+ {
+ if (!quiet)
+ g_warning ("failed to kill gpg-agent via gpgconf, error was %s",
+ error->message);
+ g_error_free (error);
+ }
+}
+
void
xfsm_startup_init (XfconfChannel *channel)
@@ -280,7 +299,7 @@ xfsm_startup_init (XfconfChannel *channel)
{
cmd = g_strdup_printf ("%s -s", ssh_agent_path);
/* keep this around for shutdown */
- running_sshagent = xfsm_startup_init_agent (cmd, "ssh-agent");
+ running_sshagent = xfsm_startup_init_agent (cmd, "ssh-agent", TRUE);
g_free (cmd);
/* update dbus environment */
@@ -309,33 +328,26 @@ xfsm_startup_init (XfconfChannel *channel)
if (G_LIKELY (gpg_agent_path != NULL))
{
- agentpid = xfsm_gpg_agent_pid (g_getenv ("GPG_AGENT_INFO"));
-
- /* check if the pid is still responding (ie not stale) */
- if (agentpid > 0 && kill (agentpid, 0) == 0)
- {
- g_message ("GPG agent is already running");
- }
- else
+ xfsm_gpg_agent_shutdown (TRUE);
{
+ gboolean want_pid;
+ gchar *cmd_tmp;
gchar *envfile;
g_unsetenv ("GPG_AGENT_INFO");
envfile = xfce_resource_save_location (XFCE_RESOURCE_CACHE, "gpg-agent-info", FALSE);
- if (gpgagent_ssh_enabled)
- {
- cmd = g_strdup_printf ("%s --sh --daemon --enable-ssh-support "
- "--write-env-file '%s'", gpg_agent_path, envfile);
- }
- else
- {
- cmd = g_strdup_printf ("%s --sh --daemon --write-env-file '%s'", gpg_agent_path, envfile);
- }
+ cmd_tmp = g_strdup_printf ("%s --sh --daemon%s", gpg_agent_path,
+ gpgagent_ssh_enabled ?
+ " --enable-ssh-support" : "");
+
+ cmd = cmd_tmp;
+ want_pid = FALSE;
/* keep this around for shutdown */
- running_gpgagent = xfsm_startup_init_agent (cmd, "gpg-agent");
+ running_gpgagent = xfsm_startup_init_agent (cmd, "gpg-agent",
+ want_pid);
g_free (cmd);
g_free (envfile);
@@ -366,27 +378,7 @@ xfsm_startup_shutdown (void)
if (running_gpgagent > 0)
{
- gchar *envfile;
- if (kill (running_gpgagent, SIGINT) == 0)
- {
- /* make sure the env values are unset */
- g_unsetenv ("GPG_AGENT_INFO");
- if (gpgagent_ssh_enabled)
- {
- g_unsetenv ("SSH_AGENT_PID");
- g_unsetenv ("SSH_AUTH_SOCK");
- }
- }
- else
- {
- g_warning ("Failed to kill gpg-agent with pid %d", running_gpgagent);
- }
-
- /* drop the info file from gpg-agent */
- envfile = xfce_resource_lookup (XFCE_RESOURCE_CACHE, "gpg-agent-info");
- if (G_LIKELY (envfile != NULL))
- g_unlink (envfile);
- g_free (envfile);
+ xfsm_gpg_agent_shutdown (FALSE);
}
}