diff --git a/services/tunnelbroker/docker-server/contents/server/src/Service/TunnelbrokerServiceImpl.cpp b/services/tunnelbroker/docker-server/contents/server/src/Service/TunnelbrokerServiceImpl.cpp --- a/services/tunnelbroker/docker-server/contents/server/src/Service/TunnelbrokerServiceImpl.cpp +++ b/services/tunnelbroker/docker-server/contents/server/src/Service/TunnelbrokerServiceImpl.cpp @@ -7,12 +7,6 @@ #include "DatabaseManager.h" #include "DeliveryBroker.h" #include "Tools.h" - -#include -#include -#include -#include - namespace comm { namespace network { @@ -77,18 +71,19 @@ } const std::string signature = request->signature(); const std::string publicKey = request->publickey(); - const boost::uuids::uuid uuid = boost::uuids::random_generator()(); - const std::string newSessionID = boost::lexical_cast(uuid); - + std::string newSessionID; try { - deviceSessionItem = - database::DatabaseManager::getInstance().findSessionItem(newSessionID); - if (deviceSessionItem != nullptr) { - std::cout << "gRPC: " - << "Session unique ID " << newSessionID << " already used" + while (true) { + newSessionID = generateUUID(); + deviceSessionItem = + database::DatabaseManager::getInstance().findSessionItem( + newSessionID); + if (deviceSessionItem == nullptr) { + break; + } + std::cout << "gRPC Warning: " + << "Session unique ID collision for " << newSessionID << std::endl; - return grpc::Status( - grpc::StatusCode::INTERNAL, "Session unique ID already used"); } sessionSignItem = database::DatabaseManager::getInstance().findSessionSignItem(deviceID); diff --git a/services/tunnelbroker/docker-server/contents/server/src/Tools/Tools.h b/services/tunnelbroker/docker-server/contents/server/src/Tools/Tools.h --- a/services/tunnelbroker/docker-server/contents/server/src/Tools/Tools.h +++ b/services/tunnelbroker/docker-server/contents/server/src/Tools/Tools.h @@ -9,6 +9,7 @@ std::string generateRandomString(std::size_t length); long long getCurrentTimestamp(); bool validateDeviceID(std::string deviceID); +std::string generateUUID(); } // namespace network } // namespace comm diff --git a/services/tunnelbroker/docker-server/contents/server/src/Tools/Tools.cpp b/services/tunnelbroker/docker-server/contents/server/src/Tools/Tools.cpp --- a/services/tunnelbroker/docker-server/contents/server/src/Tools/Tools.cpp +++ b/services/tunnelbroker/docker-server/contents/server/src/Tools/Tools.cpp @@ -2,8 +2,14 @@ #include "ConfigManager.h" #include "Constants.h" +#include +#include +#include +#include + #include #include +#include #include namespace comm { @@ -12,8 +18,7 @@ std::string generateRandomString(std::size_t length) { const std::string CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - std::random_device random_device; - std::mt19937 generator(random_device()); + thread_local std::random_device generator; std::uniform_int_distribution<> distribution(0, CHARACTERS.size() - 1); std::string random_string; for (std::size_t i = 0; i < length; ++i) { @@ -46,5 +51,10 @@ } } +std::string generateUUID() { + thread_local boost::uuids::random_generator random_generator; + return boost::uuids::to_string(random_generator()); +} + } // namespace network } // namespace comm