diff --git a/g10/ChangeLog b/g10/ChangeLog index ac331f078..338553686 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,18 @@ +2002-04-12 David Shaw + + * pkclist.c (build_pk_list): Fix bug that allowed a key to be + selected twice in batch mode if one instance was the default + recipient and the other was an encrypt-to. Noted by Stefan + Bellon. + + * parse-packet.c (dump_sig_subpkt): Show data in trust and regexp + sig subpackets. + + * keyedit.c (keyedit_menu): Use new function real_uids_left to + prevent deleting the last real (i.e. non-attribute) uid. Again, + according to the attribute draft. (menu_showphoto): Make another + string translatable. + 2002-04-11 David Shaw * build-packet.c (build_sig_subpkt): Delete subpackets from both diff --git a/g10/keyedit.c b/g10/keyedit.c index 5d6b11d14..b6e730f8b 100644 --- a/g10/keyedit.c +++ b/g10/keyedit.c @@ -58,6 +58,7 @@ static int count_uids( KBNODE keyblock ); static int count_uids_with_flag( KBNODE keyblock, unsigned flag ); static int count_keys_with_flag( KBNODE keyblock, unsigned flag ); static int count_selected_uids( KBNODE keyblock ); +static int real_uids_left( KBNODE keyblock ); static int count_selected_keys( KBNODE keyblock ); static int menu_revsig( KBNODE keyblock ); static int menu_revkey( KBNODE pub_keyblock, KBNODE sec_keyblock ); @@ -1104,7 +1105,7 @@ keyedit_menu( const char *username, STRLIST locusr, STRLIST commands, if( !(n1=count_selected_uids(keyblock)) ) tty_printf(_("You must select at least one user ID.\n")); - else if( count_uids(keyblock) - n1 < 1 ) + else if( real_uids_left(keyblock) < 1 ) tty_printf(_("You can't delete the last user ID!\n")); else if( cpr_get_answer_is_yes( "keyedit.remove.uid.okay", @@ -2368,6 +2369,21 @@ count_selected_keys( KBNODE keyblock ) return count_keys_with_flag( keyblock, NODFLG_SELKEY); } +/* returns how many real (i.e. not attribute) uids are unmarked */ +static int +real_uids_left( KBNODE keyblock ) +{ + KBNODE node; + int real=0; + + for(node=keyblock;node;node=node->next) + if(node->pkt->pkttype==PKT_USER_ID && !(node->flag&NODFLG_SELUID) && + !node->pkt->pkt.user_id->attrib_data) + real++; + + return real; +} + /* * Ask whether the signature should be revoked. If the user commits this, * flag bit MARK_A is set on the signature and the user ID. @@ -2674,8 +2690,9 @@ menu_showphoto( KBNODE keyblock ) else keyid_from_pk(pk, keyid); - tty_printf("Displaying photo ID of size %ld for key 0x%08lX " - "(uid %d)\n",uid->attribs->len,(ulong)keyid[1],count); + tty_printf(_("Displaying %s photo ID of size %ld " + "for key 0x%08lX (uid %d)\n"), + "jpeg",uid->attribs->len,(ulong)keyid[1],count); show_photo(uid->attribs,pk); } } diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 9db08fb70..86cdccd7a 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -768,10 +768,16 @@ dump_sig_subpkt( int hashed, int type, int critical, printf("%sexportable", *buffer? "":"not "); break; case SIGSUBPKT_TRUST: - p = "trust signature"; + if(length!=2) + p="[invalid trust signature]"; + else + printf("trust signature of level %d, amount %d",buffer[0],buffer[1]); break; case SIGSUBPKT_REGEXP: - p = "regular expression"; + if(!length) + p="[invalid regexp]"; + else + printf("regular expression: \"%s\"",buffer); break; case SIGSUBPKT_REVOCABLE: if( length ) diff --git a/g10/pkclist.c b/g10/pkclist.c index 120fb4865..306dd4ee2 100644 --- a/g10/pkclist.c +++ b/g10/pkclist.c @@ -848,12 +848,20 @@ build_pk_list( STRLIST remusr, PK_LIST *ret_pk_list, unsigned use ) if( rc ) log_error(_("unknown default recipient `%s'\n"), def_rec ); else if( !(rc=check_pubkey_algo2(pk->pubkey_algo, use)) ) { + /* Mark any_recipients here since the default recipient + would have been used if it wasn't already there. It + doesn't really matter if we got this key from the default + recipient or an encrypt-to. */ + any_recipients = 1; + if (key_present_in_pk_list(pk_list, pk) == 0) + log_info(_("skipped: public key already set as default recipient\n")); + else { PK_LIST r = m_alloc( sizeof *r ); r->pk = pk; pk = NULL; r->next = pk_list; r->mark = 0; pk_list = r; - any_recipients = 1; + } } if( pk ) { free_public_key( pk );