summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAKalinich-Luxoft <AKalinich@luxoft.com>2017-10-03 11:48:18 +0300
committerBSolonenko <BSolonenko@luxoft.com>2018-01-26 13:58:48 +0200
commitbbfd760ea5a1149ef4a95aa8e91a17eac16c6231 (patch)
tree1948f4e31a063c8a4614a641b515c109aa9f5ef0
parent98a7253abc01d1f10cb4ddde907107fb8f153539 (diff)
downloadsdl_core-bbfd760ea5a1149ef4a95aa8e91a17eac16c6231.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