* packet.h, getkey.c (fixup_uidnode, merge_selfsigs_subkey): Keep track of
authorDavid Shaw <dshaw@jabberwocky.com>
Thu, 15 Apr 2004 00:30:05 +0000 (00:30 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Thu, 15 Apr 2004 00:30:05 +0000 (00:30 +0000)
which self-sig we actually chose.

* keyedit.c (menu_expire, menu_set_primary_uid, menu_set_preferences): Use
it here to avoid updating non-used self-sigs and possibly promoting an old
self-sig into consideration again.

g10/ChangeLog
g10/getkey.c
g10/keyedit.c
g10/packet.h

index e6a0ab2..8c023c6 100644 (file)
@@ -1,5 +1,13 @@
 2004-04-14  David Shaw  <dshaw@jabberwocky.com>
 
+       * packet.h, getkey.c (fixup_uidnode, merge_selfsigs_subkey): Keep
+       track of which self-sig we actually chose.
+
+       * keyedit.c (menu_expire, menu_set_primary_uid,
+       menu_set_preferences): Use it here to avoid updating non-used
+       self-sigs and possibly promoting an old self-sig into
+       consideration again.
+
        * options.h, import.c, keyserver-internal.h, g10.c, mainproc.c,
        keyserver.c (parse_keyserver_uri): Parse keyserver URI into a
        structure.  Cleanup for new "guess my keyserver" functionality, as
index f899cb4..381b2f5 100644 (file)
@@ -1267,6 +1267,7 @@ fixup_uidnode ( KBNODE uidnode, KBNODE signode, u32 keycreated )
     const byte *p, *sym, *hash, *zip;
     size_t n, nsym, nhash, nzip;
 
+    sig->flags.chosen_selfsig = 1; /* we chose this one */
     uid->created = 0; /* not created == invalid */
     if ( IS_UID_REV ( sig ) ) {
         uid->is_revoked = 1;
@@ -1898,6 +1899,7 @@ merge_selfsigs_subkey( KBNODE keyblock, KBNODE subnode )
       return;
 
     sig = signode->pkt->pkt.signature;
+    sig->flags.chosen_selfsig=1; /* so we know which selfsig we chose later */
         
     p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_FLAGS, &n );
     if ( p && n ) {
index 771f4d6..c96aeb4 100644 (file)
@@ -2872,7 +2872,9 @@ menu_expire( KBNODE pub_keyblock, KBNODE sec_keyblock )
            if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]
                && ( (mainkey && uid
                      && uid->created && (sig->sig_class&~3) == 0x10)
-                    || (!mainkey && sig->sig_class == 0x18)  ) ) {
+                    || (!mainkey && sig->sig_class == 0x18)  )
+               && sig->flags.chosen_selfsig )
+             {
                /* this is a selfsignature which is to be replaced */
                PKT_signature *newsig;
                PACKET *newpkt;
@@ -3012,8 +3014,10 @@ menu_set_primary_uid ( KBNODE pub_keyblock, KBNODE sec_keyblock )
        else if ( main_pk && uid && node->pkt->pkttype == PKT_SIGNATURE ) {
            PKT_signature *sig = node->pkt->pkt.signature;
            if ( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]
-               && (uid && (sig->sig_class&~3) == 0x10)
-               && attribute == (uid->attrib_data!=NULL)) {
+                && (uid && (sig->sig_class&~3) == 0x10)
+                && attribute == (uid->attrib_data!=NULL)
+                && sig->flags.chosen_selfsig )
+             {
              if(sig->version < 4) {
                char *user=utf8_to_native(uid->name,strlen(uid->name),0);
 
@@ -3122,7 +3126,8 @@ menu_set_preferences (KBNODE pub_keyblock, KBNODE sec_keyblock )
                   && node->pkt->pkttype == PKT_SIGNATURE ) {
            PKT_signature *sig = node->pkt->pkt.signature;
            if ( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]
-                && (uid && (sig->sig_class&~3) == 0x10) ) {
+                && (uid && (sig->sig_class&~3) == 0x10)
+                && sig->flags.chosen_selfsig ) {
              if( sig->version < 4 ) {
                char *user=utf8_to_native(uid->name,strlen(uid->name),0);
 
index c6e8c04..8d018e0 100644 (file)
@@ -125,6 +125,7 @@ typedef struct {
     struct {
        unsigned checked:1; /* signature has been checked */
        unsigned valid:1;   /* signature is good (if checked is set) */
+        unsigned chosen_selfsig:1; /* a selfsig that is the chosen one */
        unsigned unknown_critical:1;
         unsigned exportable:1;
         unsigned revocable:1;