From 68fe0272a2349e0b5d392629c34874a25be99c61 Mon Sep 17 00:00:00 2001 From: AKalinich-Luxoft Date: Fri, 22 Dec 2017 15:30:54 +0200 Subject: Updates in connection and handler Connection and its handler were extended with function IsSessionServiceExists to check is specified service exists in session. This function is needed for ProtocolHandler. Also there was added check for session protocol version when starting a new service. --- .../include/connection_handler/connection.h | 13 ++++++++ .../connection_handler/connection_handler_impl.h | 10 ++++++ .../connection_handler/src/connection.cc | 36 ++++++++++++++++++++++ .../src/connection_handler_impl.cc | 18 +++++++++++ .../include/protocol_handler/session_observer.h | 10 ++++++ 5 files changed, 87 insertions(+) diff --git a/src/components/connection_handler/include/connection_handler/connection.h b/src/components/connection_handler/include/connection_handler/connection.h index bd5858c4cd..aef1c92f1e 100644 --- a/src/components/connection_handler/include/connection_handler/connection.h +++ b/src/components/connection_handler/include/connection_handler/connection.h @@ -76,8 +76,10 @@ struct Service { Service() : service_type(protocol_handler::kInvalidServiceType) , is_protected_(false) {} + explicit Service(protocol_handler::ServiceType service_type) : service_type(service_type), is_protected_(false) {} + bool operator==(const protocol_handler::ServiceType service_type) const { return this->service_type == service_type; } @@ -209,6 +211,17 @@ class Connection { */ void SetProtectionFlag(const uint8_t session_id, const protocol_handler::ServiceType& service_type); + + /** + * @brief Check if session contains service with specified service type + * @param session_id id of session to check + * @param service_type type of service to check + * @return true if session contains service with specified service type + */ + bool IsSessionServiceExists( + const uint8_t session_id, + const protocol_handler::ServiceType& service_type); + #endif // ENABLE_SECURITY /** * @brief Returns map of sessions which have been opened in diff --git a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h index ca5ffe1cc8..3d5c5900f2 100644 --- a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h +++ b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h @@ -350,6 +350,16 @@ class ConnectionHandlerImpl const uint32_t& key, const protocol_handler::ServiceType& service_type) OVERRIDE; + /** + * @brief Check if session contains service with specified service type + * @param connection_key unique id of session to check + * @param service_type type of service to check + * @return true if session contains service with specified service type + */ + bool IsSessionServiceExists( + const uint32_t connection_key, + const protocol_handler::ServiceType& service_type) OVERRIDE; + security_manager::SSLContext::HandshakeContext GetHandshakeContext( uint32_t key) const OVERRIDE; #endif // ENABLE_SECURITY diff --git a/src/components/connection_handler/src/connection.cc b/src/components/connection_handler/src/connection.cc index 202736e612..2c8b781b13 100644 --- a/src/components/connection_handler/src/connection.cc +++ b/src/components/connection_handler/src/connection.cc @@ -39,6 +39,7 @@ #include "protocol_handler/protocol_packet.h" #include "utils/logger.h" #include "utils/macro.h" +#include "utils/helpers.h" #ifdef ENABLE_SECURITY #include "security_manager/ssl_context.h" @@ -148,6 +149,10 @@ bool Connection::AddNewService(uint8_t session_id, LOG4CXX_WARN(logger_, "Wrong service " << static_cast(service_type)); return false; } + + LOG4CXX_DEBUG(logger_, + "Add service " << service_type << " for session " + << static_cast(session_id)); sync_primitives::AutoLock lock(session_map_lock_); SessionMap::iterator session_it = session_map_.find(session_id); @@ -156,6 +161,20 @@ bool Connection::AddNewService(uint8_t session_id, return false; } Session& session = session_it->second; + + if (session.protocol_version <= protocol_handler::PROTOCOL_VERSION_2 && + helpers::Compare( + service_type, + protocol_handler::ServiceType::kAudio, + protocol_handler::ServiceType::kMobileNav)) { + LOG4CXX_WARN(logger_, + "Audio and video services are disallowed for protocol version " + "2 or lower"); + return false; + } + Service* service = session.FindService(service_type); // if service already exists if (service) { @@ -294,6 +313,23 @@ void Connection::SetProtectionFlag( service_rpc->is_protected_ = true; } } + +bool Connection::IsSessionServiceExists( + const uint8_t session_id, + const protocol_handler::ServiceType& service_type) { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(session_map_lock_); + + SessionMap::iterator session_it = session_map_.find(session_id); + if (session_it == session_map_.end()) { + LOG4CXX_WARN(logger_, "Session not found in this connection!"); + return false; + } + + Session& session = session_it->second; + return session.FindService(service_type); +} + #endif // ENABLE_SECURITY ConnectionHandle Connection::connection_handle() const { diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index b5d0857514..53d2449ede 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -875,6 +875,24 @@ void ConnectionHandlerImpl::SetProtectionFlag( connection.SetProtectionFlag(session_id, service_type); } +bool ConnectionHandlerImpl::IsSessionServiceExists( + const uint32_t connection_key, + const protocol_handler::ServiceType& service_type) { + LOG4CXX_AUTO_TRACE(logger_); + transport_manager::ConnectionUID connection_handle = 0; + uint8_t session_id = 0; + PairFromKey(connection_key, &connection_handle, &session_id); + + sync_primitives::AutoReadLock lock(connection_list_lock_); + ConnectionList::iterator it = connection_list_.find(connection_handle); + if (connection_list_.end() == it) { + LOG4CXX_ERROR(logger_, "Unknown connection!"); + return false; + } + Connection& connection = *it->second; + return connection.IsSessionServiceExists(session_id, service_type); +} + security_manager::SSLContext::HandshakeContext ConnectionHandlerImpl::GetHandshakeContext(uint32_t key) const { return connection_handler_observer_->GetHandshakeContext(key); diff --git a/src/components/include/protocol_handler/session_observer.h b/src/components/include/protocol_handler/session_observer.h index 6cc0927639..6b16ba1c0f 100644 --- a/src/components/include/protocol_handler/session_observer.h +++ b/src/components/include/protocol_handler/session_observer.h @@ -327,6 +327,16 @@ class SessionObserver { const uint32_t& key, const protocol_handler::ServiceType& service_type) = 0; + /** + * @brief Check if session contains service with specified service type + * @param connection_key unique id of session to check + * @param service_type type of service to check + * @return true if session contains service with specified service type + */ + virtual bool IsSessionServiceExists( + const uint32_t connection_key, + const protocol_handler::ServiceType& service_type) = 0; + virtual security_manager::SSLContext::HandshakeContext GetHandshakeContext( uint32_t key) const = 0; #endif // ENABLE_SECURITY -- cgit v1.2.1