From 435bf3b810fc510749a28243871db78b040cdf62 Mon Sep 17 00:00:00 2001
From: nuxsmin
Date: Tue, 6 Mar 2018 14:21:45 +0100
Subject: [PATCH] * [ADD] Added plugin controller * [MOD] Code refactoring *
[FIX] Bugfixes
---
.../Controllers/AccessManagerController.php | 7 -
.../web/Controllers/AccountController.php | 10 +-
.../Controllers/AccountFavoriteController.php | 2 +
.../web/Controllers/AccountFileController.php | 4 +-
.../web/Controllers/ApiTokenController.php | 5 +-
.../web/Controllers/CategoryController.php | 5 +-
.../web/Controllers/ClientController.php | 6 +-
.../Controllers/ConfigAccountController.php | 1 +
.../Controllers/ConfigBackupController.php | 1 +
.../ConfigEncryptionController.php | 1 +
.../Controllers/ConfigGeneralController.php | 1 +
.../Controllers/ConfigImportController.php | 1 +
.../web/Controllers/ConfigLdapController.php | 1 +
.../web/Controllers/ConfigMailController.php | 1 +
.../web/Controllers/ConfigWikiController.php | 1 +
.../web/Controllers/CustomFieldController.php | 6 +-
.../web/Controllers/ErrorController.php | 1 -
.../web/Controllers/EventlogController.php | 10 +-
.../Helpers/Account/AccountPasswordHelper.php | 4 +-
.../Helpers/Account/AccountSearchHelper.php | 3 +-
.../Controllers/Helpers/ItemsGridHelper.php | 52 ++--
.../web/Controllers/Helpers/LayoutHelper.php | 1 -
.../web/Controllers/ItemManagerController.php | 15 +-
.../Controllers/NotificationController.php | 12 +-
.../web/Controllers/PluginController.php | 238 ++++++++++++++++
.../web/Controllers/PublicLinkController.php | 5 +-
app/modules/web/Controllers/TagController.php | 6 +-
.../web/Controllers/UserController.php | 9 +-
.../web/Controllers/UserGroupController.php | 5 +-
.../web/Controllers/UserProfileController.php | 5 +-
.../UserSettingsGeneralController.php | 2 +
.../UserSettingsManagerController.php | 10 +
.../themes/material-blue/css/styles.min.css | 2 +-
.../themes/material-blue/js/app-theme.min.js | 2 +-
lib/SP/Html/DataGrid/DataGridBase.php | 24 +-
.../Account/AccountFileRepository.php | 2 +-
.../Account/AccountHistoryRepository.php | 20 +-
.../Repositories/Plugin/PluginRepository.php | 255 ++++++++----------
lib/SP/Repositories/Track/TrackRepository.php | 10 +-
lib/SP/Services/Plugin/PluginService.php | 238 ++++++++++++++++
.../Services/PublicLink/PublicLinkService.php | 23 +-
lib/SP/Storage/FileCachePacked.php | 162 +++++++++++
public/js/app-actions.js | 81 +++---
public/js/app-actions.min.js | 53 ++--
public/js/app-main.min.js | 2 +-
public/js/app-triggers.min.js | 2 +-
46 files changed, 925 insertions(+), 382 deletions(-)
create mode 100644 app/modules/web/Controllers/PluginController.php
create mode 100644 lib/SP/Services/Plugin/PluginService.php
create mode 100644 lib/SP/Storage/FileCachePacked.php
diff --git a/app/modules/web/Controllers/AccessManagerController.php b/app/modules/web/Controllers/AccessManagerController.php
index 1d829e8a..74b7e087 100644
--- a/app/modules/web/Controllers/AccessManagerController.php
+++ b/app/modules/web/Controllers/AccessManagerController.php
@@ -60,7 +60,6 @@ class AccessManagerController extends ControllerBase
/**
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function indexAction()
{
@@ -72,7 +71,6 @@ class AccessManagerController extends ControllerBase
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getGridTabs()
{
@@ -115,7 +113,6 @@ class AccessManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getUsersList()
{
@@ -129,7 +126,6 @@ class AccessManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getUsersGroupList()
{
@@ -142,7 +138,6 @@ class AccessManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getUsersProfileList()
{
@@ -155,7 +150,6 @@ class AccessManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getApiTokensList()
{
@@ -168,7 +162,6 @@ class AccessManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getPublicLinksList()
{
diff --git a/app/modules/web/Controllers/AccountController.php b/app/modules/web/Controllers/AccountController.php
index fdddc040..6fc84193 100644
--- a/app/modules/web/Controllers/AccountController.php
+++ b/app/modules/web/Controllers/AccountController.php
@@ -62,8 +62,8 @@ use SP\Util\Util;
*/
class AccountController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
+
/**
* @var AccountService
*/
@@ -531,7 +531,7 @@ class AccountController extends ControllerBase implements CrudControllerInterfac
/**
* Display account's password
*
- * @param int $id Account's ID
+ * @param int $id Account's ID
* @param int $isHistory The account's ID refers to history
* @throws \Psr\Container\ContainerExceptionInterface
*/
@@ -567,7 +567,7 @@ class AccountController extends ControllerBase implements CrudControllerInterfac
/**
* Copy account's password
*
- * @param int $id Account's ID
+ * @param int $id Account's ID
* @param int $isHistory The account's ID refers to history
* @throws Helpers\HelperException
* @throws SPException
@@ -738,7 +738,7 @@ class AccountController extends ControllerBase implements CrudControllerInterfac
* Saves restore action
*
* @param int $historyId Account's history ID
- * @param int $id Account's ID
+ * @param int $id Account's ID
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
*/
diff --git a/app/modules/web/Controllers/AccountFavoriteController.php b/app/modules/web/Controllers/AccountFavoriteController.php
index dd120fbc..0a3f0926 100644
--- a/app/modules/web/Controllers/AccountFavoriteController.php
+++ b/app/modules/web/Controllers/AccountFavoriteController.php
@@ -76,6 +76,8 @@ class AccountFavoriteController extends SimpleControllerBase
protected function initialize()
{
+ $this->checks();
+
$this->accountFavoriteService = $this->dic->get(AccountFavoriteService::class);
}
diff --git a/app/modules/web/Controllers/AccountFileController.php b/app/modules/web/Controllers/AccountFileController.php
index bbc98a96..a8df3ebf 100644
--- a/app/modules/web/Controllers/AccountFileController.php
+++ b/app/modules/web/Controllers/AccountFileController.php
@@ -49,8 +49,7 @@ use SP\Util\Util;
*/
class AccountFileController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
/**
* @var AccountFileService
@@ -238,7 +237,6 @@ class AccountFileController extends ControllerBase implements CrudControllerInte
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
diff --git a/app/modules/web/Controllers/ApiTokenController.php b/app/modules/web/Controllers/ApiTokenController.php
index da472004..67272f21 100644
--- a/app/modules/web/Controllers/ApiTokenController.php
+++ b/app/modules/web/Controllers/ApiTokenController.php
@@ -49,8 +49,7 @@ use SP\Services\User\UserService;
*/
class ApiTokenController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
/**
* @var AuthTokenService
@@ -62,7 +61,6 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -81,7 +79,6 @@ class ApiTokenController extends ControllerBase implements CrudControllerInterfa
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
diff --git a/app/modules/web/Controllers/CategoryController.php b/app/modules/web/Controllers/CategoryController.php
index 7309aa9b..1d2c8efb 100644
--- a/app/modules/web/Controllers/CategoryController.php
+++ b/app/modules/web/Controllers/CategoryController.php
@@ -46,8 +46,7 @@ use SP\Services\Category\CategoryService;
*/
class CategoryController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
/**
* @var CategoryService
@@ -59,7 +58,6 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -78,7 +76,6 @@ class CategoryController extends ControllerBase implements CrudControllerInterfa
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
diff --git a/app/modules/web/Controllers/ClientController.php b/app/modules/web/Controllers/ClientController.php
index b41436ba..860f213f 100644
--- a/app/modules/web/Controllers/ClientController.php
+++ b/app/modules/web/Controllers/ClientController.php
@@ -47,8 +47,7 @@ use SP\Services\Client\ClientService;
*/
class ClientController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
/**
* @var ClientService
@@ -60,7 +59,6 @@ class ClientController extends ControllerBase implements CrudControllerInterface
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -79,7 +77,6 @@ class ClientController extends ControllerBase implements CrudControllerInterface
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
@@ -331,5 +328,4 @@ class ClientController extends ControllerBase implements CrudControllerInterface
$this->clientService = $this->dic->get(ClientService::class);
}
-
}
\ No newline at end of file
diff --git a/app/modules/web/Controllers/ConfigAccountController.php b/app/modules/web/Controllers/ConfigAccountController.php
index 4757019f..666dc215 100644
--- a/app/modules/web/Controllers/ConfigAccountController.php
+++ b/app/modules/web/Controllers/ConfigAccountController.php
@@ -111,6 +111,7 @@ class ConfigAccountController extends SimpleControllerBase
protected function initialize()
{
try {
+ $this->checks();
$this->checkAccess(ActionsInterface::ACCOUNT_CONFIG);
} catch (UnauthorizedPageException $e) {
$this->eventDispatcher->notifyEvent('exception', new Event($e));
diff --git a/app/modules/web/Controllers/ConfigBackupController.php b/app/modules/web/Controllers/ConfigBackupController.php
index 86dcbfa4..9d3559c8 100644
--- a/app/modules/web/Controllers/ConfigBackupController.php
+++ b/app/modules/web/Controllers/ConfigBackupController.php
@@ -111,6 +111,7 @@ class ConfigBackupController extends SimpleControllerBase
protected function initialize()
{
try {
+ $this->checks();
$this->checkAccess(ActionsInterface::BACKUP_CONFIG);
} catch (UnauthorizedPageException $e) {
$this->eventDispatcher->notifyEvent('exception', new Event($e));
diff --git a/app/modules/web/Controllers/ConfigEncryptionController.php b/app/modules/web/Controllers/ConfigEncryptionController.php
index bd9cb236..4870306d 100644
--- a/app/modules/web/Controllers/ConfigEncryptionController.php
+++ b/app/modules/web/Controllers/ConfigEncryptionController.php
@@ -224,6 +224,7 @@ class ConfigEncryptionController extends SimpleControllerBase
protected function initialize()
{
try {
+ $this->checks();
$this->checkAccess(ActionsInterface::ENCRYPTION_CONFIG);
} catch (UnauthorizedPageException $e) {
$this->eventDispatcher->notifyEvent('exception', new Event($e));
diff --git a/app/modules/web/Controllers/ConfigGeneralController.php b/app/modules/web/Controllers/ConfigGeneralController.php
index af1a1315..9b4ebbbf 100644
--- a/app/modules/web/Controllers/ConfigGeneralController.php
+++ b/app/modules/web/Controllers/ConfigGeneralController.php
@@ -160,6 +160,7 @@ class ConfigGeneralController extends SimpleControllerBase
protected function initialize()
{
try {
+ $this->checks();
$this->checkAccess(ActionsInterface::CONFIG_GENERAL);
} catch (UnauthorizedPageException $e) {
$this->eventDispatcher->notifyEvent('exception', new Event($e));
diff --git a/app/modules/web/Controllers/ConfigImportController.php b/app/modules/web/Controllers/ConfigImportController.php
index 3d13e3ac..50c69484 100644
--- a/app/modules/web/Controllers/ConfigImportController.php
+++ b/app/modules/web/Controllers/ConfigImportController.php
@@ -91,6 +91,7 @@ class ConfigImportController extends SimpleControllerBase
protected function initialize()
{
try {
+ $this->checks();
$this->checkAccess(ActionsInterface::IMPORT_CONFIG);
} catch (UnauthorizedPageException $e) {
$this->eventDispatcher->notifyEvent('exception', new Event($e));
diff --git a/app/modules/web/Controllers/ConfigLdapController.php b/app/modules/web/Controllers/ConfigLdapController.php
index 5ab3c086..521c92a3 100644
--- a/app/modules/web/Controllers/ConfigLdapController.php
+++ b/app/modules/web/Controllers/ConfigLdapController.php
@@ -271,6 +271,7 @@ class ConfigLdapController extends SimpleControllerBase
protected function initialize()
{
try {
+ $this->checks();
$this->checkAccess(ActionsInterface::LDAP_CONFIG);
} catch (UnauthorizedPageException $e) {
$this->eventDispatcher->notifyEvent('exception', new Event($e));
diff --git a/app/modules/web/Controllers/ConfigMailController.php b/app/modules/web/Controllers/ConfigMailController.php
index 89f7351a..22d98af8 100644
--- a/app/modules/web/Controllers/ConfigMailController.php
+++ b/app/modules/web/Controllers/ConfigMailController.php
@@ -98,6 +98,7 @@ class ConfigMailController extends SimpleControllerBase
protected function initialize()
{
try {
+ $this->checks();
$this->checkAccess(ActionsInterface::MAIL_CONFIG);
} catch (UnauthorizedPageException $e) {
$this->eventDispatcher->notifyEvent('exception', new Event($e));
diff --git a/app/modules/web/Controllers/ConfigWikiController.php b/app/modules/web/Controllers/ConfigWikiController.php
index 9a2c36c5..5a8f532b 100644
--- a/app/modules/web/Controllers/ConfigWikiController.php
+++ b/app/modules/web/Controllers/ConfigWikiController.php
@@ -113,6 +113,7 @@ class ConfigWikiController extends SimpleControllerBase
protected function initialize()
{
try {
+ $this->checks();
$this->checkAccess(ActionsInterface::WIKI_CONFIG);
} catch (UnauthorizedPageException $e) {
$this->eventDispatcher->notifyEvent('exception', new Event($e));
diff --git a/app/modules/web/Controllers/CustomFieldController.php b/app/modules/web/Controllers/CustomFieldController.php
index 292e15e9..dcc1fb78 100644
--- a/app/modules/web/Controllers/CustomFieldController.php
+++ b/app/modules/web/Controllers/CustomFieldController.php
@@ -24,7 +24,6 @@
namespace SP\Modules\Web\Controllers;
-
use SP\Core\Acl\Acl;
use SP\Core\Acl\ActionsInterface;
use SP\Core\Events\Event;
@@ -49,8 +48,7 @@ use SP\Services\CustomField\CustomFieldDefService;
*/
class CustomFieldController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
/**
* @var CustomFieldDefService
@@ -62,7 +60,6 @@ class CustomFieldController extends ControllerBase implements CrudControllerInte
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -81,7 +78,6 @@ class CustomFieldController extends ControllerBase implements CrudControllerInte
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
diff --git a/app/modules/web/Controllers/ErrorController.php b/app/modules/web/Controllers/ErrorController.php
index 31be3c9d..5cd820f2 100644
--- a/app/modules/web/Controllers/ErrorController.php
+++ b/app/modules/web/Controllers/ErrorController.php
@@ -51,7 +51,6 @@ class ErrorController
/**
* ErrorController constructor.
*
- * @throws \ReflectionException
* @throws \SP\Core\Dic\ContainerException
*/
public function __construct()
diff --git a/app/modules/web/Controllers/EventlogController.php b/app/modules/web/Controllers/EventlogController.php
index 40ebd181..da72182b 100644
--- a/app/modules/web/Controllers/EventlogController.php
+++ b/app/modules/web/Controllers/EventlogController.php
@@ -49,8 +49,6 @@ class EventlogController extends ControllerBase
/**
* indexAction
- *
- * @throws \SP\Core\Dic\ContainerException
*/
public function indexAction()
{
@@ -69,7 +67,6 @@ class EventlogController extends ControllerBase
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
@@ -114,8 +111,15 @@ class EventlogController extends ControllerBase
}
}
+ /**
+ * @throws \Psr\Container\ContainerExceptionInterface
+ * @throws \Psr\Container\NotFoundExceptionInterface
+ * @throws \SP\Services\Auth\AuthException
+ */
protected function initialize()
{
+ $this->checkLoggedIn();
+
$this->eventLogService = $this->dic->get(EventlogService::class);
}
}
\ No newline at end of file
diff --git a/app/modules/web/Controllers/Helpers/Account/AccountPasswordHelper.php b/app/modules/web/Controllers/Helpers/Account/AccountPasswordHelper.php
index d42eaab5..d7a352ea 100644
--- a/app/modules/web/Controllers/Helpers/Account/AccountPasswordHelper.php
+++ b/app/modules/web/Controllers/Helpers/Account/AccountPasswordHelper.php
@@ -51,7 +51,7 @@ class AccountPasswordHelper extends HelperBase
* @param AccountPassData $account
* @param \SP\Core\Acl\Acl $acl
* @param $type
- * @return string
+ * @return string|null
* @throws HelperException
* @throws \Defuse\Crypto\Exception\CryptoException
* @throws \SP\Core\Exceptions\SPException
@@ -68,6 +68,8 @@ class AccountPasswordHelper extends HelperBase
$this->setTemplateVars($account);
break;
}
+
+ return null;
}
/**
diff --git a/app/modules/web/Controllers/Helpers/Account/AccountSearchHelper.php b/app/modules/web/Controllers/Helpers/Account/AccountSearchHelper.php
index 1653ff76..af62d8c6 100644
--- a/app/modules/web/Controllers/Helpers/Account/AccountSearchHelper.php
+++ b/app/modules/web/Controllers/Helpers/Account/AccountSearchHelper.php
@@ -150,7 +150,6 @@ class AccountSearchHelper extends HelperBase
* Devuelve la matriz a utilizar en la vista
*
* @return DataGrid
- * @throws \SP\Core\Dic\ContainerException
*/
private function getGrid()
{
@@ -182,7 +181,7 @@ class AccountSearchHelper extends HelperBase
$actions = $this->dic->get(AccountActionsHelper::class);
- $Grid = new DataGrid();
+ $Grid = new DataGrid($this->view->getTheme());
$Grid->setId('gridSearch');
$Grid->setDataHeaderTemplate('search-header', $this->view->getBase());
$Grid->setDataRowTemplate('search-rows', $this->view->getBase());
diff --git a/app/modules/web/Controllers/Helpers/ItemsGridHelper.php b/app/modules/web/Controllers/Helpers/ItemsGridHelper.php
index 2de77cff..feeeb484 100644
--- a/app/modules/web/Controllers/Helpers/ItemsGridHelper.php
+++ b/app/modules/web/Controllers/Helpers/ItemsGridHelper.php
@@ -63,7 +63,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getCategoriesGrid(array $data)
{
@@ -80,7 +79,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblCategories');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -165,7 +164,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getClientsGrid(array $data)
{
@@ -186,7 +184,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblCustomers');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -249,7 +247,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getCustomFieldsGrid(array $data)
{
@@ -270,7 +267,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblCustomFields');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -333,7 +330,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getFilesGrid(array $data)
{
@@ -356,7 +352,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblFiles');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -419,7 +415,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getAccountsGrid(array $data)
{
@@ -436,7 +431,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblAccounts');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -476,7 +471,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getAccountsHistoryGrid(array $data)
{
@@ -501,7 +495,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblAccountsHistory');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -551,7 +545,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getUsersGrid(array $data)
{
@@ -577,7 +570,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblUsers');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -679,7 +672,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getUserGroupsGrid(array $data)
{
@@ -696,7 +688,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblGroups');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -770,7 +762,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getUserProfilesGrid(array $data)
{
@@ -785,7 +776,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblProfiles');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -859,7 +850,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getApiTokensGrid(array $data)
{
@@ -876,7 +866,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblTokens');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -950,7 +940,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getPublicLinksGrid(array $data)
{
@@ -977,7 +966,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblLinks');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -1050,7 +1039,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getTagsGrid(array $data)
{
@@ -1065,7 +1053,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblTags');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -1128,7 +1116,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGridTab
- * @throws \SP\Core\Dic\ContainerException
*/
public function getPluginsGrid(array $data)
{
@@ -1147,7 +1134,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGridTab();
+ $Grid = new DataGridTab($this->view->getTheme());
$Grid->setId('tblPlugins');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -1190,6 +1177,7 @@ class ItemsGridHelper extends HelperBase
$GridActionEnable->setFilterRowSource('enabled');
$GridActionEnable->setFilterRowSource('available', 0);
$GridActionEnable->addData('action-route', Acl::getActionRoute(ActionsInterface::PLUGIN_ENABLE));
+ $GridActionEnable->addData('action-method', 'get');
$Grid->setDataActions($GridActionEnable);
@@ -1202,6 +1190,7 @@ class ItemsGridHelper extends HelperBase
$GridActionDisable->setFilterRowSource('enabled', 0);
$GridActionDisable->setFilterRowSource('available', 0);
$GridActionDisable->addData('action-route', Acl::getActionRoute(ActionsInterface::PLUGIN_DISABLE));
+ $GridActionDisable->addData('action-method', 'get');
$Grid->setDataActions($GridActionDisable);
@@ -1213,6 +1202,7 @@ class ItemsGridHelper extends HelperBase
$GridActionReset->setOnClickFunction('plugin/reset');
$GridActionReset->setFilterRowSource('available', 0);
$GridActionReset->addData('action-route', Acl::getActionRoute(ActionsInterface::PLUGIN_RESET));
+ $GridActionReset->addData('action-method', 'get');
$Grid->setDataActions($GridActionReset);
@@ -1222,7 +1212,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGrid
- * @throws \SP\Core\Dic\ContainerException
*/
public function getEventLogGrid(array $data)
{
@@ -1260,7 +1249,7 @@ class ItemsGridHelper extends HelperBase
if (preg_match('/^SQL.*/m', $text)) {
$text = preg_replace([
- '/([[:alpha:]_]+),/m',
+ '/([a-zA-Z_]+),/m',
'/(UPDATE|DELETE|TRUNCATE|INSERT|SELECT|WHERE|LEFT|ORDER|LIMIT|FROM)/m'],
['\\1,
', '
\\1'],
$text);
@@ -1275,7 +1264,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGrid();
+ $Grid = new DataGrid($this->view->getTheme());
$Grid->setId('tblEventLog');
$Grid->setDataTableTemplate('datagrid-table-simple', 'grid');
$Grid->setDataRowTemplate('datagrid-rows', $this->view->getBase());
@@ -1330,7 +1319,6 @@ class ItemsGridHelper extends HelperBase
/**
* @param array $data
* @return DataGrid
- * @throws \SP\Core\Dic\ContainerException
*/
public function getNotificationsGrid(array $data)
{
@@ -1360,7 +1348,7 @@ class ItemsGridHelper extends HelperBase
$GridData->setData($data);
// Grid
- $Grid = new DataGrid();
+ $Grid = new DataGrid($this->view->getTheme());
$Grid->setId('tblNotifications');
$Grid->setDataRowTemplate('datagrid-rows', 'grid');
$Grid->setDataPagerTemplate('datagrid-nav-full', 'grid');
@@ -1455,7 +1443,7 @@ class ItemsGridHelper extends HelperBase
* Actualizar los datos del paginador
*
* @param DataGridInterface $dataGrid
- * @param ItemSearchData $itemSearchData
+ * @param ItemSearchData $itemSearchData
* @return DataGridInterface
*/
public function updatePager(DataGridInterface $dataGrid, ItemSearchData $itemSearchData)
diff --git a/app/modules/web/Controllers/Helpers/LayoutHelper.php b/app/modules/web/Controllers/Helpers/LayoutHelper.php
index 73ead596..e20da22c 100644
--- a/app/modules/web/Controllers/Helpers/LayoutHelper.php
+++ b/app/modules/web/Controllers/Helpers/LayoutHelper.php
@@ -375,5 +375,4 @@ class LayoutHelper extends HelperBase
$this->view->assign('loggedIn', $this->loggedIn);
}
-
}
\ No newline at end of file
diff --git a/app/modules/web/Controllers/ItemManagerController.php b/app/modules/web/Controllers/ItemManagerController.php
index a6b02c8b..0a7f4844 100644
--- a/app/modules/web/Controllers/ItemManagerController.php
+++ b/app/modules/web/Controllers/ItemManagerController.php
@@ -31,13 +31,13 @@ use SP\DataModel\ItemSearchData;
use SP\Http\Request;
use SP\Modules\Web\Controllers\Helpers\ItemsGridHelper;
use SP\Modules\Web\Controllers\Helpers\TabsGridHelper;
-use SP\Repositories\Plugin\PluginRepository;
use SP\Services\Account\AccountFileService;
use SP\Services\Account\AccountHistoryService;
use SP\Services\Account\AccountService;
use SP\Services\Category\CategoryService;
use SP\Services\Client\ClientService;
use SP\Services\CustomField\CustomFieldDefService;
+use SP\Services\Plugin\PluginService;
use SP\Services\Tag\TagService;
/**
@@ -63,7 +63,6 @@ class ItemManagerController extends ControllerBase
/**
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function indexAction()
{
@@ -75,7 +74,6 @@ class ItemManagerController extends ControllerBase
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getGridTabs()
{
@@ -130,7 +128,6 @@ class ItemManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getCategoriesList()
{
@@ -143,7 +140,6 @@ class ItemManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getTagsList()
{
@@ -156,7 +152,6 @@ class ItemManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getClientsList()
{
@@ -169,7 +164,6 @@ class ItemManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getCustomFieldsList()
{
@@ -182,7 +176,6 @@ class ItemManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getAccountFilesList()
{
@@ -195,7 +188,6 @@ class ItemManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getAccountsList()
{
@@ -208,7 +200,6 @@ class ItemManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getAccountsHistoryList()
{
@@ -221,12 +212,10 @@ class ItemManagerController extends ControllerBase
* @return \SP\Html\DataGrid\DataGridTab
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getPluginsList()
{
- // FIXME: create Plugin Service
- return $this->itemsGridHelper->getPluginsGrid($this->dic->get(PluginRepository::class)->search($this->itemSearchData))->updatePager();
+ return $this->itemsGridHelper->getPluginsGrid($this->dic->get(PluginService::class)->search($this->itemSearchData))->updatePager();
}
/**
diff --git a/app/modules/web/Controllers/NotificationController.php b/app/modules/web/Controllers/NotificationController.php
index 6e6fc3c8..2c0308a4 100644
--- a/app/modules/web/Controllers/NotificationController.php
+++ b/app/modules/web/Controllers/NotificationController.php
@@ -56,7 +56,7 @@ class NotificationController extends ControllerBase implements CrudControllerInt
protected $notificationService;
/**
- * @throws \SP\Core\Dic\ContainerException
+ * indexAction
*/
public function indexAction()
{
@@ -75,7 +75,6 @@ class NotificationController extends ControllerBase implements CrudControllerInt
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
@@ -147,8 +146,6 @@ class NotificationController extends ControllerBase implements CrudControllerInt
/**
* Search action
- *
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -361,8 +358,15 @@ class NotificationController extends ControllerBase implements CrudControllerInt
}
}
+ /**
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ * @throws \SP\Services\Auth\AuthException
+ */
protected function initialize()
{
+ $this->checkLoggedIn();
+
$this->notificationService = $this->dic->get(NotificationService::class);
}
}
\ No newline at end of file
diff --git a/app/modules/web/Controllers/PluginController.php b/app/modules/web/Controllers/PluginController.php
new file mode 100644
index 00000000..f64e3563
--- /dev/null
+++ b/app/modules/web/Controllers/PluginController.php
@@ -0,0 +1,238 @@
+.
+ */
+
+namespace SP\Modules\Web\Controllers;
+
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use SP\Core\Acl\Acl;
+use SP\Core\Acl\ActionsInterface;
+use SP\Core\Events\Event;
+use SP\Core\Events\EventMessage;
+use SP\DataModel\PluginData;
+use SP\Http\JsonResponse;
+use SP\Http\Request;
+use SP\Modules\Web\Controllers\Helpers\ItemsGridHelper;
+use SP\Modules\Web\Controllers\Traits\ItemTrait;
+use SP\Modules\Web\Controllers\Traits\JsonTrait;
+use SP\Services\Plugin\PluginService;
+
+/**
+ * Class PluginController
+ * @package web\Controllers
+ */
+class PluginController extends ControllerBase
+{
+ use JsonTrait, ItemTrait;
+
+ /**
+ * @var PluginService
+ */
+ protected $pluginService;
+
+ /**
+ * indexAction
+ */
+ public function indexAction()
+ {
+ if (!$this->acl->checkUserAccess(ActionsInterface::PLUGIN)) {
+ return;
+ }
+
+ $this->view->addTemplate('index');
+
+ $this->view->assign('data', $this->getSearchGrid());
+
+ $this->view();
+ }
+
+ /**
+ * getSearchGrid
+ *
+ * @return $this
+ */
+ protected function getSearchGrid()
+ {
+ $itemsGridHelper = $this->dic->get(ItemsGridHelper::class);
+ $itemSearchData = $this->getSearchData($this->configData->getAccountCount());
+
+ return $itemsGridHelper->updatePager($itemsGridHelper->getPluginsGrid($this->pluginService->search($itemSearchData)), $itemSearchData);
+ }
+
+ /**
+ * Search action
+ *
+ * @throws \Psr\Container\ContainerExceptionInterface
+ * @throws \Psr\Container\NotFoundExceptionInterface
+ */
+ public function searchAction()
+ {
+ if (!$this->acl->checkUserAccess(ActionsInterface::PLUGIN_SEARCH)) {
+ return;
+ }
+
+ $this->view->addTemplate('datagrid-table', 'grid');
+ $this->view->assign('index', Request::analyzeInt('activetab', 0));
+ $this->view->assign('data', $this->getSearchGrid());
+
+ $this->returnJsonResponseData(['html' => $this->render()]);
+ }
+
+ /**
+ * View action
+ *
+ * @param $id
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ */
+ public function viewAction($id)
+ {
+ if (!$this->acl->checkUserAccess(ActionsInterface::PLUGIN_VIEW)) {
+ return;
+ }
+
+ $this->view->assign('header', __('Ver Plugin'));
+ $this->view->assign('isView', true);
+
+ try {
+ $this->setViewData($id);
+
+ $this->eventDispatcher->notifyEvent('show.plugin', new Event($this));
+
+ $this->returnJsonResponseData(['html' => $this->render()]);
+ } catch (\Exception $e) {
+ processException($e);
+
+ $this->returnJsonResponseException($e);
+ }
+ }
+
+ /**
+ * Sets view data for displaying items's data
+ *
+ * @param $pluginId
+ * @throws \Psr\Container\ContainerExceptionInterface
+ * @throws \Psr\Container\NotFoundExceptionInterface
+ */
+ protected function setViewData($pluginId = null)
+ {
+ $this->view->addTemplate('plugin');
+
+ $pluginData = $pluginId ? $this->pluginService->getById($pluginId) : new PluginData();
+
+ $this->view->assign('plugin', $pluginData);
+
+ $this->view->assign('sk', $this->session->generateSecurityKey());
+ $this->view->assign('nextAction', Acl::getActionRoute(ActionsInterface::ITEMS_MANAGE));
+
+ if ($this->view->isView === true) {
+ $this->view->assign('disabled', 'disabled');
+ $this->view->assign('readonly', 'readonly');
+ } else {
+ $this->view->assign('disabled');
+ $this->view->assign('readonly');
+ }
+ }
+
+ /**
+ * enableAction
+ *
+ * @param $id
+ */
+ public function enableAction($id)
+ {
+ try {
+ $this->pluginService->toggleEnabled($id, 1);
+
+ $this->eventDispatcher->notifyEvent('edit.plugin.enable',
+ new Event($this,
+ EventMessage::factory()->addDescription(__u('Plugin habilitado')))
+ );
+
+ $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Plugin habilitado'));
+ } catch (\Exception $e) {
+ processException($e);
+
+ $this->returnJsonResponseException($e);
+ }
+ }
+
+ /**
+ * disableAction
+ *
+ * @param $id
+ */
+ public function disableAction($id)
+ {
+ try {
+ $this->pluginService->toggleEnabled($id, 0);
+
+ $this->eventDispatcher->notifyEvent('edit.plugin.disable',
+ new Event($this,
+ EventMessage::factory()->addDescription(__u('Plugin deshabilitado')))
+ );
+
+ $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Plugin deshabilitado'));
+ } catch (\Exception $e) {
+ processException($e);
+
+ $this->returnJsonResponseException($e);
+ }
+ }
+
+ /**
+ * resetAction
+ *
+ * @param $id
+ */
+ public function resetAction($id)
+ {
+ try {
+ $this->pluginService->resetById($id);
+
+ $this->eventDispatcher->notifyEvent('edit.plugin.reset',
+ new Event($this,
+ EventMessage::factory()->addDescription(__u('Plugin restablecido')))
+ );
+
+ $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Plugin restablecido'));
+ } catch (\Exception $e) {
+ processException($e);
+
+ $this->returnJsonResponseException($e);
+ }
+ }
+
+ /**
+ * @throws ContainerExceptionInterface
+ * @throws NotFoundExceptionInterface
+ * @throws \SP\Services\Auth\AuthException
+ */
+ protected function initialize()
+ {
+ $this->checkLoggedIn();
+
+ $this->pluginService = $this->dic->get(PluginService::class);
+ }
+}
\ No newline at end of file
diff --git a/app/modules/web/Controllers/PublicLinkController.php b/app/modules/web/Controllers/PublicLinkController.php
index 407fde32..8eb0c634 100644
--- a/app/modules/web/Controllers/PublicLinkController.php
+++ b/app/modules/web/Controllers/PublicLinkController.php
@@ -49,8 +49,7 @@ use SP\Services\PublicLink\PublicLinkService;
*/
class PublicLinkController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
/**
* @var PublicLinkService
@@ -62,7 +61,6 @@ class PublicLinkController extends ControllerBase implements CrudControllerInter
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -81,7 +79,6 @@ class PublicLinkController extends ControllerBase implements CrudControllerInter
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
diff --git a/app/modules/web/Controllers/TagController.php b/app/modules/web/Controllers/TagController.php
index 53497513..ec34646a 100644
--- a/app/modules/web/Controllers/TagController.php
+++ b/app/modules/web/Controllers/TagController.php
@@ -24,7 +24,6 @@
namespace SP\Modules\Web\Controllers;
-
use SP\Core\Acl\Acl;
use SP\Core\Acl\ActionsInterface;
use SP\Core\Events\Event;
@@ -46,8 +45,7 @@ use SP\Services\Tag\TagService;
*/
class TagController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
/**
* @var TagService
@@ -59,7 +57,6 @@ class TagController extends ControllerBase implements CrudControllerInterface
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -78,7 +75,6 @@ class TagController extends ControllerBase implements CrudControllerInterface
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
diff --git a/app/modules/web/Controllers/UserController.php b/app/modules/web/Controllers/UserController.php
index bc367cd0..252f4669 100644
--- a/app/modules/web/Controllers/UserController.php
+++ b/app/modules/web/Controllers/UserController.php
@@ -29,7 +29,6 @@ use SP\Core\Acl\ActionsInterface;
use SP\Core\Events\Event;
use SP\Core\Events\EventMessage;
use SP\Core\Exceptions\ValidationException;
-use SP\Core\SessionUtil;
use SP\DataModel\UserData;
use SP\Http\JsonResponse;
use SP\Http\Request;
@@ -65,7 +64,6 @@ class UserController extends ControllerBase implements CrudControllerInterface
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -84,7 +82,6 @@ class UserController extends ControllerBase implements CrudControllerInterface
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
@@ -203,7 +200,7 @@ class UserController extends ControllerBase implements CrudControllerInterface
$this->view->assign('header', __('Cambio de Clave'));
$this->view->assign('isView', false);
$this->view->assign('route', 'user/saveEditPass/' . $id);
- $this->view->assign('sk', SessionUtil::getSessionKey(true));
+ $this->view->assign('sk', $this->session->generateSecurityKey());
try {
$user = $id ? $this->userService->getById($id) : new UserData();
@@ -432,7 +429,9 @@ class UserController extends ControllerBase implements CrudControllerInterface
}
/**
- * Initialize class
+ * @throws \Psr\Container\ContainerExceptionInterface
+ * @throws \Psr\Container\NotFoundExceptionInterface
+ * @throws \SP\Services\Auth\AuthException
*/
protected function initialize()
{
diff --git a/app/modules/web/Controllers/UserGroupController.php b/app/modules/web/Controllers/UserGroupController.php
index 46b39fc2..7b2c94d9 100644
--- a/app/modules/web/Controllers/UserGroupController.php
+++ b/app/modules/web/Controllers/UserGroupController.php
@@ -49,8 +49,7 @@ use SP\Services\UserGroup\UserToUserGroupService;
*/
class UserGroupController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
/**
* @var UserGroupService
@@ -66,7 +65,6 @@ class UserGroupController extends ControllerBase implements CrudControllerInterf
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -85,7 +83,6 @@ class UserGroupController extends ControllerBase implements CrudControllerInterf
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
diff --git a/app/modules/web/Controllers/UserProfileController.php b/app/modules/web/Controllers/UserProfileController.php
index 76107be1..7fa4a380 100644
--- a/app/modules/web/Controllers/UserProfileController.php
+++ b/app/modules/web/Controllers/UserProfileController.php
@@ -47,8 +47,7 @@ use SP\Services\UserProfile\UserProfileService;
*/
class UserProfileController extends ControllerBase implements CrudControllerInterface
{
- use JsonTrait;
- use ItemTrait;
+ use JsonTrait, ItemTrait;
/**
* @var UserProfileService
@@ -60,7 +59,6 @@ class UserProfileController extends ControllerBase implements CrudControllerInte
*
* @throws \Psr\Container\ContainerExceptionInterface
* @throws \Psr\Container\NotFoundExceptionInterface
- * @throws \SP\Core\Dic\ContainerException
*/
public function searchAction()
{
@@ -79,7 +77,6 @@ class UserProfileController extends ControllerBase implements CrudControllerInte
* getSearchGrid
*
* @return $this
- * @throws \SP\Core\Dic\ContainerException
*/
protected function getSearchGrid()
{
diff --git a/app/modules/web/Controllers/UserSettingsGeneralController.php b/app/modules/web/Controllers/UserSettingsGeneralController.php
index 3e99cdd0..639750bb 100644
--- a/app/modules/web/Controllers/UserSettingsGeneralController.php
+++ b/app/modules/web/Controllers/UserSettingsGeneralController.php
@@ -80,6 +80,8 @@ class UserSettingsGeneralController extends SimpleControllerBase
*/
protected function initialize()
{
+ $this->checks();
+
$this->userService = $this->dic->get(UserService::class);
}
}
\ No newline at end of file
diff --git a/app/modules/web/Controllers/UserSettingsManagerController.php b/app/modules/web/Controllers/UserSettingsManagerController.php
index 93d39339..1101bda5 100644
--- a/app/modules/web/Controllers/UserSettingsManagerController.php
+++ b/app/modules/web/Controllers/UserSettingsManagerController.php
@@ -89,4 +89,14 @@ class UserSettingsManagerController extends ControllerBase
return new DataTab(__('Preferencias'), $template);
}
+
+ /**
+ * @throws \Psr\Container\ContainerExceptionInterface
+ * @throws \Psr\Container\NotFoundExceptionInterface
+ * @throws \SP\Services\Auth\AuthException
+ */
+ protected function initialize()
+ {
+ $this->checkLoggedIn();
+ }
}
\ No newline at end of file
diff --git a/app/modules/web/themes/material-blue/css/styles.min.css b/app/modules/web/themes/material-blue/css/styles.min.css
index df80b005..7692b83c 100644
--- a/app/modules/web/themes/material-blue/css/styles.min.css
+++ b/app/modules/web/themes/material-blue/css/styles.min.css
@@ -1 +1 @@
-html,body{margin:0;padding:0;text-align:left;background-color:#f5f5f5;color:#555;font-size:12px;font-weight:normal;box-sizing:border-box}*{font-family:"Roboto Regular",Verdana,Tahoma,sans-serif;box-sizing:inherit}*:before,*:after{box-sizing:inherit}table{font-size:11px;border-spacing:0}table th{border-bottom:2px solid transparent;vertical-align:middle}table th .icon{width:24px;height:24px}table tr{height:20px}table tr.odd{background-color:#f9f9f9}table tr.even>td,table tr.odd>td{border-bottom:1px solid #d9d9d9 !important}table tr.even:hover,table tr.odd:hover{background-color:#e8ff99}table td{padding:3px}table td.txtCliente{font-weight:bold;text-align:center}form{font-size:11px;margin:0}input.inputImg,img.inputImg{background-color:transparent !important;width:24px !important;height:24px !important;border:0;vertical-align:middle;margin:0 .5em}input.txtFile{width:200px}input.txtLong{width:300px}textarea{width:350px}select.files{width:250px}input.spinner{width:5em}img{margin:0;padding:0;border:0;cursor:pointer}img.inputImgMini{background-color:transparent !important;width:16px !important;height:16px !important;margin:0 5px 0 5px;border:0;vertical-align:middle}i{cursor:pointer}form .form-field{display:flex;justify-content:space-between}form .form-field>label{min-width:12em;padding:.5em 0;font-size:16px;align-self:center}form .form-field>div{width:100%;align-self:center}a{text-decoration:none;color:#536dfe}a:visited{text-decoration:none;color:#536dfe}a:hover,a:active,a:focus{text-decoration:none;cursor:pointer}pre,code,samp,kbd{font-family:Consolas,"Andale Mono WT","Andale Mono","Bitstream Vera Sans Mono","Nimbus Mono L",Monaco,"Courier New",monospace;font-size:1em;direction:ltr;text-align:left;background-color:#fbfaf9;color:#333;box-shadow:inset 0 0 .3em #ccc;border-radius:2px}#nojs{width:80%;text-align:center;vertical-align:middle;margin:10px auto;padding:3px;background-color:#ef5350;color:white;font-weight:bold;font-size:14px}#wrap{height:auto !important;min-height:100%;width:100%;background-color:#f5f5f5}#wrap-loading{position:fixed;z-index:9999;top:50%;left:50%;padding:1em;background-color:rgba(255,255,255,0.8);display:none;border-radius:5px !important;-moz-border-radius:5px !important;-webkit-border-radius:5px !important}#wrap-loading.overlay-full{top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,0.5)}#wrap-loading.overlay-full #loading{position:absolute;top:50%;left:50%}#wrap-loading.overlay-full #taskStatus{display:block}#wrap-loading #taskStatus{display:none;position:absolute;left:0;top:55%;width:100%;text-align:center;color:white;background-color:rgba(0,0,0,0.5);padding:1em 0}#container{margin:auto;width:100%}#container.login{padding-top:5%}#container.error,#container.install,#container.passreset{width:100%}#container .logo{height:64px}#container #actions-bar{z-index:100;display:flex;justify-content:space-between;position:fixed;border:0 none;top:0;left:0;width:100%;padding:1em 0;background-color:transparent}#container #actions-bar-icons{flex-grow:1;text-align:center}#container #actions-bar-logo{display:none;padding:0 .5em}#container #actions-bar-logo img{display:inline-block;width:50px;opacity:.75}#container #content{width:95%;margin:2em auto 8em auto}#container #content.public-link{width:70%;min-height:0;margin:5em auto}#content td.descField,#box-popup td.descField{text-align:right;padding-right:20px;width:25%;border-right:1px solid #d9d9d9;color:#999;font-size:12px;font-weight:bold}#content td.valField,#box-popup td.valField{padding-left:1em;width:100%}#content td.valField .lowres-title,#box-popup td.valField .lowres-title{display:none;width:100%;color:#607d8b;font-size:12px}#content .pager{width:100%;margin-top:15px;padding:.5em;vertical-align:middle;font-size:11px;color:#999;background-color:#fcfcfc}#content .pager img{margin-left:5px;vertical-align:middle}#content .pager a{margin-left:5px;font-size:12px;color:#999}#content .pager>div{display:inline-block;width:49%}#content .pager .pager-left{text-align:left}#content .pager .pager-right{text-align:right}#content #title{width:50%;padding:7px;margin:auto;background-color:#d9d9d9;color:#fff;font-size:17px;letter-spacing:.3em;text-align:center}#content #title.titleNormal{background-color:#607d8b;color:#fff}#content .data-container{width:75%;margin:0 auto}#content fieldset.data{margin:2em auto}#content fieldset.data>legend{color:#607d8b;padding:0 .5em;font-size:1.5em}#content fieldset.data>div{display:none}#content fieldset.data>div table{width:100%}#content .data{width:100%;padding:10px;margin:0 auto;background-color:#fff;-webkit-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);-moz-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);box-shadow:1px 1px 2px rgba(0,0,0,0.14)}#content .data #history-icon{position:relative;top:5em;right:2em}#content .data td{text-align:left}#content .data td.descField{text-align:right}#content .data select{min-width:210px}#content .data .list-wrap{max-height:10em;overflow:auto;padding:.5em;margin:1em 0}#content .data .dropzone{width:30em;padding:1em;border:2px dashed #26a69a;text-align:center}#content .data .dropzone img{vertical-align:middle}#content .data .file-upload{display:none}#content .data .account-permissions{width:100%}#content .data .account-permissions fieldset{border:1px solid #c9c9c9;padding:1em}#content .data .account-permissions legend{font-weight:bold;color:#999;padding:.2em 0}#content .data .account-permissions fieldset>span{font-weight:bold;color:#999;padding:.2em 0;display:inline-block;width:100px;text-align:right}#content span.tag{margin:0 3px 3px 0;padding:.2em;background:#5c6bc0;color:#fff;border:0 solid transparent;border-radius:3px !important;-moz-border-radius:3px !important;-webkit-border-radius:3px !important}#content .extra-info{margin-top:20px}#content #tabs fieldset{border:1px solid #c9c9c9}#content #tabs #frmConfig label{float:left}#content .tblConfig{margin-bottom:2em}#content .tblConfig td.descField{width:35%;font-size:11px;font-weight:bold}#content .tblConfig td.rowHeader{padding:5px 0 5px 0;background-color:#f5f5f5;text-align:center;font-weight:bold;border-top:15px solid #f9f9f9;border-bottom:3px solid #a9c1d7;letter-spacing:.5em;color:#696969}#content .tblConfig input.checkbox{width:15px;text-align:left;padding:0}#content .tblConfig .option-disabled{text-align:center;background-color:#fff8e1;color:#ffca28;font-weight:bold}#content h2{width:100%;height:1.5em;font-size:18px;color:white;background-color:#a9c1d7;margin:0;padding-top:.1em}#content .section{margin-top:2.5em;border-bottom:1px solid #d9d9d9;text-align:left;font-size:14px;font-weight:bold;color:#5c6bc0}#content .row_even>td{background-color:#f5f5f5}#content .row_odd>td{background-color:white}#content .data-header ul{list-style:none;width:100%;margin:0 0 10px 0;padding:0}#content .data-header li{display:inline-block;padding:.2em .5em;font-weight:bold;letter-spacing:.2em;color:#fff;text-align:center}#content .data-header li a{color:#777}#content .data-header li img{float:right;width:24px;height:24px;vertical-align:middle}#content .data-header-minimal{border-bottom:1px solid #dfdfdf}#content .data-header-minimal ul{display:flex;flex-wrap:wrap;justify-content:flex-start;margin:0}#content .data-header-minimal li{display:inline-flex;min-width:10em;font-weight:normal;letter-spacing:normal}#content .data-header-minimal li a{color:#b9b9b9;padding:.3em .8em}#content .data-table{width:100%}#content .data-table td:first-of-type,#content .data-table th:first-of-type{width:5em}#content .data-table thead th{background-color:#607d8b;color:#fff}#content .data-table tbody td.cell-data{text-align:left}#content .data-table tbody td.cell-nodata{padding:0 .5em;text-align:left}#content .data-table tbody td.cell-actions{text-align:right}#content .data-table tbody td.cell-actions i{opacity:.5}#content .data-table tbody td.cell-actions i:hover{opacity:1}#content .data-rows ul{display:table;list-style:none;width:100%;margin:0 0 10px 0;padding:0;background-color:#fcfcfc}#content .data-rows li{float:left;display:block;padding:1em;color:#696969;text-align:center;min-height:2em}#content .data-rows li.cell-nodata{padding:1em 0;min-height:2em;text-align:left}#content .data-rows li.cell-actions{float:right;min-height:2em;padding:1em 0;text-align:left;background-color:#fcfcfc;width:15em}#content .data-rows li.cell-nodata img,#content .data-rows li.cell-actions img{width:24px;height:24px;margin:0 .5em}#content #resEventLog .data{width:100%}#content #resEventLog thead{text-align:center}#content #resEventLog tbody{width:100%;height:500px;overflow:auto}#content #resEventLog td{border-bottom:1px solid #d9d9d9}#content #resEventLog .cell{text-align:center}#content #resEventLog .cell-description{width:60%}#content #searchbox{background-color:#fcfcfc;vertical-align:middle;position:relative;height:auto;padding:.5em 1em;margin-bottom:2em}#content #searchbox form{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;text-align:left}#content #searchbox .search-filters>*{margin:0 .5em}#content #searchbox .search-filters .filter-buttons{display:inline-block}#content #searchbox .search-filters .filter-slider{width:10em}#content #searchbox .search-filters-tags{display:none;flex-grow:2}#content .btn-clear{opacity:.35;filter:alpha(opacity=35)}#content .btn-clear:hover{opacity:1;filter:alpha(opacity=100)}#content .actions-optional{display:none}#content .error{width:350px;padding:15px;margin:0 auto;text-align:center;font-size:16px;line-height:1.5em;color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#content .data .list-wrap,#box-popup .list-wrap{max-height:20em;overflow:auto;padding:.5em;margin:1em 0}#content .data .list-wrap ul,#box-popup .list-wrap ul{list-style-type:none;margin:0;padding:0}#content .data .list-wrap li,#box-popup .list-wrap li{display:flex;background:#f2f2f2;padding:.5em;font-size:1em;margin-bottom:.5em}#content .data .list-wrap li:hover,#box-popup .list-wrap li:hover{background:#e8eaf6;color:#000}#content .data .list-wrap div.files-item-info,#box-popup .list-wrap div.files-item-info{flex-grow:2}#content .data .list-wrap div.files-item-info img,#box-popup .list-wrap div.files-item-info img{margin:0 .5em}#content .data .list-wrap div.files-item-actions,#box-popup .list-wrap div.files-item-actions{padding:.3em 0}#box-popup{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:50em;margin:5em auto;padding:0;background-color:#fff}#box-popup.box-password-view{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:30em}#box-popup>h2{position:relative;width:100%;font-size:18px;color:#fff;background-color:#607d8b;margin:0;padding:.5em 0;line-height:1em}#box-popup>h2 .btn-popup-close{display:none;position:absolute;right:.5em;top:.2em}#box-popup>table{width:100%;padding-bottom:1em}#box-popup select{width:220px}#box-popup #resFancyAccion{display:none}#box-popup #resCheck{display:inline-block;width:80%;height:4em;padding:1em 0}#box-popup.image{background-color:transparent;max-width:100%;margin:0 auto;border-radius:0 !important;-moz-border-radius:0 !important;-webkit-border-radius:0 !important}#box-popup.image img{width:auto;margin:0 auto}#box-popup.image>div.title{background-color:#607d8b;color:#fff;padding:.5em}#box-popup.help{min-height:100px;background-color:#f5f5f5}#box-popup.help p{font-size:14px;text-align:justify;line-height:2em}#box-complexity>div{text-align:justify;line-height:1.5em;margin-top:1em}#debug{float:left;text-align:left}#debuginfo{width:100%;min-height:10em;padding:1em;background-color:#fff8e1;text-align:left;line-height:1.5em}#debuginfo H3{text-align:center}.popup-data{width:100%;min-width:400px;border:0;text-align:left;margin:0;padding:1em .5em}.popup-data .descField{min-width:100px}footer{display:flex;justify-content:space-between;position:fixed;bottom:0;z-index:100;width:100%;padding:.5em 0;background-color:#f5f5f5;color:#b9b9b9;font-size:1em;-webkit-box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14);-moz-box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14);box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14)}footer .footer-parts{display:flex;justify-content:space-between}footer #footer-left{width:50%;margin:0 1em}footer #footer-right{width:50%;margin:0 1em;justify-content:flex-end;text-align:right}footer #updates{min-width:10em;text-align:center;cursor:pointer}footer #status{margin:0 1em}footer #status>div{display:inline-block}footer #status .status-info{padding:.5em}footer #session{text-align:left;color:#999;font-size:.8em}footer a{color:#b9b9b9}footer a:visited{color:#b9b9b9}footer #project a:hover{color:#a9c1d7;border-bottom:1px solid #a9c1d7}footer #updates a:hover{color:#a9c1d7}footer img{border:0;width:16px;height:16px;vertical-align:middle}.round,.round5{border-radius:5px !important;-moz-border-radius:5px !important;-webkit-border-radius:5px !important}.midround{border-radius:0 0 10px 10px !important;-moz-border-radius:0 0 10px 10px !important;-webkit-border-radius:0 0 10px 10px !important}.midroundup{border-radius:10px 10px 0 0 !important;-moz-border-radius:10px 10px 0 0 !important;-webkit-border-radius:10px 10px 0 0 !important}.fullround{border-radius:50% !important;-moz-border-radius:50% !important;-webkit-border-radius:50% !important}.iconMini{width:16px !important;height:16px !important;vertical-align:middle}.hide{display:none !important}.btn-checks{padding:5px;margin:.2em 0;width:30em;border-bottom:1px solid #c9c9c9}.shadow{-webkit-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);-moz-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);box-shadow:1px 1px 2px rgba(0,0,0,0.14)}.noRes{width:60%;padding:15px;background-color:#f9f9f9;color:#a9a9a9;border:#c9c9c9 1px solid;margin:20px auto;text-align:center;font-size:16px}.header-grey{background-color:#607d8b;color:#fff;min-height:2em}.no-background{background:none !important}.action-in-box{padding:1em;text-align:right}.action-in-box ul{list-style:none;margin:0;padding:0}.tab-data{margin:2em auto 0;width:75%}.item-actions{margin:1em auto}.tab-actions{margin:2em 0}.item-actions>ul,.tab-actions>ul{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;list-style:none;margin:0;padding:0}.item-actions>ul>li,.tab-actions>ul>li{width:auto;min-width:2em;margin-left:.5em}.item-actions>ul>li.datagrid-action-search,.tab-actions>ul>li.datagrid-action-search{min-width:5em}.item-actions>ul>li.datagrid-action-search form,.tab-actions>ul>li.datagrid-action-search form{width:100%}h5.datagrid-header-title{padding:.7em;border-bottom:1px solid #d9d9d9}.fullWidth{max-width:100% !important}.filter-on{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;padding:.3em 1em}.global-on{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;padding:.3em 1em}.opacity50{filter:alpha(opacity=50);opacity:.5}.custom-combobox{position:relative;display:inline-block}.custom-combobox input{width:80%}.custom-combobox-toggle{position:absolute;top:0;bottom:0;margin-left:-1px;padding:0;*height:1.7em;*top:.1em}.custom-combobox-input{margin:0;padding:.3em}.passLevel{width:20px;height:20px;display:inline-block;position:relative;top:2px}.passLevel.strongest{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;font-weight:bold}.passLevel.strongest:hover{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;font-weight:bold}.passLevel.strong{color:#2196f3;background-color:#e3f2fd;border:1px solid #2196f3;font-weight:bold}.passLevel.strong:hover{color:#2196f3;background-color:#e3f2fd;border:1px solid #2196f3;font-weight:bold}.passLevel.good{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;font-weight:bold}.passLevel.good:hover{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;font-weight:bold}.passLevel.weak{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350;font-weight:bold}.passLevel.weak:hover{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350;font-weight:bold}#alert #alert-text{margin:15px auto;font-size:14px;font-weight:bold}#alert #alert-pass{width:50%;padding:10px;margin:15px auto;border:1px solid #c9c9c9;color:#555;font-weight:bold}.dialog-text,.dialog-user-text,.dialog-pass-text{font-family:Consolas,"Andale Mono WT","Andale Mono","Bitstream Vera Sans Mono","Nimbus Mono L",Monaco,"Courier New",monospace;padding:.5em;text-align:center;min-width:200px}.dialog-user-text{border-bottom:#d9d9d9 1px solid;color:#a9a9a9}.dialog-pass-text{border:transparent 1px solid;letter-spacing:.2em}.dialog-buttons{text-align:center;padding:.5em;border-top:1px solid #c9c9c9;line-height:2.5em}.dialog-clip-copy{color:#26a69a;background-color:#e0f2f1}.help-box{display:none;background-color:#fff !important;color:#607d8b}.help-box>*{font-weight:bold}.help-text{text-align:justify;line-height:1.5em;margin-top:1em}.tooltip{width:300px;max-width:300px;background-color:#777;color:#fff;z-index:101}.cursor-pointer{cursor:pointer}.password-actions{display:inline-block;width:12em}.password-actions>span,.password-actions i{margin-right:.6em}.custom-input-color{width:3em;height:1em;display:inline-block}.account-pass-image{height:32px;width:auto}.select-box{min-width:20em}fieldset.warning{padding:8px;border-radius:5px;color:#ef5350;background-color:#ffebee;border:1px solid #ef5350}fieldset.warning legend{color:#ef5350 !important}fieldset.warning a{color:#ef5350 !important;font-weight:bold}#actions{width:100%;line-height:2em;margin-bottom:5em}#actions #logo{display:flex;width:100%;margin-bottom:30px;color:#607d8b;align-items:center;background:url("../../../../../../public/images/logo_full_bg.png") left no-repeat;background-size:auto 150px;height:150px}#actions #page-title{width:100%;color:#607d8b;text-align:center}#actions #page-title h1{font-weight:bold;font-size:24px;letter-spacing:3px}#actions ul.errors{max-width:40vw;margin:0 auto;list-style:none;font-size:14px;text-align:left}#actions ul.errors>li{margin:1.5em auto;border-radius:3px;padding:1em .5em}#actions ul.errors>li.msg-critical{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350}#actions ul.errors>li.msg-warning{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;color:#555}#actions ul.errors>li.msg-ok{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#actions ul.errors>li>p.hint{color:#555;font-size:12px}#actions ul.errors>li>p.hint i{margin-right:.5em}#actions form{width:450px;margin:0 auto;text-align:left}#actions form fieldset{margin-bottom:2em}#actions form fieldset legend{width:100%;color:#fff;font-size:14px;font-weight:bold;text-align:center;background-color:#607d8b;margin:1em 0;letter-spacing:.2em;padding:.2em 0}#actions div.buttons{margin-top:2em;text-align:center}.center{text-align:center !important}.right{text-align:right !important}.left{text-align:left !important}.opacity50{opacity:.5 !important}#login-container{width:40em;margin:0 auto;background:transparent url("../../../../public/images/logo_full_bg.png") no-repeat top left;background-size:auto 10em}#login-container #boxSpacer{height:11em;background-color:transparent}#login-container #boxLogin{position:relative;margin:0 auto;width:100%;min-height:14em;padding:1em;background-color:#fff}#login-container #boxLogin #boxData{height:100%;min-height:14em;text-align:left;background-color:transparent}#login-container #boxLogin #boxData i{margin-right:.5em;opacity:.5}#login-container #boxLogin #boxData .extra-hidden{display:none}#login-container #boxLogin #boxButton{position:absolute;top:2em;right:2em}#login-container #boxLogin #boxActions{width:100%;text-align:right}#login-container #boxLogin #boxActions a{color:#c9c9c9}#login-container #boxLogout{margin-top:4em;width:100%}#login-container #boxLogout>div{margin:0 auto;width:250px;font-size:14px;padding:.5em;text-align:center;color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#login-container #boxUpdated{width:350px;margin:3em auto;font-size:14px;text-align:center;padding:.5em;color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#login-container #demo-info{margin:3em auto;color:#c9c9c9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:.5em}#login-container #demo-info ul{display:flex;justify-content:space-around;list-style:none}#login-container #demo-info ul li span{margin:0 2em}@media screen and (max-width:1000px){#content #searchbox .search-filters>*{margin:.5em 1em .5em 0}#content .data-container #title,#content .tab-data #title{width:90%}footer{display:none;justify-content:space-between;flex-wrap:wrap}footer .footer-parts{justify-content:space-between;flex-wrap:wrap}footer #footer-left,footer #footer-right{width:100%}footer .footer-parts>div{width:100%;padding:.5em 0}}@media screen and (max-width:600px){#content input,#box-popup input{width:100%}#content .mdl-textfield,#box-popup .mdl-textfield{width:100%}#content td.descField,#box-popup td.descField{display:none}#content td.valField .lowres-title,#box-popup td.valField .lowres-title{display:block}#content #searchbox .mdl-textfield{width:90%}#content #searchbox .search-text{width:90%}#content #searchbox .search-filters .selectize-control{width:100%}#content .data-container,#content .tab-data{width:100%}#content .data-container #title,#content .tab-data #title{width:90%}#content .data-container .selectize-control,#content .tab-data .selectize-control{width:100%}#box-popup h2>.btn-popup-close{display:inline-block}.mdl-data-table{table-layout:fixed;width:100%}.table-responsive td,.table-responsive th{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.table-responsive .cell-actions i{display:block !important}}
\ No newline at end of file
+html,body{margin:0;padding:0;text-align:left;background-color:#f5f5f5;color:#555;font-size:12px;font-weight:normal;box-sizing:border-box}*{font-family:"Roboto Regular",Verdana,Tahoma,sans-serif;box-sizing:inherit}*:before,*:after{box-sizing:inherit}table{font-size:11px;border-spacing:0}table th{border-bottom:2px solid transparent;vertical-align:middle}table th .icon{width:24px;height:24px}table tr{height:20px}table tr.odd{background-color:#f9f9f9}table tr.even>td,table tr.odd>td{border-bottom:1px solid #d9d9d9!important}table tr.even:hover,table tr.odd:hover{background-color:#e8ff99}table td{padding:3px}table td.txtCliente{font-weight:bold;text-align:center}form{font-size:11px;margin:0}input.inputImg,img.inputImg{background-color:transparent!important;width:24px!important;height:24px!important;border:0;vertical-align:middle;margin:0 .5em}input.txtFile{width:200px}input.txtLong{width:300px}textarea{width:350px}select.files{width:250px}input.spinner{width:5em}img{margin:0;padding:0;border:0;cursor:pointer}img.inputImgMini{background-color:transparent!important;width:16px!important;height:16px!important;margin:0 5px 0 5px;border:0;vertical-align:middle}i{cursor:pointer}form .form-field{display:flex;justify-content:space-between}form .form-field>label{min-width:12em;padding:.5em 0;font-size:16px;align-self:center}form .form-field>div{width:100%;align-self:center}a{text-decoration:none;color:#536dfe}a:visited{text-decoration:none;color:#536dfe}a:hover,a:active,a:focus{text-decoration:none;cursor:pointer}pre,code,samp,kbd{font-family:Consolas,"Andale Mono WT","Andale Mono","Bitstream Vera Sans Mono","Nimbus Mono L",Monaco,"Courier New",monospace;font-size:1em;direction:ltr;text-align:left;background-color:#fbfaf9;color:#333;box-shadow:inset 0 0 .3em #ccc;border-radius:2px}#nojs{width:80%;text-align:center;vertical-align:middle;margin:10px auto;padding:3px;background-color:#ef5350;color:white;font-weight:bold;font-size:14px}#wrap{height:auto!important;min-height:100%;width:100%;background-color:#f5f5f5}#wrap-loading{position:fixed;z-index:9999;top:50%;left:50%;padding:1em;background-color:rgba(255,255,255,0.8);display:none;border-radius:5px!important;-moz-border-radius:5px!important;-webkit-border-radius:5px!important}#wrap-loading.overlay-full{top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,0.5)}#wrap-loading.overlay-full #loading{position:absolute;top:50%;left:50%}#wrap-loading.overlay-full #taskStatus{display:block}#wrap-loading #taskStatus{display:none;position:absolute;left:0;top:55%;width:100%;text-align:center;color:white;background-color:rgba(0,0,0,0.5);padding:1em 0}#container{margin:auto;width:100%}#container.login{padding-top:5%}#container.error,#container.install,#container.passreset{width:100%}#container .logo{height:64px}#container #actions-bar{z-index:100;display:flex;justify-content:space-between;position:fixed;border:0 none;top:0;left:0;width:100%;padding:1em 0;background-color:transparent}#container #actions-bar-icons{flex-grow:1;text-align:center}#container #actions-bar-logo{display:none;padding:0 .5em}#container #actions-bar-logo img{display:inline-block;width:50px;opacity:.75}#container #content{width:95%;margin:2em auto 8em auto}#container #content.public-link{width:70%;min-height:0;margin:5em auto}#content td.descField,#box-popup td.descField{text-align:right;padding-right:20px;width:25%;border-right:1px solid #d9d9d9;color:#999;font-size:12px;font-weight:bold}#content td.valField,#box-popup td.valField{padding-left:1em;width:100%}#content td.valField .lowres-title,#box-popup td.valField .lowres-title{display:none;width:100%;color:#607d8b;font-size:12px}#content .pager{width:100%;margin-top:15px;padding:.5em;vertical-align:middle;font-size:11px;color:#999;background-color:#fcfcfc}#content .pager img{margin-left:5px;vertical-align:middle}#content .pager a{margin-left:5px;font-size:12px;color:#999}#content .pager>div{display:inline-block;width:49%}#content .pager .pager-left{text-align:left}#content .pager .pager-right{text-align:right}#content #title{width:50%;padding:7px;margin:auto;background-color:#d9d9d9;color:#fff;font-size:17px;letter-spacing:.3em;text-align:center}#content #title.titleNormal{background-color:#607d8b;color:#fff}#content .data-container{width:75%;margin:0 auto}#content fieldset.data{margin:2em auto}#content fieldset.data>legend{color:#607d8b;padding:0 .5em;font-size:1.5em}#content fieldset.data>div{display:none}#content fieldset.data>div table{width:100%}#content .data{width:100%;padding:10px;margin:0 auto;background-color:#fff;-webkit-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);-moz-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);box-shadow:1px 1px 2px rgba(0,0,0,0.14)}#content .data #history-icon{position:relative;top:5em;right:2em}#content .data td{text-align:left}#content .data td.descField{text-align:right}#content .data select{min-width:210px}#content .data .list-wrap{max-height:10em;overflow:auto;padding:.5em;margin:1em 0}#content .data .dropzone{width:30em;padding:1em;border:2px dashed #26a69a;text-align:center}#content .data .dropzone img{vertical-align:middle}#content .data .file-upload{display:none}#content .data .account-permissions{width:100%}#content .data .account-permissions fieldset{border:1px solid #c9c9c9;padding:1em}#content .data .account-permissions legend{font-weight:bold;color:#999;padding:.2em 0}#content .data .account-permissions fieldset>span{font-weight:bold;color:#999;padding:.2em 0;display:inline-block;width:100px;text-align:right}#content span.tag{margin:0 3px 3px 0;padding:.2em;background:#5c6bc0;color:#fff;border:0 solid transparent;border-radius:3px!important;-moz-border-radius:3px!important;-webkit-border-radius:3px!important}#content .extra-info{margin-top:20px}#content #tabs fieldset{border:1px solid #c9c9c9}#content #tabs #frmConfig label{float:left}#content .tblConfig{margin-bottom:2em}#content .tblConfig td.descField{width:35%;font-size:11px;font-weight:bold}#content .tblConfig td.rowHeader{padding:5px 0 5px 0;background-color:#f5f5f5;text-align:center;font-weight:bold;border-top:15px solid #f9f9f9;border-bottom:3px solid #a9c1d7;letter-spacing:.5em;color:#696969}#content .tblConfig input.checkbox{width:15px;text-align:left;padding:0}#content .tblConfig .option-disabled{text-align:center;background-color:#fff8e1;color:#ffca28;font-weight:bold}#content h2{width:100%;height:1.5em;font-size:18px;color:white;background-color:#a9c1d7;margin:0;padding-top:.1em}#content .section{margin-top:2.5em;border-bottom:1px solid #d9d9d9;text-align:left;font-size:14px;font-weight:bold;color:#5c6bc0}#content .row_even>td{background-color:#f5f5f5}#content .row_odd>td{background-color:white}#content .data-header ul{list-style:none;width:100%;margin:0 0 10px 0;padding:0}#content .data-header li{display:inline-block;padding:.2em .5em;font-weight:bold;letter-spacing:.2em;color:#fff;text-align:center}#content .data-header li a{color:#777}#content .data-header li img{float:right;width:24px;height:24px;vertical-align:middle}#content .data-header-minimal{border-bottom:1px solid #dfdfdf}#content .data-header-minimal ul{display:flex;flex-wrap:wrap;justify-content:flex-start;margin:0}#content .data-header-minimal li{display:inline-flex;min-width:10em;font-weight:normal;letter-spacing:normal}#content .data-header-minimal li a{color:#b9b9b9;padding:.3em .8em}#content .data-table{width:100%}#content .data-table td:first-of-type,#content .data-table th:first-of-type{width:5em}#content .data-table thead th{background-color:#607d8b;color:#fff}#content .data-table tbody td.cell-data{text-align:left}#content .data-table tbody td.cell-nodata{padding:0 .5em;text-align:left}#content .data-table tbody td.cell-actions{text-align:right}#content .data-table tbody td.cell-actions i{opacity:.5}#content .data-table tbody td.cell-actions i:hover{opacity:1}#content .data-rows ul{display:table;list-style:none;width:100%;margin:0 0 10px 0;padding:0;background-color:#fcfcfc}#content .data-rows li{float:left;display:block;padding:1em;color:#696969;text-align:center;min-height:2em}#content .data-rows li.cell-nodata{padding:1em 0;min-height:2em;text-align:left}#content .data-rows li.cell-actions{float:right;min-height:2em;padding:1em 0;text-align:left;background-color:#fcfcfc;width:15em}#content .data-rows li.cell-nodata img,#content .data-rows li.cell-actions img{width:24px;height:24px;margin:0 .5em}#content #resEventLog .data{width:100%}#content #resEventLog thead{text-align:center}#content #resEventLog tbody{width:100%;height:500px;overflow:auto}#content #resEventLog td{border-bottom:1px solid #d9d9d9}#content #resEventLog .cell{text-align:center}#content #resEventLog .cell-description{width:60%}#content #searchbox{background-color:#fcfcfc;vertical-align:middle;position:relative;height:auto;padding:.5em 1em;margin-bottom:2em}#content #searchbox form{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;text-align:left}#content #searchbox .search-filters>*{margin:0 .5em}#content #searchbox .search-filters .filter-buttons{display:inline-block}#content #searchbox .search-filters .filter-slider{width:10em}#content #searchbox .search-filters-tags{display:none;flex-grow:2}#content .btn-clear{opacity:.35;filter:alpha(opacity=35)}#content .btn-clear:hover{opacity:1;filter:alpha(opacity=100)}#content .actions-optional{display:none}#content .error{width:350px;padding:15px;margin:0 auto;text-align:center;font-size:16px;line-height:1.5em;color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#content .data .list-wrap,#box-popup .list-wrap{max-height:20em;overflow:auto;padding:.5em;margin:1em 0}#content .data .list-wrap ul,#box-popup .list-wrap ul{list-style-type:none;margin:0;padding:0}#content .data .list-wrap li,#box-popup .list-wrap li{display:flex;background:#f2f2f2;padding:.5em;font-size:1em;margin-bottom:.5em}#content .data .list-wrap li:hover,#box-popup .list-wrap li:hover{background:#e8eaf6;color:#000}#content .data .list-wrap div.files-item-info,#box-popup .list-wrap div.files-item-info{flex-grow:2}#content .data .list-wrap div.files-item-info img,#box-popup .list-wrap div.files-item-info img{margin:0 .5em}#content .data .list-wrap div.files-item-actions,#box-popup .list-wrap div.files-item-actions{padding:.3em 0}#box-popup{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:50em;margin:5em auto;padding:0;background-color:#fff}#box-popup.box-password-view{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:30em}#box-popup>h2{position:relative;width:100%;font-size:18px;color:#fff;background-color:#607d8b;margin:0;padding:.5em 0;line-height:1em}#box-popup>h2 .btn-popup-close{display:none;position:absolute;right:.5em;top:.2em}#box-popup>table{width:100%;padding-bottom:1em}#box-popup select{width:220px}#box-popup #resFancyAccion{display:none}#box-popup #resCheck{display:inline-block;width:80%;height:4em;padding:1em 0}#box-popup.image{background-color:transparent;max-width:100%;margin:0 auto;border-radius:0!important;-moz-border-radius:0!important;-webkit-border-radius:0!important}#box-popup.image img{width:auto;margin:0 auto}#box-popup.image>div.title{background-color:#607d8b;color:#fff;padding:.5em}#box-popup.help{min-height:100px;background-color:#f5f5f5}#box-popup.help p{font-size:14px;text-align:justify;line-height:2em}#box-complexity>div{text-align:justify;line-height:1.5em;margin-top:1em}#debug{float:left;text-align:left}#debuginfo{width:100%;min-height:10em;padding:1em;background-color:#fff8e1;text-align:left;line-height:1.5em}#debuginfo H3{text-align:center}.popup-data{width:100%;min-width:400px;border:0;text-align:left;margin:0;padding:1em .5em}.popup-data .descField{min-width:100px}footer{display:flex;justify-content:space-between;position:fixed;bottom:0;z-index:100;width:100%;padding:.5em 0;background-color:#f5f5f5;color:#b9b9b9;font-size:1em;-webkit-box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14);-moz-box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14);box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14)}footer .footer-parts{display:flex;justify-content:space-between}footer #footer-left{width:50%;margin:0 1em}footer #footer-right{width:50%;margin:0 1em;justify-content:flex-end;text-align:right}footer #updates{min-width:10em;text-align:center;cursor:pointer}footer #status{margin:0 1em}footer #status>div{display:inline-block}footer #status .status-info{padding:.5em}footer #session{text-align:left;color:#999;font-size:.8em}footer a{color:#b9b9b9}footer a:visited{color:#b9b9b9}footer #project a:hover{color:#a9c1d7;border-bottom:1px solid #a9c1d7}footer #updates a:hover{color:#a9c1d7}footer img{border:0;width:16px;height:16px;vertical-align:middle}.round,.round5{border-radius:5px!important;-moz-border-radius:5px!important;-webkit-border-radius:5px!important}.midround{border-radius:0 0 10px 10px!important;-moz-border-radius:0 0 10px 10px!important;-webkit-border-radius:0 0 10px 10px!important}.midroundup{border-radius:10px 10px 0 0!important;-moz-border-radius:10px 10px 0 0!important;-webkit-border-radius:10px 10px 0 0!important}.fullround{border-radius:50%!important;-moz-border-radius:50%!important;-webkit-border-radius:50%!important}.iconMini{width:16px!important;height:16px!important;vertical-align:middle}.hide{display:none!important}.btn-checks{padding:5px;margin:.2em 0;width:30em;border-bottom:1px solid #c9c9c9}.shadow{-webkit-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);-moz-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);box-shadow:1px 1px 2px rgba(0,0,0,0.14)}.noRes{width:60%;padding:15px;background-color:#f9f9f9;color:#a9a9a9;border:#c9c9c9 1px solid;margin:20px auto;text-align:center;font-size:16px}.header-grey{background-color:#607d8b;color:#fff;min-height:2em}.no-background{background:none!important}.action-in-box{padding:1em;text-align:right}.action-in-box ul{list-style:none;margin:0;padding:0}.tab-data{margin:2em auto 0;width:75%}.item-actions{margin:1em auto}.tab-actions{margin:2em 0}.item-actions>ul,.tab-actions>ul{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;list-style:none;margin:0;padding:0}.item-actions>ul>li,.tab-actions>ul>li{width:auto;min-width:2em;margin-left:.5em}.item-actions>ul>li.datagrid-action-search,.tab-actions>ul>li.datagrid-action-search{min-width:5em}.item-actions>ul>li.datagrid-action-search form,.tab-actions>ul>li.datagrid-action-search form{width:100%}h5.datagrid-header-title{padding:.7em;border-bottom:1px solid #d9d9d9}.fullWidth{max-width:100%!important}.filter-on{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;padding:.3em 1em}.global-on{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;padding:.3em 1em}.opacity50{filter:alpha(opacity=50);opacity:.5}.custom-combobox{position:relative;display:inline-block}.custom-combobox input{width:80%}.custom-combobox-toggle{position:absolute;top:0;bottom:0;margin-left:-1px;padding:0;*height:1.7em;*top:.1em}.custom-combobox-input{margin:0;padding:.3em}.passLevel{width:20px;height:20px;display:inline-block;position:relative;top:2px}.passLevel.strongest{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;font-weight:bold}.passLevel.strongest:hover{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;font-weight:bold}.passLevel.strong{color:#2196f3;background-color:#e3f2fd;border:1px solid #2196f3;font-weight:bold}.passLevel.strong:hover{color:#2196f3;background-color:#e3f2fd;border:1px solid #2196f3;font-weight:bold}.passLevel.good{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;font-weight:bold}.passLevel.good:hover{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;font-weight:bold}.passLevel.weak{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350;font-weight:bold}.passLevel.weak:hover{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350;font-weight:bold}#alert #alert-text{margin:15px auto;font-size:14px;font-weight:bold}#alert #alert-pass{width:50%;padding:10px;margin:15px auto;border:1px solid #c9c9c9;color:#555;font-weight:bold}.dialog-text,.dialog-user-text,.dialog-pass-text{font-family:Consolas,"Andale Mono WT","Andale Mono","Bitstream Vera Sans Mono","Nimbus Mono L",Monaco,"Courier New",monospace;padding:.5em;text-align:center;min-width:200px}.dialog-user-text{border-bottom:#d9d9d9 1px solid;color:#a9a9a9}.dialog-pass-text{border:transparent 1px solid;letter-spacing:.2em}.dialog-buttons{text-align:center;padding:.5em;border-top:1px solid #c9c9c9;line-height:2.5em}.dialog-clip-copy{color:#26a69a;background-color:#e0f2f1}.help-box{display:none;background-color:#fff!important;color:#607d8b}.help-box>*{font-weight:bold}.help-text{text-align:justify;line-height:1.5em;margin-top:1em}.tooltip{width:300px;max-width:300px;background-color:#777;color:#fff;z-index:101}.cursor-pointer{cursor:pointer}.password-actions{display:inline-block;width:12em}.password-actions>span,.password-actions i{margin-right:.6em}.custom-input-color{width:3em;height:1em;display:inline-block}.account-pass-image{height:32px;width:auto}.select-box{min-width:20em}fieldset.warning{padding:8px;border-radius:5px;color:#ef5350;background-color:#ffebee;border:1px solid #ef5350}fieldset.warning legend{color:#ef5350!important}fieldset.warning a{color:#ef5350!important;font-weight:bold}#actions{width:100%;line-height:2em;margin-bottom:5em}#actions #logo{display:flex;width:100%;margin-bottom:30px;color:#607d8b;align-items:center;background:url("../../../../../../public/images/logo_full_bg.png") left no-repeat;background-size:auto 150px;height:150px}#actions #page-title{width:100%;color:#607d8b;text-align:center}#actions #page-title h1{font-weight:bold;font-size:24px;letter-spacing:3px}#actions ul.errors{max-width:40vw;margin:0 auto;list-style:none;font-size:14px;text-align:left}#actions ul.errors>li{margin:1.5em auto;border-radius:3px;padding:1em .5em}#actions ul.errors>li.msg-critical{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350}#actions ul.errors>li.msg-warning{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;color:#555}#actions ul.errors>li.msg-ok{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#actions ul.errors>li>p.hint{color:#555;font-size:12px}#actions ul.errors>li>p.hint i{margin-right:.5em}#actions form{width:450px;margin:0 auto;text-align:left}#actions form fieldset{margin-bottom:2em}#actions form fieldset legend{width:100%;color:#fff;font-size:14px;font-weight:bold;text-align:center;background-color:#607d8b;margin:1em 0;letter-spacing:.2em;padding:.2em 0}#actions div.buttons{margin-top:2em;text-align:center}.center{text-align:center!important}.right{text-align:right!important}.left{text-align:left!important}.opacity50{opacity:.5!important}#login-container{width:40em;margin:0 auto;background:transparent url("../../../../public/images/logo_full_bg.png") no-repeat top left;background-size:auto 10em}#login-container #boxSpacer{height:11em;background-color:transparent}#login-container #boxLogin{position:relative;margin:0 auto;width:100%;min-height:14em;padding:1em;background-color:#fff}#login-container #boxLogin #boxData{height:100%;min-height:14em;text-align:left;background-color:transparent}#login-container #boxLogin #boxData i{margin-right:.5em;opacity:.5}#login-container #boxLogin #boxData .extra-hidden{display:none}#login-container #boxLogin #boxButton{position:absolute;top:2em;right:2em}#login-container #boxLogin #boxActions{width:100%;text-align:right}#login-container #boxLogin #boxActions a{color:#c9c9c9}#login-container #boxLogout{margin-top:4em;width:100%}#login-container #boxLogout>div{margin:0 auto;width:250px;font-size:14px;padding:.5em;text-align:center;color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#login-container #boxUpdated{width:350px;margin:3em auto;font-size:14px;text-align:center;padding:.5em;color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#login-container #demo-info{margin:3em auto;color:#c9c9c9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:.5em}#login-container #demo-info ul{display:flex;justify-content:space-around;list-style:none}#login-container #demo-info ul li span{margin:0 2em}@media screen and (max-width:1000px){#content #searchbox .search-filters>*{margin:.5em 1em .5em 0}#content .data-container #title,#content .tab-data #title{width:90%}footer{display:none;justify-content:space-between;flex-wrap:wrap}footer .footer-parts{justify-content:space-between;flex-wrap:wrap}footer #footer-left,footer #footer-right{width:100%}footer .footer-parts>div{width:100%;padding:.5em 0}}@media screen and (max-width:600px){#content input,#box-popup input{width:100%}#content .mdl-textfield,#box-popup .mdl-textfield{width:100%}#content td.descField,#box-popup td.descField{display:none}#content td.valField .lowres-title,#box-popup td.valField .lowres-title{display:block}#content #searchbox .mdl-textfield{width:90%}#content #searchbox .search-text{width:90%}#content #searchbox .search-filters .selectize-control{width:100%}#content .data-container,#content .tab-data{width:100%}#content .data-container #title,#content .tab-data #title{width:90%}#content .data-container .selectize-control,#content .tab-data .selectize-control{width:100%}#box-popup h2>.btn-popup-close{display:inline-block}.mdl-data-table{table-layout:fixed;width:100%}.table-responsive td,.table-responsive th{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.table-responsive .cell-actions i{display:block!important}}
\ No newline at end of file
diff --git a/app/modules/web/themes/material-blue/js/app-theme.min.js b/app/modules/web/themes/material-blue/js/app-theme.min.js
index c25553f6..f5d5ebf9 100644
--- a/app/modules/web/themes/material-blue/js/app-theme.min.js
+++ b/app/modules/web/themes/material-blue/js/app-theme.min.js
@@ -1,5 +1,5 @@
var $jscomp={scope:{},findInternal:function(a,f,c){a instanceof String&&(a=String(a));for(var h=a.length,k=0;k");
a.passwordData.complexity.numbers&&(d+="1234567890");a.passwordData.complexity.chars&&(d+="abcdefghijklmnopqrstuvwxyz",a.passwordData.complexity.uppercase&&(d+="ABCDEFGHIJKLMNOPQRSTUVWXYZ"));for(;m++injectDependencies();
- }
-
- /**
- * @param Theme $theme
- */
- public function inject(Theme $theme)
+ public function __construct(ThemeInterface $theme)
{
$this->theme = $theme;
}
@@ -228,7 +218,7 @@ abstract class DataGridBase implements DataGridInterface
/**
* @param DataGridActionInterface $action
- * @param bool $isMenu Añadir al menu de acciones
+ * @param bool $isMenu Añadir al menu de acciones
* @return $this
*/
public function setDataActions(DataGridActionInterface $action, $isMenu = false)
@@ -278,7 +268,7 @@ abstract class DataGridBase implements DataGridInterface
* Establecer la plantilla utilizada para la cabecera
*
* @param string $template El nombre de la plantilla a utilizar
- * @param string $base Directorio base para la plantilla
+ * @param string $base Directorio base para la plantilla
* @return $this
*/
public function setDataHeaderTemplate($template, $base = null)
@@ -353,7 +343,7 @@ abstract class DataGridBase implements DataGridInterface
* Establecer la plantilla utilizada para el paginador
*
* @param string $template El nombre de la plantilla a utilizar
- * @param string $base Directorio base para la plantilla
+ * @param string $base Directorio base para la plantilla
* @return $this
*/
public function setDataPagerTemplate($template, $base = null)
@@ -379,7 +369,7 @@ abstract class DataGridBase implements DataGridInterface
/**
* @param string $template El nombre de la plantilla a utilizar
- * @param string $base Directorio base para la plantilla
+ * @param string $base Directorio base para la plantilla
* @return mixed
*/
public function setDataRowTemplate($template, $base = null)
diff --git a/lib/SP/Repositories/Account/AccountFileRepository.php b/lib/SP/Repositories/Account/AccountFileRepository.php
index 9c51f022..b2939ab8 100644
--- a/lib/SP/Repositories/Account/AccountFileRepository.php
+++ b/lib/SP/Repositories/Account/AccountFileRepository.php
@@ -245,7 +245,7 @@ class AccountFileRepository extends Repository implements RepositoryItemInterfac
FROM AccountFile AF
INNER JOIN Account A ON A.id = AF.accountId
INNER JOIN Client C ON A.clientId = C.id
- WHERE id IN (' . $this->getParamsFromArray($ids) . ')';
+ WHERE AF.id IN (' . $this->getParamsFromArray($ids) . ')';
$Data = new QueryData();
$Data->setMapClassName(FileExtData::class);
diff --git a/lib/SP/Repositories/Account/AccountHistoryRepository.php b/lib/SP/Repositories/Account/AccountHistoryRepository.php
index 61e07552..0bb45f55 100644
--- a/lib/SP/Repositories/Account/AccountHistoryRepository.php
+++ b/lib/SP/Repositories/Account/AccountHistoryRepository.php
@@ -2,7 +2,7 @@
/**
* sysPass
*
- * @author nuxsmin
+ * @author nuxsmin
* @link https://syspass.org
* @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org
*
@@ -92,20 +92,20 @@ class AccountHistoryRepository extends Repository implements RepositoryItemInter
*/
public function getPasswordForHistoryId($id)
{
- $Data = new QueryData();
- $Data->setMapClassName(AccountPassData::class);
- $Data->setLimit(1);
+ $queryData = new QueryData();
+ $queryData->setMapClassName(AccountPassData::class);
+ $queryData->setLimit(1);
- $Data->setSelect('AH.id, AH.name, AH.login, AH.pass, AH.key, AH.parentId');
- $Data->setFrom('AccountHistory AH');
+ $queryData->setSelect('AH.id, AH.name, AH.login, AH.pass, AH.key, AH.parentId');
+ $queryData->setFrom('AccountHistory AH');
- $queryWhere = AccountUtil::getAccountHistoryFilterUser($Data, $this->session);
+ $queryWhere = AccountUtil::getAccountHistoryFilterUser($this->session);
$queryWhere[] = 'AH.id = ?';
- $Data->addParam($id);
+ $queryData->addParam($id);
- $Data->setWhere($queryWhere);
+ $queryData->setWhere($queryWhere);
- return DbWrapper::getResults($Data, $this->db);
+ return DbWrapper::getResults($queryData, $this->db);
}
/**
diff --git a/lib/SP/Repositories/Plugin/PluginRepository.php b/lib/SP/Repositories/Plugin/PluginRepository.php
index c0ec003f..eae391a9 100644
--- a/lib/SP/Repositories/Plugin/PluginRepository.php
+++ b/lib/SP/Repositories/Plugin/PluginRepository.php
@@ -2,7 +2,7 @@
/**
* sysPass
*
- * @author nuxsmin
+ * @author nuxsmin
* @link https://syspass.org
* @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org
*
@@ -25,6 +25,7 @@
namespace SP\Repositories\Plugin;
use SP\Core\Exceptions\SPException;
+use SP\DataModel\ItemData;
use SP\DataModel\ItemSearchData;
use SP\DataModel\PluginData;
use SP\Repositories\Repository;
@@ -46,24 +47,24 @@ class PluginRepository extends Repository implements RepositoryItemInterface
* Creates an item
*
* @param PluginData $itemData
- * @return mixed
+ * @return int
* @throws \SP\Core\Exceptions\ConstraintException
* @throws \SP\Core\Exceptions\QueryException
*/
public function create($itemData)
{
$query = /** @lang SQL */
- 'INSERT INTO Plugin SET name = ?, data = ?, enabled = ?, available = ?';
+ 'INSERT INTO Plugin SET `name` = ?, `data` = ?, enabled = ?, available = ?';
- $Data = new QueryData();
- $Data->setQuery($query);
- $Data->addParam($itemData->getName());
- $Data->addParam($itemData->getData());
- $Data->addParam($itemData->getEnabled());
- $Data->addParam($itemData->getAvailable());
- $Data->setOnErrorMessage(__u('Error al crear el plugin'));
+ $queryData = new QueryData();
+ $queryData->setQuery($query);
+ $queryData->addParam($itemData->getName());
+ $queryData->addParam($itemData->getData());
+ $queryData->addParam($itemData->getEnabled());
+ $queryData->addParam($itemData->getAvailable());
+ $queryData->setOnErrorMessage(__u('Error al crear el plugin'));
- DbWrapper::getQuery($Data, $this->db);
+ DbWrapper::getQuery($queryData, $this->db);
return $this->db->getLastId();
}
@@ -80,47 +81,47 @@ class PluginRepository extends Repository implements RepositoryItemInterface
{
$query = /** @lang SQL */
'UPDATE Plugin
- SET name = ?,
- data = ?,
+ SET `name` = ?,
+ `data` = ?,
enabled = ?,
available = ?
- WHERE name = ? LIMIT 1';
+ WHERE `name` = ? LIMIT 1';
- $Data = new QueryData();
- $Data->setQuery($query);
- $Data->addParam($itemData->getName());
- $Data->addParam($itemData->getData());
- $Data->addParam($itemData->getEnabled());
- $Data->addParam($itemData->getAvailable());
- $Data->addParam($itemData->getName());
- $Data->setOnErrorMessage(__u('Error al actualizar el plugin'));
+ $queryData = new QueryData();
+ $queryData->setQuery($query);
+ $queryData->addParam($itemData->getName());
+ $queryData->addParam($itemData->getData());
+ $queryData->addParam($itemData->getEnabled());
+ $queryData->addParam($itemData->getAvailable());
+ $queryData->addParam($itemData->getName());
+ $queryData->setOnErrorMessage(__u('Error al actualizar el plugin'));
- return DbWrapper::getQuery($Data, $this->db);
+ return DbWrapper::getQuery($queryData, $this->db);
}
/**
* Returns the item for given id
*
* @param int $id
- * @return mixed
+ * @return PluginData
*/
public function getById($id)
{
$query = /** @lang SQL */
'SELECT id,
- name,
- data,
+ `name`,
+ `data`,
enabled,
available
FROM Plugin
WHERE id = ? LIMIT 1';
- $Data = new QueryData();
- $Data->setMapClassName(PluginData::class);
- $Data->setQuery($query);
- $Data->addParam($id);
+ $queryData = new QueryData();
+ $queryData->setQuery($query);
+ $queryData->addParam($id);
+ $queryData->setMapClassName(PluginData::class);
- return DbWrapper::getResults($Data, $this->db);
+ return DbWrapper::getResults($queryData, $this->db);
}
/**
@@ -132,41 +133,41 @@ class PluginRepository extends Repository implements RepositoryItemInterface
{
$query = /** @lang SQL */
'SELECT id,
- name,
+ `name`,
enabled,
available
FROM Plugin
- ORDER BY name';
+ ORDER BY `name`';
- $Data = new QueryData();
- $Data->setMapClassName(PluginData::class);
- $Data->setQuery($query);
+ $queryData = new QueryData();
+ $queryData->setQuery($query);
+ $queryData->setMapClassName(PluginData::class);
- return DbWrapper::getResultsArray($Data, $this->db);
+ return DbWrapper::getResultsArray($queryData, $this->db);
}
/**
* Returns all the items for given ids
*
* @param array $ids
- * @return array
+ * @return PluginData[]
*/
public function getByIdBatch(array $ids)
{
$query = /** @lang SQL */
'SELECT id,
- name,
+ `name`,
enabled,
available
FROM Plugin
WHERE id IN (' . $this->getParamsFromArray($ids) . ')';
- $Data = new QueryData();
- $Data->setMapClassName(PluginData::class);
- $Data->setQuery($query);
- $Data->setParams($ids);
+ $queryData = new QueryData();
+ $queryData->setQuery($query);
+ $queryData->setParams($ids);
+ $queryData->setMapClassName(PluginData::class);
- return DbWrapper::getResultsArray($Data, $this->db);
+ return DbWrapper::getResultsArray($queryData, $this->db);
}
/**
@@ -189,28 +190,21 @@ class PluginRepository extends Repository implements RepositoryItemInterface
* Deletes an item
*
* @param $id
- * @return PluginRepository
+ * @return int
* @throws SPException
* @throws \SP\Core\Exceptions\ConstraintException
* @throws \SP\Core\Exceptions\QueryException
*/
public function delete($id)
{
- $query = /** @lang SQL */
- 'DELETE FROM Plugin WHERE id = ? LIMIT 1';
+ $queryData = new QueryData();
+ $queryData->setQuery('DELETE FROM Plugin WHERE id = ? LIMIT 1');
+ $queryData->addParam($id);
+ $queryData->setOnErrorMessage(__u('Error al eliminar el plugin'));
- $Data = new QueryData();
- $Data->setQuery($query);
- $Data->addParam($id);
- $Data->setOnErrorMessage(__u('Error al eliminar el plugin'));
+ DbWrapper::getQuery($queryData, $this->db);
- DbWrapper::getQuery($Data, $this->db);
-
- if ($Data->getQueryNumRows() === 0) {
- throw new SPException(__u('Plugin no encontrado'), SPException::INFO);
- }
-
- return $this;
+ return $this->db->getNumRows();
}
/**
@@ -249,33 +243,33 @@ class PluginRepository extends Repository implements RepositoryItemInterface
/**
* Searches for items by a given filter
*
- * @param ItemSearchData $SearchData
+ * @param ItemSearchData $itemSearchData
* @return mixed
*/
- public function search(ItemSearchData $SearchData)
+ public function search(ItemSearchData $itemSearchData)
{
- $Data = new QueryData();
- $Data->setSelect('id, name, enabled, available');
- $Data->setFrom('Plugin');
- $Data->setOrder('name');
+ $queryData = new QueryData();
+ $queryData->setSelect('id, name, enabled, available');
+ $queryData->setFrom('Plugin');
+ $queryData->setOrder('name');
- if ($SearchData->getSeachString() !== '') {
- $Data->setWhere('name LIKE ?');
+ if ($itemSearchData->getSeachString() !== '') {
+ $queryData->setWhere('name LIKE ?');
- $search = '%' . $SearchData->getSeachString() . '%';
- $Data->addParam($search);
+ $search = '%' . $itemSearchData->getSeachString() . '%';
+ $queryData->addParam($search);
}
- $Data->setLimit('?,?');
- $Data->addParam($SearchData->getLimitStart());
- $Data->addParam($SearchData->getLimitCount());
+ $queryData->setLimit('?,?');
+ $queryData->addParam($itemSearchData->getLimitStart());
+ $queryData->addParam($itemSearchData->getLimitCount());
DbWrapper::setFullRowCount();
/** @var array $queryRes */
- $queryRes = DbWrapper::getResultsArray($Data, $this->db);
+ $queryRes = DbWrapper::getResultsArray($queryData, $this->db);
- $queryRes['count'] = $Data->getQueryNumRows();
+ $queryRes['count'] = $queryData->getQueryNumRows();
return $queryRes;
}
@@ -283,26 +277,26 @@ class PluginRepository extends Repository implements RepositoryItemInterface
/**
* Devuelve los datos de un plugin por su nombre
*
- * @param $name int
- * @return mixed
+ * @param string $name
+ * @return PluginData
*/
public function getByName($name)
{
$query = /** @lang SQL */
'SELECT id,
- name,
- data,
+ `name`,
+ `data`,
enabled,
available
FROM Plugin
- WHERE name = ? LIMIT 1';
+ WHERE `name` = ? LIMIT 1';
- $Data = new QueryData();
- $Data->setMapClassName(PluginData::class);
- $Data->setQuery($query);
- $Data->addParam($name);
+ $queryData = new QueryData();
+ $queryData->setQuery($query);
+ $queryData->addParam($name);
+ $queryData->setMapClassName(PluginData::class);
- return DbWrapper::getResults($Data, $this->db);
+ return DbWrapper::getResults($queryData, $this->db);
}
/**
@@ -316,18 +310,13 @@ class PluginRepository extends Repository implements RepositoryItemInterface
*/
public function toggleEnabled($id, $enabled)
{
- $query = /** @lang SQL */
- 'UPDATE Plugin
- SET enabled = ?
- WHERE id = ? LIMIT 1';
+ $queryData = new QueryData();
+ $queryData->setQuery('UPDATE Plugin SET enabled = ? WHERE id = ? LIMIT 1');
+ $queryData->addParam($enabled);
+ $queryData->addParam($id);
+ $queryData->setOnErrorMessage(__u('Error al actualizar el plugin'));
- $Data = new QueryData();
- $Data->setQuery($query);
- $Data->addParam($enabled);
- $Data->addParam($id);
- $Data->setOnErrorMessage(__u('Error al actualizar el plugin'));
-
- return DbWrapper::getQuery($Data, $this->db);
+ return DbWrapper::getQuery($queryData, $this->db);
}
/**
@@ -341,18 +330,13 @@ class PluginRepository extends Repository implements RepositoryItemInterface
*/
public function toggleEnabledByName($name, $enabled)
{
- $query = /** @lang SQL */
- 'UPDATE Plugin
- SET enabled = ?
- WHERE name = ? LIMIT 1';
+ $queryData = new QueryData();
+ $queryData->setQuery('UPDATE Plugin SET enabled = ? WHERE name = ? LIMIT 1');
+ $queryData->addParam($enabled);
+ $queryData->addParam($name);
+ $queryData->setOnErrorMessage(__u('Error al actualizar el plugin'));
- $Data = new QueryData();
- $Data->setQuery($query);
- $Data->addParam($enabled);
- $Data->addParam($name);
- $Data->setOnErrorMessage(__u('Error al actualizar el plugin'));
-
- return DbWrapper::getQuery($Data, $this->db);
+ return DbWrapper::getQuery($queryData, $this->db);
}
/**
@@ -366,18 +350,13 @@ class PluginRepository extends Repository implements RepositoryItemInterface
*/
public function toggleAvailable($id, $available)
{
- $query = /** @lang SQL */
- 'UPDATE Plugin
- SET available = ?
- WHERE id = ? LIMIT 1';
+ $queryData = new QueryData();
+ $queryData->setQuery('UPDATE Plugin SET available = ? WHERE id = ? LIMIT 1');
+ $queryData->addParam($id);
+ $queryData->addParam($available);
+ $queryData->setOnErrorMessage(__u('Error al actualizar el plugin'));
- $Data = new QueryData();
- $Data->setQuery($query);
- $Data->addParam($id);
- $Data->addParam($available);
- $Data->setOnErrorMessage(__u('Error al actualizar el plugin'));
-
- return DbWrapper::getQuery($Data, $this->db);
+ return DbWrapper::getQuery($queryData, $this->db);
}
/**
@@ -391,18 +370,13 @@ class PluginRepository extends Repository implements RepositoryItemInterface
*/
public function toggleAvailableByName($name, $available)
{
- $query = /** @lang SQL */
- 'UPDATE Plugin
- SET available = ?
- WHERE name = ? LIMIT 1';
+ $queryData = new QueryData();
+ $queryData->setQuery('UPDATE Plugin SET available = ? WHERE `name` = ? LIMIT 1');
+ $queryData->addParam($available);
+ $queryData->addParam($name);
+ $queryData->setOnErrorMessage(__u('Error al actualizar el plugin'));
- $Data = new QueryData();
- $Data->setQuery($query);
- $Data->addParam($available);
- $Data->addParam($name);
- $Data->setOnErrorMessage(__u('Error al actualizar el plugin'));
-
- return DbWrapper::getQuery($Data, $this->db);
+ return DbWrapper::getQuery($queryData, $this->db);
}
/**
@@ -415,32 +389,25 @@ class PluginRepository extends Repository implements RepositoryItemInterface
*/
public function resetById($id)
{
- $query = /** @lang SQL */
- 'UPDATE Plugin
- SET data = NULL
- WHERE id = ? LIMIT 1';
+ $queryData = new QueryData();
+ $queryData->setQuery('UPDATE Plugin SET `data` = NULL WHERE id = ? LIMIT 1');
+ $queryData->addParam($id);
+ $queryData->setOnErrorMessage(__u('Error al actualizar el plugin'));
- $Data = new QueryData();
- $Data->setQuery($query);
- $Data->addParam($id);
- $Data->setOnErrorMessage(__u('Error al actualizar el plugin'));
-
- return DbWrapper::getQuery($Data, $this->db);
+ return DbWrapper::getQuery($queryData, $this->db);
}
/**
* Devolver los plugins activados
*
- * @return array
+ * @return ItemData[]
*/
public function getEnabled()
{
- $query = /** @lang SQL */
- 'SELECT name FROM Plugin WHERE enabled = 1';
+ $queryData = new QueryData();
+ $queryData->setQuery('SELECT id, name FROM Plugin WHERE enabled = 1');
+ $queryData->setMapClassName(ItemData::class);
- $Data = new QueryData();
- $Data->setQuery($query);
-
- return DbWrapper::getResultsArray($Data, $this->db);
+ return DbWrapper::getResultsArray($queryData, $this->db);
}
}
\ No newline at end of file
diff --git a/lib/SP/Repositories/Track/TrackRepository.php b/lib/SP/Repositories/Track/TrackRepository.php
index 5eb46049..f4a797c2 100644
--- a/lib/SP/Repositories/Track/TrackRepository.php
+++ b/lib/SP/Repositories/Track/TrackRepository.php
@@ -92,9 +92,9 @@ class TrackRepository extends Repository
{
$query = /** @lang SQL */
'UPDATE Track SET
- track_userId = ?,
- source = ?,
- time = UNIX_TIMESTAMP(),
+ userId = ?,
+ `source` = ?,
+ `time` = UNIX_TIMESTAMP(),
ipv4 = ?,
ipv6 = ?
WHERE id = ? LIMIT 1';
@@ -120,8 +120,8 @@ class TrackRepository extends Repository
$query = /** @lang SQL */
'SELECT id,
userId,
- source,
- time,
+ `source`,
+ `time`,
ipv4,
ipv6
FROM Track
diff --git a/lib/SP/Services/Plugin/PluginService.php b/lib/SP/Services/Plugin/PluginService.php
new file mode 100644
index 00000000..2d9f433c
--- /dev/null
+++ b/lib/SP/Services/Plugin/PluginService.php
@@ -0,0 +1,238 @@
+.
+ */
+
+namespace SP\Services\Plugin;
+
+use SP\Core\Exceptions\SPException;
+use SP\DataModel\ItemData;
+use SP\DataModel\ItemSearchData;
+use SP\DataModel\PluginData;
+use SP\Repositories\Plugin\PluginRepository;
+use SP\Services\Service;
+use SP\Services\ServiceException;
+
+/**
+ * Class PluginService
+ * @package SP\Services\Plugin
+ */
+class PluginService extends Service
+{
+ /**
+ * @var PluginRepository
+ */
+ protected $pluginRepository;
+
+ /**
+ * Creates an item
+ *
+ * @param PluginData $itemData
+ * @return int
+ * @throws \SP\Core\Exceptions\ConstraintException
+ * @throws \SP\Core\Exceptions\QueryException
+ */
+ public function create(PluginData $itemData)
+ {
+ return $this->pluginRepository->create($itemData);
+ }
+
+ /**
+ * Updates an item
+ *
+ * @param PluginData $itemData
+ * @return mixed
+ * @throws \SP\Core\Exceptions\ConstraintException
+ * @throws \SP\Core\Exceptions\QueryException
+ */
+ public function update(PluginData $itemData)
+ {
+ return $this->pluginRepository->update($itemData);
+ }
+
+ /**
+ * Returns the item for given id
+ *
+ * @param int $id
+ * @return PluginData
+ */
+ public function getById($id)
+ {
+ return $this->pluginRepository->getById($id);
+ }
+
+ /**
+ * Returns all the items
+ *
+ * @return PluginData[]
+ */
+ public function getAll()
+ {
+ return $this->pluginRepository->getAll();
+ }
+
+ /**
+ * Returns all the items for given ids
+ *
+ * @param array $ids
+ * @return PluginData[]
+ */
+ public function getByIdBatch(array $ids)
+ {
+ return $this->pluginRepository->getByIdBatch($ids);
+ }
+
+ /**
+ * Deletes all the items for given ids
+ *
+ * @param array $ids
+ * @throws SPException
+ * @throws \SP\Core\Exceptions\ConstraintException
+ * @throws \SP\Core\Exceptions\QueryException
+ * @throws \SP\Core\Exceptions\SPException
+ */
+ public function deleteByIdBatch(array $ids)
+ {
+ $this->pluginRepository->deleteByIdBatch($ids);
+ }
+
+ /**
+ * Deletes an item
+ *
+ * @param $id
+ * @throws SPException
+ * @throws \SP\Core\Exceptions\ConstraintException
+ * @throws \SP\Core\Exceptions\QueryException
+ */
+ public function delete($id)
+ {
+ if ($this->pluginRepository->delete($id) === 0) {
+ throw new ServiceException(__u('Plugin no encontrado'), ServiceException::INFO);
+ }
+ }
+
+ /**
+ * Searches for items by a given filter
+ *
+ * @param ItemSearchData $itemSearchData
+ * @return mixed
+ */
+ public function search(ItemSearchData $itemSearchData)
+ {
+ return $this->pluginRepository->search($itemSearchData);
+ }
+
+ /**
+ * Devuelve los datos de un plugin por su nombre
+ *
+ * @param string $name
+ * @return PluginData
+ */
+ public function getByName($name)
+ {
+ return $this->pluginRepository->getByName($name);
+ }
+
+ /**
+ * Cambiar el estado del plugin
+ *
+ * @param $id
+ * @param $enabled
+ * @return bool
+ * @throws \SP\Core\Exceptions\ConstraintException
+ * @throws \SP\Core\Exceptions\QueryException
+ */
+ public function toggleEnabled($id, $enabled)
+ {
+ return $this->pluginRepository->toggleEnabled($id, $enabled);
+ }
+
+ /**
+ * Cambiar el estado del plugin
+ *
+ * @param $name
+ * @param $enabled
+ * @return bool
+ * @throws \SP\Core\Exceptions\ConstraintException
+ * @throws \SP\Core\Exceptions\QueryException
+ */
+ public function toggleEnabledByName($name, $enabled)
+ {
+ return $this->pluginRepository->toggleEnabledByName($name, $enabled);
+ }
+
+ /**
+ * Cambiar el estado del plugin
+ *
+ * @param $id
+ * @param $available
+ * @return bool
+ * @throws \SP\Core\Exceptions\ConstraintException
+ * @throws \SP\Core\Exceptions\QueryException
+ */
+ public function toggleAvailable($id, $available)
+ {
+ return $this->pluginRepository->toggleAvailable($id, $available);
+ }
+
+ /**
+ * Cambiar el estado del plugin
+ *
+ * @param $name
+ * @param $available
+ * @return bool
+ * @throws \SP\Core\Exceptions\ConstraintException
+ * @throws \SP\Core\Exceptions\QueryException
+ */
+ public function toggleAvailableByName($name, $available)
+ {
+ return $this->pluginRepository->toggleAvailableByName($name, $available);
+ }
+
+ /**
+ * Restablecer los datos de un plugin
+ *
+ * @param int $id Id del plugin
+ * @return bool
+ * @throws \SP\Core\Exceptions\ConstraintException
+ * @throws \SP\Core\Exceptions\QueryException
+ */
+ public function resetById($id)
+ {
+ return $this->pluginRepository->resetById($id);
+ }
+
+ /**
+ * Devolver los plugins activados
+ *
+ * @return ItemData[]
+ */
+ public function getEnabled()
+ {
+ return $this->pluginRepository->getEnabled();
+ }
+
+ protected function initialize()
+ {
+ $this->pluginRepository = $this->dic->get(PluginRepository::class);
+ }
+}
\ No newline at end of file
diff --git a/lib/SP/Services/PublicLink/PublicLinkService.php b/lib/SP/Services/PublicLink/PublicLinkService.php
index d70d6877..d6a15cdb 100644
--- a/lib/SP/Services/PublicLink/PublicLinkService.php
+++ b/lib/SP/Services/PublicLink/PublicLinkService.php
@@ -77,15 +77,6 @@ class PublicLinkService extends Service
return hash('sha256', uniqid('sysPassPublicLink', true));
}
- /**
- * @throws \Psr\Container\ContainerExceptionInterface
- * @throws \Psr\Container\NotFoundExceptionInterface
- */
- protected function initialize()
- {
- $this->publicLinkRepository = $this->dic->get(PublicLinkRepository::class);
- }
-
/**
* @param ItemSearchData $itemSearchData
* @return mixed
@@ -144,6 +135,7 @@ class PublicLinkService extends Service
* Returns the hash from a composed key
*
* @param string $key
+ * @param string $salt
* @return mixed
*/
public static function getHashForKey($key, $salt)
@@ -154,7 +146,7 @@ class PublicLinkService extends Service
/**
* Obtener los datos de una cuenta y encriptarlos para el enlace
*
- * @param int $itemId
+ * @param int $itemId
* @param string $linkKey
* @return Vault
* @throws \Defuse\Crypto\Exception\CryptoException
@@ -243,7 +235,7 @@ class PublicLinkService extends Service
}
/**
- * @param string $salt
+ * @param string $salt
* @param PublicLinkData $publicLinkData
* @return string
*/
@@ -332,4 +324,13 @@ class PublicLinkService extends Service
{
return $this->publicLinkRepository->getHashForItem($itemId);
}
+
+ /**
+ * @throws \Psr\Container\ContainerExceptionInterface
+ * @throws \Psr\Container\NotFoundExceptionInterface
+ */
+ protected function initialize()
+ {
+ $this->publicLinkRepository = $this->dic->get(PublicLinkRepository::class);
+ }
}
\ No newline at end of file
diff --git a/lib/SP/Storage/FileCachePacked.php b/lib/SP/Storage/FileCachePacked.php
new file mode 100644
index 00000000..5f3526e5
--- /dev/null
+++ b/lib/SP/Storage/FileCachePacked.php
@@ -0,0 +1,162 @@
+.
+ */
+
+namespace SP\Storage;
+
+use RuntimeException;
+
+/**
+ * Class FileCachePacked
+ *
+ * @package SP\Storage
+ */
+class FileCachePacked implements FileStorageInterface
+{
+ /**
+ * @var array
+ */
+ protected $data;
+ /**
+ * @var bool
+ */
+ protected $loaded = false;
+
+ /**
+ * @param string $path
+ *
+ * @return mixed
+ * @throws \RuntimeException
+ */
+ public function load($path)
+ {
+ if (!file_exists($path)) {
+ throw new RuntimeException(sprintf(__('No es posible leer/escribir el archivo: %s'), $path));
+ }
+
+ if (!($data = file_get_contents($path))) {
+ throw new RuntimeException(sprintf(__('Error al leer datos del archivo: %s'), $path));
+ }
+
+ if (!($data = gzuncompress($data))) {
+ throw new RuntimeException(sprintf(__('Error al descomprimir datos del archivo: %s'), $path));
+ }
+
+ if (($this->data = unserialize($data)) === false) {
+ throw new RuntimeException(__('Error al obtener los datos'));
+ }
+
+ $this->loaded = true;
+
+ return $this;
+ }
+
+ /**
+ * @param string $path
+ * @param mixed $data
+ * @return FileStorageInterface
+ */
+ public function save($path, $data = null)
+ {
+ if ($data === null) {
+ $this->saveData($path, $this->data);
+ } else {
+ $this->saveData($path, $data);
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param $path
+ * @param $data
+ */
+ protected function saveData($path, $data)
+ {
+ $dir = dirname($path);
+
+ if (!is_dir($dir) && mkdir($dir, 0700, true) === false) {
+ throw new RuntimeException(sprintf(__('No es posible crear el directorio: %s'), $dir));
+ }
+
+ if (file_exists($path) && !is_writable($path)) {
+ throw new RuntimeException(sprintf(__('No es posible leer/escribir el archivo: %s'), $path));
+ }
+
+ if (!($data = gzcompress(serialize($data)))) {
+ throw new RuntimeException(sprintf(__('Error al comprimir datos del archivo: %s'), $path));
+ }
+
+ if (!file_put_contents($path, $data)) {
+ throw new RuntimeException(sprintf(__('Error al escribir datos en el archivo: %s'), $path));
+ }
+ }
+
+ /**
+ * @param string $path
+ *
+ * @return FileStorageInterface
+ */
+ public function delete($path)
+ {
+ if (file_exists($path) && !is_writable($path)) {
+ throw new RuntimeException(sprintf(__('No es posible leer/escribir el archivo: %s'), $path));
+ }
+
+ if (!unlink($path)) {
+ throw new RuntimeException(sprintf(__('Error al eliminar el archivo: %s'), $path));
+ }
+
+ return $this;
+ }
+
+ /**
+ * Gets key data from cache
+ *
+ * @param $key
+ * @return mixed
+ */
+ public function get($key)
+ {
+ if (!$this->loaded) {
+ throw new RuntimeException((__('Datos no cargados')));
+ }
+
+ return isset($this->data[$key]) ? $this->data[$key] : null;
+ }
+
+ /**
+ * Sets key data into cache
+ *
+ * @param $key
+ * @param $data
+ */
+ public function set($key, $data)
+ {
+ if (!$this->loaded) {
+ $this->data = [];
+ }
+
+ $this->data[$key] = ['time' => time(), 'data' => serialize($data)];
+ }
+}
\ No newline at end of file
diff --git a/public/js/app-actions.js b/public/js/app-actions.js
index e495226f..9c249840 100644
--- a/public/js/app-actions.js
+++ b/public/js/app-actions.js
@@ -493,7 +493,6 @@ sysPass.Actions = function (Common) {
log.info("items:update");
const $dst = $("#" + $obj.data("item-dst"))[0].selectize;
-
$dst.clearOptions();
$dst.load(function (callback) {
const opts = Common.appRequests().getRequestOpts();
@@ -643,7 +642,7 @@ sysPass.Actions = function (Common) {
upgrade: function ($obj) {
log.info("main:upgrade");
- var atext = "" + Common.config().LANG[59] + "
";
+ const atext = "" + Common.config().LANG[59] + "
";
mdlDialog().show({
text: atext,
@@ -658,28 +657,28 @@ sysPass.Actions = function (Common) {
positive: {
title: Common.config().LANG[43],
onClick: function (e) {
- var $useTask = $obj.find("input[name='useTask']");
- var $taskStatus = $("#taskStatus");
+ const $useTask = $obj.find("input[name='useTask']");
+ const $taskStatus = $("#taskStatus");
$taskStatus.empty().html(Common.config().LANG[62]);
if ($useTask.length > 0 && $useTask.val() == 1) {
- var optsTask = Common.appRequests().getRequestOpts();
+ const optsTask = Common.appRequests().getRequestOpts();
optsTask.url = ajaxUrl.entrypoint;
optsTask.data = {
source: $obj.find("input[name='lock']").val(),
taskId: $obj.find("input[name='taskId']").val()
};
- var task = Common.appRequests().getActionEvent(optsTask, function (result) {
- var text = result.task + " - " + result.message + " - " + result.time + " - " + result.progress + "%";
+ const task = Common.appRequests().getActionEvent(optsTask, function (result) {
+ let text = result.task + " - " + result.message + " - " + result.time + " - " + result.progress + "%";
text += "
" + Common.config().LANG[62];
$taskStatus.empty().html(text);
});
}
- var opts = Common.appRequests().getRequestOpts();
+ const opts = Common.appRequests().getRequestOpts();
opts.url = ajaxUrl.entrypoint;
opts.method = "get";
opts.useFullLoading = true;
@@ -707,7 +706,7 @@ sysPass.Actions = function (Common) {
getUpdates: function () {
log.info("main:getUpdates");
- var opts = Common.appRequests().getRequestOpts();
+ const opts = Common.appRequests().getRequestOpts();
opts.url = ajaxUrl.entrypoint;
opts.type = "html";
opts.method = "get";
@@ -1040,7 +1039,11 @@ sysPass.Actions = function (Common) {
}
};
-
+ /**
+ * Common tabs actions
+ *
+ * @type {{state: {tab: {index: number, refresh: boolean, route: string}, itemId: number, update: update}, save: save}}
+ */
const tabs = {
state: {
tab: {
@@ -1067,6 +1070,7 @@ sysPass.Actions = function (Common) {
const opts = Common.appRequests().getRequestOpts();
opts.url = ajaxUrl.entrypoint + "?r=" + $obj.data("action-route");
+ opts.method = $obj.data("action-method") || "post";
opts.data = $obj.serialize();
Common.appRequests().getActionCall(opts, function (json) {
@@ -1145,7 +1149,7 @@ sysPass.Actions = function (Common) {
opts.url = ajaxUrl.entrypoint;
opts.method = "get";
opts.data = {
- r: $obj.data("action-route") + (itemId ? "/" + itemId : ''),
+ r: $obj.data("action-route") + (itemId && "/" + itemId),
items: items,
sk: Common.sk.get(),
isAjax: 1
@@ -1239,11 +1243,11 @@ sysPass.Actions = function (Common) {
*
* @type {{view: wiki.view}}
*/
- var wiki = {
+ const wiki = {
show: function ($obj) {
log.info("wiki:show");
- var opts = Common.appRequests().getRequestOpts();
+ const opts = Common.appRequests().getRequestOpts();
opts.url = ajaxUrl.entrypoint;
opts.method = "get";
opts.data = {
@@ -1266,38 +1270,21 @@ sysPass.Actions = function (Common) {
/**
* Objeto para las acciones de los plugins
*/
- var plugin = {
+ const plugin = {
toggle: function ($obj) {
log.info("plugin:enable");
- var data = {
- itemId: $obj.data("item-id"),
- actionId: $obj.data("action-id"),
- sk: Common.sk.get(),
- activeTab: $obj.data("activetab")
- };
-
- var opts = Common.appRequests().getRequestOpts();
- opts.url = ajaxUrl.entrypoint;
- opts.data = data;
-
- Common.appRequests().getActionCall(opts, function (json) {
- Common.msg.out(json);
-
- if (json.status === 0) {
- // Recargar para cargar/descargar el plugin
- setTimeout(function () {
- Common.redirect("index.php");
- }, 2000);
-
- //doAction({actionId: $obj.data("nextaction-id"), itemId: $obj.data("activetab")});
- }
+ tabs.save($obj, function () {
+ // Recargar para cargar/descargar el plugin
+ setTimeout(function () {
+ Common.redirect("index.php");
+ }, 2000);
});
},
reset: function ($obj) {
log.info("plugin:reset");
- var atext = "" + Common.config().LANG[58] + "
";
+ const atext = "" + Common.config().LANG[58] + "
";
mdlDialog().show({
text: atext,
@@ -1314,20 +1301,7 @@ sysPass.Actions = function (Common) {
onClick: function (e) {
e.preventDefault();
- var data = {
- "itemId": $obj.data("item-id"),
- "actionId": $obj.data("action-id"),
- "sk": Common.sk.get(),
- "activeTab": $obj.data("activetab")
- };
-
- var opts = Common.appRequests().getRequestOpts();
- opts.url = ajaxUrl.entrypoint;
- opts.data = data;
-
- Common.appRequests().getActionCall(opts, function (json) {
- Common.msg.out(json);
- });
+ tabs.save($obj);
}
}
});
@@ -1433,6 +1407,11 @@ sysPass.Actions = function (Common) {
}
};
+ /**
+ * Common grids actions
+ *
+ * @type {{search: search, nav: nav, delete: delete}}
+ */
const grid = {
search: function ($obj) {
log.info("grid:search");
diff --git a/public/js/app-actions.min.js b/public/js/app-actions.min.js
index d06792ea..2c54fafb 100644
--- a/public/js/app-actions.min.js
+++ b/public/js/app-actions.min.js
@@ -1,5 +1,5 @@
var $jscomp={scope:{},findInternal:function(b,e,l){b instanceof String&&(b=String(b));for(var f=b.length,g=0;g
";mdlDialog().show({text:c,negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(c){c=a.find("input[name='useTask']");var d=$("#taskStatus");d.empty().html(b.config().LANG[62]);0"+b.config().LANG[62];d.empty().html(a)}));c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.method="get";c.useFullLoading=!0;c.data=a.serialize();b.appRequests().getActionCall(c,function(c){b.msg.out(c);0!==c.status?a.find(":input[name=h]").val(""):(void 0!==task&&task.close(),setTimeout(function(){b.redirect("index.php")},5E3))})}}})},getUpdates:function(){e.info("main:getUpdates");var a=b.appRequests().getRequestOpts();
a.url=f.entrypoint;a.type="html";a.method="get";a.timeout=1E4;a.useLoading=!1;a.data={isAjax:1};b.appRequests().getActionCall(a,function(a){$("#updates").html(a);void 0!==componentHandler&&componentHandler.upgradeDom()},function(){$("#updates").html("!")})}},k={state:{tab:{index:0,refresh:!0,route:""},itemId:0,update:function(a){var b=$("#content").find("[id^='tabs-'].is-active");0",e=a.data("selection"),f=[];if(e&&($(e).find(".is-selected").each(function(){f.push($(this).data("item-id"))}),0===f.length))return;mdlDialog().show({text:d,negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(a){a.preventDefault();"function"===typeof c&&c(f)}}})}};return{doAction:function(a,c){var d={r:a.r+(void 0!==a.itemId?"/"+a.itemId:""),isAjax:1},e=b.appRequests().getRequestOpts();
-e.url=f.entrypoint;e.method="get";e.type="html";e.addHistory=!0;e.data=d;b.appRequests().getActionCall(e,function(a){var d=$("#content");d.empty().html(a);a=b.triggers().views;a.common(d);if(void 0!==c&&"function"===typeof a[c])a[c]();d=$(".mdl-layout__content");0";mdlDialog().show({text:c,negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();
-b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(c){c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.method="get";c.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:b.sk.get()};b.appRequests().getActionCall(c,function(a){b.msg.out(a);0===a.status&&p.listFiles($("#list-account-files"))})}}})}},checks:{wiki:function(a){e.info("checks:wiki");a=$(a.data("src"));a.find("[name='sk']").val(b.sk.get());var c=b.appRequests().getRequestOpts();c.url=f.entrypoint;
-c.data=a.serialize();b.appRequests().getActionCall(c,function(a){b.msg.out(a);0===a.status&&$("#dokuWikiResCheck").html(a.data)})}},config:{save:function(a){e.info("config:save");k.save(a)},masterpass:function(a){var c='";mdlDialog().show({text:c,negative:{title:b.config().LANG[44],onClick:function(c){c.preventDefault();b.msg.error(b.config().LANG[44]);a.find(":input[type=password]").val("")}},positive:{title:b.config().LANG[43],
-onClick:function(c){c=a.find("input[name='useTask']");var d=$("#taskStatus");d.empty().html(b.config().LANG[62]);0"+b.config().LANG[62];d.empty().html(a)}));c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.useFullLoading=
-!0;c.data=a.serialize();b.appRequests().getActionCall(c,function(c){b.msg.out(c);a.find(":input[type=password]").val("");void 0!==task&&task.close()})}}})},backup:function(a){e.info("config:backup");k.state.update(a);var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("action-route");c.useFullLoading=!0;c.data=a.serialize();b.appRequests().getActionCall(c,function(a){b.msg.out(a);0===a.status&&g({r:k.state.tab.route,tabIndex:k.state.tab.index})})},"export":function(a){e.info("config:export");
-k.save(a)},"import":function(a){e.info("config:import");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("action-route");c.data=a.serialize();b.appRequests().getActionCall(c,function(a){b.msg.out(a)})},refreshMpass:function(a){e.info("config:import");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("action-route");c.data={sk:a.data("sk"),isAjax:1};b.appRequests().getActionCall(c,function(a){b.msg.out(a)})}},main:t,user:{showSettings:function(a){e.info("user:showSettings");
-g({r:a.data("action-route")},"userSettings")},saveSettings:function(a){e.info("user:saveSettings");k.save(a)},password:function(a){e.info("user:password");var c=b.appRequests().getRequestOpts();c.type="html";c.method="get";c.url=f.entrypoint;c.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(c,function(a){0===a.length?t.logout():m(a)})},passreset:function(a){e.info("user:passreset");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+
-"/?r="+a.data("action-route");c.data=a.serialize();b.appRequests().getActionCall(c,function(a){b.msg.out(a);0===a.status&&setTimeout(function(){b.redirect("index.php")},2E3)})}},link:{save:function(a){e.info("link:save");var c=a.data("item-id"),d=b.appRequests().getRequestOpts();d.url=f.entrypoint;d.data={r:a.data("action-route"),accountId:c,notify:0,sk:b.sk.get(),isAjax:1};var h='";mdlDialog().show({text:h,negative:{title:b.config().LANG[44],
-onClick:function(e){e.preventDefault();b.appRequests().getActionCall(d,function(d){b.msg.out(d);0===d.status&&g({r:a.data("action-next")+"/"+c})})}},positive:{title:b.config().LANG[43],onClick:function(e){e.preventDefault();d.data.notify=1;b.appRequests().getActionCall(d,function(d){b.msg.out(d);0===d.status&&g({r:a.data("action-next")+"/"+c})})}}})},refresh:function(a){e.info("link:refresh");k.state.update(a);var c=a.data("item-id"),d=b.appRequests().getRequestOpts();d.url=f.entrypoint;d.method=
-"get";d.data={r:a.data("action-route")+"/"+c,sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(d,function(d){b.msg.out(d);0===d.status&&((d=a.data("action-next"))?g({r:d+"/"+c}):g({r:k.state.tab.route,tabIndex:k.state.tab.index}))})}},eventlog:{search:function(a){e.info("eventlog:search");n.search(a)},nav:function(a){e.info("eventlog:nav");n.nav(a)},clear:function(a){var c='";mdlDialog().show({text:c,negative:{title:b.config().LANG[44],
-onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(c){c.preventDefault();c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("action-route");c.method="get";c.data={sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(c,function(c){b.msg.out(c);0===c.status&&g({r:a.data("nextaction")});b.sk.set(c.csrf)})}}})}},ajaxUrl:f,plugin:{toggle:function(a){e.info("plugin:enable");a={itemId:a.data("item-id"),actionId:a.data("action-id"),
-sk:b.sk.get(),activeTab:a.data("activetab")};var c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.data=a;b.appRequests().getActionCall(c,function(a){b.msg.out(a);0===a.status&&setTimeout(function(){b.redirect("index.php")},2E3)})},reset:function(a){e.info("plugin:reset");var c='";mdlDialog().show({text:c,negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],
-onClick:function(c){c.preventDefault();c={itemId:a.data("item-id"),actionId:a.data("action-id"),sk:b.sk.get(),activeTab:a.data("activetab")};var d=b.appRequests().getRequestOpts();d.url=f.entrypoint;d.data=c;b.appRequests().getActionCall(d,function(a){b.msg.out(a)})}}})}},notification:{check:function(a){e.info("notification:check");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.method="get";c.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(c,
-function(c){b.msg.out(c);0===c.status&&g({r:a.data("nextaction")});b.sk.set(c.csrf)})},search:function(a){e.info("notification:search");n.search(a)},show:function(a){e.info("notification:show");u.show(a)},save:function(a){e.info("notification:save");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("route");c.data=a.serialize();b.appRequests().getActionCall(c,function(c){b.msg.out(c);0===c.status&&(g({r:a.data("nextaction")}),$.magnificPopup.close())})},"delete":function(a){e.info("notification:delete");
-n["delete"](a,function(c){var d=a.data("item-id"),e=b.appRequests().getRequestOpts();e.url=f.entrypoint;e.method="get";e.data={r:a.data("action-route")+(d?"/"+d:""),items:c,sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(e,function(c){b.msg.out(c);g({r:a.data("nextaction")})})})},getActive:function(){e.info("notification:getActive");var a=b.appRequests().getRequestOpts();a.url=f.entrypoint;a.method="get";a.data={r:"items/notifications",sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(a,
-function(a){return a})},nav:function(a){e.info("eventlog:nav");n.nav(a)}},wiki:{show:function(a){e.info("wiki:show");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.method="get";c.data={pageName:a.data("pagename"),actionId:a.data("action-id"),sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(c,function(a){0!==a.status?b.msg.out(a):m(a.data.html)})}},items:r,ldap:{check:function(a){e.info("ldap:check");var c=$(a.data("src"));c.find("[name='sk']").val(b.sk.get());var d=b.appRequests().getRequestOpts();
-d.url=f.entrypoint+"?r="+a.data("action-route");d.data=c.serialize();b.appRequests().getActionCall(d,function(a){b.msg.out(a);0===a.status&&void 0!==a.data.template&&void 0!==a.data.items&&m(a.data.template,{open:function(){var c=$("#ldap-results").find(".list-wrap").empty();a.data.items.forEach(function(a){c.append(b.appTheme().html.getList(a.items,a.icon))})}})})},"import":function(a){e.info("ldap:import");var c='";mdlDialog().show({text:c,
-negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(c){c=$(a.data("src"));c.find("[name='sk']").val(b.sk.get());var d=b.appRequests().getRequestOpts();d.url=f.entrypoint+"?r="+a.data("action-route");d.data=c.serialize();b.appRequests().getActionCall(d,function(a){b.msg.out(a)})}}})}}}};
+k.state.itemId=a.data("item-id"))}},save:function(a,c){e.info("tabs:save");k.state.update(a);var d=b.appRequests().getRequestOpts();d.url=f.entrypoint+"?r="+a.data("action-route");d.method=a.data("action-method")||"post";d.data=a.serialize();b.appRequests().getActionCall(d,function(d){b.msg.out(d);0===d.status&&("function"===typeof c&&c(),!0===k.state.tab.refresh?g({r:k.state.tab.route,tabIndex:k.state.tab.index}):void 0!==a.data("reload")&&(e.info("reload"),setTimeout(function(){b.redirect("index.php")},
+2E3)))})}},u={show:function(a){e.info("appMgmt:show");k.state.update(a);var c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.method="get";c.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(c,function(c){if(0!==c.status)b.msg.out(c);else{var d=a.data("item-dst");m(c.data.html,{open:function(){d&&(k.state.tab.refresh=!1)},close:function(){d&&r.update(a)}})}})},"delete":function(a){e.info("appMgmt:delete");k.state.update(a);n["delete"](a,
+function(c){var d=a.data("item-id"),h=b.appRequests().getRequestOpts();h.url=f.entrypoint;h.method="get";h.data={r:a.data("action-route")+(d&&"/"+d),items:c,sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(h,function(a){b.msg.out(a);g({r:k.state.tab.route,tabIndex:k.state.tab.index})})})},save:function(a){e.info("appMgmt:save");k.save(a,function(){$.magnificPopup.close()})},search:function(a){e.info("appMgmt:search");n.search(a)},nav:function(a){e.info("appMgmt:nav");n.nav(a)}},n={search:function(a){e.info("grid:search");
+var c=$(a.data("target")),d=b.appRequests().getRequestOpts();d.url=f.entrypoint+"?r="+a.data("action-route");d.method="get";d.data=a.serialize();b.appRequests().getActionCall(d,function(a){0===a.status?c.html(a.data.html):c.html(b.msg.html.error(a.description));b.sk.set(a.csrf)})},nav:function(a,c){e.info("grid:nav");var d=$("#"+a.data("action-form"));d.find("[name='start']").val(a.data("start"));d.find("[name='count']").val(a.data("count"));d.find("[name='sk']").val(b.sk.get());"function"===typeof c?
+c(d):n.search(d)},"delete":function(a,c){var d='",e=a.data("selection"),f=[];if(e&&($(e).find(".is-selected").each(function(){f.push($(this).data("item-id"))}),0===f.length))return;mdlDialog().show({text:d,negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(a){a.preventDefault();"function"===typeof c&&c(f)}}})}};return{doAction:function(a,
+c){var d={r:a.r+(void 0!==a.itemId?"/"+a.itemId:""),isAjax:1},e=b.appRequests().getRequestOpts();e.url=f.entrypoint;e.method="get";e.type="html";e.addHistory=!0;e.data=d;b.appRequests().getActionCall(e,function(a){var d=$("#content");d.empty().html(a);a=b.triggers().views;a.common(d);if(void 0!==c&&"function"===typeof a[c])a[c]();d=$(".mdl-layout__content");0";mdlDialog().show({text:c,
+negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(c){c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.method="get";c.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:b.sk.get()};b.appRequests().getActionCall(c,function(a){b.msg.out(a);0===a.status&&p.listFiles($("#list-account-files"))})}}})}},checks:{wiki:function(a){e.info("checks:wiki");a=$(a.data("src"));a.find("[name='sk']").val(b.sk.get());
+var c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.data=a.serialize();b.appRequests().getActionCall(c,function(a){b.msg.out(a);0===a.status&&$("#dokuWikiResCheck").html(a.data)})}},config:{save:function(a){e.info("config:save");k.save(a)},masterpass:function(a){var c='";mdlDialog().show({text:c,negative:{title:b.config().LANG[44],onClick:function(c){c.preventDefault();b.msg.error(b.config().LANG[44]);a.find(":input[type=password]").val("")}},
+positive:{title:b.config().LANG[43],onClick:function(c){c=a.find("input[name='useTask']");var d=$("#taskStatus");d.empty().html(b.config().LANG[62]);0"+b.config().LANG[62];d.empty().html(a)}));c=b.appRequests().getRequestOpts();
+c.url=f.entrypoint;c.useFullLoading=!0;c.data=a.serialize();b.appRequests().getActionCall(c,function(c){b.msg.out(c);a.find(":input[type=password]").val("");void 0!==task&&task.close()})}}})},backup:function(a){e.info("config:backup");k.state.update(a);var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("action-route");c.useFullLoading=!0;c.data=a.serialize();b.appRequests().getActionCall(c,function(a){b.msg.out(a);0===a.status&&g({r:k.state.tab.route,tabIndex:k.state.tab.index})})},
+"export":function(a){e.info("config:export");k.save(a)},"import":function(a){e.info("config:import");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("action-route");c.data=a.serialize();b.appRequests().getActionCall(c,function(a){b.msg.out(a)})},refreshMpass:function(a){e.info("config:import");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("action-route");c.data={sk:a.data("sk"),isAjax:1};b.appRequests().getActionCall(c,function(a){b.msg.out(a)})}},main:t,
+user:{showSettings:function(a){e.info("user:showSettings");g({r:a.data("action-route")},"userSettings")},saveSettings:function(a){e.info("user:saveSettings");k.save(a)},password:function(a){e.info("user:password");var c=b.appRequests().getRequestOpts();c.type="html";c.method="get";c.url=f.entrypoint;c.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(c,function(a){0===a.length?t.logout():m(a)})},passreset:function(a){e.info("user:passreset");
+var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"/?r="+a.data("action-route");c.data=a.serialize();b.appRequests().getActionCall(c,function(a){b.msg.out(a);0===a.status&&setTimeout(function(){b.redirect("index.php")},2E3)})}},link:{save:function(a){e.info("link:save");var c=a.data("item-id"),d=b.appRequests().getRequestOpts();d.url=f.entrypoint;d.data={r:a.data("action-route"),accountId:c,notify:0,sk:b.sk.get(),isAjax:1};var h='";
+mdlDialog().show({text:h,negative:{title:b.config().LANG[44],onClick:function(e){e.preventDefault();b.appRequests().getActionCall(d,function(d){b.msg.out(d);0===d.status&&g({r:a.data("action-next")+"/"+c})})}},positive:{title:b.config().LANG[43],onClick:function(e){e.preventDefault();d.data.notify=1;b.appRequests().getActionCall(d,function(d){b.msg.out(d);0===d.status&&g({r:a.data("action-next")+"/"+c})})}}})},refresh:function(a){e.info("link:refresh");k.state.update(a);var c=a.data("item-id"),d=
+b.appRequests().getRequestOpts();d.url=f.entrypoint;d.method="get";d.data={r:a.data("action-route")+"/"+c,sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(d,function(d){b.msg.out(d);0===d.status&&((d=a.data("action-next"))?g({r:d+"/"+c}):g({r:k.state.tab.route,tabIndex:k.state.tab.index}))})}},eventlog:{search:function(a){e.info("eventlog:search");n.search(a)},nav:function(a){e.info("eventlog:nav");n.nav(a)},clear:function(a){var c='";
+mdlDialog().show({text:c,negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(c){c.preventDefault();c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("action-route");c.method="get";c.data={sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(c,function(c){b.msg.out(c);0===c.status&&g({r:a.data("nextaction")});b.sk.set(c.csrf)})}}})}},ajaxUrl:f,plugin:{toggle:function(a){e.info("plugin:enable");
+k.save(a,function(){setTimeout(function(){b.redirect("index.php")},2E3)})},reset:function(a){e.info("plugin:reset");var c='";mdlDialog().show({text:c,negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(b){b.preventDefault();k.save(a)}}})}},notification:{check:function(a){e.info("notification:check");var c=b.appRequests().getRequestOpts();
+c.url=f.entrypoint;c.method="get";c.data={r:a.data("action-route")+"/"+a.data("item-id"),sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(c,function(c){b.msg.out(c);0===c.status&&g({r:a.data("nextaction")});b.sk.set(c.csrf)})},search:function(a){e.info("notification:search");n.search(a)},show:function(a){e.info("notification:show");u.show(a)},save:function(a){e.info("notification:save");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint+"?r="+a.data("route");c.data=a.serialize();b.appRequests().getActionCall(c,
+function(c){b.msg.out(c);0===c.status&&(g({r:a.data("nextaction")}),$.magnificPopup.close())})},"delete":function(a){e.info("notification:delete");n["delete"](a,function(c){var d=a.data("item-id"),e=b.appRequests().getRequestOpts();e.url=f.entrypoint;e.method="get";e.data={r:a.data("action-route")+(d?"/"+d:""),items:c,sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(e,function(c){b.msg.out(c);g({r:a.data("nextaction")})})})},getActive:function(){e.info("notification:getActive");var a=b.appRequests().getRequestOpts();
+a.url=f.entrypoint;a.method="get";a.data={r:"items/notifications",sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(a,function(a){return a})},nav:function(a){e.info("eventlog:nav");n.nav(a)}},wiki:{show:function(a){e.info("wiki:show");var c=b.appRequests().getRequestOpts();c.url=f.entrypoint;c.method="get";c.data={pageName:a.data("pagename"),actionId:a.data("action-id"),sk:b.sk.get(),isAjax:1};b.appRequests().getActionCall(c,function(a){0!==a.status?b.msg.out(a):m(a.data.html)})}},items:r,ldap:{check:function(a){e.info("ldap:check");
+var c=$(a.data("src"));c.find("[name='sk']").val(b.sk.get());var d=b.appRequests().getRequestOpts();d.url=f.entrypoint+"?r="+a.data("action-route");d.data=c.serialize();b.appRequests().getActionCall(d,function(a){b.msg.out(a);0===a.status&&void 0!==a.data.template&&void 0!==a.data.items&&m(a.data.template,{open:function(){var c=$("#ldap-results").find(".list-wrap").empty();a.data.items.forEach(function(a){c.append(b.appTheme().html.getList(a.items,a.icon))})}})})},"import":function(a){e.info("ldap:import");
+var c='";mdlDialog().show({text:c,negative:{title:b.config().LANG[44],onClick:function(a){a.preventDefault();b.msg.error(b.config().LANG[44])}},positive:{title:b.config().LANG[43],onClick:function(c){c=$(a.data("src"));c.find("[name='sk']").val(b.sk.get());var d=b.appRequests().getRequestOpts();d.url=f.entrypoint+"?r="+a.data("action-route");d.data=c.serialize();b.appRequests().getActionCall(d,function(a){b.msg.out(a)})}}})}}}};
diff --git a/public/js/app-main.min.js b/public/js/app-main.min.js
index 8728fc9b..1fcb67aa 100644
--- a/public/js/app-main.min.js
+++ b/public/js/app-main.min.js
@@ -1,5 +1,5 @@
var $jscomp={scope:{},findInternal:function(b,l,h){b instanceof String&&(b=String(b));for(var m=b.length,n=0;n