aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shaw <[email protected]>2005-06-12 21:17:46 +0000
committerDavid Shaw <[email protected]>2005-06-12 21:17:46 +0000
commitf3c4b07d057b87350ff9d2c817afcf2500a372af (patch)
treecbf96a6d034b9271e6ff08d118f4f801be09f176
parent* getkey.c (merge_selfsigs_main, merge_selfsigs_subkey): Make sure (diff)
downloadgnupg-f3c4b07d057b87350ff9d2c817afcf2500a372af.tar.gz
gnupg-f3c4b07d057b87350ff9d2c817afcf2500a372af.zip
* options.h, import.c (parse_import_options, clean_sigs_from_all_uids,
import_one): Add import-clean-sigs option to automatically clean a key when importing. Note that when importing a key that is already on the local keyring, the clean applies to the merged key - i.e. existing superceded or invalid signatures are removed.
Diffstat (limited to '')
-rw-r--r--g10/ChangeLog7
-rw-r--r--g10/import.c47
-rw-r--r--g10/options.h1
3 files changed, 49 insertions, 6 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index c7fad87c5..c123d8e03 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,5 +1,12 @@
2005-06-12 David Shaw <[email protected]>
+ * options.h, import.c (parse_import_options,
+ clean_sigs_from_all_uids, import_one): Add import-clean-sigs
+ option to automatically clean a key when importing. Note that
+ when importing a key that is already on the local keyring, the
+ clean applies to the merged key - i.e. existing superceded or
+ invalid signatures are removed.
+
* getkey.c (merge_selfsigs_main, merge_selfsigs_subkey): Make sure
that even after keys may be merged together, we only have one
chosen selfsig.
diff --git a/g10/import.c b/g10/import.c
index 04099deba..145bee84a 100644
--- a/g10/import.c
+++ b/g10/import.c
@@ -55,6 +55,7 @@ struct stats_s {
ulong secret_dups;
ulong skipped_new_keys;
ulong not_imported;
+ ulong n_sigs_cleaned;
};
@@ -94,6 +95,8 @@ parse_import_options(char *str,unsigned int *options,int noisy)
{"fast-import",IMPORT_FAST,NULL},
{"convert-sk-to-pk",IMPORT_SK2PK,NULL},
{"merge-only",IMPORT_MERGE_ONLY,NULL},
+ {"import-clean",IMPORT_CLEAN_SIGS,NULL},
+ {"import-clean-sigs",IMPORT_CLEAN_SIGS,NULL},
/* Aliases for backward compatibility */
{"allow-local-sigs",IMPORT_LOCAL_SIGS,NULL},
{"repair-hkp-subkey-bug",IMPORT_REPAIR_PKS_SUBKEY_BUG,NULL},
@@ -302,6 +305,8 @@ import_print_stats (void *hd)
log_info(_(" secret keys unchanged: %lu\n"), stats->secret_dups );
if( stats->not_imported )
log_info(_(" not imported: %lu\n"), stats->not_imported );
+ if( stats->n_sigs_cleaned)
+ log_info(_(" signatures cleaned: %lu\n"),stats->n_sigs_cleaned);
}
if( is_status_enabled() ) {
@@ -649,6 +654,20 @@ check_prefs(KBNODE keyblock)
}
}
+static int
+clean_sigs_from_all_uids(KBNODE keyblock)
+{
+ KBNODE uidnode;
+ int deleted=0;
+
+ for(uidnode=keyblock->next;uidnode;uidnode=uidnode->next)
+ if(uidnode->pkt->pkttype==PKT_USER_ID)
+ deleted+=clean_sigs_from_uid(keyblock,uidnode,opt.verbose);
+
+ return deleted;
+}
+
+
/****************
* Try to import one keyblock. Return an error only in serious cases, but
* never for an invalid keyblock. It uses log_error to increase the
@@ -708,6 +727,13 @@ import_one( const char *fname, KBNODE keyblock,
return 0;
}
+ /* Clean the key that we're about to import, to cut down on things
+ that we have to clean later. This has no practical impact on
+ the end result, but does result in less logging which might
+ confuse the user. */
+ if(options&IMPORT_CLEAN_SIGS)
+ clean_sigs_from_all_uids(keyblock);
+
clear_kbnode_flags( keyblock );
if((options&IMPORT_REPAIR_PKS_SUBKEY_BUG) && fix_pks_corruption(keyblock)
@@ -808,7 +834,7 @@ import_one( const char *fname, KBNODE keyblock,
}
else { /* merge */
KEYDB_HANDLE hd;
- int n_uids, n_sigs, n_subk;
+ int n_uids, n_sigs, n_subk, n_sigs_cleaned;
/* Compare the original against the new key; just to be sure nothing
* weird is going on */
@@ -849,14 +875,19 @@ import_one( const char *fname, KBNODE keyblock,
/* and try to merge the block */
clear_kbnode_flags( keyblock_orig );
clear_kbnode_flags( keyblock );
- n_uids = n_sigs = n_subk = 0;
+ n_uids = n_sigs = n_subk = n_sigs_cleaned = 0;
rc = merge_blocks( fname, keyblock_orig, keyblock,
- keyid, &n_uids, &n_sigs, &n_subk );
- if( rc ) {
+ keyid, &n_uids, &n_sigs, &n_subk );
+ if( rc )
+ {
keydb_release (hd);
goto leave;
- }
- if( n_uids || n_sigs || n_subk ) {
+ }
+
+ if(options&IMPORT_CLEAN_SIGS)
+ n_sigs_cleaned=clean_sigs_from_all_uids(keyblock_orig);
+
+ if( n_uids || n_sigs || n_subk || n_sigs_cleaned) {
mod_key = 1;
/* keyblock_orig has been updated; write */
rc = keydb_update_keyblock (hd, keyblock_orig);
@@ -888,12 +919,16 @@ import_one( const char *fname, KBNODE keyblock,
else if( n_subk )
log_info( _("key %s: \"%s\" %d new subkeys\n"),
keystr(keyid), p, n_subk );
+ if(n_sigs_cleaned)
+ log_info(_("key %s: \"%s\" %d signatures cleaned\n"),
+ keystr(keyid),p,n_sigs_cleaned);
m_free(p);
}
stats->n_uids +=n_uids;
stats->n_sigs +=n_sigs;
stats->n_subk +=n_subk;
+ stats->n_sigs_cleaned +=n_sigs_cleaned;
if (is_status_enabled ())
print_import_ok (pk, NULL,
diff --git a/g10/options.h b/g10/options.h
index 87c10673f..f0b6f199f 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -251,6 +251,7 @@ struct {
#define IMPORT_FAST (1<<2)
#define IMPORT_SK2PK (1<<3)
#define IMPORT_MERGE_ONLY (1<<4)
+#define IMPORT_CLEAN_SIGS (1<<5)
#define EXPORT_LOCAL_SIGS (1<<0)
#define EXPORT_ATTRIBUTES (1<<1)