*/ class Application extends b8\Application { /** * @var \PHPCI\Controller */ protected $controller; /** * Initialise PHPCI - Handles session verification, routing, etc. */ public function init() { $request =& $this->request; $route = '/:controller/:action'; $opts = ['controller' => 'Home', 'action' => 'index']; // Inlined as a closure to fix "using $this when not in object context" on 5.3 $validateSession = function () { if (!empty($_SESSION['php-censor-user-id'])) { $user = b8\Store\Factory::getStore('User')->getByPrimaryKey($_SESSION['php-censor-user-id']); if ($user) { $_SESSION['php-censor-user'] = $user; return true; } unset($_SESSION['php-censor-user-id']); } return false; }; $skipAuth = [$this, 'shouldSkipAuth']; // Handler for the route we're about to register, checks for a valid session where necessary: $routeHandler = function (&$route, Response &$response) use (&$request, $validateSession, $skipAuth) { $skipValidation = in_array($route['controller'], ['session', 'webhook', 'build-status']); if (!$skipValidation && !$validateSession() && (!is_callable($skipAuth) || !$skipAuth())) { if ($request->isAjax()) { $response->setResponseCode(401); $response->setContent(''); } else { $_SESSION['php-censor-login-redirect'] = substr($request->getPath(), 1); $response = new RedirectResponse($response); $response->setHeader('Location', APP_URL . 'session/login'); } return false; } return true; }; $this->router->clearRoutes(); $this->router->register($route, $opts, $routeHandler); } /** * Handle an incoming web request. * * @return Response */ public function handleRequest() { try { $this->response = parent::handleRequest(); } catch (HttpException $ex) { $this->config->set('page_title', 'Error'); $view = new View('exception'); $view->exception = $ex; $this->response->setResponseCode($ex->getErrorCode()); $this->response->setContent($view->render()); } catch (\Exception $ex) { $this->config->set('page_title', 'Error'); $view = new View('exception'); $view->exception = $ex; $this->response->setResponseCode(500); $this->response->setContent($view->render()); } if ($this->response->hasLayout() && $this->controller->layout) { $this->setLayoutVariables($this->controller->layout); $this->controller->layout->content = $this->response->getContent(); $this->response->setContent($this->controller->layout->render()); } return $this->response; } /** * Loads a particular controller, and injects our layout view into it. * @param $class * @return mixed */ protected function loadController($class) { $controller = parent::loadController($class); $controller->layout = new View('layout'); $controller->layout->title = 'PHP Censor'; $controller->layout->breadcrumb = []; return $controller; } /** * Injects variables into the layout before rendering it. * @param View $layout */ protected function setLayoutVariables(View &$layout) { $groups = []; $groupStore = b8\Store\Factory::getStore('ProjectGroup'); $groupList = $groupStore->getWhere([], 100, 0, [], ['title' => 'ASC']); foreach ($groupList['items'] as $group) { $thisGroup = ['title' => $group->getTitle()]; $projects = b8\Store\Factory::getStore('Project')->getByGroupId($group->getId()); $thisGroup['projects'] = $projects['items']; $groups[] = $thisGroup; } $layout->groups = $groups; } /** * Check whether we should skip auth (because it is disabled) * @return bool */ protected function shouldSkipAuth() { $config = b8\Config::getInstance(); $state = (bool)$config->get('php-censor.authentication_settings.state', false); $userId = $config->get('php-censor.authentication_settings.user_id', 0); if (false !== $state && 0 != (int)$userId) { $user = b8\Store\Factory::getStore('User') ->getByPrimaryKey($userId); if ($user) { $_SESSION['php-censor-user'] = $user; return true; } } return false; } }