diff --git a/g10/ChangeLog b/g10/ChangeLog index b2ac9dd58..05f5eeffc 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,9 @@ +2005-01-26 David Shaw + + * keyserver.c (parse_keyserver_uri): Allow RFC-2732 IPv6 [literal + address] syntax in keyserver URLs. + (keyserver_typemap): Map ftps if we are supporting it. + 2005-01-25 Werner Koch * keygen.c (do_generate_keypair): Don't continue after an error; diff --git a/g10/keyserver.c b/g10/keyserver.c index d808bf5be..fb3f11d5e 100644 --- a/g10/keyserver.c +++ b/g10/keyserver.c @@ -166,12 +166,26 @@ parse_keyserver_uri(const char *uri,int require_scheme, /* Get the scheme */ for(idx=uri,count=0;*idx && *idx!=':';idx++) - count++; + { + count++; + + /* Do we see the start of an RFC-2732 ipv6 address here? If so, + there clearly isn't a scheme so get out early. */ + if(*idx=='[') + { + /* Was the '[' the first thing in the string? If not, we + have a mangled scheme with a [ in it so fail. */ + if(count==1) + break; + else + goto fail; + } + } if(count==0) goto fail; - if(*idx=='\0') + if(*idx=='\0' || *idx=='[') { if(require_scheme) return NULL; @@ -237,8 +251,22 @@ parse_keyserver_uri(const char *uri,int require_scheme, uri+=count+1; } - for(idx=uri,count=0;*idx && *idx!=':' && *idx!='/';idx++) - count++; + /* Is it an RFC-2732 ipv6 [literal address] ? */ + if(*uri=='[') + { + for(idx=uri+1,count=1;*idx + && (isxdigit(*idx) || *idx==':' || *idx=='.');idx++) + count++; + + /* Is the ipv6 literal address terminated? */ + if(*idx==']') + count++; + else + goto fail; + } + else + for(idx=uri,count=0;*idx && *idx!=':' && *idx!='/';idx++) + count++; if(count==0) goto fail; @@ -790,6 +818,10 @@ keyserver_typemap(const char *type) else if(strcmp(type,"ftp")==0) return "curl"; #endif +#ifdef FTPS_VIA_LIBCURL + else if(strcmp(type,"ftps")==0) + return "curl"; +#endif #ifdef HTTP_VIA_LIBCURL else if(strcmp(type,"http")==0) return "curl";