aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g10/ChangeLog10
-rw-r--r--g10/card-util.c51
-rw-r--r--g10/import.c3
-rw-r--r--g10/keyserver-internal.h3
-rw-r--r--g10/keyserver.c5
5 files changed, 67 insertions, 5 deletions
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 <[email protected]>
+
+ * 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 <[email protected]>
* 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
@@ -511,6 +512,49 @@ change_url (void)
}
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)
{
char *data;
@@ -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