agent: When the password cache is cleared, also clear the ext. cache.
authorNeal H. Walfield <neal@g10code.com>
Tue, 19 May 2015 13:00:16 +0000 (15:00 +0200)
committerNeal H. Walfield <neal@g10code.com>
Tue, 19 May 2015 13:01:01 +0000 (15:01 +0200)
* agent/agent.h (agent_clear_passphrase): New declaration.
* agent/call-pinentry.c (agent_clear_passphrase): New function.
* agent/command.c (cmd_clear_passphrase): Call agent_clear_passphrase.

--
Signed-off-by: Neal H. Walfield <neal@g10code.com>
agent/agent.h
agent/call-pinentry.c
agent/command.c

index d5d6392..dbbf689 100644 (file)
@@ -374,7 +374,8 @@ int agent_show_message (ctrl_t ctrl, const char *desc, const char *ok_btn);
 int agent_popup_message_start (ctrl_t ctrl,
                                const char *desc, const char *ok_btn);
 void agent_popup_message_stop (ctrl_t ctrl);
-
+int agent_clear_passphrase (ctrl_t ctrl,
+                           const char *keyinfo, cache_mode_t cache_mode);
 
 /*-- cache.c --*/
 void initialize_module_cache (void);
index abfea93..018a609 100644 (file)
@@ -1416,3 +1416,29 @@ agent_popup_message_stop (ctrl_t ctrl)
   /* Now we can close the connection. */
   unlock_pinentry (0);
 }
+
+int
+agent_clear_passphrase (ctrl_t ctrl,
+                       const char *keyinfo, cache_mode_t cache_mode)
+{
+  int rc;
+  char line[ASSUAN_LINELENGTH];
+
+  if (! (keyinfo && (cache_mode == CACHE_MODE_NORMAL
+                    || cache_mode == CACHE_MODE_USER
+                    || cache_mode == CACHE_MODE_SSH)))
+    return gpg_error (GPG_ERR_NOT_SUPPORTED);
+
+  rc = start_pinentry (ctrl);
+  if (rc)
+    return rc;
+
+  snprintf (line, DIM(line)-1, "CLEARPASSPHRASE %c/%s",
+           cache_mode == CACHE_MODE_USER? 'u' :
+           cache_mode == CACHE_MODE_SSH? 's' : 'n',
+           keyinfo);
+  rc = assuan_transact (entry_ctx, line,
+                       NULL, NULL, NULL, NULL, NULL, NULL);
+
+  return unlock_pinentry (rc);
+}
index 8ed9a0f..a5dce44 100644 (file)
@@ -1602,6 +1602,10 @@ cmd_clear_passphrase (assuan_context_t ctx, char *line)
 
   agent_put_cache (cacheid, opt_normal ? CACHE_MODE_NORMAL : CACHE_MODE_USER,
                    NULL, 0);
+
+  agent_clear_passphrase (ctrl, cacheid,
+                         opt_normal ? CACHE_MODE_NORMAL : CACHE_MODE_USER);
+
   return 0;
 }