tool_findfile: check ~/.config/curlrc too

... after the initial checks for .curlrc and if XDG_CONFIG_HOME is not
set, use $HOME and $CURL_HOME to check if ~/.config/curlrc is present.

Add test 436 to verify

Reported-by: Sandro Jaeckel
Fixes #8208
Closes #8213
This commit is contained in:
Daniel Stenberg 2022-01-02 22:23:34 +01:00
parent 4432234aca
commit 764e4f066d
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
5 changed files with 99 additions and 21 deletions

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@ -42,18 +42,25 @@
struct finder {
const char *env;
const char *append;
bool withoutdot;
};
/* The order of the variables below is important, as the index number is used
in the findfile() function */
static const struct finder list[] = {
{ "CURL_HOME", NULL },
{ "XDG_CONFIG_HOME", NULL },
{ "HOME", NULL },
{ "CURL_HOME", NULL, FALSE },
{ "XDG_CONFIG_HOME", NULL, FALSE }, /* index == 1, used in the code */
{ "HOME", NULL, FALSE },
#ifdef WIN32
{ "USERPROFILE", NULL },
{ "APPDATA", NULL },
{ "USERPROFILE", "\\Application Data"},
{ "USERPROFILE", NULL, FALSE },
{ "APPDATA", NULL, FALSE },
{ "USERPROFILE", "\\Application Data", FALSE},
#endif
{ NULL, NULL }
/* these are for .curlrc if XDG_CONFIG_HOME is not defined */
{ "CURL_HOME", "/.config", TRUE },
{ "HOME", "/.config", TRUE },
{ NULL, NULL, FALSE }
};
static char *checkhome(const char *home, const char *fname, bool dotscore)
@ -90,11 +97,12 @@ static char *checkhome(const char *home, const char *fname, bool dotscore)
* the given file to be accessed there, then it is a match.
* 2. Non-windows: try getpwuid
*/
char *findfile(const char *fname, bool dotscore)
char *findfile(const char *fname, int dotscore)
{
int i;
bool xdg = FALSE;
DEBUGASSERT(fname && fname[0]);
DEBUGASSERT(!dotscore || (fname[0] == '.'));
DEBUGASSERT((dotscore != 1) || (fname[0] == '.'));
if(!fname[0])
return NULL;
@ -103,6 +111,9 @@ char *findfile(const char *fname, bool dotscore)
char *home = curl_getenv(list[i].env);
if(home) {
char *path;
const char *filename = fname;
if(i == 1 /* XDG_CONFIG_HOME */)
xdg = TRUE;
if(!home[0]) {
curl_free(home);
continue;
@ -114,7 +125,15 @@ char *findfile(const char *fname, bool dotscore)
return NULL;
home = c;
}
path = checkhome(home, fname, dotscore);
if(list[i].withoutdot) {
if(!dotscore || xdg)
/* this is not looking for .curlrc, or the XDG_CONFIG_HOME was
defined so we skip the extended check */
continue;
filename++; /* move past the leading dot */
dotscore = 0; /* disable it for this check */
}
path = checkhome(home, filename, dotscore ? dotscore - 1 : 0);
curl_free(home);
if(path)
return path;

View File

@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@ -23,6 +23,12 @@
***************************************************************************/
#include "tool_setup.h"
char *findfile(const char *fname, bool dotscore);
#ifdef WIN32
#define CURLRC_DOTSCORE 2 /* look for underscore-prefixed name too */
#else
#define CURLRC_DOTSCORE 1 /* regular .curlrc check */
#endif
char *findfile(const char *fname, int dotscore);
#endif /* HEADER_CURL_TOOL_HOMEDIR_H */

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@ -84,15 +84,10 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
int rc = 0;
struct OperationConfig *operation = global->last;
char *pathalloc = NULL;
#ifdef WIN32
#define DOTSCORE TRUE /* look for underscore-prefixed name too */
#else
#define DOTSCORE FALSE
#endif
if(!filename) {
/* NULL means load .curlrc from homedir! */
char *curlrc = findfile(".curlrc", DOTSCORE);
char *curlrc = findfile(".curlrc", CURLRC_DOTSCORE);
if(curlrc) {
file = fopen(curlrc, FOPEN_READTEXT);
if(!file) {

View File

@ -68,7 +68,7 @@ test392 test393 test394 test395 test396 test397 \
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
test409 test410 \
\
test430 test431 test432 test433 test434 test435 \
test430 test431 test432 test433 test434 test435 test436 \
\
test490 test491 test492 test493 test494 \
\

58
tests/data/test436 Normal file
View File

@ -0,0 +1,58 @@
<testcase>
<info>
<keywords>
--config
</keywords>
</info>
#
# Server-side
<reply>
<data>
HTTP/1.1 200 OK
Content-Length: 6
Content-Type: text/1
-foo-
</data>
</reply>
#
# Client-side
<client>
<file1 name="log/.config/curlrc">
--next
header = "a: a"
data = "curlrc read"
</file1>
<server>
http
</server>
<setenv>
CURL_HOME=%PWD/log
XDG_CONFIG_HOME=
</setenv>
<name>
Find .curlrc in .config/curlrc via CURL_HOME
</name>
<command>
%HOSTIP:%HTTPPORT/%TESTNUMBER
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<protocol nonewline="yes">
POST /%TESTNUMBER HTTP/1.1
Host: %HOSTIP:%HTTPPORT
User-Agent: curl/%VERSION
Accept: */*
a: a
Content-Length: 11
Content-Type: application/x-www-form-urlencoded
curlrc read
</protocol>
</verify>
</testcase>