%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/behaviors/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/behaviors/AccessControl.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2018 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\components\behaviors; use humhub\components\access\ControllerAccess; use Yii; use yii\base\ActionFilter; use yii\web\HttpException; /** * Handles the AccessControl for a Controller. * * Controller level AccessRules can be provided by either setting the [[rules]] array, * or by implementing a `getAccessRules()` function within the controller itself (prefered). * * **Examples:** * * Disable guest access for all controller actions: * * ```php * public function getAccessRules() * { * return [ * ['login'] * ]; * } * ``` * * Disable guest access for specific controller actions: * * ```php * public function getAccessRules() * { * return [ * ['login' => ['action1', 'action2']] * ]; * } * ``` * * All users have to be logged in + additional permission check for 'action1' and 'action2': * * ```php * public function getAccessRules() * { * return [ * ['login'], * ['permission' => MyPermission::class, 'actions' => ['action1', 'action2']] * ]; * } * ``` * * Custom inline validator for action 'action1': * * ```php * public function getAccessRules() * { * return [ * ['validateMyCustomRule', 'someParameter' => 'someValue', 'actions' => ['action1']] * ]; * } * * public function validateMyCustomRule($rule, $access) * { * if($rule['someParameter'] !== 'someValue') { * $access->code = 401; * $access->reason = 'Not authorized!'; * return false; * } * * return true; * } * * ``` * * The list of available rules is given by the [[\humhub\components\access\ControllerAccess]] class set by a controller. * By default the base [[\humhub\components\access\ControllerAccess]] class will be used. * * The default ControllerAccess class can be overwritten by implementing the `getAccess()` function within a controller, * which should return an instance of ControllerAccess. * * > Note: You can also use the [[\humhub\components\Controller::access]] property * to define a ControllerAccess class string. * * * * @see ControllerAccess * @author luke */ class AccessControl extends ActionFilter { /** * Rules for access to controller * * @var array */ public $rules = null; /** * Action ids which are allowed when Guest Mode is enabled * * @var array * @deprecated since 1.2.2 use ['guestAccess' => ['action1', 'action2']] rule instead */ public $guestAllowedActions = []; /** * Only allow admins access to this controller * * @var boolean * @deprecated since 1.2.2 use ['adminOnly'] rule instead */ public $adminOnly = false; /** * Only allow logged in users access to this controller * @deprecated since 1.2.2 use ['loggedInOnly'] rule instead */ public $loggedInOnly = false; /** * @var ControllerAccess instance */ protected $controllerAccess; /** * @inheritdoc */ public function beforeAction($action) { // Bypass when not installed for installer if (empty(Yii::$app->params['installed']) && Yii::$app->controller->module != null && Yii::$app->controller->module->id == 'installer') { return true; } $this->handleDeprecatedSettings(); $this->controllerAccess = $this->getControllerAccess($this->rules); if (!$this->controllerAccess->run()) { if (isset($this->controllerAccess->codeCallback) && method_exists($this, $this->controllerAccess->codeCallback)) { // Call a specific function for current action filter, // may be used to filter a logged in user for some restriction e.g. "must change password" call_user_func([$this, $this->controllerAccess->codeCallback]); } else if ($this->controllerAccess->code == 401) { $this->loginRequired(); } else { $this->forbidden(); } return false; } return parent::beforeAction($action); } /** * Compatibility with pre 1.2.2 usage of AccessControl */ protected function handleDeprecatedSettings() { if ($this->adminOnly) { $this->rules[] = [ControllerAccess::RULE_ADMIN_ONLY]; } if ($this->loggedInOnly) { $this->rules[] = [ControllerAccess::RULE_LOGGED_IN_ONLY]; } if (!empty($this->guestAllowedActions)) { $this->rules[] = ['guestAccess' => $this->guestAllowedActions]; } } /** * Returns a ControllerAccess instance, controllers are able to overwrite this by implementing an own `getAccess()` * function. * * @return ControllerAccess */ protected function getControllerAccess($rules = null) { if ($rules === null) { $rules = [['strict']]; } $instance = null; if (method_exists($this->owner, 'getAccess')) { $instance = $this->owner->getAccess(); } if (!$instance) { // fixes legacy behavior settings compatibility issue with no rules given $instance = new ControllerAccess(); } $instance->setRules($rules); $instance->owner = $this->owner; return $instance; } /** * @throws HttpException */ protected function forbidden() { throw new HttpException($this->controllerAccess->code, $this->controllerAccess->reason); } /** * Force user to log in */ protected function loginRequired() { Yii::$app->user->logout(); Yii::$app->user->loginRequired(); } /** * Force user to redirect to change password * @since 1.8 */ protected function forceChangePassword() { if (!Yii::$app->user->isMustChangePasswordUrl()) { Yii::$app->getResponse()->redirect([Yii::$app->user->mustChangePasswordRoute]); } } /** * Log out all non admin users when maintenance mode is active * @since 1.8 */ protected function checkMaintenanceMode() { if (Yii::$app->settings->get('maintenanceMode')) { if (!Yii::$app->user->isGuest) { Yii::$app->user->logout(); Yii::$app->getView()->warn(Yii::t('error', 'Maintenance mode activated: You have been automatically logged out and will no longer have access the platform until the maintenance has been completed.')); } Yii::$app->getResponse()->redirect(['/user/auth/login']); } } }