| Set GOPHERS and HTTPS in CGI, if TLS is used. - geomyidae - A small C-based gop… | |
| git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri… | |
| Log | |
| Files | |
| Refs | |
| Tags | |
| README | |
| LICENSE | |
| --- | |
| commit 89d4f0d0cf90543362a036133e88cb9fe21513d4 | |
| parent 3600ffac963bc5816c86b8e447feea77a2b34751 | |
| Author: Christoph Lohmann <[email protected]> | |
| Date: Fri, 12 Jun 2020 20:17:01 +0200 | |
| Set GOPHERS and HTTPS in CGI, if TLS is used. | |
| Add infrastructure, so other handlers could handle it too. | |
| Diffstat: | |
| M geomyidae.8 | 1 + | |
| M handlr.c | 16 +++++++++------- | |
| M handlr.h | 11 ++++++----- | |
| M ind.c | 12 +++++++++++- | |
| M ind.h | 5 +++-- | |
| M main.c | 9 +++++---- | |
| 6 files changed, 35 insertions(+), 19 deletions(-) | |
| --- | |
| diff --git a/geomyidae.8 b/geomyidae.8 | |
| @@ -372,6 +372,7 @@ Additionally to the above arguments several environment var… | |
| .Dl SERVER_PROTOCOL = `gopher/1.0' | |
| .Dl SERVER_SOFTWARE = `geomyidae' | |
| .Dl X_GOPHER_SEARCH = search (See above.) | |
| +.Dl HTTPS and GOPHERS = set, if TLS is used | |
| .Pp | |
| .Ed | |
| . | |
| diff --git a/handlr.c b/handlr.c | |
| @@ -23,7 +23,7 @@ | |
| void | |
| handledir(int sock, char *path, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost) | |
| + char *sear, char *ohost, char *chost, int istls) | |
| { | |
| char *pa, *file, *e, *par, *b; | |
| struct dirent **dirent; | |
| @@ -80,7 +80,7 @@ handledir(int sock, char *path, char *port, char *base, char … | |
| void | |
| handlegph(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost) | |
| + char *sear, char *ohost, char *chost, int istls) | |
| { | |
| Indexs *act; | |
| int i, ret = 0; | |
| @@ -103,7 +103,7 @@ handlegph(int sock, char *file, char *port, char *base, cha… | |
| void | |
| handlebin(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost) | |
| + char *sear, char *ohost, char *chost, int istls) | |
| { | |
| int fd; | |
| @@ -123,7 +123,7 @@ handlebin(int sock, char *file, char *port, char *base, cha… | |
| void | |
| handlecgi(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost) | |
| + char *sear, char *ohost, char *chost, int istls) | |
| { | |
| char *p, *path; | |
| @@ -158,7 +158,8 @@ handlecgi(int sock, char *file, char *port, char *base, cha… | |
| break; | |
| } | |
| - setcgienviron(p, file, port, base, args, sear, ohost, chost); | |
| + setcgienviron(p, file, port, base, args, sear, ohost, chost, | |
| + istls); | |
| if (execl(file, p, sear, args, ohost, port, | |
| (char *)NULL) == -1) { | |
| @@ -177,7 +178,7 @@ handlecgi(int sock, char *file, char *port, char *base, cha… | |
| void | |
| handledcgi(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost) | |
| + char *sear, char *ohost, char *chost, int istls) | |
| { | |
| FILE *fp; | |
| char *p, *path, *ln = NULL; | |
| @@ -218,7 +219,8 @@ handledcgi(int sock, char *file, char *port, char *base, ch… | |
| break; | |
| } | |
| - setcgienviron(p, file, port, base, args, sear, ohost, chost); | |
| + setcgienviron(p, file, port, base, args, sear, ohost, chost, | |
| + istls); | |
| if (execl(file, p, sear, args, ohost, port, | |
| (char *)NULL) == -1) { | |
| diff --git a/handlr.h b/handlr.h | |
| @@ -17,17 +17,18 @@ | |
| * sear .... search part of request (»selector\tsearch\r\n«) | |
| * ohost ... host of geomiydae (See -h in geomyidae(8)) | |
| * chost ... IP of the client sending a request | |
| + * istls ... set to 1, if TLS was used for thr request | |
| */ | |
| void handledir(int sock, char *path, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost); | |
| + char *sear, char *ohost, char *chost, int istls); | |
| void handlegph(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost); | |
| + char *sear, char *ohost, char *chost, int istls); | |
| void handlebin(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost); | |
| + char *sear, char *ohost, char *chost, int istls); | |
| void handlecgi(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost); | |
| + char *sear, char *ohost, char *chost, int istls); | |
| void handledcgi(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost); | |
| + char *sear, char *ohost, char *chost, int istls); | |
| #endif | |
| diff --git a/ind.c b/ind.c | |
| @@ -465,7 +465,7 @@ reverselookup(char *host) | |
| void | |
| setcgienviron(char *file, char *path, char *port, char *base, char *args, | |
| - char *sear, char *ohost, char *chost) | |
| + char *sear, char *ohost, char *chost, int istls) | |
| { | |
| /* | |
| * TODO: Clean environment from possible unsafe environment variables. | |
| @@ -485,6 +485,7 @@ setcgienviron(char *file, char *path, char *port, char *bas… | |
| * the script. The RFC allows us to set the IP to the value. | |
| */ | |
| setenv("REMOTE_HOST", chost, 1); | |
| + /* Please do not implement identd here. */ | |
| unsetenv("REMOTE_IDENT"); | |
| unsetenv("REMOTE_USER"); | |
| /* Make PHP happy. */ | |
| @@ -501,5 +502,14 @@ setcgienviron(char *file, char *path, char *port, char *ba… | |
| setenv("SERVER_SOFTWARE", "geomyidae", 1); | |
| setenv("X_GOPHER_SEARCH", sear, 1); | |
| + | |
| + if (istls) { | |
| + setenv("GOPHERS", "on", 1); | |
| + setenv("HTTPS", "on", 1); | |
| + } else { | |
| + unsetenv("GOPHERS"); | |
| + unsetenv("HTTPS"); | |
| + } | |
| + | |
| } | |
| diff --git a/ind.h b/ind.h | |
| @@ -27,7 +27,7 @@ struct filetype { | |
| char *end; | |
| char *type; | |
| void (* f)(int, char *, char *, char *, char *, char *, char *, | |
| - char *); | |
| + char *, int); | |
| }; | |
| filetype *gettype(char *filename); | |
| @@ -48,7 +48,8 @@ void freeelem(Elems *e); | |
| char *smprintf(char *fmt, ...); | |
| char *reverselookup(char *host); | |
| void setcgienviron(char *file, char *path, char *port, char *base, | |
| - char *args, char *sear, char *ohost, char *chost); | |
| + char *args, char *sear, char *ohost, char *chost, | |
| + int istls); | |
| #endif | |
| diff --git a/main.c b/main.c | |
| @@ -121,7 +121,8 @@ logentry(char *host, char *port, char *qry, char *status) | |
| void | |
| handlerequest(int sock, char *req, int rlen, char *base, char *ohost, | |
| - char *port, char *clienth, char *clientp, int nocgi) | |
| + char *port, char *clienth, char *clientp, int nocgi, | |
| + int istls) | |
| { | |
| struct stat dir; | |
| char recvc[1025], recvb[1025], path[1025], *args = NULL, *sear, *c; | |
| @@ -247,12 +248,12 @@ handlerequest(int sock, char *req, int rlen, char *base, … | |
| logentry(clienth, clientp, recvc, "nocgi error… | |
| } else { | |
| type->f(sock, path, port, base, args, sear, ohost, | |
| - clienth); | |
| + clienth, istls); | |
| } | |
| } else { | |
| if (S_ISDIR(dir.st_mode)) { | |
| handledir(sock, path, port, base, args, sear, ohost, | |
| - clienth); | |
| + clienth, istls); | |
| if (loglvl & DIRS) { | |
| logentry(clienth, clientp, recvc, | |
| "dir listing"); | |
| @@ -863,7 +864,7 @@ main(int argc, char *argv[]) | |
| handlerequest(sock, recvb, rlen, base, | |
| ohost, sport, clienth, | |
| - clientp, nocgi); | |
| + clientp, nocgi, istls); | |
| if (!istls) { | |
| waitforpendingbytes(sock); |