From 13d0a6953565356c79efb0b075e042fab618f926 Mon Sep 17 00:00:00 2001 From: Kevin Jerebica Date: Mon, 30 Sep 2024 22:27:03 +0200 Subject: [PATCH] proxy: introduce tls/ssl changes still needs fixing and optimizations, but so far it looks good to me --- proxlib | Bin 145192 -> 148264 bytes proxlib.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/proxlib b/proxlib index 0f28968b1714fbe4803575333ef5c1fb3d8fa4a4..24ce6221c63c6b323a568d0b84b2968ccb6a477f 100755 GIT binary patch delta 46588 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 LK@RuIqVWF!iRf-} diff --git a/proxlib.c b/proxlib.c index 4b44edc..f09025e 100644 --- a/proxlib.c +++ b/proxlib.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -187,7 +188,8 @@ int do_con_srv(struct conn *conn) { return ERR_PARS; } - struct hostinfo *info = (struct hostinfo *) calloc(1, sizeof(struct hostinfo)); + struct hostinfo *info = + (struct hostinfo *) calloc(1, sizeof(struct hostinfo)); if (!info) { return ERR_MEM; } @@ -280,20 +282,24 @@ int do_rcv_clt(struct conn *conn) { // body struct httpareq *req = &conn->cltreq; struct point *content_length_entry = &req->hentries[header_content_length]; - struct point *transfer_encoding_entry = &req->hentries[header_transfer_encoding]; + struct point *transfer_encoding_entry = + &req->hentries[header_transfer_encoding]; if (content_length_entry->er) { int content_length = 0; - ret = stoin(content_length_entry->er, content_length_entry->len, &content_length); + ret = stoin(content_length_entry->er, + content_length_entry->len, &content_length); if (ret < 0) { return ERR_PARS; } - ret = pull_content_length(conn->srvfd, content_length, &msgbuff_len, &msgbuff); + ret = pull_content_length(conn->srvfd, + content_length, &msgbuff_len, &msgbuff); if (ret < 0) { return ERR_RECV; } - } else if (transfer_encoding_entry->er && strcmp(transfer_encoding_entry->er, "chunked") == 0) { + } else if (transfer_encoding_entry->er && + strcmp(transfer_encoding_entry->er, "chunked") == 0) { ret = pull_chunked_encoding(conn->srvfd, &msgbuff_len, &msgbuff); if (ret < 0) { return ERR_RECV; @@ -372,6 +378,35 @@ void do_statem(struct conn *conn) { do_err(); } + // TODO: add stanard checks for detecting real TLS connections + // and prevent fake/forged ones. + if (conn->cltreq.titl.method == method_connect) { + int size = snprintf(NULL, 0, "%.*s 200 Connection established\r\n" + "Proxy-agent: proxlib\r\n" + "\r\n", + conn->cltreq.titl.ver.len, conn->cltreq.titl.ver.er + ); + size += 1; + char *msg = (char *) malloc(size); + memset(msg, 0, size); + snprintf(msg, size, "%.*s 200 Connection established\r\n" + "Proxy-agent: proxlib\r\n" + "\r\n", + conn->cltreq.titl.ver.len, conn->cltreq.titl.ver.er + ); + + ret = write_buffer(conn->cltfd, &msg, &size); + if (ret < 0) { + fprintf(stderr, "Failed writing to client: %s\n", strerror(errno)); + return; + } + + free(msg); + free(conn->cltbuff); + conn->cltbuff = 0; + conn->cltbuff_len = 0; + } + // relay the data between the two sockets until the end of time ssize_t bytes_received; struct pollfd fds[2]; @@ -380,6 +415,9 @@ void do_statem(struct conn *conn) { fds[0].fd = conn->cltfd; fds[1].fd = conn->srvfd; + fds[0].events |= POLLHUP; + fds[1].events |= POLLHUP; + if (conn->srvbuff_len > 0) { fds[0].events |= POLLOUT; } @@ -396,20 +434,43 @@ void do_statem(struct conn *conn) { ret = poll(fds, 2, 1000); if (fds[1].revents & POLLOUT) { - ret = write_buffer(conn->srvfd, &conn->cltbuff, &conn->cltbuff_len); + ret = write_buffer(conn->srvfd, + &conn->cltbuff, &conn->cltbuff_len); } + if (ret < 0) { + break; + } + if (fds[1].revents & POLLIN) { - ret = read_buffer(conn->srvfd, &conn->srvbuff, &conn->srvbuff_len); + ret = read_buffer(conn->srvfd, + &conn->srvbuff, &conn->srvbuff_len); } + if (ret < 0) { + break; + } + if (fds[0].revents & POLLIN) { - ret = read_buffer(conn->cltfd, &conn->cltbuff, &conn->cltbuff_len); + ret = read_buffer(conn->cltfd, + &conn->cltbuff, &conn->cltbuff_len); } + if (ret < 0) { + break; + } + if (fds[0].revents & POLLOUT) { - ret = write_buffer(conn->cltfd, &conn->srvbuff, &conn->srvbuff_len); + ret = write_buffer(conn->cltfd, + &conn->srvbuff, &conn->srvbuff_len); } + if (ret < 0) { + break; + } + if (fds[0].revents & POLLHUP) { break; } + if (fds[1].revents & POLLHUP) { + break; + } if (ret < 0) { break; } @@ -492,7 +553,8 @@ int do_srv(void) { // request process struct conn *conn = (struct conn *) calloc(1, sizeof(struct conn)); if (!conn) { - fprintf(stderr, "Not enough dynamic memory to establish connection\n"); + fprintf(stderr, "Not enough dynamic memory " + "to establish connection\n"); return -1; }