<commit_before><?php namespace Mobileka\L3\Engine\Laravel;

class Acl extends \Mobileka\L3\Engine\Laravel\Base\Bclass {

	public $aliases = array();
	public $except = array();

	public static function make()
	{
		$self = new static;
		$self->permissions = \Config::get('acl.permissions', array());
		$self->defaultResult = \Config::get('acl.defaultResult', false);

		foreach (\Arr::getItem($self->permissions, 'aliases', array()) as $key => $value)
		{
			$self->aliases[\Router::wildcards($key)] = $value;
		}

		$self->paths = \Arr::getItem($self->permissions, 'paths', array());
		$self->route = \Controller::$route;
		$self->bundle = $self->route['bundle'];
		$self->controller = $self->route['controller'];
		$self->action = $self->route['action'];
		$self->alias = $self->route['alias'];
		$self->path = $self->route['uses'];

		return $self;
	}

	/**
	 * Проверяет наличие доступа у текущего пользователя к текущему роуту
	 *
	 * @return bool
	 */
	public function check()
	{
		/**
		 * Если текущий роут есть в исключениях, то возврашает true
		 */
		if (in_array($this->alias, $this->except))
		{
			return true;
		}
		/**
		 * Проверяет по псевдониму роута или по пути к нему.
		 * Под псевдонимом подразумевается значение, задаваемое в 'as' роута,
	 	 * а под путем -- в 'uses' ('users.admin.default@index', например)
		 */
		if ($this->checkByAlias($this->alias) or $this->checkByPath($this->path))
		{
			return true;
		}

		/**
		 * Если доступ был заблокирован, запишем url, чтобы после авторизации вернуться назад.
		 */
		\Session::put('acl: last_blocked_url', \URL::current());

		return false;
	}

	/**
	 * Проверяет наличие доступа у текущего пользователя к текущему роуту
	 * по псевдониму ('as')
	 *
	 * @param string $alias
	 * @return bool
	 */
	public function checkByAlias($alias)
	{
		$aliases = array_keys($this->aliases);

		//если есть прямое совпадение, то отдаем ему приоритет
		if (in_array($alias, $aliases))
		{
			return \Arr::haveIntersections(
				static::userAclGroups(),
				$this->aliases[$alias]
			);
		}

		//если прямого совпадения не было, то ищем по регулярным выражениям
		foreach ($aliases as $a)
		{
			if (preg_match('#^' . $a . '#u', $alias))
			{
				return \Arr::haveIntersections(
					static::userAclGroups(),
					$this->aliases[$a]
				);
			}
		}

		return $this->defaultResult;
	}

	/**
	 * Проверяет наличие доступа у текущего пользователя к текущему роуту
	 * по пути ('uses')
	 *
	 * @param string $alias
	 * @return bool
	 */
	public function checkByPath($path)
	{
		if (isset($this->paths[$path]))
		{
			return \Arr::haveIntersections(
				static::userAclGroups(),
				$this->paths[$path]
			);
		}

		return $this->defaultResult;
	}

	/**
	 * Проверяет наличие доступа у группы пользователей
	 * к определенному действию, описанному в acl.permissions конфиге
	 *
	 * @param string $action
	 * @param string $group
	 * @return bool
	 */
	public static function can($action, $group = null)
	{
		if ($action = \Arr::getItem(\Config::get('acl.actions', array()), $action, array()))
		{
			$allow = \Arr::getItem($action, 'allow', array());
			$deny = \Arr::getItem($action, 'deny', array());
			$group = static::userAclGroups($group);

			/**
			 * Если группа есть в списке запрета, то сразу вернуть false
			 */
			foreach ($deny as $groupName)
			{
				if (in_array($groupName, $group))
				{
					return false;
				}
			}

			foreach ($allow as $groups)
			{
				$groups = (is_array($groups)) ? $groups : array($groups);

				foreach ($groups as $groupName)
				{
					if (in_array($groupName, $group))
					{
						return true;
					}
				}
			}
		}

		return \Config::get('acl.defaultResult', false);
	}

	public static function userAclGroups($group = null)
	{
		$group = ($group) ? $group : group();

		return array(
			$group,
			'*',
			'(:any)',
			'(:all)'
		);
	}

