summaryrefslogtreecommitdiff
path: root/src/components/application_manager/src/rpc_passing_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/application_manager/src/rpc_passing_handler.cc')
-rw-r--r--src/components/application_manager/src/rpc_passing_handler.cc36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/components/application_manager/src/rpc_passing_handler.cc b/src/components/application_manager/src/rpc_passing_handler.cc
index 560418e910..8d93659a27 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, false)) {
+ 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);
}