From e6cbb88f614e8088471c9b682d6fd5238e3da69f Mon Sep 17 00:00:00 2001
From: David Shaw <dshaw@jabberwocky.com>
Date: Wed, 26 Jan 2005 21:20:30 +0000
Subject: [PATCH] * keyserver.c (parse_keyserver_uri): Allow RFC-2732 IPv6
 [literal address] syntax in keyserver URLs.  (keyserver_typemap): Map ftps if
 we are supporting it.

---
 g10/ChangeLog   |  6 ++++++
 g10/keyserver.c | 40 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 42 insertions(+), 4 deletions(-)

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  <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;
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";