%PDF- %PDF-
Direktori : /backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Base/ |
Current File : //backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/Base/ControllerRoot.php |
<?php /* * Copyright (C) 2015-2021 Deciso B.V. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ namespace OPNsense\Base; use OPNsense\Core\ACL; use OPNsense\Core\Config; use OPNsense\Core\Syslog; use OPNsense\Mvc\Controller; use Phalcon\Translate\InterpolatorFactory; /** * Class ControllerRoot wrap shared OPNsense controller features (auth, logging) * @package OPNsense\Base */ class ControllerRoot extends Controller { /** * @var null|ViewTranslator translator to use */ public $translator; /** * log handle */ protected $logger = null; /** * @var null|string logged in username, populated during authentication */ protected $logged_in_user = null; /** * current language code */ protected $langcode = 'en_US'; /** * XXX: remove in a future version, sessions are handled via session class * Wrap close session, for long running operations. */ protected function sessionClose() { return; } /** * set system language according to configuration */ protected function setLang() { $config = Config::getInstance()->object(); $lang = $this->langcode; foreach ($config->system->children() as $key => $node) { if ($key == 'language' && !empty((string)$node)) { $lang = (string)$node; break; } } if ($this->session->has('Username')) { $username = $this->session->get('Username'); foreach ($config->system->user as $user) { if ($username == (string)$user->name && !empty((string)$user->language)) { $lang = (string)$user->language; break; } } } $locale = $lang . '.UTF-8'; $interpolator = new InterpolatorFactory(); $this->translator = new ViewTranslator($interpolator, [ 'directory' => '/usr/local/share/locale', 'defaultDomain' => 'OPNsense', 'locale' => [$locale], ]); /* somehow this is not done by Phalcon */ bind_textdomain_codeset('OPNsense', $locale); putenv('LANG=' . $locale); $this->langcode = $lang; } /** * get system logger * @param string $ident syslog identifier * @return Syslog log handler */ protected function getLogger($ident = 'api') { if ($this->logger == null) { $this->logger = new Syslog($ident, null, LOG_LOCAL4); } return $this->logger; } /** * return logged-in username * @return string username */ public function getUserName() { return $this->logged_in_user; } /** * perform authentication, redirect user on non successful auth * @return bool */ public function doAuth() { $cnf = Config::getInstance()->object(); if (!empty($cnf->system->webgui->session_timeout)) { $session_timeout = $cnf->system->webgui->session_timeout * 60; } else { $session_timeout = 14400; } $redirect_uri = "/?url=" . $_SERVER['REQUEST_URI']; if ($this->session->has("Username") == false) { // user unknown $this->getLogger()->error("no active session, user not found"); $this->response->redirect($redirect_uri, true); $this->setLang(); return false; } elseif ( $this->session->has("last_access") && $this->session->get("last_access") < (time() - $session_timeout) ) { // session expired / cleanup session data $this->getLogger()->error("session expired"); $this->session->remove("Username"); $this->session->remove("last_access"); $this->response->redirect($redirect_uri, true); $this->setLang(); return false; } $this->setLang(); $this->session->set("last_access", time()); // Authorization using legacy acl structure $acl = new ACL(); if (!$acl->isPageAccessible($this->session->get("Username"), $_SERVER['REQUEST_URI'])) { $this->getLogger()->error("uri " . $_SERVER['REQUEST_URI'] . " not accessible for user " . $this->session->get("Username")); $this->response->redirect("/", true); return false; } return true; } }