From 0dbbdca9c37c803ef7891e98b27496fcf391c069 Mon Sep 17 00:00:00 2001 From: nuxsmin Date: Mon, 26 Dec 2016 13:56:15 +0100 Subject: [PATCH] * [DEV] New API methods and improvements (work in progress) --- ajax/ajax_getContent.php | 1 - api.php | 7 +- inc/SP/Account/Account.class.php | 15 +- inc/SP/Api/ApiBase.class.php | 123 +++++--- inc/SP/Api/ApiInterface.class.php | 40 +++ inc/SP/Api/ApiRequest.class.php | 26 +- inc/SP/Api/ApiTokens.class.php | 32 +-- inc/SP/Api/ApiTokensUtil.class.php | 18 +- inc/SP/Api/SyspassApi.class.php | 270 ++++++++++++++++-- inc/SP/Auth/Auth.class.php | 2 +- inc/SP/Auth/AuthResult.class.php | 70 +++++ .../Controller/ItemActionController.class.php | 3 - inc/SP/Controller/LoginController.class.php | 13 +- inc/SP/Core/Acl.class.php | 8 + inc/SP/Core/Init.class.php | 3 - inc/SP/Core/Language.class.php | 6 +- inc/SP/Core/Session.class.php | 2 +- inc/SP/Core/SessionUtil.class.php | 58 ++-- inc/SP/DataModel/CategoryData.class.php | 12 + inc/SP/DataModel/UserPassData.class.php | 2 +- inc/SP/Mgmt/Categories/Category.class.php | 33 ++- inc/SP/Mgmt/Customers/Customer.class.php | 41 ++- inc/SP/Mgmt/ItemTrait.class.php | 18 ++ inc/SP/Mgmt/Users/User.class.php | 7 +- inc/sql/1.3.16100601.sql | 2 + inc/themes/material-blue/css/styles-wiki.css | 44 +-- .../material-blue/css/styles-wiki.min.css | 2 +- inc/themes/material-blue/css/styles.css | 45 +-- inc/themes/material-blue/css/styles.min.css | 2 +- .../material-blue/views/account/viewpass.inc | 4 +- .../views/itemshow/categories.inc | 4 +- .../views/itemshow/customers.inc | 4 +- .../views/itemshow/customfields.inc | 4 +- .../material-blue/views/itemshow/groups.inc | 4 +- .../material-blue/views/itemshow/profiles.inc | 4 +- .../views/itemshow/publiclinks.inc | 4 +- .../material-blue/views/itemshow/tags.inc | 4 +- .../material-blue/views/itemshow/tokens.inc | 4 +- .../material-blue/views/itemshow/users.inc | 4 +- .../views/itemshow/userspass.inc | 4 +- .../material-blue/views/wiki/wikipage.inc | 4 +- js/app-actions.js | 2 +- js/app-actions.min.js | 56 ++-- 43 files changed, 742 insertions(+), 269 deletions(-) create mode 100644 inc/SP/Api/ApiInterface.class.php create mode 100644 inc/SP/Auth/AuthResult.class.php diff --git a/ajax/ajax_getContent.php b/ajax/ajax_getContent.php index 402dff6d..d254f65e 100644 --- a/ajax/ajax_getContent.php +++ b/ajax/ajax_getContent.php @@ -37,7 +37,6 @@ use SP\Core\Session; use SP\Core\Template; use SP\Http\Request; use SP\Http\Response; -use SP\Util\Checks; use SP\Util\Util; define('APP_ROOT', '..'); diff --git a/api.php b/api.php index eac7a664..32bb378d 100644 --- a/api.php +++ b/api.php @@ -25,6 +25,7 @@ use SP\Api\ApiRequest; use SP\Core\Init; +use SP\Http\Response; define('APP_ROOT', '.'); @@ -38,9 +39,9 @@ try { $ApiRequest = new ApiRequest(); exit($ApiRequest->runApi()); } catch (Exception $e) { - \SP\Http\Response::printJson( - array( + Response::printJson( + [ 'message' => $e->getMessage(), 'help' => ApiRequest::getHelp() - )); + ]); } \ No newline at end of file diff --git a/inc/SP/Account/Account.class.php b/inc/SP/Account/Account.class.php index 97067a9f..650f7fe4 100644 --- a/inc/SP/Account/Account.class.php +++ b/inc/SP/Account/Account.class.php @@ -25,11 +25,14 @@ namespace SP\Account; +use SP\Core\ActionsInterface; use SP\Core\Crypt; use SP\DataModel\AccountData; use SP\DataModel\AccountExtData; use SP\DataModel\AccountHistoryData; +use SP\DataModel\CustomFieldData; use SP\DataModel\GroupAccountsData; +use SP\Mgmt\CustomFields\CustomField; use SP\Mgmt\Files\FileUtil; use SP\Mgmt\Groups\GroupAccounts; use SP\Mgmt\Groups\GroupAccountsUtil; @@ -303,16 +306,18 @@ class Account extends AccountBase implements AccountInterface $Data->setMapClass($this->accountData); $Data->addParam($this->accountData->getAccountId(), 'id'); - /** @var AccountExtData $queryRes */ + /** @var AccountExtData|array $queryRes */ $queryRes = DB::getResults($Data); if ($queryRes === false) { throw new SPException(SPException::SP_CRITICAL, _('No se pudieron obtener los datos de la cuenta')); + } elseif (is_array($queryRes) && count($queryRes) === 0){ + throw new SPException(SPException::SP_CRITICAL, _('La cuenta no existe')); } // Obtener los usuarios y grupos secundarios y las etiquetas - $this->accountData->setUsersId(UserAccounts::getUsersForAccount($queryRes->getAccountId())); - $this->accountData->setUserGroupsId(GroupAccountsUtil::getGroupsForAccount($queryRes->getAccountId())); + $this->accountData->setUsersId(UserAccounts::getUsersForAccount($this->accountData->getAccountId())); + $this->accountData->setUserGroupsId(GroupAccountsUtil::getGroupsForAccount($this->accountData->getAccountId())); $this->accountData->setTags(AccountTags::getTags($queryRes)); return $this->accountData; @@ -464,6 +469,10 @@ class Account extends AccountBase implements AccountInterface try { GroupAccounts::getItem()->delete($this->accountData->getAccountId()); FileUtil::deleteAccountFiles($this->accountData->getAccountId()); + + $CustomFieldData = new CustomFieldData(); + $CustomFieldData->setModule(ActionsInterface::ACTION_ACC); + CustomField::getItem($CustomFieldData)->delete($this->accountData->getAccountId()); } catch (SPException $e) { $Log->setLogLevel(Log::ERROR); $Log->addDescription($e->getMessage()); diff --git a/inc/SP/Api/ApiBase.class.php b/inc/SP/Api/ApiBase.class.php index 55ecc96f..3aebf718 100644 --- a/inc/SP/Api/ApiBase.class.php +++ b/inc/SP/Api/ApiBase.class.php @@ -28,6 +28,8 @@ namespace SP\Api; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); use SP\Auth\Auth; +use SP\Auth\AuthDataBase; +use SP\Auth\AuthResult; use SP\Auth\AuthUtil; use SP\Core\Acl; use SP\Core\Session; @@ -43,7 +45,7 @@ use SP\Util\Json; * * @package SP\Api */ -abstract class ApiBase +abstract class ApiBase implements ApiInterface { /** * El ID de la acción @@ -69,10 +71,6 @@ abstract class ApiBase * @var mixed */ protected $params; - /** - * @var array - */ - protected $actionsMap = []; /** * @var string */ @@ -88,32 +86,12 @@ abstract class ApiBase throw new SPException(SPException::SP_CRITICAL, _('Acceso no permitido')); } - $this->userId = ApiTokensUtil::getUserIdForToken($params->authToken); - $this->actionId = $this->getActionId($params->action); - $this->auth = true; $this->params = $params; + $this->userId = ApiTokensUtil::getUserIdForToken($this->getParam('authToken', true)); + $this->actionId = $this->getActionId($this->getParam('action', true)); - if (isset($params->userPass)) { - - $UserData = new UserData(); - $UserData->setUserId($this->userId); - $UserData->setUserPass($params->userPass); - - User::getItem($UserData)->getById($this->userId); - - $UserPass = UserPass::getItem($UserData); - $Auth = new Auth($UserData); - - if (!$UserData->isUserIsDisabled() - && $Auth->doAuth() - && $UserPass->loadUserMPass() - && $UserPass->checkUserUpdateMPass() - ) { - $this->mPass = $UserPass->getClearUserMPass(); - SessionUtil::loadUserSession($UserData); - } else { - throw new SPException(SPException::SP_CRITICAL, _('Acceso no permitido')); - } + if ($this->getParam('userPass') !== null) { + $this->doAuth(); } Session::setSessionType(Session::SESSION_API); @@ -127,7 +105,9 @@ abstract class ApiBase */ protected function getActionId($action) { - return (is_array($this->actionsMap) && isset($this->actionsMap[$action])) ? $this->actionsMap[$action] : 0; + $actions = $this->getActions(); + + return isset($actions[$action]) ? $actions[$action] : 0; } /** @@ -152,11 +132,90 @@ abstract class ApiBase */ protected function wrapJSON(&$data) { - $json = array( + $json = [ 'action' => Acl::getActionName($this->actionId, true), 'data' => $data - ); + ]; return Json::getJson($json); } + + /** + * Devolver el valor de un parámetro + * + * @param string $name Nombre del parámetro + * @param bool $required Si es requerido + * @param mixed $default Valor por defecto + * @return int|string + * @throws SPException + */ + protected function getParam($name, $required = false, $default = null) + { + if ($required === true && !isset($this->params->$name)) { + debugLog(__FUNCTION__ . ':' . $name); + + throw new SPException(SPException::SP_WARNING, _('Parámetros incorrectos')); + } + + if (isset($this->params->$name)) { + return $this->params->$name; + } + + return $default; + } + + /** + * Realizar la autentificación del usuario + * + * @throws SPException + */ + protected function doAuth() + { + $UserData = new UserData(); + $UserData->setUserId($this->userId); + $UserData->setUserPass($this->getParam('userPass')); + + $UserData = User::getItem($UserData)->getById($this->userId); + + $Auth = new Auth($UserData); + $resAuth = $Auth->doAuth(); + + if ($resAuth !== false) { + /** @var AuthResult $AuthResult */ + foreach ($resAuth as $AuthResult) { + $data = $AuthResult->getData(); + + if ($data->getAuthenticated() && $data->getStatusCode() === 0) { + break; + } + } + } else { + throw new SPException(SPException::SP_CRITICAL, _('Acceso no permitido')); + } + + $UserPass = UserPass::getItem($UserData); + + if (!$UserData->isUserIsDisabled() + && $UserPass->checkUserUpdateMPass() + && $UserPass->loadUserMPass() + ) { + $this->auth = true; + $this->mPass = $UserPass->getClearUserMPass(); + SessionUtil::loadUserSession($UserData); + } else { + throw new SPException(SPException::SP_CRITICAL, _('Acceso no permitido')); + } + } + + /** + * Comprobar si se ha realizado la autentificación + * + * @throws SPException + */ + protected function checkAuth() + { + if ($this->auth === false) { + throw new SPException(SPException::SP_CRITICAL, _('Acceso no permitido')); + } + } } \ No newline at end of file diff --git a/inc/SP/Api/ApiInterface.class.php b/inc/SP/Api/ApiInterface.class.php new file mode 100644 index 00000000..69248d17 --- /dev/null +++ b/inc/SP/Api/ApiInterface.class.php @@ -0,0 +1,40 @@ +. + */ + +namespace SP\Api; + +/** + * Interface ApiInterface + * + * @package SP\Api + */ +interface ApiInterface +{ + /** + * Devuelve las acciones que implementa la API + * + * @return array + */ + public function getActions(); +} \ No newline at end of file diff --git a/inc/SP/Api/ApiRequest.class.php b/inc/SP/Api/ApiRequest.class.php index 87bb7b85..1d3d1fcd 100644 --- a/inc/SP/Api/ApiRequest.class.php +++ b/inc/SP/Api/ApiRequest.class.php @@ -55,13 +55,15 @@ class ApiRequest extends Request private $params; /** @var string */ - private $verb = null; + private $verb; /** @var ReflectionClass */ private $ApiReflection; /** * ApiRequest constructor. + * + * @throws \SP\Core\Exceptions\SPException */ public function __construct() { @@ -104,11 +106,12 @@ class ApiRequest extends Request */ private function getData() { - $data = self::parse(file_get_contents('php://input'), '', true); + $request = file_get_contents('php://input'); + $data = self::parse($request, '', true); $this->params = json_decode($data); - if (json_last_error() !== JSON_ERROR_NONE || !is_object($this->params)) { + if (!is_object($this->params) || json_last_error() !== JSON_ERROR_NONE) { throw new SPException(SPException::SP_WARNING, _('Datos inválidos')); } } @@ -120,9 +123,7 @@ class ApiRequest extends Request */ private function checkBasicData() { - if (!isset($this->params->authToken) - || !isset($this->params->action) - ) { + if (!isset($this->params->authToken, $this->params->action)) { throw new SPException(SPException::SP_WARNING, _('Parámetros incorrectos')); } } @@ -134,7 +135,7 @@ class ApiRequest extends Request */ private function checkAction() { - $this->ApiReflection = new ReflectionClass('\SP\Api\SyspassApi'); + $this->ApiReflection = new ReflectionClass(SyspassApi::class); if (!$this->ApiReflection->hasMethod($this->params->action)) { throw new SPException(SPException::SP_WARNING, _('Acción inválida')); @@ -148,14 +149,10 @@ class ApiRequest extends Request */ public static function getHelp() { - return array( + return [ self::AUTH_TOKEN => _('Token de autorización'), - self::ACTION => _('Acción a realizar'), - self::USER_PASS => _('Clave de usuario (opcional)'), - self::SEARCH => _('Cadena a buscar'), - self::SEARCH_COUNT => _('Numero de cuentas a mostar en la búsqueda'), - self::ITEM => _('Item a devolver') - ); + self::ACTION => _('Acción a realizar') + ]; } /** @@ -173,6 +170,7 @@ class ApiRequest extends Request * Obtiene una nueva instancia de la Api * * @return SyspassApi + * @throws \SP\Core\Exceptions\SPException */ public function runApi() { diff --git a/inc/SP/Api/ApiTokens.class.php b/inc/SP/Api/ApiTokens.class.php index fb015945..5c8d43de 100644 --- a/inc/SP/Api/ApiTokens.class.php +++ b/inc/SP/Api/ApiTokens.class.php @@ -27,8 +27,6 @@ namespace SP\Api; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); -use SP\Core\ActionsInterface; -use SP\Core\Acl; use SP\Storage\DB; use SP\Log\Email; use SP\Html\Html; @@ -99,7 +97,7 @@ class ApiTokens $Data->addParam($this->userId, 'userid'); $Data->addParam($this->actionId, 'actionid'); $Data->addParam(Session::getUserData()->getUserId(), 'createdby'); - $Data->addParam(($this->getUserToken()) ? $this->token : $this->generateToken(), 'token'); + $Data->addParam($this->getUserToken() ? $this->token : $this->generateToken(), 'token'); try { DB::getQuery($Data); @@ -160,7 +158,7 @@ class ApiTokens $Data = new QueryData(); $Data->setQuery($query); $Data->addParam($this->userId, 'userid'); - $Data->addParam($this->generateToken(),'token'); + $Data->addParam($this->generateToken(), 'token'); try { DB::getQuery($Data); @@ -169,6 +167,16 @@ class ApiTokens } } + /** + * Generar un token de acceso + * + * @return string + */ + private function generateToken() + { + return sha1(uniqid('sysPass-API', true) . time()); + } + /** * Obtener el token de la API de un usuario * @@ -225,7 +233,7 @@ class ApiTokens $Data->addParam($this->userId, 'userid'); $Data->addParam($this->actionId, 'actionid'); $Data->addParam(Session::getUserData()->getUserId(), 'createdby'); - $Data->addParam(($this->getUserToken()) ? $this->token : $this->generateToken(), 'token'); + $Data->addParam($this->getUserToken() ? $this->token : $this->generateToken(), 'token'); try { DB::getQuery($Data); @@ -247,11 +255,11 @@ class ApiTokens */ public function deleteToken() { - $query = 'DELETE FROM authTokens WHERE authtoken_id = :id LIMIT 1'; + $query = 'DELETE FROM authTokens WHERE authtoken_id = ? LIMIT 1'; $Data = new QueryData(); $Data->setQuery($query); - $Data->addParam($this->tokenId, 'id'); + $Data->addParam($this->tokenId); try { DB::getQuery($Data); @@ -313,14 +321,4 @@ class ApiTokens { $this->actionId = $actionId; } - - /** - * Generar un token de acceso - * - * @return string - */ - private function generateToken() - { - return sha1(uniqid() . time()); - } } \ No newline at end of file diff --git a/inc/SP/Api/ApiTokensUtil.class.php b/inc/SP/Api/ApiTokensUtil.class.php index 632c0764..aff38299 100644 --- a/inc/SP/Api/ApiTokensUtil.class.php +++ b/inc/SP/Api/ApiTokensUtil.class.php @@ -60,9 +60,9 @@ class ApiTokensUtil $Data = new QueryData(); - if (!is_null($tokenId)) { - $query .= 'WHERE authtoken_id = :id LIMIT 1'; - $Data->addParam($tokenId, 'id'); + if (null !== $tokenId) { + $query .= 'WHERE authtoken_id = ? LIMIT 1'; + $Data->addParam($tokenId); } else { $query .= 'ORDER BY user_login'; } @@ -134,14 +134,16 @@ class ApiTokensUtil */ public static function getTokenActions() { - $actions = array( + $actions = [ ActionsInterface::ACTION_ACC_SEARCH => Acl::getActionName(ActionsInterface::ACTION_ACC_SEARCH), ActionsInterface::ACTION_ACC_VIEW => Acl::getActionName(ActionsInterface::ACTION_ACC_VIEW), ActionsInterface::ACTION_ACC_VIEW_PASS => Acl::getActionName(ActionsInterface::ACTION_ACC_VIEW_PASS), ActionsInterface::ACTION_ACC_DELETE => Acl::getActionName(ActionsInterface::ACTION_ACC_DELETE), + ActionsInterface::ACTION_ACC_NEW => Acl::getActionName(ActionsInterface::ACTION_ACC_NEW), ActionsInterface::ACTION_CFG_BACKUP => Acl::getActionName(ActionsInterface::ACTION_CFG_BACKUP), - ActionsInterface::ACTION_CFG_EXPORT => Acl::getActionName(ActionsInterface::ACTION_CFG_EXPORT), - ); + ActionsInterface::ACTION_MGM_CATEGORIES => Acl::getActionName(ActionsInterface::ACTION_MGM_CATEGORIES), + ActionsInterface::ACTION_MGM_CUSTOMERS => Acl::getActionName(ActionsInterface::ACTION_MGM_CUSTOMERS) + ]; return $actions; } @@ -155,11 +157,11 @@ class ApiTokensUtil */ public static function getUserIdForToken($token) { - $query = 'SELECT authtoken_userId FROM authTokens WHERE authtoken_token = :token LIMIT 1'; + $query = 'SELECT authtoken_userId FROM authTokens WHERE authtoken_token = ? LIMIT 1'; $Data = new QueryData(); $Data->setQuery($query); - $Data->addParam($token, 'token'); + $Data->addParam($token); try { $queryRes = DB::getResults($Data); diff --git a/inc/SP/Api/SyspassApi.class.php b/inc/SP/Api/SyspassApi.class.php index f30db05b..3d965bba 100644 --- a/inc/SP/Api/SyspassApi.class.php +++ b/inc/SP/Api/SyspassApi.class.php @@ -32,6 +32,14 @@ use SP\Core\Acl; use SP\Core\ActionsInterface; use SP\Core\Crypt; use SP\Core\Exceptions\SPException; +use SP\DataModel\AccountExtData; +use SP\DataModel\CategoryData; +use SP\DataModel\CustomerData; +use SP\DataModel\ItemSearchData; +use SP\Mgmt\Categories\Category; +use SP\Mgmt\Categories\CategorySearch; +use SP\Mgmt\Customers\Customer; +use SP\Mgmt\Customers\CustomerSearch; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); @@ -42,15 +50,6 @@ defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo' */ class SyspassApi extends ApiBase { - /** - * @var array - */ - protected $actionsMap = array( - 'getAccountPassword' => ActionsInterface::ACTION_ACC_VIEW_PASS, - 'getAccountSearch' => ActionsInterface::ACTION_ACC_SEARCH, - 'getAccountData' => ActionsInterface::ACTION_ACC_VIEW - ); - /** * Devolver la clave de una cuenta * @@ -61,11 +60,9 @@ class SyspassApi extends ApiBase { $this->checkActionAccess(ActionsInterface::ACTION_ACC_VIEW_PASS); - if (!isset($this->params->accountId)) { - throw new SPException(SPException::SP_WARNING, _('Parámetros incorrectos')); - } + $accountId = $this->getParam('id', true, 0); - $AccountData = new AccountData($this->params->accountId); + $AccountData = new AccountData($accountId); $Account = new Account($AccountData); $Account->getData(); @@ -75,7 +72,7 @@ class SyspassApi extends ApiBase $access = ($Acl->checkAccountAccess() && Acl::checkUserAccess(ActionsInterface::ACTION_ACC_VIEW_PASS)); - if (!$access){ + if (!$access) { throw new SPException(SPException::SP_WARNING, _('Acceso no permitido')); } @@ -104,17 +101,15 @@ class SyspassApi extends ApiBase { $this->checkActionAccess(ActionsInterface::ACTION_ACC_SEARCH); - if (!isset($this->params->searchText)) { - throw new SPException(SPException::SP_WARNING, _('Parámetros incorrectos')); - } - - $count = (isset($this->params->searchCount)) ? (int)$this->params->searchCount : 0; + $text = $this->getParam('searchText', true, ''); $Search = new AccountSearch(); - $Search->setTxtSearch($this->params->searchText); - $Search->setLimitCount($count); + $Search->setTxtSearch($text); + $Search->setLimitCount($this->getParam('searchCount', false, 0)); + $Search->setCategoryId($this->getParam('categoryId', false, 0)); + $Search->setCustomerId($this->getParam('customerId', false, 0)); - $ret = array($this->params, $Search->getAccounts()); + $ret = [$this->params, $Search->getAccounts()]; return $this->wrapJSON($ret); } @@ -129,18 +124,16 @@ class SyspassApi extends ApiBase { $this->checkActionAccess(ActionsInterface::ACTION_ACC_VIEW); - if (!isset($this->params->accountId)) { - throw new SPException(SPException::SP_WARNING, _('Parámetros incorrectos')); - } + $accountId = $this->getParam('id', true, 0); - $Account = new Account(new AccountData($this->params->accountId)); + $Account = new Account(new AccountExtData($accountId)); $Acl = new Acl(ActionsInterface::ACTION_ACC_VIEW); $Acl->setAccountData($Account->getAccountDataForACL()); $access = ($Acl->checkAccountAccess() && Acl::checkUserAccess(ActionsInterface::ACTION_ACC_VIEW)); - if (!$access){ + if (!$access) { throw new SPException(SPException::SP_WARNING, _('Acceso no permitido')); } @@ -149,4 +142,227 @@ class SyspassApi extends ApiBase return $this->wrapJSON($ret); } + + /** + * Añadir una nueva cuenta + * + * @throws \SP\Core\Exceptions\SPException + */ + public function addAccount() + { + debugLog(__FUNCTION__); + + $this->checkAuth(); + $this->checkActionAccess(ActionsInterface::ACTION_ACC_NEW); + + $AccountData = new AccountExtData(); + $AccountData->setAccountUserId($this->userId); + $AccountData->setAccountName($this->getParam('name', true)); + $AccountData->setAccountPass($this->getParam('pass', true)); + $AccountData->setAccountCustomerId($this->getParam('customerId', true)); + $AccountData->setAccountCategoryId($this->getParam('categoryId', true)); + $AccountData->setAccountLogin($this->getParam('login', true)); + $AccountData->setAccountUrl($this->getParam('url')); + $AccountData->setAccountNotes($this->getParam('notes')); + + $Account = new Account($AccountData); + + if ($Account->createAccount()) { + $ret = [ + 'accountId' => $AccountData->getAccountId(), + 'result' => _('Cuenta creada'), + 'resultCode' => 0 + ]; + + return $this->wrapJSON($ret); + } + + return false; + } + + /** + * Eliminar una cuenta + * + * @return bool + * @throws \SP\Core\Exceptions\SPException + */ + public function deleteAccount() + { + $this->checkActionAccess(ActionsInterface::ACTION_ACC_DELETE); + + $AccountData = new AccountData(); + $AccountData->setAccountId($this->getParam('id', true)); + + $Account = new Account($AccountData); + + if ($Account->deleteAccount()) { + $ret = [ + 'accountId' => $AccountData->getAccountId(), + 'result' => _('Cuenta eliminada'), + 'resultCode' => 0 + ]; + + return $this->wrapJSON($ret); + } + + return false; + } + + /** + * Devuelve el listado de categorías + * + * @return bool + * @throws \SP\Core\Exceptions\SPException + */ + public function getCategories() + { + $this->checkActionAccess(ActionsInterface::ACTION_MGM_CATEGORIES); + + $SearchData = new ItemSearchData(); + $SearchData->setSeachString($this->getParam('name', false, '')); + $SearchData->setLimitStart($this->getParam('start', false, 0)); + $SearchData->setLimitCount($this->getParam('count', false, 100)); + + $ret = CategorySearch::getItem()->getMgmtSearch($SearchData); + + return $this->wrapJSON($ret); + } + + /** + * Añade una nueva categoría + * + * @return bool + * @throws \SP\Core\Exceptions\SPException + */ + public function addCategory() + { + $this->checkActionAccess(ActionsInterface::ACTION_MGM_CATEGORIES); + + $CategoryData = new CategoryData(); + $CategoryData->setCategoryName($this->getParam('name', true)); + $CategoryData->setCategoryDescription($this->getParam('description')); + + $Category = Category::getItem($CategoryData)->add(); + + $ret = [ + 'categoryId' => $Category->getItemData()->getCategoryId(), + 'result' => _('Categoría creada'), + 'resultCode' => 0 + ]; + + return $this->wrapJSON($ret); + } + + /** + * Elimina una categoría + * + * @return bool + * @throws \SP\Core\Exceptions\SPException + */ + public function deleteCategory() + { + $this->checkActionAccess(ActionsInterface::ACTION_MGM_CATEGORIES); + + $id = $this->getParam('id', true); + Category::getItem()->delete($id); + + $ret = [ + 'categoryId' => $id, + 'result' => _('Categoría eliminada'), + 'resultCode' => 0 + ]; + + return $this->wrapJSON($ret); + } + + /** + * Devuelve el listado de clientes + * + * @return bool + * @throws \SP\Core\Exceptions\SPException + */ + public function getCustomers() + { + $this->checkActionAccess(ActionsInterface::ACTION_MGM_CUSTOMERS); + + $SearchData = new ItemSearchData(); + $SearchData->setSeachString($this->getParam('name', false, '')); + $SearchData->setLimitStart($this->getParam('start', false, 0)); + $SearchData->setLimitCount($this->getParam('count', false, 100)); + + $ret = CustomerSearch::getItem()->getMgmtSearch($SearchData); + + return $this->wrapJSON($ret); + } + + /** + * Añade un nuevo cliente + * + * @return bool + * @throws \SP\Core\Exceptions\SPException + */ + public function addCustomer() + { + $this->checkActionAccess(ActionsInterface::ACTION_MGM_CUSTOMERS); + + $CustomerData = new CustomerData(); + $CustomerData->setCustomerName($this->getParam('name', true)); + $CustomerData->setCustomerDescription($this->getParam('description')); + + $Customer = Customer::getItem($CustomerData)->add(); + + $ret = [ + 'customerId' => $Customer->getItemData()->getCustomerId(), + 'result' => _('Cliente creado'), + 'resultCode' => 0 + ]; + + return $this->wrapJSON($ret); + } + + /** + * Elimina un cñiente + * + * @return bool + * @throws \SP\Core\Exceptions\SPException + */ + public function deleteCustomer() + { + $this->checkActionAccess(ActionsInterface::ACTION_MGM_CUSTOMERS); + + $id = $this->getParam('id', true); + Customer::getItem()->delete($id); + + $ret = [ + 'customerId' => $id, + 'result' => _('Cliente eliminado'), + 'resultCode' => 0 + ]; + + return $this->wrapJSON($ret); + } + + /** + * Devuelve las acciones que implementa la API + * + * @return array + */ + public function getActions() + { + return [ + 'getAccountPassword' => ActionsInterface::ACTION_ACC_VIEW_PASS, + 'getAccountSearch' => ActionsInterface::ACTION_ACC_SEARCH, + 'getAccountData' => ActionsInterface::ACTION_ACC_VIEW, + 'deleteAccount' => ActionsInterface::ACTION_ACC_DELETE, + 'addAccount' => ActionsInterface::ACTION_ACC_NEW, + 'backup' => ActionsInterface::ACTION_CFG_BACKUP, + 'getCategories' => ActionsInterface::ACTION_MGM_CATEGORIES, + 'addCategory' => ActionsInterface::ACTION_MGM_CATEGORIES, + 'deleteCategory' => ActionsInterface::ACTION_MGM_CATEGORIES, + 'getCustomers' => ActionsInterface::ACTION_MGM_CUSTOMERS, + 'addCustomer' => ActionsInterface::ACTION_MGM_CUSTOMERS, + 'deleteCustomer' => ActionsInterface::ACTION_MGM_CUSTOMERS, + + ]; + } } \ No newline at end of file diff --git a/inc/SP/Auth/Auth.class.php b/inc/SP/Auth/Auth.class.php index f39cf07d..58abc53a 100644 --- a/inc/SP/Auth/Auth.class.php +++ b/inc/SP/Auth/Auth.class.php @@ -103,7 +103,7 @@ class Auth extends PluginAwareBase $pResult = call_user_func([$this, $pAuth]); if ($pResult !== false) { - $auths[] = ['auth' => $pAuth, 'data' => $pResult]; + $auths[] = new AuthResult($pAuth, $pResult); } } diff --git a/inc/SP/Auth/AuthResult.class.php b/inc/SP/Auth/AuthResult.class.php new file mode 100644 index 00000000..f9dcaf4b --- /dev/null +++ b/inc/SP/Auth/AuthResult.class.php @@ -0,0 +1,70 @@ +. + */ + +namespace SP\Auth; + +/** + * Class AuthData + * + * @package SP\Auth + */ +class AuthResult +{ + /** + * @var string + */ + public $auth; + /** + * @var AuthDataBase + */ + public $data; + + /** + * AuthResult constructor. + * + * @param string $auth + * @param AuthDataBase $data + */ + public function __construct($auth, AuthDataBase $data) + { + $this->auth = $auth; + $this->data = $data; + } + + /** + * @return string + */ + public function getAuth() + { + return $this->auth; + } + + /** + * @return AuthDataBase + */ + public function getData() + { + return $this->data; + } +} \ No newline at end of file diff --git a/inc/SP/Controller/ItemActionController.class.php b/inc/SP/Controller/ItemActionController.class.php index 7c24208e..78b9b279 100644 --- a/inc/SP/Controller/ItemActionController.class.php +++ b/inc/SP/Controller/ItemActionController.class.php @@ -352,7 +352,6 @@ class ItemActionController implements ItemControllerInterface break; case ActionsInterface::ACTION_MGM_CUSTOMERS_DELETE: Customer::getItem()->delete($this->itemId); - $this->deleteCustomFieldData(); $this->jsonResponse->setDescription(_('Cliente eliminado')); break; @@ -389,7 +388,6 @@ class ItemActionController implements ItemControllerInterface break; case ActionsInterface::ACTION_MGM_CATEGORIES_DELETE: Category::getItem()->delete($this->itemId); - $this->deleteCustomFieldData(); $this->jsonResponse->setDescription(_('Categoría eliminada')); break; @@ -589,7 +587,6 @@ class ItemActionController implements ItemControllerInterface break; case ActionsInterface::ACTION_ACC_DELETE: $Account->deleteAccount(); - $this->deleteCustomFieldData(); $this->jsonResponse->setDescription(_('Cuenta eliminada')); break; diff --git a/inc/SP/Controller/LoginController.class.php b/inc/SP/Controller/LoginController.class.php index 57e2ad66..ea3635e3 100644 --- a/inc/SP/Controller/LoginController.class.php +++ b/inc/SP/Controller/LoginController.class.php @@ -25,6 +25,7 @@ namespace SP\Controller; use SP\Auth\Auth; +use SP\Auth\AuthResult; use SP\Auth\AuthUtil; use SP\Auth\Browser\BrowserAuthData; use SP\Auth\Database\DatabaseAuthData; @@ -115,8 +116,10 @@ class LoginController if ($result !== false) { // Ejecutar la acción asociada al tipo de autentificación - foreach ($result as $auth) { - $this->{$auth['auth']}($auth['data']); + + /** @var AuthResult $AuthResult */ + foreach ($result as $AuthResult) { + $this->{$AuthResult->getAuth()}($AuthResult->getData()); } } else { throw new AuthException(SPException::SP_INFO, _('Login incorrecto'), '', self::STATUS_INVALID_LOGIN); @@ -218,7 +221,7 @@ class LoginController $UserPass = $this->loadMasterPass(); // Obtenemos la clave maestra del usuario - if ($UserPass->getClearUserMPass()) { + if ($UserPass->getClearUserMPass() !== '') { // Actualizar el último login del usuario UserUtil::setUserLastLogin($this->UserData->getUserId()); @@ -263,6 +266,8 @@ class LoginController throw new AuthException(SPException::SP_INFO, _('Clave maestra incorrecta'), '', self::STATUS_INVALID_MASTER_PASS); } else { + SessionUtil::saveSessionMPass($UserPass->getClearUserMPass()); + Log::writeNewLog(_('Login'), _('Clave maestra actualizada')); } } else if ($oldPass) { @@ -272,6 +277,8 @@ class LoginController throw new AuthException(SPException::SP_INFO, _('Clave maestra incorrecta'), '', self::STATUS_INVALID_MASTER_PASS); } else { + SessionUtil::saveSessionMPass($UserPass->getClearUserMPass()); + Log::writeNewLog(_('Login'), _('Clave maestra actualizada')); } } else { diff --git a/inc/SP/Core/Acl.class.php b/inc/SP/Core/Acl.class.php index 5f5c6fcd..3c85a411 100644 --- a/inc/SP/Core/Acl.class.php +++ b/inc/SP/Core/Acl.class.php @@ -214,7 +214,15 @@ class Acl implements ActionsInterface self::ACTION_ACC_REQUEST => ['acc_request', _('Peticiones')], self::ACTION_MGM => ['mgm', _('Gestión Aplicación')], self::ACTION_MGM_CATEGORIES => ['mgm_categories', _('Gestión Categorías')], + self::ACTION_MGM_CATEGORIES_SEARCH => ['mgm_categories_search', _('Buscar Categorías')], + self::ACTION_MGM_CATEGORIES_NEW => ['mgm_categories_add', _('Añadir Categoría')], + self::ACTION_MGM_CATEGORIES_EDIT => ['mgm_categories_edit', _('Editar Categoría')], + self::ACTION_MGM_CATEGORIES_DELETE => ['mgm_categories_delete', _('Eliminar Categoría')], self::ACTION_MGM_CUSTOMERS => ['mgm_customers', _('Gestión Clientes')], + self::ACTION_MGM_CUSTOMERS_SEARCH => ['mgm_customers', _('Buscar Clientes')], + self::ACTION_MGM_CUSTOMERS_NEW => ['mgm_customers_add', _('Añadir Cliente')], + self::ACTION_MGM_CUSTOMERS_EDIT => ['mgm_customers_edit', _('Editar Cliente')], + self::ACTION_MGM_CUSTOMERS_DELETE => ['mgm_customers_delete', _('Eliminar Cliente')], self::ACTION_MGM_CUSTOMFIELDS => ['mgm_customfields', _('Gestión Campos Personalizados')], self::ACTION_MGM_APITOKENS => ['mgm_apitokens', _('Gestión Autorizaciones API')], self::ACTION_MGM_FILES => ['mgm_files', _('Gestión de Archivos')], diff --git a/inc/SP/Core/Init.class.php b/inc/SP/Core/Init.class.php index 1c87b5b8..c0800b53 100644 --- a/inc/SP/Core/Init.class.php +++ b/inc/SP/Core/Init.class.php @@ -508,9 +508,6 @@ class Init { self::wrLogoutInfo(); SessionUtil::cleanSession(); - -// session_unset(); -// session_destroy(); } /** diff --git a/inc/SP/Core/Language.class.php b/inc/SP/Core/Language.class.php index 1d76058c..098dda83 100644 --- a/inc/SP/Core/Language.class.php +++ b/inc/SP/Core/Language.class.php @@ -115,7 +115,11 @@ class Language */ private function getBrowserLang() { - return str_replace('-', '_', substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 5)); + if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { + return str_replace('-', '_', substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 5)); + } else { + return ''; + } } /** diff --git a/inc/SP/Core/Session.class.php b/inc/SP/Core/Session.class.php index 7af48a4e..686c25ff 100644 --- a/inc/SP/Core/Session.class.php +++ b/inc/SP/Core/Session.class.php @@ -50,7 +50,7 @@ class Session * * @param mixed $key * @param mixed $default - * @return bool|int + * @return mixed */ public static function getSessionKey($key, $default = '') { diff --git a/inc/SP/Core/SessionUtil.class.php b/inc/SP/Core/SessionUtil.class.php index c7a8cf58..d42f18de 100644 --- a/inc/SP/Core/SessionUtil.class.php +++ b/inc/SP/Core/SessionUtil.class.php @@ -53,6 +53,8 @@ class SessionUtil /** * Establecer la clave pública RSA en la sessión + * + * @throws \SP\Core\Exceptions\SPException */ public static function loadPublicKey() { @@ -125,31 +127,35 @@ class SessionUtil */ public static function cleanSession() { - Session::unsetSessionKey('uid'); - Session::unsetSessionKey('uisadminapp'); - Session::unsetSessionKey('uisadminacc'); - Session::unsetSessionKey('uprofile'); - Session::unsetSessionKey('ulogin'); - Session::unsetSessionKey('uname'); - Session::unsetSessionKey('ugroup'); - Session::unsetSessionKey('ugroupn'); - Session::unsetSessionKey('uemail'); - Session::unsetSessionKey('uisldap'); - Session::unsetSessionKey('usrprofile'); - Session::unsetSessionKey('searchFilters'); - Session::unsetSessionKey('accParentId'); - Session::unsetSessionKey('mPass'); - Session::unsetSessionKey('mPassPwd'); - Session::unsetSessionKey('mPassIV'); - Session::unsetSessionKey('sidStartTime'); - Session::unsetSessionKey('startActivity'); - Session::unsetSessionKey('lastActivity'); - Session::unsetSessionKey('lastAccountId'); - Session::unsetSessionKey('theme'); - Session::unsetSessionKey('2fapass'); - Session::unsetSessionKey('locale'); - Session::unsetSessionKey('userpreferences'); - Session::unsetSessionKey('tempmasterpass'); - Session::unsetSessionKey('accountcolor'); + foreach ($_SESSION as $key => $value){ + unset($_SESSION[$key]); + } + +// Session::unsetSessionKey('userData'); +// Session::unsetSessionKey('usrprofile'); +// Session::unsetSessionKey('searchFilters'); +// Session::unsetSessionKey('updated'); +// Session::unsetSessionKey('sessionTimeout'); +// Session::unsetSessionKey('reload'); +// Session::unsetSessionKey('sk'); +// Session::unsetSessionKey('mPass'); +// Session::unsetSessionKey('mPassPwd'); +// Session::unsetSessionKey('mPassIV'); +// Session::unsetSessionKey('sidStartTime'); +// Session::unsetSessionKey('startActivity'); +// Session::unsetSessionKey('lastActivity'); +// Session::unsetSessionKey('lastAccountId'); +// Session::unsetSessionKey('theme'); +// Session::unsetSessionKey('2fapass'); +// Session::unsetSessionKey('pubkey'); +// Session::unsetSessionKey('locale'); +// Session::unsetSessionKey('userpreferences'); +// Session::unsetSessionKey('tempmasterpass'); +// Session::unsetSessionKey('accountcolor'); +// Session::unsetSessionKey('curlcookiesession'); +// Session::unsetSessionKey('dokuwikisession'); +// Session::unsetSessionKey('sessiontype'); +// Session::unsetSessionKey('config'); +// Session::unsetSessionKey('configTime'); } } \ No newline at end of file diff --git a/inc/SP/DataModel/CategoryData.class.php b/inc/SP/DataModel/CategoryData.class.php index 57c468a2..1dc8ded3 100644 --- a/inc/SP/DataModel/CategoryData.class.php +++ b/inc/SP/DataModel/CategoryData.class.php @@ -46,6 +46,10 @@ class CategoryData extends DataModelBase implements DataModelInterface * @var string */ public $category_description = ''; + /** + * @var string + */ + public $category_hash = ''; /** * CategoryData constructor. @@ -126,4 +130,12 @@ class CategoryData extends DataModelBase implements DataModelInterface { return $this->category_name; } + + /** + * @return string + */ + public function getCategoryHash() + { + return $this->category_hash; + } } \ No newline at end of file diff --git a/inc/SP/DataModel/UserPassData.class.php b/inc/SP/DataModel/UserPassData.class.php index ed122e8c..d74465c2 100644 --- a/inc/SP/DataModel/UserPassData.class.php +++ b/inc/SP/DataModel/UserPassData.class.php @@ -30,7 +30,7 @@ namespace SP\DataModel; * * @package SP\DataModel */ -class UserPassData +class UserPassData extends DataModelBase { /** * @var int diff --git a/inc/SP/Mgmt/Categories/Category.class.php b/inc/SP/Mgmt/Categories/Category.class.php index e3341706..ecd444df 100644 --- a/inc/SP/Mgmt/Categories/Category.class.php +++ b/inc/SP/Mgmt/Categories/Category.class.php @@ -28,9 +28,12 @@ namespace SP\Mgmt\Categories; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); +use SP\Core\ActionsInterface; use SP\Core\Exceptions\SPException; use SP\DataModel\CategoryData; +use SP\DataModel\CustomFieldData; use SP\Log\Email; +use SP\Mgmt\CustomFields\CustomField; use SP\Mgmt\ItemInterface; use SP\Mgmt\ItemSelectInterface; use SP\Mgmt\ItemTrait; @@ -58,12 +61,13 @@ class Category extends CategoryBase implements ItemInterface, ItemSelectInterfac } $query = /** @lang SQL */ - 'INSERT INTO categories SET category_name = ? ,category_description = ?'; + 'INSERT INTO categories SET category_name = ?, category_description = ?, category_hash = ?'; $Data = new QueryData(); $Data->setQuery($query); $Data->addParam($this->itemData->getCategoryName()); $Data->addParam($this->itemData->getCategoryDescription()); + $Data->addParam($this->makeItemHash($this->itemData->getCategoryName())); if (DB::getQuery($Data) === false) { throw new SPException(SPException::SP_CRITICAL, _('Error al crear la categoría')); @@ -81,15 +85,19 @@ class Category extends CategoryBase implements ItemInterface, ItemSelectInterfac } /** + * Comprobar duplicados + * * @return bool + * @throws \SP\Core\Exceptions\SPException */ public function checkDuplicatedOnAdd() { $query = /** @lang SQL */ - 'SELECT category_id FROM categories WHERE category_name = ?'; + 'SELECT category_id FROM categories WHERE category_hash = ? OR category_name = ?'; $Data = new QueryData(); $Data->setQuery($query); + $Data->addParam($this->makeItemHash($this->itemData->getCategoryName())); $Data->addParam($this->itemData->getCategoryName()); return (DB::getQuery($Data) === false || $Data->getQueryNumRows() >= 1); @@ -103,7 +111,7 @@ class Category extends CategoryBase implements ItemInterface, ItemSelectInterfac public function delete($id) { if (is_array($id)) { - foreach ($id as $itemId){ + foreach ($id as $itemId) { $this->delete($itemId); } @@ -129,9 +137,21 @@ class Category extends CategoryBase implements ItemInterface, ItemSelectInterfac $Log = new Log(_('Eliminar Categoría')); $Log->addDetails(Html::strongText(_('Categoría')), sprintf('%s (%d)', $oldCategory->getCategoryName(), $id)); + + try { + $CustomFieldData = new CustomFieldData(); + $CustomFieldData->setModule(ActionsInterface::ACTION_MGM_CATEGORIES); + CustomField::getItem($CustomFieldData)->delete($id); + } catch (SPException $e) { + $Log->setLogLevel(Log::ERROR); + $Log->addDescription($e->getMessage()); + } + $Log->writeLog(); Email::sendEmail($Log); + + return $this; } /** @@ -184,13 +204,15 @@ class Category extends CategoryBase implements ItemInterface, ItemSelectInterfac $query = /** @lang SQL */ 'UPDATE categories SET category_name = ?, - category_description = ? + category_description = ?, + category_hash = ? WHERE category_id = ? LIMIT 1'; $Data = new QueryData(); $Data->setQuery($query); $Data->addParam($this->itemData->getCategoryName()); $Data->addParam($this->itemData->getCategoryDescription()); + $Data->addParam($this->makeItemHash($this->itemData->getCategoryName())); $Data->addParam($this->itemData->getCategoryId()); if (DB::getQuery($Data) === false) { @@ -213,10 +235,11 @@ class Category extends CategoryBase implements ItemInterface, ItemSelectInterfac public function checkDuplicatedOnUpdate() { $query = /** @lang SQL */ - 'SELECT category_id FROM categories WHERE category_name = ? AND category_id <> ?'; + 'SELECT category_id FROM categories WHERE (category_hash = ? OR category_name = ?) AND category_id <> ?'; $Data = new QueryData(); $Data->setQuery($query); + $Data->addParam($this->makeItemHash($this->itemData->getCategoryName())); $Data->addParam($this->itemData->getCategoryName()); $Data->addParam($this->itemData->getCategoryId()); diff --git a/inc/SP/Mgmt/Customers/Customer.class.php b/inc/SP/Mgmt/Customers/Customer.class.php index 9b47cc4e..6029dfc8 100644 --- a/inc/SP/Mgmt/Customers/Customer.class.php +++ b/inc/SP/Mgmt/Customers/Customer.class.php @@ -28,8 +28,11 @@ namespace SP\Mgmt\Customers; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); +use SP\Core\ActionsInterface; use SP\DataModel\CustomerData; +use SP\DataModel\CustomFieldData; use SP\Log\Email; +use SP\Mgmt\CustomFields\CustomField; use SP\Mgmt\ItemInterface; use SP\Mgmt\ItemSelectInterface; use SP\Mgmt\ItemTrait; @@ -67,7 +70,7 @@ class Customer extends CustomerBase implements ItemInterface, ItemSelectInterfac $Data->setQuery($query); $Data->addParam($this->itemData->getCustomerName()); $Data->addParam($this->itemData->getCustomerDescription()); - $Data->addParam($this->itemData->getCustomerHash()); + $Data->addParam($this->makeItemHash($this->itemData->getCustomerName())); if (DB::getQuery($Data) === false) { throw new SPException(SPException::SP_CRITICAL, _('Error al crear el cliente')); @@ -95,28 +98,11 @@ class Customer extends CustomerBase implements ItemInterface, ItemSelectInterfac $Data = new QueryData(); $Data->setQuery($query); - $Data->addParam($this->mkCustomerHash()); + $Data->addParam($this->makeItemHash($this->itemData->getCustomerName())); return (DB::getQuery($Data) === false || $Data->getQueryNumRows() >= 1); } - /** - * Crear un hash con el nombre del cliente. - * Esta función crear un hash para detectar clientes duplicados mediante - * la eliminación de carácteres especiales y capitalización - * - * @return string con el hash generado - */ - private function mkCustomerHash() - { - $charsSrc = [ - '.', ' ', '_', ', ', '-', ';', - '\'', '"', ':', '(', ')', '|', '/']; - $newValue = strtolower(str_replace($charsSrc, '', DBUtil::escape($this->itemData->getCustomerName()))); - - return md5($newValue); - } - /** * @param $id int|array * @return mixed @@ -125,7 +111,7 @@ class Customer extends CustomerBase implements ItemInterface, ItemSelectInterfac public function delete($id) { if (is_array($id)) { - foreach ($id as $itemId){ + foreach ($id as $itemId) { $this->delete($itemId); } @@ -151,6 +137,17 @@ class Customer extends CustomerBase implements ItemInterface, ItemSelectInterfac $Log = new Log(_('Eliminar Cliente')); $Log->addDetails(Html::strongText(_('Cliente')), sprintf('%s (%d)', $oldCustomer->getCustomerName(), $id)); + + + try { + $CustomFieldData = new CustomFieldData(); + $CustomFieldData->setModule(ActionsInterface::ACTION_MGM_CUSTOMERS); + CustomField::getItem($CustomFieldData)->delete($id); + } catch (SPException $e) { + $Log->setLogLevel(Log::ERROR); + $Log->addDescription($e->getMessage()); + } + $Log->writeLog(); Email::sendEmail($Log); @@ -216,7 +213,7 @@ class Customer extends CustomerBase implements ItemInterface, ItemSelectInterfac $Data->setQuery($query); $Data->addParam($this->itemData->getCustomerName()); $Data->addParam($this->itemData->getCustomerDescription()); - $Data->addParam($this->mkCustomerHash()); + $Data->addParam($this->makeItemHash($this->itemData->getCustomerName())); $Data->addParam($this->itemData->getCustomerId()); if (DB::getQuery($Data) === false) { @@ -243,7 +240,7 @@ class Customer extends CustomerBase implements ItemInterface, ItemSelectInterfac $Data = new QueryData(); $Data->setQuery($query); - $Data->addParam($this->mkCustomerHash()); + $Data->addParam($this->makeItemHash($this->itemData->getCustomerName())); $Data->addParam($this->itemData->getCustomerId()); return (DB::getQuery($Data) === false || $Data->getQueryNumRows() >= 1); diff --git a/inc/SP/Mgmt/ItemTrait.class.php b/inc/SP/Mgmt/ItemTrait.class.php index d9348aed..a4176960 100644 --- a/inc/SP/Mgmt/ItemTrait.class.php +++ b/inc/SP/Mgmt/ItemTrait.class.php @@ -24,6 +24,7 @@ namespace SP\Mgmt; use SP\DataModel\DataModelInterface; +use SP\Storage\DBUtil; /** @@ -54,4 +55,21 @@ trait ItemTrait return $items; } + + /** + * Crear un hash con el nombre del elemento. + * + * Esta función crear un hash para detectar nombres de elementos duplicados mediante + * la eliminación de carácteres especiales y capitalización + * + * @param $name + * @return string con el hash generado + */ + protected function makeItemHash($name) + { + $charsSrc = ['.', ' ', '_', ', ', '-', ';', '\'', '"', ':', '(', ')', '|', '/']; + $newValue = strtolower(str_replace($charsSrc, '', DBUtil::escape($name))); + + return md5($newValue); + } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Users/User.class.php b/inc/SP/Mgmt/Users/User.class.php index fb3c5f4d..bea14b1f 100644 --- a/inc/SP/Mgmt/Users/User.class.php +++ b/inc/SP/Mgmt/Users/User.class.php @@ -187,7 +187,12 @@ class User extends UserBase implements ItemInterface, ItemSelectInterface WHERE user_id = ? LIMIT 1'; $Data = new QueryData(); - $Data->setMapClassName($this->getDataModel()); + + if (is_object($this->itemData)) { + $Data->setMapClass($this->itemData); + } else { + $Data->setMapClassName($this->getDataModel()); + } $Data->setQuery($query); $Data->addParam($id); diff --git a/inc/sql/1.3.16100601.sql b/inc/sql/1.3.16100601.sql index 1ef8488f..05fecb26 100644 --- a/inc/sql/1.3.16100601.sql +++ b/inc/sql/1.3.16100601.sql @@ -343,3 +343,5 @@ REFERENCES `usrGroups` (`usergroup_id`) ON UPDATE NO ACTION; ALTER TABLE `accounts` ADD INDEX `IDX_parentId` USING BTREE (`account_parentId` ASC); +ALTER TABLE `categories` +ADD COLUMN `category_hash` VARBINARY(40) NOT NULL DEFAULT 0 AFTER `category_description`; diff --git a/inc/themes/material-blue/css/styles-wiki.css b/inc/themes/material-blue/css/styles-wiki.css index 1f0db694..c537d627 100644 --- a/inc/themes/material-blue/css/styles-wiki.css +++ b/inc/themes/material-blue/css/styles-wiki.css @@ -1,27 +1,27 @@ -#fancyContainer #wikiPage { +#box-popup #wikiPage { text-align: left; min-width: 300px; } -#fancyContainer #wikiPage li, -#fancyContainer #wikiPage ol { +#box-popup #wikiPage li, +#box-popup #wikiPage ol { padding: 0; margin: 0 0 0 1.5em; } -#fancyContainer #wikiPage ul li { +#box-popup #wikiPage ul li { color: #999; } -#fancyContainer #wikiPage ol li { +#box-popup #wikiPage ol li { color: #666; } -#fancyContainer #wikiPage li .li { +#box-popup #wikiPage li .li { color: #333; } -#fancyContainer #wikiPage pre { +#box-popup #wikiPage pre { overflow: auto; word-wrap: normal; border: 1px solid #ccc; @@ -30,42 +30,42 @@ padding: .7em 1em; } -#fancyContainer #wikiPage h1 { +#box-popup #wikiPage h1 { font-size: 2em; margin: 0 0 .444em; } -#fancyContainer #wikiPage h2 { +#box-popup #wikiPage h2 { font-size: 1.5em; margin: 0 0 .666em; } -#fancyContainer #wikiPage h3 { +#box-popup #wikiPage h3 { font-size: 1.125em; margin: 0 0 .888em; } -#fancyContainer #wikiPage h4 { +#box-popup #wikiPage h4 { font-size: 1em; margin: 0 0 1em; } -#fancyContainer #wikiPage h5 { +#box-popup #wikiPage h5 { font-size: .875em; margin: 0 0 1.1428em; } -#fancyContainer #wikiPage h6 { +#box-popup #wikiPage h6 { font-size: .75em; margin: 0 0 1.333em; } -#fancyContainer #wikiPage h1, -#fancyContainer #wikiPage h2, -#fancyContainer #wikiPage h3, -#fancyContainer #wikiPage h4, -#fancyContainer #wikiPage h5, -#fancyContainer #wikiPage h6 { +#box-popup #wikiPage h1, +#box-popup #wikiPage h2, +#box-popup #wikiPage h3, +#box-popup #wikiPage h4, +#box-popup #wikiPage h5, +#box-popup #wikiPage h6 { font-weight: bold; padding: 0; line-height: 1.2; @@ -74,17 +74,17 @@ border-bottom: 1px solid #777777; } -#fancyContainer #wikiPageInfo { +#box-popup #wikiPageInfo { margin: 1em 0; border-top: 1px solid #607d8b; color: #607d8b; } -#fancyContainer #wikiPageInfo ul { +#box-popup #wikiPageInfo ul { list-style: none; } -#fancyContainer #wikiPageInfo li { +#box-popup #wikiPageInfo li { float: left; padding: .5em; } \ No newline at end of file diff --git a/inc/themes/material-blue/css/styles-wiki.min.css b/inc/themes/material-blue/css/styles-wiki.min.css index 6b2d8914..73a306d2 100644 --- a/inc/themes/material-blue/css/styles-wiki.min.css +++ b/inc/themes/material-blue/css/styles-wiki.min.css @@ -1 +1 @@ -#fancyContainer #wikiPage{text-align:left;min-width:300px}#fancyContainer #wikiPage li,#fancyContainer #wikiPage ol{padding:0;margin:0 0 0 1.5em}#fancyContainer #wikiPage ul li{color:#999}#fancyContainer #wikiPage ol li{color:#666}#fancyContainer #wikiPage li .li{color:#333}#fancyContainer #wikiPage pre{overflow:auto;word-wrap:normal;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 0 .5em #ccc;padding:.7em 1em}#fancyContainer #wikiPage h1{font-size:2em;margin:0 0 .444em}#fancyContainer #wikiPage h2{font-size:1.5em;margin:0 0 .666em}#fancyContainer #wikiPage h3{font-size:1.125em;margin:0 0 .888em}#fancyContainer #wikiPage h4{font-size:1em;margin:0 0 1em}#fancyContainer #wikiPage h5{font-size:.875em;margin:0 0 1.1428em}#fancyContainer #wikiPage h6{font-size:.75em;margin:0 0 1.333em}#fancyContainer #wikiPage h1,#fancyContainer #wikiPage h2,#fancyContainer #wikiPage h3,#fancyContainer #wikiPage h4,#fancyContainer #wikiPage h5,#fancyContainer #wikiPage h6{font-weight:bold;padding:0;line-height:1.2;clear:left;color:#777;border-bottom:1px solid #777}#fancyContainer #wikiPageInfo{margin:1em 0;border-top:1px solid #607d8b;color:#607d8b}#fancyContainer #wikiPageInfo ul{list-style:none}#fancyContainer #wikiPageInfo li{float:left;padding:.5em} \ No newline at end of file +#box-popup #wikiPage{text-align:left;min-width:300px}#box-popup #wikiPage li,#box-popup #wikiPage ol{padding:0;margin:0 0 0 1.5em}#box-popup #wikiPage ul li{color:#999}#box-popup #wikiPage ol li{color:#666}#box-popup #wikiPage li .li{color:#333}#box-popup #wikiPage pre{overflow:auto;word-wrap:normal;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 0 .5em #ccc;padding:.7em 1em}#box-popup #wikiPage h1{font-size:2em;margin:0 0 .444em}#box-popup #wikiPage h2{font-size:1.5em;margin:0 0 .666em}#box-popup #wikiPage h3{font-size:1.125em;margin:0 0 .888em}#box-popup #wikiPage h4{font-size:1em;margin:0 0 1em}#box-popup #wikiPage h5{font-size:.875em;margin:0 0 1.1428em}#box-popup #wikiPage h6{font-size:.75em;margin:0 0 1.333em}#box-popup #wikiPage h1,#box-popup #wikiPage h2,#box-popup #wikiPage h3,#box-popup #wikiPage h4,#box-popup #wikiPage h5,#box-popup #wikiPage h6{font-weight:bold;padding:0;line-height:1.2;clear:left;color:#777;border-bottom:1px solid #777}#box-popup #wikiPageInfo{margin:1em 0;border-top:1px solid #607d8b;color:#607d8b}#box-popup #wikiPageInfo ul{list-style:none}#box-popup #wikiPageInfo li{float:left;padding:.5em} \ No newline at end of file diff --git a/inc/themes/material-blue/css/styles.css b/inc/themes/material-blue/css/styles.css index 7e7cae42..47e0ea17 100644 --- a/inc/themes/material-blue/css/styles.css +++ b/inc/themes/material-blue/css/styles.css @@ -264,7 +264,7 @@ pre, code, samp, kbd { } #content td.descField, -#fancyContainer td.descField { +#box-popup td.descField { text-align: right; padding-right: 20px; width: 25%; @@ -274,7 +274,7 @@ pre, code, samp, kbd { } #content td.valField, -#fancyContainer td.valField { +#box-popup td.valField { padding-left: 1em; width: 100%; } @@ -397,7 +397,7 @@ pre, code, samp, kbd { } #content .data .list-wrap, -#fancyContainer .list-wrap{ +#box-popup .list-wrap { max-height: 10em; overflow: auto; padding: .5em; @@ -405,14 +405,14 @@ pre, code, samp, kbd { } #content .data .list-wrap ul, -#fancyContainer .list-wrap ul{ +#box-popup .list-wrap ul { list-style-type: none; margin: 0; padding: 0 } #content .data .list-wrap li, -#fancyContainer .list-wrap li { +#box-popup .list-wrap li { display: flex; background: #f2f2f2; padding: .5em; @@ -421,23 +421,23 @@ pre, code, samp, kbd { } #content .data .list-wrap li:hover, -#fancyContainer .list-wrap li:hover{ +#box-popup .list-wrap li:hover { background: #e8eaf6; color: #000; } #content .data .list-wrap div.files-item-info, -#fancyContainer .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, -#fancyContainer .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, -#fancyContainer .list-wrap div.files-item-actions{ +#box-popup .list-wrap div.files-item-actions { padding: .3em 0; } @@ -921,7 +921,7 @@ pre, code, samp, kbd { color: #555 } -#fancyContainer { +#box-popup { min-width: 25em; max-width: 50em; margin: 5em auto; @@ -929,7 +929,12 @@ pre, code, samp, kbd { background-color: #fff; } -#fancyContainer > h2 { +#box-popup.box-password-view { + min-width: 20em; + max-width: 25em; +} + +#box-popup > h2 { width: 100%; font-size: 18px; color: white; @@ -939,50 +944,50 @@ pre, code, samp, kbd { line-height: 1em; } -#fancyContainer > table { +#box-popup > table { width: 100%; padding-bottom: 1em; } -#fancyContainer select { +#box-popup select { width: 220px } -#fancyContainer #resFancyAccion { +#box-popup #resFancyAccion { display: none } -#fancyContainer #resCheck { +#box-popup #resCheck { display: inline-block; width: 80%; height: 4em; padding: 1em 0 } -#fancyContainer.image { +#box-popup.image { background-color: transparent; max-width: 100%; margin: 0 auto; border-radius: 0; } -#fancyContainer.image img { +#box-popup.image img { width: auto; margin: 0 auto; } -#fancyContainer.image > div.title { +#box-popup.image > div.title { background-color: #607d8b; color: #fff; padding: .5em; } -#fancyContainer.help { +#box-popup.help { min-height: 100px; background-color: #f5f5f5 } -#fancyContainer.help p { +#box-popup.help p { font-size: 14px; text-align: justify; line-height: 2em diff --git a/inc/themes/material-blue/css/styles.min.css b/inc/themes/material-blue/css/styles.min.css index 46c74997..b9dab555 100644 --- a/inc/themes/material-blue/css/styles.min.css +++ b/inc/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}*,*: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.odd{background-color:#f9f9f9}table tr.even>td,table tr.odd>td{border-bottom:1px solid #d9d9d9 !important}table tr.even:hover{background-color:#e8ff99}table tr.odd:hover{background-color:#e8ff99}table tr{height:20px}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;resize:none}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}.altTable{border:0;font-size:10px}.altTable .section{font-size:14px;font-weight:bold}a,a:visited{text-decoration:none;color:rgba(83,109,254,1)}a:hover,a:active,a:focus{text-decoration:none;cursor:pointer}#nojs{width:80%;text-align:center;vertical-align:middle;margin:10px auto;padding:3px;background-color:red;color:white;font-weight:bold;font-size:14px}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}#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,.8);border-radius:5px;display:none}#container{margin:auto;width:100%}#container.login{margin-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{min-height:0;margin:0}#content td.descField,#fancyContainer td.descField{text-align:right;padding-right:20px;width:25%;font-weight:bold;border-right:1px solid #d9d9d9;color:#555}#content td.valField,#fancyContainer td.valField{padding-left:1em;width:100%}#content #resBuscar{margin-bottom:50px}#content #resBuscar img{vertical-align:middle}#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.titleBlue{background-color:#536dfe;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#536dfe),color-stop(90%,#536dfe));background-image:-webkit-linear-gradient(#536dfe 20%,#536dfe 90%);background-image:-moz-linear-gradient(#536dfe 20%,#536dfe 90%);background-image:-o-linear-gradient(#536dfe 20%,#536dfe 90%);background-image:linear-gradient(#536dfe 20%,#536dfe 90%);background:#536dfe url("../inc/themes/material-blue/css/images/ui-bg_highlight-hard_100_536DFE_1x100.png") repeat-x scroll 50% 50%}#content #title.titleNormal{background-color:#607d8b;color:#fff}#content .data-container{width:75%;margin:0 auto}#content .data{width:100%;padding:10px;border:1px solid #c9c9c9;margin:0 auto;background-color:#f9f9f9}#content fieldset.data{margin:2em auto}#content fieldset.data>legend{color:#607d8b;padding:0 .5em;font-size:1.5em}#content fieldset.data>table{display:none;width:100%}#content .data #history-icon{position:relative;top:5em;right:2em}#content .data td{text-align:left}#content .data td.descField{text-align:right;font-size:12px;font-weight:bold;color:#999}#content .data select{min-width:210px}#content .data .list-wrap,#fancyContainer .list-wrap{max-height:10em;overflow:auto;padding:.5em;margin:1em 0}#content .data .list-wrap ul,#fancyContainer .list-wrap ul{list-style-type:none;margin:0;padding:0}#content .data .list-wrap li,#fancyContainer .list-wrap li{display:flex;background:#f2f2f2;padding:.5em;font-size:1em;margin-bottom:.5em}#content .data .list-wrap li:hover,#fancyContainer .list-wrap li:hover{background:#e8eaf6;color:#000}#content .data .list-wrap div.files-item-info,#fancyContainer .list-wrap div.files-item-info{flex-grow:2}#content .data .list-wrap div.files-item-info img,#fancyContainer .list-wrap div.files-item-info img{margin:0 .5em}#content .data .list-wrap div.files-item-actions,#fancyContainer .list-wrap div.files-item-actions{padding:.3em 0}#content .data .dropzone{width:30em;padding:1em;border:2px dashed #009688;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 rgba(0,0,0,0);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}#content .extra-info{margin-top:20px}#content .tblIcon{background:url("../imgs/clock.png") no-repeat transparent}#content #tabs .ui-tabs-nav{position:relative;left:12em;width:90%}#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:#fff2d9;color:orange;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:#045fb4}#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-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,#content #data-search .account-info img,#content #data-search .account-actions img{width:24px;height:24px;margin:0 .5em}#content .rowSpace>.cellBorder{height:10px;border-top:1px solid #d9d9d9}#content .rowSpace>.cellBlank{height:10px}#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;background-color:rgba(252,252,252,.75);vertical-align:middle}#content #searchbox{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 1em}#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 #tabs.ui-widget-content{border:0;background-color:transparent}#content #tabs .ui-widget-header{background:0;border:0;border-bottom:1px solid #c9c9c9}#content #tabs.ui-widget-content{background:none !important}#content #tabs .tabs-spacer{float:left;height:200px}#content .tabs-bottom .ui-tabs-nav{clear:left;padding:0 .2em .2em .2em}#content .tabs-bottom .ui-tabs-nav li{top:auto;bottom:0;margin:0 .2em 1px 0;border-top:0}#content .tabs-bottom .ui-tabs-nav li.ui-tabs-active{margin-top:-1px;padding-top:1px}#datos{float:left;width:400px;text-align:left;margin-top:10px;color:#b9b9b9}#datos a{color:orange;font-weight:bold;border:0;padding:3px;margin:5px 0 5px 0;display:block;width:40px;text-align:center;background-color:transparent}#datos img{border:0}#resAccion,#resFancyAccion{height:20px;padding:5px;margin:5px;font-weight:bold;font-size:14px}#resAccion span{padding:5px;border:#a9a9a9 1px solid}#fancyView{min-width:250px;text-align:center;padding:15px;line-height:20px;border:#d9d9d9 1px solid;font-size:14px}#fancyView ul{list-style:none}#fancyView.msgError{margin:5px;background-color:#fee8e6;color:#c00;font-weight:bold;border:#fed2ce 1px solid}#fancyView.msgOk{margin:5px;background-color:#ecfde4;color:green;font-weight:bold;border:#dbfdcb 1px solid}#fancyView.msgWarn{margin:5px;background-color:#fff2d9;color:orange;font-weight:bold;border:#ffe5b3 1px solid}#fancyView.msgInfo{margin:5px;background-color:#e9e9e9;color:orange;font-weight:bold;border:#ffe5b3 1px solid}#fancyView.backGrey{background-color:#f2f2f2 !important}#fancyView PRE{text-align:left}#fancyView table{border:0;width:100%;font-size:14px;text-align:left}#fancyView td{border-bottom:#d9d9d9 1px solid}#fancyView a,#fancyMsg a{color:#555}#fancyContainer{min-width:25em;max-width:50em;margin:5em auto;padding:0;background-color:#fff}#fancyContainer>h2{width:100%;font-size:18px;color:white;background-color:#607d8b;margin:0 0 1em 0;padding:.5em 0;line-height:1em}#fancyContainer>table{width:100%;padding-bottom:1em}#fancyContainer select{width:220px}#fancyContainer #resFancyAccion{display:none}#fancyContainer #resCheck{display:inline-block;width:80%;height:4em;padding:1em 0}#fancyContainer.image{background-color:transparent;max-width:100%;margin:0 auto;border-radius:0}#fancyContainer.image img{width:auto;margin:0 auto}#fancyContainer.image>div.title{background-color:#607d8b;color:#fff;padding:.5em}#fancyContainer.help{min-height:100px;background-color:#f5f5f5}#fancyContainer.help p{font-size:14px;text-align:justify;line-height:2em}#debug{float:left;text-align:left}#debuginfo{width:100%;min-height:10em;padding:1em;background-color:lightgoldenrodyellow;text-align:left;line-height:1.5em}#debuginfo H3{text-align:center}.fancyNone{background-color:transparent !important}.fancydata{min-width:400px;border:0;text-align:left;margin:0 .5em}.fancydata .descField{min-width:100px;font-weight:bold}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;box-shadow:0 -8px 6px -6px #c9c9c9;-webkit-box-shadow:0 -8px 6px -6px #c9c9c9;-moz-box-shadow:0 -8px 6px -6px #c9c9c9}footer,footer .footer-parts{display:flex;justify-content:space-between}footer #footer-left,footer #footer-right{width:50%;margin:0 1em}footer #footer-right{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,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{border-radius:5px !important;-moz-border-radius:5px !important;-webkit-border-radius:5px !important}.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}#content .error{width:350px;margin:15px;padding:15px;background-color:#f9f9f9;color:orange;border:orange 1px solid;margin:0 auto;text-align:center;font-size:16px;line-height:1.5em}.hide{display:none !important}.btn-checks{padding:5px;margin:.2em 0;width:30em;border-bottom:1px solid #c9c9c9}.shadow{box-shadow:1px 1px 2px #d9d9d9}.noRes{width:60%;margin:15px;padding:15px;background-color:#f9f9f9;color:#a9a9a9;border:#c9c9c9 1px solid;margin:20px auto;text-align:center;font-size:16px}.header-blue{background:#536dfe url("../inc/themes/material-blue/css/images/ui-bg_highlight-hard_100_536DFE_1x100.png") repeat-x scroll 50% 50%}.header-grey{background-color:#607d8b;color:#fff;min-height:2em}.no-background{background:none !important}.action-in-box{display:inline-block;height:4em;margin:.7em 0;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{margin-left:.5em}.fullWidth{max-width:100% !important}.filterOn{padding:.3em 1em;background-color:#ecfde4;color:green !important;border:#dbfdcb 1px solid !important}.globalOn{padding:.3em 1em;background-color:#fff2d9;color:orange !important;border:#ffe5b3 1px solid !important}.opacity50{filter:alpha(opacity=50);-moz-opacity:.5;-khtml-opacity:.5;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}.ui-tooltip{background:#ffffa3;color:#555;padding:10px;border-radius:10px;box-shadow:0 0 7px #a9a9a9}.ui-autocomplete,.ui-menu-item{z-index:8050}.fancybox-inner{overflow:visible !important}.passLevel{width:20px;height:20px;display:inline-block;position:relative;top:2px}.passLevel.strongest,.passLevel.strongest:hover{background-color:#ecfde4 !important;color:green;font-weight:bold;border:lightgreen 1px solid}.passLevel.strong,.passLevel.strong:hover{background-color:#e6f2ff !important;color:#64b4f4;font-weight:bold;border:#64b4f4 1px solid}.passLevel.good,.passLevel.good:hover{background-color:#fff2d9 !important;color:orange;font-weight:bold;border:#ffe5b3 1px solid}.passLevel.weak,.passLevel.weak:hover{background-color:#fee8e6 !important;color:#c00;font-weight:bold;border:#fed2ce 1px solid}#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-user-text{padding:.5em;border-bottom:#d9d9d9 1px solid;text-align:center;min-width:200px;color:#d9d9d9}.dialog-pass-text{padding:.5em;border:transparent 1px solid;text-align:center;min-width:200px}.dialog-buttons{text-align:center;padding:.5em;border-top:1px solid #c9c9c9;line-height:2.5em}.dialog-clip-copy{background-color:#ecfde4;color:green}.help-box{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}#login-container{width:40em;margin:0 auto;background:transparent url("../imgs/logo_full_bg.png") no-repeat top left;background-size:auto 10em}#login-container #boxLogin{position:relative;margin:11em auto 0 auto;width:100%;min-height:12em;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 #boxButton{position:absolute;top:2em;right:2em}#login-container #boxLogin #boxActions{position:absolute;bottom:1em;right:1em;width:100%;padding:.5em;text-align:right}#login-container #boxLogin #boxActions a{color:#c9c9c9}#login-container #boxLogout{width:250px;margin:8em auto 0 auto;font-size:14px;text-align:center;color:orange;background:#fff2d9;border:#ffe5b3 1px solid;padding:.5em}#login-container #boxUpdated{width:350px;margin:5em auto 5em auto;font-size:14px;text-align:center;color:green;background:#ecfde4;border:#dbfdcb 1px solid;padding:.5em}fieldset.warning{padding:8px;color:#b94a48;background-color:#f2dede;border:1px solid #eed3d7;border-radius:5px}fieldset.warning legend{color:#b94a48 !important}fieldset.warning a{color:#b94a48 !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("../imgs/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:40%;margin:0 auto;list-style:none;font-size:14px;text-align:left}#actions ul.errors>li{margin:1.5em auto;border-radius:5px;padding:.5em}#actions ul.errors>li.error-critical{color:#ef5350;background-color:#ffcdd2;border:1px solid #ef5350}#actions ul.errors>li.error-warning{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#actions ul.errors>li.error-ok{color:#26a69a;background-color:#b2dfdb;border:1px solid #26a69a}#actions ul.errors>li>p.hint{color:#aaa;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}#whatsNewIcon{text-align:center}#whatsNewIcon img{width:64px;height:64px}#whatsNewIcon h2{display:inline-block;color:#555;font-size:16px}#whatsNew{margin:0 auto;width:500px;background-color:#fffde1;padding:2em;line-height:1.5em;font-size:16px;color:#555;border:1px solid #d9d9d9;margin-bottom:3em;display:none}#whatsNew ul{padding:0;border:0}#whatsNew li{padding-left:37px;background:url("../imgs/arrow-list.png") left center no-repeat;line-height:32px;list-style:none}.no-title .ui-dialog-titlebar{display:none}.ui-dialog{z-index:9999 !important}.help-box{display:none}.center{text-align:center !important}.right{text-align:right !important}.left{text-align:left !important}@media screen and (max-width:1000px){#content #searchbox{position:relative;left:0;width:100%}#content #searchbox form{flex-wrap:wrap}#content #searchbox form>div{width:100%}#content #searchbox input[type=text]{width:100%}footer{display:none}footer,footer .footer-parts{justify-content:space-between;flex-wrap:wrap}footer #footer-left,footer #footer-right,footer .footer-parts>div{width:100%}footer .footer-parts>div{padding:.5em 0}} \ 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}*,*: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.odd{background-color:#f9f9f9}table tr.even>td,table tr.odd>td{border-bottom:1px solid #d9d9d9 !important}table tr.even:hover{background-color:#e8ff99}table tr.odd:hover{background-color:#e8ff99}table tr{height:20px}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;resize:none}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}.altTable{border:0;font-size:10px}.altTable .section{font-size:14px;font-weight:bold}a,a:visited{text-decoration:none;color:rgba(83,109,254,1)}a:hover,a:active,a:focus{text-decoration:none;cursor:pointer}#nojs{width:80%;text-align:center;vertical-align:middle;margin:10px auto;padding:3px;background-color:red;color:white;font-weight:bold;font-size:14px}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}#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,.8);border-radius:5px;display:none}#container{margin:auto;width:100%}#container.login{margin-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{min-height:0;margin:0}#content td.descField,#box-popup td.descField{text-align:right;padding-right:20px;width:25%;font-weight:bold;border-right:1px solid #d9d9d9;color:#555}#content td.valField,#box-popup td.valField{padding-left:1em;width:100%}#content #resBuscar{margin-bottom:50px}#content #resBuscar img{vertical-align:middle}#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.titleBlue{background-color:#536dfe;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#536dfe),color-stop(90%,#536dfe));background-image:-webkit-linear-gradient(#536dfe 20%,#536dfe 90%);background-image:-moz-linear-gradient(#536dfe 20%,#536dfe 90%);background-image:-o-linear-gradient(#536dfe 20%,#536dfe 90%);background-image:linear-gradient(#536dfe 20%,#536dfe 90%);background:#536dfe url("../inc/themes/material-blue/css/images/ui-bg_highlight-hard_100_536DFE_1x100.png") repeat-x scroll 50% 50%}#content #title.titleNormal{background-color:#607d8b;color:#fff}#content .data-container{width:75%;margin:0 auto}#content .data{width:100%;padding:10px;border:1px solid #c9c9c9;margin:0 auto;background-color:#f9f9f9}#content fieldset.data{margin:2em auto}#content fieldset.data>legend{color:#607d8b;padding:0 .5em;font-size:1.5em}#content fieldset.data>table{display:none;width:100%}#content .data #history-icon{position:relative;top:5em;right:2em}#content .data td{text-align:left}#content .data td.descField{text-align:right;font-size:12px;font-weight:bold;color:#999}#content .data select{min-width:210px}#content .data .list-wrap,#box-popup .list-wrap{max-height:10em;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}#content .data .dropzone{width:30em;padding:1em;border:2px dashed #009688;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 rgba(0,0,0,0);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}#content .extra-info{margin-top:20px}#content .tblIcon{background:url("../imgs/clock.png") no-repeat transparent}#content #tabs .ui-tabs-nav{position:relative;left:12em;width:90%}#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:#fff2d9;color:orange;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:#045fb4}#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-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,#content #data-search .account-info img,#content #data-search .account-actions img{width:24px;height:24px;margin:0 .5em}#content .rowSpace>.cellBorder{height:10px;border-top:1px solid #d9d9d9}#content .rowSpace>.cellBlank{height:10px}#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;background-color:rgba(252,252,252,.75);vertical-align:middle}#content #searchbox{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 1em}#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 #tabs.ui-widget-content{border:0;background-color:transparent}#content #tabs .ui-widget-header{background:0;border:0;border-bottom:1px solid #c9c9c9}#content #tabs.ui-widget-content{background:none !important}#content #tabs .tabs-spacer{float:left;height:200px}#content .tabs-bottom .ui-tabs-nav{clear:left;padding:0 .2em .2em .2em}#content .tabs-bottom .ui-tabs-nav li{top:auto;bottom:0;margin:0 .2em 1px 0;border-top:0}#content .tabs-bottom .ui-tabs-nav li.ui-tabs-active{margin-top:-1px;padding-top:1px}#datos{float:left;width:400px;text-align:left;margin-top:10px;color:#b9b9b9}#datos a{color:orange;font-weight:bold;border:0;padding:3px;margin:5px 0 5px 0;display:block;width:40px;text-align:center;background-color:transparent}#datos img{border:0}#resAccion,#resFancyAccion{height:20px;padding:5px;margin:5px;font-weight:bold;font-size:14px}#resAccion span{padding:5px;border:#a9a9a9 1px solid}#fancyView{min-width:250px;text-align:center;padding:15px;line-height:20px;border:#d9d9d9 1px solid;font-size:14px}#fancyView ul{list-style:none}#fancyView.msgError{margin:5px;background-color:#fee8e6;color:#c00;font-weight:bold;border:#fed2ce 1px solid}#fancyView.msgOk{margin:5px;background-color:#ecfde4;color:green;font-weight:bold;border:#dbfdcb 1px solid}#fancyView.msgWarn{margin:5px;background-color:#fff2d9;color:orange;font-weight:bold;border:#ffe5b3 1px solid}#fancyView.msgInfo{margin:5px;background-color:#e9e9e9;color:orange;font-weight:bold;border:#ffe5b3 1px solid}#fancyView.backGrey{background-color:#f2f2f2 !important}#fancyView PRE{text-align:left}#fancyView table{border:0;width:100%;font-size:14px;text-align:left}#fancyView td{border-bottom:#d9d9d9 1px solid}#fancyView a,#fancyMsg a{color:#555}#box-popup{min-width:25em;max-width:50em;margin:5em auto;padding:0;background-color:#fff}#box-popup.box-password-view{min-width:20em;max-width:25em}#box-popup>h2{width:100%;font-size:18px;color:white;background-color:#607d8b;margin:0 0 1em 0;padding:.5em 0;line-height:1em}#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}#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}#debug{float:left;text-align:left}#debuginfo{width:100%;min-height:10em;padding:1em;background-color:lightgoldenrodyellow;text-align:left;line-height:1.5em}#debuginfo H3{text-align:center}.fancyNone{background-color:transparent !important}.fancydata{min-width:400px;border:0;text-align:left;margin:0 .5em}.fancydata .descField{min-width:100px;font-weight:bold}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;box-shadow:0 -8px 6px -6px #c9c9c9;-webkit-box-shadow:0 -8px 6px -6px #c9c9c9;-moz-box-shadow:0 -8px 6px -6px #c9c9c9}footer,footer .footer-parts{display:flex;justify-content:space-between}footer #footer-left,footer #footer-right{width:50%;margin:0 1em}footer #footer-right{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,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{border-radius:5px !important;-moz-border-radius:5px !important;-webkit-border-radius:5px !important}.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}#content .error{width:350px;margin:15px;padding:15px;background-color:#f9f9f9;color:orange;border:orange 1px solid;margin:0 auto;text-align:center;font-size:16px;line-height:1.5em}.hide{display:none !important}.btn-checks{padding:5px;margin:.2em 0;width:30em;border-bottom:1px solid #c9c9c9}.shadow{box-shadow:1px 1px 2px #d9d9d9}.noRes{width:60%;margin:15px;padding:15px;background-color:#f9f9f9;color:#a9a9a9;border:#c9c9c9 1px solid;margin:20px auto;text-align:center;font-size:16px}.header-blue{background:#536dfe url("../inc/themes/material-blue/css/images/ui-bg_highlight-hard_100_536DFE_1x100.png") repeat-x scroll 50% 50%}.header-grey{background-color:#607d8b;color:#fff;min-height:2em}.no-background{background:none !important}.action-in-box{display:inline-block;height:4em;margin:.7em 0;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{margin-left:.5em}.fullWidth{max-width:100% !important}.filterOn{padding:.3em 1em;background-color:#ecfde4;color:green !important;border:#dbfdcb 1px solid !important}.globalOn{padding:.3em 1em;background-color:#fff2d9;color:orange !important;border:#ffe5b3 1px solid !important}.opacity50{filter:alpha(opacity=50);-moz-opacity:.5;-khtml-opacity:.5;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}.ui-tooltip{background:#ffffa3;color:#555;padding:10px;border-radius:10px;box-shadow:0 0 7px #a9a9a9}.ui-autocomplete,.ui-menu-item{z-index:8050}.fancybox-inner{overflow:visible !important}.passLevel{width:20px;height:20px;display:inline-block;position:relative;top:2px}.passLevel.strongest,.passLevel.strongest:hover{background-color:#ecfde4 !important;color:green;font-weight:bold;border:lightgreen 1px solid}.passLevel.strong,.passLevel.strong:hover{background-color:#e6f2ff !important;color:#64b4f4;font-weight:bold;border:#64b4f4 1px solid}.passLevel.good,.passLevel.good:hover{background-color:#fff2d9 !important;color:orange;font-weight:bold;border:#ffe5b3 1px solid}.passLevel.weak,.passLevel.weak:hover{background-color:#fee8e6 !important;color:#c00;font-weight:bold;border:#fed2ce 1px solid}#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-user-text{padding:.5em;border-bottom:#d9d9d9 1px solid;text-align:center;min-width:200px;color:#d9d9d9}.dialog-pass-text{padding:.5em;border:transparent 1px solid;text-align:center;min-width:200px}.dialog-buttons{text-align:center;padding:.5em;border-top:1px solid #c9c9c9;line-height:2.5em}.dialog-clip-copy{background-color:#ecfde4;color:green}.help-box{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}#login-container{width:40em;margin:0 auto;background:transparent url("../imgs/logo_full_bg.png") no-repeat top left;background-size:auto 10em}#login-container #boxLogin{position:relative;margin:11em auto 0 auto;width:100%;min-height:12em;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 #boxButton{position:absolute;top:2em;right:2em}#login-container #boxLogin #boxActions{position:absolute;bottom:1em;right:1em;width:100%;padding:.5em;text-align:right}#login-container #boxLogin #boxActions a{color:#c9c9c9}#login-container #boxLogout{width:250px;margin:8em auto 0 auto;font-size:14px;text-align:center;color:orange;background:#fff2d9;border:#ffe5b3 1px solid;padding:.5em}#login-container #boxUpdated{width:350px;margin:5em auto 5em auto;font-size:14px;text-align:center;color:green;background:#ecfde4;border:#dbfdcb 1px solid;padding:.5em}fieldset.warning{padding:8px;color:#b94a48;background-color:#f2dede;border:1px solid #eed3d7;border-radius:5px}fieldset.warning legend{color:#b94a48 !important}fieldset.warning a{color:#b94a48 !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("../imgs/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:40%;margin:0 auto;list-style:none;font-size:14px;text-align:left}#actions ul.errors>li{margin:1.5em auto;border-radius:5px;padding:.5em}#actions ul.errors>li.error-critical{color:#ef5350;background-color:#ffcdd2;border:1px solid #ef5350}#actions ul.errors>li.error-warning{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#actions ul.errors>li.error-ok{color:#26a69a;background-color:#b2dfdb;border:1px solid #26a69a}#actions ul.errors>li>p.hint{color:#aaa;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}#whatsNewIcon{text-align:center}#whatsNewIcon img{width:64px;height:64px}#whatsNewIcon h2{display:inline-block;color:#555;font-size:16px}#whatsNew{margin:0 auto;width:500px;background-color:#fffde1;padding:2em;line-height:1.5em;font-size:16px;color:#555;border:1px solid #d9d9d9;margin-bottom:3em;display:none}#whatsNew ul{padding:0;border:0}#whatsNew li{padding-left:37px;background:url("../imgs/arrow-list.png") left center no-repeat;line-height:32px;list-style:none}.no-title .ui-dialog-titlebar{display:none}.ui-dialog{z-index:9999 !important}.help-box{display:none}.center{text-align:center !important}.right{text-align:right !important}.left{text-align:left !important}@media screen and (max-width:1000px){#content #searchbox{position:relative;left:0;width:100%}#content #searchbox form{flex-wrap:wrap}#content #searchbox form>div{width:100%}#content #searchbox input[type=text]{width:100%}footer{display:none}footer,footer .footer-parts{justify-content:space-between;flex-wrap:wrap}footer #footer-left,footer #footer-right,footer .footer-parts>div{width:100%}footer .footer-parts>div{padding:.5em 0}} \ No newline at end of file diff --git a/inc/themes/material-blue/views/account/viewpass.inc b/inc/themes/material-blue/views/account/viewpass.inc index e04a91e3..5ae80305 100644 --- a/inc/themes/material-blue/views/account/viewpass.inc +++ b/inc/themes/material-blue/views/account/viewpass.inc @@ -2,8 +2,8 @@ /** @var \SP\DataModel\CategoryData $category */ /** @var \SP\Core\UI\ThemeIconsBase $icons */ ?> -
-

