* gpgkeys_ldap.c: Replacement prototypes for setenv and unsetenv.
authorDavid Shaw <dshaw@jabberwocky.com>
Fri, 20 Feb 2004 14:59:02 +0000 (14:59 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Fri, 20 Feb 2004 14:59:02 +0000 (14:59 +0000)
(search_key): Catch a SIZELIMIT_EXCEEDED error and show the user whatever
the server did give us. (find_basekeyspacedn): There is no guarantee that
namingContexts will be readable.

* Makefile.am: Link gpgkeys_ldap with libutil.a to get the replacement
functions (and eventually translations, etc).

keyserver/ChangeLog
keyserver/Makefile.am
keyserver/gpgkeys_ldap.c

index f617426..2724b7b 100644 (file)
@@ -1,3 +1,14 @@
+2004-02-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c: Replacement prototypes for setenv and unsetenv.
+       (search_key): Catch a SIZELIMIT_EXCEEDED error and show the user
+       whatever the server did give us.
+       (find_basekeyspacedn): There is no guarantee that namingContexts
+       will be readable.
+
+       * Makefile.am: Link gpgkeys_ldap with libutil.a to get the
+       replacement functions (and eventually translations, etc).
+
 2004-02-19  David Shaw  <dshaw@jabberwocky.com>
 
        * gpgkeys_ldap.c (ldap2epochtime): LDAP timestamps are UTC, so do
index e85865d..6432bd6 100644 (file)
@@ -27,7 +27,8 @@ libexec_PROGRAMS = @GPGKEYS_LDAP@ @GPGKEYS_HKP@
 libexec_SCRIPTS = @GPGKEYS_MAILTO@
 noinst_SCRIPTS = gpgkeys_test
 
-gpgkeys_ldap_LDADD = @LDAPLIBS@ @NETLIBS@ @GETOPT@ @W32LIBS@
+gpgkeys_ldap_LDADD = ../util/libutil.a @LDAPLIBS@ @NETLIBS@ @LIBINTL@ \
+                    @CAPLIBS@ @GETOPT@ @W32LIBS@
 gpgkeys_hkp_LDADD = ../util/libutil.a @NETLIBS@ @SRVLIBS@ @LIBINTL@ \
                     @CAPLIBS@ @GETOPT@ @W32LIBS@
 
index 3b418f4..afc241f 100644 (file)
@@ -52,6 +52,14 @@ static char *pgpkeystr="pgpKey";
 static FILE *input=NULL,*output=NULL,*console=NULL;
 static LDAP *ldap=NULL;
 
+#if !HAVE_SETENV
+int setenv(const char *name, const char *value, int overwrite);
+#endif
+
+#if !HAVE_UNSETENV
+int unsetenv(const char *name);
+#endif
+
 struct keylist
 {
   char str[MAX_LINE];
@@ -592,7 +600,7 @@ search_key(char *searchkey)
 
   err=ldap_search_s(ldap,basekeyspacedn,
                    LDAP_SCOPE_SUBTREE,search,attrs,0,&res);
-  if(err!=0)
+  if(err!=LDAP_SUCCESS && err!=LDAP_SIZELIMIT_EXCEEDED)
     {
       int errtag=ldap_err_to_gpg_err(err);
 
@@ -627,6 +635,9 @@ search_key(char *searchkey)
       each=ldap_next_entry(ldap,each);
     }
 
+  if(err==LDAP_SIZELIMIT_EXCEEDED)
+    fprintf(console,"gpgkeys: search results exceeded server limit.  First %d results shown.\n",count);
+
   free_keylist(dupelist);
   dupelist=NULL;
 
@@ -825,57 +836,61 @@ find_basekeyspacedn(void)
   if(err==LDAP_SUCCESS)
     {
       context=ldap_get_values(ldap,res,"namingContexts");
-      attr[0]="pgpBaseKeySpaceDN";
-      attr[1]="pgpVersion";
-      attr[2]="pgpSoftware";
-
-      real_ldap=1;
-
-      /* We found some, so try each namingContext as the search base
-        and look for pgpBaseKeySpaceDN.  Because we found this, we
-        know we're talking to a regular-ish LDAP server and not a
-        LDAP keyserver. */
-
-      for(i=0;context[i] && !basekeyspacedn;i++)
+      if(context)
        {
-         char **vals;
-         LDAPMessage *si_res;
-         err=ldap_search_s(ldap,context[i],LDAP_SCOPE_ONELEVEL,
-                           "(cn=pgpServerInfo)",attr,0,&si_res);
-         if(err!=LDAP_SUCCESS)
-           return err;
+         attr[0]="pgpBaseKeySpaceDN";
+         attr[1]="pgpVersion";
+         attr[2]="pgpSoftware";
 
-         vals=ldap_get_values(ldap,si_res,"pgpBaseKeySpaceDN");
-         if(vals)
-           {
-             /* This is always "OU=ACTIVE,O=PGP KEYSPACE,C=US", but
-                it might not be in the future. */
+         real_ldap=1;
 
-             basekeyspacedn=strdup(vals[0]);
-             ldap_value_free(vals);
-           }
+         /* We found some, so try each namingContext as the search base
+            and look for pgpBaseKeySpaceDN.  Because we found this, we
+            know we're talking to a regular-ish LDAP server and not a
+            LDAP keyserver. */
 
-         if(verbose>1)
+         for(i=0;context[i] && !basekeyspacedn;i++)
            {
-             vals=ldap_get_values(ldap,si_res,"pgpSoftware");
+             char **vals;
+             LDAPMessage *si_res;
+             err=ldap_search_s(ldap,context[i],LDAP_SCOPE_ONELEVEL,
+                               "(cn=pgpServerInfo)",attr,0,&si_res);
+             if(err!=LDAP_SUCCESS)
+               return err;
+
+             vals=ldap_get_values(ldap,si_res,"pgpBaseKeySpaceDN");
              if(vals)
                {
-                 fprintf(console,"Server: \t%s\n",vals[0]);
+                 /* This is always "OU=ACTIVE,O=PGP KEYSPACE,C=US", but
+                    it might not be in the future. */
+
+                 basekeyspacedn=strdup(vals[0]);
                  ldap_value_free(vals);
                }
 
-             vals=ldap_get_values(ldap,si_res,"pgpVersion");
-             if(vals)
+             if(verbose>1)
                {
-                 fprintf(console,"Version:\t%s\n",vals[0]);
-                 ldap_value_free(vals);
+                 vals=ldap_get_values(ldap,si_res,"pgpSoftware");
+                 if(vals)
+                   {
+                     fprintf(console,"Server: \t%s\n",vals[0]);
+                     ldap_value_free(vals);
+                   }
+
+                 vals=ldap_get_values(ldap,si_res,"pgpVersion");
+                 if(vals)
+                   {
+                     fprintf(console,"Version:\t%s\n",vals[0]);
+                     ldap_value_free(vals);
+                   }
                }
+
+             ldap_msgfree(si_res);
            }
 
-         ldap_msgfree(si_res);
+         ldap_value_free(context);
        }
 
-      ldap_value_free(context);
       ldap_msgfree(res);
     }
   else