PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / trunk
Matomo Analytics – Powerful, Privacy-First Insights for WordPress vtrunk
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 1 month ago CompliancePolicy.php 3 months ago PolicyManager.php 1 month ago
PolicyManager.php
205 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 public static function getSettingTypeFromSettingClass(Setting $setting) : ?string
167 {
168 $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];
169 foreach ($map as $class => $type) {
170 if ($setting instanceof $class) {
171 return $type;
172 }
173 }
174 return null;
175 }
176 /**
177 * For a given setting name, return an information on policies that may control the setting and its required value.
178 *
179 * @return array<string, array{
180 * requiredValue: mixed
181 * }>
182 * @throws Exception
183 */
184 public static function getCompliancePoliciesControllingASetting(string $settingName, ?int $idSite = null, ?string $settingType = null) : array
185 {
186 if (!$settingType || !in_array($settingType, array_keys(self::$settingTypesMap), \true)) {
187 return [];
188 }
189 $policies = static::getAllPolicies();
190 $settings = [];
191 foreach ($policies as $policyClass) {
192 if (\false === $policyClass::isActive($idSite)) {
193 continue;
194 }
195 $controlledSettings = self::getAllControlledSettings($policyClass, $idSite, $settingType);
196 foreach ($controlledSettings as $controlledSetting) {
197 if ($settingName === call_user_func([$controlledSetting, self::$settingTypesMap[$settingType]['method']])) {
198 $settings[$policyClass::getName()] = ['requiredValue' => $controlledSetting::getPolicyRequirements()[$policyClass]];
199 }
200 }
201 }
202 return $settings;
203 }
204 }
205