SMOLNET PORTAL home about changes
iAdd user-agent gathering for annna http-user-agent module. - bitreich-httpd - Bitreich HTTPD service	Err	bitreich.org	70
hgit clone git://bitreich.org/bitreich-httpd git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/bitreich-httpd	URL:git://bitreich.org/bitreich-httpd git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/bitreich-httpd	bitreich.org	70
1Log	/scm/bitreich-httpd/log.gph	bitreich.org	70
1Files	/scm/bitreich-httpd/files.gph	bitreich.org	70
1Refs	/scm/bitreich-httpd/refs.gph	bitreich.org	70
1Tags	/scm/bitreich-httpd/tag	bitreich.org	70
1README	/scm/bitreich-httpd/file/README.md.gph	bitreich.org	70
1LICENSE	/scm/bitreich-httpd/file/LICENSE.gph	bitreich.org	70
i---	Err	bitreich.org	70
1commit e5dfc5fbfe93266da5edb1bb2e903734738296cf	/scm/bitreich-httpd/commit/e5dfc5fbfe93266da5edb1bb2e903734738296cf.gph	bitreich.org	70
1parent d0062f038d181b8d5eb150003ea7b50bcb5330f3	/scm/bitreich-httpd/commit/d0062f038d181b8d5eb150003ea7b50bcb5330f3.gph	bitreich.org	70
hAuthor: Christoph Lohmann <20h@r-36.net>	URL:mailto:20h@r-36.net	bitreich.org	70
iDate:   Mon, 21 Aug 2023 22:17:11 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iAdd user-agent gathering for annna http-user-agent module.	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M bitreich-httpd.c                    |      89 ++++++++++++++++++++++++++++---	Err	bitreich.org	70
i	Err	bitreich.org	70
i1 file changed, 82 insertions(+), 7 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/bitreich-httpd.c b/bitreich-httpd.c	/scm/bitreich-httpd/file/bitreich-httpd.c.gph	bitreich.org	70
i@@ -11,6 +11,7 @@	Err	bitreich.org	70
i #include <sys/stat.h>	Err	bitreich.org	70
i #include <fcntl.h>	Err	bitreich.org	70
i #include <string.h>	Err	bitreich.org	70
i+#include <strings.h>	Err	bitreich.org	70
i #include <sys/socket.h>	Err	bitreich.org	70
i #include <netdb.h>	Err	bitreich.org	70
i #include <time.h>	Err	bitreich.org	70
i@@ -102,16 +103,48 @@ servefile(char *path, char *ctype, int sock)	Err	bitreich.org	70
i         return 0;	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+char *	Err	bitreich.org	70
i+read_line(int fd, int *len, int maxread)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *buf;	Err	bitreich.org	70
i+        int r, rbytes;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        buf = xmalloc(maxread+1);	Err	bitreich.org	70
i+        memset(buf, 0, maxread+1);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        rbytes = 0;	Err	bitreich.org	70
i+        while (rbytes < maxread) {	Err	bitreich.org	70
i+                r = read(fd, &buf[rbytes], 1);	Err	bitreich.org	70
i+                if (r < 0) {	Err	bitreich.org	70
i+                        free(buf);	Err	bitreich.org	70
i+                        return NULL;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                if (r == 0)	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                if (buf[rbytes] == '\n') {	Err	bitreich.org	70
i+                        buf[rbytes] = '\0';	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                rbytes += r;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        *len = rbytes;	Err	bitreich.org	70
i+        return buf;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i int	Err	bitreich.org	70
i main(int argc, char *argv[])	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        char *wwwbase, *wwwindex, request[512], *ctype, *path, *le_file,	Err	bitreich.org	70
i-                *le_base, clienth[NI_MAXHOST], clientp[NI_MAXSERV], *zuccbase;	Err	bitreich.org	70
i+        char *wwwbase, *wwwindex, *request, *ctype, *path, *le_file,	Err	bitreich.org	70
i+                *le_base, clienth[NI_MAXHOST], clientp[NI_MAXSERV], *zuccbase,	Err	bitreich.org	70
i+                *requested, *header, *headerval, *hosthdr;	Err	bitreich.org	70
i         int rlen;	Err	bitreich.org	70
i         struct sockaddr_storage clt;	Err	bitreich.org	70
i         socklen_t cltlen = sizeof(clt);	Err	bitreich.org	70
i         time_t tim;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+        hosthdr = NULL;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         wwwbase = "/bitreich/www";	Err	bitreich.org	70
i         wwwindex = "index.html";	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -130,11 +163,50 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                         clienth[0] = clientp[0] = '\0';	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        rlen = read(0, request, sizeof(request)-1);	Err	bitreich.org	70
i-        if (rlen < 0)	Err	bitreich.org	70
i+        request = read_line(0, &rlen, 512);	Err	bitreich.org	70
i+        if (request == NULL)	Err	bitreich.org	70
i                 return 1;	Err	bitreich.org	70
i+        if (request[rlen-1] == '\r')	Err	bitreich.org	70
i+                request[rlen-1] = '\0';	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        request[rlen] = '\0';	Err	bitreich.org	70
i+        /* Header parsing. */	Err	bitreich.org	70
i+        for (;;) {	Err	bitreich.org	70
i+                header = read_line(0, &rlen, 512);	Err	bitreich.org	70
i+                if (header == NULL)	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                if (header[rlen-1] == '\r') {	Err	bitreich.org	70
i+                        header[rlen-1] = '\0';	Err	bitreich.org	70
i+                        if (rlen == 1) {	Err	bitreich.org	70
i+                                free(header);	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                headerval = strchr(header, ':');	Err	bitreich.org	70
i+                if (headerval == NULL) {	Err	bitreich.org	70
i+                        free(header);	Err	bitreich.org	70
i+                        continue;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                *headerval = '\0';	Err	bitreich.org	70
i+                headerval += 2;	Err	bitreich.org	70
i+                if (headerval > (header + rlen)) {	Err	bitreich.org	70
i+                        free(header);	Err	bitreich.org	70
i+                        continue;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                if (!strcasecmp(header, "user-agent")) {	Err	bitreich.org	70
i+                        asprintf(&path,	Err	bitreich.org	70
i+                                "/home/annna/bin/modules/http-user-agent/add-user-agent.sh \"%s\"",	Err	bitreich.org	70
i+                                headerval);	Err	bitreich.org	70
i+                        system(path);	Err	bitreich.org	70
i+                        free(path);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                if (!strcasecmp(header, "host")) {	Err	bitreich.org	70
i+                        rlen = strlen(headerval);	Err	bitreich.org	70
i+                        hosthdr = xmalloc(rlen+1);	Err	bitreich.org	70
i+                        memset(hosthdr, 0, rlen+1);	Err	bitreich.org	70
i+                        strncpy(hosthdr, headerval, rlen);	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+                free(header);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         if (strncmp(request, "GET ", 4))	Err	bitreich.org	70
i                 return 1;	Err	bitreich.org	70
i@@ -170,7 +242,7 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i         } else if ((le_file = strstr(request, ".well-known/acme-challenge/"))) {	Err	bitreich.org	70
i                 /* Setup for Letsencrypt */	Err	bitreich.org	70
i                 le_file += strlen(".well-known/acme-challenge/");	Err	bitreich.org	70
i-                char *requested = strtok(le_file, " ");	Err	bitreich.org	70
i+                requested = strtok(le_file, " ");	Err	bitreich.org	70
i                 if (strchr(requested, '/') != NULL) {	Err	bitreich.org	70
i                         /* Get Zucced, no path exploitation. */	Err	bitreich.org	70
i                         asprintf(&path, "%s/zucc-job.webm", zuccbase);	Err	bitreich.org	70
i@@ -181,7 +253,7 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                         ctype = "text/plain";	Err	bitreich.org	70
i                 }	Err	bitreich.org	70
i         } else {	Err	bitreich.org	70
i-                if (strstr(request, "zuccless.org")) {	Err	bitreich.org	70
i+                if (strstr(hosthdr, "zuccless.org")) {	Err	bitreich.org	70
i                         tim = time(NULL);	Err	bitreich.org	70
i                         srandom(tim);	Err	bitreich.org	70
i                         wwwbase = zuccbase;	Err	bitreich.org	70
i@@ -199,6 +271,9 @@ main(int argc, char *argv[])	Err	bitreich.org	70
i                         ctype = "text/html";	Err	bitreich.org	70
i                 }	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i+        if (hosthdr != NULL)	Err	bitreich.org	70
i+                free(hosthdr);	Err	bitreich.org	70
i+        free(request);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         rlen = servefile(path, ctype, 1);	Err	bitreich.org	70
i         free(path);	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/bitreich-httpd/commit/e5dfc5f...
Content-Typetext/plain; charset=utf-8