+
+

diff --git a/inc/themes/material-blue/views/itemshow/categories.inc b/inc/themes/material-blue/views/itemshow/categories.inc index e0d29ad0..3387d082 100644 --- a/inc/themes/material-blue/views/itemshow/categories.inc +++ b/inc/themes/material-blue/views/itemshow/categories.inc @@ -2,8 +2,8 @@ /** @var \SP\DataModel\CategoryData $category */ /** @var \SP\Core\UI\ThemeIconsBase $icons */ ?> -
-

+
+

-
-

+
+

-
-

+
+

-
-

+
+

-
-

+
+

-
-

+
+

diff --git a/inc/themes/material-blue/views/itemshow/tags.inc b/inc/themes/material-blue/views/itemshow/tags.inc index c77764bd..46826241 100644 --- a/inc/themes/material-blue/views/itemshow/tags.inc +++ b/inc/themes/material-blue/views/itemshow/tags.inc @@ -2,8 +2,8 @@ /** @var $tag \SP\DataModel\TagData */ /** @var $icons \SP\Core\UI\ThemeIconsBase */ ?> -
-

+
+

-

+
+

-
-

+
+

-
-

+
+

diff --git a/inc/themes/material-blue/views/wiki/wikipage.inc b/inc/themes/material-blue/views/wiki/wikipage.inc index 92132bd3..931aa47b 100644 --- a/inc/themes/material-blue/views/wiki/wikipage.inc +++ b/inc/themes/material-blue/views/wiki/wikipage.inc @@ -1,5 +1,5 @@ -
-

