diff --git a/doc/gpg.texi b/doc/gpg.texi index c128254c6..1933ad894 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -2304,6 +2304,10 @@ opposite meaning. The options are: on the keyring. This option is the same as running the @option{--edit-key} command "clean" after import. Defaults to no. + @item repair-keys. After import, fix various problems with the + keys. For example, this reorders signatures, and strips duplicate + signatures. Defaults to yes. + @item import-minimal Import the smallest key possible. This removes all signatures except the most recent self-signature on each user ID. This option is the diff --git a/g10/gpg.c b/g10/gpg.c index d777d1332..d12976941 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -2353,9 +2353,10 @@ main (int argc, char **argv) opt.max_cert_depth = 5; opt.escape_from = 1; opt.flags.require_cross_cert = 1; - opt.import_options = 0; + opt.import_options = IMPORT_REPAIR_KEYS; opt.export_options = EXPORT_ATTRIBUTES; - opt.keyserver_options.import_options = IMPORT_REPAIR_PKS_SUBKEY_BUG; + opt.keyserver_options.import_options = (IMPORT_REPAIR_KEYS + | IMPORT_REPAIR_PKS_SUBKEY_BUG); opt.keyserver_options.export_options = EXPORT_ATTRIBUTES; opt.keyserver_options.options = KEYSERVER_HONOR_PKA_RECORD; opt.verify_options = (LIST_SHOW_UID_VALIDITY diff --git a/g10/import.c b/g10/import.c index d9d658b1c..491609d0a 100644 --- a/g10/import.c +++ b/g10/import.c @@ -40,6 +40,7 @@ #include "../common/membuf.h" #include "../common/init.h" #include "../common/mbox-util.h" +#include "key-check.h" struct import_stats_s @@ -179,6 +180,9 @@ parse_import_options(char *str,unsigned int *options,int noisy) N_("assume the GnuPG key backup format")}, {"import-restore", IMPORT_RESTORE, NULL, NULL}, + {"repair-keys", IMPORT_REPAIR_KEYS, NULL, + N_("repair keys on import")}, + /* Aliases for backward compatibility */ {"allow-local-sigs",IMPORT_LOCAL_SIGS,NULL,NULL}, {"repair-hkp-subkey-bug",IMPORT_REPAIR_PKS_SUBKEY_BUG,NULL,NULL}, @@ -1482,6 +1486,9 @@ import_one (ctrl_t ctrl, log_info (_("key %s: PKS subkey corruption repaired\n"), keystr_from_pk(pk)); + if ((options & IMPORT_REPAIR_KEYS)) + key_check_all_keysigs (ctrl, keyblock, 0, 0); + if (chk_self_sigs (ctrl, keyblock, keyid, &non_self)) return 0; /* Invalid keyblock - error already printed. */ diff --git a/g10/options.h b/g10/options.h index 8d1d93e3d..98417d7df 100644 --- a/g10/options.h +++ b/g10/options.h @@ -346,6 +346,7 @@ EXTERN_UNLESS_MAIN_MODULE int memory_stat_debug_mode; #define IMPORT_KEEP_OWNERTTRUST (1<<8) #define IMPORT_EXPORT (1<<9) #define IMPORT_RESTORE (1<<10) +#define IMPORT_REPAIR_KEYS (1<<11) #define EXPORT_LOCAL_SIGS (1<<0) #define EXPORT_ATTRIBUTES (1<<1)