1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-28 02:12:46 +02:00

* Makefile.am: No need to link with curl any longer.

* main.h, misc.c (path_access): New.  Same as access() but does a PATH
search like execlp.

* keyserver.c (curl_can_handle): Removed.  Replaced by...
(curl_cant_handle): We are now relying on curl as the handler of last
resort.  This is necessary because PGP LDAP and curl LDAP are apples
and oranges.  (keyserver_typemap): Only test for ldap and ldaps.
(keyserver_spawn): If a given handler is unusable (as determined by
path_access()) then try gpgkeys_curl.
This commit is contained in:
David Shaw 2005-08-21 20:58:46 +00:00
parent 2e8c02b54b
commit 24adfe678d
5 changed files with 84 additions and 38 deletions

View File

@ -1,5 +1,18 @@
2005-08-21 David Shaw <dshaw@jabberwocky.com> 2005-08-21 David Shaw <dshaw@jabberwocky.com>
* Makefile.am: No need to link with curl any longer.
* main.h, misc.c (path_access): New. Same as access() but does a
PATH search like execlp.
* keyserver.c (curl_can_handle): Removed. Replaced by...
(curl_cant_handle): We are now relying on curl as the handler of
last resort. This is necessary because PGP LDAP and curl LDAP are
apples and oranges.
(keyserver_typemap): Only test for ldap and ldaps.
(keyserver_spawn): If a given handler is unusable (as determined
by path_access()) then try gpgkeys_curl.
* exec.h, exec.c (make_tempdir, expand_args, exec_write, * exec.h, exec.c (make_tempdir, expand_args, exec_write,
exec_read): Minor cleanup to use bitfield flags instead of a bunch exec_read): Minor cleanup to use bitfield flags instead of a bunch
of integers. of integers.

View File

@ -124,8 +124,7 @@ gpgv_SOURCES = gpgv.c \
verify.c verify.c
LDADD = $(needed_libs) $(other_libs) @ZLIBS@ @W32LIBS@ @LIBREADLINE@ LDADD = $(needed_libs) $(other_libs) @ZLIBS@ @W32LIBS@ @LIBREADLINE@
gpg_LDADD = $(LDADD) @DLLIBS@ @NETLIBS@ @LIBUSB@ @LIBCURL@ gpg_LDADD = $(LDADD) @DLLIBS@ @NETLIBS@ @LIBUSB@
##gpg_CPPFLAGS = @LIBCURL_CPPFLAGS@
$(PROGRAMS): $(needed_libs) $(PROGRAMS): $(needed_libs)

View File

