aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shaw <[email protected]>2002-09-24 20:17:52 +0000
committerDavid Shaw <[email protected]>2002-09-24 20:17:52 +0000
commit76846b74e4af1043c172d41ecebd9664976f56d6 (patch)
treeee0edcdce51b20be41ca36473e7a7a5d64ae4279
parent* gpgkeys_hkp.c (send_key, get_key, search_key, main): Some minor error (diff)
downloadgnupg-76846b74e4af1043c172d41ecebd9664976f56d6.tar.gz
gnupg-76846b74e4af1043c172d41ecebd9664976f56d6.zip
* gpgkeys_ldap.c (ldap_err_to_gpg_err, ldap_to_gpg_err, send_key, get_key,
search_key, main): Some minor error reporting enhancements for use with GPA (show reasons for KEY FAILED).
Diffstat (limited to '')
-rw-r--r--keyserver/ChangeLog7
-rw-r--r--keyserver/gpgkeys_ldap.c130
2 files changed, 103 insertions, 34 deletions
diff --git a/keyserver/ChangeLog b/keyserver/ChangeLog
index 4d5d31130..0ac86dce0 100644
--- a/keyserver/ChangeLog
+++ b/keyserver/ChangeLog
@@ -1,7 +1,12 @@
2002-09-24 David Shaw <[email protected]>
+ * gpgkeys_ldap.c (ldap_err_to_gpg_err, ldap_to_gpg_err, send_key,
+ get_key, search_key, main): Some minor error reporting
+ enhancements for use with GPA (show reasons for KEY FAILED).
+
* gpgkeys_hkp.c (send_key, get_key, search_key, main): Some minor
- error reporting enhancements for use with GPA.
+ error reporting enhancements for use with GPA (show reasons for
+ KEY FAILED).
2002-09-20 Werner Koch <[email protected]>
diff --git a/keyserver/gpgkeys_ldap.c b/keyserver/gpgkeys_ldap.c
index 49b2b2e9c..49b372b79 100644
--- a/keyserver/gpgkeys_ldap.c
+++ b/keyserver/gpgkeys_ldap.c
@@ -58,13 +58,57 @@ struct keylist
RISCOS_GLOBAL_STATICS("LDAP Keyfetcher Heap")
#endif /* __riscos__ */
-/* Returns 0 on success, -1 on failure, and 1 on eof */
-int send_key(void)
+int
+ldap_err_to_gpg_err(int err)
{
- int err,gotit=0,keysize=1,ret=-1;
+ int ret;
+
+ switch(err)
+ {
+ case LDAP_ALREADY_EXISTS:
+ ret=KEYSERVER_KEY_EXISTS;
+ break;
+
+ default:
+ ret=KEYSERVER_GENERAL_ERROR;
+ break;
+ }
+
+ return ret;
+}
+
+int
+ldap_to_gpg_err(LDAP *ld)
+{
+#if defined(HAVE_LDAP_GET_OPTION)
+
+ int err;
+
+ if(ldap_get_option(ld,LDAP_OPT_ERROR_NUMBER,&err)==0)
+ return ldap_err_to_gpg_err(err);
+ else
+ return KEYSERVER_GENERAL_ERROR;
+
+#elif defined(HAVE_LDAP_LD_ERRNO)
+
+ return ldap_err_to_gpg_err(ld->ld_errno);
+
+#else
+
+ /* We should never get here since the LDAP library should always
+ have either ldap_get_option or ld_errno, but just in case... */
+ return KEYSERVER_GENERAL_ERROR;
+
+#endif
+}
+
+int
+send_key(int *eof)
+{
+ int err,gotit=0,keysize=1,ret=KEYSERVER_INTERNAL_ERROR;
char *dn=NULL;
char line[MAX_LINE];
- char *key[2]={0,0};
+ char *key[2]={NULL,NULL};
char keyid[17];
#ifndef __riscos__
LDAPMod mod={LDAP_MOD_ADD,pgpkeystr,{key}},*attrs[2]={&mod,NULL};
@@ -84,6 +128,7 @@ int send_key(void)
if(dn==NULL)
{
fprintf(console,"gpgkeys: can't allocate memory for keyserver record\n");
+ ret=KEYSERVER_NO_MEMORY;
goto fail;
}
@@ -94,6 +139,7 @@ int send_key(void)
if(key[0]==NULL)
{
fprintf(console,"gpgkeys: unable to allocate memory for key\n");
+ ret=KEYSERVER_NO_MEMORY;
goto fail;
}
@@ -110,8 +156,10 @@ int send_key(void)
if(!gotit)
{
- /* i.e. eof before the KEY BEGIN was found */
- ret=1;
+ /* i.e. eof before the KEY BEGIN was found. This isn't an
+ error. */
+ *eof=1;
+ ret=KEYSERVER_OK;
goto fail;
}
@@ -132,6 +180,7 @@ int send_key(void)
if(key[0]==NULL)
{
fprintf(console,"gpgkeys: unable to reallocate for key\n");
+ ret=KEYSERVER_NO_MEMORY;
goto fail;
}
@@ -141,6 +190,8 @@ int send_key(void)
if(!gotit)
{
fprintf(console,"gpgkeys: no KEY %s END found\n",keyid);
+ *eof=1;
+ ret=KEYSERVER_KEY_INCOMPLETE;
goto fail;
}
@@ -149,10 +200,11 @@ int send_key(void)
{
fprintf(console,"gpgkeys: error adding key %s to keyserver: %s\n",
keyid,ldap_err2string(err));
+ ret=ldap_err_to_gpg_err(err);
goto fail;
}
- ret=0;
+ ret=KEYSERVER_OK;
fail:
@@ -160,18 +212,22 @@ int send_key(void)
free(dn);
if(ret!=0)
- fprintf(output,"KEY %s FAILED\n",keyid);
+ fprintf(output,"KEY %s FAILED %d\n",keyid,ret);
+
+ /* Not a fatal error */
+ if(ret==KEYSERVER_KEY_EXISTS)
+ ret=KEYSERVER_OK;
return ret;
}
-/* Returns 0 on success and -1 on failure. Note that key-not-found is
- not an error! */
-int get_key(char *getkey)
+/* Note that key-not-found is not a fatal error */
+int
+get_key(char *getkey)
{
char **vals;
LDAPMessage *res,*each;
- int ret=-1,err,count;
+ int ret=KEYSERVER_INTERNAL_ERROR,err,count;
struct keylist *dupelist=NULL;
char search[62];
char *attrs[]={"replaceme","pgpuserid","pgpkeyid","pgpcertid","pgprevoked",
@@ -193,8 +249,8 @@ int get_key(char *getkey)
fprintf(console,
"gpgkeys: LDAP keyservers do not support v3 fingerprints\n");
fprintf(output,"KEY 0x%s BEGIN\n",getkey);
- fprintf(output,"KEY 0x%s FAILED\n",getkey);
- return -1;
+ fprintf(output,"KEY 0x%s FAILED %d\n",getkey,KEYSERVER_NOT_SUPPORTED);
+ return KEYSERVER_NOT_SUPPORTED;
}
if(strlen(getkey)>16)
@@ -243,16 +299,18 @@ int get_key(char *getkey)
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,"KEY 0x%s FAILED\n",getkey);
- return -1;
+ fprintf(output,"KEY 0x%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,"KEY 0x%s FAILED\n",getkey);
+ fprintf(output,"KEY 0x%s FAILED %d\n",getkey,KEYSERVER_KEY_NOT_FOUND);
}
else
{
@@ -295,6 +353,7 @@ int get_key(char *getkey)
{
fprintf(console,"gpgkeys: out of memory when deduping "
"key list\n");
+ ret=KEYSERVER_NO_MEMORY;
goto fail;
}
@@ -390,9 +449,11 @@ int get_key(char *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,"KEY 0x%s FAILED\n",getkey);
+ fprintf(output,"KEY 0x%s FAILED %d\n",getkey,errtag);
}
else
{
@@ -406,7 +467,7 @@ int get_key(char *getkey)
}
}
- ret=0;
+ ret=KEYSERVER_OK;
fail:
ldap_msgfree(res);
@@ -461,7 +522,8 @@ void printquoted(FILE *stream,char *string,char delim)
/* Returns 0 on success and -1 on error. Note that key-not-found is
not an error! */
-int search_key(char *searchkey)
+int
+search_key(char *searchkey)
{
char **vals;
LDAPMessage *res,*each;
@@ -494,8 +556,11 @@ int search_key(char *searchkey)
LDAP_SCOPE_SUBTREE,search,attrs,0,&res);
if(err!=0)
{
+ int errtag=ldap_err_to_gpg_err(err);
+
+ fprintf(output,"SEARCH %s FAILED %d\n",searchkey,errtag);
fprintf(console,"gpgkeys: LDAP search error: %s\n",ldap_err2string(err));
- return -1;
+ return errtag;
}
count=ldap_count_entries(ldap,res);
@@ -607,7 +672,7 @@ int search_key(char *searchkey)
fprintf(output,"SEARCH %s END\n",searchkey);
- return 0;
+ return KEYSERVER_OK;
}
int main(int argc,char *argv[])
@@ -910,7 +975,7 @@ int main(int argc,char *argv[])
while(keyptr!=NULL)
{
- if(get_key(keyptr->str)==-1)
+ if(get_key(keyptr->str)!=KEYSERVER_OK)
failed++;
keyptr=keyptr->next;
@@ -919,15 +984,14 @@ int main(int argc,char *argv[])
case SEND:
{
- int ret2;
+ int eof=0;
do
{
- ret2=send_key();
- if(ret2==-1)
+ if(send_key(&eof)!=KEYSERVER_OK)
failed++;
}
- while(ret2!=1);
+ while(!eof);
}
break;
@@ -950,7 +1014,10 @@ int main(int argc,char *argv[])
searchkey=malloc(len+1);
if(searchkey==NULL)
- goto fail;
+ {
+ ret=KEYSERVER_NO_MEMORY;
+ goto fail;
+ }
searchkey[0]='\0';
@@ -965,11 +1032,8 @@ int main(int argc,char *argv[])
/* Nail that last "*" */
searchkey[strlen(searchkey)-1]='\0';
- if(search_key(searchkey)==-1)
- {
- fprintf(output,"SEARCH %s FAILED\n",searchkey);
- failed++;
- }
+ if(search_key(searchkey)!=KEYSERVER_OK)
+ failed++;
free(searchkey);
}