iSpit out error in case of improperly URI escaping with hURL: - 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 4140d67a13c6888267e975e8bf60bfe91f3d21a4 /scm/geomyidae/commit/4140d67a13c6888267e975e8bf60bfe91f3d21a4.gph bitreich.org 70 1parent 666c891cb2fa5ddd436e1cd0662f0c3e3d2ed142 /scm/geomyidae/commit/666c891cb2fa5ddd436e1cd0662f0c3e3d2ed142.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sat, 10 Feb 2024 12:43:48 +0100 Err bitreich.org 70 i Err bitreich.org 70 iSpit out error in case of improperly URI escaping with hURL: Err bitreich.org 70 i Err bitreich.org 70 iThanks pazzo for giving me the hint! Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M main.c | 62 ++++++++++++++++++++++--------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 44 insertions(+), 18 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@@ -61,31 +61,37 @@ char *argv0; Err bitreich.org 70 i char stdbase[] = "/var/gopher"; Err bitreich.org 70 i char *stdport = "70"; Err bitreich.org 70 i char *indexf[] = {"index.gph", "index.cgi", "index.dcgi", "index.bob", "index.bin"}; Err bitreich.org 70 i+ Err bitreich.org 70 i char *nocgierr = "3Sorry, execution of the token '%s' was requested, but this " Err bitreich.org 70 i "is disabled in the server configuration.\tErr" Err bitreich.org 70 i "\tlocalhost\t70\r\n"; Err bitreich.org 70 i+ Err bitreich.org 70 i char *notfounderr = "3Sorry, but the requested token '%s' could not be found.\tErr" Err bitreich.org 70 i "\tlocalhost\t70\r\n"; Err bitreich.org 70 i+ Err bitreich.org 70 i char *toolongerr = "3Sorry, but the requested token '%s' is a too long path.\tErr" Err bitreich.org 70 i "\tlocalhost\t70\r\n"; Err bitreich.org 70 i+ Err bitreich.org 70 i char *tlserr = "3Sorry, but the requested token '%s' requires an encrypted connection.\tErr" Err bitreich.org 70 i "\tlocalhost\t70\r\n"; Err bitreich.org 70 i-char *htredir = "\n" Err bitreich.org 70 i- "\n" Err bitreich.org 70 i- "\n" Err bitreich.org 70 i- " \n" Err bitreich.org 70 i- " gopher redirect\n" Err bitreich.org 70 i- "\n" Err bitreich.org 70 i- " \n" Err bitreich.org 70 i- " \n" Err bitreich.org 70 i- " \n" Err bitreich.org 70 i- " This page is for redirecting you to: %s.\n" Err bitreich.org 70 i- " \n" Err bitreich.org 70 i- "\n"; Err bitreich.org 70 i-char *selinval ="3Happy helping ☃ here: " Err bitreich.org 70 i- "Sorry, your selector does contains '..'. " Err bitreich.org 70 i- "That's illegal here.\tErr\tlocalhost\t70\r\n.\r\n\r\n"; Err bitreich.org 70 i+ Err bitreich.org 70 i+/* TODO: Transform gopherspace to not need this anymore. See sacc(1). */ Err bitreich.org 70 i+char *htredir = "\n" Err bitreich.org 70 i+ "gopher redirect\n" Err bitreich.org 70 i+ "\n" Err bitreich.org 70 i+ "\n" Err bitreich.org 70 i+ "Please consider using native gopher 'w' type.\n" Err bitreich.org 70 i+ "HTML is insecure and bloated.
\n" Err bitreich.org 70 i+ "You will be redirected to: %s.\n" Err bitreich.org 70 i+ "\n"; Err bitreich.org 70 i+ Err bitreich.org 70 i+char *htescape = "3Happy helping ☃ here: " Err bitreich.org 70 i+ "Sorry, your URI was not properly escaped." Err bitreich.org 70 i+ "\tErr\tlocalhost\t70\r\n.\r\n\r\n"; Err bitreich.org 70 i+ Err bitreich.org 70 i+char *selinval = "3Happy helping ☃ here: " Err bitreich.org 70 i+ "Sorry, your selector does contains '..'. " Err bitreich.org 70 i+ "That's illegal here.\tErr\tlocalhost\t70\r\n.\r\n\r\n"; Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i dropprivileges(struct group *gr, struct passwd *pw) Err bitreich.org 70 i@@ -186,7 +192,7 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i * mode. Err bitreich.org 70 i */ Err bitreich.org 70 i if (!nocgi && recvb[0] != '/' && (c = strchr(recvb, ' '))) { Err bitreich.org 70 i- *c++ = '\0'; Err bitreich.org 70 i+ *c = '\0'; Err bitreich.org 70 i if (strchr(recvb, '/')) Err bitreich.org 70 i goto dothegopher; Err bitreich.org 70 i if (snprintf(path, sizeof(path), "%s/%s", base, recvb) <= sizeof(path)) { Err bitreich.org 70 i@@ -199,8 +205,9 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i return; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i- } Err bitreich.org 70 i dothegopher: Err bitreich.org 70 i+ *c = ' '; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i /* Do not allow requests including "..". */ Err bitreich.org 70 i if (strstr(recvb, "..")) { Err bitreich.org 70 i@@ -237,7 +244,26 @@ dothegopher: Err bitreich.org 70 i memmove(recvc, recvb, rlen+1); Err bitreich.org 70 i Err bitreich.org 70 i /* Redirect to HTML redirecting to the specified URI. */ Err bitreich.org 70 i+ /* TODO: Fix gopherspace to not require this. */ Err bitreich.org 70 i if (!strncmp(recvb, "URL:", 4)) { Err bitreich.org 70 i+ for (i = 4; i < sizeof(recvb)-1; i++) { Err bitreich.org 70 i+ switch (recvb[i]) { Err bitreich.org 70 i+ case '\0': Err bitreich.org 70 i+ i = sizeof(recvb); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case '"': Err bitreich.org 70 i+ case '&': Err bitreich.org 70 i+ case '>': Err bitreich.org 70 i+ case '<': Err bitreich.org 70 i+ case ' ': Err bitreich.org 70 i+ case '\'': Err bitreich.org 70 i+ case '\\': Err bitreich.org 70 i+ write(sock, htescape, strlen(htescape)); Err bitreich.org 70 i+ if (loglvl & ERRORS) Err bitreich.org 70 i+ logentry(clienth, clientp, recvc, "Unescaped HTTP redirect"); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i len = snprintf(path, sizeof(path), htredir, Err bitreich.org 70 i recvb + 4, recvb + 4, recvb + 4); Err bitreich.org 70 i if (len > sizeof(path)) Err bitreich.org 70 .