diff options
Diffstat (limited to 'src/components/policy/policy_external/src/policy_manager_impl.cc')
-rw-r--r-- | src/components/policy/policy_external/src/policy_manager_impl.cc | 701 |
1 files changed, 505 insertions, 196 deletions
diff --git a/src/components/policy/policy_external/src/policy_manager_impl.cc b/src/components/policy/policy_external/src/policy_manager_impl.cc index 42b67734ae..082d4a37ba 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -39,7 +39,6 @@ #include <set> #include <vector> #include "config_profile/profile.h" -#include "json/reader.h" #include "json/writer.h" #include "policy/cache_manager.h" #include "policy/policy_helper.h" @@ -48,17 +47,13 @@ #include "policy/update_status_manager.h" #include "utils/date_time.h" #include "utils/file_system.h" +#include "utils/jsoncpp_reader_wrapper.h" #include "utils/logger.h" #include "policy/access_remote.h" #include "policy/access_remote_impl.h" +#include "utils/timer_task_impl.h" -policy::PolicyManager* CreateManager() { - return new policy::PolicyManagerImpl(); -} -void DeleteManager(policy::PolicyManager* pm) { - delete pm; -} namespace { /** @@ -217,8 +212,11 @@ PolicyManagerImpl::PolicyManagerImpl() new AccessRemoteImpl(std::static_pointer_cast<CacheManager>(cache_))) , retry_sequence_timeout_(60) , retry_sequence_index_(0) + , applications_pending_ptu_count_(0) , ignition_check(true) - , retry_sequence_url_(0, 0, "") {} + , retry_sequence_url_(0, 0, "") + , ptu_requested_(false) + , is_ptu_in_progress_(false) {} PolicyManagerImpl::PolicyManagerImpl(bool in_memory) : PolicyManager() @@ -228,11 +226,13 @@ PolicyManagerImpl::PolicyManagerImpl(bool in_memory) new AccessRemoteImpl(std::static_pointer_cast<CacheManager>(cache_))) , retry_sequence_timeout_(60) , retry_sequence_index_(0) + , applications_pending_ptu_count_(0) , ignition_check(true) , retry_sequence_url_(0, 0, "") - , wrong_ptu_update_received_(false) , send_on_update_sent_out_(false) - , trigger_ptu_(false) {} + , trigger_ptu_(false) + , ptu_requested_(false) + , is_ptu_in_progress_(false) {} void PolicyManagerImpl::set_listener(PolicyListener* listener) { listener_ = listener; @@ -242,9 +242,10 @@ void PolicyManagerImpl::set_listener(PolicyListener* listener) { std::shared_ptr<policy_table::Table> PolicyManagerImpl::Parse( const BinaryMessage& pt_content) { std::string json(pt_content.begin(), pt_content.end()); + utils::JsonReader reader; Json::Value value; - Json::Reader reader; - if (reader.parse(json.c_str(), value)) { + + if (reader.parse(json, &value)) { return std::make_shared<policy_table::Table>(&value); } else { return std::make_shared<policy_table::Table>(); @@ -267,10 +268,6 @@ void PolicyManagerImpl::CheckTriggers() { } } -std::string PolicyManagerImpl::GetLockScreenIconUrl() const { - return cache_->GetLockScreenIconUrl(); -} - std::string PolicyManagerImpl::GetIconUrl( const std::string& policy_app_id) const { return cache_->GetIconUrl(policy_app_id); @@ -297,7 +294,9 @@ void FilterInvalidFunctions(policy_table::Rpc& rpcs) { * schema * @param rpc_parameters parameters to filter */ -void FilterInvalidRPCParameters(policy_table::RpcParameters& rpc_parameters) { +void FilterInvalidRPCParameters( + policy_table::RpcParameters& rpc_parameters, + const std::vector<policy_table::VehicleDataItem>& vehicle_data_items) { policy_table::HmiLevels valid_hmi_levels; for (const auto& hmi_level : rpc_parameters.hmi_levels) { if (hmi_level.is_valid()) { @@ -306,10 +305,31 @@ void FilterInvalidRPCParameters(policy_table::RpcParameters& rpc_parameters) { } rpc_parameters.hmi_levels.swap(valid_hmi_levels); + auto ParamExists = + [&vehicle_data_items](const rpc::String<0, 255>& param_name) { + policy_table::Parameter parameter_enum; + if (policy_table::EnumFromJsonString(param_name, ¶meter_enum)) { + return true; + } + + // In case when this collection is empty that means collection is not + // initialized + if (vehicle_data_items.empty()) { + return false; + } + + for (const auto& vdi : vehicle_data_items) { + if (param_name == vdi.name) { + return true; + } + } + return false; + }; + policy_table::Parameters valid_params; const policy_table::Parameters& params = *(rpc_parameters.parameters); for (const auto& param : params) { - if (param.is_valid()) { + if (param.is_valid() && ParamExists(param)) { valid_params.push_back(param); } } @@ -399,7 +419,9 @@ void FilterInvalidApplicationParameters( * @brief FilterPolicyTable filter values that not present in schema * @param pt policy table to filter */ -void FilterPolicyTable(policy_table::PolicyTable& pt) { +void FilterPolicyTable( + policy_table::PolicyTable& pt, + const std::vector<policy_table::VehicleDataItem>& current_vd_items) { policy_table::ModuleConfig& module_config = pt.module_config; if (module_config.is_initialized() && module_config.notifications_per_minute_by_priority.is_initialized()) { @@ -418,14 +440,24 @@ void FilterPolicyTable(policy_table::PolicyTable& pt) { policy_table::Rpc& rpcs = group.second.rpcs; FilterInvalidFunctions(rpcs); + policy_table::VehicleDataItems vehicle_data_items; + + if (!pt.vehicle_data->struct_empty()) { + vehicle_data_items = + pt.vehicle_data.is_initialized() && + pt.vehicle_data->schema_items.is_initialized() + ? *pt.vehicle_data->schema_items + : current_vd_items; + } + for (auto& func : rpcs) { - FilterInvalidRPCParameters(func.second); + FilterInvalidRPCParameters(func.second, vehicle_data_items); } } } -bool PolicyManagerImpl::LoadPT(const std::string& file, - const BinaryMessage& pt_content) { +PolicyManager::PtProcessingResult PolicyManagerImpl::LoadPT( + const std::string& file, const BinaryMessage& pt_content) { LOG4CXX_INFO(logger_, "LoadPT of size " << pt_content.size()); LOG4CXX_DEBUG( logger_, @@ -435,98 +467,117 @@ bool PolicyManagerImpl::LoadPT(const std::string& file, std::shared_ptr<policy_table::Table> pt_update = Parse(pt_content); if (!pt_update) { LOG4CXX_WARN(logger_, "Parsed table pointer is NULL."); - update_status_manager_.OnWrongUpdateReceived(); - return false; + return PtProcessingResult::kWrongPtReceived; } file_system::DeleteFile(file); - FilterPolicyTable(pt_update->policy_table); + auto current_vd_items = GetVehicleDataItems(); + + FilterPolicyTable(pt_update->policy_table, current_vd_items); if (!IsPTValid(pt_update, policy_table::PT_UPDATE)) { - wrong_ptu_update_received_ = true; - update_status_manager_.OnWrongUpdateReceived(); - return false; + LOG4CXX_WARN(logger_, "Received policy table update is not valid"); + return PtProcessingResult::kWrongPtReceived; } - update_status_manager_.OnValidUpdateReceived(); cache_->SaveUpdateRequired(false); + sync_primitives::AutoLock lock(apps_registration_lock_); - { - sync_primitives::AutoLock lock(apps_registration_lock_); + // Get current DB data, since it could be updated during awaiting of PTU + auto policy_table_snapshot = cache_->GenerateSnapshot(); + if (!policy_table_snapshot) { + LOG4CXX_ERROR( + logger_, + "Failed to create snapshot of policy table, trying another exchange"); + return PtProcessingResult::kNewPtRequired; + } - // Get current DB data, since it could be updated during awaiting of PTU - std::shared_ptr<policy_table::Table> policy_table_snapshot = - cache_->GenerateSnapshot(); - if (!policy_table_snapshot) { - LOG4CXX_ERROR( - logger_, - "Failed to create snapshot of policy table, trying another exchange"); - ForcePTExchange(); - return false; - } + // Checking of difference between PTU and current policy state + // Must to be done before PTU applying since it is possible, that functional + // groups, which had been present before are absent in PTU and will be + // removed after update. So in case of revoked groups system has to know + // names and ids of revoked groups before they will be removed. + CheckAppPolicyResults results = + CheckPermissionsChanges(pt_update, policy_table_snapshot); - // Checking of difference between PTU and current policy state - // Must to be done before PTU applying since it is possible, that functional - // groups, which had been present before are absent in PTU and will be - // removed after update. So in case of revoked groups system has to know - // names and ids of revoked groups before they will be removed. - CheckAppPolicyResults results = - CheckPermissionsChanges(pt_update, policy_table_snapshot); - - // Replace current data with updated - if (!cache_->ApplyUpdate(*pt_update)) { - LOG4CXX_WARN( - logger_, - "Unsuccessful save of updated policy table, trying another exchange"); - ForcePTExchange(); - return false; - } + // Replace current data with updated + if (!cache_->ApplyUpdate(*pt_update)) { + LOG4CXX_WARN( + logger_, + "Unsuccessful save of updated policy table, trying another exchange"); + return PtProcessingResult::kNewPtRequired; + } - ExternalConsentStatus status = cache_->GetExternalConsentStatus(); - GroupsByExternalConsentStatus groups_by_status = - cache_->GetGroupsWithSameEntities(status); + ExternalConsentStatus status = cache_->GetExternalConsentStatus(); + GroupsByExternalConsentStatus groups_by_status = + cache_->GetGroupsWithSameEntities(status); - ProcessExternalConsentStatusUpdate( - groups_by_status, ConsentProcessingPolicy::kExternalConsentBased); + ProcessExternalConsentStatusUpdate( + groups_by_status, ConsentProcessingPolicy::kExternalConsentBased); - ProcessAppPolicyCheckResults( - results, pt_update->policy_table.app_policies_section.apps); + ProcessAppPolicyCheckResults( + results, pt_update->policy_table.app_policies_section.apps); - CheckPermissionsChangesAfterUpdate(*pt_update, *policy_table_snapshot); + CheckPermissionsChangesAfterUpdate(*pt_update, *policy_table_snapshot); - listener_->OnCertificateUpdated( - *(pt_update->policy_table.module_config.certificate)); + listener_->OnCertificateUpdated( + *(pt_update->policy_table.module_config.certificate)); - std::map<std::string, StringArray> app_hmi_types; - cache_->GetHMIAppTypeAfterUpdate(app_hmi_types); - if (!app_hmi_types.empty()) { - LOG4CXX_INFO(logger_, "app_hmi_types is full calling OnUpdateHMIAppType"); - listener_->OnUpdateHMIAppType(app_hmi_types); - } else { - LOG4CXX_INFO(logger_, "app_hmi_types empty"); - } + std::map<std::string, StringArray> app_hmi_types; + cache_->GetHMIAppTypeAfterUpdate(app_hmi_types); + if (!app_hmi_types.empty()) { + LOG4CXX_INFO(logger_, "app_hmi_types is full calling OnUpdateHMIAppType"); + listener_->OnUpdateHMIAppType(app_hmi_types); + } else { + LOG4CXX_INFO(logger_, "app_hmi_types empty"); + } - std::vector<std::string> enabled_apps; - cache_->GetEnabledCloudApps(enabled_apps); - for (auto it = enabled_apps.begin(); it != enabled_apps.end(); ++it) { - SendAuthTokenUpdated(*it); - } + std::vector<std::string> enabled_apps; + cache_->GetEnabledCloudApps(enabled_apps); + for (auto it = enabled_apps.begin(); it != enabled_apps.end(); ++it) { + SendAuthTokenUpdated(*it); } + return PtProcessingResult::kSuccess; +} + +void PolicyManagerImpl::OnPTUFinished(const PtProcessingResult ptu_result) { + LOG4CXX_AUTO_TRACE(logger_); + + ptu_requested_ = false; + if (PtProcessingResult::kWrongPtReceived == ptu_result) { + LOG4CXX_DEBUG(logger_, "Wrong PT was received"); + update_status_manager_.OnWrongUpdateReceived(); + return; + } + + update_status_manager_.OnValidUpdateReceived(); + + if (HasApplicationForPTU()) { + update_status_manager_.OnExistedApplicationAdded(true); + } else if (PtProcessingResult::kNewPtRequired == ptu_result) { + LOG4CXX_DEBUG(logger_, "New PTU interation is required"); + ForcePTExchange(); + return; + } + + ResumePendingAppPolicyActions(); + // If there was a user request for policy table update, it should be started // right after current update is finished if (update_status_manager_.IsUpdateRequired()) { + LOG4CXX_DEBUG(logger_, + "PTU was successful and new PTU iteration was scheduled"); StartPTExchange(); - return true; + return; } RefreshRetrySequence(); - return true; } CheckAppPolicyResults PolicyManagerImpl::CheckPermissionsChanges( const std::shared_ptr<policy_table::Table> pt_update, const std::shared_ptr<policy_table::Table> snapshot) { - LOG4CXX_INFO(logger_, "Checking incoming permissions."); + LOG4CXX_AUTO_TRACE(logger_); // Replace predefined policies with its actual setting, e.g. "123":"default" // to actual values of default section @@ -565,33 +616,43 @@ void PolicyManagerImpl::ProcessAppPolicyCheckResults( void PolicyManagerImpl::ProcessActionsForAppPolicies( const ApplicationsPoliciesActions& actions, const policy_table::ApplicationPolicies& app_policies) { - ApplicationsPoliciesActions::const_iterator it_actions = actions.begin(); - for (; it_actions != actions.end(); ++it_actions) { - policy_table::ApplicationPolicies::const_iterator app_policy = - app_policies.find(it_actions->first); + notify_system_list_.clear(); + send_permissions_list_.clear(); + + for (const auto& action : actions) { + const auto& app_policy = app_policies.find(action.first); if (app_policies.end() == app_policy) { continue; } - if (it_actions->second.is_consent_needed) { - // Post-check after ExternalConsent consent changes - const std::string& policy_app_id = app_policy->first; - if (!IsConsentNeeded(policy_app_id)) { - sync_primitives::AutoLock lock(app_permissions_diff_lock_); + if (action.second.app_properties_changed) { + app_properties_changed_list_.push_back(app_policy->first); + } + + const auto devices_ids = listener()->GetDevicesIds(app_policy->first); + for (const auto& device_id : devices_ids) { + if (action.second.is_consent_needed) { + // Post-check after ExternalConsent consent changes + const auto& policy_app_id = app_policy->first; + if (!IsConsentNeeded(device_id, policy_app_id)) { + sync_primitives::AutoLock lock(app_permissions_diff_lock_); - PendingPermissions::iterator app_id_diff = - app_permissions_diff_.find(policy_app_id); + const auto& app_id_diff = app_permissions_diff_.find(policy_app_id); - if (app_permissions_diff_.end() != app_id_diff) { - app_id_diff->second.appPermissionsConsentNeeded = false; + if (app_permissions_diff_.end() != app_id_diff) { + app_id_diff->second.appPermissionsConsentNeeded = false; + } } } - } - if (it_actions->second.is_notify_system) { - NotifySystem(*app_policy); - } - if (it_actions->second.is_send_permissions_to_app) { - SendPermissionsToApp(*app_policy); + + if (action.second.is_notify_system) { + notify_system_list_.push_back(std::make_pair(device_id, *app_policy)); + } + + if (action.second.is_send_permissions_to_app) { + send_permissions_list_.push_back( + std::make_pair(device_id, *app_policy)); + } } } } @@ -628,12 +689,12 @@ std::string PolicyManagerImpl::GetUpdateUrl(int service_type) { } void PolicyManagerImpl::GetUpdateUrls(const std::string& service_type, - EndpointUrls& out_end_points) { + EndpointUrls& out_end_points) const { LOG4CXX_AUTO_TRACE(logger_); cache_->GetUpdateUrls(service_type, out_end_points); } void PolicyManagerImpl::GetUpdateUrls(const uint32_t service_type, - EndpointUrls& out_end_points) { + EndpointUrls& out_end_points) const { LOG4CXX_AUTO_TRACE(logger_); cache_->GetUpdateUrls(service_type, out_end_points); } @@ -649,13 +710,14 @@ void PolicyManagerImpl::RequestPTUpdate() { if (IsPTValid(policy_table_snapshot, policy_table::PT_SNAPSHOT)) { Json::Value value = policy_table_snapshot->ToJsonValue(); - Json::FastWriter writer; - std::string message_string = writer.write(value); + Json::StreamWriterBuilder writer_builder; + writer_builder["indentation"] = ""; + std::string message_string = Json::writeString(writer_builder, value); LOG4CXX_DEBUG(logger_, "Snapshot contents is : " << message_string); BinaryMessage update(message_string.begin(), message_string.end()); - + ptu_requested_ = true; listener_->OnSnapshotCreated( update, RetrySequenceDelaysSeconds(), TimeoutExchangeMSec()); } else { @@ -689,9 +751,10 @@ void PolicyManagerImpl::StartPTExchange() { return; } LOG4CXX_INFO(logger_, "Policy want to call RequestPTUpdate"); - if (listener_ && listener_->CanUpdate()) { + if (listener_) { LOG4CXX_INFO(logger_, "Listener CanUpdate"); if (update_status_manager_.IsUpdateRequired()) { + update_status_manager_.PendingUpdate(); LOG4CXX_INFO(logger_, "IsUpdateRequired"); RequestPTUpdate(); } @@ -714,11 +777,16 @@ void PolicyManagerImpl::OnAppsSearchCompleted(const bool trigger_ptu) { } } +void PolicyManagerImpl::UpdatePTUReadyAppsCount(const uint32_t new_app_count) { + applications_pending_ptu_count_ = new_app_count; +} + const std::vector<std::string> PolicyManagerImpl::GetAppRequestTypes( + const transport_manager::DeviceHandle& device_handle, const std::string policy_app_id) const { std::vector<std::string> request_types; - if (kDeviceDisallowed == - cache_->GetDeviceConsent(GetCurrentDeviceId(policy_app_id))) { + if (kDeviceAllowed != cache_->GetDeviceConsent( + GetCurrentDeviceId(device_handle, policy_app_id))) { cache_->GetAppRequestTypes(kPreDataConsentId, request_types); } else { cache_->GetAppRequestTypes(policy_app_id, request_types); @@ -745,8 +813,18 @@ const std::vector<std::string> PolicyManagerImpl::GetAppRequestSubTypes( return request_subtypes; } -const VehicleInfo PolicyManagerImpl::GetVehicleInfo() const { - return cache_->GetVehicleInfo(); +const std::vector<policy_table::VehicleDataItem> +PolicyManagerImpl::GetVehicleDataItems() const { + return cache_->GetVehicleDataItems(); +} + +std::vector<policy_table::VehicleDataItem> +PolicyManagerImpl::GetRemovedVehicleDataItems() const { + return cache_->GetRemovedVehicleDataItems(); +} + +Json::Value PolicyManagerImpl::GetPolicyTableData() const { + return cache_->GetPolicyTableData(); } void PolicyManagerImpl::GetEnabledCloudApps( @@ -754,21 +832,13 @@ void PolicyManagerImpl::GetEnabledCloudApps( cache_->GetEnabledCloudApps(enabled_apps); } -bool PolicyManagerImpl::GetCloudAppParameters( - const std::string& policy_app_id, - bool& enabled, - std::string& endpoint, - std::string& certificate, - std::string& auth_token, - std::string& cloud_transport_type, - std::string& hybrid_app_preference) const { - return cache_->GetCloudAppParameters(policy_app_id, - enabled, - endpoint, - certificate, - auth_token, - cloud_transport_type, - hybrid_app_preference); +std::vector<std::string> PolicyManagerImpl::GetEnabledLocalApps() const { + return cache_->GetEnabledLocalApps(); +} + +bool PolicyManagerImpl::GetAppProperties( + const std::string& policy_app_id, AppProperties& out_app_properties) const { + return cache_->GetAppProperties(policy_app_id, out_app_properties); } void PolicyManagerImpl::InitCloudApp(const std::string& policy_app_id) { @@ -818,7 +888,8 @@ bool PolicyManagerImpl::UnknownRPCPassthroughAllowed( return cache_->UnknownRPCPassthroughAllowed(policy_app_id); } -void PolicyManagerImpl::CheckPermissions(const PTString& app_id, +void PolicyManagerImpl::CheckPermissions(const PTString& device_id, + const PTString& app_id, const PTString& hmi_level, const PTString& rpc, const RPCParams& rpc_params, @@ -827,8 +898,6 @@ void PolicyManagerImpl::CheckPermissions(const PTString& app_id, "CheckPermissions for " << app_id << " and rpc " << rpc << " for " << hmi_level << " level."); - const std::string device_id = GetCurrentDeviceId(app_id); - Permissions rpc_permissions; // Check, if there are calculated permission present in cache @@ -979,7 +1048,12 @@ void PolicyManagerImpl::CheckPermissions(const PTString& app_id, result.hmi_level_permitted = kRpcUserDisallowed; } else if (!result.IsAnyAllowed(rpc_params)) { LOG4CXX_DEBUG(logger_, "There are no parameters allowed."); - result.hmi_level_permitted = kRpcDisallowed; + + if (!result.list_of_undefined_params.empty()) { + result.hmi_level_permitted = kRpcAllowed; + } else { + result.hmi_level_permitted = kRpcDisallowed; + } } } @@ -998,9 +1072,8 @@ policy_table::Strings PolicyManagerImpl::GetGroupsNames( } void PolicyManagerImpl::SendNotificationOnPermissionsUpdated( - const std::string& application_id) { + const std::string& device_id, const std::string& application_id) { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(application_id); if (device_id.empty()) { LOG4CXX_WARN(logger_, "Couldn't find device info for application id " @@ -1028,15 +1101,16 @@ void PolicyManagerImpl::SendNotificationOnPermissionsUpdated( const ApplicationOnDevice who = {device_id, application_id}; if (access_remote_->IsAppRemoteControl(who)) { - listener()->OnPermissionsUpdated(application_id, notification_data); + listener()->OnPermissionsUpdated( + device_id, application_id, notification_data); return; } std::string default_hmi; - GetDefaultHmi(application_id, &default_hmi); + GetDefaultHmi(device_id, application_id, &default_hmi); listener()->OnPermissionsUpdated( - application_id, notification_data, default_hmi); + device_id, application_id, notification_data, default_hmi); } bool PolicyManagerImpl::CleanupUnpairedDevices() { @@ -1062,21 +1136,25 @@ void PolicyManagerImpl::SetUserConsentForDevice(const std::string& device_id, "Event listener is not initialized. " "Can't call OnDeviceConsentChanged"); } - if (is_allowed) { + if (is_allowed && listener_->CanUpdate()) { update_status_manager_.OnDeviceConsented(); } StartPTExchange(); } bool PolicyManagerImpl::ReactOnUserDevConsentForApp( - const std::string& app_id, const bool is_device_allowed) { - std::vector<std::string> current_request_types = GetAppRequestTypes(app_id); + const transport_manager::DeviceHandle& device_handle, + const std::string& app_id, + const bool is_device_allowed) { + std::vector<std::string> current_request_types = + GetAppRequestTypes(device_handle, app_id); std::string current_priority, new_priority; GetPriority(app_id, ¤t_priority); bool result = cache_->ReactOnUserDevConsentForApp(app_id, is_device_allowed); - std::vector<std::string> new_request_types = GetAppRequestTypes(app_id); + std::vector<std::string> new_request_types = + GetAppRequestTypes(device_handle, app_id); GetPriority(app_id, &new_priority); std::sort(current_request_types.begin(), current_request_types.end()); std::sort(new_request_types.begin(), new_request_types.end()); @@ -1101,7 +1179,8 @@ bool PolicyManagerImpl::ReactOnUserDevConsentForApp( } if (permissions.requestTypeChanged || (!permissions.priority.empty())) { - listener_->SendOnAppPermissionsChanged(permissions, app_id); + const auto& device_id = GetCurrentDeviceId(device_handle, app_id); + listener_->SendOnAppPermissionsChanged(permissions, device_id, app_id); } return result; } @@ -1126,6 +1205,12 @@ void PolicyManagerImpl::AddDevice(const std::string& device_id, } } +void PolicyManagerImpl::OnLocalAppAdded() { + LOG4CXX_AUTO_TRACE(logger_); + update_status_manager_.ScheduleUpdate(); + StartPTExchange(); +} + void PolicyManagerImpl::SetDeviceInfo(const std::string& device_id, const DeviceInfo& device_info) { LOG4CXX_AUTO_TRACE(logger_); @@ -1219,6 +1304,7 @@ void PolicyManagerImpl::CheckPendingPermissionsChanges( } void PolicyManagerImpl::NotifyPermissionsChanges( + const std::string& device_id, const std::string& policy_app_id, const std::vector<FunctionalGroupPermission>& app_group_permissions) { LOG4CXX_AUTO_TRACE(logger_); @@ -1234,7 +1320,7 @@ void PolicyManagerImpl::NotifyPermissionsChanges( PrepareNotificationData( functional_groups, app_groups, app_group_permissions, notification_data); - listener()->OnPermissionsUpdated(policy_app_id, notification_data); + listener()->OnPermissionsUpdated(device_id, policy_app_id, notification_data); } void PolicyManagerImpl::SetUserConsentForApp( @@ -1273,14 +1359,64 @@ void PolicyManagerImpl::SetUserConsentForApp( CheckPendingPermissionsChanges(verified_permissions.policy_app_id, updated_app_group_permissons); - NotifyPermissionsChanges(verified_permissions.policy_app_id, + NotifyPermissionsChanges(verified_permissions.device_id, + verified_permissions.policy_app_id, updated_app_group_permissons); } -bool PolicyManagerImpl::GetDefaultHmi(const std::string& policy_app_id, +bool PolicyManagerImpl::IsAllowedRetryCountExceeded() const { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock auto_lock(retry_sequence_lock_); + + return retry_sequence_index_ > retry_sequence_seconds_.size(); +} + +void PolicyManagerImpl::IncrementRetryIndex() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock auto_lock(retry_sequence_lock_); + + if (!is_ptu_in_progress_) { + LOG4CXX_TRACE(logger_, + "First PTU iteration, skipping incrementing retry index"); + is_ptu_in_progress_ = true; + return; + } + + ++retry_sequence_index_; + LOG4CXX_DEBUG(logger_, + "current retry_sequence_index_ is: " << retry_sequence_index_); +} + +void PolicyManagerImpl::RetrySequenceFailed() { + LOG4CXX_AUTO_TRACE(logger_); + + listener_->OnPTUFinished(false); + ResetRetrySequence(ResetRetryCountType::kResetWithStatusUpdate); + + ptu_requested_ = false; + if (HasApplicationForPTU()) { + update_status_manager_.OnExistedApplicationAdded(true); + StartPTExchange(); + } +} + +void PolicyManagerImpl::ResetTimeout() { + LOG4CXX_AUTO_TRACE(logger_); + if (update_status_manager_.IsUpdatePending()) { + uint32_t update_timeout = TimeoutExchangeMSec(); + update_status_manager_.ResetTimeout(update_timeout); + } +} + +void PolicyManagerImpl::OnSystemRequestReceived() { + LOG4CXX_AUTO_TRACE(logger_); + IncrementRetryIndex(); +} + +bool PolicyManagerImpl::GetDefaultHmi(const std::string& device_id, + const std::string& policy_app_id, std::string* default_hmi) const { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(policy_app_id); DeviceConsent device_consent = GetUserConsentForDevice(device_id); const std::string app_id = policy::kDeviceAllowed != device_consent ? kPreDataConsentId @@ -1385,11 +1521,13 @@ void PolicyManagerImpl::GetPermissionsForApp( } bool allowed_by_default = false; - if (cache_->IsDefaultPolicy(policy_app_id)) { + const auto device_consent = GetUserConsentForDevice(device_id); + if ((policy::kDeviceAllowed == device_consent) && + cache_->IsDefaultPolicy(policy_app_id)) { app_id_to_check = kDefaultId; allowed_by_default = true; } else if (cache_->IsPredataPolicy(policy_app_id) || - policy::kDeviceDisallowed == GetUserConsentForDevice(device_id)) { + policy::kDeviceAllowed != device_consent) { app_id_to_check = kPreDataConsentId; allowed_by_default = true; } @@ -1473,9 +1611,11 @@ void PolicyManagerImpl::GetPermissionsForApp( } std::string& PolicyManagerImpl::GetCurrentDeviceId( + const transport_manager::DeviceHandle& device_handle, const std::string& policy_app_id) const { LOG4CXX_INFO(logger_, "GetDeviceInfo"); - last_device_id_ = listener()->OnCurrentDeviceIdUpdateRequired(policy_app_id); + last_device_id_ = + listener()->OnCurrentDeviceIdUpdateRequired(device_handle, policy_app_id); return last_device_id_; } @@ -1490,13 +1630,6 @@ void PolicyManagerImpl::SetSystemInfo(const std::string& ccpu_version, cache_->SetMetaInfo(ccpu_version, wers_country_code, language); } -void PolicyManagerImpl::OnSystemReady() { - // Update policy table for the first time with system information - if (!cache_->IsMetaInfoPresent()) { - listener()->OnSystemInfoUpdateRequired(); - } -} - uint32_t PolicyManagerImpl::GetNotificationsNumber( const std::string& priority) const { LOG4CXX_AUTO_TRACE(logger_); @@ -1521,6 +1654,10 @@ bool PolicyManagerImpl::IsPTValid( return true; } +bool PolicyManagerImpl::HasApplicationForPTU() const { + return applications_pending_ptu_count_ > 0; +} + const PolicySettings& PolicyManagerImpl::get_settings() const { DCHECK(settings_); return *settings_; @@ -1578,16 +1715,42 @@ void PolicyManagerImpl::UpdateAppConsentWithExternalConsent( cache_->SetExternalConsentForApp(updated_external_consent_permissions); } +void PolicyManagerImpl::SendOnAppPropertiesChangeNotification( + const std::string& policy_app_id) const { + LOG4CXX_AUTO_TRACE(logger_); + listener_->SendOnAppPropertiesChangeNotification(policy_app_id); +} + +void PolicyManagerImpl::ResumePendingAppPolicyActions() { + LOG4CXX_AUTO_TRACE(logger_); + + for (auto& notify_system_params : notify_system_list_) { + NotifySystem(notify_system_params.first, notify_system_params.second); + } + notify_system_list_.clear(); + + for (auto& send_permissions_params : send_permissions_list_) { + SendPermissionsToApp(send_permissions_params.first, + send_permissions_params.second); + } + + for (auto& app : app_properties_changed_list_) { + SendOnAppPropertiesChangeNotification(app); + } + send_permissions_list_.clear(); +} + void PolicyManagerImpl::NotifySystem( + const std::string& device_id, const PolicyManagerImpl::AppPoliciesValueType& app_policy) const { - listener()->OnPendingPermissionChange(app_policy.first); + listener()->OnPendingPermissionChange(device_id, app_policy.first); } void PolicyManagerImpl::SendPermissionsToApp( + const std::string& device_id, const PolicyManagerImpl::AppPoliciesValueType& app_policy) { const std::string app_id = app_policy.first; - const std::string device_id = GetCurrentDeviceId(app_id); if (device_id.empty()) { LOG4CXX_WARN(logger_, "Couldn't find device info for application id: " << app_id); @@ -1610,6 +1773,7 @@ void PolicyManagerImpl::SendPermissionsToApp( LOG4CXX_INFO(logger_, "Send notification for application_id: " << app_id); listener()->OnPermissionsUpdated( + device_id, app_id, notification_data, policy_table::EnumToJsonString(app_policy.second.default_hmi)); @@ -1774,6 +1938,14 @@ std::string PolicyManagerImpl::ForcePTExchange() { return update_status_manager_.StringifiedUpdateStatus(); } +void policy::PolicyManagerImpl::StopRetrySequence() { + LOG4CXX_AUTO_TRACE(logger_); + + if (cache_->UpdateRequired()) { + ResetRetrySequence(ResetRetryCountType::kResetWithStatusUpdate); + } +} + std::string PolicyManagerImpl::ForcePTExchangeAtUserRequest() { LOG4CXX_AUTO_TRACE(logger_); update_status_manager_.ScheduleManualUpdate(); @@ -1789,10 +1961,11 @@ int PolicyManagerImpl::NextRetryTimeout() { sync_primitives::AutoLock auto_lock(retry_sequence_lock_); LOG4CXX_DEBUG(logger_, "Index: " << retry_sequence_index_); int next = 0; + if (!retry_sequence_seconds_.empty() && retry_sequence_index_ < retry_sequence_seconds_.size()) { - next = retry_sequence_seconds_[retry_sequence_index_]; - ++retry_sequence_index_; + next = retry_sequence_seconds_[retry_sequence_index_] * + date_time::MILLISECONDS_IN_SECOND; } return next; } @@ -1804,10 +1977,15 @@ void PolicyManagerImpl::RefreshRetrySequence() { cache_->SecondsBetweenRetries(retry_sequence_seconds_); } -void PolicyManagerImpl::ResetRetrySequence() { +void PolicyManagerImpl::ResetRetrySequence( + const ResetRetryCountType reset_type) { + LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock auto_lock(retry_sequence_lock_); retry_sequence_index_ = 0; - update_status_manager_.OnResetRetrySequence(); + is_ptu_in_progress_ = false; + if (ResetRetryCountType::kResetWithStatusUpdate == reset_type) { + update_status_manager_.OnResetRetrySequence(); + } } uint32_t PolicyManagerImpl::TimeoutExchangeMSec() { @@ -1820,6 +1998,8 @@ const std::vector<int> PolicyManagerImpl::RetrySequenceDelaysSeconds() { } void PolicyManagerImpl::OnExceededTimeout() { + LOG4CXX_AUTO_TRACE(logger_); + update_status_manager_.OnUpdateTimeoutOccurs(); } @@ -1827,7 +2007,8 @@ void PolicyManagerImpl::OnUpdateStarted() { uint32_t update_timeout = TimeoutExchangeMSec(); LOG4CXX_DEBUG(logger_, "Update timeout will be set to (milisec): " << update_timeout); - send_on_update_sent_out_ = !update_status_manager_.IsUpdatePending(); + send_on_update_sent_out_ = + policy::kUpdating != update_status_manager_.StringifiedUpdateStatus(); if (send_on_update_sent_out_) { update_status_manager_.OnUpdateSentOut(update_timeout); @@ -1870,10 +2051,10 @@ bool PolicyManagerImpl::IsApplicationRevoked(const std::string& app_id) const { return cache_->IsApplicationRevoked(app_id); } -bool PolicyManagerImpl::IsConsentNeeded(const std::string& app_id) { +bool PolicyManagerImpl::IsConsentNeeded(const std::string& device_id, + const std::string& app_id) { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(app_id); - int count = cache_->CountUnconsentedGroups(app_id, device_id); + const int count = cache_->CountUnconsentedGroups(app_id, device_id); LOG4CXX_DEBUG(logger_, "There are: " << count << " unconsented groups."); return count != 0; } @@ -1883,7 +2064,7 @@ void PolicyManagerImpl::SetVINValue(const std::string& value) { } AppPermissions PolicyManagerImpl::GetAppPermissionsChanges( - const std::string& policy_app_id) { + const std::string& device_id, const std::string& policy_app_id) { PendingPermissions::iterator app_id_diff = app_permissions_diff_.find(policy_app_id); @@ -1892,8 +2073,10 @@ AppPermissions PolicyManagerImpl::GetAppPermissionsChanges( if (app_permissions_diff_.end() != app_id_diff) { permissions = app_id_diff->second; } else { - permissions.appPermissionsConsentNeeded = IsConsentNeeded(policy_app_id); + permissions.appPermissionsConsentNeeded = + IsConsentNeeded(device_id, policy_app_id); permissions.appRevoked = IsApplicationRevoked(policy_app_id); + permissions.isSDLAllowed = false; GetPriority(permissions.application_id, &permissions.priority); } return permissions; @@ -1921,9 +2104,11 @@ void PolicyManagerImpl::MarkUnpairedDevice(const std::string& device_id) { } void PolicyManagerImpl::OnAppRegisteredOnMobile( - const std::string& application_id) { - StartPTExchange(); - SendNotificationOnPermissionsUpdated(application_id); + const std::string& device_id, const std::string& application_id) { + if (!is_ptu_in_progress_) { + StartPTExchange(); + } + SendNotificationOnPermissionsUpdated(device_id, application_id); } void PolicyManagerImpl::OnDeviceSwitching(const std::string& device_id_from, @@ -2012,21 +2197,26 @@ class CallStatusChange : public utils::Callable { }; StatusNotifier PolicyManagerImpl::AddApplication( + const std::string& device_id, const std::string& application_id, const rpc::policy_table_interface_base::AppHmiTypes& hmi_types) { LOG4CXX_AUTO_TRACE(logger_); - const std::string device_id = GetCurrentDeviceId(application_id); - DeviceConsent device_consent = GetUserConsentForDevice(device_id); + auto device_consent = GetUserConsentForDevice(device_id); + LOG4CXX_DEBUG(logger_, + "check_device_id: " << device_id << " check_device_consent: " + << device_consent); sync_primitives::AutoLock lock(apps_registration_lock_); if (IsNewApplication(application_id)) { LOG4CXX_DEBUG(logger_, "Adding new application"); - AddNewApplication(application_id, device_consent); + AddNewApplication(device_id, application_id, device_consent); return std::make_shared<CallStatusChange>(update_status_manager_, device_consent); } LOG4CXX_DEBUG(logger_, "Promote existed application"); - PromoteExistedApplication(application_id, device_consent); - update_status_manager_.OnExistedApplicationAdded(cache_->UpdateRequired()); + PromoteExistedApplication(device_id, application_id, device_consent); + if (!ptu_requested_) { + update_status_manager_.OnExistedApplicationAdded(cache_->UpdateRequired()); + } return std::make_shared<utils::CallNothing>(); } @@ -2042,6 +2232,7 @@ bool PolicyManagerImpl::IsPredataPolicy( } void PolicyManagerImpl::ProcessExternalConsentStatusForApp( + const std::string& device_id, const std::string& application_id, const ConsentProcessingPolicy processing_policy) { ExternalConsentStatus status = cache_->GetExternalConsentStatus(); @@ -2053,7 +2244,7 @@ void PolicyManagerImpl::ProcessExternalConsentStatusForApp( CalculateGroupsConsentFromExternalConsent( groups_by_status, allowed_groups, disallowed_groups); - const std::string device_id = GetCurrentDeviceId(application_id); + LOG4CXX_DEBUG(logger_, "check device_id: " << device_id); UpdateAppConsentWithExternalConsent(device_id, application_id, allowed_groups, @@ -2061,7 +2252,8 @@ void PolicyManagerImpl::ProcessExternalConsentStatusForApp( processing_policy); } -void PolicyManagerImpl::AddNewApplication(const std::string& application_id, +void PolicyManagerImpl::AddNewApplication(const std::string& device_id, + const std::string& application_id, DeviceConsent device_consent) { LOG4CXX_AUTO_TRACE(logger_); @@ -2081,19 +2273,31 @@ void PolicyManagerImpl::AddNewApplication(const std::string& application_id, } ProcessExternalConsentStatusForApp( - application_id, ConsentProcessingPolicy::kExternalConsentBased); + device_id, + application_id, + ConsentProcessingPolicy::kExternalConsentBased); } void PolicyManagerImpl::PromoteExistedApplication( - const std::string& application_id, DeviceConsent device_consent) { + const std::string& device_id, + const std::string& application_id, + DeviceConsent device_consent) { // If device consent changed to allowed during application being // disconnected, app permissions should be changed also + LOG4CXX_DEBUG(logger_, + "kDeviceAllowed == device_consent: " + << (kDeviceAllowed == device_consent) + << " device_consent: " << device_consent); if (kDeviceAllowed == device_consent && cache_->IsPredataPolicy(application_id)) { + LOG4CXX_INFO(logger_, + "Setting " + << policy::kDefaultId + << " permissions for application id: " << application_id); cache_->SetDefaultPolicy(application_id); } - ProcessExternalConsentStatusForApp(application_id, - ConsentProcessingPolicy::kTimestampBased); + ProcessExternalConsentStatusForApp( + device_id, application_id, ConsentProcessingPolicy::kTimestampBased); } bool PolicyManagerImpl::IsNewApplication( @@ -2141,10 +2345,10 @@ bool PolicyManagerImpl::InitPT(const std::string& file_name, const bool ret = cache_->Init(file_name, settings); if (ret) { RefreshRetrySequence(); - std::vector<std::string> enabled_apps; - cache_->GetEnabledCloudApps(enabled_apps); - for (auto it = enabled_apps.begin(); it != enabled_apps.end(); ++it) { - SendAuthTokenUpdated(*it); + std::vector<std::string> enabled_cloud_apps; + cache_->GetEnabledCloudApps(enabled_cloud_apps); + for (auto app : enabled_cloud_apps) { + SendAuthTokenUpdated(app); } } return ret; @@ -2155,6 +2359,11 @@ uint32_t PolicyManagerImpl::HeartBeatTimeout(const std::string& app_id) const { } void PolicyManagerImpl::SaveUpdateStatusRequired(bool is_update_needed) { + LOG4CXX_AUTO_TRACE(logger_); + + if (!is_update_needed) { + ResetRetrySequence(ResetRetryCountType::kResetInternally); + } cache_->SaveUpdateRequired(is_update_needed); } @@ -2173,10 +2382,12 @@ std::ostream& operator<<(std::ostream& output, return output; } -void PolicyManagerImpl::SetDefaultHmiTypes(const std::string& application_id, - const std::vector<int>& hmi_types) { +void PolicyManagerImpl::SetDefaultHmiTypes( + const transport_manager::DeviceHandle& device_handle, + const std::string& application_id, + const std::vector<int>& hmi_types) { LOG4CXX_INFO(logger_, "SetDefaultHmiTypes"); - const std::string device_id = GetCurrentDeviceId(application_id); + const auto device_id = GetCurrentDeviceId(device_handle, application_id); ApplicationOnDevice who = {device_id, application_id}; access_remote_->SetDefaultHmiTypes(who, hmi_types); } @@ -2214,7 +2425,7 @@ bool PolicyManagerImpl::CheckModule(const PTString& app_id, void PolicyManagerImpl::SendHMILevelChanged(const ApplicationOnDevice& who) { std::string default_hmi("NONE"); - if (GetDefaultHmi(who.app_id, &default_hmi)) { + if (GetDefaultHmi(who.dev_id, who.app_id, &default_hmi)) { listener()->OnUpdateHMIStatus(who.dev_id, who.app_id, default_hmi); } else { LOG4CXX_WARN( @@ -2251,16 +2462,14 @@ void PolicyManagerImpl::SendAppPermissionsChanged( const std::string& device_id, const std::string& application_id) { Permissions notification_data; GetPermissions(device_id, application_id, ¬ification_data); - listener()->OnPermissionsUpdated(application_id, notification_data); + listener()->OnPermissionsUpdated( + device_id, application_id, notification_data); } void PolicyManagerImpl::SendAuthTokenUpdated(const std::string policy_app_id) { - bool enabled = false; - std::string end, cert, ctt, hap; - std::string auth_token; - cache_->GetCloudAppParameters( - policy_app_id, enabled, end, cert, auth_token, ctt, hap); - listener_->OnAuthTokenUpdated(policy_app_id, auth_token); + AppProperties app_properties; + cache_->GetAppProperties(policy_app_id, app_properties); + listener_->OnAuthTokenUpdated(policy_app_id, app_properties.auth_token); } void PolicyManagerImpl::OnPrimaryGroupsChanged( @@ -2288,4 +2497,104 @@ void PolicyManagerImpl::set_access_remote( access_remote_ = access_remote; } +bool PolicyManagerImpl::AppNeedEncryption( + const std::string& policy_app_id) const { + const auto encryption_required = + cache_->GetAppEncryptionRequiredFlag(policy_app_id); + + return encryption_required.is_initialized() ? *encryption_required : true; +} + +const rpc::Optional<rpc::Boolean> PolicyManagerImpl::GetAppEncryptionRequired( + const std::string& policy_app_id) const { + return cache_->GetAppEncryptionRequiredFlag(policy_app_id); +} + +const std::vector<std::string> PolicyManagerImpl::GetFunctionalGroupsForApp( + const std::string& policy_app_id) const { + LOG4CXX_AUTO_TRACE(logger_); + using namespace rpc::policy_table_interface_base; + DCHECK(kDeviceId != policy_app_id); + + std::vector<std::string> function_groups; + + ApplicationParams app_params; + cache_->GetApplicationParams(policy_app_id, app_params); + + const auto& policy_function_group = app_params.groups; + + for (const auto& group : policy_function_group) { + function_groups.push_back(group); + } + + return function_groups; +} + +const std::vector<std::string> PolicyManagerImpl::GetApplicationPolicyIDs() + const { + LOG4CXX_AUTO_TRACE(logger_); + std::vector<std::string> policy_app_ids; + + const auto apps = cache_->GetPolicyAppIDs(); + + for (const auto& app : apps) { + policy_app_ids.push_back(app); + } + + return policy_app_ids; +} + +bool PolicyManagerImpl::FunctionGroupNeedEncryption( + const std::string& policy_group) const { + LOG4CXX_AUTO_TRACE(logger_); + FunctionalGroupings functional_groupings; + cache_->GetFunctionalGroupings(functional_groupings); + + const auto& grouping_itr = functional_groupings.find(policy_group); + + if (grouping_itr == functional_groupings.end()) { + LOG4CXX_WARN(logger_, "Group " << policy_group << " not found"); + return false; + } + + const auto& grouping = (*grouping_itr).second; + + return grouping.encryption_required.is_initialized() + ? *grouping.encryption_required + : false; +} + +const std::string PolicyManagerImpl::GetPolicyFunctionName( + const uint32_t function_id) const { + LOG4CXX_AUTO_TRACE(logger_); + return policy_table::EnumToJsonString( + static_cast<policy_table::FunctionID>(function_id)); +} + +const std::vector<std::string> PolicyManagerImpl::GetRPCsForFunctionGroup( + const std::string& group) const { + std::vector<std::string> rpcs_for_group; + + FunctionalGroupings functional_groupings; + cache_->GetFunctionalGroupings(functional_groupings); + + const auto& rpcs = functional_groupings[group].rpcs; + + for (const auto& rpc : rpcs) { + rpcs_for_group.push_back(rpc.first); + } + + return rpcs_for_group; +} + } // namespace policy + +__attribute__((visibility("default"))) policy::PolicyManager* CreateManager() { + return new policy::PolicyManagerImpl(); +} + +__attribute__((visibility("default"))) void DeleteManager( + policy::PolicyManager* pm) { + delete pm; + DELETE_THREAD_LOGGER(policy::logger_); +} |