diff options
5 files changed, 87 insertions, 0 deletions
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<int>(service_type)); return false; } + + LOG4CXX_DEBUG(logger_, + "Add service " << service_type << " for session " + << static_cast<uint32_t>(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<protocol_handler::ServiceType, + helpers::EQ, + helpers::ONE>( + 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 |