| Add nocgi flag support. - geomyidae - A small C-based gopherd. | |
| git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri… | |
| Log | |
| Files | |
| Refs | |
| Tags | |
| README | |
| LICENSE | |
| --- | |
| commit 41351723302568be16bae736faecf9135fb612c3 | |
| parent ce4493bfe5e03be7d7366962600933b1178ebbfd | |
| Author: Christoph Lohmann <[email protected]> | |
| Date: Fri, 22 Jun 2018 17:09:40 +0200 | |
| Add nocgi flag support. | |
| * Fix naming of error messages. | |
| * Add better error, if some file is not found. | |
| * Add hint for further handler implementations. | |
| Thanks Solene, for the suggestion! | |
| Diffstat: | |
| M geomyidae.8 | 4 ++++ | |
| M ind.c | 5 +++++ | |
| M main.c | 32 +++++++++++++++++++++++------… | |
| 3 files changed, 33 insertions(+), 8 deletions(-) | |
| --- | |
| diff --git a/geomyidae.8 b/geomyidae.8 | |
| @@ -15,6 +15,7 @@ | |
| .Op Fl 6 | |
| .Op Fl c | |
| .Op Fl d | |
| +.Op Fl e | |
| .Op Fl n | |
| .Op Fl l Ar logfile | |
| .Op Fl v Ar loglevel | |
| @@ -99,6 +100,9 @@ directory (by default off). | |
| Don't fork into background. If no log file is given, this implies logging to | |
| the standard output. | |
| . | |
| +.It Fl e | |
| +Disable execution of any CGI or DCGI script. | |
| +. | |
| .It Fl n | |
| Don't perform reverse lookups. | |
| . | |
| diff --git a/ind.c b/ind.c | |
| @@ -30,6 +30,11 @@ | |
| #include "ind.h" | |
| #include "handlr.h" | |
| +/* | |
| + * Be careful, to look at handlerequest(), in case you add any executing | |
| + * handler, so nocgi will be valuable. | |
| + */ | |
| + | |
| filetype type[] = { | |
| {"default", "9", handlebin}, | |
| {"gph", "1", handlegph}, | |
| diff --git a/main.c b/main.c | |
| @@ -47,8 +47,11 @@ char *argv0; | |
| char *stdbase = "/var/gopher"; | |
| char *stdport = "70"; | |
| char *indexf[] = {"/index.gph", "/index.cgi", "/index.dcgi", "/index.bin"}; | |
| -char *err = "3Sorry, but the requested token '%s' could not be found.\tErr" | |
| - "\tlocalhost\t70\r\n.\r\n\r\n"; | |
| +char *nocgierr = "3Sorry, execution of the token '%s' was requested, but this " | |
| + "is disabled in the server configuration.\tErr" | |
| + "\tlocalhost\t70\r\n"; | |
| +char *notfounderr = "3Sorry, but the requested token '%s' could not be found.\… | |
| + "\tlocalhost\t70\r\n"; | |
| char *htredir = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" | |
| "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//E… | |
| " \"DTD/xhtml-transitional.dtd\">\n" | |
| @@ -110,7 +113,7 @@ logentry(char *host, char *port, char *qry, char *status) | |
| void | |
| handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, | |
| - char *clientp) | |
| + char *clientp, int nocgi) | |
| { | |
| struct stat dir; | |
| char recvc[1025], recvb[1025], path[1025], *args, *sear, *c; | |
| @@ -203,6 +206,7 @@ handlerequest(int sock, char *base, char *ohost, char *port… | |
| } else { | |
| fd = open(path, O_RDONLY); | |
| if (fd < 0) { | |
| + dprintf(sock, notfounderr, recvc); | |
| if (loglvl & ERRORS) | |
| logentry(clienth, clientp, recvc, strerror(err… | |
| return; | |
| @@ -218,7 +222,14 @@ handlerequest(int sock, char *base, char *ohost, char *por… | |
| if (c == nil) | |
| c = path; | |
| type = gettype(c); | |
| - type->f(sock, path, port, base, args, sear, ohost, clienth); | |
| + if (nocgi && (type->f == handledcgi || type->f == handlecgi)) { | |
| + dprintf(sock, nocgierr, recvc); | |
| + if (loglvl & ERRORS) | |
| + logentry(clienth, clientp, recvc, "nocgi error… | |
| + } else { | |
| + type->f(sock, path, port, base, args, sear, ohost, | |
| + clienth); | |
| + } | |
| } else { | |
| if (S_ISDIR(dir.st_mode)) { | |
| handledir(sock, path, port, base, args, sear, ohost, | |
| @@ -230,7 +241,7 @@ handlerequest(int sock, char *base, char *ohost, char *port… | |
| return; | |
| } | |
| - dprintf(sock, err, recvc); | |
| + dprintf(sock, notfounderr, recvc); | |
| if (loglvl & ERRORS) | |
| logentry(clienth, clientp, recvc, "not found"); | |
| } | |
| @@ -334,7 +345,7 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *por… | |
| void | |
| usage(void) | |
| { | |
| - dprintf(2, "usage: %s [-4] [-6] [-c] [-d] [-n] [-l logfile] " | |
| + dprintf(2, "usage: %s [-46cden] [-l logfile] " | |
| "[-v loglvl] [-b base] [-p port] [-o sport] " | |
| "[-u user] [-g group] [-h host] [-i IP]\n", | |
| argv0); | |
| @@ -347,7 +358,7 @@ main(int argc, char *argv[]) | |
| struct addrinfo hints; | |
| struct sockaddr_storage clt; | |
| socklen_t cltlen; | |
| - int sock, dofork, v4, v6, usechroot = 0; | |
| + int sock, dofork, v4, v6, usechroot, nocgi; | |
| char *port, *base, clienth[NI_MAXHOST], clientp[NI_MAXSERV]; | |
| char *user, *group, *bindip, *ohost, *sport; | |
| struct passwd *us; | |
| @@ -365,6 +376,8 @@ main(int argc, char *argv[]) | |
| sport = port; | |
| v4 = 1; | |
| v6 = 1; | |
| + usechroot = 0; | |
| + nocgi = 0; | |
| ARGBEGIN { | |
| case '4': | |
| @@ -388,6 +401,9 @@ main(int argc, char *argv[]) | |
| case 'd': | |
| dofork = 0; | |
| break; | |
| + case 'e': | |
| + nocgi = 1; | |
| + break; | |
| case 'v': | |
| loglvl = atoi(EARGF(usage())); | |
| break; | |
| @@ -560,7 +576,7 @@ main(int argc, char *argv[]) | |
| signal(SIGALRM, SIG_DFL); | |
| handlerequest(sock, base, ohost, sport, clienth, | |
| - clientp); | |
| + clientp, nocgi); | |
| waitforpendingbytes(sock); | |