	public function wildcardToLaravel($alias)
	{
		foreach (\Router::$optional as $key => $pattern)
		{
			$alias = str_replace($pattern, $key, $alias);
		}

		foreach (\Router::$patterns as $key => $pattern)
		{
			$alias = str_replace($pattern, $key, $alias);
		}
<commit_msg>use proper Config class in Acl<commit_after><?php namespace Mobileka\L3\Engine\Laravel;

use Mobileka\L3\Engine\Laravel\Config;

class Acl extends \Mobileka\L3\Engine\Laravel\Base\Bclass {

	public $aliases = array();
	public $except = array();

	public static function make()
	{
		$self = new static;
		$self->permissions = Config::get('acl.permissions', array());
		$self->defaultResult = Config::get('acl.defaultResult', false);

		foreach (\Arr::getItem($self->permissions, 'aliases', array()) as $key => $value)
		{
			$self->aliases[\Router::wildcards($key)] = $value;
		}

		$self->paths = \Arr::getItem($self->permissions, 'paths', array());
		$self->route = \Controller::$route;
		$self->bundle = $self->route['bundle'];
		$self->controller = $self->route['controller'];
		$self->action = $self->route['action'];
		$self->alias = $self->route['alias'];
		$self->path = $self->route['uses'];

		return $self;
	}

	/**
	 * Проверяет наличие доступа у текущего пользователя к текущему роуту
	 *
	 * @return bool
	 */
	public function check()
	{
		/**
		 * Если текущий роут есть в исключениях, то возврашает true
		 */
		if (in_array($this->alias, $this->except))
		{
			return true;
		}
		/**
		 * Проверяет по псевдониму роута или по пути к нему.
		 * Под псевдонимом подразумевается значение, задаваемое в 'as' роута,
	 	 * а под путем -- в 'uses' ('users.admin.default@index', например)
		 */
		if ($this->checkByAlias($this->alias) or $this->checkByPath($this->path))
		{
			return true;
		}

		/**
		 * Если доступ был заблокирован, запишем url, чтобы после авторизации вернуться назад.
		 */
		\Session::put('acl: last_blocked_url', \URL::current());

		return false;
	}

	/**
	 * Проверяет наличие доступа у текущего пользователя к текущему роуту
	 * по псевдониму ('as')
	 *
	 * @param string $alias
	 * @return bool
	 */
	public function checkByAlias($alias)
	{
		$aliases = array_keys($this->aliases);

		//если есть прямое совпадение, то отдаем ему приоритет
		if (in_array($alias, $aliases))
		{
			return \Arr::haveIntersections(
				static::userAclGroups(),
				$this->aliases[$alias]
			);
		}

		//если прямого совпадения не было, то ищем по регулярным выражениям
		foreach ($aliases as $a)
		{
			if (preg_match('#^' . $a . '#u', $alias))
			{
				return \Arr::haveIntersections(
					static::userAclGroups(),
					$this->aliases[$a]
				);
			}
		}

		return $this->defaultResult;
	}

	/**
	 * Проверяет наличие доступа у текущего пользователя к текущему роуту
	 * по пути ('uses')
	 *
	 * @param string $alias
	 * @return bool
	 */
	public function checkByPath($path)
	{
		if (isset($this->paths[$path]))
		{
			return \Arr::haveIntersections(
				static::userAclGroups(),
				$this->paths[$path]
			);
		}

		return $this->defaultResult;
	}

	/**
	 * Проверяет наличие доступа у группы пользователей
	 * к определенному действию, описанному в acl.permissions конфиге
	 *
	 * @param string $action
	 * @param string $group
	 * @return bool
	 */
	public static function can($action, $group = null)
	{
		if ($action = \Arr::getItem(Config::get('acl.actions', array()), $action, array()))
		{
			$allow = \Arr::getItem($action, 'allow', array());
			$deny = \Arr::getItem($action, 'deny', array());
			$group = static::userAclGroups($group);

			/**
			 * Если группа есть в списке запрета, то сразу вернуть false
			 */
			foreach ($deny as $groupName)
			{
				if (in_array($groupName, $group))
				{
					return false;
				}
			}

			foreach ($allow as $groups)
			{
				$groups = (is_array($groups)) ? $groups : array($groups);

				foreach ($groups as $groupName)
				{
					if (in_array($groupName, $group))
					{
						return true;
					}
				}
			}
		}

		return Config::get('acl.defaultResult', false);
	}

	public static function userAclGroups($group = null)
	{
		$group = ($group) ? $group : group();

		return array(
			$group,
			'*',
			'(:any)',
			'(:all)'
		);
	}

	public function wildcardToLaravel($alias)
	{
		foreach (\Router::$optional as $key => $pattern)
		{
			$alias = str_replace($pattern, $key, $alias);
		}

		foreach (\Router::$patterns as $key => $pattern)
		{
			$alias = str_replace($pattern, $key, $alias);
		}

{'fraction_non_alphanumeric': 0.16934218467109233, 'fraction_numerical': 0.0006035003017501509, 'mean_word_length': 3.354177614293221, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 69, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5088648', 'n_tokens_mistral': 3453, 'n_tokens_neox': 3163, 'n_words': 675}