PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.8.2
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.8.2
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / Policy / PolicyManager.php
matomo / app / core / Policy Last commit date
Exceptions 6 months ago CnilPolicy.php 3 months ago CompliancePolicy.php 3 months ago PolicyManager.php 3 months ago
PolicyManager.php
206 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 */
9 namespace Piwik\Policy;
10
11 use Exception;
12 use Piwik\Tracker\Cache;
13 use Piwik\Plugin\Manager;
14 use Piwik\Policy\Exceptions\CompliancePolicyNotFoundException;
15 use Piwik\Settings\Interfaces\PolicyComparisonInterface;
16 use Piwik\Settings\Interfaces\SettingValueInterface;
17 use Piwik\Settings\Interfaces\Traits\Getters\ConfigGetterTrait;
18 use Piwik\Settings\Interfaces\Traits\Getters\CustomGetterTrait;
19 use Piwik\Settings\Interfaces\Traits\Getters\MeasurableGetterTrait;
20 use Piwik\Settings\Interfaces\Traits\Getters\OptionGetterTrait;
21 use Piwik\Settings\Interfaces\Traits\Getters\SystemGetterTrait;
22 use Piwik\Settings\Measurable\MeasurableProperty;
23 use Piwik\Settings\Measurable\MeasurableSetting;
24 use Piwik\Settings\Plugin\SystemConfigSetting;
25 use Piwik\Settings\Plugin\SystemSetting;
26 use Piwik\Settings\Setting;
27 use Piwik\Tracker\Config\ThirdPartyCookies;
28 class PolicyManager
29 {
30 public const SETTING_TYPE_SYSTEM = 'system';
31 public const SETTING_TYPE_MEASURABLE = 'measurable';
32 public const SETTING_TYPE_CUSTOM = 'custom';
33 public const SETTING_TYPE_OPTION = 'option';
34 public const SETTING_TYPE_CONFIG = 'config';
35 // TODO: In Matomo 6, get*Name methods will change visibility from protected to public,
36 // so we will need to replace the method names here
37 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']];
38 /**
39 * @return array<class-string<CompliancePolicy>>
40 */
41 public static function getAllPolicies() : array
42 {
43 return [\Piwik\Policy\CnilPolicy::class];
44 }
45 /**
46 * @return array<array<string, string>>
47 */
48 public static function getAllPoliciesDetails() : array
49 {
50 $policies = static::getAllPolicies();
51 return array_map(function ($policyClass) {
52 return $policyClass::getDetails();
53 }, $policies);
54 }
55 /**
56 * @return class-string<CompliancePolicy>|null
57 */
58 public static function getPolicyByName(string $policyName) : ?string
59 {
60 $policies = static::getAllPolicies();
61 foreach ($policies as $policyClass) {
62 if ($policyName === $policyClass::getName()) {
63 return $policyClass;
64 }
65 }
66 return null;
67 }
68 /**
69 * @return array<class-string<PolicyComparisonInterface<mixed>&SettingValueInterface<mixed>>>
70 */
71 protected static function getAllSettings(?string $settingType = null) : array
72 {
73 $settings = Manager::getInstance()->findMultipleComponents('Settings', SettingValueInterface::class);
74 $underPolicy = [];
75 // Add core specific settings
76 $settings[] = ThirdPartyCookies::class;
77 foreach ($settings as $setting) {
78 if (!is_a($setting, PolicyComparisonInterface::class, \true)) {
79 continue;
80 }
81 if ($settingType && !in_array(self::$settingTypesMap[$settingType]['trait'], class_uses($setting), \true)) {
82 continue;
83 }
84 $underPolicy[] = $setting;
85 }
86 return $underPolicy;
87 }
88 /**
89 * @param class-string<CompliancePolicy> $policyClass
90 * @return array<class-string<PolicyComparisonInterface<mixed>&SettingValueInterface<mixed>>>
91 */
92 public static function getAllControlledSettings(string $policyClass, ?int $idSite = null, ?string $settingType = null) : array
93 {
94 $settings = static::getAllSettings($settingType);
95 $underPolicy = [];
96 foreach ($settings as $setting) {
97 if (!$setting::isControlledBySpecificPolicy($policyClass, $idSite)) {
98 continue;
99 }
100 $underPolicy[] = $setting;
101 }
102 return $underPolicy;
103 }
104 /**
105 * @param class-string<CompliancePolicy> $policyClass
106 * @throws CompliancePolicyNotFoundException when $policyClass is not a valid policy
107 */
108 public static function isPolicyActive(string $policyClass, ?int $idSite = null) : bool
109 {
110 self::checkPolicyIsValid($policyClass);
111 return $policyClass::isActive($idSite);
112 }
113 /**
114 * @param class-string<CompliancePolicy> $policyClass
115 * @throws \Exception when $policyClass is not a valid policy
116 */
117 public static function isPolicyConfigControlled(string $policyClass) : bool
118 {
119 self::checkPolicyIsValid($policyClass);
120 return $policyClass::isConfigControlled();
121 }
122 /**
123 * @param class-string<CompliancePolicy> $policyClass
124 * @return array<array<string>> of [['title' => (string) 'TITLE', 'note' => (string) 'NOTE']]
125 * @throws CompliancePolicyNotFoundException when $policyClass is not a valid policy
126 */
127 public static function getAllUnknownSettings(string $policyClass) : array
128 {
129 self::checkPolicyIsValid($policyClass);
130 return $policyClass::getUnknownSettings();
131 }
132 /**
133 * @param class-string<CompliancePolicy> $policyClass
134 * @throws CompliancePolicyNotFoundException when $policyClass is not a valid policy
135 */
136 private static function checkPolicyIsValid(string $policyClass) : void
137 {
138 if (!is_a($policyClass, \Piwik\Policy\CompliancePolicy::class, \true)) {
139 throw new CompliancePolicyNotFoundException('Invalid compliance policy.');
140 }
141 }
142 /**
143 * @param class-string<CompliancePolicy> $policyClass
144 * @throws CompliancePolicyNotFoundException when $policyClass is not a valid policy
145 */
146 public static function setPolicyActiveStatus(string $policyClass, bool $isActive, ?int $idSite = null) : void
147 {
148 self::checkPolicyIsValid($policyClass);
149 $policyClass::setActiveStatus($idSite, $isActive);
150 if (!is_null($idSite)) {
151 Cache::deleteCacheWebsiteAttributes($idSite);
152 }
153 Cache::deleteTrackerCache();
154 }
155 public static function storePolicySettingValuesInTrackerCache(array &$cacheContent, int $idSite) : array
156 {
157 $settings = static::getAllSettings();
158 foreach ($settings as $setting) {
159 $cacheContent[$setting] = $setting::getInstance($idSite)->getValue();
160 }
161 return $cacheContent;
162 }
163 /**
164 * Return setting type from a given Setting instance, including subclasses
165 *
166 */
167 public static function getSettingTypeFromSettingClass(Setting $setting) : ?string
168 {
169 $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];
170 foreach ($map as $class => $type) {
171 if ($setting instanceof $class) {
172 return $type;
173 }
174 }
175 return null;
176 }
177 /**
178 * For a given setting name, return an information on policies that may control the setting and its required value.
179 *
180 * @return array<string, array{
181 * requiredValue: mixed
182 * }>
183 * @throws Exception
184 */
185 public static function getCompliancePoliciesControllingASetting(string $settingName, ?int $idSite = null, ?string $settingType = null) : array
186 {
187 if (!$settingType || !in_array($settingType, array_keys(self::$settingTypesMap), \true)) {
188 return [];
189 }
190 $policies = static::getAllPolicies();
191 $settings = [];
192 foreach ($policies as $policyClass) {
193 if (\false === $policyClass::isActive($idSite)) {
194 continue;
195 }
196 $controlledSettings = self::getAllControlledSettings($policyClass, $idSite, $settingType);
197 foreach ($controlledSettings as $controlledSetting) {
198 if ($settingName === call_user_func([$controlledSetting, self::$settingTypesMap[$settingType]['method']])) {
199 $settings[$policyClass::getName()] = ['requiredValue' => $controlledSetting::getPolicyRequirements()[$policyClass]];
200 }
201 }
202 }
203 return $settings;
204 }
205 }
206