diff --git a/src/mibew/libs/classes/Mibew/AccessControl/Check/PermissionsCheck.php b/src/mibew/libs/classes/Mibew/AccessControl/Check/PermissionsCheck.php new file mode 100644 index 00000000..9e53f658 --- /dev/null +++ b/src/mibew/libs/classes/Mibew/AccessControl/Check/PermissionsCheck.php @@ -0,0 +1,95 @@ + + * test: + * path: /test + * defaults: + * _controller: Mibew\Controller\TestController::testAction + * # Set check for the route + * _access_check: Mibew\AccessControl\Check\PermissionsCheck + * # Define array of permissions. An operator should has all these + * # permissions to access the route + * _access_permissions: [CAN_ADMINISTRATE, CAN_MODIFYPROFILE] + * + */ +class PermissionsCheck extends LoggedInCheck +{ + /** + * Checks the access. + * + * @param Request $request Incoming request + * @return boolean Indicates if an operator has access or not. + */ + public function __invoke(Request $request) + { + // Check if the operator is logged in + if (!parent::__invoke($request)) { + return false; + } + + $operator = $request->attributes->get('_operator'); + $permissions = $request->attributes->get('_access_permissions', array()); + foreach ($permissions as $permission) { + if (!is_capable($this->resolvePermission($permission), $operator)) { + return false; + } + } + + return true; + } + + /** + * Resolves permission name and returns its code. + * + * @param string $permission_name Name of permission. Can be one of + * "CAN_ADMINISTRATE", "CAN_TAKEOVER", "CAN_VIEWTHREADS", + * "CAN_MODIFYPROFILE". + * @return int Permission code. + * @throws \InvalidArgumentException + */ + protected function resolvePermission($permission_name) + { + switch ($permission_name) { + case 'CAN_ADMINISTRATE': + $permission_code = CAN_ADMINISTRATE; + break; + case 'CAN_TAKEOVER': + $permission_code = CAN_TAKEOVER; + break; + case 'CAN_VIEWTHREADS': + $permission_code = CAN_VIEWTHREADS; + break; + case 'CAN_MODIFYPROFILE': + $permission_code = CAN_MODIFYPROFILE; + break; + default: + throw new \InvalidArgumentException(sprintf('Unknown permission "%s".', $permission_name)); + } + + return $permission_code; + } +}