diff options
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/api_core.cpp | 1 | ||||
-rw-r--r-- | server/src/main.cpp | 10 | ||||
-rw-r--r-- | server/src/modules_handler.cpp | 6 | ||||
-rw-r--r-- | server/src/server.cpp | 19 | ||||
-rw-r--r-- | server/src/server_session.cpp | 44 |
5 files changed, 65 insertions, 15 deletions
diff --git a/server/src/api_core.cpp b/server/src/api_core.cpp index c8f0032..66df614 100644 --- a/server/src/api_core.cpp +++ b/server/src/api_core.cpp @@ -23,6 +23,7 @@ #include "main.h" #include "api_module_base.h" #include <boost/foreach.hpp> +#include "config.h" extern runtime_config_s runtime_config; diff --git a/server/src/main.cpp b/server/src/main.cpp index a876b42..efbd92b 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -27,7 +27,7 @@ #include "utilities.h" #include "server.h" #include "main.h" - +#include "config.h" core_api *module_api = nullptr; @@ -76,9 +76,13 @@ int main(int argc, char *argv[]) else std::cerr<<"failed to load config: \"" + config_path + "\", file does not exists or is not regular file\n"; } + //load all config variables here + runtime_config.settings.verbosity = runtime_config.config_file.get<short>("server.verbosity", 0); + daemon = runtime_config.config_file.get<bool>("server.daemon", false); + //override config from command line here if(vm.count("verbosity")) { - runtime_config.verbosity = vm["verbosity"].as<short>(); + runtime_config.settings.verbosity = vm["verbosity"].as<short>(); } if(vm.count("help")) @@ -129,7 +133,7 @@ int main(int argc, char *argv[]) modules->load_modules(); } - std::string default_metadata_module_name = runtime_config.config_file.get<std::string>("default_metadata_module", ""); + std::string default_metadata_module_name = runtime_config.config_file.get<std::string>("server.default_metadata_module", ""); if(default_metadata_module_name == "") { if(!modules->get_metadata_modules().empty()) diff --git a/server/src/modules_handler.cpp b/server/src/modules_handler.cpp index 818539b..d69fabf 100644 --- a/server/src/modules_handler.cpp +++ b/server/src/modules_handler.cpp @@ -30,11 +30,9 @@ +#include "config.h" - -namespace bpt = boost::property_tree; - extern runtime_config_s runtime_config; @@ -131,7 +129,7 @@ std::string modules_handler::list_modules_single_type_internal(const std::list<m buf += (*i)->get_module_info().name; buf += "\n\tDescription: " +(*i)->get_module_info().description; buf += "\n\tVersion: " + (*i)->get_module_info().version; - if(runtime_config.verbosity >= 1) + if(runtime_config.settings.verbosity >= 1) { buf += "\n\tAvailable options:"; for(auto i1 = (*i)->get_module_info().default_settings.begin(), end = (*i)->get_module_info().default_settings.end(); i1 != end; ++i1) diff --git a/server/src/server.cpp b/server/src/server.cpp index 2436fda..818cc10 100644 --- a/server/src/server.cpp +++ b/server/src/server.cpp @@ -24,20 +24,37 @@ #include "server.h" #include "server_session.h" #include "utilities.h" +#include "config.h" #include "../../protocol/udm.pb.h" +#include "socket_wraper.h" + +extern runtime_config_s runtime_config; server::server(boost::asio::io_service& io_service, short port) : io_service_(io_service), acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)) { + if(runtime_config.config_file.get<bool>("server.enable_encryption", false)) + { + //TODO: validate encryption files path's + context_ = new boost::asio::ssl::context(boost::asio::ssl::context::tlsv12_server); + context_->set_options(boost::asio::ssl::context::single_dh_use); + //context_.set_password_callback(boost::bind(&server::get_password, this)); //TODO: add password support + context_->use_certificate_chain_file(runtime_config.config_file.get<std::string>("ssl_certificate", "")); //must be set + context_->use_private_key_file(runtime_config.config_file.get<std::string>("ssl_key", ""), boost::asio::ssl::context::pem); //must be set + context_->use_tmp_dh_file(runtime_config.config_file.get<std::string>("ssl_dh", "")); //must be set + } start_accept(); } void server::start_accept() { server_session* new_session = new server_session(io_service_); - acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error)); + if(runtime_config.config_file.get<bool>("server.enable_encryption", false)) + acceptor_.async_accept(new_session->socket()->get_ssl_socket().lowest_layer(), boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error)); + else + acceptor_.async_accept(new_session->socket()->get_socket(), boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error)); } void server::handle_accept(server_session* new_session, const boost::system::error_code& error) diff --git a/server/src/server_session.cpp b/server/src/server_session.cpp index 3fc3fb4..234f130 100644 --- a/server/src/server_session.cpp +++ b/server/src/server_session.cpp @@ -24,11 +24,19 @@ #include "server_session.h" #include "../../protocol/udm.pb.h" #include "utilities.h" +#include "config.h" +#include "socket_wraper.h" -server_session::server_session(boost::asio::io_service &s) : socket_(s) +extern runtime_config_s runtime_config; + + + + +server_session::server_session(boost::asio::io_service &s, boost::asio::ssl::context *c) : io_service_(s), context_(c) { } -boost::asio::ip::tcp::socket& server_session::socket() + +socket_wraper* server_session::socket() { return socket_; } @@ -36,11 +44,33 @@ boost::asio::ip::tcp::socket& server_session::socket() void server_session::run() { - recv_data_ = new char[4]; - boost::asio::async_read(socket_, boost::asio::buffer(recv_data_, 4), boost::bind(&server_session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + if(runtime_config.config_file.get<bool>("server.enable_encryption", false)) + { + socket_ = new socket_wraper(new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(io_service_, *context_)); + socket_->get_ssl_socket().async_handshake(boost::asio::ssl::stream_base::server, boost::bind(&server_session::handle_handshake, this, boost::asio::placeholders::error)); + } + else + { + socket_ = new socket_wraper(new boost::asio::ip::tcp::socket(io_service_)); + recv_data_ = new char[4]; + boost::asio::async_read(*socket_, boost::asio::buffer(recv_data_, 4), boost::bind(&server_session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + } +} +void server_session::handle_handshake(const boost::system::error_code& error) +{ + if (!error) + { + recv_data_ = new char[4]; + boost::asio::async_read(*socket_, boost::asio::buffer(recv_data_, 4), boost::bind(&server_session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + } + else + { + delete this; + } } + void server_session::handle_read(const boost::system::error_code& error, size_t bytes_transferred) { if (!error) @@ -51,7 +81,7 @@ void server_session::handle_read(const boost::system::error_code& error, size_t delete [] recv_data_; char *buf = new char[size]; boost::system::error_code ec; - socket_.read_some(boost::asio::buffer(buf, size), ec); + boost::asio::read(*socket_, boost::asio::buffer(buf, size), ec); if(ec) { @@ -71,7 +101,7 @@ void server_session::handle_read(const boost::system::error_code& error, size_t //parsed = true; handle_command(&msg); recv_data_ = new char[4]; - boost::asio::async_read(socket_, boost::asio::buffer(recv_data_, 4), boost::bind(&server_session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + boost::asio::async_read(*socket_, boost::asio::buffer(recv_data_, 4), boost::bind(&server_session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } // if(!parsed) else @@ -100,7 +130,7 @@ void server_session::send_message(server_msg *msg) { int size = 0; std::shared_ptr<char*> ptr = pack_msg(msg, &size); - boost::asio::async_write(socket_, boost::asio::buffer(*ptr, size), boost::bind(&server_session::handle_write, this, boost::asio::placeholders::error)); + boost::asio::async_write(*socket_, boost::asio::buffer(*ptr, size), boost::bind(&server_session::handle_write, this, boost::asio::placeholders::error)); } void server_session::handle_write(const boost::system::error_code& error) |