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