added listen addr option
This commit is contained in:
11
Dockerfile
Normal file
11
Dockerfile
Normal 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
|
||||||
|
|
||||||
4
Makefile
4
Makefile
@@ -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/
|
||||||
|
|||||||
30
cmd/server.c
30
cmd/server.c
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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[]);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
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);
|
address->sin_port = htons (port);
|
||||||
|
|
||||||
// Attach to PORT
|
// Attach to PORT
|
||||||
|
|||||||
Reference in New Issue
Block a user