1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

Added CURLOPT_NETRC_FILE.

This commit is contained in:
Daniel Stenberg 2003-11-11 14:30:43 +00:00
parent a50d2a45d7
commit ad77f760cf
7 changed files with 87 additions and 51 deletions

18
CHANGES
View File

@ -7,6 +7,24 @@
Changelog Changelog
Daniel (11 November)
- Added CURLOPT_NETRC_FILE. Use this to tell libcurl which file to use instead
of trying to find a .netrc in the current user's home directory. The
existing .netrc file finder is somewhat naive and is far from perfect on
several platforms that aren't unix-style. If this option isn't set when
CURLOPT_NETRC is set, the previous approach will still be used.
The current .netrc check code now also support longer than 256 bytes path
names.
Daniel (10 November)
- Kang-Jin Lee pointed out that the generated ca-bundle.h file shouldn't be
written in the source dir if a different build dir is used.
- After Sébastien Willemijns' bug report, we now check the separators properly
in the 229-reply servers respond on a EPSV command and bail out better if
the reply string is not RFC2428-compliant.
Daniel (7 November) Daniel (7 November)
- Based on Gisle Vanem's patch, I made curl try harder to get the home - Based on Gisle Vanem's patch, I made curl try harder to get the home
directory of the current user, in order to find the default .curlrc file. directory of the current user, in order to find the default .curlrc file.

View File

@ -1,7 +1,7 @@
.\" nroff -man [file] .\" nroff -man [file]
.\" $Id$ .\" $Id$
.\" .\"
.TH curl_easy_setopt 3 "7 Nov 2003" "libcurl 7.10.8" "libcurl Manual" .TH curl_easy_setopt 3 "11 Nov 2003" "libcurl 7.10.9" "libcurl Manual"
.SH NAME .SH NAME
curl_easy_setopt - set options for a curl easy handle curl_easy_setopt - set options for a curl easy handle
.SH SYNOPSIS .SH SYNOPSIS
@ -274,6 +274,11 @@ Only machine name, user name and password are taken into account
\fBNote:\fP libcurl does not verify that the file has the correct properties \fBNote:\fP libcurl does not verify that the file has the correct properties
set (as the standard Unix ftp client does). It should only be readable by set (as the standard Unix ftp client does). It should only be readable by
user. user.
.IP CURLOPT_NETRC_FILE
Pass a char * as parameter, pointing to a zero terminated string containing
the full path name to the file you want libcurl to use as .netrc file. If this
option is omitted, and CURLOPT_NETRC is set, libcurl will attempt to find the
a .netrc file in the current user's home directory.
.IP CURLOPT_USERPWD .IP CURLOPT_USERPWD
Pass a char * as parameter, which should be [user name]:[password] to use for Pass a char * as parameter, which should be [user name]:[password] to use for
the connection. Use \fICURLOPT_HTTPAUTH\fP to decide authentication method. the connection. Use \fICURLOPT_HTTPAUTH\fP to decide authentication method.

View File

@ -693,6 +693,12 @@ typedef enum {
an HTTP or FTP server. */ an HTTP or FTP server. */
CINIT(MAXFILESIZE, LONG, 114), CINIT(MAXFILESIZE, LONG, 114),
/* Set this option to the file name of your .netrc file you want libcurl
to parse (using the CURLOPT_NETRC option). If not set, libcurl will do
a poor attempt to find the user's home directory and check for a .netrc
file in there. */
CINIT(NETRC_FILE, OBJECTPOINT, 115),
CURLOPT_LASTENTRY /* the last unused */ CURLOPT_LASTENTRY /* the last unused */
} CURLoption; } CURLoption;

View File

