1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00

winpgnt: mark encrypted/encryptable keys in GUI key list.

Now they have '(encrypted)' or '(re-encryptable)' after them, the same
as Unix Pageant.

Mostly this just involved tinkering with the code in winpgnt.c that
makes up the entry to put in the list box. But I also had to sprinkle
a few more calls to keylist_update() into the cross-platform
pageant.c, to make sure that the key list window is proactively
updated whenever a key is decrypted, re-encrypted, or loaded in
encrypted-only form.
This commit is contained in:
Simon Tatham 2021-04-02 10:13:01 +01:00
parent c4dc78bd85
commit ceb645b042
2 changed files with 29 additions and 33 deletions

View File

@ -556,6 +556,8 @@ void pageant_passphrase_request_success(PageantClientDialogId *dlgid,
"passphrase prompts"); "passphrase prompts");
} }
return; return;
} else {
keylist_update();
} }
} }
@ -1182,6 +1184,7 @@ static PageantAsyncOp *pageant_make_op(
pk->encrypted_key_file = strbuf_new_nm(); pk->encrypted_key_file = strbuf_new_nm();
put_datapl(pk->encrypted_key_file, keyfile); put_datapl(pk->encrypted_key_file, keyfile);
keylist_update();
put_byte(sb, SSH_AGENT_SUCCESS); put_byte(sb, SSH_AGENT_SUCCESS);
pageant_client_log( pageant_client_log(
pc, reqid, "reply: SSH_AGENT_SUCCESS (added encrypted" pc, reqid, "reply: SSH_AGENT_SUCCESS (added encrypted"
@ -1209,6 +1212,7 @@ static PageantAsyncOp *pageant_make_op(
PageantKey *added = add234(keytree, pk); PageantKey *added = add234(keytree, pk);
assert(added == pk); (void)added; assert(added == pk); (void)added;
keylist_update();
put_byte(sb, SSH_AGENT_SUCCESS); put_byte(sb, SSH_AGENT_SUCCESS);
pageant_client_log(pc, reqid, "reply: SSH_AGENT_SUCCESS (made" pageant_client_log(pc, reqid, "reply: SSH_AGENT_SUCCESS (made"
" new encrypted-only key record)"); " new encrypted-only key record)");
@ -1258,6 +1262,7 @@ static PageantAsyncOp *pageant_make_op(
goto responded; goto responded;
} }
keylist_update();
put_byte(sb, SSH_AGENT_SUCCESS); put_byte(sb, SSH_AGENT_SUCCESS);
pageant_client_log(pc, reqid, "reply: SSH_AGENT_SUCCESS"); pageant_client_log(pc, reqid, "reply: SSH_AGENT_SUCCESS");
break; break;
@ -1291,6 +1296,7 @@ static PageantAsyncOp *pageant_make_op(
if (nsuccesses == 0 && nfailures > 0) { if (nsuccesses == 0 && nfailures > 0) {
fail("no key could be re-encrypted"); fail("no key could be re-encrypted");
} else { } else {
keylist_update();
put_byte(sb, SSH_AGENT_SUCCESS); put_byte(sb, SSH_AGENT_SUCCESS);
put_uint32(sb, nfailures); put_uint32(sb, nfailures);
pageant_client_log(pc, reqid, "reply: SSH_AGENT_SUCCESS " pageant_client_log(pc, reqid, "reply: SSH_AGENT_SUCCESS "

View File

@ -299,17 +299,17 @@ static void keylist_update_callback(
{ {
FingerprintType this_type = ssh2_pick_fingerprint(fingerprints, fptype); FingerprintType this_type = ssh2_pick_fingerprint(fingerprints, fptype);
const char *fingerprint = fingerprints[this_type]; const char *fingerprint = fingerprints[this_type];
char *listentry; strbuf *listentry = strbuf_new();
switch (key->ssh_version) { switch (key->ssh_version) {
case 1: { case 1: {
listentry = dupprintf("ssh1\t%s\t%s", fingerprint, comment); strbuf_catf(listentry, "ssh1\t%s\t%s", fingerprint, comment);
/* /*
* Replace the space in the fingerprint (between bit count and * Replace the space in the fingerprint (between bit count and
* hash) with a tab, for nice alignment in the box. * hash) with a tab, for nice alignment in the box.
*/ */
char *p = strchr(listentry, ' '); char *p = strchr(listentry->s, ' ');
if (p) if (p)
*p = '\t'; *p = '\t';
break; break;
@ -339,47 +339,37 @@ static void keylist_update_callback(
* overflow past the bit-count tab stop and leave out a tab * overflow past the bit-count tab stop and leave out a tab
* character. Urgh. * character. Urgh.
*/ */
listentry = dupprintf("%s\t%s", fingerprint, comment);
size_t pos = 0;
while (1) {
pos += strcspn(listentry + pos, " :");
if (listentry[pos] == ':' || !listentry[pos])
break;
listentry[pos++] = '\t';
}
BinarySource src[1]; BinarySource src[1];
BinarySource_BARE_INIT_PL(src, ptrlen_from_strbuf(key->blob)); BinarySource_BARE_INIT_PL(src, ptrlen_from_strbuf(key->blob));
ptrlen algname = get_string(src); ptrlen algname = get_string(src);
const ssh_keyalg *alg = find_pubkey_alg_len(algname); const ssh_keyalg *alg = find_pubkey_alg_len(algname);
if (alg != &ssh_dss && alg != &ssh_rsa) { bool include_bit_count = (alg == &ssh_dss && alg == &ssh_rsa);
/*
* Remove the bit-count field, which is between the int wordnumber = 0;
* first and second \t. for (const char *p = fingerprint; *p; p++) {
*/ char c = *p;
int outpos; if (c == ' ') {
pos = 0; if (wordnumber < 2)
while (listentry[pos] && listentry[pos] != '\t') c = '\t';
pos++; wordnumber++;
outpos = pos;
pos++;
while (listentry[pos] && listentry[pos] != '\t')
pos++;
while (1) {
if ((listentry[outpos] = listentry[pos]) == '\0')
break;
outpos++;
pos++;
} }
if (include_bit_count || wordnumber != 1)
put_byte(listentry, c);
} }
strbuf_catf(listentry, "\t%s", comment);
break; break;
} }
} }
SendDlgItemMessage(keylist, 100, LB_ADDSTRING, 0, (LPARAM)listentry); if (ext_flags & LIST_EXTENDED_FLAG_HAS_NO_CLEARTEXT_KEY)
sfree(listentry); strbuf_catf(listentry, "\t(encrypted)");
else if (ext_flags & LIST_EXTENDED_FLAG_HAS_ENCRYPTED_KEY_FILE)
strbuf_catf(listentry, "\t(re-encryptable)");
SendDlgItemMessage(keylist, 100, LB_ADDSTRING, 0, (LPARAM)listentry->s);
strbuf_free(listentry);
} }
/* /*