mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
* keyedit.c (menu_set_notation): New function to set notations on
self-signatures. (keyedit_menu): Call it here. (tty_print_notations): Helper. (show_prefs): Show notations in "showpref".
This commit is contained in:
parent
5460153264
commit
d810409068
@ -1,5 +1,11 @@
|
||||
2006-03-08 David Shaw <dshaw@jabberwocky.com>
|
||||
|
||||
* keyedit.c (menu_set_notation): New function to set notations on
|
||||
self-signatures.
|
||||
(keyedit_menu): Call it here.
|
||||
(tty_print_notations): Helper.
|
||||
(show_prefs): Show notations in "showpref".
|
||||
|
||||
* mainproc.c (get_pka_address), keylist.c (show_notation): Remove
|
||||
duplicate code by using notation functions.
|
||||
|
||||
|
248
g10/keyedit.c
248
g10/keyedit.c
@ -67,6 +67,8 @@ static int menu_set_primary_uid( KBNODE pub_keyblock, KBNODE sec_keyblock );
|
||||
static int menu_set_preferences( KBNODE pub_keyblock, KBNODE sec_keyblock );
|
||||
static int menu_set_keyserver_url (const char *url,
|
||||
KBNODE pub_keyblock, KBNODE sec_keyblock );
|
||||
static int menu_set_notation(const char *string,
|
||||
KBNODE pub_keyblock,KBNODE sec_keyblock);
|
||||
static int menu_select_uid( KBNODE keyblock, int idx );
|
||||
static int menu_select_uid_namehash( KBNODE keyblock, const char *namehash );
|
||||
static int menu_select_key( KBNODE keyblock, int idx );
|
||||
@ -1339,8 +1341,9 @@ enum cmdids
|
||||
cmdSAVE, cmdADDUID, cmdADDPHOTO, cmdDELUID, cmdADDKEY, cmdDELKEY,
|
||||
cmdADDREVOKER, cmdTOGGLE, cmdSELKEY, cmdPASSWD, cmdTRUST, cmdPREF,
|
||||
cmdEXPIRE, cmdBACKSIGN, cmdENABLEKEY, cmdDISABLEKEY, cmdSHOWPREF,
|
||||
cmdSETPREF, cmdPREFKS, cmdINVCMD, cmdSHOWPHOTO, cmdUPDTRUST, cmdCHKTRUST,
|
||||
cmdADDCARDKEY, cmdKEYTOCARD, cmdBKUPTOCARD, cmdCLEAN, cmdMINIMIZE, cmdNOP
|
||||
cmdSETPREF, cmdPREFKS, cmdNOTATION, cmdINVCMD, cmdSHOWPHOTO, cmdUPDTRUST,
|
||||
cmdCHKTRUST, cmdADDCARDKEY, cmdKEYTOCARD, cmdBKUPTOCARD, cmdCLEAN,
|
||||
cmdMINIMIZE, cmdNOP
|
||||
};
|
||||
|
||||
static struct
|
||||
@ -1422,7 +1425,9 @@ static struct
|
||||
{ "updpref" , cmdSETPREF , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK, NULL },
|
||||
|
||||
{ "keyserver",cmdPREFKS , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
|
||||
N_("set preferred keyserver URL for the selected user IDs")},
|
||||
N_("set the preferred keyserver URL for the selected user IDs")},
|
||||
{ "notation", cmdNOTATION , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
|
||||
N_("set a notation for the selected user IDs")},
|
||||
{ "passwd" , cmdPASSWD , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
|
||||
N_("change the passphrase") },
|
||||
/* Alias */
|
||||
@ -2151,6 +2156,16 @@ keyedit_menu( const char *username, STRLIST locusr,
|
||||
}
|
||||
break;
|
||||
|
||||
case cmdNOTATION:
|
||||
if( menu_set_notation ( *arg_string?arg_string:NULL,
|
||||
keyblock, sec_keyblock ) )
|
||||
{
|
||||
merge_keys_and_selfsig( keyblock );
|
||||
modified = 1;
|
||||
redisplay = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case cmdNOP:
|
||||
break;
|
||||
|
||||
@ -2238,8 +2253,36 @@ keyedit_menu( const char *username, STRLIST locusr,
|
||||
xfree(answer);
|
||||
}
|
||||
|
||||
static void
|
||||
tty_print_notations(int indent,PKT_signature *sig)
|
||||
{
|
||||
int first=1;
|
||||
struct notation *notation,*nd;
|
||||
|
||||
if(indent<0)
|
||||
{
|
||||
first=0;
|
||||
indent=-indent;
|
||||
}
|
||||
|
||||
notation=sig_to_notation(sig);
|
||||
|
||||
for(nd=notation;nd;nd=nd->next)
|
||||
{
|
||||
if(!first)
|
||||
tty_printf("%*s",indent,"");
|
||||
else
|
||||
first=0;
|
||||
|
||||
tty_print_utf8_string(nd->name,strlen(nd->name));
|
||||
tty_printf("=");
|
||||
tty_print_utf8_string(nd->value,strlen(nd->value));
|
||||
tty_printf("\n");
|
||||
}
|
||||
|
||||
free_notation(notation);
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* show preferences of a public keyblock.
|
||||
*/
|
||||
@ -2369,6 +2412,13 @@ show_prefs (PKT_user_id *uid, PKT_signature *selfsig, int verbose)
|
||||
tty_print_utf8_string(pref_ks,pref_ks_len);
|
||||
tty_printf("\n");
|
||||
}
|
||||
|
||||
if(selfsig->flags.notation)
|
||||
{
|
||||
tty_printf (" ");
|
||||
tty_printf(_("Notations: "));
|
||||
tty_print_notations(5+strlen(_("Notations: ")),selfsig);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -4100,6 +4150,196 @@ menu_set_keyserver_url (const char *url,
|
||||
return modified;
|
||||
}
|
||||
|
||||
static int
|
||||
menu_set_notation(const char *string,KBNODE pub_keyblock,KBNODE sec_keyblock)
|
||||
{
|
||||
PKT_secret_key *sk; /* copy of the main sk */
|
||||
PKT_public_key *main_pk;
|
||||
PKT_user_id *uid;
|
||||
KBNODE node;
|
||||
u32 keyid[2];
|
||||
int selected, select_all;
|
||||
int modified = 0;
|
||||
char *answer;
|
||||
struct notation *notation;
|
||||
|
||||
no_primary_warning(pub_keyblock);
|
||||
|
||||
if(string)
|
||||
answer=xstrdup(string);
|
||||
else
|
||||
{
|
||||
answer=cpr_get_utf8("keyedit.add_notation",
|
||||
_("Enter the notation: "));
|
||||
if(answer[0]=='\0' || answer[0]=='\004')
|
||||
{
|
||||
xfree(answer);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(ascii_strcasecmp(answer,"none")==0)
|
||||
notation=NULL; /* delete them all */
|
||||
else
|
||||
{
|
||||
notation=string_to_notation(answer,0);
|
||||
if(!notation)
|
||||
{
|
||||
xfree(answer);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
xfree(answer);
|
||||
|
||||
select_all = !count_selected_uids (pub_keyblock);
|
||||
|
||||
node = find_kbnode( sec_keyblock, PKT_SECRET_KEY );
|
||||
sk = copy_secret_key( NULL, node->pkt->pkt.secret_key);
|
||||
|
||||
/* Now we can actually change the self signature(s) */
|
||||
main_pk = NULL;
|
||||
uid = NULL;
|
||||
selected = 0;
|
||||
for ( node=pub_keyblock; node; node = node->next )
|
||||
{
|
||||
if ( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
|
||||
break; /* ready */
|
||||
|
||||
if ( node->pkt->pkttype == PKT_PUBLIC_KEY )
|
||||
{
|
||||
main_pk = node->pkt->pkt.public_key;
|
||||
keyid_from_pk( main_pk, keyid );
|
||||
}
|
||||
else if ( node->pkt->pkttype == PKT_USER_ID )
|
||||
{
|
||||
uid = node->pkt->pkt.user_id;
|
||||
selected = select_all || (node->flag & NODFLG_SELUID);
|
||||
}
|
||||
else if ( main_pk && uid && selected
|
||||
&& 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)
|
||||
&& sig->flags.chosen_selfsig)
|
||||
{
|
||||
char *user=utf8_to_native(uid->name,strlen(uid->name),0);
|
||||
if( sig->version < 4 )
|
||||
log_info(_("skipping v3 self-signature on user ID \"%s\"\n"),
|
||||
user);
|
||||
else
|
||||
{
|
||||
PKT_signature *newsig;
|
||||
PACKET *newpkt;
|
||||
int rc,skip=0,addonly=1;
|
||||
|
||||
if(sig->flags.notation)
|
||||
{
|
||||
tty_printf("Current notations for user ID \"%s\":\n",
|
||||
user);
|
||||
tty_print_notations(-10,sig);
|
||||
}
|
||||
else
|
||||
{
|
||||
tty_printf("No notations on user ID \"%s\"\n",user);
|
||||
if(notation==NULL)
|
||||
{
|
||||
/* There are no current notations, so there
|
||||
is no point in trying to un-set them. */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(notation)
|
||||
{
|
||||
struct notation *n,*list=sig_to_notation(sig);
|
||||
notation->next=list;
|
||||
|
||||
for(n=list;n;n=n->next)
|
||||
if(strcmp(n->name,notation->name)==0)
|
||||
{
|
||||
if(strcmp(n->value,notation->value)==0)
|
||||
{
|
||||
/* Adding the same notation twice, so
|
||||
don't add it at all. */
|
||||
skip=1;
|
||||
tty_printf("Skipping notation: %s=%s\n",
|
||||
notation->name,notation->value);
|
||||
notation->flags.ignore=1;
|
||||
break;
|
||||
}
|
||||
else if(notation->value[0]=='\0')
|
||||
{
|
||||
/* No value, so we don't replace this
|
||||
notation with anything. */
|
||||
n->flags.ignore=1;
|
||||
notation->flags.ignore=1;
|
||||
addonly=0;
|
||||
}
|
||||
|
||||
if(n->flags.ignore)
|
||||
tty_printf("Removing notation: %s=%s\n",
|
||||
n->name,n->value);
|
||||
}
|
||||
|
||||
if(!notation->flags.ignore)
|
||||
tty_printf("Adding notation: %s=%s\n",
|
||||
notation->name,notation->value);
|
||||
}
|
||||
else
|
||||
{
|
||||
tty_printf("Removing all notations\n");
|
||||
addonly=0;
|
||||
}
|
||||
|
||||
if(skip
|
||||
|| (!addonly
|
||||
&& !cpr_get_answer_is_yes("keyedit.confirm_notation",
|
||||
_("Proceed? (y/N) "))))
|
||||
continue;
|
||||
|
||||
rc = update_keysig_packet (&newsig, sig,
|
||||
main_pk, uid, NULL,
|
||||
sk,
|
||||
keygen_add_notations, notation );
|
||||
if( rc )
|
||||
{
|
||||
log_error ("update_keysig_packet failed: %s\n",
|
||||
g10_errstr(rc));
|
||||
free_secret_key( sk );
|
||||
free_notation(notation);
|
||||
xfree(user);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* replace the packet */
|
||||
newpkt = xmalloc_clear( sizeof *newpkt );
|
||||
newpkt->pkttype = PKT_SIGNATURE;
|
||||
newpkt->pkt.signature = newsig;
|
||||
free_packet( node->pkt );
|
||||
xfree( node->pkt );
|
||||
node->pkt = newpkt;
|
||||
modified = 1;
|
||||
|
||||
if(notation)
|
||||
{
|
||||
/* Snip off the notation list from the sig */
|
||||
free_notation(notation->next);
|
||||
notation->next=NULL;
|
||||
}
|
||||
|
||||
xfree(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free_notation(notation);
|
||||
free_secret_key( sk );
|
||||
return modified;
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* Select one user id or remove all selection if index is 0.
|
||||
|
Loading…
x
Reference in New Issue
Block a user