1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-07 23:27:48 +02:00

agent: Support --force option for IMPORT_KEY.

* agent/command.c (cmd_keywrap_key): New option --force.
This commit is contained in:
NIIBE Yutaka 2015-12-24 09:51:16 +09:00
parent ae3e5c25ca
commit e684c634df

View File

@ -2028,7 +2028,7 @@ cmd_keywrap_key (assuan_context_t ctx, char *line)
static const char hlp_import_key[] = static const char hlp_import_key[] =
"IMPORT_KEY [--unattended] [<cache_nonce>]\n" "IMPORT_KEY [--unattended] [--force] [<cache_nonce>]\n"
"\n" "\n"
"Import a secret key into the key store. The key is expected to be\n" "Import a secret key into the key store. The key is expected to be\n"
"encrypted using the current session's key wrapping key (cf. command\n" "encrypted using the current session's key wrapping key (cf. command\n"
@ -2036,13 +2036,14 @@ static const char hlp_import_key[] =
"no arguments but uses the inquiry \"KEYDATA\" to ask for the actual\n" "no arguments but uses the inquiry \"KEYDATA\" to ask for the actual\n"
"key data. The unwrapped key must be a canonical S-expression. The\n" "key data. The unwrapped key must be a canonical S-expression. The\n"
"option --unattended tries to import the key as-is without any\n" "option --unattended tries to import the key as-is without any\n"
"re-encryption"; "re-encryption. Exisiting key can be overwritten with --force.";
static gpg_error_t static gpg_error_t
cmd_import_key (assuan_context_t ctx, char *line) cmd_import_key (assuan_context_t ctx, char *line)
{ {
ctrl_t ctrl = assuan_get_pointer (ctx); ctrl_t ctrl = assuan_get_pointer (ctx);
gpg_error_t err; gpg_error_t err;
int opt_unattended; int opt_unattended;
int force;
unsigned char *wrappedkey = NULL; unsigned char *wrappedkey = NULL;
size_t wrappedkeylen; size_t wrappedkeylen;
gcry_cipher_hd_t cipherhd = NULL; gcry_cipher_hd_t cipherhd = NULL;
@ -2066,6 +2067,7 @@ cmd_import_key (assuan_context_t ctx, char *line)
} }
opt_unattended = has_option (line, "--unattended"); opt_unattended = has_option (line, "--unattended");
force = has_option (line, "--force");
line = skip_options (line); line = skip_options (line);
p = line; p = line;
@ -2180,7 +2182,7 @@ cmd_import_key (assuan_context_t ctx, char *line)
} }
else else
{ {
if (!agent_key_available (grip)) if (!force && !agent_key_available (grip))
err = gpg_error (GPG_ERR_EEXIST); err = gpg_error (GPG_ERR_EEXIST);
else else
{ {
@ -2202,10 +2204,10 @@ cmd_import_key (assuan_context_t ctx, char *line)
err = agent_protect (key, passphrase, &finalkey, &finalkeylen, err = agent_protect (key, passphrase, &finalkey, &finalkeylen,
ctrl->s2k_count); ctrl->s2k_count);
if (!err) if (!err)
err = agent_write_private_key (grip, finalkey, finalkeylen, 0); err = agent_write_private_key (grip, finalkey, finalkeylen, force);
} }
else else
err = agent_write_private_key (grip, key, realkeylen, 0); err = agent_write_private_key (grip, key, realkeylen, force);
leave: leave:
gcry_sexp_release (openpgp_sexp); gcry_sexp_release (openpgp_sexp);