added listen addr option

This commit is contained in:
Pin
2022-02-21 00:01:54 -05:00
parent 1c083b90f8
commit 2999c1973e
5 changed files with 78 additions and 16 deletions

11
Dockerfile Normal file
View File

@@ -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

View File

@@ -5,10 +5,10 @@ OUTPUT = -o ${OUTPUT_DIR}/PROG
INSTALL_OUTPUT = ${OUTPUT_DIR}/PROG INSTALL_OUTPUT = ${OUTPUT_DIR}/PROG
build: output_dir build: output_dir
gcc -Wall ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=server} gcc -Wall ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=seaweb}
debug: output_dir debug: output_dir
gcc -Wall -g ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=server} gcc -Wall -g ${LIBRARIES} ${SOURCES} ${OUTPUT:PROG=seaweb}
install: install:
mv ${INSTALL_OUTPUT:PROG=server} /usr/bin/ mv ${INSTALL_OUTPUT:PROG=server} /usr/bin/

View File

@@ -27,7 +27,7 @@ int parseHTTPRequest(char buffer[], struct HTTPRequest *r) {
char temp[1]; // Used to check newlines char temp[1]; // Used to check newlines
char *token = calloc(8, sizeof(char)); char *token = calloc(8, sizeof(char));
int line = 0; int line = 0;
char *checkLine = calloc(1000, sizeof(char));; char *checkLine = calloc(1000, sizeof(char));
for (int i = 0; i < strlen(buffer); i++) { for (int i = 0; i < strlen(buffer); i++) {
temp[0] = buffer[i]; temp[0] = buffer[i];
@@ -98,8 +98,14 @@ int main(int argc, char **argv) {
int checkerr = 0; // Used for error checking int checkerr = 0; // Used for error checking
int addrlen = sizeof(address); int addrlen = sizeof(address);
char *certFile = malloc(0); char *certFile = malloc(1);
char *privKeyFile = malloc(0); 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; SSL_CTX *ctx = NULL;
@@ -109,6 +115,7 @@ int main(int argc, char **argv) {
static const struct option long_options[] = { static const struct option long_options[] = {
{"help", no_argument, NULL, 'h'}, {"help", no_argument, NULL, 'h'},
{"port", required_argument, NULL, 'p'}, {"port", required_argument, NULL, 'p'},
{"listen", required_argument, NULL, 'l'},
{"cert", required_argument, NULL, 'c'}, {"cert", required_argument, NULL, 'c'},
{"privkey", required_argument, NULL, 'k'}, {"privkey", required_argument, NULL, 'k'},
{"verbose", no_argument, &verbose_flag, 1}, {"verbose", no_argument, &verbose_flag, 1},
@@ -119,6 +126,7 @@ int main(int argc, char **argv) {
"Usage: seaweb [options]\n\n" "Usage: seaweb [options]\n\n"
" -h --help\t\t\tShows this message\n" " -h --help\t\t\tShows this message\n"
" -p --port\t\t\tStarts webserver on passed port\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" " -c --cert\t\t\tPath to certificate\n"
" -k --privkey\t\t\tPath to private key\n" " -k --privkey\t\t\tPath to private key\n"
"\n" "\n"
@@ -129,7 +137,7 @@ int main(int argc, char **argv) {
int c; int c;
while (1) { while (1) {
int option_index = 0; 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 if(c == -1) { // Break if no more options are present to parse
break; break;
} }
@@ -140,6 +148,14 @@ int main(int argc, char **argv) {
case 'p': case 'p':
sscanf(optarg, "%d", &port); sscanf(optarg, "%d", &port);
break; 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': case 'c':
certFile = calloc(strlen(optarg), sizeof(char)); certFile = calloc(strlen(optarg), sizeof(char));
strcpy(certFile, optarg); strcpy(certFile, optarg);
@@ -172,13 +188,14 @@ int main(int argc, char **argv) {
if ( enableHTTPS == 1 ) { if ( enableHTTPS == 1 ) {
printf("Opening secure socket on port: %d\n", port); 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 ) { if ( ctx == NULL ) {
printf("Error creating ctx\n"); printf("Error creating ctx\n");
} }
} else { } else {
printf("Opening socket on port: %d\n", port); 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) { if (checkerr != 0) {
@@ -210,6 +227,7 @@ int main(int argc, char **argv) {
free(privKeyFile); free(privKeyFile);
free(certFile); free(certFile);
free(listenAddr);
close(server_fd); close(server_fd);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }

View File

@@ -2,6 +2,8 @@
#include <netinet/in.h> #include <netinet/in.h>
#include <openssl/ssl.h> #include <openssl/ssl.h>
int createSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen); uint32_t addr2sin_addr(char *addr);
int createSecureSocket(int port, int *server_fd, struct sockaddr_in *address, int *addrlen, SSL_CTX **ctx, char certFile[], char keyFile[]); 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[]);

View File

@@ -1,5 +1,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <netinet/in.h> #include <netinet/in.h>
@@ -8,8 +9,33 @@
#include "socketHelp.h" #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_CTX* InitServerCTX() {
SSL_METHOD *method; const SSL_METHOD *method;
SSL_CTX *ctx; SSL_CTX *ctx;
OpenSSL_add_all_algorithms(); OpenSSL_add_all_algorithms();
@@ -29,7 +55,7 @@ void LoadCertificates(SSL_CTX* ctx, char* certFile, char* keyFile) {
ERR_print_errors_fp(stderr); ERR_print_errors_fp(stderr);
exit(EXIT_FAILURE); 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 ) { if ( SSL_CTX_use_PrivateKey_file(ctx, keyFile, SSL_FILETYPE_PEM) <=0 ) {
ERR_print_errors_fp(stderr); ERR_print_errors_fp(stderr);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@@ -42,13 +68,14 @@ void LoadCertificates(SSL_CTX* ctx, char* certFile, char* keyFile) {
return; 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(); SSL_library_init();
*ctx = InitServerCTX(); *ctx = InitServerCTX();
LoadCertificates(*ctx, certFile, keyFile); 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"); fprintf(stderr, "Error create socket\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -56,7 +83,7 @@ int createSecureSocket(int port, int *server_fd, struct sockaddr_in *address, in
return 0; 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; int opt = 1;
// Create socket fd // Create socket fd
@@ -72,7 +99,11 @@ int createSocket(int port, int *server_fd, struct sockaddr_in *address, int *add
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
address->sin_family = AF_INET; address->sin_family = AF_INET;
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_addr.s_addr = INADDR_ANY;
}
address->sin_port = htons (port); address->sin_port = htons (port);
// Attach to PORT // Attach to PORT