1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-01-18 14:17:03 +01:00

* gpgkeys_hkp.c: (search_key, handle_old_hkp_index): Try and request a

machine-readable key index.  If the server supports this, pass it through.
If the server does not support it, parse the "index" page.
This commit is contained in:
David Shaw 2002-09-13 18:45:36 +00:00
parent baffecaca2
commit 5c7c9fd6cd
2 changed files with 72 additions and 42 deletions

View File

@ -1,3 +1,10 @@
2002-09-13 David Shaw <dshaw@jabberwocky.com>
* gpgkeys_hkp.c: (search_key, handle_old_hkp_index): Try and
request a machine-readable key index. If the server supports
this, pass it through. If the server does not support it, parse
the "index" page.
2002-09-12 Stefan Bellon <sbellon@sbellon.de> 2002-09-12 Stefan Bellon <sbellon@sbellon.de>
* gpgkeys_hkp.c: Tidied up RISC OS initializations. * gpgkeys_hkp.c: Tidied up RISC OS initializations.

View File

@ -50,7 +50,7 @@ struct keylist
RISCOS_GLOBAL_STATICS("HKP Keyfetcher Heap") RISCOS_GLOBAL_STATICS("HKP Keyfetcher Heap")
#endif /* __riscos__ */ #endif /* __riscos__ */
static int int
urlencode_filter( void *opaque, int control, urlencode_filter( void *opaque, int control,
IOBUF a, byte *buf, size_t *ret_len) IOBUF a, byte *buf, size_t *ret_len)
{ {
@ -77,7 +77,8 @@ urlencode_filter( void *opaque, int control,
} }
/* Returns 0 on success, -1 on failure, and 1 on eof */ /* Returns 0 on success, -1 on failure, and 1 on eof */
int send_key(void) int
send_key(void)
{ {
int rc,gotit=0,ret=-1; int rc,gotit=0,ret=-1;
char keyid[17]; char keyid[17];
@ -186,7 +187,8 @@ int send_key(void)
return ret; return ret;
} }
int get_key(char *getkey) int
get_key(char *getkey)
{ {
int rc,gotit=0; int rc,gotit=0;
unsigned int maxlen=1024,buflen=0; unsigned int maxlen=1024,buflen=0;
@ -283,7 +285,7 @@ int get_key(char *getkey)
/* Remove anything <between brackets> and de-urlencode in place. Note /* Remove anything <between brackets> and de-urlencode in place. Note
that this requires all brackets to be closed on the same line. It that this requires all brackets to be closed on the same line. It
also means that the result is never larger than the input. */ also means that the result is never larger than the input. */
static void void
dehtmlize(char *line) dehtmlize(char *line)
{ {
int parsedindex=0; int parsedindex=0;
@ -351,7 +353,7 @@ dehtmlize(char *line)
} }
} }
static int int
write_quoted(IOBUF a, const char *buf, char delim) write_quoted(IOBUF a, const char *buf, char delim)
{ {
char quoted[5]; char quoted[5];
@ -388,7 +390,7 @@ write_quoted(IOBUF a, const char *buf, char delim)
LDAP server are close enough in output so the same function can LDAP server are close enough in output so the same function can
parse them both. */ parse them both. */
static int int
parse_hkp_index(IOBUF buffer,char *line) parse_hkp_index(IOBUF buffer,char *line)
{ {
static int open=0,revoked=0; static int open=0,revoked=0;
@ -396,7 +398,7 @@ parse_hkp_index(IOBUF buffer,char *line)
static u32 bits,createtime; static u32 bits,createtime;
int ret=0; int ret=0;
/* printf("Open %d, LINE: \"%s\", uid: %s\n",open,line,uid); */ /* printf("Open %d, LINE: \"%s\", uid: %s\n",open,line,uid); */
dehtmlize(line); dehtmlize(line);
@ -524,12 +526,49 @@ parse_hkp_index(IOBUF buffer,char *line)
return ret; return ret;
} }
int search_key(char *searchkey) void
handle_old_hkp_index(IOBUF input)
{
int ret,rc,count=0;
unsigned int maxlen=1024,buflen=0;
byte *line=NULL;
IOBUF buffer=iobuf_temp();
do
{
/* This is a judgement call. Is it better to slurp up all the
results before prompting the user? On the one hand, it
probably makes the keyserver happier to not be blocked on
sending for a long time while the user picks a key. On the
other hand, it might be nice for the server to be able to
stop sending before a large search result page is
complete. */
rc=iobuf_read_line(input,&line,&buflen,&maxlen);
ret=parse_hkp_index(buffer,line);
if(ret==-1)
break;
if(rc!=0)
count+=ret;
}
while(rc!=0);
m_free(line);
if(ret>-1)
fprintf(output,"COUNT %d\n%s",count,iobuf_get_temp_buffer(buffer));
iobuf_close(buffer);
}
int
search_key(char *searchkey)
{ {
int max=0,len=0,ret=-1,rc; int max=0,len=0,ret=-1,rc;
struct http_context hd; struct http_context hd;
char *search=NULL,*request=searchkey; char *search=NULL,*request=searchkey;
byte *line=NULL;
fprintf(output,"SEARCH %s BEGIN\n",searchkey); fprintf(output,"SEARCH %s BEGIN\n",searchkey);
@ -573,7 +612,7 @@ int search_key(char *searchkey)
return -1; return -1;
} }
sprintf(request,"x-hkp://%s%s%s/pks/lookup?op=index&search=%s", sprintf(request,"x-hkp://%s%s%s/pks/lookup?op=index&options=mr&search=%s",
host,port[0]?":":"",port[0]?port:"",search); host,port[0]?":":"",port[0]?port:"",search);
if(verbose>2) if(verbose>2)
@ -588,45 +627,28 @@ int search_key(char *searchkey)
else else
{ {
unsigned int maxlen=1024,buflen=0; unsigned int maxlen=1024,buflen=0;
int count=1; byte *line=NULL;
IOBUF buffer;
buffer=iobuf_temp(); /* Is it a pksd that knows how to handle machine-readable
format? */
rc=1; rc=iobuf_read_line(hd.fp_read,&line,&buflen,&maxlen);
if(line[0]=='<')
handle_old_hkp_index(hd.fp_read);
else
do
{
fprintf(output,"%s",line);
rc=iobuf_read_line(hd.fp_read,&line,&buflen,&maxlen);
}
while(rc!=0);
while(rc!=0) m_free(line);
{
/* This is a judgement call. Is it better to slurp up all
the results before prompting the user? On the one hand,
it probably makes the keyserver happier to not be blocked
on sending for a long time while the user picks a key.
On the other hand, it might be nice for the server to be
able to stop sending before a large search result page is
complete. */
rc=iobuf_read_line(hd.fp_read,&line,&buflen,&maxlen);
ret=parse_hkp_index(buffer,line);
if(ret==-1)
break;
if(rc!=0)
count+=ret;
}
http_close(&hd); http_close(&hd);
count--;
if(ret>-1)
fprintf(output,"COUNT %d\n%s",count,iobuf_get_temp_buffer(buffer));
fprintf(output,"SEARCH %s END\n",searchkey); fprintf(output,"SEARCH %s END\n",searchkey);
iobuf_close(buffer);
m_free(line);
ret=0; ret=0;
} }
@ -636,7 +658,8 @@ int search_key(char *searchkey)
return ret; return ret;
} }
int main(int argc,char *argv[]) int
main(int argc,char *argv[])
{ {
int arg,action=-1,ret=KEYSERVER_INTERNAL_ERROR; int arg,action=-1,ret=KEYSERVER_INTERNAL_ERROR;
char line[MAX_LINE]; char line[MAX_LINE];