# # # patch "automate.cc" # from [441d4acfbe91eeac5a9d3e7613efd1a31fea429b] # to [87049e712992df21fb42ef1be995c32b6ff5bc4d] # # patch "cmd_key_cert.cc" # from [403bf9449641a185318b6e1596f000993c8b432c] # to [cecda4ca789d456c6d47c3807ad0a263f0a33d4a] # # patch "key_store.cc" # from [cccb570b37409c34036e52f908a7246904d46337] # to [827e5ba6ba025c78b758a1a3ae2f0c83e2913bc3] # # patch "key_store.hh" # from [20869ae8f0391a7c642f4eaa6672c2165cd6a465] # to [f6177a89fdc8de0253742753796d9433358697ac] # ============================================================ --- automate.cc 441d4acfbe91eeac5a9d3e7613efd1a31fea429b +++ automate.cc 87049e712992df21fb42ef1be995c32b6ff5bc4d @@ -1792,13 +1792,21 @@ CMD_AUTOMATE(genkey, N_("KEYID PASSPHRAS database db(app); key_store keys(app); - key_name ident; - internalize_key_name(idx(args, 0), ident); + key_name name; + internalize_key_name(idx(args, 0), name); + E(!keys.key_pair_exists(name), origin::user, + F("you already have a key named '%s'") % name); + if (db.database_specified()) + { + E(!db.public_key_exists(name), origin::user, + F("there is another key named '%s'") % name); + } + utf8 passphrase = idx(args, 1); key_id hash; - keys.create_key_pair(db, ident, &passphrase, &hash); + keys.create_key_pair(db, name, &passphrase, &hash); basic_io::printer prt; basic_io::stanza stz; @@ -1808,7 +1816,7 @@ CMD_AUTOMATE(genkey, N_("KEYID PASSPHRAS publocs.push_back("keystore"); privlocs.push_back("keystore"); - stz.push_str_pair(syms::name, ident()); + stz.push_str_pair(syms::name, name()); stz.push_binary_pair(syms::hash, hash.inner()); stz.push_str_multi(syms::public_location, publocs); stz.push_str_multi(syms::private_location, privlocs); ============================================================ --- cmd_key_cert.cc 403bf9449641a185318b6e1596f000993c8b432c +++ cmd_key_cert.cc cecda4ca789d456c6d47c3807ad0a263f0a33d4a @@ -40,10 +40,18 @@ CMD(genkey, "genkey", "", CMD_REF(key_an if (args.size() != 1) throw usage(execid); - key_name ident; - internalize_key_name(idx(args, 0), ident); + key_name name; + internalize_key_name(idx(args, 0), name); - keys.create_key_pair(db, ident); + E(!keys.key_pair_exists(name), origin::user, + F("you already have a key named '%s'") % name); + if (db.database_specified()) + { + E(!db.public_key_exists(name), origin::user, + F("there is another key named '%s'") % name); + } + + keys.create_key_pair(db, name); } CMD(dropkey, "dropkey", "", CMD_REF(key_and_cert), N_("KEYID"), ============================================================ --- key_store.cc cccb570b37409c34036e52f908a7246904d46337 +++ key_store.cc 827e5ba6ba025c78b758a1a3ae2f0c83e2913bc3 @@ -254,6 +254,19 @@ bool } bool +key_store::key_pair_exists(key_name const & name) +{ + s->maybe_read_key_dir(); + for (key_map::const_iterator i = s->keys.begin(); + i != s->keys.end(); ++i) + { + if (i->second.first == name) + return true; + } + return false; +} + +bool key_store_state::maybe_get_key_pair(key_id const & ident, key_name & name, keypair & kp) ============================================================ --- key_store.hh 20869ae8f0391a7c642f4eaa6672c2165cd6a465 +++ key_store.hh f6177a89fdc8de0253742753796d9433358697ac @@ -64,6 +64,7 @@ public: void get_key_ids(std::vector & priv); bool key_pair_exists(key_id const & ident); + bool key_pair_exists(key_name const & name); void get_key_pair(key_id const & ident, keypair & kp);