summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacobkeeler <jacob.keeler@livioradio.com>2019-03-12 14:53:41 -0400
committerjacobkeeler <jacob.keeler@livioradio.com>2019-03-12 14:53:41 -0400
commit24b9d518cac5e0a5543e467f7b368c3e62d21028 (patch)
tree9bc7777bc1e82d919398700bf13198cf5b55f167
parentdbd96397d3c0ab94571868b084c0f66e3e4a3d7e (diff)
parenta3084a207c4593d38502e57531105846267057a1 (diff)
downloadsdl_core-24b9d518cac5e0a5543e467f7b368c3e62d21028.tar.gz
Merge branch 'develop' into fix/unknown_enum_values
# Conflicts: # src/components/application_manager/src/rpc_handler_impl.cc
-rw-r--r--src/components/application_manager/include/application_manager/rpc_handler_impl.h8
-rw-r--r--src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/mobile/on_app_service_data_notification_from_mobile.cc2
-rw-r--r--src/components/application_manager/src/rpc_handler_impl.cc36
-rw-r--r--src/components/application_manager/src/rpc_passing_handler.cc36
-rw-r--r--src/components/include/application_manager/rpc_handler.h5
5 files changed, 74 insertions, 13 deletions
diff --git a/src/components/application_manager/include/application_manager/rpc_handler_impl.h b/src/components/application_manager/include/application_manager/rpc_handler_impl.h
index b7e74c5ab3..489bcd21fd 100644
--- a/src/components/application_manager/include/application_manager/rpc_handler_impl.h
+++ b/src/components/application_manager/include/application_manager/rpc_handler_impl.h
@@ -154,12 +154,18 @@ class RPCHandlerImpl : public RPCHandler,
ns_smart_device_link::ns_smart_objects::SmartObject& output,
utils::SemanticVersion& message_version);
+ bool ValidateRpcSO(smart_objects::SmartObject* message,
+ utils::SemanticVersion& msg_version,
+ rpc::ValidationReport& report_out,
+ bool remove_unknown_params) OVERRIDE;
+
private:
void ProcessMessageFromMobile(const std::shared_ptr<Message> message);
void ProcessMessageFromHMI(const std::shared_ptr<Message> message);
bool ConvertMessageToSO(const Message& message,
smart_objects::SmartObject& output,
- const bool remove_unknown_parameters = true);
+ const bool remove_unknown_parameters = true,
+ const bool validate_params = true);
std::shared_ptr<Message> ConvertRawMsgToMessage(
const ::protocol_handler::RawMessagePtr message);
hmi_apis::HMI_API& hmi_so_factory();
diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/mobile/on_app_service_data_notification_from_mobile.cc b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/mobile/on_app_service_data_notification_from_mobile.cc
index 1328e128d4..7bb62d298d 100644
--- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/mobile/on_app_service_data_notification_from_mobile.cc
+++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/mobile/on_app_service_data_notification_from_mobile.cc
@@ -61,7 +61,7 @@ void OnAppServiceDataNotificationFromMobile::Run() {
MessageHelper::PrintSmartObject(*message_);
std::string service_type =
- (*message_)[strings::msg_params][strings::app_service_manifest]
+ (*message_)[strings::msg_params][strings::service_data]
[strings::service_type].asString();
ApplicationSharedPtr app = application_manager_.application(connection_key());
diff --git a/src/components/application_manager/src/rpc_handler_impl.cc b/src/components/application_manager/src/rpc_handler_impl.cc
index 449ff0eceb..8911e746a6 100644
--- a/src/components/application_manager/src/rpc_handler_impl.cc
+++ b/src/components/application_manager/src/rpc_handler_impl.cc
@@ -85,7 +85,7 @@ void RPCHandlerImpl::ProcessMessageFromMobile(
}
if (!ConvertMessageToSO(
- *message, *so_from_mobile, remove_unknown_parameters)) {
+ *message, *so_from_mobile, remove_unknown_parameters, !rpc_passing)) {
LOG4CXX_ERROR(logger_, "Cannot create smart object from message");
return;
}
@@ -106,7 +106,7 @@ void RPCHandlerImpl::ProcessMessageFromMobile(
commands::Command::SOURCE_MOBILE,
message_type)) {
// Since PassThrough failed, refiltering the message
- if (!ConvertMessageToSO(*message, *so_from_mobile, true)) {
+ if (!ConvertMessageToSO(*message, *so_from_mobile, true, true)) {
LOG4CXX_ERROR(logger_, "Cannot create smart object from message");
return;
}
@@ -283,7 +283,8 @@ void RPCHandlerImpl::GetMessageVersion(
bool RPCHandlerImpl::ConvertMessageToSO(
const Message& message,
ns_smart_device_link::ns_smart_objects::SmartObject& output,
- const bool remove_unknown_parameters) {
+ const bool remove_unknown_parameters,
+ const bool validate_params) {
LOG4CXX_AUTO_TRACE(logger_);
LOG4CXX_DEBUG(logger_,
"\t\t\tMessage to convert: protocol "
@@ -303,6 +304,7 @@ bool RPCHandlerImpl::ConvertMessageToSO(
message.type(),
message.correlation_id());
+ smart_objects::SmartObject* so_ptr = (conversion_result) ? &output : NULL;
rpc::ValidationReport report("RPC");
// Attach RPC version to SmartObject if it does not exist yet.
@@ -316,11 +318,9 @@ bool RPCHandlerImpl::ConvertMessageToSO(
GetMessageVersion(output, msg_version);
}
- if (!conversion_result ||
- !mobile_so_factory().attachSchema(
- output, remove_unknown_parameters, msg_version) ||
- output.validate(&report, msg_version, !remove_unknown_parameters) !=
- smart_objects::errors::OK) {
+ if (validate_params &&
+ !ValidateRpcSO(
+ so_ptr, msg_version, report, remove_unknown_parameters)) {
LOG4CXX_WARN(logger_,
"Failed to parse string to smart object with API version "
<< msg_version.toString() << " : "
@@ -337,8 +337,10 @@ bool RPCHandlerImpl::ConvertMessageToSO(
rpc::PrettyFormat(report);
app_manager_.GetRPCService().ManageMobileCommand(
response, commands::Command::SOURCE_SDL);
+
return false;
}
+
LOG4CXX_DEBUG(logger_,
"Convertion result for sdl object is true function_id "
<< output[jhs::S_PARAMS][jhs::S_FUNCTION_ID].asInt());
@@ -387,7 +389,8 @@ bool RPCHandlerImpl::ConvertMessageToSO(
rpc::ValidationReport report("RPC");
utils::SemanticVersion empty_version;
- if (output.validate(&report, empty_version, !remove_unknown_parameters) !=
+ if (validate_params &&
+ output.validate(&report, empty_version, !remove_unknown_parameters) !=
smart_objects::errors::OK) {
LOG4CXX_ERROR(logger_,
"Incorrect parameter from HMI - "
@@ -449,6 +452,21 @@ bool RPCHandlerImpl::ConvertMessageToSO(
return true;
}
+bool RPCHandlerImpl::ValidateRpcSO(smart_objects::SmartObject* message,
+ utils::SemanticVersion& msg_version,
+ rpc::ValidationReport& report_out,
+ bool remove_unknown_params) {
+ if (!message ||
+ !mobile_so_factory().attachSchema(
+ *message, remove_unknown_params, msg_version) ||
+ output.validate(&report_out, msg_version, !remove_unknown_parameters) !=
+ smart_objects::errors::OK) {
+ LOG4CXX_WARN(logger_, "Failed to parse string to smart object");
+ return false;
+ }
+ return true;
+}
+
std::shared_ptr<Message> RPCHandlerImpl::ConvertRawMsgToMessage(
const protocol_handler::RawMessagePtr message) {
LOG4CXX_AUTO_TRACE(logger_);
diff --git a/src/components/application_manager/src/rpc_passing_handler.cc b/src/components/application_manager/src/rpc_passing_handler.cc
index 560418e910..165b1f43ba 100644
--- a/src/components/application_manager/src/rpc_passing_handler.cc
+++ b/src/components/application_manager/src/rpc_passing_handler.cc
@@ -38,6 +38,7 @@
#include "application_manager/application.h"
#include "application_manager/application_manager.h"
#include "application_manager/rpc_passing_handler.h"
+#include "application_manager/rpc_handler.h"
#include "application_manager/commands/command_impl.h"
#include "application_manager/message_helper.h"
#include "application_manager/smart_object_keys.h"
@@ -145,8 +146,12 @@ bool RPCPassingHandler::RPCPassThrough(smart_objects::SmartObject rpc_message) {
}
rpc_request_queue_lock_.Release();
RemoveRequestTimer(correlation_id);
- auto result_code = static_cast<mobile_apis::Result::eType>(
- rpc_message[strings::msg_params][strings::result_code].asInt());
+
+ mobile_apis::Result::eType result_code;
+ smart_objects::EnumConversionHelper<mobile_apis::Result::eType>::
+ StringToEnum(
+ rpc_message[strings::msg_params][strings::result_code].asString(),
+ &result_code);
if (result_code == mobile_apis::Result::UNSUPPORTED_REQUEST) {
LOG4CXX_DEBUG(logger_, "Service sent UNSUPPORTED_REQUEST");
@@ -228,6 +233,33 @@ void RPCPassingHandler::ForwardRequestToCore(uint32_t correlation_id) {
std::make_shared<smart_objects::SmartObject>(message);
rpc_request_queue.erase(correlation_id);
rpc_request_queue_lock_.Release();
+
+ // Validate rpc message before forwarding to core
+ rpc::ValidationReport report("RPC");
+ uint32_t connection_key =
+ message[strings::params][strings::connection_key].asUInt();
+ int32_t function_id = message[strings::params][strings::function_id].asInt();
+ auto app_ptr = app_manager_.application(connection_key);
+ utils::SemanticVersion msg_version(0, 0, 0);
+ if (app_ptr) {
+ msg_version = app_ptr->msg_version();
+ }
+
+ if (!app_manager_.GetRPCHandler().ValidateRpcSO(
+ &message, msg_version, report, true)) {
+ std::shared_ptr<smart_objects::SmartObject> response(
+ MessageHelper::CreateNegativeResponse(
+ connection_key,
+ function_id,
+ correlation_id,
+ mobile_apis::Result::INVALID_DATA));
+
+ (*response)[strings::msg_params][strings::info] = rpc::PrettyFormat(report);
+ app_manager_.GetRPCService().ManageMobileCommand(
+ response, commands::Command::SOURCE_SDL);
+ return;
+ }
+
app_manager_.GetRPCService().ManageMobileCommand(
result, commands::Command::SOURCE_MOBILE);
}
diff --git a/src/components/include/application_manager/rpc_handler.h b/src/components/include/application_manager/rpc_handler.h
index 9b6428f32d..a64ef44dfb 100644
--- a/src/components/include/application_manager/rpc_handler.h
+++ b/src/components/include/application_manager/rpc_handler.h
@@ -52,6 +52,11 @@ class RPCHandler
#endif // TELEMETRY_MONITOR
{
public:
+ virtual bool ValidateRpcSO(smart_objects::SmartObject* message,
+ utils::SemanticVersion& msg_version,
+ rpc::ValidationReport& report_out,
+ bool remove_unknown_params) = 0;
+
virtual ~RPCHandler() {}
};