Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.