Changeset View
Changeset View
Standalone View
Standalone View
g10/delkey.c
Context not available. | |||||
return err; | return err; | ||||
} | } | ||||
static int | |||||
confirm_deletion(ctrl_t ctrl, PACKET *pkt, int secret, int fingerprint) | |||||
{ | |||||
int yes = 0; | |||||
if (opt.batch) | |||||
{ | |||||
if (secret) | |||||
return fingerprint; | |||||
else | |||||
return opt.answer_yes || fingerprint; | |||||
} | |||||
print_key_info (ctrl, NULL, 0, pkt->pkt.public_key, secret); | |||||
tty_printf( "\n" ); | |||||
yes = cpr_get_answer_is_yes (secret? "delete_key.secret.okay": "delete_key.okay", | |||||
_("Delete this key from the keyring? (y/N) ")); | |||||
if (!cpr_enabled() && secret && yes) | |||||
{ | |||||
/* I think it is not required to check a passphrase; if the | |||||
* user is so stupid as to let others access his secret | |||||
* keyring (and has no backup) - it is up him to read some | |||||
* very basic texts about security. */ | |||||
yes = cpr_get_answer_is_yes ("delete_key.secret.okay", | |||||
_("This is a secret key! - really delete? (y/N) ")); | |||||
} | |||||
return yes; | |||||
} | |||||
/**************** | /**************** | ||||
* Delete a public or secret key from a keyring. | * Delete a public or secret key from a keyring. | ||||
* r_sec_avail will be set if a secret key is available and the public | * r_sec_avail will be set if a secret key is available and the public | ||||
Context not available. | |||||
PKT_public_key *pk = NULL; | PKT_public_key *pk = NULL; | ||||
u32 keyid[2]; | u32 keyid[2]; | ||||
int okay=0; | int okay=0; | ||||
int yes; | |||||
KEYDB_SEARCH_DESC desc; | KEYDB_SEARCH_DESC desc; | ||||
int exactmatch; /* True if key was found by fingerprint. */ | int exactmatch; /* True if key was found by fingerprint. */ | ||||
int thiskeyonly; /* 0 = false, 1 = is primary key, 2 = is a subkey. */ | int thiskeyonly; /* 0 = false, 1 = is primary key, 2 = is a subkey. */ | ||||
Context not available. | |||||
log_info (_("(unless you specify the key by fingerprint)\n")); | log_info (_("(unless you specify the key by fingerprint)\n")); | ||||
} | } | ||||
else | else | ||||
okay++; | |||||
if (okay) | |||||
{ | { | ||||
print_key_info (ctrl, NULL, 0, pk, secret); | |||||
tty_printf ("\n"); | |||||
if (thiskeyonly == 1 && !secret) | if (thiskeyonly == 1 && !secret) | ||||
{ | { | ||||
/* We need to delete the entire public key despite the use | /* We need to delete the entire public key despite the use | ||||
Context not available. | |||||
" will be deleted.\n")); | " will be deleted.\n")); | ||||
} | } | ||||
if (thiskeyonly) | |||||
tty_printf ("\n"); | |||||
yes = cpr_get_answer_is_yes | |||||
(secret? "delete_key.secret.okay": "delete_key.okay", | |||||
_("Delete this key from the keyring? (y/N) ")); | |||||
if (!cpr_enabled() && secret && yes) | |||||
{ | |||||
/* I think it is not required to check a passphrase; if the | |||||
* user is so stupid as to let others access his secret | |||||
* keyring (and has no backup) - it is up him to read some | |||||
* very basic texts about security. */ | |||||
yes = cpr_get_answer_is_yes | |||||
("delete_key.secret.okay", | |||||
_("This is a secret key! - really delete? (y/N) ")); | |||||
} | |||||
if (yes) | |||||
okay++; | |||||
} | |||||
if (okay) | |||||
{ | |||||
if (secret) | if (secret) | ||||
{ | { | ||||
gpg_error_t firsterr = 0; | gpg_error_t firsterr = 0; | ||||
Context not available. | |||||
if (subkeys_only && node->pkt->pkttype != PKT_PUBLIC_SUBKEY) | if (subkeys_only && node->pkt->pkttype != PKT_PUBLIC_SUBKEY) | ||||
continue; | continue; | ||||
err = agent_delete_secret_key (ctrl, | if (confirm_deletion (ctrl, node->pkt, secret, exactmatch)) | ||||
node->pkt->pkt.public_key, | |||||
stubs_only); | |||||
if (err == GPG_ERR_NO_SECKEY) | |||||
continue; /* No secret key for that public (sub)key. */ | |||||
else if (err) | |||||
{ | { | ||||
if (gpg_err_code (err) == GPG_ERR_KEY_ON_CARD) | err = agent_delete_secret_key (ctrl, | ||||
write_status_text (STATUS_DELETE_PROBLEM, "1"); | node->pkt->pkt.public_key, | ||||
log_error (_("deleting secret %s failed: %s\n"), | stubs_only); | ||||
(node->pkt->pkttype == PKT_PUBLIC_KEY | |||||
? _("key"):_("subkey")), | if (err == GPG_ERR_NO_SECKEY) | ||||
gpg_strerror (err)); | continue; /* No secret key for that public (sub)key. */ | ||||
if (!firsterr) | |||||
firsterr = err; | else if (err) | ||||
if (gpg_err_code (err) == GPG_ERR_CANCELED | { | ||||
|| gpg_err_code (err) == GPG_ERR_FULLY_CANCELED) | if (gpg_err_code (err) == GPG_ERR_KEY_ON_CARD) | ||||
{ | write_status_text (STATUS_DELETE_PROBLEM, "1"); | ||||
write_status_error ("delete_key.secret", err); | |||||
break; | log_error (_("deleting secret %s failed: %s\n"), | ||||
} | (node->pkt->pkttype == PKT_PUBLIC_KEY | ||||
? _("key") : _("subkey")), | |||||
gpg_strerror (err)); | |||||
if (!firsterr) | |||||
firsterr = err; | |||||
if (gpg_err_code (err) == GPG_ERR_CANCELED | |||||
|| gpg_err_code (err) == GPG_ERR_FULLY_CANCELED) | |||||
{ | |||||
write_status_error ("delete_key.secret", err); | |||||
break; | |||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
err = firsterr; | err = firsterr; | ||||
Context not available. | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
err = keydb_delete_keyblock (hd); | if (confirm_deletion (ctrl, targetnode->pkt, secret, exactmatch)) | ||||
if (err) | { | ||||
{ | err = keydb_delete_keyblock (hd); | ||||
log_error (_("deleting keyblock failed: %s\n"), | if (err) | ||||
gpg_strerror (err)); | { | ||||
goto leave; | log_error (_("deleting keyblock failed: %s\n"), | ||||
} | gpg_strerror (err)); | ||||
goto leave; | |||||
} | |||||
} | |||||
} | } | ||||
/* Note that the ownertrust being cleared will trigger a | /* Note that the ownertrust being cleared will trigger a | ||||
Context not available. |