[svn] GnuPG - r3978 - trunk/keyserver

svn author dshaw cvs at cvs.gnupg.org
Fri Dec 23 21:51:50 CET 2005


Author: dshaw
Date: 2005-12-23 21:51:48 +0100 (Fri, 23 Dec 2005)
New Revision: 3978

Modified:
   trunk/keyserver/ChangeLog
   trunk/keyserver/gpgkeys_hkp.c
   trunk/keyserver/gpgkeys_ldap.c
   trunk/keyserver/ksutil.c
   trunk/keyserver/ksutil.h
Log:
* ksutil.h, ksutil.c (parse_ks_options): New keyserver command "getname".

* gpgkeys_hkp.c (main, get_name), gpgkeys_ldap.c (main, get_name): Use it
here to do direct name (rather than key ID) fetches.


Modified: trunk/keyserver/ChangeLog
===================================================================
--- trunk/keyserver/ChangeLog	2005-12-23 18:15:24 UTC (rev 3977)
+++ trunk/keyserver/ChangeLog	2005-12-23 20:51:48 UTC (rev 3978)
@@ -1,3 +1,11 @@
+2005-12-23  David Shaw  <dshaw at jabberwocky.com>
+
+	* ksutil.h, ksutil.c (parse_ks_options): New keyserver command
+	"getname".
+
+	* gpgkeys_hkp.c (main, get_name), gpgkeys_ldap.c (main, get_name):
+	Use it here to do direct name (rather than key ID) fetches.
+
 2005-12-19  David Shaw  <dshaw at jabberwocky.com>
 
 	* ksutil.h, ksutil.c (curl_armor_writer, curl_writer,

Modified: trunk/keyserver/gpgkeys_hkp.c
===================================================================
--- trunk/keyserver/gpgkeys_hkp.c	2005-12-23 18:15:24 UTC (rev 3977)
+++ trunk/keyserver/gpgkeys_hkp.c	2005-12-23 20:51:48 UTC (rev 3978)
@@ -285,11 +285,90 @@
 }
 
 static int
