| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Policy; |
|
|
| use Exception; |
| use Piwik\Tracker\Cache; |
| use Piwik\Plugin\Manager; |
| use Piwik\Policy\Exceptions\CompliancePolicyNotFoundException; |
| use Piwik\Settings\Interfaces\PolicyComparisonInterface; |
| use Piwik\Settings\Interfaces\SettingValueInterface; |
| use Piwik\Settings\Interfaces\Traits\Getters\ConfigGetterTrait; |
| use Piwik\Settings\Interfaces\Traits\Getters\CustomGetterTrait; |
| use Piwik\Settings\Interfaces\Traits\Getters\MeasurableGetterTrait; |
| use Piwik\Settings\Interfaces\Traits\Getters\OptionGetterTrait; |
| use Piwik\Settings\Interfaces\Traits\Getters\SystemGetterTrait; |
| use Piwik\Settings\Measurable\MeasurableProperty; |
| use Piwik\Settings\Measurable\MeasurableSetting; |
| use Piwik\Settings\Plugin\SystemConfigSetting; |
| use Piwik\Settings\Plugin\SystemSetting; |
| use Piwik\Settings\Setting; |
| use Piwik\Tracker\Config\ThirdPartyCookies; |
|
|
| class PolicyManager |
| { |
| public const SETTING_TYPE_SYSTEM = 'system'; |
| public const SETTING_TYPE_MEASURABLE = 'measurable'; |
| public const SETTING_TYPE_CUSTOM = 'custom'; |
| public const SETTING_TYPE_OPTION = 'option'; |
| public const SETTING_TYPE_CONFIG = 'config'; |
|
|
| |
| |
| private static $settingTypesMap = [ |
| self::SETTING_TYPE_SYSTEM => [ |
| 'trait' => SystemGetterTrait::class, |
| 'method' => 'getSystemSettingShortName', |
| ], |
| self::SETTING_TYPE_MEASURABLE => [ |
| 'trait' => MeasurableGetterTrait::class, |
| 'method' => 'getMeasurableSettingShortName', |
| ], |
| self::SETTING_TYPE_CUSTOM => [ |
| 'trait' => CustomGetterTrait::class, |
| 'method' => 'getCustomSettingShortName', |
| ], |
| self::SETTING_TYPE_OPTION => [ |
| 'trait' => OptionGetterTrait::class, |
| 'method' => 'getOptionSettingShortName', |
| ], |
| self::SETTING_TYPE_CONFIG => [ |
| 'trait' => ConfigGetterTrait::class, |
| 'method' => 'getConfigSettingShortName', |
| ], |
| ]; |
|
|
| |
| |
| |
| public static function getAllPolicies(): array |
| { |
| return [ |
| CnilPolicy::class, |
| ]; |
| } |
|
|
| |
| |
| |
| public static function getAllPoliciesDetails(): array |
| { |
| $policies = static::getAllPolicies(); |
| return array_map(function ($policyClass) { |
| return $policyClass::getDetails(); |
| }, $policies); |
| } |
|
|
| |
| |
| |
| public static function getPolicyByName(string $policyName): ?string |
| { |
| $policies = static::getAllPolicies(); |
| foreach ($policies as $policyClass) { |
| if ($policyName === $policyClass::getName()) { |
| return $policyClass; |
| } |
| } |
|
|
| return null; |
| } |
|
|
| |
| |
| |
| protected static function getAllSettings(?string $settingType = null): array |
| { |
| $settings = Manager::getInstance()->findMultipleComponents('Settings', SettingValueInterface::class); |
| $underPolicy = []; |
|
|
| |
| $settings[] = ThirdPartyCookies::class; |
|
|
| foreach ($settings as $setting) { |
| if (!is_a($setting, PolicyComparisonInterface::class, true)) { |
| continue; |
| } |
| if ($settingType && !in_array(self::$settingTypesMap[$settingType]['trait'], class_uses($setting), true)) { |
| continue; |
| } |
|
|
| $underPolicy[] = $setting; |
| } |
|
|
| return $underPolicy; |
| } |
|
|
| |
| |
| |
| |
| public static function getAllControlledSettings(string $policyClass, ?int $idSite = null, ?string $settingType = null): array |
| { |
| $settings = static::getAllSettings($settingType); |
| $underPolicy = []; |
|
|
| foreach ($settings as $setting) { |
| if (!$setting::isControlledBySpecificPolicy($policyClass, $idSite)) { |
| continue; |
| } |
|
|
| $underPolicy[] = $setting; |
| } |
|
|
| return $underPolicy; |
| } |
|
|
| |
| |
| |
| |
| public static function isPolicyActive(string $policyClass, ?int $idSite = null): bool |
| { |
| self::checkPolicyIsValid($policyClass); |
| return $policyClass::isActive($idSite); |
| } |
|
|
| |
| |
| |
| |
| public static function isPolicyConfigControlled(string $policyClass): bool |
| { |
| self::checkPolicyIsValid($policyClass); |
| return $policyClass::isConfigControlled(); |
| } |
|
|
| |
| |
| |
| |
| |
| public static function getAllUnknownSettings(string $policyClass): array |
| { |
| self::checkPolicyIsValid($policyClass); |
| return $policyClass::getUnknownSettings(); |
| } |
|
|
| |
| |
| |
| |
| |
| private static function checkPolicyIsValid(string $policyClass): void |
| { |
| if (!is_a($policyClass, CompliancePolicy::class, true)) { |
| throw new CompliancePolicyNotFoundException('Invalid compliance policy.'); |
| } |
| } |
|
|
| |
| |
| |
| |
| public static function setPolicyActiveStatus(string $policyClass, bool $isActive, ?int $idSite = null): void |
| { |
| self::checkPolicyIsValid($policyClass); |
| $policyClass::setActiveStatus($idSite, $isActive); |
| if (!is_null($idSite)) { |
| Cache::deleteCacheWebsiteAttributes($idSite); |
| } |
| Cache::deleteTrackerCache(); |
| } |
|
|
| public static function storePolicySettingValuesInTrackerCache(array &$cacheContent, int $idSite): array |
| { |
| $settings = static::getAllSettings(); |
| foreach ($settings as $setting) { |
| $cacheContent[$setting] = $setting::getInstance($idSite)->getValue(); |
| } |
| return $cacheContent; |
| } |
|
|
| |
| |
| |
| public static function getSettingTypeFromSettingClass(Setting $setting): ?string |
| { |
| $map = [ |
| MeasurableSetting::class => self::SETTING_TYPE_MEASURABLE, |
| MeasurableProperty::class => self::SETTING_TYPE_MEASURABLE, |
| SystemSetting::class => self::SETTING_TYPE_SYSTEM, |
| SystemConfigSetting::class => self::SETTING_TYPE_CONFIG, |
| ]; |
|
|
| foreach ($map as $class => $type) { |
| if ($setting instanceof $class) { |
| return $type; |
| } |
| } |
|
|
| return null; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public static function getCompliancePoliciesControllingASetting(string $settingName, ?int $idSite = null, ?string $settingType = null): array |
| { |
| if (!$settingType || !in_array($settingType, array_keys(self::$settingTypesMap), true)) { |
| return []; |
| } |
|
|
| $policies = static::getAllPolicies(); |
| $settings = []; |
|
|
| foreach ($policies as $policyClass) { |
| if (false === $policyClass::isActive($idSite)) { |
| continue; |
| } |
| $controlledSettings = self::getAllControlledSettings($policyClass, $idSite, $settingType); |
|
|
| foreach ($controlledSettings as $controlledSetting) { |
| if ($settingName === call_user_func([$controlledSetting, self::$settingTypesMap[$settingType]['method']])) { |
| $settings[$policyClass::getName()] = [ |
| 'requiredValue' => $controlledSetting::getPolicyRequirements()[$policyClass], |
| ]; |
| } |
| } |
| } |
|
|
| return $settings; |
| } |
| } |
|
|