aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2020-09-23 10:02:50 +0000
committerWerner Koch <[email protected]>2020-09-24 08:37:41 +0000
commitacaeba2dbdb9bbd68a823c671d5c3577fef5d26d (patch)
tree87dddf7490c76a7be71ea840e03a5371f5875a26
parentscd: Fix CCID internal driver for interrupt transfer. (diff)
downloadgnupg-acaeba2dbdb9bbd68a823c671d5c3577fef5d26d.tar.gz
gnupg-acaeba2dbdb9bbd68a823c671d5c3577fef5d26d.zip
keyboxd: Integrate into gpgconf.
* common/asshelp.c (lock_spawning): Use a dedicated name for keyboxd. * common/homedir.c (keyboxd_socket_name): New. (gnupg_module_name): Put keyboxd into libexecdir. * tools/gpgconf-comp.c (known_options_keyboxd): New. (gc_component): Add entry for keyboxd. (keyboxd_runtime_change): New. (gc_component_launch): Support keyboxd. * tools/gpgconf.c (list_dirs): Emit new item keyboxd-socket. (main): Also remove keyboxd socket. Signed-off-by: Werner Koch <[email protected]>
-rw-r--r--common/asshelp.c1
-rw-r--r--common/homedir.c14
-rw-r--r--common/util.h1
-rw-r--r--tools/gpgconf-comp.c57
-rw-r--r--tools/gpgconf.c4
-rw-r--r--tools/gpgconf.h3
6 files changed, 78 insertions, 2 deletions
diff --git a/common/asshelp.c b/common/asshelp.c
index 0d903fd5f..172c7d998 100644
--- a/common/asshelp.c
+++ b/common/asshelp.c
@@ -278,6 +278,7 @@ lock_spawning (lock_spawn_t *lock, const char *homedir, const char *name,
(homedir,
!strcmp (name, "agent")? "gnupg_spawn_agent_sentinel":
!strcmp (name, "dirmngr")? "gnupg_spawn_dirmngr_sentinel":
+ !strcmp (name, "keyboxd")? "gnupg_spawn_keyboxd_sentinel":
/* */ "gnupg_spawn_unknown_sentinel",
NULL);
if (!fname)
diff --git a/common/homedir.c b/common/homedir.c
index ee9585d66..f0e5362ba 100644
--- a/common/homedir.c
+++ b/common/homedir.c
@@ -971,6 +971,18 @@ dirmngr_socket_name (void)
}
+/* Return the user socket name used by Keyboxd. */
+const char *
+keyboxd_socket_name (void)
+{
+ static char *name;
+
+ if (!name)
+ name = make_filename (gnupg_socketdir (), KEYBOXD_SOCK_NAME, NULL);
+ return name;
+}
+
+
/* Return the default pinentry name. If RESET is true the internal
cache is first flushed. */
static const char *
@@ -1122,7 +1134,7 @@ gnupg_module_name (int which)
#ifdef GNUPG_DEFAULT_KEYBOXD
return GNUPG_DEFAULT_KEYBOXD;
#else
- X(bindir, "kbx", KEYBOXD_NAME);
+ X(libexecdir, "kbx", KEYBOXD_NAME);
#endif
case GNUPG_MODULE_NAME_PROTECT_TOOL:
diff --git a/common/util.h b/common/util.h
index f39093566..7217a5208 100644
--- a/common/util.h
+++ b/common/util.h
@@ -273,6 +273,7 @@ const char *gnupg_localedir (void);
const char *gnupg_cachedir (void);
const char *gpg_agent_socket_name (void);
const char *dirmngr_socket_name (void);
+const char *keyboxd_socket_name (void);
char *_gnupg_socketdir_internal (int skip_checks, unsigned *r_info);
diff --git a/tools/gpgconf-comp.c b/tools/gpgconf-comp.c
index 4dae7b49d..3583abe57 100644
--- a/tools/gpgconf-comp.c
+++ b/tools/gpgconf-comp.c
@@ -101,6 +101,7 @@ gc_error (int status, int errnum, const char *fmt, ...)
static void gpg_agent_runtime_change (int killflag);
static void scdaemon_runtime_change (int killflag);
static void dirmngr_runtime_change (int killflag);
+static void keyboxd_runtime_change (int killflag);
@@ -490,6 +491,18 @@ static known_option_t known_options_dirmngr[] =
{ NULL }
};
+/* The known options of the GC_COMPONENT_KEYBOXD component. */
+static known_option_t known_options_keyboxd[] =
+ {
+ { "verbose", GC_OPT_FLAG_LIST, GC_LEVEL_BASIC },
+ { "quiet", GC_OPT_FLAG_NONE, GC_LEVEL_BASIC },
+ { "log-file", GC_OPT_FLAG_NONE, GC_LEVEL_ADVANCED,
+ GC_ARG_TYPE_FILENAME },
+ { "faked-system-time", GC_OPT_FLAG_NONE, GC_LEVEL_INVISIBLE },
+
+ { NULL }
+ };
+
/* The known options of the GC_COMPONENT_PINENTRY component. */
static known_option_t known_options_pinentry[] =
@@ -610,6 +623,10 @@ static struct
GNUPG_MODULE_NAME_GPGSM, GPGSM_NAME ".conf",
known_options_gpgsm },
+ { KEYBOXD_NAME, KEYBOXD_DISP_NAME, "gnupg", N_("Public Keys"),
+ GNUPG_MODULE_NAME_KEYBOXD, KEYBOXD_NAME ".conf",
+ known_options_keyboxd, keyboxd_runtime_change },
+
{ GPG_AGENT_NAME, GPG_AGENT_DISP_NAME, "gnupg", N_("Private Keys"),
GNUPG_MODULE_NAME_AGENT, GPG_AGENT_NAME ".conf",
known_options_gpg_agent, gpg_agent_runtime_change },
@@ -776,6 +793,38 @@ dirmngr_runtime_change (int killflag)
}
+static void
+keyboxd_runtime_change (int killflag)
+{
+ gpg_error_t err = 0;
+ const char *pgmname;
+ const char *argv[6];
+ pid_t pid = (pid_t)(-1);
+
+ pgmname = gnupg_module_name (GNUPG_MODULE_NAME_CONNECT_AGENT);
+ argv[0] = "--no-autostart";
+ argv[1] = "--keyboxd";
+ argv[2] = killflag? "KILLKEYBOXD" : "RELOADKEYBOXD";
+ if (gnupg_default_homedir_p ())
+ argv[3] = NULL;
+ else
+ {
+ argv[3] = "--homedir";
+ argv[4] = gnupg_homedir ();
+ argv[5] = NULL;
+ }
+
+ if (!err)
+ err = gnupg_spawn_process_fd (pgmname, argv, -1, -1, -1, &pid);
+ if (!err)
+ err = gnupg_wait_process (pgmname, pid, 1, NULL);
+ if (err)
+ gc_error (0, 0, "error running '%s %s': %s",
+ pgmname, argv[2], gpg_strerror (err));
+ gnupg_release_process (pid);
+}
+
+
/* Launch the gpg-agent or the dirmngr if not already running. */
gpg_error_t
gc_component_launch (int component)
@@ -790,11 +839,14 @@ gc_component_launch (int component)
{
err = gc_component_launch (GC_COMPONENT_GPG_AGENT);
if (!err)
+ err = gc_component_launch (GC_COMPONENT_KEYBOXD);
+ if (!err)
err = gc_component_launch (GC_COMPONENT_DIRMNGR);
return err;
}
if (!(component == GC_COMPONENT_GPG_AGENT
+ || component == GC_COMPONENT_KEYBOXD
|| component == GC_COMPONENT_DIRMNGR))
{
log_error ("%s\n", _("Component not suitable for launching"));
@@ -820,6 +872,8 @@ gc_component_launch (int component)
}
if (component == GC_COMPONENT_DIRMNGR)
argv[i++] = "--dirmngr";
+ else if (component == GC_COMPONENT_KEYBOXD)
+ argv[i++] = "--keyboxd";
argv[i++] = "NOP";
argv[i] = NULL;
@@ -829,7 +883,8 @@ gc_component_launch (int component)
if (err)
gc_error (0, 0, "error running '%s%s%s': %s",
pgmname,
- component == GC_COMPONENT_DIRMNGR? " --dirmngr":"",
+ component == GC_COMPONENT_DIRMNGR? " --dirmngr"
+ : component == GC_COMPONENT_KEYBOXD? " --keyboxd":"",
" NOP",
gpg_strerror (err));
gnupg_release_process (pid);
diff --git a/tools/gpgconf.c b/tools/gpgconf.c
index 346a6585d..f5f57f577 100644
--- a/tools/gpgconf.c
+++ b/tools/gpgconf.c
@@ -249,6 +249,7 @@ list_dirs (estream_t fp, char **names)
{ "localedir", gnupg_localedir, NULL },
{ "socketdir", gnupg_socketdir, NULL },
{ "dirmngr-socket", dirmngr_socket_name, NULL,},
+ { "keyboxd-socket", keyboxd_socket_name, NULL,},
{ "agent-ssh-socket", gnupg_socketdir, GPG_AGENT_SSH_SOCK_NAME },
{ "agent-extra-socket", gnupg_socketdir, GPG_AGENT_EXTRA_SOCK_NAME },
{ "agent-browser-socket",gnupg_socketdir, GPG_AGENT_BROWSER_SOCK_NAME },
@@ -732,6 +733,8 @@ main (int argc, char **argv)
names[0] = "agent-socket";
else if (idx == GC_COMPONENT_DIRMNGR)
names[0] = "dirmngr-socket";
+ else if (idx == GC_COMPONENT_KEYBOXD)
+ names[0] = "keyboxd-socket";
else
names[0] = NULL;
names[1] = NULL;
@@ -891,6 +894,7 @@ main (int argc, char **argv)
GPG_AGENT_BROWSER_SOCK_NAME,
GPG_AGENT_SSH_SOCK_NAME,
SCDAEMON_SOCK_NAME,
+ KEYBOXD_SOCK_NAME,
DIRMNGR_SOCK_NAME
};
int i;
diff --git a/tools/gpgconf.h b/tools/gpgconf.h
index 83aee9a09..79f33da35 100644
--- a/tools/gpgconf.h
+++ b/tools/gpgconf.h
@@ -58,6 +58,9 @@ typedef enum
/* GPG for S/MIME. */
GC_COMPONENT_GPGSM,
+ /* The optional public key daermon. */
+ GC_COMPONENT_KEYBOXD,
+
/* The GPG Agent. */
GC_COMPONENT_GPG_AGENT,