* keyserver.c (parse_keyserver_uri): Allow RFC-2732 IPv6 [literal
authorDavid Shaw <dshaw@jabberwocky.com>
Wed, 26 Jan 2005 21:20:30 +0000 (21:20 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Wed, 26 Jan 2005 21:20:30 +0000 (21:20 +0000)
address] syntax in keyserver URLs.  (keyserver_typemap): Map ftps if
we are supporting it.

g10/ChangeLog
g10/keyserver.c

index b2ac9dd..05f5eef 100644 (file)
@@ -1,3 +1,9 @@
+2005-01-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * 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  <wk@g10code.com>
 
        * keygen.c (do_generate_keypair): Don't continue after an error;
index d808bf5..fb3f11d 100644 (file)
@@ -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";