summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAKalinich-Luxoft <AKalinich@luxoft.com>2017-10-03 11:48:18 +0300
committerAndriy Byzhynar <AByzhynar@luxoft.com>2018-01-26 11:38:08 +0200
commit375665ef5aca8afae108f76884fb424c19c5680d (patch)
tree2e392529870b16b3e966d51be5e98ec2475fe88c
parentaee2ad33ae25411398d81f990e4efacd581ac3fa (diff)
downloadsdl_core-375665ef5aca8afae108f76884fb424c19c5680d.tar.gz
Add new PermitResult values for PROPRIETARY flow
Added new values for more detailed CheckPermissions result description. This values will be used in AM layer for generating info message string. Also there was added missed logic for checking RPC params and returning correct PermitResult code and params lists.
-rw-r--r--src/components/policy/policy_regular/include/policy/policy_types.h8
-rw-r--r--src/components/policy/policy_regular/src/cache_manager.cc10
-rw-r--r--src/components/policy/policy_regular/src/policy_manager_impl.cc38
3 files changed, 53 insertions, 3 deletions
diff --git a/src/components/policy/policy_regular/include/policy/policy_types.h b/src/components/policy/policy_regular/include/policy/policy_types.h
index 25aa126a03..821ba36e75 100644
--- a/src/components/policy/policy_regular/include/policy/policy_types.h
+++ b/src/components/policy/policy_regular/include/policy/policy_types.h
@@ -113,7 +113,13 @@ typedef std::vector<std::string> PermissionsList;
*/
typedef std::vector<std::string> StringArray;
-enum PermitResult { kRpcAllowed = 0, kRpcDisallowed, kRpcUserDisallowed };
+enum PermitResult {
+ kRpcAllowed = 0,
+ kRpcDisallowed,
+ kRpcUserDisallowed,
+ kRpcAllParamsDisallowed,
+ kRpcAllParamsUserDisallowed
+};
/**
* @struct Stores result of check:
diff --git a/src/components/policy/policy_regular/src/cache_manager.cc b/src/components/policy/policy_regular/src/cache_manager.cc
index 94a33a1e04..cb187a6094 100644
--- a/src/components/policy/policy_regular/src/cache_manager.cc
+++ b/src/components/policy/policy_regular/src/cache_manager.cc
@@ -471,6 +471,7 @@ void CacheManager::CheckPermissions(const policy_table::Strings& groups,
policy_table::Strings::const_iterator app_groups_iter = groups.begin();
policy_table::Strings::const_iterator app_groups_iter_end = groups.end();
+ result.hmi_level_permitted = PermitResult::kRpcDisallowed;
policy_table::FunctionalGroupings::const_iterator concrete_group;
for (; app_groups_iter != app_groups_iter_end; ++app_groups_iter) {
@@ -492,8 +493,6 @@ void CacheManager::CheckPermissions(const policy_table::Strings& groups,
hmi_level_e);
if (rpc_param.hmi_levels.end() != hmi_iter) {
- result.hmi_level_permitted = PermitResult::kRpcAllowed;
-
policy_table::Parameters::const_iterator params_iter =
rpc_param.parameters->begin();
policy_table::Parameters::const_iterator params_iter_end =
@@ -503,6 +502,13 @@ void CacheManager::CheckPermissions(const policy_table::Strings& groups,
result.list_of_allowed_params.insert(
policy_table::EnumToJsonString(*params_iter));
}
+
+ if (rpc_param.parameters.is_initialized() &&
+ result.list_of_allowed_params.empty()) {
+ result.hmi_level_permitted = PermitResult::kRpcAllParamsDisallowed;
+ } else {
+ result.hmi_level_permitted = PermitResult::kRpcAllowed;
+ }
}
}
}
diff --git a/src/components/policy/policy_regular/src/policy_manager_impl.cc b/src/components/policy/policy_regular/src/policy_manager_impl.cc
index 055b57d985..6b54d9450c 100644
--- a/src/components/policy/policy_regular/src/policy_manager_impl.cc
+++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc
@@ -408,6 +408,44 @@ void PolicyManagerImpl::CheckPermissions(const PTString& device_id,
#endif // SDL_REMOTE_CONTROL
cache_->CheckPermissions(groups, hmi_level, rpc, result);
+
+ if (kRpcDisallowed == result.hmi_level_permitted) {
+ LOG4CXX_DEBUG(logger_, "RPC is not allowed. Stop parameters processing.");
+ return;
+ }
+
+ if (kRpcAllParamsDisallowed == result.hmi_level_permitted) {
+ LOG4CXX_DEBUG(logger_, "All parameters are disallowed by policy.");
+ result.list_of_undefined_params = rpc_params;
+ return;
+ }
+
+ if (kRpcAllowed == result.hmi_level_permitted &&
+ result.list_of_allowed_params.empty()) {
+ LOG4CXX_DEBUG(logger_, "All parameters are allowed.");
+ result.list_of_allowed_params = rpc_params;
+ return;
+ }
+
+ RPCParams::const_iterator parameter = rpc_params.begin();
+ RPCParams::const_iterator end = rpc_params.end();
+ for (; end != parameter; ++parameter) {
+ if (!result.HasParameter(*parameter)) {
+ LOG4CXX_DEBUG(logger_,
+ "Parameter " << *parameter << " is unknown."
+ " Adding to undefined list.");
+ result.list_of_undefined_params.insert(*parameter);
+ }
+ }
+
+ if (result.DisallowedInclude(rpc_params)) {
+ LOG4CXX_DEBUG(logger_, "All parameters are disallowed by user.");
+ result.hmi_level_permitted = kRpcAllParamsUserDisallowed;
+ } else if (!result.IsAnyAllowed(rpc_params)) {
+ LOG4CXX_DEBUG(logger_, "There are no parameters allowed by policy.");
+ result.hmi_level_permitted = kRpcAllParamsDisallowed;
+ }
+
if (cache_->IsApplicationRevoked(app_id)) {
// SDL must be able to notify mobile side with its status after app has
// been revoked by backend