diff --git a/g10/call-agent.h b/g10/call-agent.h --- a/g10/call-agent.h +++ b/g10/call-agent.h @@ -207,7 +207,7 @@ /* Delete a key from the agent. */ gpg_error_t agent_delete_key (ctrl_t ctrl, const char *hexkeygrip, - const char *desc, int force); + const char *desc, int force, int stubs_only); /* Change the passphrase of a key. */ gpg_error_t agent_passwd (ctrl_t ctrl, const char *hexkeygrip, const char *desc, diff --git a/g10/call-agent.c b/g10/call-agent.c --- a/g10/call-agent.c +++ b/g10/call-agent.c @@ -2519,7 +2519,7 @@ confirmation. */ gpg_error_t agent_delete_key (ctrl_t ctrl, const char *hexkeygrip, const char *desc, - int force) + int force, int stubs_only) { gpg_error_t err; char line[ASSUAN_LINELENGTH]; @@ -2544,8 +2544,11 @@ return err; } - snprintf (line, DIM(line), "DELETE_KEY%s %s", - force? " --force":"", hexkeygrip); + snprintf (line, DIM(line), + "DELETE_KEY%s%s %s", + force? " --force" : "", + stubs_only? " --stub-only" : "", + hexkeygrip); err = assuan_transact (agent_ctx, line, NULL, NULL, default_inq_cb, &dfltparm, NULL, NULL); diff --git a/g10/delkey.c b/g10/delkey.c --- a/g10/delkey.c +++ b/g10/delkey.c @@ -41,7 +41,7 @@ #include "call-agent.h" static gpg_error_t -agent_delete_secret_key (ctrl_t ctrl, PKT_public_key *pk) +agent_delete_secret_key (ctrl_t ctrl, PKT_public_key *pk, int stubs_only) { gpg_error_t err; char *prompt; @@ -59,7 +59,7 @@ * may also be used for other protocols and thus deleting it from the gpg * would also delete the key for other tools. */ if (!err && !opt.dry_run) - err = agent_delete_key (NULL, hexgrip, prompt, opt.answer_yes); + err = agent_delete_key (NULL, hexgrip, prompt, opt.answer_yes, stubs_only); xfree (prompt); xfree (hexgrip); @@ -74,7 +74,7 @@ */ static gpg_error_t do_delete_key (ctrl_t ctrl, const char *username, - int secret, int force, int subkeys_only, + int secret, int force, int subkeys_only, int stubs_only, int *r_sec_avail) { gpg_error_t err; @@ -260,7 +260,9 @@ if (subkeys_only && node->pkt->pkttype != PKT_PUBLIC_SUBKEY) continue; - err = agent_delete_secret_key (ctrl, node->pkt->pkt.public_key); + err = agent_delete_secret_key (ctrl, + node->pkt->pkt.public_key, + stubs_only); if (err == GPG_ERR_NO_SECKEY) continue; /* No secret key for that public (sub)key. */ @@ -352,7 +354,8 @@ * Delete a public or secret key from a keyring. */ gpg_error_t -delete_keys (ctrl_t ctrl, strlist_t names, int secret, int allow_both, int subkeys_only) +delete_keys (ctrl_t ctrl, strlist_t names, + int secret, int allow_both, int subkeys_only, int stubs_only) { gpg_error_t err; int avail; @@ -363,14 +366,20 @@ for ( ;names ; names=names->next ) { - err = do_delete_key (ctrl, names->d, secret, force, subkeys_only, &avail); + err = do_delete_key (ctrl, names->d, + secret, force, subkeys_only, stubs_only, + &avail); if (err && avail) { if (allow_both) { - err = do_delete_key (ctrl, names->d, 1, 0, subkeys_only, &avail); + err = do_delete_key (ctrl, names->d, + 1, 0, subkeys_only, stubs_only, + &avail); if (!err) - err = do_delete_key (ctrl, names->d, 0, 0, subkeys_only, &avail); + err = do_delete_key (ctrl, names->d, + 0, 0, subkeys_only, stubs_only, + &avail); } else { diff --git a/g10/gpg.c b/g10/gpg.c --- a/g10/gpg.c +++ b/g10/gpg.c @@ -141,6 +141,7 @@ aDeleteKeys, aDeleteSecretKeys, aDeleteSecretSubkeys, + aDeleteSecretKeyStubs, aDeleteSecretAndPublicKeys, aImport, aFastImport, @@ -485,6 +486,8 @@ N_("remove keys from the secret keyring")), ARGPARSE_c (aDeleteSecretSubkeys, "delete-secret-subkeys", N_("remove subkeys from the secret keyring")), + ARGPARSE_c (aDeleteSecretKeyStubs, "delete-secret-key-stubs", + N_("remove key stubs from the secret keyring")), ARGPARSE_c (aQuickSignKey, "quick-sign-key" , N_("quickly sign a key")), ARGPARSE_c (aQuickLSignKey, "quick-lsign-key", @@ -2657,6 +2660,7 @@ case aEditKey: case aDeleteSecretKeys: case aDeleteSecretSubkeys: + case aDeleteSecretKeyStubs: case aDeleteSecretAndPublicKeys: case aDeleteKeys: case aPasswd: @@ -4210,6 +4214,7 @@ case aPasswd: case aDeleteSecretKeys: case aDeleteSecretSubkeys: + case aDeleteSecretKeyStubs: case aDeleteSecretAndPublicKeys: case aQuickKeygen: case aQuickAddUid: @@ -4498,6 +4503,7 @@ case aDeleteKeys: case aDeleteSecretKeys: case aDeleteSecretSubkeys: + case aDeleteSecretKeyStubs: case aDeleteSecretAndPublicKeys: sl = NULL; /* I'm adding these in reverse order as add_to_strlist2 @@ -4506,9 +4512,12 @@ for( ; argc; argc-- ) add_to_strlist2( &sl, argv[argc-1], utf8_strings ); delete_keys (ctrl, sl, - cmd == aDeleteSecretKeys || cmd == aDeleteSecretSubkeys, + (cmd == aDeleteSecretKeys + || cmd == aDeleteSecretSubkeys + || cmd == aDeleteSecretKeyStubs), cmd == aDeleteSecretAndPublicKeys, - cmd == aDeleteSecretSubkeys); + cmd == aDeleteSecretSubkeys, + cmd == aDeleteSecretKeyStubs); free_strlist(sl); break; diff --git a/g10/main.h b/g10/main.h --- a/g10/main.h +++ b/g10/main.h @@ -303,8 +303,9 @@ /*-- delkey.c --*/ -gpg_error_t delete_keys (ctrl_t ctrl, - strlist_t names, int secret, int allow_both, int subkeys_only); +gpg_error_t delete_keys (ctrl_t ctrl, strlist_t names, + int secret, int allow_both, + int subkeys_only, int stubs_only); /*-- keygen.c --*/ const char *get_default_pubkey_algo (void); diff --git a/po/pt.po b/po/pt.po --- a/po/pt.po +++ b/po/pt.po @@ -1998,6 +1998,9 @@ msgid "remove subkeys from the secret keyring" msgstr "remover subchaves do porta-chaves secreto" +msgid "remove key stubs from the secret keyring" +msgstr "remover cotos de chaves do porta-chaves secreto" + #, fuzzy #| msgid "sign a key" msgid "quickly sign a key"