]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Unix Pageant: support -D, to delete all keys.
authorSimon Tatham <anakin@pobox.com>
Tue, 12 May 2015 13:55:44 +0000 (14:55 +0100)
committerSimon Tatham <anakin@pobox.com>
Tue, 12 May 2015 13:56:39 +0000 (14:56 +0100)
pageant.c
pageant.h
unix/uxpgnt.c

index e3928cdec1fa19bb531cde25fb924c62b0882218..2bb1c8f55cef2cdca20634d030b16634c476b486 100644 (file)
--- a/pageant.c
+++ b/pageant.c
@@ -1747,6 +1747,42 @@ int pageant_delete_key(struct pageant_pubkey *key, char **retstr)
     return ret;
 }
 
+int pageant_delete_all_keys(char **retstr)
+{
+    unsigned char request[5], *response;
+    int reqlen, resplen, success, ret;
+    void *vresponse;
+
+    PUT_32BIT(request, 1);
+    request[4] = SSH2_AGENTC_REMOVE_ALL_IDENTITIES;
+    reqlen = 5;
+    ret = agent_query(request, reqlen, &vresponse, &resplen, NULL, NULL);
+    assert(ret == 1);
+    response = vresponse;
+    success = (resplen >= 4 && response[4] == SSH_AGENT_SUCCESS);
+    sfree(response);
+    if (!success) {
+        *retstr = dupstr("Agent failed to delete SSH-2 keys");
+        return PAGEANT_ACTION_FAILURE;
+    }
+
+    PUT_32BIT(request, 1);
+    request[4] = SSH1_AGENTC_REMOVE_ALL_RSA_IDENTITIES;
+    reqlen = 5;
+    ret = agent_query(request, reqlen, &vresponse, &resplen, NULL, NULL);
+    assert(ret == 1);
+    response = vresponse;
+    success = (resplen >= 4 && response[4] == SSH_AGENT_SUCCESS);
+    sfree(response);
+    if (!success) {
+        *retstr = dupstr("Agent failed to delete SSH-1 keys");
+        return PAGEANT_ACTION_FAILURE;
+    }
+
+    *retstr = NULL;
+    return PAGEANT_ACTION_OK;
+}
+
 struct pageant_pubkey *pageant_pubkey_copy(struct pageant_pubkey *key)
 {
     struct pageant_pubkey *ret = snew(struct pageant_pubkey);
index 451fe7e59d3e04ec03cf5aff35445a8b06c41456..6e29f40c181a0fc8e8186d25f1acb8aa29a6ec8c 100644 (file)
--- a/pageant.h
+++ b/pageant.h
@@ -140,3 +140,4 @@ typedef void (*pageant_key_enum_fn_t)(void *ctx,
 int pageant_enum_keys(pageant_key_enum_fn_t callback, void *callback_ctx,
                       char **retstr);
 int pageant_delete_key(struct pageant_pubkey *key, char **retstr);
+int pageant_delete_all_keys(char **retstr);
index 4a46b657d8b71beb1e76ea15e78edea8a371d132..c9036eedbb04333370de6bb5c08148743c38b54f 100644 (file)
@@ -593,8 +593,11 @@ void run_client(void)
             }
             break;
           case KEYACT_CLIENT_DEL_ALL:
-            fprintf(stderr, "NYI\n");
-            errors = TRUE;
+            if (pageant_delete_all_keys(&retstr) == PAGEANT_ACTION_FAILURE) {
+                fprintf(stderr, "pageant: deleting all keys: %s\n", retstr);
+                sfree(retstr);
+                errors = TRUE;
+            }
             break;
           default:
             assert(0 && "Invalid client action found");