aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--agent/command.c40
1 files changed, 36 insertions, 4 deletions
diff --git a/agent/command.c b/agent/command.c
index 5073aa700..160979dae 100644
--- a/agent/command.c
+++ b/agent/command.c
@@ -1380,9 +1380,6 @@ cmd_keyinfo (assuan_context_t ctx, char *line)
struct card_key_info_s *l;
int on_card;
- if (ctrl->restricted)
- return leave_cmd (ctx, gpg_error (GPG_ERR_FORBIDDEN));
-
if (has_option (line, "--ssh-list"))
list_mode = 2;
else
@@ -1430,6 +1427,9 @@ cmd_keyinfo (assuan_context_t ctx, char *line)
if (list_mode == 2)
{
+ if (ctrl->restricted)
+ return leave_cmd (ctx, gpg_error (GPG_ERR_FORBIDDEN));
+
if (cf)
{
while (!ssh_read_control_file (cf, hexgrip,
@@ -1456,6 +1456,9 @@ cmd_keyinfo (assuan_context_t ctx, char *line)
char *dirname;
struct dirent *dir_entry;
+ if (ctrl->restricted)
+ return leave_cmd (ctx, gpg_error (GPG_ERR_FORBIDDEN));
+
dirname = make_filename_try (gnupg_homedir (),
GNUPG_PRIVATE_KEYS_DIR, NULL);
if (!dirname)
@@ -2272,8 +2275,37 @@ cmd_scd (assuan_context_t ctx, char *line)
int rc;
#ifdef BUILD_WITH_SCDAEMON
ctrl_t ctrl = assuan_get_pointer (ctx);
+
if (ctrl->restricted)
- return leave_cmd (ctx, gpg_error (GPG_ERR_FORBIDDEN));
+ {
+ const char *argv[5];
+ int argc;
+ char *l;
+
+ l = xtrystrdup (line);
+ if (!l)
+ return gpg_error_from_syserror ();
+
+ argc = split_fields (l, argv, DIM (argv));
+
+ /* These commands are allowed. */
+ if ((argc == 1 && !strcmp (argv[0], "SERIALNO"))
+ || (argc == 2
+ && !strcmp (argv[0], "GETINFO")
+ && !strcmp (argv[1], "version"))
+ || (argc == 2
+ && !strcmp (argv[0], "GETATTR")
+ && !strcmp (argv[1], "KEY-FPR"))
+ || (argc == 2
+ && !strcmp (argv[0], "KEYINFO")
+ && !strcmp (argv[1], "--list=encr")))
+ xfree (l);
+ else
+ {
+ xfree (l);
+ return leave_cmd (ctx, gpg_error (GPG_ERR_FORBIDDEN));
+ }
+ }
/* All SCD prefixed commands may change a key. */
eventcounter.maybe_key_change++;