@ -45,6 +45,9 @@
#include "strequal.h" #include "strequal.h"
#include "strtok.h" #include "strtok.h"
#define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h>
/* The last #include file should be: */ /* The last #include file should be: */
#ifdef CURLDEBUG #ifdef CURLDEBUG
#include "memdebug.h" #include "memdebug.h"
@ -71,54 +74,24 @@ enum {
#define LOGINSIZE 64 #define LOGINSIZE 64
#define PASSWORDSIZE 64 #define PASSWORDSIZE 64
/* returns -1 on failure, 0 if the host is found, 1 is the host isn't found */
int Curl_parsenetrc(char *host, int Curl_parsenetrc(char *host,
char *login, char *login,
char *password) char *password,
char *netrcfile)
{ {
FILE *file; FILE *file;
char netrcbuffer[256];
int retcode=1; int retcode=1;
int specific_login = (login[0] != 0); int specific_login = (login[0] != 0);
char *home = NULL; char *home = NULL;
bool home_alloc = FALSE;
bool netrc_alloc = FALSE;
int state=NOTHING; int state=NOTHING;
char state_login=0; /* Found a login keyword */ char state_login=0; /* Found a login keyword */
char state_password=0; /* Found a password keyword */ char state_password=0; /* Found a password keyword */
char state_our_login=0; /* With specific_login, found *our* login name */ char state_our_login=0; /* With specific_login, found *our* login name */
#define NETRC DOT_CHAR "netrc"
#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
struct passwd *pw;
pw= getpwuid(geteuid());
if (pw) {
#ifdef VMS
home = decc$translate_vms(pw->pw_dir);
#else
home = pw->pw_dir;
#endif
}
#else
void *pw=NULL;
#endif
if(NULL == pw) {
home = curl_getenv("HOME"); /* portable environment reader */
if(!home) {
return -1;
}
}
if(strlen(home)>(sizeof(netrcbuffer)-strlen(NETRC))) {
if(NULL==pw)
free(home);
return -1;
}
sprintf(netrcbuffer, "%s%s%s", home, DIR_CHAR, NETRC);
#ifdef CURLDEBUG #ifdef CURLDEBUG
{ {
/* This is a hack to allow testing. /* This is a hack to allow testing.
@ -127,27 +100,49 @@ int Curl_parsenetrc(char *host,
char *override = curl_getenv("CURL_DEBUG_NETRC"); char *override = curl_getenv("CURL_DEBUG_NETRC");
if (override != NULL) { if (override) {
printf("NETRC: overridden .netrc file: %s\n", home); printf("NETRC: overridden .netrc file: %s\n", home);
netrcfile = override;
if (strlen(override)+1 > sizeof(netrcbuffer)) { netrc_alloc = TRUE;
free(override);
if(NULL==pw)
free(home);
return -1;
}
strcpy(netrcbuffer, override);
free(override);
} }
} }
#endif /* CURLDEBUG */ #endif /* CURLDEBUG */
if(!netrcfile) {
#define NETRC DOT_CHAR "netrc"
#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
struct passwd *pw;
pw= getpwuid(geteuid());
if (pw) {
#ifdef VMS
home = decc$translate_vms(pw->pw_dir);
#else
home = pw->pw_dir;
#endif
}
#endif
if(NULL == pw) {
home = curl_getenv("HOME"); /* portable environment reader */
if(!home)
return -1;
home_alloc = TRUE;
}
file = fopen(netrcbuffer, "r"); netrcfile = curl_maprintf("%s%s%s", home, DIR_CHAR, NETRC);
if(!netrcfile) {
if(home_alloc)
free(home);
return -1;
}
netrc_alloc = TRUE;
}
file = fopen(netrcfile, "r");
if(file) { if(file) {
char *tok; char *tok;
char *tok_buf; char *tok_buf;
bool done=FALSE; bool done=FALSE;
char netrcbuffer[256];
while(!done && fgets(netrcbuffer, sizeof(netrcbuffer), file)) { while(!done && fgets(netrcbuffer, sizeof(netrcbuffer), file)) {
tok=strtok_r(netrcbuffer, " \t\n", &tok_buf); tok=strtok_r(netrcbuffer, " \t\n", &tok_buf);
@ -223,8 +218,10 @@ int Curl_parsenetrc(char *host,
fclose(file); fclose(file);
} }
if(NULL==pw) if(home_alloc)
free(home); free(home);
if(netrc_alloc)
free(netrcfile);
return retcode; return retcode;
} }

View File

@ -24,7 +24,8 @@
***************************************************************************/ ***************************************************************************/
int Curl_parsenetrc(char *host, int Curl_parsenetrc(char *host,
char *login, char *login,
char *password); char *password,
char *filename);
/* Assume: password[0]=0, host[0] != 0. /* Assume: password[0]=0, host[0] != 0.
* If login[0] = 0, search for login and password within a machine section * If login[0] = 0, search for login and password within a machine section
* in the netrc. * in the netrc.

View File

@ -507,6 +507,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
*/ */
data->set.use_netrc = va_arg(param, long); data->set.use_netrc = va_arg(param, long);
break; break;
case CURLOPT_NETRC_FILE:
/*
* Use this file instead of the $HOME/.netrc file
*/
data->set.netrc_file = va_arg(param, char *);
break;
case CURLOPT_FOLLOWLOCATION: case CURLOPT_FOLLOWLOCATION:
/* /*
* Follow Location: header hints on a HTTP-server. * Follow Location: header hints on a HTTP-server.
@ -2758,7 +2764,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
if (data->set.use_netrc != CURL_NETRC_IGNORED) { if (data->set.use_netrc != CURL_NETRC_IGNORED) {
if(Curl_parsenetrc(conn->hostname, if(Curl_parsenetrc(conn->hostname,
user, passwd)) { user, passwd,
data->set.netrc_file)) {
infof(data, "Couldn't find host %s in the .netrc file, using defaults", infof(data, "Couldn't find host %s in the .netrc file, using defaults",
conn->hostname); conn->hostname);
} }

View File

@ -854,6 +854,8 @@ struct UserDefined {
bool upload; bool upload;
enum CURL_NETRC_OPTION enum CURL_NETRC_OPTION
use_netrc; /* defined in include/curl.h */ use_netrc; /* defined in include/curl.h */
char *netrc_file; /* if not NULL, use this instead of trying to find
$HOME/.netrc */
bool verbose; bool verbose;
bool krb4; /* kerberos4 connection requested */ bool krb4; /* kerberos4 connection requested */
bool reuse_forbid; /* forbidden to be reused, close after use */ bool reuse_forbid; /* forbidden to be reused, close after use */