summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAKalinich-Luxoft <AKalinich@luxoft.com>2017-12-22 15:30:54 +0200
committerAKalinich-Luxoft <AKalinich@luxoft.com>2018-01-29 09:05:11 +0200
commit68fe0272a2349e0b5d392629c34874a25be99c61 (patch)
treef0d5fcfacacd3ad1b1849ca9ea98590711c76c91
parentdfabf1fa94c897e6ff853a6217f5b6484f6658fd (diff)
downloadsdl_core-68fe0272a2349e0b5d392629c34874a25be99c61.tar.gz
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.
-rw-r--r--src/components/connection_handler/include/connection_handler/connection.h13
-rw-r--r--src/components/connection_handler/include/connection_handler/connection_handler_impl.h10
-rw-r--r--src/components/connection_handler/src/connection.cc36
-rw-r--r--src/components/connection_handler/src/connection_handler_impl.cc18
-rw-r--r--src/components/include/protocol_handler/session_observer.h10
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