diff --git a/g10/ChangeLog b/g10/ChangeLog index b042800f3..74a1f1080 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,13 @@ +2004-09-11 David Shaw + + * card-util.c (fetch_url, card_edit): Use the pubkey URL stored on + the card to fetch an updated copy. Works with either straight + URLs or HKP or LDAP keyservers. + + * keyserver-internal.h, keyserver.c (keyserver_import_fprint), + import.c (revocation_present): Use a keyserver_spec so the caller + can pass in whatever keyserver they like. + 2004-09-10 David Shaw * app-openpgp.c (get_cached_data): Avoid mallocing zero since it diff --git a/g10/card-util.c b/g10/card-util.c index 2d7f00800..597faba6d 100644 --- a/g10/card-util.c +++ b/g10/card-util.c @@ -34,6 +34,7 @@ #include "status.h" #include "options.h" #include "main.h" +#include "keyserver-internal.h" #if GNUPG_MAJOR_VERSION == 1 #include "cardglue.h" #else @@ -510,6 +511,49 @@ change_url (void) return rc; } +static int +fetch_url(void) +{ + int rc; + struct agent_card_info_s info; + + memset(&info,0,sizeof(info)); + + rc=agent_scd_getattr("PUBKEY-URL",&info); + if(rc) + log_error("error retrieving URL from card: %s\n",gpg_strerror(rc)); + else if(info.pubkey_url) + { + struct keyserver_spec *spec=NULL; + + rc=agent_scd_getattr("KEY-FPR",&info); + if(rc) + log_error("error retrieving key fingerprint from card: %s\n", + gpg_strerror(rc)); + else + { + spec=parse_keyserver_uri(info.pubkey_url,0,NULL,0); + if(spec && info.fpr1valid) + { + /* This is not perfectly right. Currently, all card + fingerprints are 20 digits, but what about + fingerprints for a future v5 key? We should get the + length from somewhere lower in the code. In any + event, the fpr/keyid is not meaningful for straight + HTTP fetches, but using it allows the card to point + to HKP and LDAP servers as well. */ + rc=keyserver_import_fprint(info.fpr1,20,spec); + free_keyserver_spec(spec); + } + } + } + else + log_error("no URL set on card\n"); + + return rc; +} + + static int change_login (const char *args) { @@ -792,7 +836,7 @@ card_edit (STRLIST commands) enum cmdids { cmdNOP = 0, cmdQUIT, cmdHELP, cmdLIST, cmdDEBUG, - cmdNAME, cmdURL, cmdLOGIN, cmdLANG, cmdSEX, cmdCAFPR, + cmdNAME, cmdURL, cmdFETCH, cmdLOGIN, cmdLANG, cmdSEX, cmdCAFPR, cmdFORCESIG, cmdGENERATE, cmdPASSWD, cmdINVCMD }; @@ -811,6 +855,7 @@ card_edit (STRLIST commands) { N_("debug") , cmdDEBUG , NULL }, { N_("name") , cmdNAME , N_("change card holder's name") }, { N_("url") , cmdURL , N_("change URL to retrieve key") }, + { N_("fetch") , cmdFETCH , N_("fetch the key specified in the card URL") }, { N_("login") , cmdLOGIN , N_("change the login name") }, { N_("lang") , cmdLANG , N_("change the language preferences") }, { N_("sex") , cmdSEX , N_("change card holder's sex") }, @@ -932,6 +977,10 @@ card_edit (STRLIST commands) change_url (); break; + case cmdFETCH: + fetch_url(); + break; + case cmdLOGIN: change_login (arg_string); break; diff --git a/g10/import.c b/g10/import.c index a718e91d1..97be67877 100644 --- a/g10/import.c +++ b/g10/import.c @@ -1699,7 +1699,8 @@ revocation_present(KBNODE keyblock) " fetching revocation key %s\n"), tempkeystr,keystr(keyid)); keyserver_import_fprint(sig->revkey[idx]->fpr, - MAX_FINGERPRINT_LEN); + MAX_FINGERPRINT_LEN, + opt.keyserver); /* Do we have it now? */ rc=get_pubkey_byfprint_fast (NULL, diff --git a/g10/keyserver-internal.h b/g10/keyserver-internal.h index 851f1a904..2fbfd5431 100644 --- a/g10/keyserver-internal.h +++ b/g10/keyserver-internal.h @@ -34,7 +34,8 @@ struct keyserver_spec *parse_keyserver_uri(const char *uri,int require_scheme, struct keyserver_spec *parse_preferred_keyserver(PKT_signature *sig); int keyserver_export(STRLIST users); int keyserver_import(STRLIST users); -int keyserver_import_fprint(const byte *fprint,size_t fprint_len); +int keyserver_import_fprint(const byte *fprint,size_t fprint_len, + struct keyserver_spec *keyserver); int keyserver_import_keyid(u32 *keyid,struct keyserver_spec *keyserver); int keyserver_refresh(STRLIST users); int keyserver_search(STRLIST tokens); diff --git a/g10/keyserver.c b/g10/keyserver.c index 93bc5966c..dc1230c64 100644 --- a/g10/keyserver.c +++ b/g10/keyserver.c @@ -1318,7 +1318,8 @@ keyserver_import(STRLIST users) } int -keyserver_import_fprint(const byte *fprint,size_t fprint_len) +keyserver_import_fprint(const byte *fprint,size_t fprint_len, + struct keyserver_spec *keyserver) { KEYDB_SEARCH_DESC desc; @@ -1333,7 +1334,7 @@ keyserver_import_fprint(const byte *fprint,size_t fprint_len) memcpy(desc.u.fpr,fprint,fprint_len); - return keyserver_work(GET,NULL,&desc,1,opt.keyserver); + return keyserver_work(GET,NULL,&desc,1,keyserver); } int