+get_name(const char *getkey)
+{
+  CURLcode res;
+  char *request=NULL;
+  char *searchkey_encoded;
+  int ret=KEYSERVER_INTERNAL_ERROR;
+  struct curl_writer_ctx ctx;
+
+  memset(&ctx,0,sizeof(ctx));
+
+  searchkey_encoded=curl_escape((char *)getkey,0);
+  if(!searchkey_encoded)
+    {
+      fprintf(console,"gpgkeys: out of memory\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  request=malloc(MAX_URL+60+strlen(searchkey_encoded));
+  if(!request)
+    {
+      fprintf(console,"gpgkeys: out of memory\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  fprintf(output,"NAME %s BEGIN\n",getkey);
+
+  strcpy(request,"http://");
+  strcat(request,opt->host);
+  strcat(request,":");
+  if(opt->port)
+    strcat(request,opt->port);
+  else
+    strcat(request,"11371");
+  strcat(request,opt->path);
+  append_path(request,"/pks/lookup?op=get&options=mr&search=");
+  strcat(request,searchkey_encoded);
+
+  if(opt->verbose>2)
+    fprintf(console,"gpgkeys: HTTP URL is `%s'\n",request);
+
+  curl_easy_setopt(curl,CURLOPT_URL,request);
+  curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_writer);
+  ctx.stream=output;
+  curl_easy_setopt(curl,CURLOPT_FILE,&ctx);
+
+  res=curl_easy_perform(curl);
+  if(res!=CURLE_OK)
+    {
+      fprintf(console,"gpgkeys: HTTP fetch error %d: %s\n",res,errorbuffer);
+      ret=curl_err_to_gpg_err(res);
+    }
+  else
+    {
+      curl_writer_finalize(&ctx);
+      if(!ctx.flags.done)
+	{
+	  fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
+	  ret=KEYSERVER_KEY_NOT_FOUND;
+	}
+      else
+	{
+	  fprintf(output,"\nNAME %s END\n",getkey);
+	  ret=KEYSERVER_OK;
+	}
+    }
+
+ fail:
+  curl_free(searchkey_encoded);
+  free(request);
+
+  if(ret!=KEYSERVER_OK)
+    fprintf(output,"\nNAME %s FAILED %d\n",getkey,ret);
+
+  return ret;
+}
+
+static int
 search_key(const char *searchkey)
 {
   CURLcode res;
   char *request=NULL;
-  char *searchkey_encoded=NULL;
+  char *searchkey_encoded;
   int ret=KEYSERVER_INTERNAL_ERROR;
   enum ks_search_type search_type;
 
@@ -570,7 +649,8 @@
 
   if(opt->action==KS_SEND)
     while(fgets(line,MAX_LINE,input)!=NULL && line[0]!='\n');
-  else if(opt->action==KS_GET || opt->action==KS_SEARCH)
+  else if(opt->action==KS_GET
+	  || opt->action==KS_GETNAME || opt->action==KS_SEARCH)
     {
       for(;;)
 	{
@@ -645,6 +725,20 @@
 	  keyptr=keyptr->next;
 	}
     }
+  else if(opt->action==KS_GETNAME)
+    {
+      keyptr=keylist;
+
+      while(keyptr!=NULL)
+	{
+	  set_timeout(opt->timeout);
+
+	  if(get_name(keyptr->str)!=KEYSERVER_OK)
+	    failed++;
+
+	  keyptr=keyptr->next;
+	}
+    }
   else if(opt->action==KS_SEND)
     {
       int eof=0;

Modified: trunk/keyserver/gpgkeys_ldap.c
===================================================================
--- trunk/keyserver/gpgkeys_ldap.c	2005-12-23 18:15:24 UTC (rev 3977)
+++ trunk/keyserver/gpgkeys_ldap.c	2005-12-23 20:51:48 UTC (rev 3978)
@@ -1116,20 +1116,6 @@
   return ret;
 }
 
-static void
-printquoted(FILE *stream,char *string,char delim)
-{
-  while(*string)
-    {
-      if(*string==delim || *string=='%')
-	fprintf(stream,"%%%02x",*string);
-      else
-	fputc(*string,stream);
-
-      string++;
-    }
-}
-
 #define LDAP_ESCAPE_CHARS "*()\\"
 
 static int
@@ -1164,6 +1150,132 @@
   return count;
 }
 
+/* Note that key-not-found is not a fatal error */
+static int
+get_name(char *getkey)
+{
+  LDAPMessage *res,*each;
+  int ret=KEYSERVER_INTERNAL_ERROR,err,count;
+  char *expanded_search;
+  /* The maximum size of the search, including the optional stuff and
+     the trailing \0 */
+  char search[2+11+3+MAX_LINE+2+15+14+1+1+20];
+  /* This ordering is significant - specifically, "pgpcertid" needs to
+     be the second item in the list, since everything after it may be
+     discarded if the user isn't in verbose mode. */
+  char *attrs[]={"replaceme","pgpcertid","pgpuserid","pgpkeyid","pgprevoked",
+		 "pgpdisabled","pgpkeycreatetime","modifytimestamp",
+		 "pgpkeysize","pgpkeytype",NULL};
+  attrs[0]=pgpkeystr; /* Some compilers don't like using variables as
+                         array initializers. */
+
+  expanded_search=malloc(ldap_quote(NULL,getkey)+1);
+  if(!expanded_search)
+    {
+      fprintf(output,"NAME %s FAILED %d\n",getkey,KEYSERVER_NO_MEMORY);
+      fprintf(console,"Out of memory when quoting LDAP search string\n");
+      return KEYSERVER_NO_MEMORY;
+    }
+
+  ldap_quote(expanded_search,getkey);
+
+  /* Build the search string */
+
+  sprintf(search,"%s(pgpuserid=*%s*)%s%s%s",
+	  (!(opt->flags.include_disabled&&opt->flags.include_revoked))?"(&":"",
+	  expanded_search,
+	  opt->flags.include_disabled?"":"(pgpdisabled=0)",
+	  opt->flags.include_revoked?"":"(pgprevoked=0)",
+	  !(opt->flags.include_disabled&&opt->flags.include_revoked)?")":"");
+
+  free(expanded_search);
+
+  if(opt->verbose>2)
+    fprintf(console,"gpgkeys: LDAP fetch for: %s\n",search);
+
+  if(!opt->verbose)
+    attrs[2]=NULL; /* keep only pgpkey(v2) and pgpcertid */
+
+  err=ldap_search_s(ldap,basekeyspacedn,
+		    LDAP_SCOPE_SUBTREE,search,attrs,0,&res);
+  if(err!=0)
+    {
+      int errtag=ldap_err_to_gpg_err(err);
+
+      fprintf(console,"gpgkeys: LDAP search error: %s\n",ldap_err2string(err));
+      fprintf(output,"NAME %s BEGIN\n",getkey);
+      fprintf(output,"NAME %s FAILED %d\n",getkey,errtag);
+      return errtag;
+    }
+
+  count=ldap_count_entries(ldap,res);
+  if(count<1)
+    {
+      fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
+      fprintf(output,"NAME %s BEGIN\n",getkey);
+      fprintf(output,"NAME %s FAILED %d\n",getkey,KEYSERVER_KEY_NOT_FOUND);
+    }
+  else
+    {
+      /* There may be more than one result, but we return them all. */
+
+      each=ldap_first_entry(ldap,res);
+      while(each!=NULL)
+	{
+	  char **vals,**certid;
+
+	  certid=ldap_get_values(ldap,each,"pgpcertid");
+	  if(certid!=NULL)
+	    {
+	      build_info(certid[0],each);
+
+	      fprintf(output,"NAME %s BEGIN\n",getkey);
+
+	      vals=ldap_get_values(ldap,each,pgpkeystr);
+	      if(vals==NULL)
+		{
+		  int errtag=ldap_to_gpg_err(ldap);
+
+		  fprintf(console,"gpgkeys: unable to retrieve key %s "
+			  "from keyserver\n",getkey);
+		  fprintf(output,"NAME %s FAILED %d\n",getkey,errtag);
+		}
+	      else
+		{
+		  print_nocr(output,vals[0]);
+		  fprintf(output,"\nNAME %s END\n",getkey);
+
+		  ldap_value_free(vals);
+		}
+
+	      ldap_value_free(certid);
+	    }
+
+	  each=ldap_next_entry(ldap,each);
+	}
+    }
+
+  ret=KEYSERVER_OK;
+
+  ldap_msgfree(res);
+
+  return ret;
+}
+
+static void
+printquoted(FILE *stream,char *string,char delim)
+{
+  while(*string)
+    {
+      if(*string==delim || *string=='%')
+	fprintf(stream,"%%%02x",*string);
+      else
+	fputc(*string,stream);
+
+      string++;
+    }
+}
+
 /* Returns 0 on success and -1 on error.  Note that key-not-found is
    not an error! */
 static int
@@ -1173,9 +1285,9 @@
   LDAPMessage *res,*each;
   int err,count=0;
   struct keylist *dupelist=NULL;
+  char *expanded_search;
   /* The maximum size of the search, including the optional stuff and
      the trailing \0 */
-  char *expanded_search;
   char search[2+11+3+MAX_LINE+2+15+14+1+1+20];
   char *attrs[]={"pgpcertid","pgpuserid","pgprevoked","pgpdisabled",
 		 "pgpkeycreatetime","pgpkeyexpiretime","modifytimestamp",
@@ -1794,7 +1906,8 @@
 
   if(opt->action==KS_SEND)
     while(fgets(line,MAX_LINE,input)!=NULL && line[0]!='\n');
-  else if(opt->action==KS_GET || opt->action==KS_SEARCH)
+  else if(opt->action==KS_GET
+	  || opt->action==KS_GETNAME || opt->action==KS_SEARCH)
     {
       for(;;)
 	{
@@ -2018,6 +2131,20 @@
 	  keyptr=keyptr->next;
 	}
     }
+  else if(opt->action==KS_GETNAME)
+    {
+      keyptr=keylist;
+
+      while(keyptr!=NULL)
+	{
+	  set_timeout(opt->timeout);
+
+	  if(get_name(keyptr->str)!=KEYSERVER_OK)
+	    failed++;
+
+	  keyptr=keyptr->next;
+	}
+    }
   else if(opt->action==KS_SEND)
     {
       int eof=0;

Modified: trunk/keyserver/ksutil.c
===================================================================
--- trunk/keyserver/ksutil.c	2005-12-23 18:15:24 UTC (rev 3977)
+++ trunk/keyserver/ksutil.c	2005-12-23 20:51:48 UTC (rev 3978)
@@ -140,6 +140,8 @@
 
       if(strcasecmp(command,"get")==0)
 	opt->action=KS_GET;
+      else if(strcasecmp(command,"getname")==0)
+	opt->action=KS_GETNAME;
       else if(strcasecmp(command,"send")==0)
 	opt->action=KS_SEND;
       else if(strcasecmp(command,"search")==0)
@@ -311,6 +313,7 @@
     {
     case KS_UNKNOWN: return "UNKNOWN";
     case KS_GET:     return "GET";
+    case KS_GETNAME: return "GETNAME";
     case KS_SEND:    return "SEND";
     case KS_SEARCH:  return "SEARCH";
     }

Modified: trunk/keyserver/ksutil.h
===================================================================
--- trunk/keyserver/ksutil.h	2005-12-23 18:15:24 UTC (rev 3977)
+++ trunk/keyserver/ksutil.h	2005-12-23 20:51:48 UTC (rev 3978)
@@ -36,7 +36,7 @@
    strlen("OPAQUE")+1+sizeof_opaque+1 */
 #define MAX_LINE       (6+1+1024+1)
 
-#define MAX_COMMAND    6
+#define MAX_COMMAND    7
 #define MAX_OPTION   256
 #define MAX_SCHEME    20
 #define MAX_OPAQUE  1024
@@ -72,7 +72,7 @@
 unsigned int set_timeout(unsigned int seconds);
 int register_timeout(void);
 
-enum ks_action {KS_UNKNOWN=0,KS_GET,KS_SEND,KS_SEARCH};
+enum ks_action {KS_UNKNOWN=0,KS_GET,KS_GETNAME,KS_SEND,KS_SEARCH};
 
 enum ks_search_type {KS_SEARCH_SUBSTR,KS_SEARCH_EXACT,
 		     KS_SEARCH_MAIL,KS_SEARCH_MAILSUB};




More information about the Gnupg-commits mailing list