%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/rest/components/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/rest/components/BaseController.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2018 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\modules\rest\components; use Exception; use Firebase\JWT\JWT; use humhub\components\access\ControllerAccess; use humhub\components\Controller; use humhub\modules\content\models\Content; use humhub\modules\rest\controllers\auth\AuthController; use humhub\modules\rest\models\ConfigureForm; use humhub\modules\rest\Module; use humhub\modules\user\models\User; use Yii; use yii\data\Pagination; use yii\db\ActiveQuery; use yii\web\HttpException; use yii\web\JsonParser; /** * Class BaseController * * @package humhub\modules\rest\components */ abstract class BaseController extends Controller { public static $moduleId = ''; /** * @inheritdoc */ public $enableCsrfValidation = false; /** * @inerhitdoc * Do not enforce authentication. */ public $access = ControllerAccess::class; /** * @inheritdoc */ protected $doNotInterceptActionIds = ['*']; /** * @inheritdoc */ public function beforeAction($action) { Yii::$app->response->format = 'json'; Yii::$app->request->setBodyParams(null); Yii::$app->request->parsers['application/json'] = JsonParser::class; $user = $this->authWithJwt(); $config = ConfigureForm::getInstance(); if ($user === null && !empty($config->enableBasicAuth)) { // Try login by username and password list($username, $password) = Yii::$app->request->getAuthCredentials(); $user = AuthController::authByUserAndPassword($username, $password); } if ($user === null) { throw new HttpException('401', 'Invalid token!'); } if (!$this->isUserEnabled($user)) { throw new HttpException('401', 'Invalid user!'); } Yii::$app->user->login($user); return parent::beforeAction($action); } /** * Not supported * * @return array */ public function actionNotSupported() { $module = static::$moduleId; return $this->returnError(404, "{$module} module does not installed. Please install or enable {$module} module to use this API"); } /** * Authentication using JWT Bearer Header * * @return User|null * @throws HttpException */ private function authWithJwt() { $authHeader = Yii::$app->request->getHeaders()->get('Authorization'); /** @var Module $module */ $module = Yii::$app->getModule('rest'); if (!empty($authHeader) && preg_match('/^Bearer\s+(.*?)$/', $authHeader, $matches)) { $token = $matches[1]; try { $validData = JWT::decode($token, ConfigureForm::getInstance()->jwtKey, ['HS512']); if (!empty($validData->uid)) { return User::find()->active()->andWhere(['user.id' => $validData->uid])->one(); } } catch (Exception $e) { throw new HttpException(401, $e->getMessage()); } } return null; } /** * Checks if users is allowed to use the Rest API * * @param User $user * @return bool */ public function isUserEnabled(User $user) { $config = new ConfigureForm(); $config->loadSettings(); if (!empty($config->enabledForAllUsers)) { return true; } if (in_array($user->guid, (array)$config->enabledUsers)) { return true; } return false; } /** * Handles pagination * * @param ActiveQuery $query * @param int $limit * @return Pagination the pagination */ protected function handlePagination(ActiveQuery $query, $limit = 100) { $limit = (int)Yii::$app->request->get('limit', $limit); $page = (int)Yii::$app->request->get('page', 1); if ($limit > 100) { $limit = 100; } $page--; $countQuery = clone $query; $pagination = new Pagination(['totalCount' => $countQuery->count()]); $pagination->setPage($page); $pagination->setPageSize($limit); $query->offset($pagination->offset); $query->limit($pagination->limit); return $pagination; } /** * Generates pagination response * * @param ActiveQuery $query * @param Pagination $pagination * @param $data array * @return array */ protected function returnPagination(ActiveQuery $query, Pagination $pagination, $data) { return [ 'total' => $pagination->totalCount, 'page' => $pagination->getPage() + 1, 'pages' => $pagination->getPageCount(), 'links' => $pagination->getLinks(), 'results' => $data, ]; } /** * Generates error response * * @param int $statusCode * @param string $message * @param array $additional * @return array */ protected function returnError($statusCode = 400, $message = 'Invalid request', $additional = []) { Yii::$app->response->statusCode = $statusCode; return array_merge(['code' => $statusCode, 'message' => $message], $additional); } /** * Generates success response * * @param string $message * @param int $statusCode * @param array $additional * @return array */ protected function returnSuccess($message = 'Request successful', $statusCode = 200, $additional = []) { Yii::$app->response->statusCode = $statusCode; return array_merge(['code' => $statusCode, 'message' => $message], $additional); } /** * Attach files to Content * * @param Content|null $content * @return array */ protected function attachFilesToContent(?Content $content): array { } }