diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/docs/udm.conf.sample | 1 | ||||
-rw-r--r-- | server/include/server_session.h | 1 | ||||
-rw-r--r-- | server/include/utilities.h | 2 | ||||
-rw-r--r-- | server/src/main.cpp | 5 | ||||
-rw-r--r-- | server/src/server_session.cpp | 59 | ||||
-rw-r--r-- | server/src/utilities.cpp | 22 | ||||
-rw-r--r-- | server/udm-server.cbp | 3 |
7 files changed, 92 insertions, 1 deletions
diff --git a/server/docs/udm.conf.sample b/server/docs/udm.conf.sample index 0739aa5..47a5642 100644 --- a/server/docs/udm.conf.sample +++ b/server/docs/udm.conf.sample @@ -3,6 +3,7 @@ server ;section for core server settings { ;port 6613; server port + ;password "client_passwod"; client password to connect ;default_download_directory ~/udm_downloads ; default directory to store downloads ;default_metadata_module flat_files_metadata ; first loaded metadata module used by default if not set ;default_data_storage_module <not set> ; first loaded data_storage module used by default if not set diff --git a/server/include/server_session.h b/server/include/server_session.h index 330e0a9..b3b6f26 100644 --- a/server/include/server_session.h +++ b/server/include/server_session.h @@ -49,6 +49,7 @@ class server_session socket_wraper *socket_; boost::asio::io_service &io_service_; boost::asio::ssl::context *context_; + std::string client_auth_token; }; diff --git a/server/include/utilities.h b/server/include/utilities.h index 9becc48..0130cf5 100644 --- a/server/include/utilities.h +++ b/server/include/utilities.h @@ -31,6 +31,8 @@ class server_msg; std::shared_ptr<char*> pack_msg(server_msg *msg, int *size); +std::string random_string(int length); +std::string generate_auth_token(); diff --git a/server/src/main.cpp b/server/src/main.cpp index 3d3d0c4..30126fa 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -21,6 +21,7 @@ #include <boost/filesystem.hpp> #include <boost/asio.hpp> #include <iostream> +#include <map> #include "api_module_metadata_storage.h" #include "modules_handler.h" @@ -28,6 +29,7 @@ #include "server.h" #include "main.h" #include "config.h" +#include "client.h" core_api *module_api = nullptr; @@ -36,6 +38,7 @@ modules_handler *modules = nullptr; namespace bpo = boost::program_options; +std::map<std::string, client> clients; //auth token used for key runtime_config_s runtime_config; @@ -177,7 +180,7 @@ int main(int argc, char *argv[]) { //TODO: } - //TODO: run in separate thread + //TODO: run in separate thread ? boost::system::error_code ec; io_service_server.run(ec); if(ec) diff --git a/server/src/server_session.cpp b/server/src/server_session.cpp index 234f130..3b8c3b1 100644 --- a/server/src/server_session.cpp +++ b/server/src/server_session.cpp @@ -121,6 +121,65 @@ void server_session::handle_command(client_msg *msg) { switch(msg->type()) { + case CLIENT_MSG_TYPE::CLIENT_AUTH_REQUEST: + { + server_msg m; + m.set_type(SERVER_MSG_TYPE::SERVER_AUTH_REPLY); + //TODO: check for already existing auth token + std::string server_password = runtime_config.config_file.get<std::string>("server.password", ""); + if(server_password.empty()) + m.mutable_auth_reply()->set_status(true); + else + { + switch(msg->auth_info().hash_type()) + { + case PASSWD_HASH_TYPE::HASH_NONE: + { + if(msg->auth_info().password() != server_password) + { + m.mutable_auth_reply()->set_status(false); + m.mutable_auth_reply()->set_error_description("wrong password"); + } + else + m.mutable_auth_reply()->set_status(true); + } + break; + case PASSWD_HASH_TYPE::HASH_MD5: + { + //TODO: + } + break; + case PASSWD_HASH_TYPE::HASH_SHA2: + { + //TODO: + } + break; + case PASSWD_HASH_TYPE::HASH_SHA512: + { + unsigned char hash[64]; + SHA512((unsigned char*)server_password.c_str(), server_password.length(), hash); + if(msg->auth_info().password() != std::string((const char*)hash)) + { + m.mutable_auth_reply()->set_status(false); + m.mutable_auth_reply()->set_error_description("wrong password"); + } + else + m.mutable_auth_reply()->set_status(true); + } + break; + default: + break; + } + } + if(m.auth_reply().status() == true) + { + client_auth_token = generate_auth_token(); + m.mutable_auth_reply()->set_auth_token(client_auth_token); + //set auth token + } + send_message(&m); + } + break; default: break; } diff --git a/server/src/utilities.cpp b/server/src/utilities.cpp index ab10e30..c8510c9 100644 --- a/server/src/utilities.cpp +++ b/server/src/utilities.cpp @@ -20,6 +20,10 @@ #include <boost/log/trivial.hpp> +#include <boost/random.hpp> +#include <boost/nondet_random.hpp> + + #include "utilities.h" #include "../../protocol/udm.pb.h" @@ -56,3 +60,21 @@ std::shared_ptr<char*> pack_msg(server_msg *msg, int *size_) msg->SerializeToString(&msg_buf); return pack_data(msg_buf, size_); } + +std::string random_string(int length) +{ + BOOST_LOG_TRIVIAL(debug)<<__FILE__<<":"<<__LINE__<<"\t"<<__func__; + std::string chars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"); + std::string data; + boost::random_device rng; + boost::variate_generator<boost::random_device&, boost::uniform_int<>> gen(rng, boost::uniform_int<>(0, (int)chars.length()-1)); + for(int i = 0; i < length; ++i) + data += chars[gen()]; + return data; +} + +std::string generate_auth_token() +{ + return random_string(64); +} + diff --git a/server/udm-server.cbp b/server/udm-server.cbp index 1d976d6..159c144 100644 --- a/server/udm-server.cbp +++ b/server/udm-server.cbp @@ -47,6 +47,7 @@ <Add library="pthread" /> <Add library="crypto" /> <Add library="ssl" /> + <Add library="boost_random" /> </Linker> <ExtraCommands> <Add before="[ -d ../protocol ] || mkdir ../protocol" /> @@ -58,6 +59,7 @@ <Unit filename="include/api_module_base.h" /> <Unit filename="include/api_module_downloader.h" /> <Unit filename="include/api_module_metadata_storage.h" /> + <Unit filename="include/client.h" /> <Unit filename="include/config.h" /> <Unit filename="include/main.h" /> <Unit filename="include/modules_handler.h" /> @@ -67,6 +69,7 @@ <Unit filename="include/socket_wraper.h" /> <Unit filename="include/utilities.h" /> <Unit filename="src/api_core.cpp" /> + <Unit filename="src/client.cpp" /> <Unit filename="src/main.cpp" /> <Unit filename="src/modules_handler.cpp" /> <Unit filename="src/protocol.cpp" /> |