diff --git a/system/config/permissions.yaml b/system/config/permissions.yaml new file mode 100644 index 000000000..a65b2231f --- /dev/null +++ b/system/config/permissions.yaml @@ -0,0 +1,53 @@ +actions: + site: + type: access + label: Site + admin: + type: access + label: Admin + admin.pages: + type: access + label: Pages + admin.users: + type: access + label: User Accounts + +types: + default: + type: access + + crud: + type: compact + letters: + c: + action: create + label: PLUGIN_ADMIN.CREATE + r: + action: read + label: PLUGIN_ADMIN.READ + u: + action: update + label: PLUGIN_ADMIN.UPDATE + d: + action: delete + label: PLUGIN_ADMIN.DELETE + + crudp: + type: crud + letters: + p: + action: publish + label: PLUGIN_ADMIN.PUBLISH + + crudl: + type: crud + letters: + l: + action: list + label: PLUGIN_ADMIN.LIST + + crudpl: + type: crud + use: + - crudp + - crudl diff --git a/system/src/Grav/Common/Service/AccountsServiceProvider.php b/system/src/Grav/Common/Service/AccountsServiceProvider.php index 82153580d..9167bd3f3 100644 --- a/system/src/Grav/Common/Service/AccountsServiceProvider.php +++ b/system/src/Grav/Common/Service/AccountsServiceProvider.php @@ -16,8 +16,9 @@ use Grav\Common\Page\Header; use Grav\Common\Page\Interfaces\PageInterface; use Grav\Common\User\DataUser; use Grav\Common\User\User; -use Grav\Framework\Acl\Events\RegisterPermissionsEvent; +use Grav\Events\RegisterPermissionsEvent; use Grav\Framework\Acl\Permissions; +use Grav\Framework\Acl\PermissionsReader; use Grav\Framework\Flex\Flex; use Grav\Framework\Flex\FlexDirectory; use Pimple\Container; @@ -30,7 +31,18 @@ class AccountsServiceProvider implements ServiceProviderInterface public function register(Container $container) { $container['permissions'] = static function (Grav $container) { + /** @var Config $config */ + $config = $container['config']; + $permissions = new Permissions(); + $permissions->addTypes($config->get('permissions.types', [])); + + $array = $config->get('permissions.actions'); + if (is_array($array)) { + $actions = PermissionsReader::fromArray($array, $permissions->getTypes()); + $permissions->addActions($actions); + } + $event = new RegisterPermissionsEvent($permissions); $container->dispatchEvent($event); diff --git a/system/src/Grav/Framework/Acl/Events/RegisterPermissionsEvent.php b/system/src/Grav/Events/RegisterPermissionsEvent.php similarity index 84% rename from system/src/Grav/Framework/Acl/Events/RegisterPermissionsEvent.php rename to system/src/Grav/Events/RegisterPermissionsEvent.php index 85e97b6ed..3556a0bee 100644 --- a/system/src/Grav/Framework/Acl/Events/RegisterPermissionsEvent.php +++ b/system/src/Grav/Events/RegisterPermissionsEvent.php @@ -1,13 +1,13 @@ instances; } + /** + * @param string $name + * @return bool + */ public function hasAction(string $name): bool { return isset($this->instances[$name]); @@ -77,6 +83,48 @@ class Permissions implements \ArrayAccess, \Countable, \IteratorAggregate } } + /** + * @param string $name + * @return bool + */ + public function hasType(string $name): bool + { + return isset($this->types[$name]); + } + + /** + * @param string $name + * @return Action|null + */ + public function getType(string $name): ?Action + { + return $this->types[$name] ?? null; + } + + /** + * @param array $type + */ + public function addType(string $name, array $type): void + { + $this->types[$name] = $type; + } + + /** + * @return array + */ + public function getTypes(): array + { + return $this->types; + } + + /** + * @param array $types + */ + public function addTypes(array $types): void + { + $this->types = array_replace($this->types, $types); + } + /** * @param array|null $access * @return Access