@ -49,6 +49,16 @@
#define GPGKEYS_PREFIX "gpgkeys_" #define GPGKEYS_PREFIX "gpgkeys_"
#if defined(HAVE_LIBCURL) || defined(FAKE_CURL)
#define GPGKEYS_CURL "gpgkeys_curl"
#endif
#ifdef GPGKEYS_CURL
#define GPGKEYS_PREFIX_LEN (strlen(GPGKEYS_PREFIX)+strlen(GPGKEYS_CURL))
#else
#define GPGKEYS_PREFIX_LEN (strlen(GPGKEYS_PREFIX))
#endif
struct keyrec struct keyrec
{ {
KEYDB_SEARCH_DESC desc; KEYDB_SEARCH_DESC desc;
@ -830,47 +840,29 @@ keyserver_search_prompt(IOBUF buffer,const char *searchstr)
xfree(line); xfree(line);
} }
static int
curl_can_handle(const char *scheme)
{
#if defined(HAVE_LIBCURL)
const char * const *proto;
curl_version_info_data *data=curl_version_info(CURLVERSION_NOW);
assert(data);
for(proto=data->protocols;*proto;proto++)
if(strcasecmp(*proto,scheme)==0)
return 1;
#elif defined(FAKE_CURL)
/* If we're faking curl, then we only support HTTP */
if(strcasecmp(scheme,"http")==0)
return 1;
#endif
return 0;
}
/* We sometimes want to use a different gpgkeys_xxx for a given /* We sometimes want to use a different gpgkeys_xxx for a given
protocol (for example, ldaps is handled by gpgkeys_ldap). Map protocol (for example, ldaps is handled by gpgkeys_ldap). Map
these here. */ these here. */
static const char * static const char *
keyserver_typemap(const char *type) keyserver_typemap(const char *type)
{ {
if(strcmp(type,"ldap")==0) if(strcmp(type,"ldaps")==0)
return "ldap"; return "ldap";
else if(strcmp(type,"ldaps")==0)
return "ldap";
else if(curl_can_handle(type))
return "curl";
else else
return type; return type;
} }
#ifdef GPGKEYS_CURL
static int
curl_cant_handle(const char *scheme)
{
if(strcmp(scheme,"ldap")==0 || strcmp(scheme,"ldaps")==0)
return 1;
return 0;
}
#endif
#define KEYSERVER_ARGS_KEEP " -o \"%O\" \"%I\"" #define KEYSERVER_ARGS_KEEP " -o \"%O\" \"%I\""
#define KEYSERVER_ARGS_NOKEEP " -o \"%o\" \"%i\"" #define KEYSERVER_ARGS_NOKEEP " -o \"%o\" \"%i\""
@ -881,7 +873,7 @@ keyserver_spawn(int action,STRLIST list,KEYDB_SEARCH_DESC *desc,
int ret=0,i,gotversion=0,outofband=0; int ret=0,i,gotversion=0,outofband=0;
STRLIST temp; STRLIST temp;
unsigned int maxlen,buflen; unsigned int maxlen,buflen;
char *command,*searchstr=NULL; char *command,*end,*searchstr=NULL;
byte *line=NULL; byte *line=NULL;
struct parse_options *kopts; struct parse_options *kopts;
struct exec_info *spawn; struct exec_info *spawn;
@ -923,7 +915,7 @@ keyserver_spawn(int action,STRLIST list,KEYDB_SEARCH_DESC *desc,
/* If exec-path was set, and DISABLE_KEYSERVER_PATH is /* If exec-path was set, and DISABLE_KEYSERVER_PATH is
undefined, then don't specify a full path to gpgkeys_foo, so undefined, then don't specify a full path to gpgkeys_foo, so
that the PATH can work. */ that the PATH can work. */
command=xmalloc(strlen(GPGKEYS_PREFIX)+strlen(scheme)+1); command=xmalloc(GPGKEYS_PREFIX_LEN+strlen(scheme)+1);
command[0]='\0'; command[0]='\0';
} }
else else
@ -931,14 +923,21 @@ keyserver_spawn(int action,STRLIST list,KEYDB_SEARCH_DESC *desc,
{ {
/* Specify a full path to gpgkeys_foo. */ /* Specify a full path to gpgkeys_foo. */
command=xmalloc(strlen(libexecdir)+strlen(DIRSEP_S)+ command=xmalloc(strlen(libexecdir)+strlen(DIRSEP_S)+
strlen(GPGKEYS_PREFIX)+strlen(scheme)+1); GPGKEYS_PREFIX_LEN+strlen(scheme)+1);
strcpy(command,libexecdir); strcpy(command,libexecdir);
strcat(command,DIRSEP_S); strcat(command,DIRSEP_S);
} }
end=command+strlen(command);
strcat(command,GPGKEYS_PREFIX); strcat(command,GPGKEYS_PREFIX);
strcat(command,scheme); strcat(command,scheme);
#ifdef GPGKEYS_CURL
if(!curl_cant_handle(scheme) && path_access(command,X_OK)!=0)
strcpy(end,GPGKEYS_CURL);
#endif
if(opt.keyserver_options.options&KEYSERVER_USE_TEMP_FILES) if(opt.keyserver_options.options&KEYSERVER_USE_TEMP_FILES)
{ {
if(opt.keyserver_options.options&KEYSERVER_KEEP_TEMP_FILES) if(opt.keyserver_options.options&KEYSERVER_KEEP_TEMP_FILES)

View File

@ -129,7 +129,7 @@ int has_invalid_email_chars (const char *s);
int is_valid_mailbox (const char *name); int is_valid_mailbox (const char *name);
char *default_homedir (void); char *default_homedir (void);
const char *get_libexecdir (void); const char *get_libexecdir (void);
int path_access(const char *file,int mode);
/*-- helptext.c --*/ /*-- helptext.c --*/
void display_online_help( const char *keyword ); void display_online_help( const char *keyword );

View File

@ -1,6 +1,6 @@
/* misc.c - miscellaneous functions /* misc.c - miscellaneous functions
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
* 2004, 2005 Free Software Foundation, Inc. * 2005 Free Software Foundation, Inc.
* *
* This file is part of GnuPG. * This file is part of GnuPG.
* *
@ -1223,3 +1223,38 @@ get_libexecdir (void)
return GNUPG_LIBEXECDIR; return GNUPG_LIBEXECDIR;
} }
int
path_access(const char *file,int mode)
{
char *envpath;
int ret=-1;
envpath=getenv("PATH");
if(file[0]=='/' || !envpath)
return access(file,mode);
else
{
/* At least as large as, but most often larger than we need. */
char *buffer=xmalloc(strlen(envpath)+1+strlen(file)+1);
char *split,*item,*path=xstrdup(envpath);
split=path;
while((item=strsep(&split,PATHSEP_S)))
{
strcpy(buffer,item);
strcat(buffer,"/");
strcat(buffer,file);
ret=access(buffer,mode);
if(ret==0)
break;
}
xfree(path);
xfree(buffer);
}
return ret;
}