%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/access/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/access/AccessValidator.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2018 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*
*/
namespace humhub\components\access;
use Yii;
use yii\base\InvalidArgumentException;
use yii\base\BaseObject;
/**
* AccessValidators are responsible for validating a given set of rules.
*
* Rules consist of an array with at leas an rule name and optional further rule settings.
* If only a rule name is given, the rule is considered global, otherwise it may be restricted to specific actions by
* providing an action setting e.g.:
*
* ```
* // Global myRule
* ['myRule']
*
* // MyRule restricted to action1 and action2
* ['myRule' => ['action1', 'action2']]
*
* // Alternative action configuration
* ['myRule', 'actions' => ['action1', 'action2']]
* ```
*
* A Validator has an unique name which is used to detect related rules and can filter out non related rules by
* means of the `filterRelatedRules()` function.
*
* AccessValidators have access to a ControllerAccess instance, which holds the ruleset and validation state.
*
* This abstract validator class furthermore provides some helper functions as:
*
* - `isActionRelated()`: Checks if a given rule is related to the current action
* - `extractActions()`: Extracts the action settings from a given rule array
* - `getRuleName()`: Extracts the rule name from a given rule array
*
* @package humhub\components\access
*/
abstract class AccessValidator extends BaseObject
{
/**
* @var string the name of the valdiator
*/
public $name;
/**
* @var int http error code used in case the validation failes
*/
public $code;
/**
* @var string validator error message
*/
public $reason;
/**
* @var ControllerAccess access instance
*/
public $access;
/**
* @var bool determines if this validator is only interested in action related rules or all validator related rules
*/
public $actionFilter = true;
public function init()
{
if(!$this->code) {
$this->code = Yii::$app->user->isGuest ? 401 : 403;
}
if (!$this->name) {
$this->name = static::class;
}
if (empty($this->reason)) {
$this->reason = Yii::t('error', 'You are not permitted to access this section.');
}
parent::init();
}
/**
* Responsible for validating the given ruleset.
* Related rules may be filtered by means of the `filterRelatedRules()` function.
* The whole rule set can be retrieved by calling `$this->access->rules`.
*
*
* @return boolean true if validation passed otherwise true
*/
abstract public function run();
/**
* Filters out all rules which are not related to this validator.
*
* @param $rules
* @return array
*/
protected function filterRelatedRules($rules = null)
{
if ($rules === null) {
$rules = $this->access->getRules();
}
$result = [];
foreach ($rules as $rule) {
$ruleName = $this->getRuleName($rule);
if ($this->name === $ruleName) {
$result[] = $rule;
}
}
return $result;
}
/**
* Checks if the current action is contained in the given $rule.
* This is the case either if the current action is contained in the rules action settings or
* the rule is global (no action restriction).
*
* @param array|string $actionArray single action id or array of action ids
* @return bool
*/
protected function isActionRelated($rule)
{
$actions = $this->extractActions($rule);
// If no action array is given we consider the rule to be controller global
if (empty($actions)) {
return true;
}
if (!is_array($actions) && !is_string($actions)) {
throw new InvalidArgumentException('Invalid rule provided!');
}
$actions = is_string($actions) ? [$actions] : $actions;
return in_array($this->access->action, $actions);
}
/**
* Extracts actions settings form a given rule.
*
* Action rules can be either set like:
*
* ['ruleName', 'actions' => ['action1', 'action2']]
*
* or in some cases:
*
* ['ruleName' => ['action1', 'action2']]
*
* @param $rule
* @return array
*/
protected function extractActions($rule)
{
$name = $this->getRuleName($rule);
$actions = [];
if (isset($rule['actions'])) {
$actions = $rule['actions'];
} else {
$actions = isset($rule[$name]) ? $rule[$name] : $actions;
}
return $actions;
}
/**
* Extracts the ruleName from the given array.
*
* @param $arr
* @return mixed|null
*/
protected function getRuleName($rule)
{
if (empty($rule)) {
return null;
}
$firstKey = current(array_keys($rule));
if (is_string($firstKey)) {
return $firstKey;
} else {
return $rule[$firstKey];
}
}
/**
* @return string the error message in case the validation fails
*/
public function getReason()
{
return $this->reason;
}
/**
* @return int http error code used in case the validation fails
*/
public function getCode()
{
return $this->code;
}
}