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