+
+

diff --git a/js/app-actions.js b/js/app-actions.js index 3369b0bb..8a896858 100644 --- a/js/app-actions.js +++ b/js/app-actions.js @@ -133,7 +133,7 @@ sysPass.Actions = function (Common) { }, callbacks: { open: function () { - Common.appTriggers().views.common("#fancyContainer"); + Common.appTriggers().views.common("#box-popup"); }, close: function () { if ($obj.data("item-dst")) { diff --git a/js/app-actions.min.js b/js/app-actions.min.js index 848967f2..5ded097d 100644 --- a/js/app-actions.min.js +++ b/js/app-actions.min.js @@ -4,31 +4,31 @@ $jscomp.polyfill("Array.prototype.find",function(c){return c?c:function(c,h){ret sysPass.Actions=function(c){var d=c.log,h=0,e={doAction:"/ajax/ajax_getContent.php",updateItems:"/ajax/ajax_getItems.php",user:{savePreferences:"/ajax/ajax_userPrefsSave.php",password:"/ajax/ajax_usrpass.php",passreset:"/ajax/ajax_passReset.php"},main:{login:"/ajax/ajax_doLogin.php",install:"/ajax/ajax_install.php",twofa:"/ajax/ajax_2fa.php",getUpdates:"/ajax/ajax_checkUpds.php"},checks:"/ajax/ajax_checkConnection.php",config:{save:"/ajax/ajax_configSave.php","export":"/ajax/ajax_export.php","import":"/ajax/ajax_import.php"}, file:"/ajax/ajax_filesMgmt.php",link:"/ajax/ajax_itemSave.php",account:{save:"/ajax/ajax_itemSave.php",showPass:"/ajax/ajax_accViewPass.php",saveFavorite:"/ajax/ajax_itemSave.php",request:"/ajax/ajax_sendRequest.php",getFiles:"/ajax/ajax_accGetFiles.php",search:"/ajax/ajax_accSearch.php"},appMgmt:{show:"/ajax/ajax_itemShow.php",save:"/ajax/ajax_itemSave.php",search:"/ajax/ajax_itemSearch.php"},eventlog:"/ajax/ajax_eventlog.php",wiki:{show:"/ajax/ajax_wiki.php"}},g=function(a){a={actionId:a.actionId, itemId:"undefined"!==typeof a.itemId?a.itemId:0,isAjax:1};var b=c.appRequests().getRequestOpts();b.url=e.doAction;b.type="html";b.addHistory=!0;b.data=a;c.appRequests().getActionCall(b,function(a){$("#content").empty().html(a)})},m=function(a){d.info("updateItems");var b=$("#"+a.data("item-dst"))[0].selectize;b.clearOptions();b.load(function(b){var f=c.appRequests().getRequestOpts();f.url=e.updateItems;f.method="get";f.data={sk:c.sk.get(),itemType:a.data("item-type")};c.appRequests().getActionCall(f, -function(a){b(a.items)})})},p=function(a,b){$.magnificPopup.open({items:{src:b,type:"inline"},callbacks:{open:function(){c.appTriggers().views.common("#fancyContainer")},close:function(){a.data("item-dst")&&m(a)}},showCloseBtn:!1})},r=function(a,b){var f=$('
'+b+"
"),d=f.find("img");d.hide();$.magnificPopup.open({items:{src:f,type:"inline"},callbacks:{open:function(){var a=this;d.on("click",function(){a.close()});setTimeout(function(){var a=c.resizeImage(d); -f.css({backgroundColor:"#fff",width:a.width,height:"auto"});d.show("slow")},500)}}})},q={logout:function(){var a=window.location.search;c.redirect(0
";showDialog({text:b,negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}},positive:{title:c.config().LANG[43],onClick:function(b){b=c.appRequests().getRequestOpts();b.url=e.account.save;b.data={itemId:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get()};c.appRequests().getActionCall(b,function(a){c.msg.out(a); -l.search()})}}})},showpass:function(a){d.info("account:showpass");var b=a.data("parent-id"),f=c.appRequests().getRequestOpts();f.url=e.appMgmt.show;f.data={itemId:0==b?a.data("item-id"):b,actionId:a.data("action-id"),isHistory:a.data("history"),isFull:1,sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(f,function(b){0!==b.status?c.msg.out(b):(b=$(b.data.html),p(a,b),b.on("mouseleave",function(){clearTimeout(h);h=setTimeout(function(){$.magnificPopup.close()},3E4)}).on("mouseenter",function(){0!== -h&&clearTimeout(h)}))})},copypass:function(a){d.info("account:copypass");var b=a.data("parent-id"),f=c.appRequests().getRequestOpts();f.url=e.appMgmt.show;f.async=!1;f.data={itemId:0==b?a.data("item-id"):b,actionId:a.data("action-id"),isHistory:a.data("history"),isFull:0,sk:c.sk.get(),isAjax:1};a=c.appRequests().getActionCall(f);"undefined"!==typeof a.responseJSON.csrf&&c.sk.set(a.responseJSON.csrf);return a},copy:function(a){d.info("account:copy");g({actionId:a.data("action-id"),itemId:a.data("item-id")})}, -savefavorite:function(a,b){d.info("account:saveFavorite");var f="on"===a.data("status"),k={actionId:f?a.data("action-id-off"):a.data("action-id-on"),itemId:a.data("item-id"),sk:c.sk.get(),isAjax:1},g=c.appRequests().getRequestOpts();g.url=e.account.saveFavorite;g.data=k;c.appRequests().getActionCall(g,function(d){c.msg.out(d);0===d.status&&(a.data("status",f?"off":"on"),"function"===typeof b&&b())})},request:function(a){d.info("account:request");var b=c.appRequests().getRequestOpts();b.url=e.account.request; -b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a)})},menu:function(a){a.hide();a.parent().children(".actions-optional").show(250)},sort:function(a){d.info("account:sort");var c=$("#frmSearch");c.find('input[name="skey"]').val(a.data("key"));c.find('input[name="sorder"]').val(a.data("dir"));c.find('input[name="start"]').val(a.data("start"));l.search()},editpass:function(a){d.info("account:editpass");var c=a.data("parent-id");g({actionId:a.data("action-id"),itemId:0==c?a.data("item-id"): -c})},restore:function(a){d.info("account:restore");l.save(a)},getfiles:function(a){d.info("account:getfiles");var b=c.appRequests().getRequestOpts();b.method="get";b.type="html";b.url=e.account.getFiles;b.data={id:a.data("item-id"),del:a.data("delete"),sk:c.sk.get()};c.appRequests().getActionCall(b,function(c){a.html(c)})},search:function(){d.info("account:search");var a=$("#frmSearch");a.find("input[name='sk']").val(c.sk.get());a.find("input[name='skey']").val();a.find("input[name='sorder']").val(); -var b=c.appRequests().getRequestOpts();b.url=e.account.search;b.data=a.serialize();c.appRequests().getActionCall(b,function(b){10===b.status&&c.msg.out(b);c.sk.set(b.sk);$("#res-content").empty().html(b.html);a.find("input:first").focus()})},save:function(a){d.info("account:save");var b=c.appRequests().getRequestOpts();b.url=e.account.save;b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a)})}},n={refreshTab:!0,show:function(a){d.info("appMgmt:show");if(a.data("item-dst")|| -!a.data("activetab"))n.refreshTab=!1;var b=c.appRequests().getRequestOpts();b.url=e.appMgmt.show;b.data={itemId:a.data("item-id"),actionId:a.data("action-id"),activeTab:a.data("activetab"),sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(b,function(b){0!==b.status?c.msg.out(b):p(a,b.data.html)})},"delete":function(a){d.info("appMgmt:delete");var b='

'+c.config().LANG[12]+"

",f=a.data("selection"),k=[];if(f&&($(f).find(".is-selected").each(function(a, -c){var b=$(this);k.push(b.data("item-id"))}),0===k.length))return;showDialog({text:b,negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}},positive:{title:c.config().LANG[43],onClick:function(b){b.preventDefault();b=c.appRequests().getRequestOpts();b.url=e.appMgmt.save;b.data={itemId:f?k:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(b,function(b){c.msg.out(b);a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"), -itemId:a.data("activetab")})})}}})},save:function(a){d.info("appMgmt:save");var b=c.appRequests().getRequestOpts();b.url=e.appMgmt.save;b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);0===b.status&&(!0===n.refreshTab&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")}),$.magnificPopup.close())})},search:function(a){d.info("appMgmt:search");var b=$(a.data("target")),f=c.appRequests().getRequestOpts();f.url=e.appMgmt.search;f.data=a.serialize();c.appRequests().getActionCall(f, -function(a){0===a.status?b.html(a.data.html):b.html(c.msg.html.error(a.description));c.sk.set(a.csrf)})},nav:function(a){d.info("appMgmt:nav");var b=$("#"+a.data("action-form"));b.find("[name='start']").val(a.data("start"));b.find("[name='count']").val(a.data("count"));b.find("[name='sk']").val(c.sk.get());n.search(b)},ldapSync:function(a){d.info("appMgmt:ldapSync");var b='

'+c.config().LANG[57]+"

";showDialog({text:b,negative:{title:c.config().LANG[44], -onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}},positive:{title:c.config().LANG[43],onClick:function(b){b=c.appRequests().getRequestOpts();b.url=e.appMgmt.save;b.data={actionId:a.data("action-id"),sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(b,function(a){c.msg.out(a)})}}})}};return{doAction:g,appMgmt:n,account:l,file:{view:function(a){d.info("file:view");var b=c.appRequests().getRequestOpts();b.url=e.file;b.type="html";b.data={fileId:a.data("item-id"),sk:c.sk.get(), -actionId:a.data("action-id")};c.appRequests().getActionCall(b,function(b){"undefined"!==typeof b.status&&1===b.status?c.msg.out(b):b?r(a,b):c.msg.error(c.config().LANG[14])})},download:function(a){d.info("file:download");a={fileId:a.data("item-id"),sk:c.sk.get(),actionId:a.data("action-id")};$.fileDownload(c.config().APP_ROOT+e.file,{httpMethod:"POST",data:a})},"delete":function(a){d.info("file:delete");var b='

'+c.config().LANG[15]+"

";showDialog({text:b, -negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}},positive:{title:c.config().LANG[43],onClick:function(b){b=c.appRequests().getRequestOpts();b.url=e.file;b.data={fileId:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get()};c.appRequests().getActionCall(b,function(a){c.msg.out(a);0===a.status&&(a=$("#list-account-files"),l.getfiles(a))})}}})}},checks:{ldap:function(a){d.info("checks:ldap");a=$(a.data("src"));a.find("[name='sk']").val(c.sk.get()); -var b=c.appRequests().getRequestOpts();b.url=e.checks;b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a);var b=$("#ldap-results");b.find(".list-wrap").html(c.appTheme().html.getList(a.data));b.show("slow")})},wiki:function(a){d.info("checks:wiki");a=$(a.data("src"));a.find("[name='sk']").val(c.sk.get());var b=c.appRequests().getRequestOpts();b.url=e.checks;b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a);0===a.status&&$("#dokuWikiResCheck").html(a.data)})}}, -config:{save:function(a){d.info("config:save");var b=c.appRequests().getRequestOpts();b.url=e.config.save;b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);0===b.status&&"undefined"!==typeof a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})},backup:function(a){d.info("config:backup");var b=c.appRequests().getRequestOpts();b.url=e.config["export"];b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);0=== -b.status&&"undefined"!==typeof a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})},"export":function(a){d.info("config:export");var b=c.appRequests().getRequestOpts();b.url=e.config["export"];b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);0===b.status&&"undefined"!==typeof a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})},"import":function(a){d.info("config:import");var b=c.appRequests().getRequestOpts(); -b.url=e.config["import"];b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);0===b.status&&"undefined"!==typeof a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})}},main:q,user:{savePreferences:function(a){d.info("user:savePreferences");var b=c.appRequests().getRequestOpts();b.url=e.user.savePreferences;b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a);setTimeout(function(){window.location.replace("index.php")}, -2E3)})},saveSecurity:function(a){d.info("user:saveSecurity");var b=c.appRequests().getRequestOpts();b.url=e.user.savePreferences;b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})},password:function(a){d.info("user:password");var b=c.appRequests().getRequestOpts();b.type="html";b.method="get";b.url=e.user.password;b.data={actionId:a.data("action-id"),itemId:a.data("item-id"),sk:a.data("sk"),isAjax:1};c.appRequests().getActionCall(b, -function(b){0===b.length?q.logout():p(a,b)})},passreset:function(a){d.info("user:passreset");var b=c.appRequests().getRequestOpts();b.url=e.user.passreset;b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a)})}},link:{save:function(a){d.info("link:save");var b=c.appRequests().getRequestOpts();b.url=e.link;b.data={itemId:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get(),isAjax:1};a='

'+c.config().LANG[48]+"

";showDialog({text:a, -negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.appRequests().getActionCall(b,function(a){c.msg.out(a)})}},positive:{title:c.config().LANG[43],onClick:function(a){a.preventDefault();b.data.notify=1;c.appRequests().getActionCall(b,function(a){c.msg.out(a)})}}})},refresh:function(a){d.info("link:refresh");var b={itemId:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get(),activeTab:a.data("activetab")},f=c.appRequests().getRequestOpts();f.url=e.link;f.data=b;c.appRequests().getActionCall(f, -function(b){c.msg.out(b);0===b.status&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})}},eventlog:{nav:function(a){if("undefined"===typeof a.data("start"))return!1;var b=c.appRequests().getRequestOpts();b.url=e.eventlog;b.type="html";b.data={start:a.data("start"),current:a.data("current")};c.appRequests().getActionCall(b,function(a){$("#content").html(a);c.scrollUp()})},clear:function(a){var b='

'+c.config().LANG[20]+"

";showDialog({text:b, -negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}},positive:{title:c.config().LANG[43],onClick:function(b){b.preventDefault();b=c.appRequests().getRequestOpts();b.url=e.eventlog;b.data={clear:1,sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(b,function(b){c.msg.out(b);0==b.status&&g({actionId:a.data("nextaction-id")})})}}})}},ajaxUrl:e}}; +function(a){b(a.items)})})},p=function(a,b){$.magnificPopup.open({items:{src:b,type:"inline"},callbacks:{open:function(){c.appTriggers().views.common("#box-popup")},close:function(){a.data("item-dst")&&m(a)}},showCloseBtn:!1})},r=function(a,b){var f=$('
'+b+"
"),d=f.find("img");d.hide();$.magnificPopup.open({items:{src:f,type:"inline"},callbacks:{open:function(){var a=this;d.on("click",function(){a.close()});setTimeout(function(){var a=c.resizeImage(d);f.css({backgroundColor:"#fff", +width:a.width,height:"auto"});d.show("slow")},500)}}})},q={logout:function(){var a=window.location.search;c.redirect(0
";showDialog({text:b,negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}},positive:{title:c.config().LANG[43],onClick:function(b){b=c.appRequests().getRequestOpts();b.url=e.account.save;b.data={itemId:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get()};c.appRequests().getActionCall(b,function(a){c.msg.out(a);l.search()})}}})},showpass:function(a){d.info("account:showpass"); +var b=a.data("parent-id"),f=c.appRequests().getRequestOpts();f.url=e.appMgmt.show;f.data={itemId:0==b?a.data("item-id"):b,actionId:a.data("action-id"),isHistory:a.data("history"),isFull:1,sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(f,function(b){0!==b.status?c.msg.out(b):(b=$(b.data.html),p(a,b),b.on("mouseleave",function(){clearTimeout(h);h=setTimeout(function(){$.magnificPopup.close()},3E4)}).on("mouseenter",function(){0!==h&&clearTimeout(h)}))})},copypass:function(a){d.info("account:copypass"); +var b=a.data("parent-id"),f=c.appRequests().getRequestOpts();f.url=e.appMgmt.show;f.async=!1;f.data={itemId:0==b?a.data("item-id"):b,actionId:a.data("action-id"),isHistory:a.data("history"),isFull:0,sk:c.sk.get(),isAjax:1};a=c.appRequests().getActionCall(f);"undefined"!==typeof a.responseJSON.csrf&&c.sk.set(a.responseJSON.csrf);return a},copy:function(a){d.info("account:copy");g({actionId:a.data("action-id"),itemId:a.data("item-id")})},savefavorite:function(a,b){d.info("account:saveFavorite");var f= +"on"===a.data("status"),k={actionId:f?a.data("action-id-off"):a.data("action-id-on"),itemId:a.data("item-id"),sk:c.sk.get(),isAjax:1},g=c.appRequests().getRequestOpts();g.url=e.account.saveFavorite;g.data=k;c.appRequests().getActionCall(g,function(d){c.msg.out(d);0===d.status&&(a.data("status",f?"off":"on"),"function"===typeof b&&b())})},request:function(a){d.info("account:request");var b=c.appRequests().getRequestOpts();b.url=e.account.request;b.data=a.serialize();c.appRequests().getActionCall(b, +function(a){c.msg.out(a)})},menu:function(a){a.hide();a.parent().children(".actions-optional").show(250)},sort:function(a){d.info("account:sort");var c=$("#frmSearch");c.find('input[name="skey"]').val(a.data("key"));c.find('input[name="sorder"]').val(a.data("dir"));c.find('input[name="start"]').val(a.data("start"));l.search()},editpass:function(a){d.info("account:editpass");var c=a.data("parent-id");g({actionId:a.data("action-id"),itemId:0==c?a.data("item-id"):c})},restore:function(a){d.info("account:restore"); +l.save(a)},getfiles:function(a){d.info("account:getfiles");var b=c.appRequests().getRequestOpts();b.method="get";b.type="html";b.url=e.account.getFiles;b.data={id:a.data("item-id"),del:a.data("delete"),sk:c.sk.get()};c.appRequests().getActionCall(b,function(c){a.html(c)})},search:function(){d.info("account:search");var a=$("#frmSearch");a.find("input[name='sk']").val(c.sk.get());a.find("input[name='skey']").val();a.find("input[name='sorder']").val();var b=c.appRequests().getRequestOpts();b.url=e.account.search; +b.data=a.serialize();c.appRequests().getActionCall(b,function(b){10===b.status&&c.msg.out(b);c.sk.set(b.sk);$("#res-content").empty().html(b.html);a.find("input:first").focus()})},save:function(a){d.info("account:save");var b=c.appRequests().getRequestOpts();b.url=e.account.save;b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a)})}},n={refreshTab:!0,show:function(a){d.info("appMgmt:show");if(a.data("item-dst")||!a.data("activetab"))n.refreshTab=!1;var b=c.appRequests().getRequestOpts(); +b.url=e.appMgmt.show;b.data={itemId:a.data("item-id"),actionId:a.data("action-id"),activeTab:a.data("activetab"),sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(b,function(b){0!==b.status?c.msg.out(b):p(a,b.data.html)})},"delete":function(a){d.info("appMgmt:delete");var b='

'+c.config().LANG[12]+"

",f=a.data("selection"),k=[];if(f&&($(f).find(".is-selected").each(function(a,c){var b=$(this);k.push(b.data("item-id"))}),0===k.length))return;showDialog({text:b, +negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}},positive:{title:c.config().LANG[43],onClick:function(b){b.preventDefault();b=c.appRequests().getRequestOpts();b.url=e.appMgmt.save;b.data={itemId:f?k:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(b,function(b){c.msg.out(b);a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})}}})},save:function(a){d.info("appMgmt:save"); +var b=c.appRequests().getRequestOpts();b.url=e.appMgmt.save;b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);0===b.status&&(!0===n.refreshTab&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")}),$.magnificPopup.close())})},search:function(a){d.info("appMgmt:search");var b=$(a.data("target")),f=c.appRequests().getRequestOpts();f.url=e.appMgmt.search;f.data=a.serialize();c.appRequests().getActionCall(f,function(a){0===a.status?b.html(a.data.html):b.html(c.msg.html.error(a.description)); +c.sk.set(a.csrf)})},nav:function(a){d.info("appMgmt:nav");var b=$("#"+a.data("action-form"));b.find("[name='start']").val(a.data("start"));b.find("[name='count']").val(a.data("count"));b.find("[name='sk']").val(c.sk.get());n.search(b)},ldapSync:function(a){d.info("appMgmt:ldapSync");var b='

'+c.config().LANG[57]+"

";showDialog({text:b,negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}},positive:{title:c.config().LANG[43], +onClick:function(b){b=c.appRequests().getRequestOpts();b.url=e.appMgmt.save;b.data={actionId:a.data("action-id"),sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(b,function(a){c.msg.out(a)})}}})}};return{doAction:g,appMgmt:n,account:l,file:{view:function(a){d.info("file:view");var b=c.appRequests().getRequestOpts();b.url=e.file;b.type="html";b.data={fileId:a.data("item-id"),sk:c.sk.get(),actionId:a.data("action-id")};c.appRequests().getActionCall(b,function(b){"undefined"!==typeof b.status&& +1===b.status?c.msg.out(b):b?r(a,b):c.msg.error(c.config().LANG[14])})},download:function(a){d.info("file:download");a={fileId:a.data("item-id"),sk:c.sk.get(),actionId:a.data("action-id")};$.fileDownload(c.config().APP_ROOT+e.file,{httpMethod:"POST",data:a})},"delete":function(a){d.info("file:delete");var b='

'+c.config().LANG[15]+"

";showDialog({text:b,negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}}, +positive:{title:c.config().LANG[43],onClick:function(b){b=c.appRequests().getRequestOpts();b.url=e.file;b.data={fileId:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get()};c.appRequests().getActionCall(b,function(a){c.msg.out(a);0===a.status&&(a=$("#list-account-files"),l.getfiles(a))})}}})}},checks:{ldap:function(a){d.info("checks:ldap");a=$(a.data("src"));a.find("[name='sk']").val(c.sk.get());var b=c.appRequests().getRequestOpts();b.url=e.checks;b.data=a.serialize();c.appRequests().getActionCall(b, +function(a){c.msg.out(a);var b=$("#ldap-results");b.find(".list-wrap").html(c.appTheme().html.getList(a.data));b.show("slow")})},wiki:function(a){d.info("checks:wiki");a=$(a.data("src"));a.find("[name='sk']").val(c.sk.get());var b=c.appRequests().getRequestOpts();b.url=e.checks;b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a);0===a.status&&$("#dokuWikiResCheck").html(a.data)})}},config:{save:function(a){d.info("config:save");var b=c.appRequests().getRequestOpts();b.url= +e.config.save;b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);0===b.status&&"undefined"!==typeof a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})},backup:function(a){d.info("config:backup");var b=c.appRequests().getRequestOpts();b.url=e.config["export"];b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);0===b.status&&"undefined"!==typeof a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"), +itemId:a.data("activetab")})})},"export":function(a){d.info("config:export");var b=c.appRequests().getRequestOpts();b.url=e.config["export"];b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);0===b.status&&"undefined"!==typeof a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})},"import":function(a){d.info("config:import");var b=c.appRequests().getRequestOpts();b.url=e.config["import"];b.data=a.serialize();c.appRequests().getActionCall(b, +function(b){c.msg.out(b);0===b.status&&"undefined"!==typeof a.data("nextaction-id")&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})}},main:q,user:{savePreferences:function(a){d.info("user:savePreferences");var b=c.appRequests().getRequestOpts();b.url=e.user.savePreferences;b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a);setTimeout(function(){window.location.replace("index.php")},2E3)})},saveSecurity:function(a){d.info("user:saveSecurity");var b=c.appRequests().getRequestOpts(); +b.url=e.user.savePreferences;b.data=a.serialize();c.appRequests().getActionCall(b,function(b){c.msg.out(b);g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})},password:function(a){d.info("user:password");var b=c.appRequests().getRequestOpts();b.type="html";b.method="get";b.url=e.user.password;b.data={actionId:a.data("action-id"),itemId:a.data("item-id"),sk:a.data("sk"),isAjax:1};c.appRequests().getActionCall(b,function(b){0===b.length?q.logout():p(a,b)})},passreset:function(a){d.info("user:passreset"); +var b=c.appRequests().getRequestOpts();b.url=e.user.passreset;b.data=a.serialize();c.appRequests().getActionCall(b,function(a){c.msg.out(a)})}},link:{save:function(a){d.info("link:save");var b=c.appRequests().getRequestOpts();b.url=e.link;b.data={itemId:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get(),isAjax:1};a='

'+c.config().LANG[48]+"

";showDialog({text:a,negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.appRequests().getActionCall(b, +function(a){c.msg.out(a)})}},positive:{title:c.config().LANG[43],onClick:function(a){a.preventDefault();b.data.notify=1;c.appRequests().getActionCall(b,function(a){c.msg.out(a)})}}})},refresh:function(a){d.info("link:refresh");var b={itemId:a.data("item-id"),actionId:a.data("action-id"),sk:c.sk.get(),activeTab:a.data("activetab")},f=c.appRequests().getRequestOpts();f.url=e.link;f.data=b;c.appRequests().getActionCall(f,function(b){c.msg.out(b);0===b.status&&g({actionId:a.data("nextaction-id"),itemId:a.data("activetab")})})}}, +eventlog:{nav:function(a){if("undefined"===typeof a.data("start"))return!1;var b=c.appRequests().getRequestOpts();b.url=e.eventlog;b.type="html";b.data={start:a.data("start"),current:a.data("current")};c.appRequests().getActionCall(b,function(a){$("#content").html(a);c.scrollUp()})},clear:function(a){var b='

'+c.config().LANG[20]+"

";showDialog({text:b,negative:{title:c.config().LANG[44],onClick:function(a){a.preventDefault();c.msg.error(c.config().LANG[44])}}, +positive:{title:c.config().LANG[43],onClick:function(b){b.preventDefault();b=c.appRequests().getRequestOpts();b.url=e.eventlog;b.data={clear:1,sk:c.sk.get(),isAjax:1};c.appRequests().getActionCall(b,function(b){c.msg.out(b);0==b.status&&g({actionId:a.data("nextaction-id")})})}}})}},ajaxUrl:e}};