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 | 194 |
1 files changed, 128 insertions, 66 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 15900f0187..c11bdefb90 100644 --- a/src/components/policy/policy_external/src/policy_manager_impl.cc +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -53,10 +53,12 @@ #include "policy/access_remote.h" #include "policy/access_remote_impl.h" -policy::PolicyManager* CreateManager() { +__attribute__((visibility("default"))) policy::PolicyManager* CreateManager() { return new policy::PolicyManagerImpl(); } -void DeleteManager(policy::PolicyManager* pm) { + +__attribute__((visibility("default"))) void DeleteManager( + policy::PolicyManager* pm) { delete pm; } namespace { @@ -491,6 +493,8 @@ bool PolicyManagerImpl::LoadPT(const std::string& file, ProcessAppPolicyCheckResults( results, pt_update->policy_table.app_policies_section.apps); + CheckPermissionsChangesAfterUpdate(*pt_update, *policy_table_snapshot); + listener_->OnCertificateUpdated( *(pt_update->policy_table.module_config.certificate)); @@ -538,6 +542,17 @@ CheckAppPolicyResults PolicyManagerImpl::CheckPermissionsChanges( return out_results; } +void PolicyManagerImpl::CheckPermissionsChangesAfterUpdate( + const policy_table::Table& update, const policy_table::Table& snapshot) { + const auto new_lock_screen_dismissal_enabled = + update.policy_table.module_config.lock_screen_dismissal_enabled; + const auto old_lock_screen_dismissal_enabled = + snapshot.policy_table.module_config.lock_screen_dismissal_enabled; + if (new_lock_screen_dismissal_enabled != old_lock_screen_dismissal_enabled) { + listener()->OnLockScreenDismissalStateChanged(); + } +} + void PolicyManagerImpl::ProcessAppPolicyCheckResults( const CheckAppPolicyResults& results, const policy_table::ApplicationPolicies& app_policies) { @@ -552,33 +567,35 @@ 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); + 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_); + 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) { + NotifySystem(device_id, *app_policy); + } + + if (action.second.is_send_permissions_to_app) { + SendPermissionsToApp(device_id, *app_policy); + } } } } @@ -702,10 +719,11 @@ void PolicyManagerImpl::OnAppsSearchCompleted(const bool trigger_ptu) { } 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); @@ -805,7 +823,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, @@ -814,8 +833,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 @@ -985,9 +1002,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 " @@ -1015,15 +1031,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() { @@ -1056,14 +1073,16 @@ void PolicyManagerImpl::SetUserConsentForDevice(const std::string& device_id, } 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) { + auto 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); + auto 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()); @@ -1088,7 +1107,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; } @@ -1206,6 +1226,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_); @@ -1221,7 +1242,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( @@ -1260,14 +1281,15 @@ 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::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 @@ -1372,11 +1394,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; } @@ -1460,9 +1484,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_; } @@ -1566,15 +1592,16 @@ void PolicyManagerImpl::UpdateAppConsentWithExternalConsent( } 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); @@ -1597,6 +1624,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)); @@ -1738,6 +1766,19 @@ void PolicyManagerImpl::KmsChanged(int kilometers) { } } +const boost::optional<bool> PolicyManagerImpl::LockScreenDismissalEnabledState() + const { + LOG4CXX_AUTO_TRACE(logger_); + return cache_->LockScreenDismissalEnabledState(); +} + +const boost::optional<std::string> +PolicyManagerImpl::LockScreenDismissalWarningMessage( + const std::string& language) const { + LOG4CXX_AUTO_TRACE(logger_); + return cache_->LockScreenDismissalWarningMessage(language); +} + void PolicyManagerImpl::IncrementIgnitionCycles() { cache_->IncrementIgnitionCycles(); } @@ -1844,10 +1885,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; } @@ -1857,7 +1898,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); @@ -1866,7 +1907,8 @@ 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); GetPriority(permissions.application_id, &permissions.priority); } @@ -1895,9 +1937,9 @@ void PolicyManagerImpl::MarkUnpairedDevice(const std::string& device_id) { } void PolicyManagerImpl::OnAppRegisteredOnMobile( - const std::string& application_id) { + const std::string& device_id, const std::string& application_id) { StartPTExchange(); - SendNotificationOnPermissionsUpdated(application_id); + SendNotificationOnPermissionsUpdated(device_id, application_id); } void PolicyManagerImpl::OnDeviceSwitching(const std::string& device_id_from, @@ -1986,20 +2028,23 @@ 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); + PromoteExistedApplication(device_id, application_id, device_consent); update_status_manager_.OnExistedApplicationAdded(cache_->UpdateRequired()); return std::make_shared<utils::CallNothing>(); } @@ -2016,6 +2061,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(); @@ -2027,7 +2073,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, @@ -2035,7 +2081,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_); @@ -2055,19 +2102,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( @@ -2147,10 +2206,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); } @@ -2188,7 +2249,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( @@ -2225,7 +2286,8 @@ 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) { |