iOptimize new path fallthrough feature to only serve dynamic content. - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 27c94c92d5fdf7294ee1905c381d0ce2f4ccebca /scm/geomyidae/commit/27c94c92d5fdf7294ee1905c381d0ce2f4ccebca.gph bitreich.org 70 1parent fdd8c5b2210b2c3719bce020dfec54bbe36adb49 /scm/geomyidae/commit/fdd8c5b2210b2c3719bce020dfec54bbe36adb49.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sun, 3 Apr 2022 09:55:45 +0200 Err bitreich.org 70 i Err bitreich.org 70 iOptimize new path fallthrough feature to only serve dynamic content. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M main.c | 29 +++++++++++++++++++++++++++-- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 27 insertions(+), 2 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -139,10 +139,14 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i struct stat dir; Err bitreich.org 70 i char recvc[1025], recvb[1025], path[1025], args[1025], argsc[1025], Err bitreich.org 70 i *sear, *c, *sep, *pathp, *recvbp; Err bitreich.org 70 i- int len = 0, fd, i, maxrecv; Err bitreich.org 70 i+ int len = 0, fd, i, maxrecv, pathfallthrough = 0; Err bitreich.org 70 i filetype *type; Err bitreich.org 70 i Err bitreich.org 70 i if (!istls) { Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * If sticky bit is set on base dir and encryption is not Err bitreich.org 70 i+ * used, do not serve. Err bitreich.org 70 i+ */ Err bitreich.org 70 i if (stat(base, &dir) == -1) Err bitreich.org 70 i return; Err bitreich.org 70 i if (dir.st_mode & S_ISVTX) { Err bitreich.org 70 i@@ -284,12 +288,16 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i ); Err bitreich.org 70 i } Err bitreich.org 70 i /* path fallthrough */ Err bitreich.org 70 i+ pathfallthrough = 1; Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (stat(path, &dir) != -1) { Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * If sticky bit is set, only serve if this is encrypted. Err bitreich.org 70 i+ */ Err bitreich.org 70 i if ((dir.st_mode & S_ISVTX) && !istls) { Err bitreich.org 70 i dprintf(sock, tlserr, recvc); Err bitreich.org 70 i if (loglvl & ERRORS) { Err bitreich.org 70 i@@ -340,6 +348,19 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i if (c == NULL) Err bitreich.org 70 i c = path; Err bitreich.org 70 i type = gettype(c); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * If we had to traverse the path to find some, only Err bitreich.org 70 i+ * allow index.dcgi and index.cgi as handlers. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ if (pathfallthrough && Err bitreich.org 70 i+ !(type->f == handledcgi || type->f == handlecgi)) { Err bitreich.org 70 i+ dprintf(sock, notfounderr, recvc); Err bitreich.org 70 i+ if (loglvl & ERRORS) Err bitreich.org 70 i+ logentry(clienth, clientp, recvc, "not found"); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i if (nocgi && (type->f == handledcgi || type->f == handlecgi)) { Err bitreich.org 70 i dprintf(sock, nocgierr, recvc); Err bitreich.org 70 i if (loglvl & ERRORS) Err bitreich.org 70 i@@ -349,7 +370,11 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i clienth, istls); Err bitreich.org 70 i } Err bitreich.org 70 i } else { Err bitreich.org 70 i- if (S_ISDIR(dir.st_mode)) { Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * If we had to traverse the path, do not allow directory Err bitreich.org 70 i+ * listings, only dynamic content. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ if (!pathfallthrough && S_ISDIR(dir.st_mode)) { Err bitreich.org 70 i handledir(sock, path, port, base, args, sear, ohost, Err bitreich.org 70 i clienth, istls); Err bitreich.org 70 i if (loglvl & DIRS) { Err bitreich.org 70 .