| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Access; |
|
|
| use Exception; |
| use Piwik\CacheId; |
| use Piwik\Piwik; |
| use Piwik\Cache as PiwikCache; |
|
|
| class CapabilitiesProvider |
| { |
| |
| |
| |
| |
| public function getAllCapabilities(): array |
| { |
| $cacheId = CacheId::siteAware(CacheId::languageAware('Capabilities')); |
| $cache = PiwikCache::getTransientCache(); |
|
|
| if (!$cache->contains($cacheId)) { |
| |
| $capabilities = []; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Piwik::postEvent('Access.Capability.addCapabilities', array(&$capabilities)); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Piwik::postEvent('Access.Capability.filterCapabilities', array(&$capabilities)); |
|
|
| $capabilities = \array_values($capabilities); |
|
|
| $this->checkCapabilityIds($capabilities); |
|
|
| $cache->save($cacheId, $capabilities); |
| return $capabilities; |
| } |
|
|
| |
| return $cache->fetch($cacheId); |
| } |
|
|
| |
| |
| |
| public function getCapability(string $capabilityId): ?Capability |
| { |
| foreach ($this->getAllCapabilities() as $capability) { |
| if ($capabilityId === $capability->getId()) { |
| return $capability; |
| } |
| } |
|
|
| return null; |
| } |
|
|
| |
| |
| |
| |
| public function getAllCapabilityIds(): array |
| { |
| $ids = array(); |
| foreach ($this->getAllCapabilities() as $capability) { |
| $ids[] = $capability->getId(); |
| } |
| return $ids; |
| } |
|
|
| |
| |
| |
| public function isValidCapability(string $capabilityId): bool |
| { |
| $capabilities = $this->getAllCapabilityIds(); |
|
|
| return \in_array($capabilityId, $capabilities, true); |
| } |
|
|
| |
| |
| |
| public function checkValidCapability(string $capabilityId): void |
| { |
| if (!$this->isValidCapability($capabilityId)) { |
| $capabilities = $this->getAllCapabilityIds(); |
| throw new \Exception(Piwik::translate("UsersManager_ExceptionAccessValues", implode(", ", $capabilities))); |
| } |
| } |
|
|
| |
| |
| |
| |
| private function checkCapabilityIds(array $capabilities): void |
| { |
| foreach ($capabilities as $capability) { |
| $id = $capability->getId(); |
| if (preg_match('/[^a-zA-Z0-9_-]/', $id)) { |
| throw new \Exception("Capability with invalid ID found: '$id'. Valid characters are 'a-zA-Z0-9_-'."); |
| } |
| } |
| } |
| } |
|
|