diff --git a/.gitignore b/.gitignore index 02ee487..77ed0c9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # additions by alec (tm) build/ connectionStrings.config +*.pem *.kdev4 .kdev4/ .idea/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 9712792..ce53b10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,10 +65,14 @@ else() "src/server/*.h" ) + find_package(OpenSSL) + add_executable(server ${server_src}) target_include_directories(server PRIVATE ${PROJECT_SOURCE_DIR}/src/common - PRIVATE ${PROJECT_SOURCE_DIR}/src/server) + PRIVATE ${PROJECT_SOURCE_DIR}/src/server + PRIVATE ${OPENSSL_INCLUDE_DIR}) + target_link_libraries(server ${OPENSSL_LIBRARIES}) install(TARGETS server RUNTIME DESTINATION bin/server) if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") diff --git a/src/server/common.hpp b/src/server/common.hpp new file mode 100644 index 0000000..3e2c432 --- /dev/null +++ b/src/server/common.hpp @@ -0,0 +1,14 @@ +#ifndef SOSC_SERVER_COMMON_H +#define SOSC_SERVER_COMMON_H + +#include + +#ifdef SOSC_DEBUG +#define SOSC_RESOURCE_PATH (std::string("../resources/client/")) +#else +#define SOSC_RESOURCE_PATH (std::string("resources/")) +#endif + +#define SOSC_RESC(X) (SOSC_RESOURCE_PATH + std::string(X)) + +#endif diff --git a/src/server/sock/tcpsock.hpp b/src/server/sock/tcpsock.hpp index 8ed0484..a073500 100644 --- a/src/server/sock/tcpsock.hpp +++ b/src/server/sock/tcpsock.hpp @@ -31,9 +31,13 @@ #include #include #include +#include #include "utils/net.hpp" #include "utils/string.hpp" +#include +#include + #define SOSC_TCP_BUFLEN 2048 #define SOSC_TCP_APPEND 1 @@ -43,7 +47,7 @@ namespace sosc { class TcpClient { public: TcpClient(); - bool Open(std::string host, uint16_t port); + bool Open(std::string host, uint16_t port, bool secure = false); int Receive(std::string* str, int flags = 0); bool Send(const std::string& str); @@ -60,11 +64,13 @@ public: void Close(); private: - void Open(SOSC_SOCK_T sock, SOSC_ADDR_T addr, int addr_len); + void Open(SOSC_SOCK_T sock, SOSC_ADDR_T addr, + int addr_len, bool secure = false); void SetBlocking(bool will_block); SOSC_SOCK_T sock; bool sock_open; + SSL* ssl; net::IpAddress ip; SOSC_ADDR_T addr; @@ -78,7 +84,7 @@ private: class TcpServer { public: TcpServer(); - bool Listen(uint16_t port); + bool Listen(uint16_t port, bool secure = false); bool Accept(TcpClient* client); @@ -86,6 +92,7 @@ public: private: SOSC_SOCK_T sock; bool sock_open; + bool secure; }; } diff --git a/src/server/sock/tcpsock_bsd.cpp b/src/server/sock/tcpsock_bsd.cpp index ac87fbb..0f40fb1 100644 --- a/src/server/sock/tcpsock_bsd.cpp +++ b/src/server/sock/tcpsock_bsd.cpp @@ -1,6 +1,32 @@ #include "tcpsock.hpp" + #ifndef _WIN32 +static struct { + SSL_CTX* ssl_server; + SSL_CTX* ssl_client; + std::mutex ssl_mtx; +} _ssl_ctx; + +static bool ssl_init() { + static bool is_inited = false; + if(is_inited) return true; + + SSL_load_error_strings(); + OpenSSL_add_ssl_algorithms(); + + _ssl_ctx.ssl_server = SSL_CTX_new(SSLv23_server_method()); + if(!_ssl_ctx.ssl_server) + return false; + + _ssl_ctx.ssl_client = SSL_CTX_new(SSLv23_client_method()); + if(!_ssl_ctx.ssl_client) + return false; + + is_inited = true; + return true; +} + /****************************/ /* BEGIN TCPCLIENT CODE */ /****************************/ @@ -10,7 +36,7 @@ sosc::TcpClient::TcpClient() { this->addr_len = -1; } -bool sosc::TcpClient::Open(std::string host, std::uint16_t port) { +bool sosc::TcpClient::Open(std::string host, std::uint16_t port, bool secure) { if(this->sock_open) return false; @@ -164,7 +190,9 @@ sosc::TcpServer::TcpServer() { this->sock_open = false; } -bool sosc::TcpServer::Listen(uint16_t port) { +bool sosc::TcpServer::Listen(uint16_t port, bool secure) { + if(secure && !ssl_init()) + return false; if(this->sock_open) return false; @@ -197,8 +225,9 @@ bool sosc::TcpServer::Listen(uint16_t port) { close(this->sock); return false; } - + this->sock_open = true; + this->secure = secure; return true; } @@ -217,7 +246,7 @@ bool sosc::TcpServer::Accept(TcpClient* client) { } client->Close(); - client->Open(sock, addr, addr_len); + client->Open(sock, addr, addr_len, this->secure); return true; }