PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.6.0
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.6.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 8 months ago CompliancePolicy.php 8 months ago PolicyManager.php 8 months ago
PolicyManager.php
208 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 class PolicyManager
28 {
29 public const SETTING_TYPE_SYSTEM = 'system';
30 public const SETTING_TYPE_MEASURABLE = 'measurable';
31 public const SETTING_TYPE_CUSTOM = 'custom';
32 public const SETTING_TYPE_OPTION = 'option';
33 public const SETTING_TYPE_CONFIG = 'config';
34 // TODO: In Matomo 6, get*Name methods will change visibility from protected to public,
35 // so we will need to replace the method names here
36 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']];
37 /**
38 * @return array<class-string<CompliancePolicy>>
39 */
40 public static function getAllPolicies() : array
41 {
42 return [\Piwik\Policy\CnilPolicy::class];
43 }
44 /**
45 * @return array<array<string, string>>
46 */
47 public static function getAllPoliciesDetails() : array
48 {
49 $policies = static::getAllPolicies();
50 return array_map(function ($policyClass) {
51 return $policyClass::getDetails();
52 }, $policies);
53 }
54 /**
55 * @return class-string<CompliancePolicy>|null
56 */
57 public static function getPolicyByName(string $policyName) : ?string
58 {
59 $policies = static::getAllPolicies();
60 foreach ($policies as $policyClass) {
61 if ($policyName === $policyClass::getName()) {
62 return $policyClass;
63 }
64 }
65 return null;
66 }
67 /**
68 * @return array<class-string<PolicyComparisonInterface<mixed>&SettingValueInterface<mixed>>>
69 */
70 protected static function getAllSettings(?string $settingType = null) : array
71 {
72 $settings = Manager::getInstance()->findMultipleComponents('Settings', SettingValueInterface::class);
73 $underPolicy = [];
74 foreach ($settings as $setting) {
75 if (!is_a($setting, PolicyComparisonInterface::class, \true)) {
76 continue;
77 }
78 if ($settingType && !in_array(self::$settingTypesMap[$settingType]['trait'], class_uses($setting), \true)) {
79 continue;
80 }
81 $underPolicy[] = $setting;
82 }
83 return $underPolicy;
84 }
85 /**
86 * @param class-string<CompliancePolicy> $policyClass
87 * @return array<class-string<PolicyComparisonInterface<mixed>&SettingValueInterface<mixed>>>
88 */
89 public static function getAllControlledSettings(string $policyClass, ?int $idSite = null, ?string $settingType = null) : array
90 {
91 $settings = static::getAllSettings($settingType);
92 $underPolicy = [];
93 foreach ($settings as $setting) {
94 if (!$setting::isControlledBySpecificPolicy($policyClass, $idSite)) {
95 continue;
96 }
97 $underPolicy[] = $setting;
98 }
99 return $underPolicy;
100 }
101 /**
102 * @param class-string<CompliancePolicy> $policyClass
103 * @throws CompliancePolicyNotFoundException when $policyClass is not a valid policy
104 */
105 public static function isPolicyActive(string $policyClass, ?int $idSite = null) : bool
106 {
107 self::checkPolicyIsValid($policyClass);
108 return $policyClass::isActive($idSite);
109 }
110 /**
111 * @param class-string<CompliancePolicy> $policyClass
112 * @throws \Exception when $policyClass is not a valid policy
113 */
114 public static function isPolicyConfigControlled(string $policyClass) : bool
115 {
116 self::checkPolicyIsValid($policyClass);
117 return $policyClass::isConfigControlled();
118 }
119 /**
120 * @param class-string<CompliancePolicy> $policyClass
121 * @return array<array<string>> of [['title' => (string) 'TITLE', 'note' => (string) 'NOTE']]
122 * @throws CompliancePolicyNotFoundException when $policyClass is not a valid policy
123 */
124 public static function getAllUnknownSettings(string $policyClass) : array
125 {
126 self::checkPolicyIsValid($policyClass);
127 return $policyClass::getUnknownSettings();
128 }
129 /**
130 * @param class-string<CompliancePolicy> $policyClass
131 * @throws CompliancePolicyNotFoundException when $policyClass is not a valid policy
132 */
133 private static function checkPolicyIsValid(string $policyClass) : void
134 {
135 if (!is_a($policyClass, \Piwik\Policy\CompliancePolicy::class, \true)) {
136 throw new CompliancePolicyNotFoundException('Invalid compliance policy.');
137 }
138 }
139 /**
140 * @param class-string<CompliancePolicy> $policyClass
141 * @throws CompliancePolicyNotFoundException when $policyClass is not a valid policy
142 */
143 public static function setPolicyActiveStatus(string $policyClass, bool $isActive, ?int $idSite = null) : void
144 {
145 self::checkPolicyIsValid($policyClass);
146 $policyClass::setActiveStatus($idSite, $isActive);
147 if (!is_null($idSite)) {
148 Cache::deleteCacheWebsiteAttributes($idSite);
149 }
150 Cache::deleteTrackerCache();
151 }
152 public static function storePolicySettingValuesInTrackerCache(array &$cacheContent, int $idSite) : array
153 {
154 $settings = static::getAllSettings();
155 foreach ($settings as $setting) {
156 $cacheContent[$setting] = $setting::getInstance($idSite)->getValue();
157 }
158 return $cacheContent;
159 }
160 /**
161 * Return setting type from a given Setting instance, including subclasses
162 *
163 * @param Setting $setting
164 * @return string|null
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 * @param string $settingName
180 * @param int|null $idSite
181 * @param string|null $settingType
182 * @return array<string, array{
183 * requiredValue: mixed
184 * }>
185 * @throws Exception
186 */
187 public static function getCompliancePoliciesControllingASetting(string $settingName, ?int $idSite = null, ?string $settingType = null) : array
188 {
189 if (!$settingType || !in_array($settingType, array_keys(self::$settingTypesMap), \true)) {
190 return [];
191 }
192 $policies = static::getAllPolicies();
193 $settings = [];
194 foreach ($policies as $policyClass) {
195 if (\false === $policyClass::isActive($idSite)) {
196 continue;
197 }
198 $controlledSettings = self::getAllControlledSettings($policyClass, $idSite, $settingType);
199 foreach ($controlledSettings as $controlledSetting) {
200 if ($settingName === call_user_func([$controlledSetting, self::$settingTypesMap[$settingType]['method']])) {
201 $settings[$policyClass::getName()] = ['requiredValue' => $controlledSetting::getPolicyRequirements()[$policyClass]];
202 }
203 }
204 }
205 return $settings;
206 }
207 }
208