From 2999c1973e06f3ad2cc487dac3b83bf3dce3bf72 Mon Sep 17 00:00:00 2001 From: Pin Date: Mon, 21 Feb 2022 00:01:54 -0500 Subject: [PATCH] added listen addr option --- Dockerfile | 11 +++++++++++ Makefile | 4 ++-- cmd/server.c | 30 ++++++++++++++++++++++++------ include/socketHelp.h | 6 ++++-- src/socketHelp.c | 43 +++++++++++++++++++++++++++++++++++++------ 5 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e3bf864 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM ubuntu:latest + +RUN apt-get update && \ + apt-get install -y openssl + +COPY ./bin/seaweb /bin/ +COPY ./certs/cert.pem /etc/ssl/certs/ +COPY ./certs/key.pem /etc/ssl/private/ + +EXPOSE 8080/tcp + diff --git a/Makefile b/Makefile index 26b05dd..b899dc9 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,10 @@ OUTPUT = -o ${OUTPUT_DIR}/PROG INSTALL_OUTPUT = ${OUTPUT_DIR}/PROG build: output_dir - gcc -Wall ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=server} + gcc -Wall ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=seaweb} debug: output_dir - gcc -Wall -g ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=server} + gcc -Wall -g ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=seaweb} install: mv ${INSTALL_OUTPUT:PROG=server} /usr/bin/ diff --git a/cmd/server.c b/cmd/server.c index 1f11c86..069f691 100644 --- a/cmd/server.c +++ b/cmd/server.c @@ -27,7 +27,7 @@ int parseHTTPRequest(char buffer[], struct HTTPRequest *r) { char temp[1]; // Used to check newlines char *token = calloc(8, sizeof(char)); int line = 0; - char *checkLine = calloc(1000, sizeof(char));; + char *checkLine = calloc(1000, sizeof(char)); for (int i = 0; i < strlen(buffer); i++) { temp[0] = buffer[i]; @@ -98,8 +98,14 @@ int main(int argc, char **argv) { int checkerr = 0; // Used for error checking int addrlen = sizeof(address); - char *certFile = malloc(0); - char *privKeyFile = malloc(0); + char *certFile = malloc(1); + char *privKeyFile = malloc(1); + certFile[0] = '\0'; + privKeyFile[0] = '\0'; + + uint32_t listenAddrNum = -1; + char *listenAddr = malloc(1); + listenAddr[0] = '\0'; SSL_CTX *ctx = NULL; @@ -109,6 +115,7 @@ int main(int argc, char **argv) { static const struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"port", required_argument, NULL, 'p'}, + {"listen", required_argument, NULL, 'l'}, {"cert", required_argument, NULL, 'c'}, {"privkey", required_argument, NULL, 'k'}, {"verbose", no_argument, &verbose_flag, 1}, @@ -119,6 +126,7 @@ int main(int argc, char **argv) { "Usage: seaweb [options]\n\n" " -h --help\t\t\tShows this message\n" " -p --port\t\t\tStarts webserver on passed port\n" + " -l --listen\t\t\tDefines what addr to listen on (default 0.0.0.0)\n" " -c --cert\t\t\tPath to certificate\n" " -k --privkey\t\t\tPath to private key\n" "\n" @@ -129,7 +137,7 @@ int main(int argc, char **argv) { int c; while (1) { int option_index = 0; - c = getopt_long(argc, argv, "hp:c:k:", long_options, &option_index); + c = getopt_long(argc, argv, "hp:l:c:k:", long_options, &option_index); if(c == -1) { // Break if no more options are present to parse break; } @@ -140,6 +148,14 @@ int main(int argc, char **argv) { case 'p': sscanf(optarg, "%d", &port); break; + case 'l': + listenAddr = calloc(strlen(optarg), sizeof(char)); + strcpy(listenAddr, optarg); + listenAddrNum = addr2sin_addr(listenAddr); + if (listenAddrNum == -1) { + exit(EXIT_FAILURE); + } + break; case 'c': certFile = calloc(strlen(optarg), sizeof(char)); strcpy(certFile, optarg); @@ -172,13 +188,14 @@ int main(int argc, char **argv) { if ( enableHTTPS == 1 ) { printf("Opening secure socket on port: %d\n", port); - checkerr = createSecureSocket(port, &server_fd, &address, &addrlen, &ctx, certFile, privKeyFile); + checkerr = createSecureSocket(port, &server_fd, &address, &addrlen, listenAddrNum, + &ctx, certFile, privKeyFile); if ( ctx == NULL ) { printf("Error creating ctx\n"); } } else { printf("Opening socket on port: %d\n", port); - checkerr = createSocket(port, &server_fd, &address, &addrlen); + checkerr = createSocket(port, &server_fd, &address, &addrlen, listenAddrNum); } if (checkerr != 0) { @@ -210,6 +227,7 @@ int main(int argc, char **argv) { free(privKeyFile); free(certFile); + free(listenAddr); close(server_fd); exit(EXIT_SUCCESS); } diff --git a/include/socketHelp.h b/include/socketHelp.h index e0c770f..31fb5e6 100644 --- a/include/socketHelp.h +++ b/include/socketHelp.h @@ -2,6 +2,8 @@ #include #include -int createSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen); -int createSecureSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen, SSL_CTX **ctx, char certFile[], char keyFile[]); +uint32_t addr2sin_addr(char *addr); +int createSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen, uint32_t listenAddr); +int createSecureSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen, uint32_t listenAddr, + SSL_CTX **ctx, char certFile[], char keyFile[]); diff --git a/src/socketHelp.c b/src/socketHelp.c index 4b17e74..f44465d 100644 --- a/src/socketHelp.c +++ b/src/socketHelp.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -8,8 +9,33 @@ #include "socketHelp.h" +uint32_t addr2sin_addr(char *addr) { + char *token; + int i = 0; + uint32_t addrNum = 0; + unsigned long addrTempNum = 0; + + token = strtok(addr, "."); + while(token != NULL) { + addrTempNum = strtoul(token, NULL,10); + if ( addrTempNum > 255 ) { + printf("Invalid IP octet: %ld\n", addrTempNum); + + free(token); + return -1; + } + addrNum = addrNum + ( addrTempNum << (8*(3-i)) ); + + token = strtok(NULL, "."); + i++; + } + + free(token); + return addrNum; +} + SSL_CTX* InitServerCTX() { - SSL_METHOD *method; + const SSL_METHOD *method; SSL_CTX *ctx; OpenSSL_add_all_algorithms(); @@ -29,7 +55,7 @@ void LoadCertificates(SSL_CTX* ctx, char* certFile, char* keyFile) { ERR_print_errors_fp(stderr); exit(EXIT_FAILURE); } - // Set local priv key from keyFile + /// Set local priv key from keyFile if ( SSL_CTX_use_PrivateKey_file(ctx, keyFile, SSL_FILETYPE_PEM) <=0 ) { ERR_print_errors_fp(stderr); exit(EXIT_FAILURE); @@ -42,13 +68,14 @@ void LoadCertificates(SSL_CTX* ctx, char* certFile, char* keyFile) { return; } -int createSecureSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen, SSL_CTX **ctx, char certFile[], char keyFile[]) { +int createSecureSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen, uint32_t listenAddr, + SSL_CTX **ctx, char certFile[], char keyFile[]) { SSL_library_init(); *ctx = InitServerCTX(); LoadCertificates(*ctx, certFile, keyFile); - if ( createSocket(port, server_fd, address, addrlen) ) { + if ( createSocket(port, server_fd, address, addrlen, listenAddr) ) { fprintf(stderr, "Error create socket\n"); exit(EXIT_FAILURE); } @@ -56,7 +83,7 @@ int createSecureSocket(int port, int *server_fd, struct sockaddr_in *address, in return 0; } -int createSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen) { +int createSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen, uint32_t listenAddr) { int opt = 1; // Create socket fd @@ -72,7 +99,11 @@ int createSocket(int port, int *server_fd, struct sockaddr_in *address, int *add exit(EXIT_FAILURE); } address->sin_family = AF_INET; - address->sin_addr.s_addr = INADDR_ANY; + if (listenAddr != -1) { // Checking to see if listenAddr is passed + address->sin_addr.s_addr = htonl(listenAddr); + } else { // Default to any addr + address->sin_addr.s_addr = INADDR_ANY; + } address->sin_port = htons (port); // Attach to PORT