* gpg.sgml: Clarify new notation delete feature.
[gnupg.git] / keyserver / gpgkeys_curl.c
index e935bb8..bd26d78 100644 (file)
@@ -58,11 +58,8 @@ get_key(char *getkey)
 
   fprintf(output,"KEY 0x%s BEGIN\n",getkey);
 
-  sprintf(request,"%s://%s%s%s%s%s%s",opt->scheme,
-         opt->auth?opt->auth:"",
-         opt->auth?"@":"",opt->host,
-         opt->port?":":"",opt->port?opt->port:"",
-         opt->path?opt->path:"/");
+  sprintf(request,"%s://%s%s%s%s",opt->scheme,opt->host,
+         opt->port?":":"",opt->port?opt->port:"",opt->path?opt->path:"/");
 
   curl_easy_setopt(curl,CURLOPT_URL,request);
   curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_writer);
@@ -71,16 +68,26 @@ get_key(char *getkey)
   curl_easy_setopt(curl,CURLOPT_ERRORBUFFER,errorbuffer);
 
   res=curl_easy_perform(curl);
-  if(res!=0)
+  if(res!=CURLE_OK)
     {
       fprintf(console,"gpgkeys: %s fetch error %d: %s\n",opt->scheme,
              res,errorbuffer);
       fprintf(output,"\nKEY 0x%s FAILED %d\n",getkey,curl_err_to_gpg_err(res));
     }
   else
-    fprintf(output,"\nKEY 0x%s END\n",getkey);
+    {
+      curl_writer_finalize(&ctx);
+      if(!ctx.flags.done)
+       {
+         fprintf(console,"gpgkeys: no key data found for %s\n",request);
+         fprintf(output,"\nKEY 0x%s FAILED %d\n",
+                 getkey,KEYSERVER_KEY_NOT_FOUND);
+       }
+      else
+       fprintf(output,"\nKEY 0x%s END\n",getkey);
+    }
 
-  return KEYSERVER_OK;
+  return curl_err_to_gpg_err(res);
 }
 
 static void 
@@ -98,7 +105,7 @@ main(int argc,char *argv[])
   char line[MAX_LINE];
   char *thekey=NULL;
   long follow_redirects=5;
-  char proxy[MAX_PROXY+1];
+  char *proxy=NULL;
 
   console=stderr;
 
@@ -193,20 +200,19 @@ main(int argc,char *argv[])
 
          if(strncasecmp(start,"http-proxy",10)==0)
            {
+             /* Safe to not check the return code of strdup() here.
+                If it fails, we simply won't use a proxy. */
              if(no)
-               proxy[0]='\0';
-             else if(start[10]=='=')
                {
-                 strncpy(proxy,&start[11],MAX_PROXY);
-                 proxy[MAX_PROXY]='\0';
+                 free(proxy);
+                 proxy=strdup("");
                }
-             else if(start[10]=='\0')
+             else if(start[10]=='=')
                {
-                 char *http_proxy=getenv(HTTP_PROXY_ENV);
-                 if(http_proxy)
+                 if(strlen(&start[11])<MAX_PROXY)
                    {
-                     strncpy(proxy,http_proxy,MAX_PROXY);
-                     proxy[MAX_PROXY]='\0';
+                     free(proxy);
+                     proxy=strdup(&start[11]);
                    }
                }
            }
@@ -230,27 +236,6 @@ main(int argc,char *argv[])
       ret=KEYSERVER_SCHEME_NOT_FOUND;
       goto fail;
     }
-#ifdef HTTP_VIA_LIBCURL
-  else if(strcasecmp(opt->scheme,"http")==0)
-    ;
-#endif /* HTTP_VIA_LIBCURL */
-#ifdef HTTPS_VIA_LIBCURL
-  else if(strcasecmp(opt->scheme,"https")==0)
-    ;
-#endif /* HTTP_VIA_LIBCURL */
-#ifdef FTP_VIA_LIBCURL
-  else if(strcasecmp(opt->scheme,"ftp")==0)
-    ;
-#endif /* FTP_VIA_LIBCURL */
-#ifdef FTPS_VIA_LIBCURL
-  else if(strcasecmp(opt->scheme,"ftps")==0)
-    ;
-#endif /* FTPS_VIA_LIBCURL */
-  else
-    {
-      fprintf(console,"gpgkeys: scheme `%s' not supported\n",opt->scheme);
-      return KEYSERVER_SCHEME_NOT_FOUND;
-    }
 
   if(!opt->host)
     {
@@ -280,8 +265,12 @@ main(int argc,char *argv[])
        curl_easy_setopt(curl,CURLOPT_MAXREDIRS,follow_redirects);
     }
 
+  if(opt->auth)
+    curl_easy_setopt(curl,CURLOPT_USERPWD,opt->auth);
+
   if(opt->debug)
     {
+      fprintf(console,"gpgkeys: curl version = %s\n",curl_version());
       curl_easy_setopt(curl,CURLOPT_STDERR,console);
       curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
     }
@@ -289,7 +278,7 @@ main(int argc,char *argv[])
   curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,opt->flags.check_cert);
   curl_easy_setopt(curl,CURLOPT_CAINFO,opt->ca_cert_file);
 
-  if(proxy[0])
+  if(proxy)
     curl_easy_setopt(curl,CURLOPT_PROXY,proxy);
 
   /* If it's a GET or a SEARCH, the next thing to come in is the
@@ -372,6 +361,8 @@ main(int argc,char *argv[])
   if(curl)
     curl_easy_cleanup(curl);
 
+  free(proxy);
+
   curl_global_cleanup();
 
   return ret;