commit 41351723302568be16bae736faecf9135fb612c3
parent ce4493bfe5e03be7d7366962600933b1178ebbfd
Author: Christoph Lohmann <20h@r-36.net>
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:
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.\tErr"
+ "\tlocalhost\t70\r\n";
char *htredir = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n"
" \"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, char *clienth,
} else {
fd = open(path, O_RDONLY);
if (fd < 0) {
+ dprintf(sock, notfounderr, recvc);
if (loglvl & ERRORS)
logentry(clienth, clientp, recvc, strerror(errno));
return;
@@ -218,7 +222,14 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth,
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, char *clienth,
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 *port)
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);