From 7ec589a6fe73ec01f4997e34e8aeeeaf2b9ba098 Mon Sep 17 00:00:00 2001 From: nuxsmin Date: Sat, 3 Mar 2018 11:08:21 +0100 Subject: [PATCH] * [FIX] Fixed search grid behavior --- .../web/Controllers/AccountFileController.php | 20 +- .../web/Controllers/ApiTokenController.php | 19 +- .../web/Controllers/CategoryController.php | 19 +- .../web/Controllers/ClientController.php | 19 +- .../web/Controllers/ControllerBase.php | 11 +- .../web/Controllers/CustomFieldController.php | 19 +- .../web/Controllers/EventlogController.php | 12 +- .../Controllers/Helpers/ItemsGridHelper.php | 2 +- .../web/Controllers/MainController.php | 441 +----------------- .../Controllers/NotificationController.php | 6 +- .../web/Controllers/PublicLinkController.php | 19 +- app/modules/web/Controllers/TagController.php | 19 +- .../web/Controllers/Traits/ItemTrait.php | 26 +- .../web/Controllers/UserController.php | 19 +- .../web/Controllers/UserGroupController.php | 19 +- .../web/Controllers/UserProfileController.php | 19 +- lib/SP/DataModel/ItemSearchData.php | 4 +- lib/SP/Http/Request.php | 77 +++ lib/SP/Providers/Log/LogHandler.php | 13 +- lib/SP/Services/EventLog/EventlogService.php | 2 +- 20 files changed, 273 insertions(+), 512 deletions(-) diff --git a/app/modules/web/Controllers/AccountFileController.php b/app/modules/web/Controllers/AccountFileController.php index abd6c2c8..7626bc42 100644 --- a/app/modules/web/Controllers/AccountFileController.php +++ b/app/modules/web/Controllers/AccountFileController.php @@ -220,7 +220,6 @@ class AccountFileController extends ControllerBase implements CrudControllerInte * * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface - * @throws \SP\Core\Dic\ContainerException */ public function searchAction() { @@ -228,16 +227,27 @@ class AccountFileController extends ControllerBase implements CrudControllerInte return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getFilesGrid($this->accountFileService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getFilesGrid($this->accountFileService->search($itemSearchData)), $itemSearchData); + } + /** * Create action */ diff --git a/app/modules/web/Controllers/ApiTokenController.php b/app/modules/web/Controllers/ApiTokenController.php index 53d6f4e8..2cbf812b 100644 --- a/app/modules/web/Controllers/ApiTokenController.php +++ b/app/modules/web/Controllers/ApiTokenController.php @@ -70,16 +70,27 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getApiTokensGrid($this->authTokenService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getApiTokensGrid($this->authTokenService->search($itemSearchData)), $itemSearchData); + } + /** * Create action * diff --git a/app/modules/web/Controllers/CategoryController.php b/app/modules/web/Controllers/CategoryController.php index 385b11cc..1088f817 100644 --- a/app/modules/web/Controllers/CategoryController.php +++ b/app/modules/web/Controllers/CategoryController.php @@ -67,16 +67,27 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getCategoriesGrid($this->categoryService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getCategoriesGrid($this->categoryService->search($itemSearchData)), $itemSearchData); + } + /** * Create action * diff --git a/app/modules/web/Controllers/ClientController.php b/app/modules/web/Controllers/ClientController.php index a98e5473..05723648 100644 --- a/app/modules/web/Controllers/ClientController.php +++ b/app/modules/web/Controllers/ClientController.php @@ -68,16 +68,27 @@ class ClientController extends ControllerBase implements CrudControllerInterface return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getClientsGrid($this->clientService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getClientsGrid($this->clientService->search($itemSearchData)), $itemSearchData); + } + /** * Create action * diff --git a/app/modules/web/Controllers/ControllerBase.php b/app/modules/web/Controllers/ControllerBase.php index 98e30cf9..073b3895 100644 --- a/app/modules/web/Controllers/ControllerBase.php +++ b/app/modules/web/Controllers/ControllerBase.php @@ -153,6 +153,8 @@ abstract class ControllerBase $this->view->setBase(strtolower($this->controllerName)); $this->icons = $this->theme->getIcons(); + $this->userData = clone $this->session->getUserData(); + $this->userProfileData = clone $this->session->getUserProfile(); $this->setViewVars(); @@ -166,9 +168,6 @@ abstract class ControllerBase */ private function setViewVars() { - $this->userData = $this->session->getUserData(); - $this->userProfileData = $this->session->getUserProfile(); - $this->view->assign('timeStart', $this->router->request()->server()->get('REQUEST_TIME_FLOAT')); $this->view->assign('queryTimeStart', microtime()); $this->view->assign('userId', $this->userData->getId()); @@ -240,8 +239,8 @@ abstract class ControllerBase $browser = $this->dic->get(Browser::class); // Comprobar si se ha identificado mediante el servidor web y el usuario coincide - if ($browser->checkServerAuthUser($this->session->getUserData()->getLogin()) === false - && $browser->checkServerAuthUser($this->session->getUserData()->getSsoLogin()) === false + if ($browser->checkServerAuthUser($this->userData->getLogin()) === false + && $browser->checkServerAuthUser($this->userData->getSsoLogin()) === false ) { throw new AuthException('Invalid browser auth'); } @@ -258,6 +257,6 @@ abstract class ControllerBase */ protected function checkAccess($action) { - return $this->session->getUserData()->getIsAdminApp() || $this->acl->checkUserAccess($action); + return $this->userData->getIsAdminApp() || $this->acl->checkUserAccess($action); } } \ No newline at end of file diff --git a/app/modules/web/Controllers/CustomFieldController.php b/app/modules/web/Controllers/CustomFieldController.php index a6284e5e..071d2ccd 100644 --- a/app/modules/web/Controllers/CustomFieldController.php +++ b/app/modules/web/Controllers/CustomFieldController.php @@ -70,16 +70,27 @@ class CustomFieldController extends ControllerBase implements CrudControllerInte return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getCustomFieldsGrid($this->customFieldService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getCustomFieldsGrid($this->customFieldService->search($itemSearchData)), $itemSearchData); + } + /** * Create action * diff --git a/app/modules/web/Controllers/EventlogController.php b/app/modules/web/Controllers/EventlogController.php index a66a1034..40ebd181 100644 --- a/app/modules/web/Controllers/EventlogController.php +++ b/app/modules/web/Controllers/EventlogController.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org + * @author nuxsmin + * @link https://syspass.org * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -48,6 +48,8 @@ class EventlogController extends ControllerBase protected $eventLogService; /** + * indexAction + * * @throws \SP\Core\Dic\ContainerException */ public function indexAction() @@ -64,19 +66,21 @@ class EventlogController extends ControllerBase } /** + * getSearchGrid + * * @return $this * @throws \SP\Core\Dic\ContainerException */ protected function getSearchGrid() { $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $itemSearchData = $this->getSearchData($this->configData); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); return $itemsGridHelper->updatePager($itemsGridHelper->getEventLogGrid($this->eventLogService->search($itemSearchData)), $itemSearchData); } /** - * @throws \SP\Core\Dic\ContainerException + * searchAction */ public function searchAction() { diff --git a/app/modules/web/Controllers/Helpers/ItemsGridHelper.php b/app/modules/web/Controllers/Helpers/ItemsGridHelper.php index c70064ef..47bae90e 100644 --- a/app/modules/web/Controllers/Helpers/ItemsGridHelper.php +++ b/app/modules/web/Controllers/Helpers/ItemsGridHelper.php @@ -1318,7 +1318,7 @@ class ItemsGridHelper extends HelperBase * @return DataGrid * @throws \SP\Core\Dic\ContainerException */ - public function getNoticesGrid(array $data) + public function getNotificationsGrid(array $data) { $isAdminApp = $this->session->getUserData()->getIsAdminApp(); diff --git a/app/modules/web/Controllers/MainController.php b/app/modules/web/Controllers/MainController.php index 1623d626..e725c02a 100644 --- a/app/modules/web/Controllers/MainController.php +++ b/app/modules/web/Controllers/MainController.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org + * @author nuxsmin + * @link https://syspass.org * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -27,22 +27,11 @@ namespace SP\Modules\Web\Controllers; defined('APP_ROOT') || die(); use SP\Account\AccountUtil; -use SP\Core\Acl\ActionsInterface; use SP\Core\DiFactory; use SP\Core\Exceptions\SPException; -use SP\Core\Init; -use SP\Core\Language; -use SP\Core\Plugin\PluginUtil; -use SP\Core\SessionFactory; -use SP\Core\SessionUtil; use SP\Core\Task; use SP\Core\Upgrade\Check; -use SP\Html\DataGrid\DataGridAction; -use SP\Html\Html; use SP\Http\Request; -use SP\Mgmt\Notices\Notice; -use SP\Mvc\View\Template; -use SP\Util\Checks; use SP\Util\Util; /** @@ -51,401 +40,8 @@ use SP\Util\Util; * * @package Controller */ -class MainController extends ControllerBase implements ActionsInterface +class MainController { - /** - * Constructor - * - * @param Template $template Template con instancia de plantilla - * @param string $page El nombre de página para la clase del body - * @param bool $initialize Si es una inicialización completa - * @throws \Psr\Container\ContainerExceptionInterface - */ - public function __construct(Template $template = null, $page = '', $initialize = true) - { - parent::__construct($template); - - $this->setPage($page); - - if ($initialize === true) { - $this->initialize(); - } - } - - /** - * Establecer la variable de página de la vista - * - * @param $page - */ - protected function setPage($page) - { - $this->view->assign('page', $page); - } - - /** - * Inicializar las variables para la vista principal de la aplicación - * - * @throws \Psr\Container\ContainerExceptionInterface - */ - protected function initialize() - { - $this->view->assign('startTime', microtime()); - - $this->view->addTemplate('header'); - $this->view->addTemplate('body-start'); - - $this->view->assign('useLayout', true); - $this->view->assign('isInstalled', $this->configData->isInstalled()); - $this->view->assign('sk', SessionUtil::getSessionKey(true)); - $this->view->assign('appInfo', Util::getAppInfo()); - $this->view->assign('appVersion', Util::getVersionString()); - $this->view->assign('isDemoMode', $this->configData->isDemoEnabled()); - $this->view->assign('icons', $this->theme->getIcons()); - $this->view->assign('logoIcon', Init::$WEBURI . '/public/images/logo_icon.png'); - $this->view->assign('logoNoText', Init::$WEBURI . '/public/images/logo_icon.svg'); - $this->view->assign('logo', Init::$WEBURI . '/public/images/logo_full_bg.png'); - $this->view->assign('logonobg', Init::$WEBURI . '/public/images/logo_full_nobg.png'); - $this->view->assign('httpsEnabled', Checks::httpsEnabled()); - - $this->setLoggedIn(Util::isLoggedIn($this->session)); - - $this->view->assign('lang', $this->loggedIn ? Language::$userLang : Language::$globalLang); - $this->view->assign('loadApp', $this->session->getAuthCompleted()); - - - try { - // Cargar la clave pública en la sesión - SessionUtil::loadPublicKey(); - } catch (SPException $e) { - processException($e); - } - - $this->getResourcesLinks(); - $this->setResponseHeaders(); - } - - /** - * Obtener los datos para la cabcera de la página - */ - public function getResourcesLinks() - { - $version = Util::getVersionStringNormalized(); - - $jsVersionHash = md5($version); - $this->view->append('jsLinks', Init::$WEBROOT . '/public/js/js.php?v=' . $jsVersionHash); - $this->view->append('jsLinks', Init::$WEBROOT . '/public/js/js.php?g=1&v=' . $jsVersionHash); - - $themeInfo = $this->theme->getThemeInfo(); - - if (isset($themeInfo['js'])) { - $themeJsBase = urlencode($this->theme->getThemePath() . DIRECTORY_SEPARATOR . 'js'); - $themeJsFiles = urlencode(implode(',', $themeInfo['js'])); - - $this->view->append('jsLinks', Init::$WEBROOT . '/public/js/js.php?f=' . $themeJsFiles . '&b=' . $themeJsBase . '&v=' . $jsVersionHash); - } - - $userPreferences = $this->session->getUserPreferences(); - - if ($this->loggedIn && $userPreferences->getUserId() > 0) { - $resultsAsCards = $userPreferences->isResultsAsCards(); - } else { - $resultsAsCards = $this->configData->isResultsAsCards(); - } - - $cssVersionHash = md5($version . $resultsAsCards); - $this->view->append('cssLinks', Init::$WEBROOT . '/public/css/css.php?v=' . $cssVersionHash); - - if (isset($themeInfo['css'])) { - if ($resultsAsCards) { - $themeInfo['css'][] = 'search-card.min.css'; - } else { - $themeInfo['css'][] = 'search-grid.min.css'; - } - - if ($this->configData->isDokuwikiEnabled()) { - $themeInfo['css'][] = 'styles-wiki.min.css'; - } - - $themeCssBase = urlencode($this->theme->getThemePath() . DIRECTORY_SEPARATOR . 'css'); - $themeCssFiles = urlencode(implode(',', $themeInfo['css'])); - - $this->view->append('cssLinks', Init::$WEBROOT . '/public/css/css.php?f=' . $themeCssFiles . '&b=' . $themeCssBase . '&v=' . $jsVersionHash); - } - - // Cargar los recursos de los plugins - foreach (PluginUtil::getLoadedPlugins() as $Plugin) { - $base = str_replace(BASE_PATH, '', $Plugin->getBase()); - $jsResources = $Plugin->getJsResources(); - $cssResources = $Plugin->getCssResources(); - - if (count($jsResources) > 0) { - $this->view->append('jsLinks', Init::$WEBROOT . '/public/js/js.php?f=' . urlencode(implode(',', $jsResources)) . '&b=' . urlencode($base . DIRECTORY_SEPARATOR . 'js') . '&v=' . $jsVersionHash); - } - - if (count($cssResources) > 0) { - $this->view->append('cssLinks', Init::$WEBROOT . '/public/css/css.php?f=' . urlencode(implode(',', $cssResources)) . '&b=' . urlencode($base . DIRECTORY_SEPARATOR . 'css') . '&v=' . $jsVersionHash); - } - } - } - - /** - * Establecer las cabeceras HTTP - */ - private function setResponseHeaders() - { - // UTF8 Headers - header('Content-Type: text/html; charset=UTF-8'); - - // Cache Control - header('Cache-Control: public, no-cache, max-age=0, must-revalidate'); - header('Pragma: public; max-age=0'); - } - - /** - * @throws SPException - * @throws \Psr\Container\ContainerExceptionInterface - */ - public function indexAction() - { - $this->initialize(); - $this->getMain(); - } - - /** - * Obtener los datos para el interface principal de sysPass - * - * @throws \SP\Core\Exceptions\SPException - */ - public function getMain() - { - $this->setPage('main'); - - $this->getSessionBar(); - $this->getMenu(); - - $this->view->addTemplate('body-content'); - $this->view->addTemplate('body-footer'); - $this->view->addTemplate('body-end'); - } - - /** - * Obtener los datos para la mostrar la barra de sesión - * - * @throws \SP\Core\Exceptions\SPException - */ - private function getSessionBar() - { - $this->view->addTemplate('sessionbar'); - - $userType = null; - - if ($this->userData->isIsAdminApp()) { - $userType = $this->icons->getIconAppAdmin(); - } elseif ($this->userData->isIsAdminAcc()) { - $userType = $this->icons->getIconAccAdmin(); - } - - $this->view->assign('userType', $userType); - $this->view->assign('userId', $this->userData->getId()); - $this->view->assign('userLogin', mb_strtoupper($this->userData->getLogin())); - $this->view->assign('userName', $this->userData->getName() ?: mb_strtoupper($this->view->userLogin)); - $this->view->assign('userGroup', $this->userData->getUserGroupName()); - $this->view->assign('showPassIcon', !($this->configData->isLdapEnabled() && $this->userData->isIsLdap())); - $this->view->assign('userNotices', count(Notice::getItem()->getAllActiveForUser())); - } - - /** - * Obtener los datos para mostrar el menú de acciones - */ - private function getMenu() - { - $this->view->addTemplate('body-header-menu'); - - $ActionSearch = new DataGridAction(); - $ActionSearch->setId(self::ACCOUNT_SEARCH); - $ActionSearch->setTitle(__('Buscar')); - $ActionSearch->setIcon($this->icons->getIconSearch()); - $ActionSearch->setData(['historyReset' => 1, 'view' => 'search']); - - $this->view->append('actions', $ActionSearch); - - if ($this->acl->checkUserAccess(self::ACCOUNT_CREATE)) { - $ActionNew = new DataGridAction(); - $ActionNew->setId(self::ACCOUNT_CREATE); - $ActionNew->setTitle(__('Nueva Cuenta')); - $ActionNew->setIcon($this->icons->getIconAdd()); - $ActionNew->setData(['historyReset' => 0, 'view' => 'account']); - - $this->view->append('actions', $ActionNew); - } - - if ($this->acl->checkUserAccess(self::ACCESS_MANAGE)) { - $ActionUsr = new DataGridAction(); - $ActionUsr->setId(self::ACCESS_MANAGE); - $ActionUsr->setTitle(__('Usuarios y Accesos')); - $ActionUsr->setIcon($this->icons->getIconAccount()); - $ActionUsr->setData(['historyReset' => 0, 'view' => 'datatabs']); - - $this->view->append('actions', $ActionUsr); - } - - if ($this->acl->checkUserAccess(self::ITEMS_MANAGE)) { - $ActionMgm = new DataGridAction(); - $ActionMgm->setId(self::ITEMS_MANAGE); - $ActionMgm->setTitle(__('Elementos y Personalización')); - $ActionMgm->setIcon($this->icons->getIconGroup()); - $ActionMgm->setData(['historyReset' => 0, 'view' => 'datatabs']); - - $this->view->append('actions', $ActionMgm); - } - - if ($this->acl->checkUserAccess(self::CONFIG)) { - $ActionConfig = new DataGridAction(); - $ActionConfig->setId(self::CONFIG); - $ActionConfig->setTitle(__('Configuración')); - $ActionConfig->setIcon($this->icons->getIconSettings()); - $ActionConfig->setData(['historyReset' => 1, 'view' => 'config']); - - $this->view->append('actions', $ActionConfig); - } - - if ($this->acl->checkUserAccess(self::EVENTLOG) && $this->configData->isLogEnabled()) { - $ActionEventlog = new DataGridAction(); - $ActionEventlog->setId(self::EVENTLOG); - $ActionEventlog->setTitle(__('Registro de Eventos')); - $ActionEventlog->setIcon($this->icons->getIconHeadline()); - $ActionEventlog->setData(['historyReset' => 1, 'view' => 'eventlog']); - - $this->view->append('actions', $ActionEventlog); - } - } - - /** - * Obtener los datos para el interface de login - */ - public function getLogin() - { - $this->setPage('login'); - - if (SessionFactory::getLoggedOut() === true) { - SessionFactory::setLoggedOut(false); - - $this->view->assign('loggedOut', 1); - } else { - $this->view->assign('loggedOut', 0); - } - - $this->view->addTemplate('login'); - $this->view->addTemplate('body-footer'); - $this->view->addTemplate('body-end'); - - $this->view->assign('useLayout', false); - $this->view->assign('mailEnabled', $this->configData->isMailEnabled()); - $this->view->assign('updated', SessionFactory::getAppUpdated()); - - SessionFactory::setAppUpdated(false); - - $getParams = []; - - // Comprobar y parsear los parámetros GET para pasarlos como POST en los inputs - if (count($_GET) > 0) { - foreach ($_GET as $param => $value) { - $getParams['g_' . Html::sanitizeFull($param)] = Html::sanitizeFull($value); - } - } - - $this->view->assign('getParams', $getParams); - $this->view(); - exit(); - } - - /** - * Obtener los datos para el interface de logout - */ - public function getLogout() - { - $this->setPage('logout'); - - $this->view->addTemplate('logout'); - $this->view->addTemplate('body-footer'); - $this->view->addTemplate('body-end'); - $this->view(); - exit(); - } - - /** - * Obtener los datos para el interface del instalador - */ - public function getInstaller() - { - $this->setPage('install'); - - $this->view->addTemplate('body-header'); - - $errors = []; - - if (!Checks::checkPhpVersion()) { - $errors[] = [ - 'type' => SPException::CRITICAL, - 'description' => __('Versión de PHP requerida >= ') . ' 5.6.0 <= 7.0', - 'hint' => __('Actualice la versión de PHP para que la aplicación funcione correctamente') - ]; - } - - $modules = Checks::checkModules(); - - if (count($modules) > 0) { - foreach ($modules as $module) { - $error[] = [ - 'type' => SPException::WARNING, - 'description' => sprintf('%s (%s)', __('Módulo no disponible'), $module), - 'hint' => __('Sin este módulo la aplicación puede no funcionar correctamente.') - ]; - } - } - - if (@file_exists(__FILE__ . "\0Nullbyte")) { - $errors[] = [ - 'type' => SPException::WARNING, - 'description' => __('La version de PHP es vulnerable al ataque NULL Byte (CVE-2006-7243)'), - 'hint' => __('Actualice la versión de PHP para usar sysPass de forma segura')]; - } - - if (!Checks::secureRNGIsAvailable()) { - $errors[] = [ - 'type' => SPException::WARNING, - 'description' => __('No se encuentra el generador de números aleatorios.'), - 'hint' => __('Sin esta función un atacante puede utilizar su cuenta al resetear la clave')]; - } - - $this->view->assign('errors', $errors); - - $this->view->assign('langsAvailable', Language::getAvailableLanguages()); - $this->view->assign('langBrowser', Language::$globalLang); - - $this->view->addTemplate('install'); - $this->view->addTemplate('body-footer'); - $this->view->addTemplate('body-end'); - } - - /** - * Obtener los datos para el interface de error - */ - public function getError() - { - $this->setPage('error'); - - if (!Checks::isAjax()) { - $this->view->addTemplate('body-header'); - $this->view->addTemplate('error'); - $this->view->addTemplate('body-footer'); - } else { - $this->view->addTemplate('error'); - } - - $this->view(); - exit(); - } /** * Obtener los datos para el interface de actualización de componentes @@ -559,35 +155,4 @@ class MainController extends ControllerBase implements ActionsInterface $this->showError(self::ERR_EXCEPTION); } } - - /** - * Obtener los datos para el interface de restablecimiento de clave de usuario - */ - public function getPassReset() - { - $this->setPage('passreset'); - - $this->view->addTemplate('body-header'); - - if ($this->configData->isMailEnabled() || Request::analyze('f', 0) === 1) { - $this->view->addTemplate('passreset'); - - $this->view->assign('login', Request::analyze('login')); - $this->view->assign('email', Request::analyze('email')); - - $this->view->assign('action', Request::analyze('a')); - $this->view->assign('hash', Request::analyze('h')); - $this->view->assign('time', Request::analyze('t')); - - $this->view->assign('passReset', $this->view->action === 'passreset' && !empty($this->view->hash) && !empty($this->view->time)); - } else { - $this->showError(self::ERR_UNAVAILABLE, false); - } - - $this->view->addTemplate('body-footer'); - $this->view->addTemplate('body-end'); - - $this->view(); - exit(); - } } \ No newline at end of file diff --git a/app/modules/web/Controllers/NotificationController.php b/app/modules/web/Controllers/NotificationController.php index 848a5742..5597a2ae 100644 --- a/app/modules/web/Controllers/NotificationController.php +++ b/app/modules/web/Controllers/NotificationController.php @@ -72,15 +72,17 @@ class NotificationController extends ControllerBase implements CrudControllerInt } /** + * getSearchGrid + * * @return $this * @throws \SP\Core\Dic\ContainerException */ protected function getSearchGrid() { $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $itemSearchData = $this->getSearchData($this->configData); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); - return $itemsGridHelper->updatePager($itemsGridHelper->getNoticesGrid($this->notificationService->search($itemSearchData)), $itemSearchData); + return $itemsGridHelper->updatePager($itemsGridHelper->getNotificationsGrid($this->notificationService->search($itemSearchData)), $itemSearchData); } /** diff --git a/app/modules/web/Controllers/PublicLinkController.php b/app/modules/web/Controllers/PublicLinkController.php index 3afb1278..026cedbe 100644 --- a/app/modules/web/Controllers/PublicLinkController.php +++ b/app/modules/web/Controllers/PublicLinkController.php @@ -70,16 +70,27 @@ class PublicLinkController extends ControllerBase implements CrudControllerInter return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getPublicLinksGrid($this->publicLinkService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getPublicLinksGrid($this->publicLinkService->search($itemSearchData)), $itemSearchData); + } + /** * Create action * diff --git a/app/modules/web/Controllers/TagController.php b/app/modules/web/Controllers/TagController.php index a6caab11..55802624 100644 --- a/app/modules/web/Controllers/TagController.php +++ b/app/modules/web/Controllers/TagController.php @@ -67,16 +67,27 @@ class TagController extends ControllerBase implements CrudControllerInterface return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getTagsGrid($this->tagService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getTagsGrid($this->tagService->search($itemSearchData)), $itemSearchData); + } + /** * Create action * diff --git a/app/modules/web/Controllers/Traits/ItemTrait.php b/app/modules/web/Controllers/Traits/ItemTrait.php index 984b8fad..ff808157 100644 --- a/app/modules/web/Controllers/Traits/ItemTrait.php +++ b/app/modules/web/Controllers/Traits/ItemTrait.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org + * @author nuxsmin + * @link https://syspass.org * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -26,7 +26,6 @@ namespace SP\Modules\Web\Controllers\Traits; use Defuse\Crypto\Exception\CryptoException; use SP\Bootstrap; -use SP\Config\ConfigData; use SP\Core\Exceptions\SPException; use SP\DataModel\CustomFieldData; use SP\DataModel\ItemSearchData; @@ -102,9 +101,9 @@ trait ItemTrait */ protected function addCustomFieldsForItem($moduleId, $itemId) { - $customFields = Request::analyze('customfield'); + $customFields = Request::analyzeArray('customfield'); - if (is_array($customFields)) { + if ($customFields !== false) { $customFieldData = new CustomFieldData(); $customFieldData->setId($itemId); $customFieldData->setModuleId($moduleId); @@ -157,9 +156,9 @@ trait ItemTrait */ protected function updateCustomFieldsForItem($moduleId, $itemId) { - $customFields = Request::analyze('customfield'); + $customFields = Request::analyzeArray('customfield'); - if (is_array($customFields)) { + if ($customFields !== false) { $customFieldData = new CustomFieldData(); $customFieldData->setId($itemId); $customFieldData->setModuleId($moduleId); @@ -182,16 +181,15 @@ trait ItemTrait /** * Returns search data object for the current request * - * @param ConfigData $configData + * @param int $limitCount * @return ItemSearchData */ - protected function getSearchData(ConfigData $configData) + protected function getSearchData($limitCount) { $itemSearchData = new ItemSearchData(); - $itemSearchData->setLimitCount($configData->getAccountCount()); - $itemSearchData->setSeachString(Request::analyze('search')); - $itemSearchData->setLimitStart(Request::analyze('start', 0)); - $itemSearchData->setLimitCount(Request::analyze('count', $configData->getAccountCount())); + $itemSearchData->setSeachString(Request::analyzeString('search')); + $itemSearchData->setLimitStart(Request::analyzeInt('start')); + $itemSearchData->setLimitCount(Request::analyzeInt('count', $limitCount)); return $itemSearchData; } @@ -201,6 +199,6 @@ trait ItemTrait */ protected function getItemsIdFromRequest() { - return Request::analyze('items', 0); + return Request::analyzeArray('items'); } } \ No newline at end of file diff --git a/app/modules/web/Controllers/UserController.php b/app/modules/web/Controllers/UserController.php index 051f0f6c..221c8334 100644 --- a/app/modules/web/Controllers/UserController.php +++ b/app/modules/web/Controllers/UserController.php @@ -73,16 +73,27 @@ class UserController extends ControllerBase implements CrudControllerInterface return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getUsersGrid($this->userService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getUsersGrid($this->userService->search($itemSearchData)), $itemSearchData); + } + /** * Create action * diff --git a/app/modules/web/Controllers/UserGroupController.php b/app/modules/web/Controllers/UserGroupController.php index 4003d12c..640b470f 100644 --- a/app/modules/web/Controllers/UserGroupController.php +++ b/app/modules/web/Controllers/UserGroupController.php @@ -74,16 +74,27 @@ class UserGroupController extends ControllerBase implements CrudControllerInterf return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getUserGroupsGrid($this->userGroupService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getUserGroupsGrid($this->userGroupService->search($itemSearchData)), $itemSearchData); + } + /** * Create action * diff --git a/app/modules/web/Controllers/UserProfileController.php b/app/modules/web/Controllers/UserProfileController.php index 7d02b6c6..b45d8eaf 100644 --- a/app/modules/web/Controllers/UserProfileController.php +++ b/app/modules/web/Controllers/UserProfileController.php @@ -68,16 +68,27 @@ class UserProfileController extends ControllerBase implements CrudControllerInte return; } - $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); - $grid = $itemsGridHelper->getUserProfilesGrid($this->userProfileService->search($this->getSearchData($this->configData)))->updatePager(); - $this->view->addTemplate('datagrid-table', 'grid'); $this->view->assign('index', Request::analyze('activetab', 0)); - $this->view->assign('data', $grid); + $this->view->assign('data', $this->getSearchGrid()); $this->returnJsonResponseData(['html' => $this->render()]); } + /** + * getSearchGrid + * + * @return $this + * @throws \SP\Core\Dic\ContainerException + */ + protected function getSearchGrid() + { + $itemsGridHelper = $this->dic->get(ItemsGridHelper::class); + $itemSearchData = $this->getSearchData($this->configData->getAccountCount()); + + return $itemsGridHelper->updatePager($itemsGridHelper->getUserProfilesGrid($this->userProfileService->search($itemSearchData)), $itemSearchData); + } + /** * Create action * diff --git a/lib/SP/DataModel/ItemSearchData.php b/lib/SP/DataModel/ItemSearchData.php index da3b44cf..bf37df6e 100644 --- a/lib/SP/DataModel/ItemSearchData.php +++ b/lib/SP/DataModel/ItemSearchData.php @@ -82,7 +82,7 @@ class ItemSearchData */ public function setLimitStart($limitStart) { - $this->limitStart = $limitStart; + $this->limitStart = (int)$limitStart; } /** @@ -98,7 +98,7 @@ class ItemSearchData */ public function setLimitCount($limitCount) { - $this->limitCount = $limitCount; + $this->limitCount = (int)$limitCount; } /** diff --git a/lib/SP/Http/Request.php b/lib/SP/Http/Request.php index 46195f17..c92cce99 100644 --- a/lib/SP/Http/Request.php +++ b/lib/SP/Http/Request.php @@ -27,6 +27,7 @@ namespace SP\Http; use SP\Core\CryptPKI; use SP\Core\Init; use SP\Html\Html; +use SP\Util\Util; /** * Clase Request para la gestión de peticiones HTTP @@ -192,6 +193,82 @@ class Request return $value; } + /** + * @param $param + * @return mixed + */ + public static function analyzeArray($param) + { + if (is_array($_REQUEST[$param])) { + return array_map(function ($value) { + if (is_numeric($value)) { + return (int)filter_var($value, FILTER_SANITIZE_NUMBER_INT); + } else { + return (string)filter_var($value, FILTER_SANITIZE_STRING); + } + }, $_REQUEST[$param]); + } + + return false; + } + + + /** + * @param $param + * @param $default + * @return int + */ + public static function analyzeInt($param, $default = 0) + { + if (!isset($_REQUEST[$param])) { + return (int)$default; + } + + return (int)filter_var($_REQUEST[$param], FILTER_SANITIZE_NUMBER_INT); + } + + /** + * @param $param + * @param $default + * @return string + */ + public static function analyzeString($param, $default = '') + { + if (!isset($_REQUEST[$param])) { + return (string)$default; + } + + return filter_var($_REQUEST[$param], FILTER_SANITIZE_STRING); + } + + /** + * @param $param + * @param $default + * @return bool + */ + public static function analyzeBool($param, $default = false) + { + if (!isset($_REQUEST[$param])) { + return (bool)$default; + } + + return Util::boolval($_REQUEST[$param]); + } + + /** + * @param $param + * @param $default + * @return string + */ + public static function analyzePassword($param, $default = '') + { + if (!isset($_REQUEST[$param])) { + return (string)$default; + } + + return filter_var($_REQUEST[$param], FILTER_SANITIZE_STRING); + } + /** * Comprobar si se realiza una recarga de la página * diff --git a/lib/SP/Providers/Log/LogHandler.php b/lib/SP/Providers/Log/LogHandler.php index fec8480a..c5a70bd3 100644 --- a/lib/SP/Providers/Log/LogHandler.php +++ b/lib/SP/Providers/Log/LogHandler.php @@ -48,8 +48,10 @@ class LogHandler extends Provider implements EventReceiver 'copy.account.pass', 'clear.eventlog', 'login.', - 'logout' + 'logout', + 'track.' ]; + /** * @var EventlogService */ @@ -92,13 +94,18 @@ class LogHandler extends Provider implements EventReceiver { $eventlogData = new EventlogData(); $eventlogData->setAction($eventType); - $eventlogData->setLevel('INFO'); - if (($eventMessage = $event->getEventMessage()) !== null) { + if (($e = $event->getSource()) instanceof \Exception) { + /** @var \Exception $e */ + $eventlogData->setDescription($e->getMessage()); + $eventlogData->setLevel('ERROR'); + } elseif (($eventMessage = $event->getEventMessage()) !== null) { $eventlogData->setDescription($eventMessage->composeText()); + $eventlogData->setLevel('INFO'); } if (($e = $event->getSource()) instanceof \Exception) { + $eventlogData->setLevel('INFO'); /** @var \Exception $e */ $eventlogData->setDescription($e->getMessage()); } diff --git a/lib/SP/Services/EventLog/EventlogService.php b/lib/SP/Services/EventLog/EventlogService.php index 13fedeee..8a7f00ee 100644 --- a/lib/SP/Services/EventLog/EventlogService.php +++ b/lib/SP/Services/EventLog/EventlogService.php @@ -73,7 +73,7 @@ class EventlogService extends Service $userData = $this->session->getUserData(); $eventlogData->setUserId($userData->getId()); - $eventlogData->setLogin($userData->getLogin()); + $eventlogData->setLogin($userData->getLogin() ?: '-'); $eventlogData->setIpAddress(HttpUtil::getClientAddress()); return $this->eventLogRepository->create($eventlogData);