aboutsummaryrefslogtreecommitdiffstats
path: root/g10/keyserver.c
diff options
context:
space:
mode:
authorDavid Shaw <[email protected]>2004-05-22 03:50:20 +0000
committerDavid Shaw <[email protected]>2004-05-22 03:50:20 +0000
commitbc3f1a148f01ac44b74c384531eddcc46f2dee8e (patch)
tree996d54097c4d4cb814fa8b02a3e881cb09995136 /g10/keyserver.c
parent* gpgkeys_http.c (get_key): Cosmetic fix - make sure that URLs with no (diff)
downloadgnupg-bc3f1a148f01ac44b74c384531eddcc46f2dee8e.tar.gz
gnupg-bc3f1a148f01ac44b74c384531eddcc46f2dee8e.zip
* mainproc.c (check_sig_and_print): If we're honoring preferred
keyservers, and auto-key-retrieve is set, try and get a missing key from the preferred keyserver subpacket when we verify the sig. * gpgv.c (parse_preferred_keyserver, free_keyserver_spec): Stubs. * keyserver.c (keyidlist): Use new parse_preferred_keyserver function. (keyserver_work): Use the passed-in keyserver spec rather than the options global one. * keyserver-internal.h, keyserver.c (parse_preferred_keyserver): New function to take a sig and return a split out keyserver_spec. (keyserver_import_keyid): Now takes a keyserver_spec.
Diffstat (limited to 'g10/keyserver.c')
-rw-r--r--g10/keyserver.c56
1 files changed, 30 insertions, 26 deletions
diff --git a/g10/keyserver.c b/g10/keyserver.c
index b1094f973..fc3f4fecb 100644
--- a/g10/keyserver.c
+++ b/g10/keyserver.c
@@ -282,6 +282,27 @@ parse_keyserver_uri(const char *uri,int require_scheme,
return NULL;
}
+struct keyserver_spec *
+parse_preferred_keyserver(PKT_signature *sig)
+{
+ struct keyserver_spec *spec=NULL;
+ const byte *p;
+ size_t plen;
+
+ p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_PREF_KS,&plen);
+ if(p && plen)
+ {
+ byte *dupe=m_alloc(plen+1);
+
+ memcpy(dupe,p,plen);
+ dupe[plen]='\0';
+ spec=parse_keyserver_uri(dupe,0,NULL,0);
+ m_free(dupe);
+ }
+
+ return spec;
+}
+
static void
print_keyrec(int number,struct keyrec *keyrec)
{
@@ -1173,7 +1194,7 @@ keyserver_work(int action,STRLIST list,KEYDB_SEARCH_DESC *desc,
{
case KEYSERVER_SCHEME_NOT_FOUND:
log_error(_("no handler for keyserver scheme \"%s\"\n"),
- opt.keyserver->scheme);
+ keyserver->scheme);
break;
case KEYSERVER_NOT_SUPPORTED:
@@ -1181,12 +1202,12 @@ keyserver_work(int action,STRLIST list,KEYDB_SEARCH_DESC *desc,
"scheme \"%s\"\n"),
action==GET?"get":action==SEND?"send":
action==SEARCH?"search":"unknown",
- opt.keyserver->scheme);
+ keyserver->scheme);
break;
case KEYSERVER_VERSION_ERROR:
log_error(_("gpgkeys_%s does not support handler version %d\n"),
- opt.keyserver->scheme,KEYSERVER_PROTO_VERSION);
+ keyserver->scheme,KEYSERVER_PROTO_VERSION);
break;
case KEYSERVER_INTERNAL_ERROR:
@@ -1299,7 +1320,7 @@ keyserver_import_fprint(const byte *fprint,size_t fprint_len)
}
int
-keyserver_import_keyid(u32 *keyid)
+keyserver_import_keyid(u32 *keyid,struct keyserver_spec *keyserver)
{
KEYDB_SEARCH_DESC desc;
@@ -1309,7 +1330,7 @@ keyserver_import_keyid(u32 *keyid)
desc.u.kid[0]=keyid[0];
desc.u.kid[1]=keyid[1];
- return keyserver_work(GET,NULL,&desc,1,opt.keyserver);
+ return keyserver_work(GET,NULL,&desc,1,keyserver);
}
/* code mostly stolen from do_export_stream */
@@ -1430,28 +1451,11 @@ keyidlist(STRLIST users,KEYDB_SEARCH_DESC **klist,int *count,int fakev3)
}
}
+ /* Try and parse the keyserver URL. If it doesn't work,
+ then we end up writing NULL which indicates we are
+ the same as any other key. */
if(uid && sig)
- {
- const byte *p;
- size_t plen;
- p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_PREF_KS,&plen);
- if(p && plen)
- {
- byte *dupe=m_alloc(plen+1);
-
- memcpy(dupe,p,plen);
- dupe[plen]='\0';
-
- /* Try and parse the keyserver URL. If it
- doesn't work, then we end up writing NULL
- which indicates we are the same as any other
- key. */
-
- (*klist)[*count].skipfncvalue=
- parse_keyserver_uri(dupe,0,NULL,0);
- m_free(dupe);
- }
- }
+ (*klist)[*count].skipfncvalue=parse_preferred_keyserver(sig);
}
(*count)++;