]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tool_findfile: check ~/.config/curlrc too
authorDaniel Stenberg <daniel@haxx.se>
Sun, 2 Jan 2022 21:23:34 +0000 (22:23 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 7 Jan 2022 09:10:49 +0000 (10:10 +0100)
... 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

src/tool_findfile.c
src/tool_findfile.h
src/tool_parsecfg.c
tests/data/Makefile.inc
tests/data/test436 [new file with mode: 0644]

index cda8c8ed8d8fac156b5a00dca3bd08a817078025..766586f695110300427c84f573805a2bb800bc90 100644 (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
 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;
index 0f6a8eb55b52f9f4847d86f28b2e6d85f3d89cb6..412390867f04d2aad9d42548f3f3373298a1494a 100644 (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
  ***************************************************************************/
 #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 */
index ddb345c6d8168d3fe90876a5aa12cf8a5ef591c9..3630ceca89ff39bc63cd8f05d1cb4128f3a07a47 100644 (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) {
index 8ac53b06dff5c3586e1004184ca06cc7c94acc75..6a12afe385c3853b47cd18e49c03dbd38b7deb9c 100644 (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 \
 \
diff --git a/tests/data/test436 b/tests/data/test436
new file mode 100644 (file)
index 0000000..0a62cfb
--- /dev/null
@@ -0,0 +1,58 @@
+<testcase>
+<info>
+<keywords>
+--config
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK\r
+Content-Length: 6\r
+Content-Type: text/1\r
+\r
+-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\r
+Host: %HOSTIP:%HTTPPORT\r
+User-Agent: curl/%VERSION\r
+Accept: */*\r
+a: a\r
+Content-Length: 11\r
+Content-Type: application/x-www-form-urlencoded\r
+\r
+curlrc read
+</protocol>
+</verify>
+</testcase>