Add option --no-ask for GET_PASSPHRASE.
[gnupg.git] / agent / command.c
index 0664941..b2903f6 100644 (file)
@@ -357,6 +357,8 @@ cmd_geteventcounter (assuan_context_t ctx, char *line)
   char key_counter[25];
   char card_counter[25];
 
+  (void)line;
+
   snprintf (any_counter, sizeof any_counter, "%u", eventcounter.any);
   snprintf (key_counter, sizeof key_counter, "%u", eventcounter.key);
   snprintf (card_counter, sizeof card_counter, "%u", eventcounter.card);
@@ -436,7 +438,11 @@ cmd_istrusted (assuan_context_t ctx, char *line)
 static int
 cmd_listtrusted (assuan_context_t ctx, char *line)
 {
-  int rc = agent_listtrusted (ctx);
+  int rc;
+  
+  (void)line;
+
+  rc = agent_listtrusted (ctx);
   if (rc)
     log_error ("command listtrusted failed: %s\n", gpg_strerror (rc));
   return rc;
@@ -652,6 +658,8 @@ cmd_pksign (assuan_context_t ctx, char *line)
   ctrl_t ctrl = assuan_get_pointer (ctx);
   membuf_t outbuf;
   
+  (void)line;
+  
   if (opt.ignore_cache_for_signing)
     cache_mode = CACHE_MODE_IGNORE;
   else if (!ctrl->server_local->use_cache_for_signing)
@@ -685,6 +693,8 @@ cmd_pkdecrypt (assuan_context_t ctx, char *line)
   size_t valuelen;
   membuf_t outbuf;
 
+  (void)line;
+
   /* First inquire the data to decrypt */
   rc = assuan_inquire (ctx, "CIPHERTEXT",
                        &value, &valuelen, MAXLEN_CIPHERTEXT);
@@ -731,6 +741,8 @@ cmd_genkey (assuan_context_t ctx, char *line)
   size_t valuelen;
   membuf_t outbuf;
 
+  (void)line;
+
   /* First inquire the parameters */
   rc = assuan_inquire (ctx, "KEYPARAM", &value, &valuelen, MAXLEN_KEYPARAM);
   if (rc)
@@ -824,7 +836,7 @@ send_back_passphrase (assuan_context_t ctx, int via_data, const char *pw)
 }
 
 
-/* GET_PASSPHRASE [--data] [--check] <cache_id>
+/* GET_PASSPHRASE [--data] [--check] [--no-ask] <cache_id>
                   [<error_message> <prompt> <description>]
 
    This function is usually used to ask for a passphrase to be used
@@ -841,6 +853,10 @@ send_back_passphrase (assuan_context_t ctx, int via_data, const char *pw)
    If the option "--check" is used the passphrase constraints checks as
    implemented by gpg-agent are applied.  A check is not done if the
    passphrase has been found in the cache.
+
+   If the option "--no-ask" is used and the passphrase is not in the
+   cache the user will not be asked to enter a passphrase but the error
+   code GPG_ERR_NO_DATA is returned.  
 */
 
 static int
@@ -853,10 +869,11 @@ cmd_get_passphrase (assuan_context_t ctx, char *line)
   char *cacheid = NULL, *desc = NULL, *prompt = NULL, *errtext = NULL;
   char *p;
   void *cache_marker;
-  int opt_data, opt_check;
+  int opt_data, opt_check, opt_no_ask;
 
   opt_data = has_option (line, "--data");
   opt_check = has_option (line, "--check");
+  opt_no_ask = has_option (line, "--no-ask");
   line = skip_options (line);
 
   cacheid = line;
@@ -908,6 +925,8 @@ cmd_get_passphrase (assuan_context_t ctx, char *line)
       rc = send_back_passphrase (ctx, opt_data, pw);
       agent_unlock_cache_entry (&cache_marker);
     }
+  else if (opt_no_ask)
+    rc = gpg_error (GPG_ERR_NO_DATA);
   else
     {
       /* Note, that we only need to replace the + characters and
@@ -1081,7 +1100,7 @@ cmd_passwd (assuan_context_t ctx, char *line)
   return rc;
 }
 
-/* PRESET_PASSPHRASE <hexstring_with_keygrip> <timeout> <hexstring>
+/* PRESET_PASSPHRASE <string_or_keygrip> <timeout> <hexstring>
   
    Set the cached passphrase/PIN for the key identified by the keygrip
    to passwd for the given time, where -1 means infinite and 0 means
@@ -1092,7 +1111,6 @@ static int
 cmd_preset_passphrase (assuan_context_t ctx, char *line)
 {
   int rc;
-  unsigned char grip[20];
   char *grip_clear = NULL;
   char *passphrase = NULL;
   int ttl;
@@ -1101,11 +1119,6 @@ cmd_preset_passphrase (assuan_context_t ctx, char *line)
   if (!opt.allow_preset_passphrase)
     return set_error (GPG_ERR_NOT_SUPPORTED, "no --allow-preset-passphrase");
 
-  rc = parse_keygrip (ctx, line, grip);
-  if (rc)
-    return rc;
-
-  /* FIXME: parse_keygrip should return a tail pointer.  */
   grip_clear = line;
   while (*line && (*line != ' ' && *line != '\t'))
     line++;
@@ -1147,7 +1160,7 @@ cmd_preset_passphrase (assuan_context_t ctx, char *line)
     rc = agent_put_cache (grip_clear, CACHE_MODE_ANY, passphrase, ttl);
 
   if (rc)
-    log_error ("command preset_passwd failed: %s\n", gpg_strerror (rc));
+    log_error ("command preset_passphrase failed: %s\n", gpg_strerror (rc));
 
   return rc;
 }
@@ -1312,6 +1325,8 @@ cmd_updatestartuptty (assuan_context_t ctx, char *line)
 {
   ctrl_t ctrl = assuan_get_pointer (ctx);
 
+  (void)line;
+
   xfree (opt.startup_display); opt.startup_display = NULL;
   xfree (opt.startup_ttyname); opt.startup_ttyname = NULL;
   xfree (opt.startup_ttytype); opt.startup_ttytype = NULL;
@@ -1348,8 +1363,11 @@ static int
 cmd_killagent (assuan_context_t ctx, char *line)
 {
   ctrl_t ctrl = assuan_get_pointer (ctx);
+
+  (void)line;
+
   ctrl->server_local->stopme = 1;
-  return 0;
+  return gpg_error (GPG_ERR_EOF);
 }
 
 /* RELOADAGENT
@@ -1359,6 +1377,9 @@ cmd_killagent (assuan_context_t ctx, char *line)
 static int
 cmd_reloadagent (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
+
   agent_sighup_action ();
   return 0;
 }
@@ -1505,6 +1526,8 @@ static void
 post_cmd_notify (assuan_context_t ctx, int err)
 {
   ctrl_t ctrl = assuan_get_pointer (ctx);
+  
+  (void)err;
 
   /* Switch off any I/O monitor controlled logging pausing. */
   ctrl->server_local->pause_io_logging = 0;
@@ -1650,7 +1673,7 @@ start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd)
   for (;;)
     {
       rc = assuan_accept (ctx);
-      if (rc == -1)
+      if (gpg_err_code (rc) == GPG_ERR_EOF || rc == -1)
         {
           break;
         }