From 8538ba3dfcbb4fdf1694c28f95f012f4980a2b07 Mon Sep 17 00:00:00 2001 From: nuxsmin Date: Tue, 6 Oct 2015 19:27:49 +0200 Subject: [PATCH] * [ADD] New classes to improve performance and code readability. * [ADD] Security enhancement for master password in session. * [MOD] Minor UI tweaks. * [MOD] Improved config handling. * [MOD] Code cleaning. * [FIX] Accounts' main group were not set when the user hadn't enough privileges. * [FIX] Accounts restoration didn't restore the account's main group. --- CHANGELOG | 18 +- CHANGELOG-ES | 18 +- ajax/ajax_2fa.php | 10 +- ajax/ajax_accountSave.php | 67 +- ajax/ajax_appMgmtSave.php | 151 +- ajax/ajax_backup.php | 22 +- ajax/ajax_checkLdap.php | 13 +- ajax/ajax_configSave.php | 209 +-- ajax/ajax_doLogin.php | 41 +- ajax/ajax_files.php | 3 +- ajax/ajax_getEnvironment.php | 2 +- ajax/ajax_getFiles.php | 5 +- ajax/ajax_import.php | 13 +- ajax/ajax_migrate.php | 23 +- ajax/ajax_passReset.php | 21 +- ajax/ajax_search.php | 3 +- ajax/ajax_sendRequest.php | 13 +- ajax/ajax_userPrefsSave.php | 21 +- ajax/ajax_viewpass.php | 13 +- api.php | 4 +- inc/Account.class.php | 51 +- inc/AccountBase.class.php | 2 +- inc/AccountHistory.class.php | 11 +- inc/ActionsI.class.php | 62 - inc/Api.class.php | 4 +- inc/Auth.class.php | 8 +- inc/Auth2FA.class.php | 73 +- inc/Base.php | 3 + inc/Cache.class.php | 2 + inc/Config.class.php | 417 ++---- inc/ConfigDB.class.php | 193 +++ inc/ConfigInterface.class.php | 84 ++ inc/Crypt.class.php | 17 +- inc/CryptMasterPass.class.php | 116 ++ inc/CryptPKI.class.php | 2 + inc/CsvImport.class.php | 6 +- inc/CustomFieldDef.class.php | 7 + inc/CustomFields.class.php | 6 + inc/CustomFieldsBase.class.php | 7 + inc/Email.class.php | 8 +- inc/ImportBase.class.php | 5 + inc/Init.class.php | 32 +- inc/Installer.class.php | 12 +- inc/Language.class.php | 2 +- inc/Migrate.class.php | 1 - inc/Minify.class.php | 5 + inc/{Common.class.php => Response.class.php} | 33 +- inc/SPException.class.php | 2 + inc/Session.class.php | 20 + inc/SessionUtil.class.php | 62 + inc/Template.class.php | 2 + inc/Upgrade.class.php | 6 +- inc/User.class.php | 17 +- inc/UserAccounts.class.php | 172 +++ inc/UserBase.class.php | 6 +- inc/UserLdap.class.php | 4 +- inc/UserMigrate.class.php | 129 ++ inc/UserPass.class.php | 166 +++ inc/UserPassRecover.class.php | 130 ++ inc/UserUtil.class.php | 445 ------ inc/Util.class.php | 9 +- inc/XmlExport.class.php | 2 + inc/XmlImportBase.class.php | 5 + inc/locales/en_US/LC_MESSAGES/messages.mo | Bin 71400 -> 71890 bytes inc/locales/en_US/LC_MESSAGES/messages.po | 1306 +++++++++--------- inc/themes/classic/account.inc | 2 +- inc/themes/classic/debug.inc | 9 +- inc/themes/classic/encryption.inc | 5 +- inc/themes/classic/eventlog.inc | 4 +- inc/themes/classic/import.inc | 5 +- inc/themes/material-blue/account.inc | 2 +- inc/themes/material-blue/debug.inc | 9 +- inc/themes/material-blue/encryption.inc | 5 +- inc/themes/material-blue/eventlog.inc | 3 +- inc/themes/material-blue/import.inc | 7 +- inc/themes/material-blue/preferences.inc | 1 - inc/themes/material-blue/users.inc | 4 +- index.php | 2 +- web/AccountC.class.php | 13 +- web/AccountsMgmtC.class.php | 11 +- web/ConfigC.class.php | 10 +- web/EventlogC.class.php | 10 +- web/MainC.class.php | 6 +- web/SearchC.class.php | 85 +- web/UsersMgmtC.class.php | 13 +- web/UsersPrefsC.class.php | 3 +- 86 files changed, 2526 insertions(+), 2005 deletions(-) delete mode 100644 inc/ActionsI.class.php create mode 100644 inc/ConfigDB.class.php create mode 100644 inc/ConfigInterface.class.php create mode 100644 inc/CryptMasterPass.class.php rename inc/{Common.class.php => Response.class.php} (74%) create mode 100644 inc/UserAccounts.class.php create mode 100644 inc/UserMigrate.class.php create mode 100644 inc/UserPass.class.php create mode 100644 inc/UserPassRecover.class.php diff --git a/CHANGELOG b/CHANGELOG index bdfbe29a..b37181af 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,14 @@ -=== ** v1.2.0.0-rc4 === +=== ** v1.2.0.05-rc5 === + +* [ADD] New classes to improve performance and code readability. +* [ADD] Security enhancement for master password in session. +* [MOD] Minor UI tweaks. +* [MOD] Improved config handling. +* [MOD] Code cleaning. +* [FIX] Accounts' main group were not set when the user hadn't enough privileges. +* [FIX] Accounts restoration didn't restore the account's main group. + +=== ** v1.2.0.04-rc4 === * [ADD] New copy-to-clipboard using only Javascript NO flash needed (gooood). * [ADD] New method to optimize/minimize CSS and JS files. @@ -21,18 +31,18 @@ * [FIX] Fixed issue while retrieving the public key when no session is active from Javascript to sign. * [FIX] Fixed language detection issue. -=== ** v1.2.0.0-rc3 === +=== ** v1.2.0.03-rc3 === * [ADD] New user preferences available * [MOD] CSS fonts are now stored locally for Material Blue theme -=== ** v1.2.0.0-rc2 === +=== ** v1.2.0.02-rc2 === * [ADD] Switched to BCRYPT for hashing passwords and key derivation. WARNING: Master password should be reentered by users (you can use a temporary password) * [MOD] Some tweaks on forms passwords decryption * [FIX] Fixed issue when blank custom fields are retrieved for an item. -=== ** v1.2.0.0-rc1 === +=== ** v1.2.0.01-rc1 === * [ADD] Security improvements preventing common threats (SQL Injection, XSS, CSRF) * [ADD] Fully MVC diff --git a/CHANGELOG-ES b/CHANGELOG-ES index 7066c45e..5a7e7900 100644 --- a/CHANGELOG-ES +++ b/CHANGELOG-ES @@ -1,4 +1,14 @@ -=== ** v1.2.0.0-rc4 === +=== ** v1.2.0.05-rc5 === + +* [ADD] Nuevas clases para mejorar el rendimiento y la legibilidad del código. +* [ADD] Mejora de seguridad para la gestión de la clave maestra de la sesión. +* [MOD] Ajustes visuales menores. +* [MOD] Mejorada la gestión de la configuración. +* [MOD] Limpieza de código. +* [FIX] Corregido error al guardar una cuenta en la que el usuario no tenía permisos para cambiar el grupo principal. +* [FIX] Corregido error al restaurar una cuenta donde el grupo principal no se restauraba. + +=== ** v1.2.0.04-rc4 === * [ADD] Nueva función para copiar al portapapeles SIN flash, sólo Javascript (biennnnn). * [ADD] Nuevo método para optimizar(/reducir los archivos CSS y JS. @@ -21,18 +31,18 @@ * [FIX] Corregido fallo al obtener la clave pública cuando no había una sesión iniciada. * [FIX] Corregido fallo en la nueva detección del lenguaje. -=== ** v1.2.0.0-rc3 === +=== ** v1.2.0.03-rc3 === * [ADD] Nuevas preferencias de usuario disponibles * [MOD] Las fuentes CSS son ahora almacenadas localmente para el tema Material Blue -=== ** v1.2.0.0-rc2 === +=== ** v1.2.0.02-rc2 === * [ADD] Cambiado a BCRYPT para generar el hash de las claves y derivaciones. AVISO: La clave maestra debe de ser introducida por los usuarios (es posible usar una clave temporal) * [MOD] Algunos ajustes en la desencriptación de claves de los formularios * [FIX] Corregido error cuando los campos personalizados en blanco son obtenidos para un elemento. -=== ** v1.2.0.0-rc1 === +=== ** v1.2.0.01-rc1 === * [ADD] Mejoras de seguridad para prevenir ataques comunes (SQL Injection, XSS, CSRF) * [ADD] Totalmente MVC diff --git a/ajax/ajax_2fa.php b/ajax/ajax_2fa.php index aad64ad8..b5b49f4c 100644 --- a/ajax/ajax_2fa.php +++ b/ajax/ajax_2fa.php @@ -23,6 +23,8 @@ * */ +use SP\SessionUtil; + define('APP_ROOT', '..'); require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Base.php'; @@ -31,8 +33,8 @@ SP\Request::checkReferer('POST'); $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } $userId = SP\Request::analyze('itemId', 0); @@ -52,8 +54,8 @@ if($userId && $pin && $twoFa->verifyKey($pin)){ $urlParams = isset($params) ? '?' . implode('&', $params) : ''; - SP\Common::printJSON(_('Código correcto'), 0, 'redirect(\'index.php\')'); + SP\Response::printJSON(_('Código correcto'), 0, 'redirect(\'index.php\')'); } else { \SP\Session::set2FApassed(false); - SP\Common::printJSON(_('Código incorrecto')); + SP\Response::printJSON(_('Código incorrecto')); } \ No newline at end of file diff --git a/ajax/ajax_accountSave.php b/ajax/ajax_accountSave.php index 0e205e78..14ac1401 100644 --- a/ajax/ajax_accountSave.php +++ b/ajax/ajax_accountSave.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\SessionUtil; define('APP_ROOT', '..'); @@ -32,13 +33,13 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } // Variables POST del formulario @@ -65,7 +66,7 @@ $customFields = SP\Request::analyze('customfield'); // Datos del Usuario $currentUserId = SP\Session::getUserId(); -if ($accountMainGroupId === 0) { +if (!$accountMainGroupId === 0) { $accountMainGroupId = SP\Session::getUserGroupId(); } @@ -74,42 +75,42 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_ACC_NEW ) { // Comprobaciones para nueva cuenta if (!$accountName) { - SP\Common::printJSON(_('Es necesario un nombre de cuenta')); + SP\Response::printJSON(_('Es necesario un nombre de cuenta')); } elseif (!$customerId && !$newCustomer) { - SP\Common::printJSON(_('Es necesario un nombre de cliente')); + SP\Response::printJSON(_('Es necesario un nombre de cliente')); } elseif (!$accountLogin) { - SP\Common::printJSON(_('Es necesario un usuario')); + SP\Response::printJSON(_('Es necesario un usuario')); } elseif (!$accountPassword || !$accountPasswordR) { - SP\Common::printJSON(_('Es necesaria una clave')); + SP\Response::printJSON(_('Es necesaria una clave')); } elseif (!$categoryId) { - SP\Common::printJSON(_('Es necesario una categoría')); + SP\Response::printJSON(_('Es necesario una categoría')); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_ACC_EDIT) { // Comprobaciones para modificación de cuenta if (!$customerId && !$newCustomer) { - SP\Common::printJSON(_('Es necesario un nombre de cliente')); + SP\Response::printJSON(_('Es necesario un nombre de cliente')); } elseif (!$accountName) { - SP\Common::printJSON(_('Es necesario un nombre de cuenta')); + SP\Response::printJSON(_('Es necesario un nombre de cuenta')); } elseif (!$accountLogin) { - SP\Common::printJSON(_('Es necesario un usuario')); + SP\Response::printJSON(_('Es necesario un usuario')); } elseif (!$categoryId) { - SP\Common::printJSON(_('Es necesario una categoría')); + SP\Response::printJSON(_('Es necesario una categoría')); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_ACC_DELETE) { if (!$accountId) { - SP\Common::printJSON(_('Id inválido')); + SP\Response::printJSON(_('Id inválido')); } } elseif ($actionId == \SP\Controller\ActionsInterface::ACTION_ACC_EDIT_PASS) { // Comprobaciones para modficación de clave if (!$accountPassword || !$accountPasswordR) { - SP\Common::printJSON(_('Es necesaria una clave')); + SP\Response::printJSON(_('Es necesaria una clave')); } } elseif ($actionId == \SP\Controller\ActionsInterface::ACTION_ACC_EDIT_RESTORE) { if (!$accountId) { - SP\Common::printJSON(_('Id inválido')); + SP\Response::printJSON(_('Id inválido')); } } else { - SP\Common::printJSON(_('Acción Inválida')); + SP\Response::printJSON(_('Acción Inválida')); } if ($actionId == \SP\Controller\ActionsInterface::ACTION_ACC_NEW @@ -117,14 +118,14 @@ if ($actionId == \SP\Controller\ActionsInterface::ACTION_ACC_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_ACC_EDIT_PASS ) { if ($accountPassword != $accountPasswordR) { - SP\Common::printJSON(_('Las claves no coinciden')); + SP\Response::printJSON(_('Las claves no coinciden')); } // Encriptar clave de cuenta try { $accountEncPass = SP\Crypt::encryptData($accountPassword); } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage()); + SP\Response::printJSON($e->getMessage()); } } @@ -141,7 +142,7 @@ switch ($actionId) { SP\Customer::addCustomer(); $customerId = SP\Customer::$customerLastId; } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage()); + SP\Response::printJSON($e->getMessage()); } } @@ -169,10 +170,10 @@ switch ($actionId) { } } - SP\Common::printJSON(_('Cuenta creada'), 0); + SP\Response::printJSON(_('Cuenta creada'), 0); } - SP\Common::printJSON(_('Error al crear la cuenta'), 0); + SP\Response::printJSON(_('Error al crear la cuenta'), 0); break; case \SP\Controller\ActionsInterface::ACTION_ACC_EDIT: SP\Customer::$customerName = $newCustomer; @@ -183,7 +184,7 @@ switch ($actionId) { SP\Customer::addCustomer(); $customerId = SP\Customer::$customerLastId; } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage()); + SP\Response::printJSON($e->getMessage()); } } @@ -207,7 +208,7 @@ switch ($actionId) { // Comprobar si han habido cambios if ($accountChangesHash == $Account->calcChangesHash()) { - SP\Common::printJSON(_('Sin cambios'), 0); + SP\Response::printJSON(_('Sin cambios'), 0); } // Actualizar cuenta @@ -219,20 +220,20 @@ switch ($actionId) { } } - SP\Common::printJSON(_('Cuenta actualizada'), 0); + SP\Response::printJSON(_('Cuenta actualizada'), 0); } - SP\Common::printJSON(_('Error al modificar la cuenta')); + SP\Response::printJSON(_('Error al modificar la cuenta')); break; case \SP\Controller\ActionsInterface::ACTION_ACC_DELETE: $Account->setAccountId($accountId); // Eliminar cuenta if ($Account->deleteAccount() && \SP\CustomFields::deleteCustomFieldForItem($accountId, \SP\Controller\ActionsInterface::ACTION_ACC_NEW)) { - SP\Common::printJSON(_('Cuenta eliminada'), 0, "sysPassUtil.Common.doAction('" . \SP\Controller\ActionsInterface::ACTION_ACC_SEARCH . "');"); + SP\Response::printJSON(_('Cuenta eliminada'), 0, "sysPassUtil.Common.doAction('" . \SP\Controller\ActionsInterface::ACTION_ACC_SEARCH . "');"); } - SP\Common::printJSON(_('Error al eliminar la cuenta')); + SP\Response::printJSON(_('Error al eliminar la cuenta')); break; case \SP\Controller\ActionsInterface::ACTION_ACC_EDIT_PASS: $Account->setAccountId($accountId); @@ -242,22 +243,22 @@ switch ($actionId) { // Actualizar clave de cuenta if ($Account->updateAccountPass()) { - SP\Common::printJSON(_('Clave actualizada'), 0); + SP\Response::printJSON(_('Clave actualizada'), 0); } - SP\Common::printJSON(_('Error al actualizar la clave')); + SP\Response::printJSON(_('Error al actualizar la clave')); break; case \SP\Controller\ActionsInterface::ACTION_ACC_EDIT_RESTORE: $Account->setAccountId(SP\AccountHistory::getAccountIdFromId($accountId)); $Account->setAccountUserEditId($currentUserId); if ($Account->restoreFromHistory($accountId)) { - SP\Common::printJSON(_('Cuenta restaurada'), 0); + SP\Response::printJSON(_('Cuenta restaurada'), 0); } - SP\Common::printJSON(_('Error al restaurar cuenta')); + SP\Response::printJSON(_('Error al restaurar cuenta')); break; default: - SP\Common::printJSON(_('Acción Inválida')); + SP\Response::printJSON(_('Acción Inválida')); } \ No newline at end of file diff --git a/ajax/ajax_appMgmtSave.php b/ajax/ajax_appMgmtSave.php index 46f27228..d70c207e 100644 --- a/ajax/ajax_appMgmtSave.php +++ b/ajax/ajax_appMgmtSave.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\SessionUtil; use SP\UserUtil; define('APP_ROOT', '..'); @@ -33,13 +34,13 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } @@ -82,33 +83,33 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_EDIT ) { if (!$User->getUserName() && !$isLdap) { - SP\Common::printJSON(_('Es necesario un nombre de usuario'), 2); + SP\Response::printJSON(_('Es necesario un nombre de usuario'), 2); } elseif (!$User->getUserLogin() && !$isLdap) { - SP\Common::printJSON(_('Es necesario un login'), 2); + SP\Response::printJSON(_('Es necesario un login'), 2); } elseif (!$User->getUserProfileId()) { - SP\Common::printJSON(_('Es necesario un perfil'), 2); + SP\Response::printJSON(_('Es necesario un perfil'), 2); } elseif (!$User->getUserGroupId()) { - SP\Common::printJSON(_('Es necesario un grupo'), 2); + SP\Response::printJSON(_('Es necesario un grupo'), 2); } elseif (!$User->getUserEmail() && !$isLdap) { - SP\Common::printJSON(_('Es necesario un email'), 2); + SP\Response::printJSON(_('Es necesario un email'), 2); } elseif (SP\Util::demoIsEnabled() && !\SP\Session::getUserIsAdminApp() && $User->getUserLogin() == 'demo') { - SP\Common::printJSON(_('Ey, esto es una DEMO!!')); + SP\Response::printJSON(_('Ey, esto es una DEMO!!')); } switch ($User->checkUserExist()) { case UserUtil::USER_LOGIN_EXIST: - SP\Common::printJSON(_('Login de usuario duplicado'), 2); + SP\Response::printJSON(_('Login de usuario duplicado'), 2); break; case UserUtil::USER_MAIL_EXIST: - SP\Common::printJSON(_('Email de usuario duplicado'), 2); + SP\Response::printJSON(_('Email de usuario duplicado'), 2); break; } if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW) { if (!$User->getUserPass() || !$userPassR) { - SP\Common::printJSON(_('La clave no puede estar en blanco'), 2); + SP\Response::printJSON(_('La clave no puede estar en blanco'), 2); } elseif ($User->getUserPass() != $userPassR) { - SP\Common::printJSON(_('Las claves no coinciden'), 2); + SP\Response::printJSON(_('Las claves no coinciden'), 2); } if ($User->addUser()) { @@ -119,10 +120,10 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW } } - SP\Common::printJSON(_('Usuario creado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Usuario creado'), 0, $doActionOnClose); } - SP\Common::printJSON(_('Error al crear el usuario')); + SP\Response::printJSON(_('Error al crear el usuario')); } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_EDIT) { if ($User->updateUser()) { if (is_array($customFields)) { @@ -132,40 +133,40 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW } } - SP\Common::printJSON(_('Usuario actualizado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Usuario actualizado'), 0, $doActionOnClose); } - SP\Common::printJSON(_('Error al actualizar el usuario')); + SP\Response::printJSON(_('Error al actualizar el usuario')); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_EDITPASS) { if (SP\Util::demoIsEnabled() && UserUtil::getUserLoginById($itemId) == 'demo') { - SP\Common::printJSON(_('Ey, esto es una DEMO!!')); + SP\Response::printJSON(_('Ey, esto es una DEMO!!')); } elseif (!$User->getUserPass() || !$userPassR) { - SP\Common::printJSON(_('La clave no puede estar en blanco'), 2); + SP\Response::printJSON(_('La clave no puede estar en blanco'), 2); } elseif ($User->getUserPass() != $userPassR) { - SP\Common::printJSON(_('Las claves no coinciden'), 2); + SP\Response::printJSON(_('Las claves no coinciden'), 2); } if ($User->updateUserPass()) { - SP\Common::printJSON(_('Clave actualizada'), 0); + SP\Response::printJSON(_('Clave actualizada'), 0); } - SP\Common::printJSON(_('Error al modificar la clave')); + SP\Response::printJSON(_('Error al modificar la clave')); // Eliminar usuario } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_DELETE) { if (SP\Util::demoIsEnabled() && UserUtil::getUserLoginById($itemId) == 'demo') { - SP\Common::printJSON(_('Ey, esto es una DEMO!!')); + SP\Response::printJSON(_('Ey, esto es una DEMO!!')); } elseif ($User->getUserId() == SP\Session::getUserId()) { - SP\Common::printJSON(_('No es posible eliminar, usuario en uso')); + SP\Response::printJSON(_('No es posible eliminar, usuario en uso')); } if ($User->deleteUser() && SP\CustomFields::deleteCustomFieldForItem($User->getUserId(), \SP\Controller\ActionsInterface::ACTION_USR_USERS)) { - SP\Common::printJSON(_('Usuario eliminado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Usuario eliminado'), 0, $doActionOnClose); } - SP\Common::printJSON(_('Error al eliminar el usuario')); + SP\Response::printJSON(_('Error al eliminar el usuario')); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_GROUPS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_USR_GROUPS_EDIT @@ -180,7 +181,7 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_USR_GROUPS_EDIT ) { if (!$frmGrpName) { - SP\Common::printJSON(_('Es necesario un nombre de grupo'), 2); + SP\Response::printJSON(_('Es necesario un nombre de grupo'), 2); } SP\Groups::$groupId = $itemId; @@ -188,7 +189,7 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW SP\Groups::$groupDescription = $frmGrpDesc; if (SP\Groups::checkGroupExist()) { - SP\Common::printJSON(_('Nombre de grupo duplicado'), 2); + SP\Response::printJSON(_('Nombre de grupo duplicado'), 2); } if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_GROUPS_NEW) { @@ -200,9 +201,9 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW } } - SP\Common::printJSON(_('Grupo creado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Grupo creado'), 0, $doActionOnClose); } else { - SP\Common::printJSON(_('Error al crear el grupo')); + SP\Response::printJSON(_('Error al crear el grupo')); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_GROUPS_EDIT) { if (SP\Groups::updateGroup($frmGrpUsers)) { @@ -213,10 +214,10 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW } } - SP\Common::printJSON(_('Grupo actualizado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Grupo actualizado'), 0, $doActionOnClose); } - SP\Common::printJSON(_('Error al actualizar el grupo')); + SP\Response::printJSON(_('Error al actualizar el grupo')); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_GROUPS_DELETE) { SP\Groups::$groupId = $itemId; @@ -232,15 +233,15 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW $uses[] = _('Cuentas') . " (" . $resGroupUse['accounts'] . ")"; } - SP\Common::printJSON(_('No es posible eliminar') . ';;' . _('Grupo en uso por:') . ';;' . implode(';;', $uses)); + SP\Response::printJSON(_('No es posible eliminar') . ';;' . _('Grupo en uso por:') . ';;' . implode(';;', $uses)); } else { $groupName = SP\Groups::getGroupNameById($itemId); if (SP\Groups::deleteGroup() && SP\CustomFields::deleteCustomFieldForItem($itemId, \SP\Controller\ActionsInterface::ACTION_USR_GROUPS)) { - SP\Common::printJSON(_('Grupo eliminado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Grupo eliminado'), 0, $doActionOnClose); } - SP\Common::printJSON(_('Error al eliminar el grupo')); + SP\Response::printJSON(_('Error al eliminar el grupo')); } } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_PROFILES_NEW @@ -279,23 +280,23 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_USR_PROFILES_EDIT ) { if (!$Profile->getName()) { - SP\Common::printJSON(_('Es necesario un nombre de perfil'), 2); + SP\Response::printJSON(_('Es necesario un nombre de perfil'), 2); } elseif (SP\Profile::checkProfileExist($Profile->getId(), $Profile->getName())) { - SP\Common::printJSON(_('Nombre de perfil duplicado'), 2); + SP\Response::printJSON(_('Nombre de perfil duplicado'), 2); } if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_PROFILES_NEW) { if ($Profile->profileAdd()) { - SP\Common::printJSON(_('Perfil creado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Perfil creado'), 0, $doActionOnClose); } - SP\Common::printJSON(_('Error al crear el perfil')); + SP\Response::printJSON(_('Error al crear el perfil')); } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_PROFILES_EDIT) { if ($Profile->profileUpdate()) { - SP\Common::printJSON(_('Perfil actualizado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Perfil actualizado'), 0, $doActionOnClose); } - SP\Common::printJSON(_('Error al actualizar el perfil')); + SP\Response::printJSON(_('Error al actualizar el perfil')); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_PROFILES_DELETE) { @@ -304,13 +305,13 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW if ($resProfileUse['users'] > 0) { $uses[] = _('Usuarios') . " (" . $resProfileUse['users'] . ")"; - SP\Common::printJSON(_('No es posible eliminar') . ';;' . _('Perfil en uso por:') . ';;' . implode(';;', $uses)); + SP\Response::printJSON(_('No es posible eliminar') . ';;' . _('Perfil en uso por:') . ';;' . implode(';;', $uses)); } else { if ($Profile->profileDelete()) { - SP\Common::printJSON(_('Perfil eliminado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Perfil eliminado'), 0, $doActionOnClose); } - SP\Common::printJSON(_('Error al eliminar el perfil')); + SP\Response::printJSON(_('Error al eliminar el perfil')); } } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMERS_NEW @@ -325,7 +326,7 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMERS_EDIT ) { if (!$frmCustomerName) { - SP\Common::printJSON(_('Es necesario un nombre de cliente'), 2); + SP\Response::printJSON(_('Es necesario un nombre de cliente'), 2); } SP\Customer::$customerName = $frmCustomerName; @@ -342,10 +343,10 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW } } } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Cliente creado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Cliente creado'), 0, $doActionOnClose); } else if ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMERS_EDIT) { try { SP\Customer::updateCustomer($itemId); @@ -357,20 +358,20 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW } } } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Cliente actualizado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Cliente actualizado'), 0, $doActionOnClose); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMERS_DELETE) { try { SP\Customer::deleteCustomer($itemId); SP\CustomFields::deleteCustomFieldForItem($itemId, \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMERS); } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage()); + SP\Response::printJSON($e->getMessage()); } - SP\Common::printJSON(_('Cliente eliminado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Cliente eliminado'), 0, $doActionOnClose); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CATEGORIES_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CATEGORIES_EDIT @@ -384,7 +385,7 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CATEGORIES_EDIT ) { if (!$frmCategoryName) { - SP\Common::printJSON(_('Es necesario un nombre de categoría'), 2); + SP\Response::printJSON(_('Es necesario un nombre de categoría'), 2); } SP\Category::$categoryName = $frmCategoryName; @@ -401,10 +402,10 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW } } } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Categoría creada'), 0, $doActionOnClose); + SP\Response::printJSON(_('Categoría creada'), 0, $doActionOnClose); } else if ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CATEGORIES_EDIT) { try { SP\Category::updateCategory($itemId); @@ -416,10 +417,10 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW } } } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Categoría actualizada'), 0, $doActionOnClose); + SP\Response::printJSON(_('Categoría actualizada'), 0, $doActionOnClose); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CATEGORIES_DELETE) { @@ -427,10 +428,10 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW SP\Category::deleteCategory($itemId); SP\CustomFields::deleteCustomFieldForItem($itemId, \SP\Controller\ActionsInterface::ACTION_MGM_CATEGORIES); } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage()); + SP\Response::printJSON($e->getMessage()); } - SP\Common::printJSON(_('Categoría eliminada'), 0, $doActionOnClose); + SP\Response::printJSON(_('Categoría eliminada'), 0, $doActionOnClose); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_APITOKENS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_MGM_APITOKENS_EDIT @@ -446,35 +447,35 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_MGM_APITOKENS_EDIT ) { if ($ApiTokens->getUserId() === 0 || $ApiTokens->getActionId() === 0) { - SP\Common::printJSON(_('Usuario o acción no indicado'), 2); + SP\Response::printJSON(_('Usuario o acción no indicado'), 2); } if ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_APITOKENS_NEW) { try { $ApiTokens->addToken(); } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Autorización creada'), 0, $doActionOnClose); + SP\Response::printJSON(_('Autorización creada'), 0, $doActionOnClose); } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_APITOKENS_EDIT) { try { $ApiTokens->updateToken(); } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Autorización actualizada'), 0, $doActionOnClose); + SP\Response::printJSON(_('Autorización actualizada'), 0, $doActionOnClose); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_APITOKENS_DELETE) { try { $ApiTokens->deleteToken(); } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Autorización eliminada'), 0, $doActionOnClose); + SP\Response::printJSON(_('Autorización eliminada'), 0, $doActionOnClose); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMFIELDS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMFIELDS_EDIT @@ -491,11 +492,11 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW || $actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMFIELDS_EDIT ) { if (!$frmFieldName) { - SP\Common::printJSON(_('Nombre del campo no indicado'), 2); + SP\Response::printJSON(_('Nombre del campo no indicado'), 2); } elseif ($frmFieldType === 0) { - SP\Common::printJSON(_('Tipo del campo no indicado'), 2); + SP\Response::printJSON(_('Tipo del campo no indicado'), 2); } elseif ($frmFieldModule === 0) { - SP\Common::printJSON(_('Módulo del campo no indicado'), 2); + SP\Response::printJSON(_('Módulo del campo no indicado'), 2); } $CustomFieldDef = new \SP\CustomFieldDef($frmFieldName, $frmFieldType, $frmFieldModule); @@ -506,30 +507,30 @@ if ($actionId === \SP\Controller\ActionsInterface::ACTION_USR_USERS_NEW try { $CustomFieldDef->addCustomField(); } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Campo creado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Campo creado'), 0, $doActionOnClose); } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMFIELDS_EDIT) { try { $CustomFieldDef->setId($itemId); $CustomFieldDef->updateCustomField(); } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Campo actualizado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Campo actualizado'), 0, $doActionOnClose); } } elseif ($actionId === \SP\Controller\ActionsInterface::ACTION_MGM_CUSTOMFIELDS_DELETE) { try { \SP\CustomFieldDef::deleteCustomField($itemId); } catch (\SP\SPException $e) { - SP\Common::printJSON($e->getMessage(), 2); + SP\Response::printJSON($e->getMessage(), 2); } - SP\Common::printJSON(_('Campo eliminado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Campo eliminado'), 0, $doActionOnClose); } } else { - SP\Common::printJSON(_('Acción Inválida')); + SP\Response::printJSON(_('Acción Inválida')); } \ No newline at end of file diff --git a/ajax/ajax_backup.php b/ajax/ajax_backup.php index 5d4cd853..7e65e8c3 100644 --- a/ajax/ajax_backup.php +++ b/ajax/ajax_backup.php @@ -23,6 +23,8 @@ * */ +use SP\SessionUtil; + define('APP_ROOT', '..'); require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Base.php'; @@ -30,13 +32,13 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas SP\Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } $actionId = SP\Request::analyze('actionId', 0); @@ -48,27 +50,31 @@ $exportPasswordR = SP\Request::analyzeEncrypted('exportPwdR'); $doActionOnClose = "sysPassUtil.Common.doAction($actionId,'',$activeTab);"; if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_BACKUP) { + if (SP\Util::demoIsEnabled()) { + SP\Response::printJSON(_('Ey, esto es una DEMO!!')); + } + if (!SP\Backup::doBackup()) { SP\Log::writeNewLogAndEmail(_('Realizar Backup'), _('Error al realizar el backup')); - SP\Common::printJSON(_('Error al realizar el backup') . ';;' . _('Revise el registro de eventos para más detalles')); + SP\Response::printJSON(_('Error al realizar el backup') . ';;' . _('Revise el registro de eventos para más detalles')); } SP\Log::writeNewLogAndEmail(_('Realizar Backup'), _('Copia de la aplicación y base de datos realizada correctamente')); - SP\Common::printJSON(_('Proceso de backup finalizado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Proceso de backup finalizado'), 0, $doActionOnClose); } elseif ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_EXPORT) { if (!empty($exportPassword) && $exportPassword !== $exportPasswordR){ - SP\Common::printJSON(_('Las claves no coinciden')); + SP\Response::printJSON(_('Las claves no coinciden')); } if(!\SP\XmlExport::doExport($exportPassword)){ SP\Log::writeNewLogAndEmail(_('Realizar Exportación'), _('Error al realizar la exportación de cuentas')); - SP\Common::printJSON(_('Error al realizar la exportación') . ';;' . _('Revise el registro de eventos para más detalles')); + SP\Response::printJSON(_('Error al realizar la exportación') . ';;' . _('Revise el registro de eventos para más detalles')); } SP\Log::writeNewLogAndEmail(_('Realizar Exportación'), _('Exportación de cuentas realizada correctamente')); - SP\Common::printJSON(_('Proceso de exportación finalizado'), 0, $doActionOnClose); + SP\Response::printJSON(_('Proceso de exportación finalizado'), 0, $doActionOnClose); } \ No newline at end of file diff --git a/ajax/ajax_checkLdap.php b/ajax/ajax_checkLdap.php index b5d39010..881cd3ad 100644 --- a/ajax/ajax_checkLdap.php +++ b/ajax/ajax_checkLdap.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\SessionUtil; define('APP_ROOT', '..'); @@ -32,13 +33,13 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } $frmLdapServer = SP\Request::analyze('ldap_server'); @@ -48,13 +49,13 @@ $frmLdapBindUser = SP\Request::analyze('ldap_binduser'); $frmLdapBindPass = SP\Request::analyzeEncrypted('ldap_bindpass'); if (!$frmLdapServer || !$frmLdapBase || !$frmLdapBindUser || !$frmLdapBindPass) { - SP\Common::printJSON(_('Los parámetros de LDAP no están configurados')); + SP\Response::printJSON(_('Los parámetros de LDAP no están configurados')); } $resCheckLdap = SP\Ldap::checkLDAPConn($frmLdapServer, $frmLdapBindUser, $frmLdapBindPass, $frmLdapBase, $frmLdapGroup); if ($resCheckLdap === false) { - SP\Common::printJSON(_('Error de conexión a LDAP') . ';;' . _('Revise el registro de eventos para más detalles')); + SP\Response::printJSON(_('Error de conexión a LDAP') . ';;' . _('Revise el registro de eventos para más detalles')); } else { - SP\Common::printJSON(_('Conexión a LDAP correcta') . ';;' . _('Objetos encontrados') . ': ' . $resCheckLdap, 0); + SP\Response::printJSON(_('Conexión a LDAP correcta') . ';;' . _('Objetos encontrados') . ': ' . $resCheckLdap, 0); } \ No newline at end of file diff --git a/ajax/ajax_configSave.php b/ajax/ajax_configSave.php index f135e85f..b2b238b7 100644 --- a/ajax/ajax_configSave.php +++ b/ajax/ajax_configSave.php @@ -23,7 +23,10 @@ * */ -use SP\UserUtil; +use SP\ConfigDB; +use SP\CryptMasterPass; +use SP\SessionUtil; +use SP\UserPass; define('APP_ROOT', '..'); @@ -32,13 +35,13 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas SP\Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } // Variables POST del formulario @@ -52,7 +55,7 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL || $actionId === SP\Controller\ActionsInterface::ACTION_CFG_LDAP || $actionId === SP\Controller\ActionsInterface::ACTION_CFG_MAIL ) { - $log = SP\Log::newLog(_('Modificar Configuración')); + $Log = SP\Log::newLog(_('Modificar Configuración')); if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL) { // General @@ -66,15 +69,15 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL $checkUpdatesEnabled = SP\Request::analyze('updates', false, false, true); $checkNoticesEnabled = SP\Request::analyze('notices', false, false, true); - SP\Config::setValue('sitelang', $siteLang); - SP\Config::setValue('sitetheme', $siteTheme); - SP\Config::setValue('session_timeout', $sessionTimeout); - SP\Config::setValue('https_enabled', $httpsEnabled); - SP\Config::setValue('log_enabled', $logEnabled); - SP\Config::setValue('debug', $debugEnabled); - SP\Config::setValue('maintenance', $maintenanceEnabled); - SP\Config::setValue('checkupdates', $checkUpdatesEnabled); - SP\Config::setValue('checknotices', $checkNoticesEnabled); + SP\Config::setCacheConfigValue('sitelang', $siteLang); + SP\Config::setCacheConfigValue('sitetheme', $siteTheme); + SP\Config::setCacheConfigValue('session_timeout', $sessionTimeout); + SP\Config::setCacheConfigValue('https_enabled', $httpsEnabled); + SP\Config::setCacheConfigValue('log_enabled', $logEnabled); + SP\Config::setCacheConfigValue('debug', $debugEnabled); + SP\Config::setCacheConfigValue('maintenance', $maintenanceEnabled); + SP\Config::setCacheConfigValue('checkupdates', $checkUpdatesEnabled); + SP\Config::setCacheConfigValue('checknotices', $checkNoticesEnabled); // Accounts $globalSearchEnabled = SP\Request::analyze('globalsearch', false, false, true); @@ -83,23 +86,23 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL $accountCount = SP\Request::analyze('account_count', 10); $resultsAsCardsEnabled = SP\Request::analyze('resultsascards', false, false, true); - SP\Config::setValue('globalsearch', $globalSearchEnabled); - SP\Config::setValue('account_passtoimage', $accountPassToImageEnabled); - SP\Config::setValue('account_link', $accountLinkEnabled); - SP\Config::setValue('account_count', $accountCount); - SP\Config::setValue('resultsascards', $resultsAsCardsEnabled); + SP\Config::setCacheConfigValue('globalsearch', $globalSearchEnabled); + SP\Config::setCacheConfigValue('account_passtoimage', $accountPassToImageEnabled); + SP\Config::setCacheConfigValue('account_link', $accountLinkEnabled); + SP\Config::setCacheConfigValue('account_count', $accountCount); + SP\Config::setCacheConfigValue('resultsascards', $resultsAsCardsEnabled); // Files $filesEnabled = SP\Request::analyze('files_enabled', false, false, true); $filesAllowedSize = SP\Request::analyze('files_allowed_size', 1024); $filesAllowedExts = SP\Request::analyze('files_allowed_exts'); - SP\Config::setValue('files_enabled', $filesEnabled); - SP\Config::setValue('files_allowed_size', $filesAllowedSize); - SP\Config::setValue('files_allowed_exts', $filesAllowedExts); + SP\Config::setCacheConfigValue('files_enabled', $filesEnabled); + SP\Config::setCacheConfigValue('files_allowed_size', $filesAllowedSize); + SP\Config::setCacheConfigValue('files_allowed_exts', $filesAllowedExts); if ($filesEnabled && $filesAllowedSize >= 16384) { - SP\Common::printJSON(_('El tamaño máximo por archivo es de 16MB')); + SP\Response::printJSON(_('El tamaño máximo por archivo es de 16MB')); } // Proxy @@ -112,18 +115,22 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL // Valores para Proxy if ($proxyEnabled && (!$proxyServer || !$proxyPort)) { - SP\Common::printJSON(_('Faltan parámetros de Proxy')); + SP\Response::printJSON(_('Faltan parámetros de Proxy')); } elseif ($proxyEnabled) { - SP\Config::setValue('proxy_enabled', true); - SP\Config::setValue('proxy_server', $proxyServer); - SP\Config::setValue('proxy_port', $proxyPort); - SP\Config::setValue('proxy_user', $proxyUser); - SP\Config::setValue('proxy_pass', $proxyPass); + SP\Config::setCacheConfigValue('proxy_enabled', true); + SP\Config::setCacheConfigValue('proxy_server', $proxyServer); + SP\Config::setCacheConfigValue('proxy_port', $proxyPort); + SP\Config::setCacheConfigValue('proxy_user', $proxyUser); + SP\Config::setCacheConfigValue('proxy_pass', $proxyPass); + + $Log->addDescription(_('Proxy habiltado')); } else { - SP\Config::setValue('proxy_enabled', false); + SP\Config::setCacheConfigValue('proxy_enabled', false); + + $Log->addDescription(_('Proxy deshabilitado')); } - $log->addDescription(sprintf('%s: %s', _('Sección'), _('General'))); + $Log->addDescription(sprintf('%s: %s', _('Sección'), _('General'))); } elseif ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_WIKI) { // Wiki $wikiEnabled = SP\Request::analyze('wiki_enabled', false, false, true); @@ -133,17 +140,21 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL // Valores para la conexión a la Wiki if ($wikiEnabled && (!$wikiSearchUrl || !$wikiPageUrl || !$wikiFilter)) { - SP\Common::printJSON(_('Faltan parámetros de Wiki')); + SP\Response::printJSON(_('Faltan parámetros de Wiki')); } elseif ($wikiEnabled) { - SP\Config::setValue('wiki_enabled', true); - SP\Config::setValue('wiki_searchurl', $wikiSearchUrl); - SP\Config::setValue('wiki_pageurl', $wikiPageUrl); - SP\Config::setValue('wiki_filter', $wikiFilter); + SP\Config::setCacheConfigValue('wiki_enabled', true); + SP\Config::setCacheConfigValue('wiki_searchurl', $wikiSearchUrl); + SP\Config::setCacheConfigValue('wiki_pageurl', $wikiPageUrl); + SP\Config::setCacheConfigValue('wiki_filter', $wikiFilter); + + $Log->addDescription(_('Wiki habiltada')); } else { - SP\Config::setValue('wiki_enabled', false); + SP\Config::setCacheConfigValue('wiki_enabled', false); + + $Log->addDescription(_('Wiki deshabilitada')); } - $log->addDescription(sprintf('%s: %s', _('Sección'), _('Wiki'))); + $Log->addDescription(sprintf('%s: %s', _('Sección'), _('Wiki'))); } elseif ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_LDAP) { // LDAP $ldapEnabled = SP\Request::analyze('ldap_enabled', false, false, true); @@ -158,22 +169,26 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL // Valores para la configuración de LDAP if ($ldapEnabled && (!$ldapServer || !$ldapBase || !$ldapBindUser)) { - SP\Common::printJSON(_('Faltan parámetros de LDAP')); + SP\Response::printJSON(_('Faltan parámetros de LDAP')); } elseif ($ldapEnabled) { - SP\Config::setValue('ldap_enabled', true); - SP\Config::setValue('ldap_ads', $ldapADSEnabled); - SP\Config::setValue('ldap_server', $ldapServer); - SP\Config::setValue('ldap_base', $ldapBase); - SP\Config::setValue('ldap_group', $ldapGroup); - SP\Config::setValue('ldap_defaultgroup', $ldapDefaultGroup); - SP\Config::setValue('ldap_defaultprofile', $ldapDefaultProfile); - SP\Config::setValue('ldap_binduser', $ldapBindUser); - SP\Config::setValue('ldap_bindpass', $ldapBindPass); + SP\Config::setCacheConfigValue('ldap_enabled', true); + SP\Config::setCacheConfigValue('ldap_ads', $ldapADSEnabled); + SP\Config::setCacheConfigValue('ldap_server', $ldapServer); + SP\Config::setCacheConfigValue('ldap_base', $ldapBase); + SP\Config::setCacheConfigValue('ldap_group', $ldapGroup); + SP\Config::setCacheConfigValue('ldap_defaultgroup', $ldapDefaultGroup); + SP\Config::setCacheConfigValue('ldap_defaultprofile', $ldapDefaultProfile); + SP\Config::setCacheConfigValue('ldap_binduser', $ldapBindUser); + SP\Config::setCacheConfigValue('ldap_bindpass', $ldapBindPass); + + $Log->addDescription(_('LDAP habiltado')); } else { - SP\Config::setValue('ldap_enabled', false); + SP\Config::setCacheConfigValue('ldap_enabled', false); + + $Log->addDescription(_('LDAP deshabilitado')); } - $log->addDescription(sprintf('%s: %s', _('Sección'), _('LDAP'))); + $Log->addDescription(sprintf('%s: %s', _('Sección'), _('LDAP'))); } elseif ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_MAIL) { // Mail $mailEnabled = SP\Request::analyze('mail_enabled', false, false, true); @@ -188,39 +203,53 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL // Valores para la configuración del Correo if ($mailEnabled && (!$mailServer || !$mailFrom)) { - SP\Common::printJSON(_('Faltan parámetros de Correo')); + SP\Response::printJSON(_('Faltan parámetros de Correo')); } elseif ($mailEnabled) { - SP\Config::setValue('mail_enabled', true); - SP\Config::setValue('mail_requestsenabled', $mailRequests); - SP\Config::setValue('mail_server', $mailServer); - SP\Config::setValue('mail_port', $mailPort); - SP\Config::setValue('mail_security', $mailSecurity); - SP\Config::setValue('mail_from', $mailFrom); + SP\Config::setCacheConfigValue('mail_enabled', true); + SP\Config::setCacheConfigValue('mail_requestsenabled', $mailRequests); + SP\Config::setCacheConfigValue('mail_server', $mailServer); + SP\Config::setCacheConfigValue('mail_port', $mailPort); + SP\Config::setCacheConfigValue('mail_security', $mailSecurity); + SP\Config::setCacheConfigValue('mail_from', $mailFrom); if ($mailAuth) { - SP\Config::setValue('mail_authenabled', $mailAuth); - SP\Config::setValue('mail_user', $mailUser); - SP\Config::setValue('mail_pass', $mailPass); + SP\Config::setCacheConfigValue('mail_authenabled', $mailAuth); + SP\Config::setCacheConfigValue('mail_user', $mailUser); + SP\Config::setCacheConfigValue('mail_pass', $mailPass); } + + $Log->addDescription(_('Correo habiltado')); } else { - SP\Config::setValue('mail_enabled', false); - SP\Config::setValue('mail_requestsenabled', false); - SP\Config::setValue('mail_authenabled', false); + SP\Config::setCacheConfigValue('mail_enabled', false); + SP\Config::setCacheConfigValue('mail_requestsenabled', false); + SP\Config::setCacheConfigValue('mail_authenabled', false); + + $Log->addDescription(_('Correo deshabilitado')); } - $log->addDescription(sprintf('%s: %s', _('Sección'), _('Correo'))); + $Log->addDescription(sprintf('%s: %s', _('Sección'), _('Correo'))); } - $log->writeLog(); + try { + SP\Config::writeConfig(); + } catch (\SP\SPException $e){ + $Log->addDescription($e->getMessage()); + $Log->addDescription($e->getHint()); + $Log->writeLog(); - SP\Email::sendEmail($log); + SP\Response::printJSON($e->getMessage()); + } + + $Log->writeLog(); + + SP\Email::sendEmail($Log); if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL) { // Recargar la aplicación completa para establecer nuevos valores SP\Util::reload(); } - SP\Common::printJSON(_('Configuración actualizada'), 0, $doActionOnClose); + SP\Response::printJSON(_('Configuración actualizada'), 0, $doActionOnClose); } elseif ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_ENCRYPTION) { $currentMasterPass = SP\Request::analyzeEncrypted('curMasterPwd'); $newMasterPass = SP\Request::analyzeEncrypted('newMasterPwd'); @@ -228,20 +257,20 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL $confirmPassChange = SP\Request::analyze('confirmPassChange', 0, false, 1); $noAccountPassChange = SP\Request::analyze('chkNoAccountChange', 0, false, 1); - if (!UserUtil::checkUserUpdateMPass()) { - SP\Common::printJSON(_('Clave maestra actualizada') . ';;' . _('Reinicie la sesión para cambiarla')); + if (!UserPass::checkUserUpdateMPass()) { + SP\Response::printJSON(_('Clave maestra actualizada') . ';;' . _('Reinicie la sesión para cambiarla')); } elseif ($newMasterPass == '' && $currentMasterPass == '') { - SP\Common::printJSON(_('Clave maestra no indicada')); + SP\Response::printJSON(_('Clave maestra no indicada')); } elseif ($confirmPassChange == 0) { - SP\Common::printJSON(_('Se ha de confirmar el cambio de clave')); + SP\Response::printJSON(_('Se ha de confirmar el cambio de clave')); } if ($newMasterPass == $currentMasterPass) { - SP\Common::printJSON(_('Las claves son idénticas')); + SP\Response::printJSON(_('Las claves son idénticas')); } elseif ($newMasterPass != $newMasterPassR) { - SP\Common::printJSON(_('Las claves maestras no coinciden')); - } elseif (!SP\Crypt::checkHashPass($currentMasterPass, SP\Config::getConfigDbValue('masterPwd'), true)) { - SP\Common::printJSON(_('La clave maestra actual no coincide')); + SP\Response::printJSON(_('Las claves maestras no coinciden')); + } elseif (!SP\Crypt::checkHashPass($currentMasterPass, ConfigDB::getValue('masterPwd'), true)) { + SP\Response::printJSON(_('La clave maestra actual no coincide')); } $hashMPass = SP\Crypt::mkHashPassword($newMasterPass); @@ -250,45 +279,47 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_GENERAL $Account = new SP\Account(); if (!$Account->updateAccountsMasterPass($currentMasterPass, $newMasterPass)) { - SP\Common::printJSON(_('Errores al actualizar las claves de las cuentas')); + SP\Response::printJSON(_('Errores al actualizar las claves de las cuentas')); } $AccountHistory = new SP\AccountHistory(); if (!$AccountHistory->updateAccountsMasterPass($currentMasterPass, $newMasterPass, $hashMPass)) { - SP\Common::printJSON(_('Errores al actualizar las claves de las cuentas del histórico')); + SP\Response::printJSON(_('Errores al actualizar las claves de las cuentas del histórico')); } if (!\SP\CustomFields::updateCustomFieldsCrypt($currentMasterPass, $newMasterPass)) { - SP\Common::printJSON(_('Errores al actualizar datos de campos personalizados')); + SP\Response::printJSON(_('Errores al actualizar datos de campos personalizados')); } } if (SP\Util::demoIsEnabled()) { - SP\Common::printJSON(_('Ey, esto es una DEMO!!')); + SP\Response::printJSON(_('Ey, esto es una DEMO!!')); } - SP\Config::getConfigDb(); - SP\Config::setArrConfigValue('masterPwd', $hashMPass); - SP\Config::setArrConfigValue('lastupdatempass', time()); +// ConfigDB::readConfig(); + ConfigDB::setCacheConfigValue('masterPwd', $hashMPass); + ConfigDB::setCacheConfigValue('lastupdatempass', time()); - if (SP\Config::writeConfigDb()) { + if (ConfigDB::writeConfig()) { SP\Log::writeNewLogAndEmail(_('Actualizar Clave Maestra')); - SP\Common::printJSON(_('Clave maestra actualizada'), 0); + SP\Response::printJSON(_('Clave maestra actualizada'), 0); } else { - SP\Common::printJSON(_('Error al guardar el hash de la clave maestra')); + SP\Response::printJSON(_('Error al guardar el hash de la clave maestra')); } } elseif ($actionId === SP\Controller\ActionsInterface::ACTION_CFG_ENCRYPTION_TEMPPASS) { $tempMasterMaxTime = SP\Request::analyze('tmpass_maxtime', 3600); - $tempMasterPass = SP\Config::setTempMasterPass($tempMasterMaxTime); + $tempMasterPass = CryptMasterPass::setTempMasterPass($tempMasterMaxTime); - if (!empty($tempMasterPass)) { + if ($tempMasterPass !== false && !empty($tempMasterPass)) { SP\Email::sendEmail(new \SP\Log(_('Generar Clave Temporal'), SP\Html::strongText(_('Clave') . ': ') . $tempMasterPass)); - SP\Common::printJSON(_('Clave Temporal Generada'), 0, $doActionOnClose); + SP\Response::printJSON(_('Clave Temporal Generada'), 0, $doActionOnClose); + } else { + SP\Response::printJSON(_('Error al generar clave temporal')); } } else { - SP\Common::printJSON(_('Acción Inválida')); + SP\Response::printJSON(_('Acción Inválida')); } \ No newline at end of file diff --git a/ajax/ajax_doLogin.php b/ajax/ajax_doLogin.php index 01c1885d..3b9d003c 100644 --- a/ajax/ajax_doLogin.php +++ b/ajax/ajax_doLogin.php @@ -23,9 +23,12 @@ * */ +use SP\CryptMasterPass; use SP\Request; use SP\SessionUtil; use SP\UserLdap; +use SP\UserPass; +use SP\UserPassRecover; use SP\UserUtil; define('APP_ROOT', '..'); @@ -43,7 +46,7 @@ $userPass = SP\Request::analyzeEncrypted('pass'); $masterPass = SP\Request::analyzeEncrypted('mpass'); if (!$userLogin || !$userPass) { - SP\Common::printJSON(_('Usuario/Clave no introducidos')); + SP\Response::printJSON(_('Usuario/Clave no introducidos')); } $User = new SP\User(); @@ -69,7 +72,7 @@ if ($resLdap === true) { $Log->addDescription(_('Error al guardar los datos de LDAP')); $Log->writeLog(); - SP\Common::printJSON(_('Error interno')); + SP\Response::printJSON(_('Error interno')); } } else { // Actualizamos la clave del usuario en MySQL @@ -77,7 +80,7 @@ if ($resLdap === true) { $Log->addDescription(_('Error al actualizar la clave del usuario en la BBDD')); $Log->writeLog(); - SP\Common::printJSON(_('Error interno')); + SP\Response::printJSON(_('Error interno')); } } } else if ($resLdap == 49) { @@ -86,21 +89,21 @@ if ($resLdap === true) { $Log->addDescription(_('Usuario') . ": " . $userLogin); $Log->writeLog(); - SP\Common::printJSON(_('Usuario/Clave incorrectos')); + SP\Response::printJSON(_('Usuario/Clave incorrectos')); } else if ($resLdap === 701) { $Log->addDescription('(LDAP)'); $Log->addDescription(_('Cuenta expirada')); $Log->addDescription(_('Usuario') . ": " . $userLogin); $Log->writeLog(); - SP\Common::printJSON(_('Cuenta expirada')); + SP\Response::printJSON(_('Cuenta expirada')); } else if ($resLdap === 702) { $Log->addDescription('(LDAP)'); $Log->addDescription(_('El usuario no tiene grupos asociados')); $Log->addDescription(_('Usuario') . ": " . $userLogin); $Log->writeLog(); - SP\Common::printJSON(_('Usuario/Clave incorrectos')); + SP\Response::printJSON(_('Usuario/Clave incorrectos')); } else { // Autentificamos por MySQL (ha fallado LDAP) $Log->resetDescription(); $Log->addDescription('(MySQL)'); @@ -111,7 +114,7 @@ if ($resLdap === true) { $Log->addDescription(_('Usuario') . ": " . $userLogin); $Log->writeLog(); - SP\Common::printJSON(_('Usuario/Clave incorrectos')); + SP\Response::printJSON(_('Usuario/Clave incorrectos')); } } @@ -121,7 +124,7 @@ if (UserUtil::checkUserIsDisabled($userLogin)) { $Log->addDescription(_('Usuario') . ": " . $userLogin); $Log->writeLog(); - SP\Common::printJSON(_('Usuario deshabilitado')); + SP\Response::printJSON(_('Usuario deshabilitado')); } // Obtenemos los datos del usuario @@ -129,24 +132,24 @@ if (!$User->getUserInfo()) { $Log->addDescription(_('Error al obtener los datos del usuario de la BBDD')); $Log->writeLog(); - SP\Common::printJSON(_('Error interno')); + SP\Response::printJSON(_('Error interno')); } // Comprobamos que la clave maestra del usuario es correcta y está actualizada if (!$masterPass - && (!UserUtil::checkUserMPass($User) || !UserUtil::checkUserUpdateMPass($userLogin)) + && (!UserPass::checkUserMPass($User) || !UserPass::checkUserUpdateMPass($userLogin)) ) { - SP\Common::printJSON(_('La clave maestra no ha sido guardada o es incorrecta'), 3); + SP\Response::printJSON(_('La clave maestra no ha sido guardada o es incorrecta'), 3); } elseif ($masterPass) { - if (SP\Config::checkTempMasterPass($masterPass)) { - $masterPass = SP\Config::getTempMasterPass($masterPass); + if (CryptMasterPass::checkTempMasterPass($masterPass)) { + $masterPass = CryptMasterPass::getTempMasterPass($masterPass); } if (!$User->updateUserMPass($masterPass)) { $Log->addDescription(_('Clave maestra incorrecta')); $Log->writeLog(); - SP\Common::printJSON(_('Clave maestra incorrecta'), 4); + SP\Response::printJSON(_('Clave maestra incorrecta'), 4); } } @@ -154,9 +157,9 @@ if (!$masterPass if ($User->isUserChangePass()) { $hash = SP\Util::generate_random_bytes(); - if (UserUtil::addPassRecover($userLogin, $hash)) { + if (UserPassRecover::addPassRecover($userLogin, $hash)) { $url = SP\Init::$WEBURI . '/index.php?a=passreset&h=' . $hash . '&t=' . time() . '&f=1'; - SP\Common::printJSON($url, 0); + SP\Response::printJSON($url, 0); } } @@ -173,7 +176,7 @@ if ($User->getUserMPass()) { $Log->addDescription(sprintf('%s : %s', _('Grupo'), SP\Groups::getGroupNameById($User->getUserGroupId()))); $Log->writeLog(); } else { - SP\Common::printJSON(_('Error interno')); + SP\Response::printJSON(_('Error interno')); } $UserPrefs = \SP\UserPreferences::getPreferences($User->getUserId()); @@ -181,7 +184,7 @@ $UserPrefs = \SP\UserPreferences::getPreferences($User->getUserId()); if ($UserPrefs->isUse2Fa()) { SP\Session::set2FApassed(false); $url = SP\Init::$WEBURI . '/index.php?a=2fa&i=' . $User->getUserId() . '&t=' . time() . '&f=1'; - SP\Common::printJSON($url, 0); + SP\Response::printJSON($url, 0); } else { SP\Session::set2FApassed(true); } @@ -204,4 +207,4 @@ foreach ($_POST as $param => $value) { $urlParams = (count($params) > 0) ? '?' . implode('&', $params) : ''; -SP\Common::printJSON('index.php' . $urlParams, 0); \ No newline at end of file +SP\Response::printJSON('index.php' . $urlParams, 0); \ No newline at end of file diff --git a/ajax/ajax_files.php b/ajax/ajax_files.php index a470128a..9091efdf 100644 --- a/ajax/ajax_files.php +++ b/ajax/ajax_files.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\SessionUtil; define('APP_ROOT', '..'); @@ -37,7 +38,7 @@ if (!SP\Init::isLoggedIn()) { $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { +if (!$sk || !SessionUtil::checkSessionKey($sk)) { die(_('CONSULTA INVÁLIDA')); } diff --git a/ajax/ajax_getEnvironment.php b/ajax/ajax_getEnvironment.php index c58ee074..411c865e 100644 --- a/ajax/ajax_getEnvironment.php +++ b/ajax/ajax_getEnvironment.php @@ -41,4 +41,4 @@ $data = array( 'pk' => $publicKey ); -SP\Common::printJSON($data, 0); \ No newline at end of file +SP\Response::printJSON($data, 0); \ No newline at end of file diff --git a/ajax/ajax_getFiles.php b/ajax/ajax_getFiles.php index 877a2042..eddf762b 100644 --- a/ajax/ajax_getFiles.php +++ b/ajax/ajax_getFiles.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\SessionUtil; define('APP_ROOT', '..'); @@ -42,8 +43,8 @@ if (!SP\Util::fileIsEnabled()) { $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printXML(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printXML(_('CONSULTA INVÁLIDA')); } $controller = new SP\Controller\AccountsMgmtC(); diff --git a/ajax/ajax_import.php b/ajax/ajax_import.php index bfdff9f7..a24ac867 100644 --- a/ajax/ajax_import.php +++ b/ajax/ajax_import.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\SessionUtil; define('APP_ROOT', '..'); @@ -32,11 +33,11 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } if (SP\Util::demoIsEnabled()) { - SP\Common::printJSON(_('Ey, esto es una DEMO!!')); + SP\Response::printJSON(_('Ey, esto es una DEMO!!')); } $sk = SP\Request::analyze('sk', false); @@ -45,8 +46,8 @@ $defaultGroup = SP\Request::analyze('defGroup', 0); $importPwd = SP\Request::analyzeEncrypted('importPwd'); $csvDelimiter = SP\Request::analyze('csvDelimiter'); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } SP\Import::setDefUser($defaultUser); @@ -61,9 +62,9 @@ if (isset($res['error']) && is_array($res['error'])) { $out = implode('\n\n', $res['error']); - SP\Common::printJSON($out); + SP\Response::printJSON($out); } else if (is_array($res['ok'])) { $out = implode('\n\n', $res['ok']); - SP\Common::printJSON($out, 0); + SP\Response::printJSON($out, 0); } \ No newline at end of file diff --git a/ajax/ajax_migrate.php b/ajax/ajax_migrate.php index d3bfe1b8..0042ee18 100644 --- a/ajax/ajax_migrate.php +++ b/ajax/ajax_migrate.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\SessionUtil; define('APP_ROOT', '..'); @@ -32,17 +33,17 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } if (SP\Util::demoIsEnabled()) { - SP\Common::printJSON(_('Ey, esto es una DEMO!!')); + SP\Response::printJSON(_('Ey, esto es una DEMO!!')); } $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } $frmDBUser = SP\Request::analyze('dbuser'); @@ -52,15 +53,15 @@ $frmDBHost = SP\Request::analyze('dbhost'); $frmMigrateEnabled = SP\Request::analyze('chkmigrate', 0, false, 1); if (!$frmMigrateEnabled) { - SP\Common::printJSON(_('Confirmar la importación de cuentas')); + SP\Response::printJSON(_('Confirmar la importación de cuentas')); } elseif (!$frmDBUser) { - SP\Common::printJSON(_('Es necesario un usuario de conexión')); + SP\Response::printJSON(_('Es necesario un usuario de conexión')); } elseif (!$frmDBPass) { - SP\Common::printJSON(_('Es necesaria una clave de conexión')); + SP\Response::printJSON(_('Es necesaria una clave de conexión')); } elseif (!$frmDBName) { - SP\Common::printJSON(_('Es necesario el nombre de la BBDD')); + SP\Response::printJSON(_('Es necesario el nombre de la BBDD')); } elseif (!$frmDBHost) { - SP\Common::printJSON(_('Es necesario un nombre de host')); + SP\Response::printJSON(_('Es necesario un nombre de host')); } $options['dbhost'] = $frmDBHost; @@ -78,9 +79,9 @@ if (is_array($res['error'])) { } $out = implode('
', $errors); - SP\Common::printJSON($out); + SP\Response::printJSON($out); } elseif (is_array($res['ok'])) { $out = implode('
', $res['ok']); - SP\Common::printJSON($out, 0); + SP\Response::printJSON($out, 0); } \ No newline at end of file diff --git a/ajax/ajax_passReset.php b/ajax/ajax_passReset.php index 9c402a18..6829db4f 100644 --- a/ajax/ajax_passReset.php +++ b/ajax/ajax_passReset.php @@ -23,6 +23,9 @@ * */ +use SP\SessionUtil; +use SP\UserPass; +use SP\UserPassRecover; use SP\UserUtil; define('APP_ROOT', '..'); @@ -33,8 +36,8 @@ SP\Request::checkReferer('POST'); $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } $userLogin = SP\Request::analyze('login'); @@ -52,28 +55,28 @@ if ($userLogin && $userEmail) { if (SP\Auth::mailPassRecover($userLogin, $userEmail)) { $log->addDescription(SP\Html::strongText(_('Solicitado para') . ': ') . ' ' . $userLogin . ' (' . $userEmail . ')'); - SP\Common::printJSON(_('Solicitud enviada') . ';;' . _('En breve recibirá un correo para completar la solicitud.'), 0, 'goLogin();'); + SP\Response::printJSON(_('Solicitud enviada') . ';;' . _('En breve recibirá un correo para completar la solicitud.'), 0, 'goLogin();'); } else { $log->addDescription('ERROR'); $log->addDescription(SP\Html::strongText(_('Solicitado para') . ': ') . ' ' . $userLogin . ' (' . $userEmail . ')'); - SP\Common::printJSON(_('No se ha podido realizar la solicitud. Consulte con el administrador.')); + SP\Response::printJSON(_('No se ha podido realizar la solicitud. Consulte con el administrador.')); } $log->writeLog(); SP\Email::sendEmail($log); } elseif ($userPass && $userPassR && $userPass === $userPassR) { - $userId = UserUtil::checkHashPassRecover($hash); + $userId = UserPassRecover::checkHashPassRecover($hash); if ($userId) { - if (UserUtil::updateUserPass($userId, $userPass) && UserUtil::updateHashPassRecover($hash)) { + if (UserPass::updateUserPass($userId, $userPass) && UserPassRecover::updateHashPassRecover($hash)) { \SP\Log::writeNewLogAndEmail(_('Modificar Clave Usuario'), SP\Html::strongText(_('Login') . ': ') . UserUtil::getUserLoginById($userId)); - SP\Common::printJSON(_('Clave actualizada'), 0, 'goLogin();'); + SP\Response::printJSON(_('Clave actualizada'), 0, 'goLogin();'); } } - SP\Common::printJSON(_('Error al modificar la clave')); + SP\Response::printJSON(_('Error al modificar la clave')); } else { - SP\Common::printJSON(_('La clave es incorrecta o no coincide')); + SP\Response::printJSON(_('La clave es incorrecta o no coincide')); } \ No newline at end of file diff --git a/ajax/ajax_search.php b/ajax/ajax_search.php index 0377314f..36056674 100644 --- a/ajax/ajax_search.php +++ b/ajax/ajax_search.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\SessionUtil; define('APP_ROOT', '..'); @@ -37,7 +38,7 @@ if (!SP\Init::isLoggedIn()) { $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { +if (!$sk || !SessionUtil::checkSessionKey($sk)) { die('
' . _('CONSULTA INVÁLIDA') . '
'); } diff --git a/ajax/ajax_sendRequest.php b/ajax/ajax_sendRequest.php index fa81f153..97256e74 100644 --- a/ajax/ajax_sendRequest.php +++ b/ajax/ajax_sendRequest.php @@ -23,6 +23,7 @@ * */ +use SP\SessionUtil; use SP\UserUtil; define('APP_ROOT', '..'); @@ -32,20 +33,20 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas SP\Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } $frmAccountId = SP\Request::analyze('accountid', 0); $frmDescription = SP\Request::analyze('description'); if (!$frmDescription) { - SP\Common::printJSON(_('Es necesaria una descripción')); + SP\Response::printJSON(_('Es necesaria una descripción')); } $accountRequestData = SP\Account::getAccountRequestData($frmAccountId); @@ -72,7 +73,7 @@ if (strlen($mailto) > 1 ) { $log->writeLog(); - SP\Common::printJSON(_('Solicitud enviada'), 0, "doAction('" . \SP\Controller\ActionsInterface::ACTION_ACC_SEARCH . "');"); + SP\Response::printJSON(_('Solicitud enviada'), 0, "doAction('" . \SP\Controller\ActionsInterface::ACTION_ACC_SEARCH . "');"); } -SP\Common::printJSON(_('Error al enviar la solicitud')); \ No newline at end of file +SP\Response::printJSON(_('Error al enviar la solicitud')); \ No newline at end of file diff --git a/ajax/ajax_userPrefsSave.php b/ajax/ajax_userPrefsSave.php index b285fd0e..fc09148a 100644 --- a/ajax/ajax_userPrefsSave.php +++ b/ajax/ajax_userPrefsSave.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\SessionUtil; use SP\UserUtil; define('APP_ROOT', '..'); @@ -33,13 +34,13 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } $sk = SP\Request::analyze('sk', false); -if (!$sk || !SP\Common::checkSessionKey($sk)) { - SP\Common::printJSON(_('CONSULTA INVÁLIDA')); +if (!$sk || !SessionUtil::checkSessionKey($sk)) { + SP\Response::printJSON(_('CONSULTA INVÁLIDA')); } // Variables POST del formulario @@ -67,7 +68,7 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_USR_PREFERENCES_GENERAL $UserPrefs->setSortViews($sortViews); if (!$UserPrefs->updatePreferences()) { - SP\Common::printJSON(_('Error al actualizar preferencias')); + SP\Response::printJSON(_('Error al actualizar preferencias')); } // Forzar la detección del lenguaje tras actualizar @@ -77,10 +78,10 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_USR_PREFERENCES_GENERAL SP\Session::setUserPreferences($UserPrefs); SP\Util::reload(); - SP\Common::printJSON(_('Preferencias actualizadas'), 0, $doActionOnClose); + SP\Response::printJSON(_('Preferencias actualizadas'), 0, $doActionOnClose); } else if ($actionId === SP\Controller\ActionsInterface::ACTION_USR_PREFERENCES_SECURITY) { if (SP\Util::demoIsEnabled() && \SP\Session::getUserLogin() === 'demo') { - SP\Common::printJSON(_('Ey, esto es una DEMO!!')); + SP\Response::printJSON(_('Ey, esto es una DEMO!!')); } // Variables POST del formulario @@ -91,7 +92,7 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_USR_PREFERENCES_GENERAL $twoFa = new \SP\Auth\Auth2FA($itemId, $userLogin); if (!$twoFa->verifyKey($pin)) { - SP\Common::printJSON(_('Código incorrecto')); + SP\Response::printJSON(_('Código incorrecto')); } // No se instancia la clase ya que es necesario guardar los atributos ya guardados @@ -100,10 +101,10 @@ if ($actionId === SP\Controller\ActionsInterface::ACTION_USR_PREFERENCES_GENERAL $UserPrefs->setUse2Fa(\SP\Util::boolval($twoFaEnabled)); if (!$UserPrefs->updatePreferences()) { - SP\Common::printJSON(_('Error al actualizar preferencias')); + SP\Response::printJSON(_('Error al actualizar preferencias')); } - SP\Common::printJSON(_('Preferencias actualizadas'), 0, $doActionOnClose); + SP\Response::printJSON(_('Preferencias actualizadas'), 0, $doActionOnClose); } else { - SP\Common::printJSON(_('Acción Inválida')); + SP\Response::printJSON(_('Acción Inválida')); } \ No newline at end of file diff --git a/ajax/ajax_viewpass.php b/ajax/ajax_viewpass.php index 68d733e6..69cc21cb 100644 --- a/ajax/ajax_viewpass.php +++ b/ajax/ajax_viewpass.php @@ -24,6 +24,7 @@ */ use SP\Request; +use SP\UserPass; use SP\UserUtil; define('APP_ROOT', '..'); @@ -33,7 +34,7 @@ require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Bas Request::checkReferer('POST'); if (!SP\Init::isLoggedIn()) { - SP\Common::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); + SP\Response::printJSON(_('La sesión no se ha iniciado o ha caducado'), 10); } $accountId = SP\Request::analyze('accountid', false); @@ -51,13 +52,13 @@ $account->setAccountId($accountId); $accountData = $account->getAccountPassData(); if ($isHistory && !$account->checkAccountMPass()) { - SP\Common::printJSON(_('La clave maestra no coincide')); + SP\Response::printJSON(_('La clave maestra no coincide')); } if (!SP\Acl::checkAccountAccess(SP\Acl::ACTION_ACC_VIEW_PASS, $account->getAccountDataForACL()) || !SP\Acl::checkUserAccess(SP\Acl::ACTION_ACC_VIEW_PASS)) { - SP\Common::printJSON(_('No tiene permisos para acceder a esta cuenta')); -} elseif (!UserUtil::checkUserUpdateMPass()) { - SP\Common::printJSON(_('Clave maestra actualizada') . '
' . _('Reinicie la sesión para cambiarla')); + SP\Response::printJSON(_('No tiene permisos para acceder a esta cuenta')); +} elseif (!UserPass::checkUserUpdateMPass()) { + SP\Response::printJSON(_('Clave maestra actualizada') . '
' . _('Reinicie la sesión para cambiarla')); } $accountClearPass = SP\Crypt::getDecrypt($accountData->pass, $accountData->iv); @@ -82,4 +83,4 @@ $data = array( 'useimage' => $useImage ); -SP\Common::printJSON($data, 0); \ No newline at end of file +SP\Response::printJSON($data, 0); \ No newline at end of file diff --git a/api.php b/api.php index b0be9092..a5f93274 100644 --- a/api.php +++ b/api.php @@ -25,7 +25,7 @@ define('APP_ROOT', '.'); -require_once APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Base.php'; +require APP_ROOT . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Base.php'; try { $ApiRequest = new \SP\ApiRequest(); @@ -53,7 +53,7 @@ try { throw new Exception(_('Acción Inválida')); } } catch (Exception $e) { - \SP\Common::printJSON(array($e->getMessage(), _('Ayuda Parámetros') => \SP\ApiRequest::getHelp())); + \SP\Response::printJSON(array($e->getMessage(), _('Ayuda Parámetros') => \SP\ApiRequest::getHelp())); } header('Content-type: application/json'); diff --git a/inc/Account.class.php b/inc/Account.class.php index 941696cb..c2e5e3bd 100644 --- a/inc/Account.class.php +++ b/inc/Account.class.php @@ -122,25 +122,42 @@ class Account extends AccountBase implements AccountInterface $Log->resetDescription(); } - if (!UserUtil::updateUsersForAccount($this->getAccountId(), $this->getAccountUsersId())) { + if (!UserAccounts::updateUsersForAccount($this->getAccountId(), $this->getAccountUsersId())) { $Log->addDescription(_('Error al actualizar los usuarios de la cuenta')); $Log->writeLog(); $Log->resetDescription(); } - $query = 'UPDATE accounts SET ' - . 'account_customerId = :accountCustomerId,' - . 'account_categoryId = :accountCategoryId,' - . 'account_name = :accountName,' - . 'account_login = :accountLogin,' - . 'account_url = :accountUrl,' - . 'account_notes = :accountNotes,' - . 'account_userEditId = :accountUserEditId,' - . 'account_userGroupId = :accountUserGroupId,' - . 'account_dateEdit = NOW(),' - . 'account_otherUserEdit = :accountOtherUserEdit,' - . 'account_otherGroupEdit = :accountOtherGroupEdit ' - . 'WHERE account_id = :accountId'; + if ($this->getAccountUserGroupId()) { + $query = 'UPDATE accounts SET ' + . 'account_customerId = :accountCustomerId,' + . 'account_categoryId = :accountCategoryId,' + . 'account_name = :accountName,' + . 'account_login = :accountLogin,' + . 'account_url = :accountUrl,' + . 'account_notes = :accountNotes,' + . 'account_userEditId = :accountUserEditId,' + . 'account_userGroupId = :accountUserGroupId,' + . 'account_dateEdit = NOW(),' + . 'account_otherUserEdit = :accountOtherUserEdit,' + . 'account_otherGroupEdit = :accountOtherGroupEdit ' + . 'WHERE account_id = :accountId'; + + $data['accountUserGroupId'] = $this->getAccountUserGroupId(); + } else { + $query = 'UPDATE accounts SET ' + . 'account_customerId = :accountCustomerId,' + . 'account_categoryId = :accountCategoryId,' + . 'account_name = :accountName,' + . 'account_login = :accountLogin,' + . 'account_url = :accountUrl,' + . 'account_notes = :accountNotes,' + . 'account_userEditId = :accountUserEditId,' + . 'account_dateEdit = NOW(),' + . 'account_otherUserEdit = :accountOtherUserEdit,' + . 'account_otherGroupEdit = :accountOtherGroupEdit ' + . 'WHERE account_id = :accountId'; + } $data['accountCustomerId'] = $this->getAccountCustomerId(); $data['accountCategoryId'] = $this->getAccountCategoryId(); @@ -149,7 +166,6 @@ class Account extends AccountBase implements AccountInterface $data['accountUrl'] = $this->getAccountUrl(); $data['accountNotes'] = $this->getAccountNotes(); $data['accountUserEditId'] = $this->getAccountUserEditId(); - $data['accountUserGroupId'] = ($this->getAccountUserGroupId()) ? $this->getAccountUserGroupId() : 'account_userGroupId'; $data['accountOtherUserEdit'] = intval($this->getAccountOtherUserEdit()); $data['accountOtherGroupEdit'] = intval($this->getAccountOtherGroupEdit()); $data['accountId'] = $this->getAccountId(); @@ -195,6 +211,7 @@ class Account extends AccountBase implements AccountInterface . 'dst.account_login = src.acchistory_login,' . 'dst.account_url = src.acchistory_url,' . 'dst.account_notes = src.acchistory_notes,' + . 'dst.account_userGroupId = src.acchistory_userGroupId,' . 'dst.account_userEditId = :accountUserEditId,' . 'dst.account_dateEdit = NOW(),' . 'dst.account_otherUserEdit = src.acchistory_otherUserEdit + 0,' @@ -385,7 +402,7 @@ class Account extends AccountBase implements AccountInterface } if (is_array($this->getAccountUsersId())) { - if (!UserUtil::addUsersForAccount($this->getAccountId(), $this->getAccountUsersId())) { + if (!UserAccounts::addUsersForAccount($this->getAccountId(), $this->getAccountUsersId())) { $Log->addDescription(_('Error al actualizar los usuarios de la cuenta')); $Log->writeLog(); $Log->resetDescription(); @@ -434,7 +451,7 @@ class Account extends AccountBase implements AccountInterface $Log->addDescription(_('Error al eliminar grupos asociados a la cuenta')); } - if (!UserUtil::deleteUsersForAccount($this->getAccountId())) { + if (!UserAccounts::deleteUsersForAccount($this->getAccountId())) { $Log->addDescription(_('Error al eliminar usuarios asociados a la cuenta')); } diff --git a/inc/AccountBase.class.php b/inc/AccountBase.class.php index 9aec3adf..d0de1762 100644 --- a/inc/AccountBase.class.php +++ b/inc/AccountBase.class.php @@ -301,7 +301,7 @@ abstract class AccountBase if (!isset($cacheUsers[$accId]) || time() > $cacheUsers['expires'] ) { - $cacheUsers[$accId] = UserUtil::getUsersForAccount($accId); + $cacheUsers[$accId] = UserAccounts::getUsersForAccount($accId); $cacheUsers['expires'] = time() + self::CACHE_EXPIRE_TIME; } diff --git a/inc/AccountHistory.class.php b/inc/AccountHistory.class.php index c567e277..eae6ecb5 100644 --- a/inc/AccountHistory.class.php +++ b/inc/AccountHistory.class.php @@ -27,6 +27,11 @@ namespace SP; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); +/** + * Class AccountHistory par el manejo del historial de cuentas + * + * @package SP + */ class AccountHistory extends AccountBase implements AccountInterface { private $_isDelete = false; @@ -230,7 +235,7 @@ class AccountHistory extends AccountBase implements AccountInterface 'AND acchistory_mPassHash = :mPassHash'; $data['id'] = (is_null($id)) ? $this->getAccountId() : $id; - $data['mPassHash'] = Config::getConfigDbValue('masterPwd'); + $data['mPassHash'] = ConfigDB::getValue('masterPwd'); return (DB::getResults($query, __FUNCTION__, $data) !== false); } @@ -395,7 +400,7 @@ class AccountHistory extends AccountBase implements AccountInterface $data['accountOtherGroupEdit'] = $this->getAccountOtherGroupEdit(); $data['isModify'] = $this->isIsModify(); $data['isDelete'] = $this->isIsDelete(); - $data['masterPwd'] = Config::getConfigDbValue('masterPwd'); + $data['masterPwd'] = ConfigDB::getValue('masterPwd'); if (DB::getQuery($query, __FUNCTION__, $data) === false) { return false; @@ -479,7 +484,7 @@ class AccountHistory extends AccountBase implements AccountInterface $data['account_id'] = $id; $data['isModify'] = ($isDelete === false) ? 1 : 0; $data['isDelete'] = ($isDelete === false) ? 0 : 1; - $data['masterPwd'] = Config::getConfigDbValue('masterPwd'); + $data['masterPwd'] = ConfigDB::getValue('masterPwd'); return DB::getQuery($query, __FUNCTION__, $data); } diff --git a/inc/ActionsI.class.php b/inc/ActionsI.class.php deleted file mode 100644 index f224ddd9..00000000 --- a/inc/ActionsI.class.php +++ /dev/null @@ -1,62 +0,0 @@ -. - * - */ - -namespace Controller; - - -interface ActionsI { - const ACTION__ACC_SEARCH = 1; - const ACTION_ACC_VIEW = 2; - const ACTION_ACC_VIEW_PASS = 3; - const ACTION_ACC_VIEW_HISTORY = 4; - const ACTION_ACC_EDIT = 10; - const ACTION_ACC_EDIT_PASS = 11; - const ACTION_ACC_NEW = 20; - const ACTION_ACC_COPY = 30; - const ACTION_ACC_DELETE = 40; - const ACTION_ACC_FILES = 50; - const ACTION_ACC_REQUEST = 51; - const ACTION_MGM = 60; - const ACTION_MGM_CATEGORIES = 61; - const ACTION_MGM_CUSTOMERS = 62; - const ACTION_USR = 70; - const ACTION_USR_USERS = 71; - const ACTION_USR_USERS_NEW = 711; - const ACTION_USR_USERS_EDIT = 712; - const ACTION_USR_USERS_EDITPASS = 713; - const ACTION_USR_GROUPS = 72; - const ACTION_USR_GROUPS_NEW = 721; - const ACTION_USR_GROUPS_EDIT = 722; - const ACTION_USR_PROFILES = 73; - const ACTION_USR_PROFILES_NEW = 731; - const ACTION_USR_PROFILES_EDIT = 732; - const ACTION_CFG = 80; - const ACTION_CFG_GENERAL = 81; - const ACTION_CFG_ENCRYPTION = 82; - const ACTION_CFG_ENCRYPTION_TEMPPASS = 83; - const ACTION_CFG_BACKUP = 84; - const ACTION_CFG_IMPORT = 85; - const ACTION_EVL = 90; -} \ No newline at end of file diff --git a/inc/Api.class.php b/inc/Api.class.php index 0fa37be9..e0d6d794 100644 --- a/inc/Api.class.php +++ b/inc/Api.class.php @@ -79,8 +79,8 @@ class Api if (Auth::authUserMySQL($userLogin, $userPass) && !UserUtil::checkUserIsDisabled($userLogin) - && UserUtil::checkUserMPass($User) - && UserUtil::checkUserUpdateMPass($userLogin) + && UserPass::checkUserMPass($User) + && UserPass::checkUserUpdateMPass($userLogin) && !$User->isUserChangePass() ) { $this->_mPass = $User->getUserMPass(true); diff --git a/inc/Auth.class.php b/inc/Auth.class.php index 68245390..d93847f6 100644 --- a/inc/Auth.class.php +++ b/inc/Auth.class.php @@ -149,8 +149,8 @@ class Auth */ public static function authUserMySQL($userLogin, $userPass) { - if (UserUtil::checkUserIsMigrate($userLogin)) { - if (!UserUtil::migrateUser($userLogin, $userPass)) { + if (UserMigrate::checkUserIsMigrate($userLogin)) { + if (!UserMigrate::migrateUser($userLogin, $userPass)) { return false; } } @@ -179,7 +179,7 @@ class Auth if (UserUtil::checkUserMail($login, $email) && !UserUtil::checkUserIsDisabled($login) && !UserLdap::checkUserIsLDAP($login) - && !UserUtil::checkPassRecoverLimit($login) + && !UserPassRecover::checkPassRecoverLimit($login) ) { $hash = Util::generate_random_bytes(); @@ -193,7 +193,7 @@ class Auth $log->addDescription(''); $log->addDescription(_('Si no ha solicitado esta acción, ignore este mensaje.')); - return (Email::sendEmail($log, $email, false) && UserUtil::addPassRecover($login, $hash)); + return (Email::sendEmail($log, $email, false) && UserPassRecover::addPassRecover($login, $hash)); } else { return false; } diff --git a/inc/Auth2FA.class.php b/inc/Auth2FA.class.php index e75de6db..df461ed9 100644 --- a/inc/Auth2FA.class.php +++ b/inc/Auth2FA.class.php @@ -27,7 +27,8 @@ namespace SP\Auth; use SP\Exts\Google2FA; use SP\Exts\Base2n; -use SP\UserUtil; +use SP\UserPass; +use SP\Util; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); @@ -59,6 +60,10 @@ class Auth2FA */ private $_userLogin = ''; + /** + * @param int $userId El Id de usuario + * @param string $userLogin El login de usuario + */ public function __construct($userId, $userLogin = null) { $this->_userId = $userId; @@ -66,6 +71,20 @@ class Auth2FA $this->_initializationKey = $this->genUserInitializationKey(); } + /** + * Generar una clave de inicialización codificada en Base32 + * + * @return string + */ + private function genUserInitializationKey() + { + $userIV = UserPass::getUserIVById($this->_userId); + $base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', false, true, true); + $key = substr($base32->encode($userIV), 0, 16); + + return $key; + } + /** * @param int $userId */ @@ -93,25 +112,14 @@ class Auth2FA return Google2FA::verify_key($this->_initializationKey, $key); } - public function getUserQRUrl(){ - $qrUrl = 'https://www.google.com/chart?chs=150x150&chld=M|0&cht=qr&chl='; - $qrUrl .= urlencode('otpauth://totp/sysPass:syspass/' . $this->_userLogin . '?secret=' . $this->_initializationKey . '&issuer=sysPass'); - - return $qrUrl; - } - + /** + * Devolver el código QR de la peticíón HTTP en base64 + * + * @return bool|string + */ public function getUserQRCode() { - $ch = curl_init($this->getUserQRUrl()); - - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HEADER, 0); - curl_setopt($ch, CURLOPT_USERAGENT, "sysPass 2FA"); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); - curl_setopt($ch, CURLOPT_TIMEOUT, 60); - - $data = curl_exec($ch); - curl_close($ch); + $data = Util::getDataFromUrl($this->getUserQRUrl()); if ($data === false) { return false; @@ -120,6 +128,26 @@ class Auth2FA return base64_encode($data); } + /** + * Devolver la cadena con la URL para solicitar el código QR + * + * @return string + */ + public function getUserQRUrl() + { + $qrUrl = 'https://www.google.com/chart?chs=150x150&chld=M|0&cht=qr&chl='; + $qrUrl .= urlencode('otpauth://totp/sysPass:syspass/' . $this->_userLogin . '?secret=' . $this->_initializationKey . '&issuer=sysPass'); + + return $qrUrl; + } + + /** + * Comprobar el token del usuario + * + * @param int $userToken EL código del usuario + * @return bool + * @throws \Exception + */ public function checkUserToken($userToken) { $timeStamp = Google2FA::get_timestamp(); @@ -130,13 +158,4 @@ class Auth2FA return ($totp == $userToken); } - - private function genUserInitializationKey() - { - $userIV = UserUtil::getUserIVById($this->_userId); - $base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', false, true, true); - $key = substr($base32->encode($userIV), 0, 16); - - return $key; - } } \ No newline at end of file diff --git a/inc/Base.php b/inc/Base.php index 1f849a1a..167bb9dc 100644 --- a/inc/Base.php +++ b/inc/Base.php @@ -23,6 +23,9 @@ * */ +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + +define('CONFIG_FILE', __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'config.php'); define('MODEL_PATH', __DIR__); define('CONTROLLER_PATH', __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'web'); define('VIEW_PATH', __DIR__ . DIRECTORY_SEPARATOR . 'themes'); diff --git a/inc/Cache.class.php b/inc/Cache.class.php index 1c18f260..68470939 100644 --- a/inc/Cache.class.php +++ b/inc/Cache.class.php @@ -25,6 +25,8 @@ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + /** * Clase base para guardar/obtener elementos de la caché */ diff --git a/inc/Config.class.php b/inc/Config.class.php index 6b8fd660..4e559c78 100644 --- a/inc/Config.class.php +++ b/inc/Config.class.php @@ -29,156 +29,41 @@ defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo' /** * Esta clase es responsable de leer y escribir la configuración del archivo config.php - * y en la base de datos */ -class Config +class Config implements ConfigInterface { /** * @var array */ - private static $_config; - /** - * @var array - */ - private static $_cache = array(); + protected static $_cache; /** * @var bool */ - private static $_init = false; + protected static $_init; /** - * @param null $key La clave a obtener - * @return mixed - */ - public static function getArrConfigValue($key = null) - { - if (!is_null($key) && isset(self::$_config[$key])) { - return self::$_config[$key]; - } - - return self::$_config; - } - - /** - * @param $key string La clave a actualizar - * @param $value mixed El valor a actualizar - */ - public static function setArrConfigValue($key, $value) - { -// if (isset(self::$_config[$key])) { - self::$_config[$key] = $value; -// } - } - - /** - * Obtener un array con la configuración almacenada en la BBDD. + * Obtiene un valor de configuración desde el archivo * - * @return bool - */ - public static function getConfigDb() - { - $query = 'SELECT config_parameter, config_value FROM config'; - - $queryRes = DB::getResults($query, __FUNCTION__); - - if ($queryRes === false) { - return false; - } - - foreach ($queryRes as $config) { - self::$_config[$config->config_parameter] = $config->config_value; - } - } - - /** - * Guardar la configuración en la BBDD. - * - * @param bool $mkInsert realizar un 'insert'? - * @return bool - */ - public static function writeConfigDb($mkInsert = false) - { - foreach (self::$_config as $param => $value) { - if ($mkInsert) { - $query = 'INSERT INTO config VALUES (:param,:value) ON DUPLICATE KEY UPDATE config_value = :valuedup'; - - $data['valuedup'] = $value; - } else { - $query = 'UPDATE config SET config_value = :value WHERE config_parameter = :param'; - } - - $data['param'] = $param; - $data['value'] = $value; - - if (DB::getQuery($query, __FUNCTION__, $data) === false) { - return false; - } - } - - Log::writeNewLogAndEmail(_('Configuración'), _('Modificar configuración')); - - return true; - } - - /** - * Cargar la configuración desde la BBDD a variable global $CFG. - * - * @param bool $force reescribir la variable global $CFG? - * @return bool - */ - public static function getDBConfig($force = false) - { - global $CFG; - - if (isset ($CFG) && !$force) { - return true; - } - - $query = 'SELECT config_parameter, config_value FROM config'; - - $queryRes = DB::getResults($query, __FUNCTION__); - - if ($queryRes === false) { - return false; - } - - foreach ($queryRes as $config) { - $cfgParam = $config->config_parameter; - $cfgValue = $config->config_value; - - if (strstr($cfgValue, "||")) { - $cfgValue = explode("||", $cfgValue); - } - - $CFG["$cfgParam"] = $cfgValue; - } - - return true; - } - - /** - * Obtiene un valor de configuración desde el archivo config.php - * - * @param string $key clave + * @param string $param clave * @param string $default = null valor por defecto * @return string el valor o $default */ - public static function getValue($key, $default = null) + public static function getValue($param, $default = null) { - $param = Cache::getSessionCacheConfigValue($key); + $params = Cache::getSessionCacheConfigValue($param); - return (!is_null($param)) ? $param : $default; + return (!is_null($params)) ? $params : $default; } /** - * Lista todas las claves de configuración guardadas en config.php. + * Lista todas las claves de configuración guardadas * * @param bool $full obtener todas las claves y sus valores * @return array con nombres de claves */ public static function getKeys($full = false) { - self::readData(); + self::readConfig(); if ($full) { return self::$_cache; @@ -192,20 +77,18 @@ class Config * * @return bool */ - private static function readData() + public static function readConfig() { if (self::$_init) { return true; } - $configFile = self::getConfigFile();; - - if (!file_exists($configFile)) { + if (!file_exists(CONFIG_FILE)) { return false; } // Include the file, save the data from $CONFIG - include_once $configFile; + include_once CONFIG_FILE; if (isset($CONFIG) && is_array($CONFIG)) { self::$_cache = $CONFIG; @@ -217,34 +100,24 @@ class Config return true; } - /** - * Devolver la ruta al archivo de configuración - * - * @return string Con la ruta - */ - private static function getConfigFile() - { - return Init::$SERVERROOT . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'config.php'; - } - /** * Elimina una clave de la configuración. - * Esta función elimina una clave de configmgmt.php. Si no tiene permiso - * de escritura en configmgmt.php, devolverá false. + * Esta función elimina una clave de config.php. Si no tiene permiso + * de escritura en config.php, devolverá false. * - * @param string $key clave + * @param string $param clave * @return bool */ - public static function deleteKey($key) + public static function deleteParam($param) { - self::readData(); + self::readConfig(); - if (isset(self::$_cache[$key])) { + if (isset(self::$_cache[$param])) { // Eliminar la clave de la caché - unset(self::$_cache[$key]); + unset(self::$_cache[$param]); // Guardar los cambios en la configuración - self::writeData(); + self::writeConfig(); } return true; @@ -254,8 +127,9 @@ class Config * Escribe en archivo de configuración. * * @return bool + * @throws SPException */ - public static function writeData() + public static function writeConfig() { // Ordenar las claves de la configuración ksort(self::$_cache); @@ -267,17 +141,15 @@ class Config $content .= trim(var_export(self::$_cache, true), ','); $content .= ";\n"; - $configFile = self::getConfigFile(); - // Escribir el archivo de configuración - $result = @file_put_contents($configFile, $content); + $result = @file_put_contents(CONFIG_FILE, $content); if (!$result) { - Init::initError(_('No es posible escribir el archivo de configuración'), _('Compruebe los permisos del directorio "config"')); + throw new SPException(SPException::SP_CRITICAL, _('No es posible escribir el archivo de configuración'), _('Compruebe los permisos del directorio "config"')); } // Establecer los permisos del archivo de configuración - chmod($configFile, 0640); + chmod(CONFIG_FILE, 0640); // Actualizar la caché de configuración de la sesión Cache::setSessionCacheConfig(); @@ -290,39 +162,57 @@ class Config */ public static function setDefaultValues() { - self::setValue('debug', false); - self::setValue('log_enabled', true); - self::setValue('ldap_enabled', false); - self::setValue('mail_enabled', false); - self::setValue('wiki_enabled', false); - self::setValue('demo_enabled', false); - self::setValue('files_enabled', true); - self::setValue('proxy_enabled', false); - self::setValue('checkupdates', true); - self::setValue('checknotices', true); - self::setValue('globalsearch', false); - self::setValue('account_passtoimage', false); - self::setValue('resultsascards', false); - self::setValue('files_allowed_exts', 'PDF,JPG,GIF,PNG,ODT,ODS,DOC,DOCX,XLS,XSL,VSD,TXT,CSV,BAK'); - self::setValue('files_allowed_size', 1024); - self::setValue('wiki_searchurl', ''); - self::setValue('wiki_pageurl', ''); - self::setValue('wiki_filter', ''); - self::setValue('ldap_server', ''); - self::setValue('ldap_base', ''); - self::setValue('ldap_group', ''); - self::setValue('ldap_userattr', ''); - self::setValue('mail_server', ''); - self::setValue('mail_from', ''); - self::setValue('site_lang', str_replace('.utf8', '', Language::$globalLang)); - self::setValue('session_timeout', '300'); - self::setValue('account_link', 1); - self::setValue('account_count', 12); - self::setValue('sitetheme', 'material-blue'); - self::setValue('proxy_server', ''); - self::setValue('proxy_port', ''); - self::setValue('proxy_user', ''); - self::setValue('proxy_pass', ''); + self::setCacheConfigValue('debug', false); + self::setCacheConfigValue('log_enabled', true); + self::setCacheConfigValue('ldap_enabled', false); + self::setCacheConfigValue('mail_enabled', false); + self::setCacheConfigValue('wiki_enabled', false); + self::setCacheConfigValue('demo_enabled', false); + self::setCacheConfigValue('files_enabled', true); + self::setCacheConfigValue('proxy_enabled', false); + self::setCacheConfigValue('checkupdates', true); + self::setCacheConfigValue('checknotices', true); + self::setCacheConfigValue('globalsearch', false); + self::setCacheConfigValue('account_passtoimage', false); + self::setCacheConfigValue('resultsascards', false); + self::setCacheConfigValue('files_allowed_exts', 'PDF,JPG,GIF,PNG,ODT,ODS,DOC,DOCX,XLS,XSL,VSD,TXT,CSV,BAK'); + self::setCacheConfigValue('files_allowed_size', 1024); + self::setCacheConfigValue('wiki_searchurl', ''); + self::setCacheConfigValue('wiki_pageurl', ''); + self::setCacheConfigValue('wiki_filter', ''); + self::setCacheConfigValue('ldap_server', ''); + self::setCacheConfigValue('ldap_base', ''); + self::setCacheConfigValue('ldap_group', ''); + self::setCacheConfigValue('ldap_userattr', ''); + self::setCacheConfigValue('mail_server', ''); + self::setCacheConfigValue('mail_from', ''); + self::setCacheConfigValue('site_lang', str_replace('.utf8', '', Language::$globalLang)); + self::setCacheConfigValue('session_timeout', '300'); + self::setCacheConfigValue('account_link', 1); + self::setCacheConfigValue('account_count', 12); + self::setCacheConfigValue('sitetheme', 'material-blue'); + self::setCacheConfigValue('proxy_server', ''); + self::setCacheConfigValue('proxy_port', ''); + self::setCacheConfigValue('proxy_user', ''); + self::setCacheConfigValue('proxy_pass', ''); + + self::writeConfig(); + } + + /** + * Actualizar el array de parámetros de configuración + * + * @param $param string El parámetro a actualizar + * @param $value mixed El valor a actualizar + */ + public static function setCacheConfigValue($param, $value) + { + // Comprobar que la configuración está cargada + if (count(self::$_cache) === 0){ + self::readConfig(); + } + + self::$_cache[$param] = $value; } /** @@ -330,156 +220,25 @@ class Config * Esta función establece el valor y reescribe config.php. Si el archivo * no se puede escribir, devolverá false. * - * @param string $key clave + * @param string $param clave * @param string $value valor * @return bool */ - public static function setValue($key, $value) + public static function setValue($param, $value) { - self::readData(); + self::readConfig(); // Añadir/Modificar el parámetro - self::$_cache[$key] = $value; + self::$_cache[$param] = $value; // Generar el hash de la configuración self::$_cache['config_hash'] = md5(implode(self::$_cache)); // Guardar los cambios - self::writeData(); + self::writeConfig(); return true; } - /** - * Crea una clave temporal para encriptar la clave maestra y guardarla. - * - * @return bool|string - */ - public static function setTempMasterPass($maxTime = 14400) - { - // Encriptar la clave maestra con hash aleatorio generado - $randomKey = Crypt::generateAesKey(Util::generate_random_bytes()); - $pass = Crypt::mkCustomMPassEncrypt($randomKey, Crypt::getSessionMasterPass()); - - if (!is_array($pass)) { - return false; - } - - self::setConfigDbValue('tempmaster_pass', bin2hex($pass[0]), false); - self::setConfigDbValue('tempmaster_passiv', bin2hex($pass[1]), false); - self::setConfigDbValue('tempmaster_passhash', Crypt::mkHashPassword($randomKey), false); - self::setConfigDbValue('tempmaster_passtime', time(), false); - self::setConfigDbValue('tempmaster_maxtime', time() + $maxTime, false); - self::setConfigDbValue('tempmaster_attempts', 0, false); - - // Guardar la clave temporal hasta que finalice la sesión - Session::setTemporaryMasterPass($randomKey); - - return $randomKey; - } - - /** - * Guardar un parámetro de configuración en la BBDD. - * - * @param string $param con el parámetro a guardar - * @param string $value con el valor a guardar - * @param bool $email enviar email? - * @return bool - */ - public static function setConfigDbValue($param, $value, $email = true) - { - $query = "INSERT INTO config " - . "SET config_parameter = :param," - . "config_value = :value " - . "ON DUPLICATE KEY UPDATE config_value = :valuedup"; - - $data['param'] = $param; - $data['value'] = $value; - $data['valuedup'] = $value; - - if (DB::getQuery($query, __FUNCTION__, $data) === false) { - return false; - } - - $log = new Log(_('Configuración')); - $log->addDescription(_('Modificar configuración')); - $log->addDescription(_('Parámetro') . ': ' . $param); - $log->addDescription(_('Valor') . ': ' . $value); - $log->writeLog(); - - if ($email === true) { - Email::sendEmail($log); - } - - return true; - } - - /** - * Comprueba si la clave temporal es válida - * - * @param string $pass clave a comprobar - * @return bool - */ - public static function checkTempMasterPass($pass) - { - $passTime = self::getConfigDbValue('tempmaster_passtime'); - $passMaxTime = self::getConfigDbValue('tempmaster_maxtime'); - $attempts = self::getConfigDbValue('tempmaster_attempts'); - - // Comprobar si el tiempo de validez se ha superado - if ($passTime !== false && time() - $passTime > $passMaxTime || $attempts >= 5) { - self::setConfigDbValue('tempmaster_pass', '', false); - self::setConfigDbValue('tempmaster_passiv', '', false); - self::setConfigDbValue('tempmaster_passhash', '', false); - - return false; - } - - Crypt::checkHashPass($pass, self::getConfigDbValue('tempmaster_passhash')); - - $isValid = Crypt::checkHashPass($pass, self::getConfigDbValue('tempmaster_passhash')); - - if (!$isValid) { - self::setConfigDbValue('tempmaster_attempts', $attempts + 1, false); - } - - return $isValid; - } - - /** - * Obtiene un valor desde la configuración en la BBDD. - * - * @param string $param con el parámetro de configuración - * @return false|string con el valor - */ - public static function getConfigDbValue($param) - { - $query = 'SELECT config_value FROM config WHERE config_parameter = :parameter LIMIT 1'; - - $data['parameter'] = $param; - - $queryRes = DB::getResults($query, __FUNCTION__, $data); - - if ($queryRes === false) { - return false; - } - - return $queryRes->config_value; - } - - /** - * Devuelve la clave maestra que ha sido encriptada con la clave temporal - * - * @param $pass string con la clave utilizada para encriptar - * @return string con la clave maestra desencriptada - */ - public static function getTempMasterPass($pass) - { - $passLogin = hex2bin(self::getConfigDbValue('tempmaster_pass')); - $passLoginIV = hex2bin(self::getConfigDbValue('tempmaster_passiv')); - - return Crypt::getDecrypt($passLogin, $passLoginIV, $pass); - } - /** * Obtener la configuración de sysPass * @@ -487,10 +246,20 @@ class Config */ public static function getConfig() { - if (self::readData()) { + if (self::readConfig()) { return self::$_cache; } return false; } + + /** + * Obtener un parámetro del array de parámetros de configuración + * + * @param $param string El parámetro a obtener + */ + public static function getCacheConfigValue($param) + { + return self::$_cache[$param]; + } } diff --git a/inc/ConfigDB.class.php b/inc/ConfigDB.class.php new file mode 100644 index 00000000..2be14ca1 --- /dev/null +++ b/inc/ConfigDB.class.php @@ -0,0 +1,193 @@ +. + * + */ + +namespace SP; + +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + +/** + * Class ConfigDB para la gestión de la configuración en la BD + * + * @package SP + */ +class ConfigDB implements ConfigInterface +{ + /** + * @var array + */ + protected static $_cache; + /** + * @var bool + */ + protected static $_init; + + /** + * Obtener un array con la configuración almacenada en la BBDD. + * + * @return bool + */ + public static function readConfig() + { + $query = 'SELECT config_parameter, config_value FROM config'; + + $queryRes = DB::getResults($query, __FUNCTION__); + + if ($queryRes === false) { + return false; + } + + foreach ($queryRes as $config) { + self::$_cache[$config->config_parameter] = $config->config_value; + } + } + + /** + * Guardar la configuración en la BBDD. + * + * @param bool $isInsert realizar un 'insert'? + * @return bool + */ + public static function writeConfig($isInsert = false) + { + foreach (self::$_cache as $param => $value) { + if ($isInsert) { + $query = 'INSERT INTO config VALUES (:param,:value) ON DUPLICATE KEY UPDATE config_value = :valuedup'; + + $data['valuedup'] = $value; + } else { + $query = 'UPDATE config SET config_value = :value WHERE config_parameter = :param'; + } + + $data['param'] = $param; + $data['value'] = $value; + + if (DB::getQuery($query, __FUNCTION__, $data) === false) { + return false; + } + } + + Log::writeNewLogAndEmail(_('Configuración'), _('Modificar configuración')); + + return true; + } + + /** + * Guardar un parámetro de configuración en la BBDD. + * + * @param string $param con el parámetro a guardar + * @param string $value con el valor a guardar + * @param bool $email enviar email? + * @return bool + */ + public static function setValue($param, $value, $email = true) + { + $query = "INSERT INTO config " + . "SET config_parameter = :param," + . "config_value = :value " + . "ON DUPLICATE KEY UPDATE config_value = :valuedup"; + + $data['param'] = $param; + $data['value'] = $value; + $data['valuedup'] = $value; + + if (DB::getQuery($query, __FUNCTION__, $data) === false) { + return false; + } + + $log = new Log(_('Configuración')); + $log->addDescription(_('Modificar configuración')); + $log->addDescription(_('Parámetro') . ': ' . $param); + $log->addDescription(_('Valor') . ': ' . $value); + $log->writeLog(); + + if ($email === true) { + Email::sendEmail($log); + } + + return true; + } + + /** + * Actualizar el array de parámetros de configuración + * + * @param $param string La clave a actualizar + * @param $value mixed El valor a actualizar + */ + public static function setCacheConfigValue($param, $value) + { + self::$_cache[$param] = $value; + } + + /** + * Obtener un parámetro del el array de parámetros de configuración + * + * @param null $param La clave a obtener + * @return mixed + */ + public static function getCacheConfigValue($param = null) + { + if (!is_null($param) && isset(self::$_cache[$param])) { + return self::$_cache[$param]; + } + + return self::$_cache; + } + + /** + * Obtiene un valor desde la configuración en la BBDD. + * + * @param string $param con el parámetro de configuración + * @param string $default El valor por defecto + * @return false|string con el valor + */ + public static function getValue($param, $default = null) + { + $query = 'SELECT config_value FROM config WHERE config_parameter = :parameter LIMIT 1'; + + $data['parameter'] = $param; + + $queryRes = DB::getResults($query, __FUNCTION__, $data); + + if ($queryRes === false) { + return false; + } + + return ($queryRes->config_value) ? $queryRes->config_value : $default; + } + + /** + * Elimina un parámetro de la configuración. + * + * @param string $param clave + * @return bool + */ + public static function deleteParam($param) + { + $query = 'DELETE FROM config WHERE config_parameter = :param LIMIT 1'; + $data['param'] = $param; + + return (DB::getQuery($query, __FUNCTION__, $data) !== false); + } +} \ No newline at end of file diff --git a/inc/ConfigInterface.class.php b/inc/ConfigInterface.class.php new file mode 100644 index 00000000..7b8c9647 --- /dev/null +++ b/inc/ConfigInterface.class.php @@ -0,0 +1,84 @@ +. + * + */ + +namespace SP; + +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + +/** + * Interface ConfigInterface para las clases que gestionan la configuración de sysPass + * + * @package SP + */ +interface ConfigInterface +{ + /** + * Obtiene un valor de configuración + * + * @param string $param El valor a obtener + * @param string $default El valor por defecto + * @return string el valor o $default + */ + static function getValue($param, $default = null); + + /** + * Guardar un parámetro de configuración + * + * @param string $param El parámetro a guardar + * @param string $value El valor a guardar + * @return bool + */ + static function setValue($param, $value); + + /** + * Elimina un parámetro de la configuración. + * + * @param string $param clave + * @return bool + */ + static function deleteParam($param); + + /** + * Actualizar el array de parámetros de configuración + * + * @param $param string El parámetro a actualizar + * @param $value mixed El valor a actualizar + */ + static function setCacheConfigValue($param, $value); + + /** + * Obtener un parámetro del array de parámetros de configuración + * + * @param $param string El parámetro a devolver + */ + static function getCacheConfigValue($param); + + /** + * Obtener un array con la configuración almacenada. + * + * @return bool + */ + static function readConfig(); +} \ No newline at end of file diff --git a/inc/Crypt.class.php b/inc/Crypt.class.php index 61c57176..a97a397d 100644 --- a/inc/Crypt.class.php +++ b/inc/Crypt.class.php @@ -115,7 +115,7 @@ class Crypt // Comprobar si el hash está en formato anterior a 12002 if ($isMPass && strlen($originalHash) === 128) { - Config::setConfigDbValue('masterPwd', self::mkHashPassword($pwd)); + ConfigDB::setValue('masterPwd', self::mkHashPassword($pwd)); Log::writeNewLog(_('Aviso'), _('Se ha regenerado el HASH de clave maestra. No es necesaria ninguna acción.')); return (hash("sha256", substr($originalHash, 0, 64) . $pwd) == substr($originalHash, 64, 64)); @@ -219,7 +219,7 @@ class Crypt */ public static function mkEncrypt($data, $masterPwd = null) { - $masterPwd = (is_null($masterPwd)) ? self::getSessionMasterPass() : $masterPwd; + $masterPwd = (is_null($masterPwd)) ? SessionUtil::getSessionMPass() : $masterPwd; self::$strInitialVector = self::getIV(); $cryptValue = self::encrypt($data, $masterPwd, self::$strInitialVector); @@ -227,16 +227,6 @@ class Crypt return $cryptValue; } - /** - * Desencriptar la clave maestra de la sesión. - * - * @return string con la clave maestra - */ - public static function getSessionMasterPass() - { - return self::getDecrypt(Session::getMPass(), Session::getMPassIV(), Session::getMPassPwd()); - } - /** * Desencriptar datos con la clave maestra. * @@ -248,7 +238,8 @@ class Crypt public static function getDecrypt($cryptData, $cryptIV, $password = null) { if (is_null($password)) { - $password = self::getSessionMasterPass(); + $password = SessionUtil::getSessionMPass(); +// self::getSessionMasterPass(); } $mcryptRes = self::getMcryptResource(); diff --git a/inc/CryptMasterPass.class.php b/inc/CryptMasterPass.class.php new file mode 100644 index 00000000..d5e180c3 --- /dev/null +++ b/inc/CryptMasterPass.class.php @@ -0,0 +1,116 @@ +. + * + */ + +namespace SP; + +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + +/** + * Class CryptMasterPass para la gestión de la clave maestra + * + * @package SP + */ +class CryptMasterPass +{ + /** + * Crea una clave temporal para encriptar la clave maestra y guardarla. + * + * @param int $maxTime El tiempo máximo de validez de la clave + * @return bool|string + */ + public static function setTempMasterPass($maxTime = 14400) + { + // Encriptar la clave maestra con hash aleatorio generado + $randomKey = Crypt::generateAesKey(Util::generate_random_bytes()); + $pass = Crypt::mkCustomMPassEncrypt($randomKey, SessionUtil::getSessionMPass()); + + if (!is_array($pass)) { + return false; + } + + ConfigDB::setCacheConfigValue('tempmaster_pass', bin2hex($pass[0])); + ConfigDB::setCacheConfigValue('tempmaster_passiv', bin2hex($pass[1])); + ConfigDB::setCacheConfigValue('tempmaster_passhash', Crypt::mkHashPassword($randomKey)); + ConfigDB::setCacheConfigValue('tempmaster_passtime', time()); + ConfigDB::setCacheConfigValue('tempmaster_maxtime', time() + $maxTime); + ConfigDB::setCacheConfigValue('tempmaster_attempts', 0); + + if (!ConfigDB::writeConfig(true)) { + return false; + } + + // Guardar la clave temporal hasta que finalice la sesión + Session::setTemporaryMasterPass($randomKey); + + return $randomKey; + } + + /** + * Comprueba si la clave temporal es válida + * + * @param string $pass clave a comprobar + * @return bool + */ + public static function checkTempMasterPass($pass) + { + $passTime = ConfigDB::getValue('tempmaster_passtime'); + $passMaxTime = ConfigDB::getValue('tempmaster_maxtime'); + $attempts = ConfigDB::getValue('tempmaster_attempts'); + + // Comprobar si el tiempo de validez se ha superado + if ($passTime !== false && time() - $passTime > $passMaxTime || $attempts >= 5) { + ConfigDB::setCacheConfigValue('tempmaster_pass', ''); + ConfigDB::setCacheConfigValue('tempmaster_passiv', ''); + ConfigDB::setCacheConfigValue('tempmaster_passhash', ''); + ConfigDB::writeConfig(); + + return false; + } + + Crypt::checkHashPass($pass, ConfigDB::getValue('tempmaster_passhash')); + + $isValid = Crypt::checkHashPass($pass, ConfigDB::getValue('tempmaster_passhash')); + + if (!$isValid) { + ConfigDB::setValue('tempmaster_attempts', $attempts + 1, false); + } + + return $isValid; + } + + /** + * Devuelve la clave maestra que ha sido encriptada con la clave temporal + * + * @param $pass string con la clave utilizada para encriptar + * @return string con la clave maestra desencriptada + */ + public static function getTempMasterPass($pass) + { + $passLogin = hex2bin(ConfigDB::getValue('tempmaster_pass')); + $passLoginIV = hex2bin(ConfigDB::getValue('tempmaster_passiv')); + + return Crypt::getDecrypt($passLogin, $passLoginIV, $pass); + } +} \ No newline at end of file diff --git a/inc/CryptPKI.class.php b/inc/CryptPKI.class.php index 7e9311f8..92ca7677 100644 --- a/inc/CryptPKI.class.php +++ b/inc/CryptPKI.class.php @@ -25,6 +25,8 @@ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + use phpseclib\Exception\FileNotFoundException; /** diff --git a/inc/CsvImport.class.php b/inc/CsvImport.class.php index d0ba9528..1c6af834 100644 --- a/inc/CsvImport.class.php +++ b/inc/CsvImport.class.php @@ -27,9 +27,13 @@ namespace SP; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); +/** + * Class CsvImport para importar cuentas desde archivos CSV + * + * @package SP + */ class CsvImport extends CsvImportBase { - /** * Iniciar la importación desde XML. * diff --git a/inc/CustomFieldDef.class.php b/inc/CustomFieldDef.class.php index 3478d17f..991de94f 100644 --- a/inc/CustomFieldDef.class.php +++ b/inc/CustomFieldDef.class.php @@ -25,6 +25,13 @@ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + +/** + * Class CustomFieldDef para la gestión de definiciones de campos personalizados + * + * @package SP + */ class CustomFieldDef extends CustomFieldsBase { /** diff --git a/inc/CustomFields.class.php b/inc/CustomFields.class.php index 402f2f2d..bcb443b1 100644 --- a/inc/CustomFields.class.php +++ b/inc/CustomFields.class.php @@ -25,7 +25,13 @@ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); +/** + * Class CustomFields para la gestión de campos personalizados de los módulos + * + * @package SP + */ class CustomFields extends CustomFieldsBase { /** diff --git a/inc/CustomFieldsBase.class.php b/inc/CustomFieldsBase.class.php index 2fcfc151..a4600e81 100644 --- a/inc/CustomFieldsBase.class.php +++ b/inc/CustomFieldsBase.class.php @@ -25,8 +25,15 @@ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + use SP\Controller\ActionsInterface; +/** + * Class CustomFieldsBase para la definición de campos personalizados + * + * @package SP + */ abstract class CustomFieldsBase { /** diff --git a/inc/Email.class.php b/inc/Email.class.php index 1850a334..c3f43d82 100644 --- a/inc/Email.class.php +++ b/inc/Email.class.php @@ -130,11 +130,13 @@ class Email $mail->isSMTP(); $mail->CharSet = 'utf-8'; - $mail->SMTPAuth = $mailAuth; $mail->Host = $mailServer; $mail->Port = $mailPort; - $mail->Username = $mailUser; - $mail->Password = $mailPass; + if ($mailAuth) { + $mail->SMTPAuth = $mailAuth; + $mail->Username = $mailUser; + $mail->Password = $mailPass; + } $mail->SMTPSecure = strtolower(Config::getValue('mail_security')); //$mail->SMTPDebug = 2; //$mail->Debugoutput = 'error_log'; diff --git a/inc/ImportBase.class.php b/inc/ImportBase.class.php index 4d8ee678..0c1cafee 100644 --- a/inc/ImportBase.class.php +++ b/inc/ImportBase.class.php @@ -27,6 +27,11 @@ namespace SP; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); +/** + * Class ImportBase abstracta para manejo de archivos de importación + * + * @package SP + */ abstract class ImportBase { /** diff --git a/inc/Init.class.php b/inc/Init.class.php index 253bd46c..53be8bfb 100644 --- a/inc/Init.class.php +++ b/inc/Init.class.php @@ -482,7 +482,7 @@ class Init $update = false; $configVersion = (int)str_replace('.', '', Config::getValue('version')); - $databaseVersion = (int)str_replace('.', '', Config::getConfigDbValue('version')); + $databaseVersion = (int)str_replace('.', '', ConfigDB::getValue('version')); $appVersion = (int)implode(Util::getVersion(true)); if ($databaseVersion < $appVersion @@ -503,9 +503,9 @@ class Init if ($action === 'upgrade' && $hash === Config::getValue('upgrade_key', 0)) { if (Upgrade::doUpgrade($databaseVersion)) { - Config::setConfigDbValue('version', $appVersion); + ConfigDB::setValue('version', $appVersion); Config::setValue('maintenance', false); - Config::deleteKey('upgrade_key'); + Config::deleteParam('upgrade_key'); $update = true; } } else { @@ -544,17 +544,6 @@ class Init { $sessionLifeTime = self::getSessionLifeTime(); - // Regenerar el Id de sesión periódicamente para evitar fijación - if (Session::getSidStartTime() === 0) { - Session::setSidStartTime(time()); - Session::setStartActivity(time()); - } else if (Session::getUserId() && time() - Session::getSidStartTime() > $sessionLifeTime / 2) { - session_regenerate_id(true); - Session::setSidStartTime(time()); - // Recargar los permisos del perfil de usuario - Session::setUserProfile(Profile::getProfile(Session::getUserProfileId())); - } - // Timeout de sesión if (Session::getLastActivity() && (time() - Session::getLastActivity() > $sessionLifeTime)) { if (isset($_COOKIE[session_name()])) { @@ -566,6 +555,21 @@ class Init session_unset(); session_destroy(); session_start(); + return; + } + + // Regenerar el Id de sesión periódicamente para evitar fijación + if (Session::getSidStartTime() === 0) { + Session::setSidStartTime(time()); + Session::setStartActivity(time()); + } else if (Session::getUserId() && time() - Session::getSidStartTime() > $sessionLifeTime / 2) { + $sessionMPass = SessionUtil::getSessionMPass(); + session_regenerate_id(true); + Session::setSidStartTime(time()); + // Recargar los permisos del perfil de usuario + Session::setUserProfile(Profile::getProfile(Session::getUserProfileId())); + // Regenerar la clave maestra + SessionUtil::saveSessionMPass($sessionMPass); } Session::setLastActivity(time()); diff --git a/inc/Installer.class.php b/inc/Installer.class.php index 9cbbb845..beb7629c 100644 --- a/inc/Installer.class.php +++ b/inc/Installer.class.php @@ -199,7 +199,7 @@ class Installer return $error; } - Config::setConfigDbValue('version', implode(Util::getVersion(true))); + ConfigDB::setValue('version', implode(Util::getVersion(true))); Config::setValue('installed', 1); } @@ -484,9 +484,9 @@ class Installer } // Guardar el hash de la clave maestra - Config::setArrConfigValue('masterPwd', Crypt::mkHashPassword(self::$_masterPassword)); - Config::setArrConfigValue('lastupdatempass', time()); - Config::writeConfigDb(true); + ConfigDB::setCacheConfigValue('masterPwd', Crypt::mkHashPassword(self::$_masterPassword)); + ConfigDB::setCacheConfigValue('lastupdatempass', time()); + ConfigDB::writeConfig(true); if (!$User->updateUserMPass(self::$_masterPassword)) { self::rollback(); @@ -508,8 +508,8 @@ class Installer self::$_dbc->query("DROP USER '" . self::$_dbuser . "'@'" . self::$_dbhost . "';"); self::$_dbc->query("DROP USER '" . self::$_dbuser . "'@'%';"); } catch (\PDOException $e) { - Config::deleteKey('dbuser'); - Config::deleteKey('dbpass'); + Config::deleteParam('dbuser'); + Config::deleteParam('dbpass'); } } diff --git a/inc/Language.class.php b/inc/Language.class.php index 663bbb3b..fc6b5950 100644 --- a/inc/Language.class.php +++ b/inc/Language.class.php @@ -28,7 +28,7 @@ namespace SP; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); /** - * Class Language para el manejo del languaje utilizado por la aplicación + * Class Language para el manejo del lenguaje utilizado por la aplicación * * @package SP */ diff --git a/inc/Migrate.class.php b/inc/Migrate.class.php index 23db004a..d0223b91 100644 --- a/inc/Migrate.class.php +++ b/inc/Migrate.class.php @@ -32,7 +32,6 @@ defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo' */ class Migrate { -// private static $dbuser; private static $_dbc; // Database connection private static $_customersByName; private static $_currentQuery; diff --git a/inc/Minify.class.php b/inc/Minify.class.php index 5fd84d4c..80049dfb 100644 --- a/inc/Minify.class.php +++ b/inc/Minify.class.php @@ -29,6 +29,11 @@ use CssMin; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); +/** + * Class Minify para la gestión de archivos JS y CSS + * + * @package SP + */ class Minify { /** diff --git a/inc/Common.class.php b/inc/Response.class.php similarity index 74% rename from inc/Common.class.php rename to inc/Response.class.php index e63f1db5..05e0088a 100644 --- a/inc/Common.class.php +++ b/inc/Response.class.php @@ -30,7 +30,7 @@ defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo' /** * Esta clase es encargada de ejecutar acciones comunes para las funciones */ -class Common +class Response { /** * Devuelve una respuesta en formato XML con el estado y el mensaje. @@ -95,35 +95,4 @@ class Common header('Content-type: application/json'); exit(json_encode($json)); } - - /** - * Devuelve un hash para verificación de formularios. - * Esta función genera un hash que permite verificar la autenticidad de un formulario - * - * @param bool $new si es necesrio regenerar el hash - * @return string con el hash de verificación - */ - public static function getSessionKey($new = false) - { - $hash = sha1(time()); - - // Generamos un nuevo hash si es necesario y lo guardamos en la sesión - if (is_null(Session::getSecurityKey()) || $new === true) { - Session::setSecurityKey($hash); - return $hash; - } - - return Session::getSecurityKey(); - } - - /** - * Comprobar el hash de verificación de formularios. - * - * @param string $key con el hash a comprobar - * @return bool|string si no es correcto el hash devuelve bool. Si lo es, devuelve el hash actual. - */ - public static function checkSessionKey($key) - { - return (!is_null(Session::getSecurityKey()) && Session::getSecurityKey() == $key); - } } \ No newline at end of file diff --git a/inc/SPException.class.php b/inc/SPException.class.php index b311088d..e93a2093 100644 --- a/inc/SPException.class.php +++ b/inc/SPException.class.php @@ -25,6 +25,8 @@ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + /** * Extender la clase Exception para mostrar ayuda en los mensajes */ diff --git a/inc/Session.class.php b/inc/Session.class.php index 32767ebb..b190f837 100644 --- a/inc/Session.class.php +++ b/inc/Session.class.php @@ -657,4 +657,24 @@ class Session { self::setSessionKey('tempmasterpass', $password); } + + /** + * Devolver el color asociado a una cuenta + * + * @return string + */ + public static function getAccountColor() + { + return self::getSessionKey('accountcolor'); + } + + /** + * Establece l color asociado a una cuenta + * + * @param array $color + */ + public static function setAccountColor(array $color) + { + self::setSessionKey('accountcolor', $color); + } } \ No newline at end of file diff --git a/inc/SessionUtil.class.php b/inc/SessionUtil.class.php index c2b56453..e372aa83 100644 --- a/inc/SessionUtil.class.php +++ b/inc/SessionUtil.class.php @@ -25,7 +25,13 @@ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); +/** + * Class SessionUtil para las utilidades de la sesión + * + * @package SP + */ class SessionUtil { /** @@ -57,4 +63,60 @@ class SessionUtil $CryptPKI = new CryptPKI(); Session::setPublicKey($CryptPKI->getPublicKey()); } + + /** + * Guardar la clave maestra encriptada en la sesión + */ + public static function saveSessionMPass($masterPass) + { + $mPassPwd = Crypt::generateAesKey(session_id()); + $sessionMasterPass = Crypt::mkCustomMPassEncrypt($mPassPwd, $masterPass); + + Session::setMPass($sessionMasterPass[0]); + Session::setMPassIV($sessionMasterPass[1]); + + return true; + } + + /** + * Desencriptar la clave maestra de la sesión. + * + * @return string con la clave maestra + */ + public static function getSessionMPass() + { + $cryptPass = Crypt::generateAesKey(session_id()); + return Crypt::getDecrypt(Session::getMPass(), Session::getMPassIV(), $cryptPass); + } + + /** + * Devuelve un hash para verificación de formularios. + * Esta función genera un hash que permite verificar la autenticidad de un formulario + * + * @param bool $new si es necesrio regenerar el hash + * @return string con el hash de verificación + */ + public static function getSessionKey($new = false) + { + $hash = sha1(time()); + + // Generamos un nuevo hash si es necesario y lo guardamos en la sesión + if (is_null(Session::getSecurityKey()) || $new === true) { + Session::setSecurityKey($hash); + return $hash; + } + + return Session::getSecurityKey(); + } + + /** + * Comprobar el hash de verificación de formularios. + * + * @param string $key con el hash a comprobar + * @return bool|string si no es correcto el hash devuelve bool. Si lo es, devuelve el hash actual. + */ + public static function checkSessionKey($key) + { + return (!is_null(Session::getSecurityKey()) && Session::getSecurityKey() == $key); + } } \ No newline at end of file diff --git a/inc/Template.class.php b/inc/Template.class.php index 184b0abc..73d172a5 100644 --- a/inc/Template.class.php +++ b/inc/Template.class.php @@ -24,6 +24,8 @@ */ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + use InvalidArgumentException; /** diff --git a/inc/Upgrade.class.php b/inc/Upgrade.class.php index da56b86a..4507b911 100644 --- a/inc/Upgrade.class.php +++ b/inc/Upgrade.class.php @@ -214,7 +214,7 @@ class Upgrade foreach ($mapParams as $newParam => $oldParam) { if (array_key_exists($oldParam, $currData)) { Config::setValue($newParam, $currData[$oldParam]); - Config::deleteKey($oldParam); + Config::deleteParam($oldParam); } } @@ -232,10 +232,10 @@ class Upgrade private static function auxUpgrades($version){ switch ($version){ case 12001: - return (Profile::migrateProfiles() && UserUtil::migrateUsersGroup()); + return (Profile::migrateProfiles() && UserMigrate::migrateUsersGroup()); break; case 12002: - return (UserUtil::setMigrateUsers()); + return (UserMigrate::setMigrateUsers()); break; default: break; diff --git a/inc/User.class.php b/inc/User.class.php index 83822695..ade1190d 100644 --- a/inc/User.class.php +++ b/inc/User.class.php @@ -42,14 +42,14 @@ class User extends UserBase */ public function updateUserMPass($masterPwd) { - $configMPass = Config::getConfigDbValue('masterPwd'); + $configMPass = ConfigDB::getValue('masterPwd'); if (!$configMPass) { return false; } if (Crypt::checkHashPass($masterPwd, $configMPass, true)) { - $strUserMPwd = Crypt::mkCustomMPassEncrypt(self::getCypherPass($this->_userPass), $masterPwd); + $strUserMPwd = Crypt::mkCustomMPassEncrypt(self::getCypherPass(), $masterPwd); if (!$strUserMPwd) { return false; @@ -106,18 +106,7 @@ class User extends UserBase return false; } - if ($showPass == true) { - return $clearMasterPass; - } else { - $mPassPwd = Util::generate_random_bytes(32); - Session::setMPassPwd($mPassPwd); - - $sessionMasterPass = Crypt::mkCustomMPassEncrypt($mPassPwd, $clearMasterPass); - - Session::setMPass($sessionMasterPass[0]); - Session::setMPassIV($sessionMasterPass[1]); - return true; - } + return ($showPass == true) ? $clearMasterPass : SessionUtil::saveSessionMPass($clearMasterPass); } return false; diff --git a/inc/UserAccounts.class.php b/inc/UserAccounts.class.php new file mode 100644 index 00000000..aed025b4 --- /dev/null +++ b/inc/UserAccounts.class.php @@ -0,0 +1,172 @@ +. + * + */ + +namespace SP; + +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + +/** + * Class UserAccounts para la gestión de usuarios en las cuentas + * + * @package SP + */ +class UserAccounts +{ + /** + * Actualizar la asociación de grupos con cuentas. + * + * @param int $accountId con el Id de la cuenta + * @param array $usersId con los usuarios de la cuenta + * @return bool + */ + public static function updateUsersForAccount($accountId, $usersId) + { + if (self::deleteUsersForAccount($accountId, $usersId)) { + return self::addUsersForAccount($accountId, $usersId); + } + + return false; + } + + /** + * Eliminar la asociación de grupos con cuentas. + * + * @param int $accountId con el Id de la cuenta + * @param array $usersId opcional con los grupos de la cuenta + * @return bool + */ + public static function deleteUsersForAccount($accountId, $usersId = null) + { + $queryExcluded = ''; + + // Excluimos los usuarios actuales + if (is_array($usersId)) { + array_map('intval', $usersId); + $queryExcluded = 'AND accuser_userId NOT IN (' . implode(',', $usersId) . ')'; + } + + $query = 'DELETE FROM accUsers WHERE accuser_accountId = :id ' . $queryExcluded; + + $data['id'] = $accountId; + + return DB::getQuery($query, __FUNCTION__, $data); + } + + /** + * Crear asociación de grupos con cuentas. + * + * @param int $accountId con el Id de la cuenta + * @param array $usersId con los grupos de la cuenta + * @return bool + */ + public static function addUsersForAccount($accountId, $usersId) + { + if (!is_array($usersId)) { + return true; + } + + $values = ''; + + // Obtenemos los grupos actuales + $usersExcluded = self::getUsersForAccount($accountId); + + foreach ($usersId as $userId) { + // Excluimos los usuarios actuales + if (isset($usersExcluded) && is_array($usersExcluded) && in_array($userId, $usersExcluded)) { + continue; + } + + $values[] = '(' . (int)$accountId . ',' . (int)$userId . ')'; + } + + if (!is_array($values)) { + return true; + } + + $query = 'INSERT INTO accUsers (accuser_accountId, accuser_userId) VALUES ' . implode(',', $values); + + return DB::getQuery($query, __FUNCTION__); + } + + /** + * Obtiene el listado de usuarios de una cuenta. + * + * @param int $accountId con el id de la cuenta + * @return array con los id de usuarios de la cuenta + */ + public static function getUsersForAccount($accountId) + { + $query = 'SELECT accuser_userId FROM accUsers WHERE accuser_accountId = :id'; + + $data['id'] = $accountId; + + DB::setReturnArray(); + + $queryRes = DB::getResults($query, __FUNCTION__, $data); + + if ($queryRes === false) { + return array(); + } + + foreach ($queryRes as $user) { + $users[] = (int)$user->accuser_userId; + } + + return $users; + } + + /** + * Obtiene el listado con el nombre de los usuarios de una cuenta. + * + * @param int $accountId con el id de la cuenta + * @return false|array con los nombres de los usuarios ordenados + */ + public static function getUsersNameForAccount($accountId) + { + $query = 'SELECT user_id,' + . 'user_login ' + . 'FROM accUsers ' + . 'JOIN usrData ON user_Id = accuser_userId ' + . 'WHERE accuser_accountId = :id'; + + $data['id'] = $accountId; + + DB::setReturnArray(); + + $queryRes = DB::getResults($query, __FUNCTION__, $data); + + if ($queryRes === false) { + return false; + } + + foreach ($queryRes as $users) { + $usersName[$users->user_id] = $users->user_login; + } + + asort($usersName, SORT_STRING); + + return $usersName; + } +} \ No newline at end of file diff --git a/inc/UserBase.class.php b/inc/UserBase.class.php index d01f109a..c4cc10e8 100644 --- a/inc/UserBase.class.php +++ b/inc/UserBase.class.php @@ -25,6 +25,8 @@ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + /** * Class UserBase * @@ -340,7 +342,7 @@ abstract class UserBase */ public function addUser() { - $passdata = UserUtil::makeUserPassHash($this->_userPass); + $passdata = UserPass::makeUserPassHash($this->_userPass); $query = 'INSERT INTO usrData SET ' . 'user_name = :name,' @@ -545,7 +547,7 @@ abstract class UserBase */ public function updateUserPass() { - $passdata = UserUtil::makeUserPassHash($this->_userPass); + $passdata = UserPass::makeUserPassHash($this->_userPass); $userLogin = UserUtil::getUserLoginById($this->_userId); $query = 'UPDATE usrData SET ' diff --git a/inc/UserLdap.class.php b/inc/UserLdap.class.php index 0bab7283..9857071c 100644 --- a/inc/UserLdap.class.php +++ b/inc/UserLdap.class.php @@ -44,7 +44,7 @@ class UserLdap */ public static function newUserLDAP(User $User) { - $passdata = UserUtil::makeUserPassHash($User->getUserPass()); + $passdata = UserPass::makeUserPassHash($User->getUserPass()); $groupId = Config::getValue('ldap_defaultgroup', 0); $profileId = Config::getValue('ldap_defaultprofile', 0); @@ -95,7 +95,7 @@ class UserLdap */ public static function updateLDAPUserInDB(User $User) { - $passdata = UserUtil::makeUserPassHash($User->getUserPass()); + $passdata = UserPass::makeUserPassHash($User->getUserPass()); $query = 'UPDATE usrData SET ' . 'user_pass = :pass,' diff --git a/inc/UserMigrate.class.php b/inc/UserMigrate.class.php new file mode 100644 index 00000000..1e90cbe1 --- /dev/null +++ b/inc/UserMigrate.class.php @@ -0,0 +1,129 @@ +. + * + */ + +namespace SP; + +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + +/** + * Class UserMigrate para la migración de usuarios + * + * @package SP + */ +class UserMigrate +{ + + /** + * Comprobar si un usuario está migrado desde phpPMS. + * + * @param string $userLogin con el login del usuario + * @return bool + */ + public static function checkUserIsMigrate($userLogin) + { + $query = 'SELECT BIN(user_isMigrate) AS user_isMigrate FROM usrData WHERE user_login = :login LIMIT 1'; + + $data['login'] = $userLogin; + + $queryRes = DB::getResults($query, __FUNCTION__, $data); + + return ($queryRes !== false && $queryRes->user_isMigrate == 1); + } + + /** + * Actualizar la clave de un usuario desde phpPMS. + * + * @param string $userLogin con el login del usuario + * @param string $userPass con la clave del usuario + * @return bool + * + * Esta función actualiza la clave de un usuario que ha sido migrado desde phpPMS + */ + public static function migrateUser($userLogin, $userPass) + { + $passdata = UserPass::makeUserPassHash($userPass); + + $query = 'UPDATE usrData SET ' + . 'user_pass = :pass,' + . 'user_hashSalt = :salt,' + . 'user_lastUpdate = NOW(),' + . 'user_isMigrate = 0 ' + . 'WHERE user_login = :login ' + . 'AND user_isMigrate = 1 ' + . 'AND (user_pass = SHA1(CONCAT(user_hashSalt,:passOld)) ' + . 'OR user_pass = MD5(:passOldMd5)) LIMIT 1'; + + $data['pass'] = $passdata['pass']; + $data['salt'] = $passdata['salt']; + $data['login'] = $userLogin; + $data['passOld'] = $userPass; + $data['passOldMd5'] = $userPass; + + if (DB::getQuery($query, __FUNCTION__, $data) === false) { + return false; + } + + $log = new Log(__FUNCTION__); + $log->addDescription(_('Usuario actualizado')); + $log->addDescription('Login: ' . $userLogin); + $log->writeLog(); + + Email::sendEmail($log); + + return true; + } + + /** + * Migrar el grupo de los usuarios a la nueva tabla + */ + public static function migrateUsersGroup() + { + $query = 'SELECT user_id, user_groupId FROM usrData'; + + $queryRes = DB::getResults($query, __FUNCTION__, $data); + + if ($queryRes === false) { + return false; + } + + foreach ($queryRes as $user) { + if (!Groups::addUsersForGroup(array($user->user_groupId), $user->user_id)) { + Log::writeNewLog(_('Migrar Grupos'), sprintf('%s (%s)'), _('Error al migrar grupo del usuario'), $user->user_id); + } + } + + return true; + } + + /** + * Establecer el campo isMigrate de cada usuario + */ + public static function setMigrateUsers() + { + $query = 'UPDATE usrData SET user_isMigrate = 1'; + + return DB::getQuery($query, __FUNCTION__); + } +} \ No newline at end of file diff --git a/inc/UserPass.class.php b/inc/UserPass.class.php new file mode 100644 index 00000000..03b18bb4 --- /dev/null +++ b/inc/UserPass.class.php @@ -0,0 +1,166 @@ +. + * + */ + +namespace SP; + +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + +/** + * Class UserPass para la gestión de las claves de un usuario + * + * @package SP + */ +class UserPass +{ + /** + * @var int El último id de una consulta de actualización + */ + public static $queryLastId = 0; + + /** + * Comprueba la clave maestra del usuario. + * + * @param User $User + * @return bool + */ + public static function checkUserMPass(User $User) + { + $userMPass = $User->getUserMPass(true); + + if ($userMPass === false) { + return false; + } + + $configHashMPass = ConfigDB::getValue('masterPwd'); + + if ($configHashMPass === false) { + return false; + } + + // Comprobamos el hash de la clave del usuario con la guardada + return Crypt::checkHashPass($userMPass, $configHashMPass, true); + } + + /** + * Comprobar si el usuario tiene actualizada la clave maestra actual. + * + * @param string $login opcional con el login del usuario + * @return bool + */ + public static function checkUserUpdateMPass($login = null) + { + $userId = (!is_null($login)) ? UserUtil::getUserIdByLogin($login) : Session::getUserId(); + + if ($userId === 0) { + return false; + } + + $configMPassTime = ConfigDB::getValue('lastupdatempass'); + + if ($configMPassTime === false) { + return false; + } + + $query = 'SELECT user_lastUpdateMPass FROM usrData WHERE user_id = :id LIMIT 1'; + + $data['id'] = $userId; + + $queryRes = DB::getResults($query, __FUNCTION__, $data); + + $ret = ($queryRes !== false && $queryRes->user_lastUpdateMPass > $configMPassTime); + + return $ret; + + } + + /** + * Modificar la clave de un usuario. + * + * @param $userId + * @param $userPass + * @return bool + */ + public static function updateUserPass($userId, $userPass) + { + $passdata = self::makeUserPassHash($userPass); + $userLogin = UserUtil::getUserLoginById($userId); + + $query = 'UPDATE usrData SET ' + . 'user_pass = :pass,' + . 'user_hashSalt = :salt,' + . 'user_isChangePass = 0,' + . 'user_lastUpdate = NOW() ' + . 'WHERE user_id = :id LIMIT 1'; + + $data['pass'] = $passdata['pass']; + $data['salt'] = $passdata['salt']; + $data['id'] = $userId; + + if (DB::getQuery($query, __FUNCTION__, $data) === false) { + return false; + } + + self::$queryLastId = DB::$lastId; + + Log::writeNewLogAndEmail(_('Modificar Clave Usuario'), sprintf('%s : %s', Html::strongText(_('Login')), $userLogin)); + + return true; + } + + /** + * Crear la clave de un usuario. + * + * @param string $userPass con la clave del usuario + * @return array con la clave y salt del usuario + */ + public static function makeUserPassHash($userPass) + { + $salt = Crypt::makeHashSalt(); + $userPass = crypt($userPass, $salt); + + return array('salt' => $salt, 'pass' => $userPass); + } + + /** + * Obtener el IV del usuario a partir del Id. + * + * @param int $id El id del usuario + * @return string El hash + */ + public static function getUserIVById($id) + { + $query = 'SELECT user_mIV FROM usrData WHERE user_id = :id LIMIT 1'; + + $data['id'] = $id; + + $queryRes = DB::getResults($query, __FUNCTION__, $data); + + if ($queryRes === false) { + return false; + } + + return $queryRes->user_mIV; + } +} \ No newline at end of file diff --git a/inc/UserPassRecover.class.php b/inc/UserPassRecover.class.php new file mode 100644 index 00000000..d067bde8 --- /dev/null +++ b/inc/UserPassRecover.class.php @@ -0,0 +1,130 @@ +. + * + */ + +namespace SP; + +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + +/** + * Class UserPassRecover para la gestión de recuperaciones de claves de usuarios + * + * @package SP + */ +class UserPassRecover +{ + /** + * Tiempo máximo para recuperar la clave + */ + const MAX_PASS_RECOVER_TIME = 3600; + /** + * Número de intentos máximos para recuperar la clave + */ + const MAX_PASS_RECOVER_LIMIT = 3; + const USER_LOGIN_EXIST = 1; + const USER_MAIL_EXIST = 2; + + /** + * Comprobar el hash de recuperación de clave. + * + * @param string $hash con el hash de recuperación + * @return int con el Id del usuario + */ + public static function checkHashPassRecover($hash) + { + $query = 'SELECT userpassr_userId FROM usrPassRecover ' + . 'WHERE userpassr_hash = :hash ' + . 'AND userpassr_used = 0 ' + . 'AND userpassr_date >= :date ' + . 'ORDER BY userpassr_date DESC LIMIT 1'; + + $data['hash'] = $hash; + $data['date'] = time() - self::MAX_PASS_RECOVER_TIME; + + $queryRes = DB::getResults($query, __FUNCTION__, $data); + + if ($queryRes === false) { + return false; + } + + return $queryRes->userpassr_userId; + } + + /** + * Marcar como usado el hash de recuperación de clave. + * + * @param string $hash con el hash de recuperación + * @return bool + */ + public static function updateHashPassRecover($hash) + { + $query = 'UPDATE usrPassRecover SET userpassr_used = 1 WHERE userpassr_hash = :hash'; + + $data['hash'] = $hash; + + return DB::getQuery($query, __FUNCTION__, $data); + } + + /** + * Comprobar el límite de recuperaciones de clave. + * + * @param string $login con el login del usuario + * @return bool + */ + public static function checkPassRecoverLimit($login) + { + $query = 'SELECT userpassr_userId ' . + 'FROM usrPassRecover ' . + 'WHERE userpassr_userId = :id ' . + 'AND userpassr_used = 0 ' . + 'AND userpassr_date >= :date'; + + $data['id'] = UserUtil::getUserIdByLogin($login); + $data['date'] = time() - self::MAX_PASS_RECOVER_TIME; + + return (DB::getQuery($query, __FUNCTION__, $data) === false || DB::$lastNumRows >= self::MAX_PASS_RECOVER_LIMIT); + } + + /** + * Insertar un registro de recuperación de clave. + * + * @param string $login con el login del usuario + * @param string $hash con el hash para el cambio + * @return bool + */ + public static function addPassRecover($login, $hash) + { + $query = 'INSERT INTO usrPassRecover SET ' + . 'userpassr_userId = :userId,' + . 'userpassr_hash = :hash,' + . 'userpassr_date = UNIX_TIMESTAMP(),' + . 'userpassr_used = 0'; + + $data['userId'] = UserUtil::getUserIdByLogin($login); + $data['hash'] = $hash; + + return DB::getQuery($query, __FUNCTION__, $data); + } + +} \ No newline at end of file diff --git a/inc/UserUtil.class.php b/inc/UserUtil.class.php index 2cdb16f0..d76ead37 100644 --- a/inc/UserUtil.class.php +++ b/inc/UserUtil.class.php @@ -34,126 +34,8 @@ defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo' */ class UserUtil { - /** - * Tiempo máximo para recuperar la clave - */ - const MAX_PASS_RECOVER_TIME = 3600; - /** - * Número de intentos máximos para recuperar la clave - */ - const MAX_PASS_RECOVER_LIMIT = 3; const USER_LOGIN_EXIST = 1; const USER_MAIL_EXIST = 2; - /** - * @var int El último id de una consulta de actualización - */ - public static $queryLastId = 0; - - /** - * Comprobar si un usuario está migrado desde phpPMS. - * - * @param string $userLogin con el login del usuario - * @return bool - */ - public static function checkUserIsMigrate($userLogin) - { - $query = 'SELECT BIN(user_isMigrate) AS user_isMigrate FROM usrData WHERE user_login = :login LIMIT 1'; - - $data['login'] = $userLogin; - - $queryRes = DB::getResults($query, __FUNCTION__, $data); - - return ($queryRes !== false && $queryRes->user_isMigrate == 1); - } - - /** - * Actualizar la clave de un usuario desde phpPMS. - * - * @param string $userLogin con el login del usuario - * @param string $userPass con la clave del usuario - * @return bool - * - * Esta función actualiza la clave de un usuario que ha sido migrado desde phpPMS - */ - public static function migrateUser($userLogin, $userPass) - { - $passdata = UserUtil::makeUserPassHash($userPass); - - $query = 'UPDATE usrData SET ' - . 'user_pass = :pass,' - . 'user_hashSalt = :salt,' - . 'user_lastUpdate = NOW(),' - . 'user_isMigrate = 0 ' - . 'WHERE user_login = :login ' - . 'AND user_isMigrate = 1 ' - . 'AND (user_pass = SHA1(CONCAT(user_hashSalt,:passOld)) ' - . 'OR user_pass = MD5(:passOldMd5)) LIMIT 1'; - - $data['pass'] = $passdata['pass']; - $data['salt'] = $passdata['salt']; - $data['login'] = $userLogin; - $data['passOld'] = $userPass; - $data['passOldMd5'] = $userPass; - - if (DB::getQuery($query, __FUNCTION__, $data) === false) { - return false; - } - - $log = new Log(__FUNCTION__); - $log->addDescription(_('Usuario actualizado')); - $log->addDescription('Login: ' . $userLogin); - $log->writeLog(); - - Email::sendEmail($log); - - return true; - } - - /** - * Crear la clave de un usuario. - * - * @param string $userPass con la clave del usuario - * @return array con la clave y salt del usuario - */ - public static function makeUserPassHash($userPass) - { - $salt = Crypt::makeHashSalt(); - $userPass = crypt($userPass, $salt); - - return array('salt' => $salt, 'pass' => $userPass); - } - - /** - * Comprobar si el usuario tiene actualizada la clave maestra actual. - * - * @param string $login opcional con el login del usuario - * @return bool - */ - public static function checkUserUpdateMPass($login = null) - { - $userId = (!is_null($login)) ? self::getUserIdByLogin($login) : Session::getUserId(); - - if ($userId === 0) { - return false; - } - - $configMPassTime = Config::getConfigDbValue('lastupdatempass'); - - if ($configMPassTime === false) { - return false; - } - - $query = 'SELECT user_lastUpdateMPass FROM usrData WHERE user_id = :id LIMIT 1'; - - $data['id'] = $userId; - - $queryRes = DB::getResults($query, __FUNCTION__, $data); - - $ret = ($queryRes !== false && $queryRes->user_lastUpdateMPass > $configMPassTime); - - return $ret; - - } /** * Obtener el Id de usuario a partir del login. @@ -176,108 +58,6 @@ class UserUtil return (int)$queryRes->user_id; } - /** - * Actualizar la asociación de grupos con cuentas. - * - * @param int $accountId con el Id de la cuenta - * @param array $usersId con los usuarios de la cuenta - * @return bool - */ - public static function updateUsersForAccount($accountId, $usersId) - { - if (self::deleteUsersForAccount($accountId, $usersId)) { - return self::addUsersForAccount($accountId, $usersId); - } - - return false; - } - - /** - * Eliminar la asociación de grupos con cuentas. - * - * @param int $accountId con el Id de la cuenta - * @param array $usersId opcional con los grupos de la cuenta - * @return bool - */ - public static function deleteUsersForAccount($accountId, $usersId = null) - { - $queryExcluded = ''; - - // Excluimos los usuarios actuales - if (is_array($usersId)) { - array_map('intval', $usersId); - $queryExcluded = 'AND accuser_userId NOT IN (' . implode(',', $usersId) . ')'; - } - - $query = 'DELETE FROM accUsers WHERE accuser_accountId = :id ' . $queryExcluded; - - $data['id'] = $accountId; - - return DB::getQuery($query, __FUNCTION__, $data); - } - - /** - * Crear asociación de grupos con cuentas. - * - * @param int $accountId con el Id de la cuenta - * @param array $usersId con los grupos de la cuenta - * @return bool - */ - public static function addUsersForAccount($accountId, $usersId) - { - if (!is_array($usersId)) { - return true; - } - - $values = ''; - - // Obtenemos los grupos actuales - $usersExcluded = self::getUsersForAccount($accountId); - - foreach ($usersId as $userId) { - // Excluimos los usuarios actuales - if (isset($usersExcluded) && is_array($usersExcluded) && in_array($userId, $usersExcluded)) { - continue; - } - - $values[] = '(' . (int)$accountId . ',' . (int)$userId . ')'; - } - - if (!is_array($values)) { - return true; - } - - $query = 'INSERT INTO accUsers (accuser_accountId, accuser_userId) VALUES ' . implode(',', $values); - - return DB::getQuery($query, __FUNCTION__); - } - - /** - * Obtiene el listado de usuarios de una cuenta. - * - * @param int $accountId con el id de la cuenta - * @return array con los id de usuarios de la cuenta - */ - public static function getUsersForAccount($accountId) - { - $query = 'SELECT accuser_userId FROM accUsers WHERE accuser_accountId = :id'; - - $data['id'] = $accountId; - - DB::setReturnArray(); - - $queryRes = DB::getResults($query, __FUNCTION__, $data); - - if ($queryRes === false) { - return array(); - } - - foreach ($queryRes as $user) { - $users[] = (int)$user->accuser_userId; - } - - return $users; - } /** * Comprobar si un usuario está deshabilitado. @@ -298,100 +78,6 @@ class UserUtil return $ret; } - /** - * Comprobar el hash de recuperación de clave. - * - * @param string $hash con el hash de recuperación - * @return int con el Id del usuario - */ - public static function checkHashPassRecover($hash) - { - $query = 'SELECT userpassr_userId FROM usrPassRecover ' - . 'WHERE userpassr_hash = :hash ' - . 'AND userpassr_used = 0 ' - . 'AND userpassr_date >= :date ' - . 'ORDER BY userpassr_date DESC LIMIT 1'; - - $data['hash'] = $hash; - $data['date'] = time() - self::MAX_PASS_RECOVER_TIME; - - $queryRes = DB::getResults($query, __FUNCTION__, $data); - - if ($queryRes === false) { - return false; - } - - return $queryRes->userpassr_userId; - } - - /** - * Marcar como usado el hash de recuperación de clave. - * - * @param string $hash con el hash de recuperación - * @return bool - */ - public static function updateHashPassRecover($hash) - { - $query = 'UPDATE usrPassRecover SET userpassr_used = 1 WHERE userpassr_hash = :hash'; - - $data['hash'] = $hash; - - return DB::getQuery($query, __FUNCTION__, $data); - } - - /** - * Comprobar el límite de recuperaciones de clave. - * - * @param string $login con el login del usuario - * @return bool - */ - public static function checkPassRecoverLimit($login) - { - $query = 'SELECT userpassr_userId ' . - 'FROM usrPassRecover ' . - 'WHERE userpassr_userId = :id ' . - 'AND userpassr_used = 0 ' . - 'AND userpassr_date >= :date'; - - $data['id'] = self::getUserIdByLogin($login); - $data['date'] = time() - self::MAX_PASS_RECOVER_TIME; - - return (DB::getQuery($query, __FUNCTION__, $data) === false || DB::$lastNumRows >= self::MAX_PASS_RECOVER_LIMIT); - } - - /** - * Obtiene el listado con el nombre de los usuarios de una cuenta. - * - * @param int $accountId con el id de la cuenta - * @return false|array con los nombres de los usuarios ordenados - */ - public static function getUsersNameForAccount($accountId) - { - $query = 'SELECT user_id,' - . 'user_login ' - . 'FROM accUsers ' - . 'JOIN usrData ON user_Id = accuser_userId ' - . 'WHERE accuser_accountId = :id'; - - $data['id'] = $accountId; - - DB::setReturnArray(); - - $queryRes = DB::getResults($query, __FUNCTION__, $data); - - if ($queryRes === false) { - return false; - } - - foreach ($queryRes as $users) { - $usersName[$users->user_id] = $users->user_login; - } - - asort($usersName, SORT_STRING); - - return $usersName; - } - /** * Comprobar si un usuario y email existen. * @@ -430,49 +116,6 @@ class UserUtil return $queryRes->user_email; } - /** - * Insertar un registro de recuperación de clave. - * - * @param string $login con el login del usuario - * @param string $hash con el hash para el cambio - * @return bool - */ - public static function addPassRecover($login, $hash) - { - $query = 'INSERT INTO usrPassRecover SET ' - . 'userpassr_userId = :userId,' - . 'userpassr_hash = :hash,' - . 'userpassr_date = UNIX_TIMESTAMP(),' - . 'userpassr_used = 0'; - - $data['userId'] = self::getUserIdByLogin($login); - $data['hash'] = $hash; - - return DB::getQuery($query, __FUNCTION__, $data); - } - - /** - * Obtener el IV del usuario a partir del Id. - * - * @param int $id El id del usuario - * @return string El hash - */ - public static function getUserIVById($id) - { - $query = 'SELECT user_mIV FROM usrData WHERE user_id = :id LIMIT 1'; - - $data['id'] = $id; - - $queryRes = DB::getResults($query, __FUNCTION__, $data); - - if ($queryRes === false) { - return false; - } - - return $queryRes->user_mIV; - } - - /** * Actualiza el último inicio de sesión del usuario en la BBDD. * @@ -488,29 +131,6 @@ class UserUtil return DB::getQuery($query, __FUNCTION__, $data); } - /** - * Comprueba la clave maestra del usuario. - * - * @param User $User - * @return bool - */ - public static function checkUserMPass(User $User) - { - $userMPass = $User->getUserMPass(true); - - if ($userMPass === false) { - return false; - } - - $configHashMPass = Config::getConfigDbValue('masterPwd'); - - if ($configHashMPass === false) { - return false; - } - - // Comprobamos el hash de la clave del usuario con la guardada - return Crypt::checkHashPass($userMPass, $configHashMPass, true); - } /** * Obtener los datos de un usuario. @@ -627,39 +247,6 @@ class UserUtil return DB::getResults($query, __FUNCTION__, $data); } - /** - * Modificar la clave de un usuario. - * - * @param $userId - * @param $userPass - * @return bool - */ - public static function updateUserPass($userId, $userPass) - { - $passdata = UserUtil::makeUserPassHash($userPass); - $userLogin = UserUtil::getUserLoginById($userId); - - $query = 'UPDATE usrData SET ' - . 'user_pass = :pass,' - . 'user_hashSalt = :salt,' - . 'user_isChangePass = 0,' - . 'user_lastUpdate = NOW() ' - . 'WHERE user_id = :id LIMIT 1'; - - $data['pass'] = $passdata['pass']; - $data['salt'] = $passdata['salt']; - $data['id'] = $userId; - - if (DB::getQuery($query, __FUNCTION__, $data) === false) { - return false; - } - - self::$queryLastId = DB::$lastId; - - Log::writeNewLogAndEmail(_('Modificar Clave Usuario'), sprintf('%s : %s', Html::strongText(_('Login')), $userLogin)); - - return true; - } /** * Obtener el login de usuario a partir del Id. @@ -681,36 +268,4 @@ class UserUtil return $queryRes->user_login; } - - /** - * Migrar el grupo de los usuarios a la nueva tabla - */ - public static function migrateUsersGroup() - { - $query = 'SELECT user_id, user_groupId FROM usrData'; - - $queryRes = DB::getResults($query, __FUNCTION__, $data); - - if ($queryRes === false) { - return false; - } - - foreach ($queryRes as $user) { - if (!Groups::addUsersForGroup(array($user->user_groupId), $user->user_id)) { - Log::writeNewLog(_('Migrar Grupos'), sprintf('%s (%s)'), _('Error al migrar grupo del usuario'), $user->user_id); - } - } - - return true; - } - - /** - * Establecer el campo isMigrate de cada usuario - */ - public static function setMigrateUsers() - { - $query = 'UPDATE usrData SET user_isMigrate = 1'; - - return DB::getQuery($query, __FUNCTION__); - } } \ No newline at end of file diff --git a/inc/Util.class.php b/inc/Util.class.php index 70fd86fb..e524ac47 100644 --- a/inc/Util.class.php +++ b/inc/Util.class.php @@ -25,9 +25,6 @@ namespace SP; -use CssMin; -use phpseclib\Crypt\RSA; - defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); /** @@ -199,7 +196,7 @@ class Util */ public static function getVersionString() { - return '1.2-rc4'; + return '1.2-rc5'; } /** @@ -312,7 +309,7 @@ class Util */ public static function getVersion($retBuild = false) { - $build = '04'; + $build = '05'; $version = array(1, 2, 0); if ($retBuild) { @@ -548,7 +545,7 @@ class Util } /** - * Obtener datos desde una URL + * Obtener datos desde una URL usando CURL * * @param $url string La URL * @return bool|string diff --git a/inc/XmlExport.class.php b/inc/XmlExport.class.php index 2e6c1f19..f3e51999 100644 --- a/inc/XmlExport.class.php +++ b/inc/XmlExport.class.php @@ -25,6 +25,8 @@ namespace SP; +defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); + /** * Clase XmlExport para realizar la exportación de las cuentas de sysPass a formato XML * diff --git a/inc/XmlImportBase.class.php b/inc/XmlImportBase.class.php index 1f3d9c1b..77b7f49d 100644 --- a/inc/XmlImportBase.class.php +++ b/inc/XmlImportBase.class.php @@ -27,6 +27,11 @@ namespace SP; defined('APP_ROOT') || die(_('No es posible acceder directamente a este archivo')); +/** + * Class XmlImportBase abstracta para manejar archivos de importación en formato XML + * + * @package SP + */ abstract class XmlImportBase extends ImportBase { /** diff --git a/inc/locales/en_US/LC_MESSAGES/messages.mo b/inc/locales/en_US/LC_MESSAGES/messages.mo index 37fc30bc37f91481cefe13fd96b799a300b0d06a..09858549d83cafc7e06fdf85d1d3e08aeaebdbe1 100644 GIT binary patch delta 20936 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 delta 20457 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 U_Dh~(YkV5Nul?u7Mf)xI9~|!Ky#N3J diff --git a/inc/locales/en_US/LC_MESSAGES/messages.po b/inc/locales/en_US/LC_MESSAGES/messages.po index adbd63f3..0d6c766f 100644 --- a/inc/locales/en_US/LC_MESSAGES/messages.po +++ b/inc/locales/en_US/LC_MESSAGES/messages.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: sysPass\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 00:58+0100\n" -"PO-Revision-Date: 2015-10-06 00:59+0100\n" +"POT-Creation-Date: 2015-10-06 14:53+0100\n" +"PO-Revision-Date: 2015-10-06 14:54+0100\n" "Last-Translator: nuxsmin \n" "Language-Team: nuxsmin@syspass.org\n" "Language: en_US\n" @@ -22,126 +22,126 @@ msgstr "" "X-Generator: Poedit 1.6.10\n" "X-Poedit-SearchPath-0: ../../../..\n" -#: ../../../../ajax/ajax_2fa.php:35 ../../../../ajax/ajax_accountSave.php:41 -#: ../../../../ajax/ajax_appMgmtSave.php:42 -#: ../../../../ajax/ajax_backup.php:39 ../../../../ajax/ajax_checkLdap.php:41 -#: ../../../../ajax/ajax_configSave.php:41 ../../../../ajax/ajax_files.php:41 -#: ../../../../ajax/ajax_getFiles.php:46 ../../../../ajax/ajax_import.php:49 -#: ../../../../ajax/ajax_migrate.php:45 ../../../../ajax/ajax_passReset.php:37 -#: ../../../../ajax/ajax_search.php:41 -#: ../../../../ajax/ajax_sendRequest.php:41 -#: ../../../../ajax/ajax_userPrefsSave.php:42 +#: ../../../../ajax/ajax_2fa.php:37 ../../../../ajax/ajax_accountSave.php:42 +#: ../../../../ajax/ajax_appMgmtSave.php:43 +#: ../../../../ajax/ajax_backup.php:41 ../../../../ajax/ajax_checkLdap.php:42 +#: ../../../../ajax/ajax_configSave.php:44 ../../../../ajax/ajax_files.php:42 +#: ../../../../ajax/ajax_getFiles.php:47 ../../../../ajax/ajax_import.php:50 +#: ../../../../ajax/ajax_migrate.php:46 ../../../../ajax/ajax_passReset.php:40 +#: ../../../../ajax/ajax_search.php:42 +#: ../../../../ajax/ajax_sendRequest.php:42 +#: ../../../../ajax/ajax_userPrefsSave.php:43 msgid "CONSULTA INVÁLIDA" msgstr "INVALID QUERY" -#: ../../../../ajax/ajax_2fa.php:55 +#: ../../../../ajax/ajax_2fa.php:57 msgid "Código correcto" msgstr "Verified code" -#: ../../../../ajax/ajax_2fa.php:58 ../../../../ajax/ajax_userPrefsSave.php:94 +#: ../../../../ajax/ajax_2fa.php:60 ../../../../ajax/ajax_userPrefsSave.php:95 msgid "Código incorrecto" msgstr "Wrong code" -#: ../../../../ajax/ajax_accountSave.php:35 -#: ../../../../ajax/ajax_appMgmtSave.php:36 -#: ../../../../ajax/ajax_backup.php:33 ../../../../ajax/ajax_checkLdap.php:35 -#: ../../../../ajax/ajax_configSave.php:35 ../../../../ajax/ajax_import.php:35 -#: ../../../../ajax/ajax_migrate.php:35 -#: ../../../../ajax/ajax_sendRequest.php:35 -#: ../../../../ajax/ajax_userPrefsSave.php:36 -#: ../../../../ajax/ajax_viewpass.php:36 +#: ../../../../ajax/ajax_accountSave.php:36 +#: ../../../../ajax/ajax_appMgmtSave.php:37 +#: ../../../../ajax/ajax_backup.php:35 ../../../../ajax/ajax_checkLdap.php:36 +#: ../../../../ajax/ajax_configSave.php:38 ../../../../ajax/ajax_import.php:36 +#: ../../../../ajax/ajax_migrate.php:36 +#: ../../../../ajax/ajax_sendRequest.php:36 +#: ../../../../ajax/ajax_userPrefsSave.php:37 +#: ../../../../ajax/ajax_viewpass.php:37 msgid "La sesión no se ha iniciado o ha caducado" msgstr "Session not started or timed out" -#: ../../../../ajax/ajax_accountSave.php:77 -#: ../../../../ajax/ajax_accountSave.php:92 +#: ../../../../ajax/ajax_accountSave.php:78 +#: ../../../../ajax/ajax_accountSave.php:93 msgid "Es necesario un nombre de cuenta" msgstr "An account name needed" -#: ../../../../ajax/ajax_accountSave.php:79 -#: ../../../../ajax/ajax_accountSave.php:90 -#: ../../../../ajax/ajax_appMgmtSave.php:328 +#: ../../../../ajax/ajax_accountSave.php:80 +#: ../../../../ajax/ajax_accountSave.php:91 +#: ../../../../ajax/ajax_appMgmtSave.php:329 msgid "Es necesario un nombre de cliente" msgstr "A customer name needed" -#: ../../../../ajax/ajax_accountSave.php:81 -#: ../../../../ajax/ajax_accountSave.php:94 +#: ../../../../ajax/ajax_accountSave.php:82 +#: ../../../../ajax/ajax_accountSave.php:95 msgid "Es necesario un usuario" msgstr "An username is needed" -#: ../../../../ajax/ajax_accountSave.php:83 -#: ../../../../ajax/ajax_accountSave.php:105 +#: ../../../../ajax/ajax_accountSave.php:84 +#: ../../../../ajax/ajax_accountSave.php:106 msgid "Es necesaria una clave" msgstr "A key is needed" -#: ../../../../ajax/ajax_accountSave.php:85 -#: ../../../../ajax/ajax_accountSave.php:96 +#: ../../../../ajax/ajax_accountSave.php:86 +#: ../../../../ajax/ajax_accountSave.php:97 msgid "Es necesario una categoría" msgstr "A category is needed" -#: ../../../../ajax/ajax_accountSave.php:100 -#: ../../../../ajax/ajax_accountSave.php:109 +#: ../../../../ajax/ajax_accountSave.php:101 +#: ../../../../ajax/ajax_accountSave.php:110 msgid "Id inválido" msgstr "Invalid Id" -#: ../../../../ajax/ajax_accountSave.php:112 -#: ../../../../ajax/ajax_accountSave.php:262 -#: ../../../../ajax/ajax_appMgmtSave.php:534 -#: ../../../../ajax/ajax_configSave.php:293 -#: ../../../../ajax/ajax_userPrefsSave.php:108 ../../../../api.php:53 +#: ../../../../ajax/ajax_accountSave.php:113 +#: ../../../../ajax/ajax_accountSave.php:263 +#: ../../../../ajax/ajax_appMgmtSave.php:535 +#: ../../../../ajax/ajax_configSave.php:322 +#: ../../../../ajax/ajax_userPrefsSave.php:109 ../../../../api.php:53 msgid "Acción Inválida" msgstr "Invalid Action" -#: ../../../../ajax/ajax_accountSave.php:120 -#: ../../../../ajax/ajax_appMgmtSave.php:111 -#: ../../../../ajax/ajax_appMgmtSave.php:148 -#: ../../../../ajax/ajax_backup.php:62 +#: ../../../../ajax/ajax_accountSave.php:121 +#: ../../../../ajax/ajax_appMgmtSave.php:112 +#: ../../../../ajax/ajax_appMgmtSave.php:149 +#: ../../../../ajax/ajax_backup.php:68 msgid "Las claves no coinciden" msgstr "The passwords do not match" -#: ../../../../ajax/ajax_accountSave.php:172 +#: ../../../../ajax/ajax_accountSave.php:173 msgid "Cuenta creada" msgstr "Account added" -#: ../../../../ajax/ajax_accountSave.php:175 +#: ../../../../ajax/ajax_accountSave.php:176 msgid "Error al crear la cuenta" msgstr "Error on account creation" -#: ../../../../ajax/ajax_accountSave.php:210 +#: ../../../../ajax/ajax_accountSave.php:211 msgid "Sin cambios" msgstr "No changes" -#: ../../../../ajax/ajax_accountSave.php:222 +#: ../../../../ajax/ajax_accountSave.php:223 msgid "Cuenta actualizada" msgstr "Account updated" -#: ../../../../ajax/ajax_accountSave.php:225 +#: ../../../../ajax/ajax_accountSave.php:226 msgid "Error al modificar la cuenta" msgstr "Error on updating account" -#: ../../../../ajax/ajax_accountSave.php:232 +#: ../../../../ajax/ajax_accountSave.php:233 msgid "Cuenta eliminada" msgstr "Account deleted" -#: ../../../../ajax/ajax_accountSave.php:235 +#: ../../../../ajax/ajax_accountSave.php:236 msgid "Error al eliminar la cuenta" msgstr "Error on account deletion" -#: ../../../../ajax/ajax_accountSave.php:245 -#: ../../../../ajax/ajax_appMgmtSave.php:152 -#: ../../../../ajax/ajax_passReset.php:72 +#: ../../../../ajax/ajax_accountSave.php:246 +#: ../../../../ajax/ajax_appMgmtSave.php:153 +#: ../../../../ajax/ajax_passReset.php:75 msgid "Clave actualizada" msgstr "Password updated" -#: ../../../../ajax/ajax_accountSave.php:248 +#: ../../../../ajax/ajax_accountSave.php:249 msgid "Error al actualizar la clave" msgstr "Error on updating password" -#: ../../../../ajax/ajax_accountSave.php:255 +#: ../../../../ajax/ajax_accountSave.php:256 msgid "Cuenta restaurada" msgstr "Account restored" -#: ../../../../ajax/ajax_accountSave.php:258 +#: ../../../../ajax/ajax_accountSave.php:259 msgid "Error al restaurar cuenta" msgstr "Error on restoring account" @@ -150,13 +150,13 @@ msgid "Ver Usuario" msgstr "View User" #: ../../../../ajax/ajax_appMgmtData.php:61 -#: ../../../../web/UsersMgmtC.class.php:136 +#: ../../../../web/UsersMgmtC.class.php:137 msgid "Editar Usuario" msgstr "Edit User" #: ../../../../ajax/ajax_appMgmtData.php:67 -#: ../../../../inc/UserBase.class.php:381 -#: ../../../../web/UsersMgmtC.class.php:121 +#: ../../../../inc/UserBase.class.php:383 +#: ../../../../web/UsersMgmtC.class.php:122 msgid "Nuevo Usuario" msgstr "New User" @@ -165,13 +165,13 @@ msgid "Ver Grupo" msgstr "View Group" #: ../../../../ajax/ajax_appMgmtData.php:80 -#: ../../../../web/UsersMgmtC.class.php:202 +#: ../../../../web/UsersMgmtC.class.php:203 msgid "Editar Grupo" msgstr "Edit Group" #: ../../../../ajax/ajax_appMgmtData.php:86 #: ../../../../inc/Groups.class.php:152 ../../../../inc/Groups.class.php:253 -#: ../../../../web/UsersMgmtC.class.php:194 +#: ../../../../web/UsersMgmtC.class.php:195 msgid "Nuevo Grupo" msgstr "New Group" @@ -180,13 +180,13 @@ msgid "Ver Perfil" msgstr "View Profile" #: ../../../../ajax/ajax_appMgmtData.php:99 -#: ../../../../web/UsersMgmtC.class.php:267 +#: ../../../../web/UsersMgmtC.class.php:268 msgid "Editar Perfil" msgstr "Edit Profile" #: ../../../../ajax/ajax_appMgmtData.php:105 #: ../../../../inc/ProfileBase.class.php:512 -#: ../../../../web/UsersMgmtC.class.php:252 +#: ../../../../web/UsersMgmtC.class.php:253 msgid "Nuevo Perfil" msgstr "New Profile" @@ -195,13 +195,13 @@ msgid "Ver Cliente" msgstr "View Customer" #: ../../../../ajax/ajax_appMgmtData.php:118 -#: ../../../../web/AccountsMgmtC.class.php:152 +#: ../../../../web/AccountsMgmtC.class.php:153 msgid "Editar Cliente" msgstr "Edit Customer" #: ../../../../ajax/ajax_appMgmtData.php:124 #: ../../../../inc/Customer.class.php:65 -#: ../../../../web/AccountsMgmtC.class.php:145 +#: ../../../../web/AccountsMgmtC.class.php:146 msgid "Nuevo Cliente" msgstr "New Customer" @@ -210,13 +210,13 @@ msgid "Ver Categoría" msgstr "View Category" #: ../../../../ajax/ajax_appMgmtData.php:137 -#: ../../../../web/AccountsMgmtC.class.php:94 +#: ../../../../web/AccountsMgmtC.class.php:95 msgid "Editar Categoría" msgstr "Edit Category" #: ../../../../ajax/ajax_appMgmtData.php:143 #: ../../../../inc/Category.class.php:83 -#: ../../../../web/AccountsMgmtC.class.php:86 +#: ../../../../web/AccountsMgmtC.class.php:87 #: ../../../../inc/themes/classic/account.inc:53 #: ../../../../inc/themes/material-blue/account.inc:61 msgid "Nueva Categoría" @@ -228,128 +228,129 @@ msgstr "View Authorization" #: ../../../../ajax/ajax_appMgmtData.php:156 #: ../../../../inc/ApiTokens.class.php:189 -#: ../../../../web/UsersMgmtC.class.php:399 +#: ../../../../web/UsersMgmtC.class.php:400 msgid "Nueva Autorización" msgstr "New Authorization" #: ../../../../ajax/ajax_appMgmtData.php:162 -#: ../../../../web/UsersMgmtC.class.php:414 +#: ../../../../web/UsersMgmtC.class.php:415 msgid "Editar Autorización" msgstr "Edit authorization" #: ../../../../ajax/ajax_appMgmtData.php:168 -#: ../../../../web/AccountsMgmtC.class.php:273 +#: ../../../../web/AccountsMgmtC.class.php:274 msgid "Nuevo Campo" msgstr "New Field" #: ../../../../ajax/ajax_appMgmtData.php:174 -#: ../../../../web/AccountsMgmtC.class.php:280 +#: ../../../../web/AccountsMgmtC.class.php:281 msgid "Editar Campo" msgstr "Edit field" -#: ../../../../ajax/ajax_appMgmtSave.php:85 +#: ../../../../ajax/ajax_appMgmtSave.php:86 msgid "Es necesario un nombre de usuario" msgstr "An username is needed" -#: ../../../../ajax/ajax_appMgmtSave.php:87 +#: ../../../../ajax/ajax_appMgmtSave.php:88 msgid "Es necesario un login" msgstr "A login is needed" -#: ../../../../ajax/ajax_appMgmtSave.php:89 +#: ../../../../ajax/ajax_appMgmtSave.php:90 msgid "Es necesario un perfil" msgstr "A profile is needed" -#: ../../../../ajax/ajax_appMgmtSave.php:91 +#: ../../../../ajax/ajax_appMgmtSave.php:92 msgid "Es necesario un grupo" msgstr "A group is needed" -#: ../../../../ajax/ajax_appMgmtSave.php:93 +#: ../../../../ajax/ajax_appMgmtSave.php:94 msgid "Es necesario un email" msgstr "An email is needed" -#: ../../../../ajax/ajax_appMgmtSave.php:95 -#: ../../../../ajax/ajax_appMgmtSave.php:144 -#: ../../../../ajax/ajax_appMgmtSave.php:159 -#: ../../../../ajax/ajax_configSave.php:268 -#: ../../../../ajax/ajax_import.php:39 ../../../../ajax/ajax_migrate.php:39 -#: ../../../../ajax/ajax_userPrefsSave.php:83 +#: ../../../../ajax/ajax_appMgmtSave.php:96 +#: ../../../../ajax/ajax_appMgmtSave.php:145 +#: ../../../../ajax/ajax_appMgmtSave.php:160 +#: ../../../../ajax/ajax_backup.php:54 +#: ../../../../ajax/ajax_configSave.php:297 +#: ../../../../ajax/ajax_import.php:40 ../../../../ajax/ajax_migrate.php:40 +#: ../../../../ajax/ajax_userPrefsSave.php:84 msgid "Ey, esto es una DEMO!!" msgstr "Ey, this is a DEMO!!" -#: ../../../../ajax/ajax_appMgmtSave.php:100 +#: ../../../../ajax/ajax_appMgmtSave.php:101 msgid "Login de usuario duplicado" msgstr "Duplicated user login " -#: ../../../../ajax/ajax_appMgmtSave.php:103 +#: ../../../../ajax/ajax_appMgmtSave.php:104 msgid "Email de usuario duplicado" msgstr "Duplicated user email" -#: ../../../../ajax/ajax_appMgmtSave.php:109 -#: ../../../../ajax/ajax_appMgmtSave.php:146 +#: ../../../../ajax/ajax_appMgmtSave.php:110 +#: ../../../../ajax/ajax_appMgmtSave.php:147 msgid "La clave no puede estar en blanco" msgstr "Password cannot be blank" -#: ../../../../ajax/ajax_appMgmtSave.php:122 +#: ../../../../ajax/ajax_appMgmtSave.php:123 msgid "Usuario creado" msgstr "User added" -#: ../../../../ajax/ajax_appMgmtSave.php:125 +#: ../../../../ajax/ajax_appMgmtSave.php:126 msgid "Error al crear el usuario" msgstr "Error on creating user" -#: ../../../../ajax/ajax_appMgmtSave.php:135 -#: ../../../../inc/UserUtil.class.php:103 +#: ../../../../ajax/ajax_appMgmtSave.php:136 +#: ../../../../inc/UserMigrate.class.php:89 msgid "Usuario actualizado" msgstr "User updated" -#: ../../../../ajax/ajax_appMgmtSave.php:138 +#: ../../../../ajax/ajax_appMgmtSave.php:139 msgid "Error al actualizar el usuario" msgstr "Error on user update" -#: ../../../../ajax/ajax_appMgmtSave.php:155 -#: ../../../../ajax/ajax_passReset.php:76 +#: ../../../../ajax/ajax_appMgmtSave.php:156 +#: ../../../../ajax/ajax_passReset.php:79 msgid "Error al modificar la clave" msgstr "Error on updating password" -#: ../../../../ajax/ajax_appMgmtSave.php:161 +#: ../../../../ajax/ajax_appMgmtSave.php:162 msgid "No es posible eliminar, usuario en uso" msgstr "Unable to delete, user in use" -#: ../../../../ajax/ajax_appMgmtSave.php:165 +#: ../../../../ajax/ajax_appMgmtSave.php:166 msgid "Usuario eliminado" msgstr "User deleted" -#: ../../../../ajax/ajax_appMgmtSave.php:168 +#: ../../../../ajax/ajax_appMgmtSave.php:169 msgid "Error al eliminar el usuario" msgstr "Error on user deletion" -#: ../../../../ajax/ajax_appMgmtSave.php:183 +#: ../../../../ajax/ajax_appMgmtSave.php:184 msgid "Es necesario un nombre de grupo" msgstr "A group name is needed" -#: ../../../../ajax/ajax_appMgmtSave.php:191 +#: ../../../../ajax/ajax_appMgmtSave.php:192 msgid "Nombre de grupo duplicado" msgstr "Duplicated group name" -#: ../../../../ajax/ajax_appMgmtSave.php:203 +#: ../../../../ajax/ajax_appMgmtSave.php:204 msgid "Grupo creado" msgstr "Group added" -#: ../../../../ajax/ajax_appMgmtSave.php:205 +#: ../../../../ajax/ajax_appMgmtSave.php:206 msgid "Error al crear el grupo" msgstr "Error on group creation" -#: ../../../../ajax/ajax_appMgmtSave.php:216 +#: ../../../../ajax/ajax_appMgmtSave.php:217 msgid "Grupo actualizado" msgstr "Group updated" -#: ../../../../ajax/ajax_appMgmtSave.php:219 +#: ../../../../ajax/ajax_appMgmtSave.php:220 msgid "Error al actualizar el grupo" msgstr "Error on updating group" -#: ../../../../ajax/ajax_appMgmtSave.php:228 -#: ../../../../ajax/ajax_appMgmtSave.php:305 -#: ../../../../inc/CustomFieldsBase.class.php:102 +#: ../../../../ajax/ajax_appMgmtSave.php:229 +#: ../../../../ajax/ajax_appMgmtSave.php:306 +#: ../../../../inc/CustomFieldsBase.class.php:109 #: ../../../../inc/themes/classic/account.inc:112 #: ../../../../inc/themes/classic/groups.inc:24 #: ../../../../inc/themes/classic/profiles.inc:85 @@ -359,9 +360,9 @@ msgstr "Error on updating group" msgid "Usuarios" msgstr "Users" -#: ../../../../ajax/ajax_appMgmtSave.php:232 +#: ../../../../ajax/ajax_appMgmtSave.php:233 #: ../../../../inc/Category.class.php:266 -#: ../../../../inc/CustomFieldsBase.class.php:99 +#: ../../../../inc/CustomFieldsBase.class.php:106 #: ../../../../inc/Customer.class.php:150 #: ../../../../inc/themes/classic/profiles.inc:15 #: ../../../../inc/themes/material-blue/config.inc:176 @@ -369,314 +370,346 @@ msgstr "Users" msgid "Cuentas" msgstr "Accounts" -#: ../../../../ajax/ajax_appMgmtSave.php:235 -#: ../../../../ajax/ajax_appMgmtSave.php:307 +#: ../../../../ajax/ajax_appMgmtSave.php:236 +#: ../../../../ajax/ajax_appMgmtSave.php:308 #: ../../../../inc/Category.class.php:119 #: ../../../../inc/Customer.class.php:150 msgid "No es posible eliminar" msgstr "Unable to delete" -#: ../../../../ajax/ajax_appMgmtSave.php:235 +#: ../../../../ajax/ajax_appMgmtSave.php:236 msgid "Grupo en uso por:" msgstr "Group in use by:" -#: ../../../../ajax/ajax_appMgmtSave.php:240 +#: ../../../../ajax/ajax_appMgmtSave.php:241 msgid "Grupo eliminado" msgstr "Group deleted" -#: ../../../../ajax/ajax_appMgmtSave.php:243 +#: ../../../../ajax/ajax_appMgmtSave.php:244 msgid "Error al eliminar el grupo" msgstr "Error on group deletion" -#: ../../../../ajax/ajax_appMgmtSave.php:282 +#: ../../../../ajax/ajax_appMgmtSave.php:283 msgid "Es necesario un nombre de perfil" msgstr "A profile name is needed" -#: ../../../../ajax/ajax_appMgmtSave.php:284 +#: ../../../../ajax/ajax_appMgmtSave.php:285 msgid "Nombre de perfil duplicado" msgstr "Duplicated profile name" -#: ../../../../ajax/ajax_appMgmtSave.php:289 +#: ../../../../ajax/ajax_appMgmtSave.php:290 msgid "Perfil creado" msgstr "Profile added" -#: ../../../../ajax/ajax_appMgmtSave.php:292 +#: ../../../../ajax/ajax_appMgmtSave.php:293 msgid "Error al crear el perfil" msgstr "Error on creating profile" -#: ../../../../ajax/ajax_appMgmtSave.php:295 +#: ../../../../ajax/ajax_appMgmtSave.php:296 msgid "Perfil actualizado" msgstr "Profile updated" -#: ../../../../ajax/ajax_appMgmtSave.php:298 +#: ../../../../ajax/ajax_appMgmtSave.php:299 msgid "Error al actualizar el perfil" msgstr "Error on updating profile" -#: ../../../../ajax/ajax_appMgmtSave.php:307 +#: ../../../../ajax/ajax_appMgmtSave.php:308 msgid "Perfil en uso por:" msgstr "Profiles in use by:" -#: ../../../../ajax/ajax_appMgmtSave.php:310 +#: ../../../../ajax/ajax_appMgmtSave.php:311 msgid "Perfil eliminado" msgstr "Profile deleted" -#: ../../../../ajax/ajax_appMgmtSave.php:313 +#: ../../../../ajax/ajax_appMgmtSave.php:314 msgid "Error al eliminar el perfil" msgstr "Error on profile deletion" -#: ../../../../ajax/ajax_appMgmtSave.php:348 +#: ../../../../ajax/ajax_appMgmtSave.php:349 msgid "Cliente creado" msgstr "Customer added" -#: ../../../../ajax/ajax_appMgmtSave.php:363 +#: ../../../../ajax/ajax_appMgmtSave.php:364 msgid "Cliente actualizado" msgstr "Customer updated" -#: ../../../../ajax/ajax_appMgmtSave.php:373 +#: ../../../../ajax/ajax_appMgmtSave.php:374 msgid "Cliente eliminado" msgstr "Customer deleted" -#: ../../../../ajax/ajax_appMgmtSave.php:387 +#: ../../../../ajax/ajax_appMgmtSave.php:388 msgid "Es necesario un nombre de categoría" msgstr "A category name needed" -#: ../../../../ajax/ajax_appMgmtSave.php:407 +#: ../../../../ajax/ajax_appMgmtSave.php:408 msgid "Categoría creada" msgstr "Category added" -#: ../../../../ajax/ajax_appMgmtSave.php:422 +#: ../../../../ajax/ajax_appMgmtSave.php:423 msgid "Categoría actualizada" msgstr "Category updated" -#: ../../../../ajax/ajax_appMgmtSave.php:433 +#: ../../../../ajax/ajax_appMgmtSave.php:434 msgid "Categoría eliminada" msgstr "Category deleted" -#: ../../../../ajax/ajax_appMgmtSave.php:449 +#: ../../../../ajax/ajax_appMgmtSave.php:450 msgid "Usuario o acción no indicado" msgstr "User or action not set" -#: ../../../../ajax/ajax_appMgmtSave.php:459 +#: ../../../../ajax/ajax_appMgmtSave.php:460 msgid "Autorización creada" msgstr "Authorization added" -#: ../../../../ajax/ajax_appMgmtSave.php:467 +#: ../../../../ajax/ajax_appMgmtSave.php:468 msgid "Autorización actualizada" msgstr "Authorization Updated" -#: ../../../../ajax/ajax_appMgmtSave.php:477 +#: ../../../../ajax/ajax_appMgmtSave.php:478 msgid "Autorización eliminada" msgstr "Authorization deleted" -#: ../../../../ajax/ajax_appMgmtSave.php:494 +#: ../../../../ajax/ajax_appMgmtSave.php:495 msgid "Nombre del campo no indicado" msgstr "Field name not set" -#: ../../../../ajax/ajax_appMgmtSave.php:496 +#: ../../../../ajax/ajax_appMgmtSave.php:497 msgid "Tipo del campo no indicado" msgstr "Field type not set" -#: ../../../../ajax/ajax_appMgmtSave.php:498 +#: ../../../../ajax/ajax_appMgmtSave.php:499 msgid "Módulo del campo no indicado" msgstr "Field module not set" -#: ../../../../ajax/ajax_appMgmtSave.php:512 +#: ../../../../ajax/ajax_appMgmtSave.php:513 msgid "Campo creado" msgstr "Field added" -#: ../../../../ajax/ajax_appMgmtSave.php:521 +#: ../../../../ajax/ajax_appMgmtSave.php:522 msgid "Campo actualizado" msgstr "Field updated" -#: ../../../../ajax/ajax_appMgmtSave.php:531 +#: ../../../../ajax/ajax_appMgmtSave.php:532 msgid "Campo eliminado" msgstr "Field deleted" -#: ../../../../ajax/ajax_backup.php:52 ../../../../ajax/ajax_backup.php:57 +#: ../../../../ajax/ajax_backup.php:58 ../../../../ajax/ajax_backup.php:63 #: ../../../../inc/themes/classic/backup.inc:54 msgid "Realizar Backup" msgstr "Make Backup" -#: ../../../../ajax/ajax_backup.php:52 ../../../../ajax/ajax_backup.php:54 +#: ../../../../ajax/ajax_backup.php:58 ../../../../ajax/ajax_backup.php:60 msgid "Error al realizar el backup" msgstr "Error on doing backup" -#: ../../../../ajax/ajax_backup.php:54 ../../../../ajax/ajax_backup.php:68 -#: ../../../../ajax/ajax_checkLdap.php:57 ../../../../inc/Import.class.php:128 -#: ../../../../inc/Migrate.class.php:93 +#: ../../../../ajax/ajax_backup.php:60 ../../../../ajax/ajax_backup.php:74 +#: ../../../../ajax/ajax_checkLdap.php:58 ../../../../inc/Import.class.php:128 +#: ../../../../inc/Migrate.class.php:92 msgid "Revise el registro de eventos para más detalles" msgstr "Please, check the event log for more details" -#: ../../../../ajax/ajax_backup.php:57 +#: ../../../../ajax/ajax_backup.php:63 msgid "Copia de la aplicación y base de datos realizada correctamente" msgstr "Application and database backup successfully done" -#: ../../../../ajax/ajax_backup.php:59 +#: ../../../../ajax/ajax_backup.php:65 msgid "Proceso de backup finalizado" msgstr "Backup process finished" -#: ../../../../ajax/ajax_backup.php:66 ../../../../ajax/ajax_backup.php:71 +#: ../../../../ajax/ajax_backup.php:72 ../../../../ajax/ajax_backup.php:77 msgid "Realizar Exportación" msgstr "Run Export" -#: ../../../../ajax/ajax_backup.php:66 +#: ../../../../ajax/ajax_backup.php:72 msgid "Error al realizar la exportación de cuentas" msgstr "Error while exporting accounts" -#: ../../../../ajax/ajax_backup.php:68 +#: ../../../../ajax/ajax_backup.php:74 msgid "Error al realizar la exportación" msgstr "Error doing export" -#: ../../../../ajax/ajax_backup.php:71 +#: ../../../../ajax/ajax_backup.php:77 msgid "Exportación de cuentas realizada correctamente" msgstr "Export successfully done" -#: ../../../../ajax/ajax_backup.php:73 +#: ../../../../ajax/ajax_backup.php:79 msgid "Proceso de exportación finalizado" msgstr "Export process finished" -#: ../../../../ajax/ajax_checkLdap.php:51 ../../../../inc/Ldap.class.php:259 +#: ../../../../ajax/ajax_checkLdap.php:52 ../../../../inc/Ldap.class.php:259 msgid "Los parámetros de LDAP no están configurados" msgstr "LDAP parameters are not set" -#: ../../../../ajax/ajax_checkLdap.php:57 +#: ../../../../ajax/ajax_checkLdap.php:58 msgid "Error de conexión a LDAP" msgstr "Error on LDAP connection" -#: ../../../../ajax/ajax_checkLdap.php:59 +#: ../../../../ajax/ajax_checkLdap.php:60 msgid "Conexión a LDAP correcta" msgstr "LDAP connection OK" -#: ../../../../ajax/ajax_checkLdap.php:59 +#: ../../../../ajax/ajax_checkLdap.php:60 msgid "Objetos encontrados" msgstr "Objects found" -#: ../../../../ajax/ajax_configSave.php:55 +#: ../../../../ajax/ajax_configSave.php:58 msgid "Modificar Configuración" msgstr "Edit Configuration" -#: ../../../../ajax/ajax_configSave.php:102 +#: ../../../../ajax/ajax_configSave.php:105 msgid "El tamaño máximo por archivo es de 16MB" msgstr "The maximum size per file is 16MB" -#: ../../../../ajax/ajax_configSave.php:115 +#: ../../../../ajax/ajax_configSave.php:118 msgid "Faltan parámetros de Proxy" msgstr "Missing proxy parameters " #: ../../../../ajax/ajax_configSave.php:126 -#: ../../../../ajax/ajax_configSave.php:146 -#: ../../../../ajax/ajax_configSave.php:176 -#: ../../../../ajax/ajax_configSave.php:211 +msgid "Proxy habiltado" +msgstr "Proxy enabled" + +#: ../../../../ajax/ajax_configSave.php:130 +msgid "Proxy deshabilitado" +msgstr "Proxy disabled" + +#: ../../../../ajax/ajax_configSave.php:133 +#: ../../../../ajax/ajax_configSave.php:157 +#: ../../../../ajax/ajax_configSave.php:191 +#: ../../../../ajax/ajax_configSave.php:230 msgid "Sección" msgstr "Section" -#: ../../../../ajax/ajax_configSave.php:126 -#: ../../../../web/ConfigC.class.php:106 +#: ../../../../ajax/ajax_configSave.php:133 +#: ../../../../web/ConfigC.class.php:108 #: ../../../../inc/themes/classic/profiles.inc:61 #: ../../../../inc/themes/material-blue/profiles.inc:72 msgid "General" msgstr "General" -#: ../../../../ajax/ajax_configSave.php:136 +#: ../../../../ajax/ajax_configSave.php:143 msgid "Faltan parámetros de Wiki" msgstr "Missing Wiki parameters" -#: ../../../../ajax/ajax_configSave.php:146 -#: ../../../../web/ConfigC.class.php:242 +#: ../../../../ajax/ajax_configSave.php:150 +msgid "Wiki habiltada" +msgstr "Wiki enabled" + +#: ../../../../ajax/ajax_configSave.php:154 +msgid "Wiki deshabilitada" +msgstr "Wiki disabled" + +#: ../../../../ajax/ajax_configSave.php:157 +#: ../../../../web/ConfigC.class.php:244 #: ../../../../inc/themes/classic/wiki.inc:4 #: ../../../../inc/themes/material-blue/wiki.inc:4 msgid "Wiki" msgstr "Wiki" -#: ../../../../ajax/ajax_configSave.php:161 +#: ../../../../ajax/ajax_configSave.php:172 msgid "Faltan parámetros de LDAP" msgstr "Missing LDAP parameters" -#: ../../../../ajax/ajax_configSave.php:176 -#: ../../../../web/ConfigC.class.php:274 +#: ../../../../ajax/ajax_configSave.php:184 +msgid "LDAP habiltado" +msgstr "LDAP enabled" + +#: ../../../../ajax/ajax_configSave.php:188 +msgid "LDAP deshabilitado" +msgstr "LDAP disabled" + +#: ../../../../ajax/ajax_configSave.php:191 +#: ../../../../web/ConfigC.class.php:276 #: ../../../../inc/themes/classic/ldap.inc:4 #: ../../../../inc/themes/material-blue/ldap.inc:4 msgid "LDAP" msgstr "LDAP" -#: ../../../../ajax/ajax_configSave.php:191 +#: ../../../../ajax/ajax_configSave.php:206 msgid "Faltan parámetros de Correo" msgstr "Missing Mail parameters" -#: ../../../../ajax/ajax_configSave.php:211 -#: ../../../../web/ConfigC.class.php:304 +#: ../../../../ajax/ajax_configSave.php:221 +msgid "Correo habiltado" +msgstr "Mail enabled" + +#: ../../../../ajax/ajax_configSave.php:227 +msgid "Correo deshabilitado" +msgstr "Mail disabled" + +#: ../../../../ajax/ajax_configSave.php:230 +#: ../../../../web/ConfigC.class.php:306 #: ../../../../inc/themes/classic/mail.inc:4 #: ../../../../inc/themes/material-blue/mail.inc:4 msgid "Correo" msgstr "Mail" -#: ../../../../ajax/ajax_configSave.php:223 +#: ../../../../ajax/ajax_configSave.php:252 msgid "Configuración actualizada" msgstr "Configuration updated" -#: ../../../../ajax/ajax_configSave.php:232 -#: ../../../../ajax/ajax_configSave.php:278 -#: ../../../../ajax/ajax_viewpass.php:60 +#: ../../../../ajax/ajax_configSave.php:261 +#: ../../../../ajax/ajax_configSave.php:307 +#: ../../../../ajax/ajax_viewpass.php:61 #: ../../../../inc/Controller.class.php:169 msgid "Clave maestra actualizada" msgstr "Master Password updated" -#: ../../../../ajax/ajax_configSave.php:232 -#: ../../../../ajax/ajax_viewpass.php:60 +#: ../../../../ajax/ajax_configSave.php:261 +#: ../../../../ajax/ajax_viewpass.php:61 #: ../../../../inc/Controller.class.php:169 msgid "Reinicie la sesión para cambiarla" msgstr "Restart session to update" -#: ../../../../ajax/ajax_configSave.php:234 +#: ../../../../ajax/ajax_configSave.php:263 msgid "Clave maestra no indicada" msgstr "Master Password needed" -#: ../../../../ajax/ajax_configSave.php:236 +#: ../../../../ajax/ajax_configSave.php:265 msgid "Se ha de confirmar el cambio de clave" msgstr "The password update must be confirmed" -#: ../../../../ajax/ajax_configSave.php:240 +#: ../../../../ajax/ajax_configSave.php:269 msgid "Las claves son idénticas" msgstr "The passwords are the same" -#: ../../../../ajax/ajax_configSave.php:242 +#: ../../../../ajax/ajax_configSave.php:271 msgid "Las claves maestras no coinciden" msgstr "The master passwords do not match" -#: ../../../../ajax/ajax_configSave.php:244 +#: ../../../../ajax/ajax_configSave.php:273 msgid "La clave maestra actual no coincide" msgstr "The current master password does not match" -#: ../../../../ajax/ajax_configSave.php:253 +#: ../../../../ajax/ajax_configSave.php:282 msgid "Errores al actualizar las claves de las cuentas" msgstr "Error on updating accounts' passwords" -#: ../../../../ajax/ajax_configSave.php:259 +#: ../../../../ajax/ajax_configSave.php:288 msgid "Errores al actualizar las claves de las cuentas del histórico" msgstr "Error while updating acounts passwords in history" -#: ../../../../ajax/ajax_configSave.php:263 +#: ../../../../ajax/ajax_configSave.php:292 msgid "Errores al actualizar datos de campos personalizados" msgstr "Error while updating custom fields data" -#: ../../../../ajax/ajax_configSave.php:276 +#: ../../../../ajax/ajax_configSave.php:305 #: ../../../../inc/Account.class.php:495 msgid "Actualizar Clave Maestra" msgstr "Update Master Password" -#: ../../../../ajax/ajax_configSave.php:280 +#: ../../../../ajax/ajax_configSave.php:309 msgid "Error al guardar el hash de la clave maestra" msgstr "Error on saving master password's hash" -#: ../../../../ajax/ajax_configSave.php:288 +#: ../../../../ajax/ajax_configSave.php:317 msgid "Generar Clave Temporal" msgstr "Generate Temporary Password" -#: ../../../../ajax/ajax_configSave.php:288 -#: ../../../../inc/CustomFieldsBase.class.php:80 +#: ../../../../ajax/ajax_configSave.php:317 +#: ../../../../inc/CustomFieldsBase.class.php:87 #: ../../../../inc/themes/classic/account.inc:86 #: ../../../../inc/themes/classic/editpass.inc:25 -#: ../../../../inc/themes/classic/encryption.inc:146 +#: ../../../../inc/themes/classic/encryption.inc:143 #: ../../../../inc/themes/classic/install.inc:38 #: ../../../../inc/themes/classic/install.inc:39 #: ../../../../inc/themes/classic/login.inc:10 @@ -693,7 +726,7 @@ msgstr "Generate Temporary Password" #: ../../../../inc/themes/material-blue/editpass.inc:26 #: ../../../../inc/themes/material-blue/editpass.inc:31 #: ../../../../inc/themes/material-blue/editpass.inc:41 -#: ../../../../inc/themes/material-blue/encryption.inc:164 +#: ../../../../inc/themes/material-blue/encryption.inc:161 #: ../../../../inc/themes/material-blue/install.inc:46 #: ../../../../inc/themes/material-blue/ldap.inc:105 #: ../../../../inc/themes/material-blue/login.inc:18 @@ -708,28 +741,28 @@ msgstr "Generate Temporary Password" msgid "Clave" msgstr "Password" -#: ../../../../ajax/ajax_configSave.php:290 +#: ../../../../ajax/ajax_configSave.php:319 msgid "Clave Temporal Generada" msgstr "Temporary Password Generated" -#: ../../../../ajax/ajax_doLogin.php:46 +#: ../../../../ajax/ajax_doLogin.php:49 msgid "Usuario/Clave no introducidos" msgstr "User/Pass not entered" -#: ../../../../ajax/ajax_doLogin.php:58 +#: ../../../../ajax/ajax_doLogin.php:61 msgid "Inicio sesión" msgstr "Log in" -#: ../../../../ajax/ajax_doLogin.php:63 +#: ../../../../ajax/ajax_doLogin.php:66 msgid "Servidor Login" msgstr "Login Server" -#: ../../../../ajax/ajax_doLogin.php:69 +#: ../../../../ajax/ajax_doLogin.php:72 msgid "Error al guardar los datos de LDAP" msgstr "Error on saving LDAP user data" -#: ../../../../ajax/ajax_doLogin.php:72 ../../../../ajax/ajax_doLogin.php:80 -#: ../../../../ajax/ajax_doLogin.php:132 ../../../../ajax/ajax_doLogin.php:176 +#: ../../../../ajax/ajax_doLogin.php:75 ../../../../ajax/ajax_doLogin.php:83 +#: ../../../../ajax/ajax_doLogin.php:135 ../../../../ajax/ajax_doLogin.php:179 #: ../../../../inc/ApiTokens.class.php:140 #: ../../../../inc/ApiTokens.class.php:186 #: ../../../../inc/ApiTokens.class.php:217 @@ -738,32 +771,32 @@ msgstr "Error on saving LDAP user data" #: ../../../../inc/ApiTokens.class.php:304 #: ../../../../inc/ApiTokens.class.php:328 ../../../../inc/Crypt.class.php:181 #: ../../../../inc/Crypt.class.php:192 -#: ../../../../inc/XmlImportBase.class.php:74 +#: ../../../../inc/XmlImportBase.class.php:79 msgid "Error interno" msgstr "Internal error" -#: ../../../../ajax/ajax_doLogin.php:77 +#: ../../../../ajax/ajax_doLogin.php:80 msgid "Error al actualizar la clave del usuario en la BBDD" msgstr "Error on updating user password in BD" -#: ../../../../ajax/ajax_doLogin.php:85 ../../../../ajax/ajax_doLogin.php:110 +#: ../../../../ajax/ajax_doLogin.php:88 ../../../../ajax/ajax_doLogin.php:113 msgid "Login incorrecto" msgstr "Incorrect login" -#: ../../../../ajax/ajax_doLogin.php:86 ../../../../ajax/ajax_doLogin.php:93 -#: ../../../../ajax/ajax_doLogin.php:100 ../../../../ajax/ajax_doLogin.php:111 -#: ../../../../ajax/ajax_doLogin.php:121 ../../../../ajax/ajax_doLogin.php:171 +#: ../../../../ajax/ajax_doLogin.php:89 ../../../../ajax/ajax_doLogin.php:96 +#: ../../../../ajax/ajax_doLogin.php:103 ../../../../ajax/ajax_doLogin.php:114 +#: ../../../../ajax/ajax_doLogin.php:124 ../../../../ajax/ajax_doLogin.php:174 #: ../../../../inc/ApiTokens.class.php:190 #: ../../../../inc/ApiTokens.class.php:308 ../../../../inc/Auth.class.php:108 #: ../../../../inc/Init.class.php:457 ../../../../inc/Ldap.class.php:290 #: ../../../../inc/Ldap.class.php:303 ../../../../inc/Ldap.class.php:311 -#: ../../../../inc/UserBase.class.php:382 -#: ../../../../inc/UserBase.class.php:526 ../../../../res/test.php:64 -#: ../../../../web/SearchC.class.php:304 -#: ../../../../web/UsersMgmtC.class.php:392 +#: ../../../../inc/UserBase.class.php:384 +#: ../../../../inc/UserBase.class.php:528 ../../../../res/test.php:64 +#: ../../../../web/SearchC.class.php:306 +#: ../../../../web/UsersMgmtC.class.php:393 #: ../../../../inc/themes/classic/account.inc:73 #: ../../../../inc/themes/classic/editpass.inc:21 -#: ../../../../inc/themes/classic/eventlog.inc:25 +#: ../../../../inc/themes/classic/eventlog.inc:23 #: ../../../../inc/themes/classic/info.inc:39 #: ../../../../inc/themes/classic/install.inc:27 #: ../../../../inc/themes/classic/install.inc:28 @@ -777,7 +810,7 @@ msgstr "Incorrect login" #: ../../../../inc/themes/material-blue/account.inc:83 #: ../../../../inc/themes/material-blue/config.inc:381 #: ../../../../inc/themes/material-blue/editpass.inc:22 -#: ../../../../inc/themes/material-blue/eventlog.inc:24 +#: ../../../../inc/themes/material-blue/eventlog.inc:23 #: ../../../../inc/themes/material-blue/info.inc:39 #: ../../../../inc/themes/material-blue/login.inc:11 #: ../../../../inc/themes/material-blue/login.inc:34 @@ -790,50 +823,50 @@ msgstr "Incorrect login" msgid "Usuario" msgstr "User" -#: ../../../../ajax/ajax_doLogin.php:89 ../../../../ajax/ajax_doLogin.php:103 -#: ../../../../ajax/ajax_doLogin.php:114 +#: ../../../../ajax/ajax_doLogin.php:92 ../../../../ajax/ajax_doLogin.php:106 +#: ../../../../ajax/ajax_doLogin.php:117 msgid "Usuario/Clave incorrectos" msgstr "Wrong user/pass" -#: ../../../../ajax/ajax_doLogin.php:92 ../../../../ajax/ajax_doLogin.php:96 +#: ../../../../ajax/ajax_doLogin.php:95 ../../../../ajax/ajax_doLogin.php:99 msgid "Cuenta expirada" msgstr "Account expired" -#: ../../../../ajax/ajax_doLogin.php:99 +#: ../../../../ajax/ajax_doLogin.php:102 msgid "El usuario no tiene grupos asociados" msgstr "The user have no associated groups" -#: ../../../../ajax/ajax_doLogin.php:120 ../../../../ajax/ajax_doLogin.php:124 +#: ../../../../ajax/ajax_doLogin.php:123 ../../../../ajax/ajax_doLogin.php:127 msgid "Usuario deshabilitado" msgstr "User disabled" -#: ../../../../ajax/ajax_doLogin.php:129 +#: ../../../../ajax/ajax_doLogin.php:132 msgid "Error al obtener los datos del usuario de la BBDD" msgstr "Error on retrieving user data from DB" -#: ../../../../ajax/ajax_doLogin.php:139 +#: ../../../../ajax/ajax_doLogin.php:142 msgid "La clave maestra no ha sido guardada o es incorrecta" msgstr "The master password not saved or is wrong" -#: ../../../../ajax/ajax_doLogin.php:146 ../../../../ajax/ajax_doLogin.php:149 +#: ../../../../ajax/ajax_doLogin.php:149 ../../../../ajax/ajax_doLogin.php:152 msgid "Clave maestra incorrecta" msgstr "Invalid Master Password" -#: ../../../../ajax/ajax_doLogin.php:172 +#: ../../../../ajax/ajax_doLogin.php:175 #: ../../../../inc/ProfileBase.class.php:512 #: ../../../../inc/ProfileBase.class.php:550 #: ../../../../inc/ProfileBase.class.php:593 -#: ../../../../web/UsersMgmtC.class.php:89 +#: ../../../../web/UsersMgmtC.class.php:90 #: ../../../../inc/themes/classic/users.inc:37 #: ../../../../inc/themes/material-blue/users.inc:43 msgid "Perfil" msgstr "Profile" -#: ../../../../ajax/ajax_doLogin.php:173 ../../../../inc/Groups.class.php:158 +#: ../../../../ajax/ajax_doLogin.php:176 ../../../../inc/Groups.class.php:158 #: ../../../../inc/Groups.class.php:259 ../../../../inc/Groups.class.php:375 #: ../../../../inc/Ldap.class.php:213 ../../../../inc/Ldap.class.php:226 #: ../../../../inc/Ldap.class.php:236 ../../../../inc/Ldap.class.php:385 -#: ../../../../web/UsersMgmtC.class.php:90 +#: ../../../../web/UsersMgmtC.class.php:91 #: ../../../../inc/themes/classic/ldap.inc:116 #: ../../../../inc/themes/classic/users.inc:49 #: ../../../../inc/themes/material-blue/ldap.inc:139 @@ -842,191 +875,191 @@ msgstr "Profile" msgid "Grupo" msgstr "Group" -#: ../../../../ajax/ajax_files.php:45 ../../../../ajax/ajax_getFiles.php:39 +#: ../../../../ajax/ajax_files.php:46 ../../../../ajax/ajax_getFiles.php:40 msgid "Gestión de archivos deshabilitada" msgstr "Files management disabled" -#: ../../../../ajax/ajax_files.php:59 ../../../../inc/Files.class.php:63 +#: ../../../../ajax/ajax_files.php:60 ../../../../inc/Files.class.php:63 msgid "Subir Archivo" msgstr "Upload File" -#: ../../../../ajax/ajax_files.php:68 +#: ../../../../ajax/ajax_files.php:69 msgid "No hay extensiones permitidas" msgstr "There are no allowed extensions" -#: ../../../../ajax/ajax_files.php:79 ../../../../inc/FileImport.class.php:115 +#: ../../../../ajax/ajax_files.php:80 ../../../../inc/FileImport.class.php:115 msgid "Tipo de archivo no soportado" msgstr "File type not allowed" -#: ../../../../ajax/ajax_files.php:85 +#: ../../../../ajax/ajax_files.php:86 msgid "Archivo inválido" msgstr "Invalid file" -#: ../../../../ajax/ajax_files.php:101 ../../../../ajax/ajax_files.php:118 +#: ../../../../ajax/ajax_files.php:102 ../../../../ajax/ajax_files.php:119 #: ../../../../inc/FileImport.class.php:131 #: ../../../../inc/FileImport.class.php:149 #: ../../../../inc/FileImport.class.php:167 msgid "Error interno al leer el archivo" msgstr "Internal error on reading file" -#: ../../../../ajax/ajax_files.php:108 +#: ../../../../ajax/ajax_files.php:109 msgid "El archivo es mayor de " msgstr "The file is bigger than" -#: ../../../../ajax/ajax_files.php:125 +#: ../../../../ajax/ajax_files.php:126 msgid "Archivo guardado" msgstr "File saved" -#: ../../../../ajax/ajax_files.php:130 +#: ../../../../ajax/ajax_files.php:131 msgid "No se pudo guardar el archivo" msgstr "Error on saving file" -#: ../../../../ajax/ajax_files.php:140 ../../../../ajax/ajax_files.php:199 +#: ../../../../ajax/ajax_files.php:141 ../../../../ajax/ajax_files.php:200 msgid "No es un ID de archivo válido" msgstr "Invalid file ID" -#: ../../../../ajax/ajax_files.php:148 +#: ../../../../ajax/ajax_files.php:149 msgid "El archivo no existe" msgstr "The file does not exist" -#: ../../../../ajax/ajax_files.php:157 +#: ../../../../ajax/ajax_files.php:158 #: ../../../../inc/themes/classic/files.inc:19 #: ../../../../inc/themes/material-blue/files.inc:19 msgid "Descargar Archivo" msgstr "Download File" -#: ../../../../ajax/ajax_files.php:158 ../../../../ajax/ajax_viewpass.php:69 +#: ../../../../ajax/ajax_files.php:159 ../../../../ajax/ajax_viewpass.php:70 #: ../../../../inc/Files.class.php:112 -#: ../../../../inc/themes/classic/eventlog.inc:16 -#: ../../../../inc/themes/material-blue/eventlog.inc:15 +#: ../../../../inc/themes/classic/eventlog.inc:14 +#: ../../../../inc/themes/material-blue/eventlog.inc:14 msgid "ID" msgstr "ID" -#: ../../../../ajax/ajax_files.php:159 ../../../../inc/Files.class.php:65 +#: ../../../../ajax/ajax_files.php:160 ../../../../inc/Files.class.php:65 #: ../../../../inc/Files.class.php:113 -#: ../../../../inc/themes/classic/import.inc:155 -#: ../../../../inc/themes/material-blue/import.inc:83 +#: ../../../../inc/themes/classic/import.inc:152 +#: ../../../../inc/themes/material-blue/import.inc:80 msgid "Archivo" msgstr "File" -#: ../../../../ajax/ajax_files.php:160 ../../../../inc/Files.class.php:66 +#: ../../../../ajax/ajax_files.php:161 ../../../../inc/Files.class.php:66 #: ../../../../inc/Files.class.php:114 -#: ../../../../web/AccountsMgmtC.class.php:266 +#: ../../../../web/AccountsMgmtC.class.php:267 #: ../../../../inc/themes/classic/customfields.inc:16 #: ../../../../inc/themes/material-blue/customfields.inc:19 msgid "Tipo" msgstr "Type" -#: ../../../../ajax/ajax_files.php:161 ../../../../inc/Files.class.php:67 +#: ../../../../ajax/ajax_files.php:162 ../../../../inc/Files.class.php:67 #: ../../../../inc/Files.class.php:115 msgid "Tamaño" msgstr "Size" -#: ../../../../ajax/ajax_files.php:203 +#: ../../../../ajax/ajax_files.php:204 msgid "Archivo eliminado" msgstr "File deleted" -#: ../../../../ajax/ajax_files.php:208 +#: ../../../../ajax/ajax_files.php:209 msgid "Error al eliminar el archivo" msgstr "Error on file deletion" #: ../../../../ajax/ajax_getContent.php:42 #: ../../../../inc/ApiRequest.class.php:55 -#: ../../../../inc/CustomFieldDef.class.php:38 -#: ../../../../inc/CustomFields.class.php:48 +#: ../../../../inc/CustomFieldDef.class.php:45 +#: ../../../../inc/CustomFields.class.php:54 msgid "Parámetros incorrectos" msgstr "Incorrect parameters" -#: ../../../../ajax/ajax_migrate.php:55 +#: ../../../../ajax/ajax_migrate.php:56 msgid "Confirmar la importación de cuentas" msgstr "Confirm account import" -#: ../../../../ajax/ajax_migrate.php:57 +#: ../../../../ajax/ajax_migrate.php:58 msgid "Es necesario un usuario de conexión" msgstr "A connection username is needed" -#: ../../../../ajax/ajax_migrate.php:59 +#: ../../../../ajax/ajax_migrate.php:60 msgid "Es necesaria una clave de conexión" msgstr "The connection password is needed" -#: ../../../../ajax/ajax_migrate.php:61 +#: ../../../../ajax/ajax_migrate.php:62 msgid "Es necesario el nombre de la BBDD" msgstr "A database name is needed" -#: ../../../../ajax/ajax_migrate.php:63 +#: ../../../../ajax/ajax_migrate.php:64 msgid "Es necesario un nombre de host" msgstr "A host name is needed" -#: ../../../../ajax/ajax_passReset.php:47 #: ../../../../ajax/ajax_passReset.php:50 +#: ../../../../ajax/ajax_passReset.php:53 msgid "Recuperación de Clave" msgstr "Password Recovery" -#: ../../../../ajax/ajax_passReset.php:53 -#: ../../../../ajax/ajax_passReset.php:58 +#: ../../../../ajax/ajax_passReset.php:56 +#: ../../../../ajax/ajax_passReset.php:61 msgid "Solicitado para" msgstr "Requested for" -#: ../../../../ajax/ajax_passReset.php:55 -#: ../../../../ajax/ajax_sendRequest.php:75 +#: ../../../../ajax/ajax_passReset.php:58 +#: ../../../../ajax/ajax_sendRequest.php:76 msgid "Solicitud enviada" msgstr "Request sent" -#: ../../../../ajax/ajax_passReset.php:55 +#: ../../../../ajax/ajax_passReset.php:58 msgid "En breve recibirá un correo para completar la solicitud." msgstr "You will receive an email to complete the request in short." -#: ../../../../ajax/ajax_passReset.php:60 +#: ../../../../ajax/ajax_passReset.php:63 msgid "No se ha podido realizar la solicitud. Consulte con el administrador." msgstr "The request cannot be done. Please contact to the administrator" -#: ../../../../ajax/ajax_passReset.php:70 -#: ../../../../inc/UserBase.class.php:568 -#: ../../../../inc/UserUtil.class.php:659 +#: ../../../../ajax/ajax_passReset.php:73 +#: ../../../../inc/UserBase.class.php:570 +#: ../../../../inc/UserPass.class.php:127 msgid "Modificar Clave Usuario" msgstr "Edit User Password" -#: ../../../../ajax/ajax_passReset.php:70 -#: ../../../../inc/UserBase.class.php:568 -#: ../../../../inc/UserBase.class.php:592 -#: ../../../../inc/UserUtil.class.php:659 -#: ../../../../web/UsersMgmtC.class.php:88 +#: ../../../../ajax/ajax_passReset.php:73 +#: ../../../../inc/UserBase.class.php:570 +#: ../../../../inc/UserBase.class.php:594 +#: ../../../../inc/UserPass.class.php:127 +#: ../../../../web/UsersMgmtC.class.php:89 #: ../../../../inc/themes/classic/users.inc:21 #: ../../../../inc/themes/material-blue/users.inc:24 msgid "Login" msgstr "Login" -#: ../../../../ajax/ajax_passReset.php:78 +#: ../../../../ajax/ajax_passReset.php:81 msgid "La clave es incorrecta o no coincide" msgstr "The password is incorrect or do not match" -#: ../../../../ajax/ajax_sendRequest.php:48 +#: ../../../../ajax/ajax_sendRequest.php:49 msgid "Es necesaria una descripción" msgstr "A description is needed" -#: ../../../../ajax/ajax_sendRequest.php:61 +#: ../../../../ajax/ajax_sendRequest.php:62 msgid "Solicitud de Modificación de Cuenta" msgstr "Request for Account Modification" -#: ../../../../ajax/ajax_sendRequest.php:62 +#: ../../../../ajax/ajax_sendRequest.php:63 msgid "Solicitante" msgstr "Requester" -#: ../../../../ajax/ajax_sendRequest.php:63 -#: ../../../../ajax/ajax_viewpass.php:70 ../../../../inc/Account.class.php:165 +#: ../../../../ajax/ajax_sendRequest.php:64 +#: ../../../../ajax/ajax_viewpass.php:71 ../../../../inc/Account.class.php:165 #: ../../../../inc/Account.class.php:219 ../../../../inc/Account.class.php:400 #: ../../../../inc/Account.class.php:423 ../../../../inc/Account.class.php:665 #: ../../../../inc/Files.class.php:64 msgid "Cuenta" msgstr "Account" -#: ../../../../ajax/ajax_sendRequest.php:64 +#: ../../../../ajax/ajax_sendRequest.php:65 #: ../../../../inc/Account.class.php:164 ../../../../inc/Account.class.php:218 #: ../../../../inc/Account.class.php:399 ../../../../inc/Account.class.php:422 #: ../../../../inc/Account.class.php:664 ../../../../inc/Customer.class.php:65 #: ../../../../inc/Customer.class.php:115 #: ../../../../inc/Customer.class.php:163 -#: ../../../../web/SearchC.class.php:286 +#: ../../../../web/SearchC.class.php:288 #: ../../../../inc/themes/classic/account.inc:23 #: ../../../../inc/themes/classic/editpass.inc:12 #: ../../../../inc/themes/classic/request.inc:9 @@ -1038,45 +1071,45 @@ msgstr "Account" msgid "Cliente" msgstr "Customer" -#: ../../../../ajax/ajax_sendRequest.php:65 -#: ../../../../web/AccountsMgmtC.class.php:79 -#: ../../../../web/AccountsMgmtC.class.php:138 -#: ../../../../web/UsersMgmtC.class.php:187 +#: ../../../../ajax/ajax_sendRequest.php:66 +#: ../../../../web/AccountsMgmtC.class.php:80 +#: ../../../../web/AccountsMgmtC.class.php:139 +#: ../../../../web/UsersMgmtC.class.php:188 #: ../../../../inc/themes/classic/categories.inc:16 #: ../../../../inc/themes/classic/customers.inc:16 -#: ../../../../inc/themes/classic/eventlog.inc:31 +#: ../../../../inc/themes/classic/eventlog.inc:29 #: ../../../../inc/themes/classic/groups.inc:16 #: ../../../../inc/themes/material-blue/categories.inc:20 #: ../../../../inc/themes/material-blue/customers.inc:20 -#: ../../../../inc/themes/material-blue/eventlog.inc:30 +#: ../../../../inc/themes/material-blue/eventlog.inc:29 #: ../../../../inc/themes/material-blue/groups.inc:20 msgid "Descripción" msgstr "Description" -#: ../../../../ajax/ajax_sendRequest.php:78 +#: ../../../../ajax/ajax_sendRequest.php:79 msgid "Error al enviar la solicitud" msgstr "Error on sending request" -#: ../../../../ajax/ajax_userPrefsSave.php:70 -#: ../../../../ajax/ajax_userPrefsSave.php:103 +#: ../../../../ajax/ajax_userPrefsSave.php:71 +#: ../../../../ajax/ajax_userPrefsSave.php:104 msgid "Error al actualizar preferencias" msgstr "Error while updating preferences" -#: ../../../../ajax/ajax_userPrefsSave.php:80 -#: ../../../../ajax/ajax_userPrefsSave.php:106 +#: ../../../../ajax/ajax_userPrefsSave.php:81 +#: ../../../../ajax/ajax_userPrefsSave.php:107 msgid "Preferencias actualizadas" msgstr "Preferences updated" -#: ../../../../ajax/ajax_viewpass.php:54 +#: ../../../../ajax/ajax_viewpass.php:55 msgid "La clave maestra no coincide" msgstr "The master password does not match" -#: ../../../../ajax/ajax_viewpass.php:58 +#: ../../../../ajax/ajax_viewpass.php:59 #: ../../../../inc/Controller.class.php:166 msgid "No tiene permisos para acceder a esta cuenta" msgstr "You don't have permission to access to this account" -#: ../../../../ajax/ajax_viewpass.php:68 ../../../../inc/Acl.class.php:133 +#: ../../../../ajax/ajax_viewpass.php:69 ../../../../inc/Acl.class.php:133 #: ../../../../inc/themes/classic/account.inc:382 #: ../../../../inc/themes/classic/profiles.inc:23 #: ../../../../inc/themes/classic/search.inc:109 @@ -1086,7 +1119,7 @@ msgstr "You don't have permission to access to this account" msgid "Ver Clave" msgstr "View password" -#: ../../../../ajax/ajax_viewpass.php:79 ../../../../js/strings.js.php:73 +#: ../../../../ajax/ajax_viewpass.php:80 ../../../../js/strings.js.php:73 msgid "Clave de Cuenta" msgstr "Account Password" @@ -1101,11 +1134,19 @@ msgstr "Parameters help" #: ../../../../inc/AccountSearch.class.php:28 ../../../../inc/Acl.class.php:29 #: ../../../../inc/Api.class.php:30 ../../../../inc/ApiRequest.class.php:28 #: ../../../../inc/ApiTokens.class.php:28 ../../../../inc/Auth.class.php:29 -#: ../../../../inc/Auth2FA.class.php:32 ../../../../inc/Backup.class.php:28 -#: ../../../../inc/Category.class.php:29 ../../../../inc/Common.class.php:28 -#: ../../../../inc/Config.class.php:28 ../../../../inc/Controller.class.php:31 -#: ../../../../inc/Crypt.class.php:28 ../../../../inc/CsvImport.class.php:28 +#: ../../../../inc/Auth2FA.class.php:33 ../../../../inc/Backup.class.php:28 +#: ../../../../inc/Base.php:26 ../../../../inc/Cache.class.php:28 +#: ../../../../inc/Category.class.php:29 ../../../../inc/Config.class.php:28 +#: ../../../../inc/ConfigDB.class.php:28 +#: ../../../../inc/ConfigInterface.class.php:28 +#: ../../../../inc/Controller.class.php:31 ../../../../inc/Crypt.class.php:28 +#: ../../../../inc/CryptMasterPass.class.php:28 +#: ../../../../inc/CryptPKI.class.php:28 +#: ../../../../inc/CsvImport.class.php:28 #: ../../../../inc/CsvImportBase.class.php:28 +#: ../../../../inc/CustomFieldDef.class.php:28 +#: ../../../../inc/CustomFields.class.php:28 +#: ../../../../inc/CustomFieldsBase.class.php:28 #: ../../../../inc/Customer.class.php:29 ../../../../inc/DB.class.php:28 #: ../../../../inc/DBConnectionFactory.class.php:30 #: ../../../../inc/FileImport.class.php:28 ../../../../inc/Files.class.php:29 @@ -1120,20 +1161,29 @@ msgstr "Parameters help" #: ../../../../inc/Migrate.class.php:28 ../../../../inc/Minify.class.php:30 #: ../../../../inc/Profile.class.php:29 #: ../../../../inc/ProfileBase.class.php:28 -#: ../../../../inc/Request.class.php:110 ../../../../inc/Session.class.php:28 +#: ../../../../inc/Request.class.php:110 ../../../../inc/Response.class.php:28 +#: ../../../../inc/SPException.class.php:28 +#: ../../../../inc/Session.class.php:28 +#: ../../../../inc/SessionUtil.class.php:28 #: ../../../../inc/SyspassImport.class.php:28 -#: ../../../../inc/Themes.class.php:28 ../../../../inc/Upgrade.class.php:29 -#: ../../../../inc/User.class.php:28 ../../../../inc/UserLdap.class.php:28 +#: ../../../../inc/Template.class.php:27 ../../../../inc/Themes.class.php:28 +#: ../../../../inc/Upgrade.class.php:29 ../../../../inc/User.class.php:28 +#: ../../../../inc/UserAccounts.class.php:28 +#: ../../../../inc/UserBase.class.php:28 ../../../../inc/UserLdap.class.php:28 +#: ../../../../inc/UserMigrate.class.php:28 +#: ../../../../inc/UserPass.class.php:28 +#: ../../../../inc/UserPassRecover.class.php:28 #: ../../../../inc/UserPreferences.class.php:28 -#: ../../../../inc/UserUtil.class.php:28 ../../../../inc/Util.class.php:31 +#: ../../../../inc/UserUtil.class.php:28 ../../../../inc/Util.class.php:28 +#: ../../../../inc/XmlExport.class.php:28 #: ../../../../inc/XmlImport.class.php:28 #: ../../../../inc/XmlImportBase.class.php:28 -#: ../../../../web/AccountC.class.php:38 -#: ../../../../web/AccountsMgmtC.class.php:32 -#: ../../../../web/ConfigC.class.php:33 ../../../../web/EventlogC.class.php:28 -#: ../../../../web/SearchC.class.php:31 -#: ../../../../web/UsersMgmtC.class.php:39 -#: ../../../../web/UsersPrefsC.class.php:34 +#: ../../../../web/AccountC.class.php:41 +#: ../../../../web/AccountsMgmtC.class.php:33 +#: ../../../../web/ConfigC.class.php:35 ../../../../web/EventlogC.class.php:30 +#: ../../../../web/SearchC.class.php:33 +#: ../../../../web/UsersMgmtC.class.php:40 +#: ../../../../web/UsersPrefsC.class.php:35 msgid "No es posible acceder directamente a este archivo" msgstr "Unable to access to this file directly" @@ -1159,13 +1209,13 @@ msgid "Restaurar Cuenta" msgstr "Account Restore" #: ../../../../inc/Account.class.php:324 -#: ../../../../inc/AccountHistory.class.php:343 -#: ../../../../inc/AccountHistory.class.php:503 +#: ../../../../inc/AccountHistory.class.php:348 +#: ../../../../inc/AccountHistory.class.php:508 msgid "No se pudieron obtener los datos de la cuenta" msgstr "Error while retrieving account data" #: ../../../../inc/Account.class.php:398 ../../../../inc/Acl.class.php:129 -#: ../../../../web/AccountC.class.php:147 ../../../../web/MainC.class.php:183 +#: ../../../../web/AccountC.class.php:150 ../../../../web/MainC.class.php:183 msgid "Nueva Cuenta" msgstr "New Account" @@ -1174,7 +1224,7 @@ msgid "ERROR: Error en la operación." msgstr "ERROR: Operation failed" #: ../../../../inc/Account.class.php:421 ../../../../inc/Acl.class.php:134 -#: ../../../../web/AccountC.class.php:353 +#: ../../../../web/AccountC.class.php:356 #: ../../../../inc/themes/classic/account.inc:369 #: ../../../../inc/themes/classic/search.inc:137 #: ../../../../inc/themes/material-blue/account.inc:418 @@ -1195,33 +1245,33 @@ msgid "Error al eliminar archivos asociados a la cuenta" msgstr "Error on deleting account's files" #: ../../../../inc/Account.class.php:496 -#: ../../../../inc/AccountHistory.class.php:124 +#: ../../../../inc/AccountHistory.class.php:129 #: ../../../../inc/XmlImport.class.php:62 msgid "Inicio" msgstr "Start" #: ../../../../inc/Account.class.php:501 -#: ../../../../inc/AccountHistory.class.php:130 +#: ../../../../inc/AccountHistory.class.php:135 msgid "Error en el módulo de encriptación" msgstr "Error on encryption module" #: ../../../../inc/Account.class.php:509 -#: ../../../../inc/AccountHistory.class.php:138 +#: ../../../../inc/AccountHistory.class.php:143 msgid "Error al obtener las claves de las cuentas" msgstr "Error on retrieving accounts' passwords" #: ../../../../inc/Account.class.php:525 -#: ../../../../inc/AccountHistory.class.php:160 +#: ../../../../inc/AccountHistory.class.php:165 msgid "Clave de cuenta vacía" msgstr "Account password empty" #: ../../../../inc/Account.class.php:530 -#: ../../../../inc/AccountHistory.class.php:165 +#: ../../../../inc/AccountHistory.class.php:170 msgid "IV de encriptación incorrecto" msgstr "Wrong encryption IV" #: ../../../../inc/Account.class.php:539 -#: ../../../../inc/AccountHistory.class.php:174 +#: ../../../../inc/AccountHistory.class.php:179 msgid "No es posible desencriptar la clave de la cuenta" msgstr "Unable to decrypt account password" @@ -1234,8 +1284,8 @@ msgid "Cuentas actualizadas" msgstr "Accounts updated" #: ../../../../inc/Account.class.php:564 -#: ../../../../inc/AccountHistory.class.php:199 -#: ../../../../inc/CustomFields.class.php:319 +#: ../../../../inc/AccountHistory.class.php:204 +#: ../../../../inc/CustomFields.class.php:325 msgid "Fin" msgstr "End" @@ -1247,20 +1297,20 @@ msgstr "Update Password" msgid "No se pudieron obtener los datos de las cuentas" msgstr "It was unable to retrieve accounts data" -#: ../../../../inc/AccountHistory.class.php:123 +#: ../../../../inc/AccountHistory.class.php:128 msgid "Actualizar Clave Maestra (H)" msgstr "Update Master Password (H)" -#: ../../../../inc/AccountHistory.class.php:155 +#: ../../../../inc/AccountHistory.class.php:160 msgid "La clave maestra del registro no coincide" msgstr "The record's master password does not match" -#: ../../../../inc/AccountHistory.class.php:180 +#: ../../../../inc/AccountHistory.class.php:185 msgid "Fallo al actualizar la clave del histórico" msgstr "Error on updating history's master password" -#: ../../../../inc/AccountHistory.class.php:194 -#: ../../../../inc/CustomFields.class.php:315 +#: ../../../../inc/AccountHistory.class.php:199 +#: ../../../../inc/CustomFields.class.php:321 msgid "Registros actualizados" msgstr "Records updated" @@ -1276,13 +1326,13 @@ msgstr "Search Accounts" msgid "Ver Cuenta" msgstr "View Account" -#: ../../../../inc/Acl.class.php:128 ../../../../web/AccountC.class.php:260 +#: ../../../../inc/Acl.class.php:128 ../../../../web/AccountC.class.php:263 #: ../../../../inc/themes/classic/search.inc:131 #: ../../../../inc/themes/material-blue/search.inc:134 msgid "Copiar Cuenta" msgstr "Copy Account" -#: ../../../../inc/Acl.class.php:130 ../../../../web/AccountC.class.php:324 +#: ../../../../inc/Acl.class.php:130 ../../../../web/AccountC.class.php:327 msgid "Editar Cuenta" msgstr "Edit Account" @@ -1341,8 +1391,8 @@ msgstr "Groups Management" msgid "Gestión Perfiles" msgstr "Profiles Management" -#: ../../../../inc/Acl.class.php:146 ../../../../inc/Config.class.php:118 -#: ../../../../inc/Config.class.php:403 ../../../../web/MainC.class.php:201 +#: ../../../../inc/Acl.class.php:146 ../../../../inc/ConfigDB.class.php:91 +#: ../../../../inc/ConfigDB.class.php:119 ../../../../web/MainC.class.php:201 #: ../../../../inc/themes/classic/profiles.inc:57 #: ../../../../inc/themes/material-blue/profiles.inc:66 msgid "Configuración" @@ -1352,13 +1402,13 @@ msgstr "Configuration" msgid "Configuración General" msgstr "General configuration" -#: ../../../../inc/Acl.class.php:148 ../../../../web/ConfigC.class.php:130 +#: ../../../../inc/Acl.class.php:148 ../../../../web/ConfigC.class.php:132 #: ../../../../inc/themes/classic/profiles.inc:65 #: ../../../../inc/themes/material-blue/profiles.inc:77 msgid "Encriptación" msgstr "Encryption" -#: ../../../../inc/Acl.class.php:149 ../../../../web/ConfigC.class.php:175 +#: ../../../../inc/Acl.class.php:149 ../../../../web/ConfigC.class.php:177 #: ../../../../inc/themes/classic/backup.inc:4 #: ../../../../inc/themes/material-blue/backup.inc:4 msgid "Copia de Seguridad" @@ -1416,7 +1466,7 @@ msgid "Actualizar Autorización" msgstr "Update Athorization" #: ../../../../inc/ApiTokens.class.php:331 -#: ../../../../web/UsersMgmtC.class.php:421 +#: ../../../../web/UsersMgmtC.class.php:422 msgid "Eliminar Autorización" msgstr "Delete Authorization" @@ -1453,12 +1503,12 @@ msgid "Error al realizar backup en modo compatibilidad" msgstr "Error while doing backup in compatibility mode" #: ../../../../inc/Backup.class.php:223 -#: ../../../../inc/XmlExport.class.php:465 +#: ../../../../inc/XmlExport.class.php:467 msgid "No es posible crear el directorio de backups" msgstr "Unable to create backups directory" #: ../../../../inc/Backup.class.php:228 -#: ../../../../inc/XmlExport.class.php:470 +#: ../../../../inc/XmlExport.class.php:472 msgid "Compruebe los permisos del directorio de backups" msgstr "Check backup directory permissions" @@ -1474,7 +1524,7 @@ msgstr "Error on creating category" #: ../../../../inc/Category.class.php:83 #: ../../../../inc/Category.class.php:132 #: ../../../../inc/Category.class.php:182 -#: ../../../../web/SearchC.class.php:298 +#: ../../../../web/SearchC.class.php:300 #: ../../../../inc/themes/classic/account.inc:42 #: ../../../../inc/themes/classic/search.inc:53 #: ../../../../inc/themes/material-blue/account.inc:50 @@ -1491,7 +1541,7 @@ msgid "Error al eliminar la categoría" msgstr "Error on category deletion" #: ../../../../inc/Category.class.php:132 -#: ../../../../web/AccountsMgmtC.class.php:101 +#: ../../../../web/AccountsMgmtC.class.php:102 msgid "Eliminar Categoría" msgstr "Delete Category" @@ -1503,23 +1553,24 @@ msgstr "Error on updating category" msgid "Modificar Categoría" msgstr "Category Edit" -#: ../../../../inc/Config.class.php:118 ../../../../inc/Config.class.php:404 -msgid "Modificar configuración" -msgstr "Update Configuration" - -#: ../../../../inc/Config.class.php:276 +#: ../../../../inc/Config.class.php:148 msgid "No es posible escribir el archivo de configuración" msgstr "Unable to write in configuration file" -#: ../../../../inc/Config.class.php:276 +#: ../../../../inc/Config.class.php:148 msgid "Compruebe los permisos del directorio \"config\"" msgstr "Please, check the \"config\" directory permissions" -#: ../../../../inc/Config.class.php:405 +#: ../../../../inc/ConfigDB.class.php:91 +#: ../../../../inc/ConfigDB.class.php:120 +msgid "Modificar configuración" +msgstr "Update Configuration" + +#: ../../../../inc/ConfigDB.class.php:121 msgid "Parámetro" msgstr "Parameter" -#: ../../../../inc/Config.class.php:406 +#: ../../../../inc/ConfigDB.class.php:122 msgid "Valor" msgstr "Value" @@ -1542,7 +1593,7 @@ msgstr "You don't have permission to access to this page" msgid "No tiene permisos para realizar esta operación" msgstr "You don't have permission to do this operation" -#: ../../../../inc/Crypt.class.php:119 ../../../../inc/Email.class.php:146 +#: ../../../../inc/Crypt.class.php:119 ../../../../inc/Email.class.php:148 msgid "Aviso" msgstr "Warning" @@ -1560,12 +1611,12 @@ msgstr "Crypto module cannot be loaded" msgid "Error al generar datos cifrados" msgstr "Error on creating encryption data" -#: ../../../../inc/CryptPKI.class.php:44 +#: ../../../../inc/CryptPKI.class.php:46 msgid "No es posible generar las claves RSA" msgstr "Unable to cgenerate the RSA keys" -#: ../../../../inc/CryptPKI.class.php:110 -#: ../../../../inc/CryptPKI.class.php:141 +#: ../../../../inc/CryptPKI.class.php:112 +#: ../../../../inc/CryptPKI.class.php:143 msgid "El archivo de clave no existe" msgstr "The key file does not exist" @@ -1582,10 +1633,10 @@ msgstr "Please, check CSV format in line %s" #: ../../../../inc/CsvImportBase.class.php:140 #: ../../../../inc/CsvImportBase.class.php:145 #: ../../../../inc/Import.class.php:118 ../../../../inc/Import.class.php:124 -#: ../../../../inc/Migrate.class.php:349 +#: ../../../../inc/Migrate.class.php:348 #: ../../../../inc/XmlImport.class.php:62 #: ../../../../inc/XmlImport.class.php:63 -#: ../../../../web/ConfigC.class.php:197 +#: ../../../../web/ConfigC.class.php:199 msgid "Importar Cuentas" msgstr "Import Accounts" @@ -1603,69 +1654,69 @@ msgstr "Error while processing line %s" msgid "Cuenta importada: %s" msgstr "Account %s imported" -#: ../../../../inc/CustomFields.class.php:270 -#: ../../../../web/AccountsMgmtC.class.php:300 +#: ../../../../inc/CustomFields.class.php:276 +#: ../../../../web/AccountsMgmtC.class.php:301 #: ../../../../inc/themes/classic/profiles.inc:107 #: ../../../../inc/themes/material-blue/profiles.inc:124 msgid "Campos Personalizados" msgstr "Custom Fields" -#: ../../../../inc/CustomFields.class.php:279 +#: ../../../../inc/CustomFields.class.php:285 msgid "Error al actualizar datos encriptados" msgstr "Error while updating encrypted data" -#: ../../../../inc/CustomFields.class.php:283 +#: ../../../../inc/CustomFields.class.php:289 msgid "Actualizando datos encriptados" msgstr "Updating encrypted data" -#: ../../../../inc/CustomFields.class.php:310 +#: ../../../../inc/CustomFields.class.php:316 msgid "Registros no actualizados" msgstr "Not updated records" -#: ../../../../inc/CustomFieldsBase.class.php:79 +#: ../../../../inc/CustomFieldsBase.class.php:86 msgid "Texto" msgstr "Text" -#: ../../../../inc/CustomFieldsBase.class.php:81 +#: ../../../../inc/CustomFieldsBase.class.php:88 msgid "Fecha" msgstr "Date" -#: ../../../../inc/CustomFieldsBase.class.php:82 +#: ../../../../inc/CustomFieldsBase.class.php:89 msgid "Número" msgstr "Number" -#: ../../../../inc/CustomFieldsBase.class.php:83 +#: ../../../../inc/CustomFieldsBase.class.php:90 #: ../../../../inc/themes/classic/passreset.inc:22 #: ../../../../inc/themes/classic/users.inc:61 #: ../../../../inc/themes/material-blue/users.inc:71 msgid "Email" msgstr "Email" -#: ../../../../inc/CustomFieldsBase.class.php:84 +#: ../../../../inc/CustomFieldsBase.class.php:91 msgid "Teléfono" msgstr "Phone" -#: ../../../../inc/CustomFieldsBase.class.php:85 +#: ../../../../inc/CustomFieldsBase.class.php:92 msgid "Link" msgstr "Link" -#: ../../../../inc/CustomFieldsBase.class.php:86 +#: ../../../../inc/CustomFieldsBase.class.php:93 msgid "Color" msgstr "Color" -#: ../../../../inc/CustomFieldsBase.class.php:100 +#: ../../../../inc/CustomFieldsBase.class.php:107 #: ../../../../inc/themes/classic/profiles.inc:98 #: ../../../../inc/themes/material-blue/profiles.inc:114 msgid "Categorías" msgstr "Categories" -#: ../../../../inc/CustomFieldsBase.class.php:101 +#: ../../../../inc/CustomFieldsBase.class.php:108 #: ../../../../inc/themes/classic/profiles.inc:103 #: ../../../../inc/themes/material-blue/profiles.inc:119 msgid "Clientes" msgstr "Customers" -#: ../../../../inc/CustomFieldsBase.class.php:103 +#: ../../../../inc/CustomFieldsBase.class.php:110 #: ../../../../inc/themes/classic/account.inc:143 #: ../../../../inc/themes/classic/profiles.inc:89 #: ../../../../inc/themes/material-blue/account.inc:169 @@ -1698,7 +1749,7 @@ msgid "Error al eliminar el cliente" msgstr "Error on customer deletion" #: ../../../../inc/Customer.class.php:163 -#: ../../../../web/AccountsMgmtC.class.php:159 +#: ../../../../web/AccountsMgmtC.class.php:160 msgid "Eliminar Cliente" msgstr "Delete Customer" @@ -1706,22 +1757,22 @@ msgstr "Delete Customer" #: ../../../../inc/DBConnectionFactory.class.php:85 #: ../../../../inc/DBConnectionFactory.class.php:99 #: ../../../../inc/Installer.class.php:235 -#: ../../../../inc/Migrate.class.php:115 +#: ../../../../inc/Migrate.class.php:114 msgid "No es posible conectar con la BD" msgstr "Unable to connect to the DB" #: ../../../../inc/DBConnectionFactory.class.php:83 #: ../../../../inc/DBConnectionFactory.class.php:85 #: ../../../../inc/Installer.class.php:236 -#: ../../../../inc/Migrate.class.php:116 +#: ../../../../inc/Migrate.class.php:115 msgid "Compruebe los datos de conexión" msgstr "Please, check connection parameters" -#: ../../../../inc/Email.class.php:59 ../../../../inc/UserUtil.class.php:562 +#: ../../../../inc/Email.class.php:59 ../../../../inc/UserUtil.class.php:182 msgid "N/D" msgstr "N/A" -#: ../../../../inc/Email.class.php:60 ../../../../web/UsersMgmtC.class.php:392 +#: ../../../../inc/Email.class.php:60 ../../../../web/UsersMgmtC.class.php:393 #: ../../../../inc/themes/classic/tokens.inc:20 #: ../../../../inc/themes/material-blue/tokens.inc:20 msgid "Acción" @@ -1787,7 +1838,7 @@ msgid "Error al actualizar los usuarios del grupo" msgstr "Error while updating group users" #: ../../../../inc/Groups.class.php:369 -#: ../../../../web/UsersMgmtC.class.php:209 +#: ../../../../web/UsersMgmtC.class.php:210 msgid "Eliminar Grupo" msgstr "Delete Group" @@ -1804,7 +1855,7 @@ msgid "Compruebe el formato del archivo" msgstr "Please, check the file format" #: ../../../../inc/Import.class.php:124 ../../../../inc/Import.class.php:127 -#: ../../../../inc/Migrate.class.php:92 +#: ../../../../inc/Migrate.class.php:91 msgid "Importación finalizada" msgstr "Import finished" @@ -2083,144 +2134,144 @@ msgid "Vaciar Eventos" msgstr "Clear Events" #: ../../../../inc/Log.class.php:88 -#: ../../../../inc/themes/classic/eventlog.inc:100 -#: ../../../../inc/themes/material-blue/eventlog.inc:100 +#: ../../../../inc/themes/classic/eventlog.inc:98 +#: ../../../../inc/themes/material-blue/eventlog.inc:99 msgid "Vaciar registro de eventos" msgstr "Clear event log" -#: ../../../../inc/Migrate.class.php:52 +#: ../../../../inc/Migrate.class.php:51 msgid "Faltan parámetros" msgstr "Missing parameters" -#: ../../../../inc/Migrate.class.php:149 +#: ../../../../inc/Migrate.class.php:148 msgid "La versión no es compatible" msgstr "Incompatible version" -#: ../../../../inc/Migrate.class.php:150 +#: ../../../../inc/Migrate.class.php:149 msgid "Actualice a la última versión de phpPMS" msgstr "Please, update to the last version of phpPMS" -#: ../../../../inc/Migrate.class.php:168 +#: ../../../../inc/Migrate.class.php:167 msgid "Error al obtener la configuración" msgstr "Error on retrieving configuration" -#: ../../../../inc/Migrate.class.php:211 ../../../../inc/Migrate.class.php:224 +#: ../../../../inc/Migrate.class.php:210 ../../../../inc/Migrate.class.php:223 msgid "Error al vaciar tabla" msgstr "Error on cleaning table" -#: ../../../../inc/Migrate.class.php:229 +#: ../../../../inc/Migrate.class.php:228 msgid "Usuario actual no es administrador de la aplicación" msgstr "Current user is not application administrator" -#: ../../../../inc/Migrate.class.php:274 +#: ../../../../inc/Migrate.class.php:273 msgid "No es posible crear el cliente" msgstr "Unable to create the customer" -#: ../../../../inc/Migrate.class.php:275 +#: ../../../../inc/Migrate.class.php:274 msgid "Contacte con el desarrollador" msgstr "Please, contact to the developer" -#: ../../../../inc/Migrate.class.php:279 +#: ../../../../inc/Migrate.class.php:278 msgid "Importar Clientes" msgstr "Import Customers" -#: ../../../../inc/Migrate.class.php:281 ../../../../inc/Migrate.class.php:351 -#: ../../../../inc/Migrate.class.php:452 ../../../../inc/Migrate.class.php:525 -#: ../../../../inc/Migrate.class.php:633 ../../../../inc/Migrate.class.php:698 -#: ../../../../inc/Migrate.class.php:772 ../../../../inc/Migrate.class.php:862 -#: ../../../../inc/Migrate.class.php:933 +#: ../../../../inc/Migrate.class.php:280 ../../../../inc/Migrate.class.php:350 +#: ../../../../inc/Migrate.class.php:451 ../../../../inc/Migrate.class.php:524 +#: ../../../../inc/Migrate.class.php:632 ../../../../inc/Migrate.class.php:697 +#: ../../../../inc/Migrate.class.php:771 ../../../../inc/Migrate.class.php:861 +#: ../../../../inc/Migrate.class.php:932 msgid "Registros" msgstr "Records" -#: ../../../../inc/Migrate.class.php:303 +#: ../../../../inc/Migrate.class.php:302 msgid "Error al obtener los clientes" msgstr "Error on retrieving customer" -#: ../../../../inc/Migrate.class.php:345 +#: ../../../../inc/Migrate.class.php:344 msgid "Error al obtener cuentas" msgstr "Error on retrieving accounts" -#: ../../../../inc/Migrate.class.php:374 +#: ../../../../inc/Migrate.class.php:373 msgid "Cliente no encontrado" msgstr "Customer not found" -#: ../../../../inc/Migrate.class.php:417 +#: ../../../../inc/Migrate.class.php:416 msgid "Error al migrar cuenta" msgstr "Error on importing account" -#: ../../../../inc/Migrate.class.php:446 +#: ../../../../inc/Migrate.class.php:445 msgid "Error al obtener los grupos de cuentas" msgstr "Error on retrieving accounts groups" -#: ../../../../inc/Migrate.class.php:450 +#: ../../../../inc/Migrate.class.php:449 msgid "Importar Grupos de Cuentas" msgstr "Import Accounts Groups" -#: ../../../../inc/Migrate.class.php:472 +#: ../../../../inc/Migrate.class.php:471 msgid "Error al crear grupos de cuentas" msgstr "Error on accounts groups creation" -#: ../../../../inc/Migrate.class.php:519 +#: ../../../../inc/Migrate.class.php:518 msgid "Error al obtener el historico de cuentas" msgstr "Error on retrieving accounts history" -#: ../../../../inc/Migrate.class.php:523 +#: ../../../../inc/Migrate.class.php:522 msgid "Importar Histórico de Cuentas" msgstr "Import Accounts History" -#: ../../../../inc/Migrate.class.php:592 +#: ../../../../inc/Migrate.class.php:591 msgid "Error al crear historico de cuentas" msgstr "Error on creating accounts history" -#: ../../../../inc/Migrate.class.php:627 +#: ../../../../inc/Migrate.class.php:626 msgid "Error al obtener los archivos de cuentas" msgstr "Error on retrieving accounts files" -#: ../../../../inc/Migrate.class.php:631 +#: ../../../../inc/Migrate.class.php:630 msgid "Importar Archivos de Cuentas" msgstr "Import Accounts Files" -#: ../../../../inc/Migrate.class.php:663 +#: ../../../../inc/Migrate.class.php:662 msgid "Error al crear archivos de cuentas" msgstr "Error on creating accounts files" -#: ../../../../inc/Migrate.class.php:692 +#: ../../../../inc/Migrate.class.php:691 msgid "Error al obtener las categorías de cuentas" msgstr "Error on retrieving accounts categories" -#: ../../../../inc/Migrate.class.php:696 +#: ../../../../inc/Migrate.class.php:695 msgid "Importar Categorías de Cuentas" msgstr "Import Accounts Categories" -#: ../../../../inc/Migrate.class.php:718 +#: ../../../../inc/Migrate.class.php:717 msgid "Error al crear categorías de cuentas" msgstr "Error on retrieving accounts categories" -#: ../../../../inc/Migrate.class.php:766 +#: ../../../../inc/Migrate.class.php:765 msgid "Error al obtener los usuarios" msgstr "Error on retrieving users" -#: ../../../../inc/Migrate.class.php:770 +#: ../../../../inc/Migrate.class.php:769 msgid "Importar Usuarios" msgstr "Import Users" -#: ../../../../inc/Migrate.class.php:827 +#: ../../../../inc/Migrate.class.php:826 msgid "Error al crear usuarios" msgstr "Error on creating users" -#: ../../../../inc/Migrate.class.php:856 +#: ../../../../inc/Migrate.class.php:855 msgid "Error al obtener los grupos de usuarios" msgstr "Error on retrieving users groups" -#: ../../../../inc/Migrate.class.php:860 +#: ../../../../inc/Migrate.class.php:859 msgid "Importar Grupos de Usuarios" msgstr "Import Users Groups" -#: ../../../../inc/Migrate.class.php:886 +#: ../../../../inc/Migrate.class.php:885 msgid "Error al crear los grupos de usuarios" msgstr "Error on adding users groups" -#: ../../../../inc/Migrate.class.php:931 +#: ../../../../inc/Migrate.class.php:930 msgid "Importar Configuración" msgstr "Import Configuration" @@ -2246,7 +2297,7 @@ msgid "Datos de perfil incorrectos" msgstr "Wrong profile data" #: ../../../../inc/ProfileBase.class.php:550 -#: ../../../../web/UsersMgmtC.class.php:274 +#: ../../../../web/UsersMgmtC.class.php:275 msgid "Eliminar Perfil" msgstr "Delete Profile" @@ -2272,17 +2323,17 @@ msgstr "There is no customers to import" msgid "No hay cuentas para importar" msgstr "There is no accounts to import" -#: ../../../../inc/Template.class.php:89 +#: ../../../../inc/Template.class.php:91 #, php-format msgid "No es posible obtener la plantilla \"%s\" : %s" msgstr "Unable to retrieve the \"%s\" template: %s" -#: ../../../../inc/Template.class.php:128 +#: ../../../../inc/Template.class.php:130 #, php-format msgid "No es posible obtener la variable \"%s\"" msgstr "Unable to retrieve the \"%s\" variable" -#: ../../../../inc/Template.class.php:171 +#: ../../../../inc/Template.class.php:173 #, php-format msgid "No es posible destruir la variable \"%s\"" msgstr "Unable to unset the \"%s\" variable" @@ -2330,17 +2381,17 @@ msgstr "Update Configuration" msgid "Actualización de la Configuración realizada correctamente." msgstr "Configuration updating was successfully done." -#: ../../../../inc/UserBase.class.php:386 -#: ../../../../inc/UserBase.class.php:530 +#: ../../../../inc/UserBase.class.php:388 +#: ../../../../inc/UserBase.class.php:532 msgid "No se pudo realizar la petición de cambio de clave." msgstr "Could not perform the password change request." -#: ../../../../inc/UserBase.class.php:525 +#: ../../../../inc/UserBase.class.php:527 msgid "Modificar Usuario" msgstr "Edit User" -#: ../../../../inc/UserBase.class.php:592 -#: ../../../../web/UsersMgmtC.class.php:150 +#: ../../../../inc/UserBase.class.php:594 +#: ../../../../web/UsersMgmtC.class.php:151 msgid "Eliminar Usuario" msgstr "Delete User" @@ -2360,38 +2411,38 @@ msgstr "You will receive a confirmation email in short." msgid "Nuevo usuario de LDAP" msgstr "New LDAP user" -#: ../../../../inc/UserUtil.class.php:700 +#: ../../../../inc/UserMigrate.class.php:113 msgid "Migrar Grupos" msgstr "Migrate Groups" -#: ../../../../inc/UserUtil.class.php:700 +#: ../../../../inc/UserMigrate.class.php:113 msgid "Error al migrar grupo del usuario" msgstr "Error while migrating user group" -#: ../../../../inc/Util.class.php:122 +#: ../../../../inc/Util.class.php:119 msgid "Versión de PHP requerida >= " msgstr "Required PHP version >=" -#: ../../../../inc/Util.class.php:123 +#: ../../../../inc/Util.class.php:120 msgid "" "Actualice la versión de PHP para que la aplicación funcione correctamente" msgstr "Please update the PHP version to run sysPass" -#: ../../../../inc/Util.class.php:159 +#: ../../../../inc/Util.class.php:156 #: ../../../../inc/themes/classic/ldap.inc:212 #: ../../../../inc/themes/material-blue/ldap.inc:238 msgid "Módulo no disponible" msgstr "Module unavilable" -#: ../../../../inc/Util.class.php:160 +#: ../../../../inc/Util.class.php:157 msgid "Sin este módulo la aplicación puede no funcionar correctamente." msgstr "Without this module the application could not run correctly" -#: ../../../../inc/XmlExport.class.php:125 +#: ../../../../inc/XmlExport.class.php:127 msgid "Exportar XML" msgstr "XML Export" -#: ../../../../inc/XmlExport.class.php:410 +#: ../../../../inc/XmlExport.class.php:412 msgid "Error al crear el archivo XML" msgstr "Error while creating XML file" @@ -2399,15 +2450,15 @@ msgstr "Error while creating XML file" msgid "Formato detectado" msgstr "Detected format" -#: ../../../../inc/XmlImportBase.class.php:75 +#: ../../../../inc/XmlImportBase.class.php:80 msgid "No es posible procesar el archivo XML" msgstr "Unable to process XML file" -#: ../../../../inc/XmlImportBase.class.php:103 +#: ../../../../inc/XmlImportBase.class.php:108 msgid "Archivo XML no soportado" msgstr "XML file not supported" -#: ../../../../inc/XmlImportBase.class.php:104 +#: ../../../../inc/XmlImportBase.class.php:109 msgid "No es posible detectar la aplicación que exportó los datos" msgstr "Unable to detect the application the data was exported from" @@ -2589,9 +2640,9 @@ msgstr "YES" #: ../../../../inc/themes/classic/account.inc:136 #: ../../../../inc/themes/classic/account.inc:167 #: ../../../../inc/themes/classic/account.inc:449 -#: ../../../../inc/themes/classic/encryption.inc:61 -#: ../../../../inc/themes/classic/encryption.inc:80 -#: ../../../../inc/themes/classic/import.inc:70 +#: ../../../../inc/themes/classic/encryption.inc:58 +#: ../../../../inc/themes/classic/encryption.inc:77 +#: ../../../../inc/themes/classic/import.inc:67 #: ../../../../inc/themes/classic/install.inc:99 #: ../../../../inc/themes/classic/preferences.inc:82 #: ../../../../inc/themes/classic/security.inc:26 @@ -2615,8 +2666,8 @@ msgstr "Password Copied to Clipboard" msgid "Error al copiar al portapapeles" msgstr "Error while copying to clipboard" -#: ../../../../web/AccountC.class.php:381 -#: ../../../../web/AccountC.class.php:412 +#: ../../../../web/AccountC.class.php:384 +#: ../../../../web/AccountC.class.php:415 #: ../../../../inc/themes/classic/search.inc:45 #: ../../../../inc/themes/classic/search.inc:104 #: ../../../../inc/themes/material-blue/search.inc:41 @@ -2624,19 +2675,19 @@ msgstr "Error while copying to clipboard" msgid "Detalles de Cuenta" msgstr "Account Details" -#: ../../../../web/AccountC.class.php:469 +#: ../../../../web/AccountC.class.php:472 #: ../../../../inc/themes/classic/account.inc:396 #: ../../../../inc/themes/material-blue/account.inc:435 msgid "Modificar Clave de Cuenta" msgstr "Edit Account Password" -#: ../../../../web/AccountsMgmtC.class.php:79 -#: ../../../../web/AccountsMgmtC.class.php:138 -#: ../../../../web/AccountsMgmtC.class.php:266 -#: ../../../../web/SearchC.class.php:292 -#: ../../../../web/UsersMgmtC.class.php:87 -#: ../../../../web/UsersMgmtC.class.php:187 -#: ../../../../web/UsersMgmtC.class.php:245 +#: ../../../../web/AccountsMgmtC.class.php:80 +#: ../../../../web/AccountsMgmtC.class.php:139 +#: ../../../../web/AccountsMgmtC.class.php:267 +#: ../../../../web/SearchC.class.php:294 +#: ../../../../web/UsersMgmtC.class.php:88 +#: ../../../../web/UsersMgmtC.class.php:188 +#: ../../../../web/UsersMgmtC.class.php:246 #: ../../../../inc/themes/classic/account.inc:11 #: ../../../../inc/themes/classic/categories.inc:8 #: ../../../../inc/themes/classic/customers.inc:8 @@ -2662,54 +2713,54 @@ msgstr "Edit Account Password" msgid "Nombre" msgstr "Name" -#: ../../../../web/AccountsMgmtC.class.php:115 +#: ../../../../web/AccountsMgmtC.class.php:116 msgid "Gestión de Categorías" msgstr "Categories Management" -#: ../../../../web/AccountsMgmtC.class.php:172 +#: ../../../../web/AccountsMgmtC.class.php:173 msgid "Gestión de Clientes" msgstr "Customers Management" -#: ../../../../web/AccountsMgmtC.class.php:266 +#: ../../../../web/AccountsMgmtC.class.php:267 #: ../../../../inc/themes/classic/customfields.inc:27 #: ../../../../inc/themes/material-blue/customfields.inc:30 msgid "Módulo" msgstr "Module" -#: ../../../../web/AccountsMgmtC.class.php:287 +#: ../../../../web/AccountsMgmtC.class.php:288 msgid "Eliminar Campo" msgstr "Delete Field" -#: ../../../../web/ConfigC.class.php:166 +#: ../../../../web/ConfigC.class.php:168 msgid "Último backup" msgstr "Last backup" -#: ../../../../web/ConfigC.class.php:166 +#: ../../../../web/ConfigC.class.php:168 msgid "No se encontraron backups" msgstr "There are no backups available" -#: ../../../../web/ConfigC.class.php:173 +#: ../../../../web/ConfigC.class.php:175 msgid "Última exportación" msgstr "Last export" -#: ../../../../web/ConfigC.class.php:173 +#: ../../../../web/ConfigC.class.php:175 msgid "No se encontró archivo de exportación" msgstr "No export file found" -#: ../../../../web/ConfigC.class.php:218 +#: ../../../../web/ConfigC.class.php:220 msgid "Información" msgstr "Information" -#: ../../../../web/EventlogC.class.php:93 +#: ../../../../web/EventlogC.class.php:95 msgid "Registro de eventos vaciado" msgstr "Event log cleared" -#: ../../../../web/EventlogC.class.php:95 +#: ../../../../web/EventlogC.class.php:97 msgid "Error al vaciar el registro de eventos" msgstr "Error on clearing event log" #: ../../../../web/MainC.class.php:159 -#: ../../../../web/UsersMgmtC.class.php:100 +#: ../../../../web/UsersMgmtC.class.php:101 msgid "Admin Aplicación" msgstr "Application Admin" @@ -2718,17 +2769,16 @@ msgid "Buscar" msgstr "Search" #: ../../../../web/MainC.class.php:189 -#: ../../../../web/UsersMgmtC.class.php:163 -msgid "Gestión de Usuarios" -msgstr "Users Management" +msgid "Usuarios y Accesos" +msgstr "Users and Accesses" #: ../../../../web/MainC.class.php:195 -msgid "Gestión de Clientes y Categorías" -msgstr "Customer and Categories management" +msgid "Elementos y Personalización" +msgstr "Items and Customizations" #: ../../../../web/MainC.class.php:207 -#: ../../../../inc/themes/classic/eventlog.inc:4 -#: ../../../../inc/themes/material-blue/eventlog.inc:3 +#: ../../../../inc/themes/classic/eventlog.inc:2 +#: ../../../../inc/themes/material-blue/eventlog.inc:2 msgid "Registro de Eventos" msgstr "Event Log" @@ -2825,27 +2875,27 @@ msgstr "Download new version" msgid "Avisos de sysPass" msgstr "sysPass Notices" -#: ../../../../web/SearchC.class.php:285 +#: ../../../../web/SearchC.class.php:287 msgid "Ordenar por Cliente" msgstr "Sort by Customer" -#: ../../../../web/SearchC.class.php:291 +#: ../../../../web/SearchC.class.php:293 msgid "Ordenar por Nombre" msgstr "Sort by Name" -#: ../../../../web/SearchC.class.php:297 +#: ../../../../web/SearchC.class.php:299 msgid "Ordenar por Categoría" msgstr "Sort by Category" -#: ../../../../web/SearchC.class.php:303 +#: ../../../../web/SearchC.class.php:305 msgid "Ordenar por Usuario" msgstr "Sort by Username" -#: ../../../../web/SearchC.class.php:309 +#: ../../../../web/SearchC.class.php:311 msgid "Ordenar por URL / IP" msgstr "Sort by URL / IP" -#: ../../../../web/SearchC.class.php:310 +#: ../../../../web/SearchC.class.php:312 #: ../../../../inc/themes/classic/account.inc:61 #: ../../../../inc/themes/classic/editpass.inc:16 #: ../../../../inc/themes/classic/request.inc:13 @@ -2857,70 +2907,74 @@ msgstr "Sort by URL / IP" msgid "URL / IP" msgstr "URL / IP" -#: ../../../../web/UsersMgmtC.class.php:91 +#: ../../../../web/UsersMgmtC.class.php:92 msgid "Propiedades" msgstr "Properties" -#: ../../../../web/UsersMgmtC.class.php:104 +#: ../../../../web/UsersMgmtC.class.php:105 msgid "Admin Cuentas" msgstr "Account Admin" -#: ../../../../web/UsersMgmtC.class.php:108 +#: ../../../../web/UsersMgmtC.class.php:109 #: ../../../../inc/themes/classic/users.inc:28 #: ../../../../inc/themes/material-blue/users.inc:34 msgid "Usuario de LDAP" msgstr "LDAP User" -#: ../../../../web/UsersMgmtC.class.php:112 +#: ../../../../web/UsersMgmtC.class.php:113 #: ../../../../inc/themes/classic/users.inc:113 #: ../../../../inc/themes/material-blue/users.inc:151 #: ../../../../inc/themes/material-blue/users.inc:154 msgid "Deshabilitado" msgstr "Disabled" -#: ../../../../web/UsersMgmtC.class.php:129 +#: ../../../../web/UsersMgmtC.class.php:130 msgid "Ver Detalles de Usuario" msgstr "View User Details" -#: ../../../../web/UsersMgmtC.class.php:143 +#: ../../../../web/UsersMgmtC.class.php:144 msgid "Cambiar Clave de Usuario" msgstr "Change User's Password" -#: ../../../../web/UsersMgmtC.class.php:222 +#: ../../../../web/UsersMgmtC.class.php:164 +msgid "Gestión de Usuarios" +msgstr "Users Management" + +#: ../../../../web/UsersMgmtC.class.php:223 msgid "Gestión de Grupos" msgstr "Groups Management" -#: ../../../../web/UsersMgmtC.class.php:260 +#: ../../../../web/UsersMgmtC.class.php:261 msgid "Ver Detalles de Perfil" msgstr "View Profile Details" -#: ../../../../web/UsersMgmtC.class.php:287 +#: ../../../../web/UsersMgmtC.class.php:288 msgid "Gestión de Perfiles" msgstr "Profiles Management" -#: ../../../../web/UsersMgmtC.class.php:407 +#: ../../../../web/UsersMgmtC.class.php:408 msgid "Ver token de Autorización" msgstr "View Authorization token" -#: ../../../../web/UsersMgmtC.class.php:434 +#: ../../../../web/UsersMgmtC.class.php:435 msgid "Gestión de Autorizaciones API" msgstr "API Authorizations Management" -#: ../../../../web/UsersMgmtC.class.php:456 +#: ../../../../web/UsersMgmtC.class.php:457 msgid "Token de autorización visualizado" msgstr "Authorization token viewed" -#: ../../../../web/UsersMgmtC.class.php:457 +#: ../../../../web/UsersMgmtC.class.php:458 msgid "Autorizaciones" msgstr "Authorizations" -#: ../../../../web/UsersPrefsC.class.php:92 +#: ../../../../web/UsersPrefsC.class.php:93 #: ../../../../inc/themes/classic/mail.inc:63 #: ../../../../inc/themes/material-blue/mail.inc:86 msgid "Seguridad" msgstr "Security" -#: ../../../../web/UsersPrefsC.class.php:115 +#: ../../../../web/UsersPrefsC.class.php:116 #: ../../../../inc/themes/classic/sessionbar.inc:9 msgid "Preferencias" msgstr "Preferences" @@ -3118,7 +3172,7 @@ msgstr "Request Modification" #: ../../../../inc/themes/classic/customers.inc:62 #: ../../../../inc/themes/classic/customfields.inc:63 #: ../../../../inc/themes/classic/editpass.inc:50 -#: ../../../../inc/themes/classic/encryption.inc:102 +#: ../../../../inc/themes/classic/encryption.inc:99 #: ../../../../inc/themes/classic/groups.inc:77 #: ../../../../inc/themes/classic/ldap.inc:229 #: ../../../../inc/themes/classic/mail.inc:107 @@ -3138,7 +3192,7 @@ msgstr "Request Modification" #: ../../../../inc/themes/material-blue/groups.inc:88 #: ../../../../inc/themes/material-blue/ldap.inc:257 #: ../../../../inc/themes/material-blue/mail.inc:145 -#: ../../../../inc/themes/material-blue/preferences.inc:101 +#: ../../../../inc/themes/material-blue/preferences.inc:100 #: ../../../../inc/themes/material-blue/profiles.inc:177 #: ../../../../inc/themes/material-blue/security.inc:61 #: ../../../../inc/themes/material-blue/tokens.inc:63 @@ -3181,17 +3235,17 @@ msgstr "There are no backups for download" #: ../../../../inc/themes/classic/backup.inc:49 #: ../../../../inc/themes/classic/backup.inc:113 #: ../../../../inc/themes/classic/backup.inc:117 -#: ../../../../inc/themes/classic/encryption.inc:93 -#: ../../../../inc/themes/classic/encryption.inc:97 -#: ../../../../inc/themes/classic/encryption.inc:162 -#: ../../../../inc/themes/classic/encryption.inc:166 -#: ../../../../inc/themes/classic/import.inc:15 -#: ../../../../inc/themes/classic/import.inc:37 -#: ../../../../inc/themes/classic/import.inc:51 -#: ../../../../inc/themes/classic/import.inc:97 -#: ../../../../inc/themes/classic/import.inc:118 -#: ../../../../inc/themes/classic/import.inc:170 -#: ../../../../inc/themes/classic/import.inc:174 +#: ../../../../inc/themes/classic/encryption.inc:90 +#: ../../../../inc/themes/classic/encryption.inc:94 +#: ../../../../inc/themes/classic/encryption.inc:159 +#: ../../../../inc/themes/classic/encryption.inc:163 +#: ../../../../inc/themes/classic/import.inc:12 +#: ../../../../inc/themes/classic/import.inc:34 +#: ../../../../inc/themes/classic/import.inc:48 +#: ../../../../inc/themes/classic/import.inc:94 +#: ../../../../inc/themes/classic/import.inc:115 +#: ../../../../inc/themes/classic/import.inc:167 +#: ../../../../inc/themes/classic/import.inc:171 #: ../../../../inc/themes/classic/js-common.inc:13 #: ../../../../inc/themes/classic/ldap.inc:13 #: ../../../../inc/themes/classic/ldap.inc:33 @@ -3210,12 +3264,12 @@ msgstr "There are no backups for download" #: ../../../../inc/themes/material-blue/backup.inc:51 #: ../../../../inc/themes/material-blue/backup.inc:129 #: ../../../../inc/themes/material-blue/backup.inc:133 -#: ../../../../inc/themes/material-blue/encryption.inc:107 -#: ../../../../inc/themes/material-blue/encryption.inc:111 -#: ../../../../inc/themes/material-blue/encryption.inc:181 -#: ../../../../inc/themes/material-blue/encryption.inc:185 -#: ../../../../inc/themes/material-blue/import.inc:99 -#: ../../../../inc/themes/material-blue/import.inc:103 +#: ../../../../inc/themes/material-blue/encryption.inc:104 +#: ../../../../inc/themes/material-blue/encryption.inc:108 +#: ../../../../inc/themes/material-blue/encryption.inc:178 +#: ../../../../inc/themes/material-blue/encryption.inc:182 +#: ../../../../inc/themes/material-blue/import.inc:96 +#: ../../../../inc/themes/material-blue/import.inc:100 #: ../../../../inc/themes/material-blue/js-common.inc:11 msgid "Ayuda" msgstr "Help" @@ -3566,13 +3620,13 @@ msgstr "Help Text" msgid "Obligatorio" msgstr "Required" -#: ../../../../inc/themes/classic/encryption.inc:8 +#: ../../../../inc/themes/classic/encryption.inc:5 #: ../../../../inc/themes/classic/install.inc:46 #: ../../../../inc/themes/classic/install.inc:50 #: ../../../../inc/themes/classic/install.inc:51 #: ../../../../inc/themes/classic/login.inc:15 #: ../../../../inc/themes/classic/login.inc:27 -#: ../../../../inc/themes/material-blue/encryption.inc:8 +#: ../../../../inc/themes/material-blue/encryption.inc:5 #: ../../../../inc/themes/material-blue/install.inc:51 #: ../../../../inc/themes/material-blue/install.inc:58 #: ../../../../inc/themes/material-blue/login.inc:26 @@ -3580,71 +3634,71 @@ msgstr "Required" msgid "Clave Maestra" msgstr "Master Password" -#: ../../../../inc/themes/classic/encryption.inc:16 -#: ../../../../inc/themes/classic/encryption.inc:116 -#: ../../../../inc/themes/material-blue/encryption.inc:16 -#: ../../../../inc/themes/material-blue/encryption.inc:131 +#: ../../../../inc/themes/classic/encryption.inc:13 +#: ../../../../inc/themes/classic/encryption.inc:113 +#: ../../../../inc/themes/material-blue/encryption.inc:13 +#: ../../../../inc/themes/material-blue/encryption.inc:128 msgid "Último cambio" msgstr "Last Change" -#: ../../../../inc/themes/classic/encryption.inc:25 -#: ../../../../inc/themes/material-blue/encryption.inc:25 -#: ../../../../inc/themes/material-blue/encryption.inc:31 +#: ../../../../inc/themes/classic/encryption.inc:22 +#: ../../../../inc/themes/material-blue/encryption.inc:22 +#: ../../../../inc/themes/material-blue/encryption.inc:28 msgid "Clave Maestra actual" msgstr "Current Master Password" -#: ../../../../inc/themes/classic/encryption.inc:34 -#: ../../../../inc/themes/material-blue/encryption.inc:37 -#: ../../../../inc/themes/material-blue/encryption.inc:43 +#: ../../../../inc/themes/classic/encryption.inc:31 +#: ../../../../inc/themes/material-blue/encryption.inc:34 +#: ../../../../inc/themes/material-blue/encryption.inc:40 msgid "Nueva Clave Maestra" msgstr "New Master Password" -#: ../../../../inc/themes/classic/encryption.inc:43 -#: ../../../../inc/themes/material-blue/encryption.inc:49 -#: ../../../../inc/themes/material-blue/encryption.inc:55 +#: ../../../../inc/themes/classic/encryption.inc:40 +#: ../../../../inc/themes/material-blue/encryption.inc:46 +#: ../../../../inc/themes/material-blue/encryption.inc:52 msgid "Nueva Clave Maestra (repetir)" msgstr "New Master Password (repeat)" -#: ../../../../inc/themes/classic/encryption.inc:51 -#: ../../../../inc/themes/material-blue/encryption.inc:61 +#: ../../../../inc/themes/classic/encryption.inc:48 +#: ../../../../inc/themes/material-blue/encryption.inc:58 msgid "No modificar cuentas" msgstr "Do not modify accounts" -#: ../../../../inc/themes/classic/encryption.inc:56 -#: ../../../../inc/themes/material-blue/encryption.inc:66 +#: ../../../../inc/themes/classic/encryption.inc:53 +#: ../../../../inc/themes/material-blue/encryption.inc:63 msgid "Establece una nueva clave maestra sin re-encriptar las cuentas" msgstr "Sets a new master password without re-encrypting the accounts." -#: ../../../../inc/themes/classic/encryption.inc:67 -#: ../../../../inc/themes/material-blue/encryption.inc:79 +#: ../../../../inc/themes/classic/encryption.inc:64 +#: ../../../../inc/themes/material-blue/encryption.inc:76 msgid "Confirmar cambio" msgstr "Confirm Change" +#: ../../../../inc/themes/classic/encryption.inc:67 #: ../../../../inc/themes/classic/encryption.inc:70 #: ../../../../inc/themes/classic/encryption.inc:73 -#: ../../../../inc/themes/classic/encryption.inc:76 -#: ../../../../inc/themes/classic/import.inc:67 +#: ../../../../inc/themes/classic/import.inc:64 #: ../../../../inc/themes/classic/security.inc:43 msgid "Atención" msgstr "Warning" -#: ../../../../inc/themes/classic/encryption.inc:71 -#: ../../../../inc/themes/material-blue/encryption.inc:83 +#: ../../../../inc/themes/classic/encryption.inc:68 +#: ../../../../inc/themes/material-blue/encryption.inc:80 msgid "Guarde la nueva clave en un lugar seguro." msgstr "You should save the new password on a secure place" -#: ../../../../inc/themes/classic/encryption.inc:74 -#: ../../../../inc/themes/material-blue/encryption.inc:86 +#: ../../../../inc/themes/classic/encryption.inc:71 +#: ../../../../inc/themes/material-blue/encryption.inc:83 msgid "Se volverán a encriptar las claves de todas las cuentas." msgstr "All accounts passwords will be encrypted again." -#: ../../../../inc/themes/classic/encryption.inc:77 -#: ../../../../inc/themes/material-blue/encryption.inc:89 +#: ../../../../inc/themes/classic/encryption.inc:74 +#: ../../../../inc/themes/material-blue/encryption.inc:86 msgid "Los usuarios deberán de introducir la nueva clave maestra." msgstr "Users will need to enter the new master key." -#: ../../../../inc/themes/classic/encryption.inc:98 -#: ../../../../inc/themes/material-blue/encryption.inc:112 +#: ../../../../inc/themes/classic/encryption.inc:95 +#: ../../../../inc/themes/material-blue/encryption.inc:109 msgid "" "La clave maestra es utilizada para encriptar las claves de las cuentas de " "sysPass para mantenerlas seguras." @@ -3652,8 +3706,8 @@ msgstr "" "The master password is used to encryt sysPass accounts passwords and keep " "them safe." -#: ../../../../inc/themes/classic/encryption.inc:100 -#: ../../../../inc/themes/material-blue/encryption.inc:114 +#: ../../../../inc/themes/classic/encryption.inc:97 +#: ../../../../inc/themes/material-blue/encryption.inc:111 msgid "" "Es recomendable cambiarla cada cierto tiempo y utilizar una clave compleja " "que incluya números, letras y símbolos." @@ -3661,35 +3715,35 @@ msgstr "" "It's advisable to change it from time to time and use a complex password " "that includes numbers, letters and symbols." -#: ../../../../inc/themes/classic/encryption.inc:108 -#: ../../../../inc/themes/material-blue/encryption.inc:124 +#: ../../../../inc/themes/classic/encryption.inc:105 +#: ../../../../inc/themes/material-blue/encryption.inc:121 msgid "Clave Temporal" msgstr "Temporary Password" -#: ../../../../inc/themes/classic/encryption.inc:119 -#: ../../../../inc/themes/classic/encryption.inc:130 -#: ../../../../inc/themes/material-blue/encryption.inc:134 -#: ../../../../inc/themes/material-blue/encryption.inc:145 +#: ../../../../inc/themes/classic/encryption.inc:116 +#: ../../../../inc/themes/classic/encryption.inc:127 +#: ../../../../inc/themes/material-blue/encryption.inc:131 +#: ../../../../inc/themes/material-blue/encryption.inc:142 msgid "No generada" msgstr "Not generated" -#: ../../../../inc/themes/classic/encryption.inc:124 -#: ../../../../inc/themes/material-blue/encryption.inc:139 +#: ../../../../inc/themes/classic/encryption.inc:121 +#: ../../../../inc/themes/material-blue/encryption.inc:136 msgid "Válido hasta" msgstr "Valid until" -#: ../../../../inc/themes/classic/encryption.inc:136 -#: ../../../../inc/themes/material-blue/encryption.inc:151 -#: ../../../../inc/themes/material-blue/encryption.inc:157 +#: ../../../../inc/themes/classic/encryption.inc:133 +#: ../../../../inc/themes/material-blue/encryption.inc:148 +#: ../../../../inc/themes/material-blue/encryption.inc:154 msgid "Validez (s)" msgstr "Life (s)" -#: ../../../../inc/themes/classic/encryption.inc:139 +#: ../../../../inc/themes/classic/encryption.inc:136 msgid "Validez" msgstr "Life" -#: ../../../../inc/themes/classic/encryption.inc:167 -#: ../../../../inc/themes/material-blue/encryption.inc:186 +#: ../../../../inc/themes/classic/encryption.inc:164 +#: ../../../../inc/themes/material-blue/encryption.inc:183 msgid "" "La clave temporal es utilizada como clave maestra para los usuarios que " "necesitan introducirla al iniciar la sesión, así no es necesario facilitar " @@ -3698,57 +3752,57 @@ msgstr "" "The temporary password is used as a master password for the users that need " "to enter when login, so there is no need to tell the real master password." -#: ../../../../inc/themes/classic/encryption.inc:169 -#: ../../../../inc/themes/material-blue/encryption.inc:190 +#: ../../../../inc/themes/classic/encryption.inc:166 +#: ../../../../inc/themes/material-blue/encryption.inc:187 msgid "Generar" msgstr "Generate" -#: ../../../../inc/themes/classic/eventlog.inc:8 +#: ../../../../inc/themes/classic/eventlog.inc:6 #: ../../../../inc/themes/classic/search.inc:3 -#: ../../../../inc/themes/material-blue/eventlog.inc:7 +#: ../../../../inc/themes/material-blue/eventlog.inc:6 #: ../../../../inc/themes/material-blue/search.inc:3 msgid "No se encontraron registros" msgstr "No records found" -#: ../../../../inc/themes/classic/eventlog.inc:19 -#: ../../../../inc/themes/material-blue/eventlog.inc:18 +#: ../../../../inc/themes/classic/eventlog.inc:17 +#: ../../../../inc/themes/material-blue/eventlog.inc:17 msgid "Fecha / Hora" msgstr "Date / Time" -#: ../../../../inc/themes/classic/eventlog.inc:22 -#: ../../../../inc/themes/material-blue/eventlog.inc:21 +#: ../../../../inc/themes/classic/eventlog.inc:20 +#: ../../../../inc/themes/material-blue/eventlog.inc:20 msgid "Evento" msgstr "Event" -#: ../../../../inc/themes/classic/eventlog.inc:28 -#: ../../../../inc/themes/material-blue/eventlog.inc:27 +#: ../../../../inc/themes/classic/eventlog.inc:26 +#: ../../../../inc/themes/material-blue/eventlog.inc:26 msgid "IP" msgstr "IP" -#: ../../../../inc/themes/classic/eventlog.inc:86 +#: ../../../../inc/themes/classic/eventlog.inc:84 #: ../../../../inc/themes/classic/search.inc:169 -#: ../../../../inc/themes/material-blue/eventlog.inc:85 +#: ../../../../inc/themes/material-blue/eventlog.inc:84 #: ../../../../inc/themes/material-blue/search.inc:171 msgid "Primera página" msgstr "First page" -#: ../../../../inc/themes/classic/eventlog.inc:88 +#: ../../../../inc/themes/classic/eventlog.inc:86 #: ../../../../inc/themes/classic/search.inc:171 -#: ../../../../inc/themes/material-blue/eventlog.inc:87 +#: ../../../../inc/themes/material-blue/eventlog.inc:86 #: ../../../../inc/themes/material-blue/search.inc:173 msgid "Página anterior" msgstr "Previous page" -#: ../../../../inc/themes/classic/eventlog.inc:93 +#: ../../../../inc/themes/classic/eventlog.inc:91 #: ../../../../inc/themes/classic/search.inc:176 -#: ../../../../inc/themes/material-blue/eventlog.inc:92 +#: ../../../../inc/themes/material-blue/eventlog.inc:91 #: ../../../../inc/themes/material-blue/search.inc:178 msgid "Página siguiente" msgstr "Next page" -#: ../../../../inc/themes/classic/eventlog.inc:95 +#: ../../../../inc/themes/classic/eventlog.inc:93 #: ../../../../inc/themes/classic/search.inc:178 -#: ../../../../inc/themes/material-blue/eventlog.inc:94 +#: ../../../../inc/themes/material-blue/eventlog.inc:93 #: ../../../../inc/themes/material-blue/search.inc:180 msgid "Última página" msgstr "Last page" @@ -3799,117 +3853,117 @@ msgstr "Group name" msgid "Descripción del grupo" msgstr "Group description" -#: ../../../../inc/themes/classic/import.inc:7 -#: ../../../../inc/themes/material-blue/import.inc:121 +#: ../../../../inc/themes/classic/import.inc:4 +#: ../../../../inc/themes/material-blue/import.inc:118 msgid "Importar phpPMS" msgstr "phpPMS Import" -#: ../../../../inc/themes/classic/import.inc:14 +#: ../../../../inc/themes/classic/import.inc:11 #: ../../../../inc/themes/classic/install.inc:63 #: ../../../../inc/themes/classic/install.inc:64 -#: ../../../../inc/themes/material-blue/import.inc:128 -#: ../../../../inc/themes/material-blue/import.inc:140 +#: ../../../../inc/themes/material-blue/import.inc:125 +#: ../../../../inc/themes/material-blue/import.inc:137 msgid "Usuario BBDD" msgstr "DB Username" -#: ../../../../inc/themes/classic/import.inc:18 -#: ../../../../inc/themes/material-blue/import.inc:132 +#: ../../../../inc/themes/classic/import.inc:15 +#: ../../../../inc/themes/material-blue/import.inc:129 msgid "Indicar el usuario de conexión a la base de datos de phpPMS." msgstr "Provide the phpPMS database connection user." -#: ../../../../inc/themes/classic/import.inc:28 +#: ../../../../inc/themes/classic/import.inc:25 #: ../../../../inc/themes/classic/install.inc:71 #: ../../../../inc/themes/classic/install.inc:73 -#: ../../../../inc/themes/material-blue/import.inc:146 -#: ../../../../inc/themes/material-blue/import.inc:152 +#: ../../../../inc/themes/material-blue/import.inc:143 +#: ../../../../inc/themes/material-blue/import.inc:149 msgid "Clave BBDD" msgstr "DB Password" -#: ../../../../inc/themes/classic/import.inc:36 +#: ../../../../inc/themes/classic/import.inc:33 #: ../../../../inc/themes/classic/install.inc:78 #: ../../../../inc/themes/classic/install.inc:79 -#: ../../../../inc/themes/material-blue/import.inc:158 -#: ../../../../inc/themes/material-blue/import.inc:170 +#: ../../../../inc/themes/material-blue/import.inc:155 +#: ../../../../inc/themes/material-blue/import.inc:167 msgid "Nombre BBDD" msgstr "DB Name" -#: ../../../../inc/themes/classic/import.inc:40 -#: ../../../../inc/themes/material-blue/import.inc:162 +#: ../../../../inc/themes/classic/import.inc:37 +#: ../../../../inc/themes/material-blue/import.inc:159 msgid "Indicar el nombre de la base de datos de phpPMS." msgstr "Provide the phpPMS database name." -#: ../../../../inc/themes/classic/import.inc:50 +#: ../../../../inc/themes/classic/import.inc:47 #: ../../../../inc/themes/classic/install.inc:87 #: ../../../../inc/themes/classic/install.inc:88 -#: ../../../../inc/themes/material-blue/import.inc:176 -#: ../../../../inc/themes/material-blue/import.inc:188 +#: ../../../../inc/themes/material-blue/import.inc:173 +#: ../../../../inc/themes/material-blue/import.inc:185 msgid "Servidor BBDD" msgstr "DB Server" -#: ../../../../inc/themes/classic/import.inc:54 -#: ../../../../inc/themes/material-blue/import.inc:180 +#: ../../../../inc/themes/classic/import.inc:51 +#: ../../../../inc/themes/material-blue/import.inc:177 msgid "Indicar el servidor de la base de datos de phpPMS." msgstr "Provide the phpPMS database server." -#: ../../../../inc/themes/classic/import.inc:64 -#: ../../../../inc/themes/material-blue/import.inc:194 +#: ../../../../inc/themes/classic/import.inc:61 +#: ../../../../inc/themes/material-blue/import.inc:191 msgid "Confirmar" msgstr "Confirm" -#: ../../../../inc/themes/classic/import.inc:68 -#: ../../../../inc/themes/material-blue/import.inc:198 +#: ../../../../inc/themes/classic/import.inc:65 +#: ../../../../inc/themes/material-blue/import.inc:195 msgid "Los datos actuales serán borrados (excepto el usuario actual)" msgstr "Current data will be removed (except current user)" -#: ../../../../inc/themes/classic/import.inc:83 +#: ../../../../inc/themes/classic/import.inc:80 msgid "Iniciar" msgstr "Start" -#: ../../../../inc/themes/classic/import.inc:89 -#: ../../../../inc/themes/material-blue/import.inc:7 +#: ../../../../inc/themes/classic/import.inc:86 +#: ../../../../inc/themes/material-blue/import.inc:4 msgid "Importar CSV/XML" msgstr "CSV/XML Import" -#: ../../../../inc/themes/classic/import.inc:96 -#: ../../../../inc/themes/material-blue/import.inc:14 +#: ../../../../inc/themes/classic/import.inc:93 +#: ../../../../inc/themes/material-blue/import.inc:11 msgid "Usuario por Defecto" msgstr "Default User" -#: ../../../../inc/themes/classic/import.inc:100 -#: ../../../../inc/themes/material-blue/import.inc:18 +#: ../../../../inc/themes/classic/import.inc:97 +#: ../../../../inc/themes/material-blue/import.inc:15 msgid "Define el usuario por defecto para las cuentas importadas." msgstr "Defines the default user for the accounts imported." -#: ../../../../inc/themes/classic/import.inc:117 +#: ../../../../inc/themes/classic/import.inc:114 #: ../../../../inc/themes/classic/ldap.inc:144 -#: ../../../../inc/themes/material-blue/import.inc:36 +#: ../../../../inc/themes/material-blue/import.inc:33 #: ../../../../inc/themes/material-blue/ldap.inc:170 msgid "Grupo por Defecto" msgstr "Default Group" -#: ../../../../inc/themes/classic/import.inc:121 -#: ../../../../inc/themes/material-blue/import.inc:40 +#: ../../../../inc/themes/classic/import.inc:118 +#: ../../../../inc/themes/material-blue/import.inc:37 msgid "Define el grupo por defecto para las cuentas importadas." msgstr "Defines the default group for the accounts imported." -#: ../../../../inc/themes/classic/import.inc:138 -#: ../../../../inc/themes/material-blue/import.inc:58 -#: ../../../../inc/themes/material-blue/import.inc:64 +#: ../../../../inc/themes/classic/import.inc:135 +#: ../../../../inc/themes/material-blue/import.inc:55 +#: ../../../../inc/themes/material-blue/import.inc:61 msgid "Clave de Importación" msgstr "Import Password" -#: ../../../../inc/themes/classic/import.inc:146 -#: ../../../../inc/themes/material-blue/import.inc:70 -#: ../../../../inc/themes/material-blue/import.inc:76 +#: ../../../../inc/themes/classic/import.inc:143 +#: ../../../../inc/themes/material-blue/import.inc:67 +#: ../../../../inc/themes/material-blue/import.inc:73 msgid "Delimitador CSV" msgstr "CVS delimiter" -#: ../../../../inc/themes/classic/import.inc:162 -#: ../../../../inc/themes/material-blue/import.inc:90 +#: ../../../../inc/themes/classic/import.inc:159 +#: ../../../../inc/themes/material-blue/import.inc:87 msgid "Soltar archivo aquí o click para seleccionar" msgstr "Drop files here or click to select" -#: ../../../../inc/themes/classic/import.inc:175 +#: ../../../../inc/themes/classic/import.inc:172 msgid "" "Permite realizar la importación de Cuentas, Categorías y Clientes desde " "arhcivos XML y CSV." @@ -3917,21 +3971,21 @@ msgstr "" "Allows to make the Accounts, Categories and Customers import from XML or CSV " "files." -#: ../../../../inc/themes/classic/import.inc:177 -#: ../../../../inc/themes/material-blue/import.inc:106 +#: ../../../../inc/themes/classic/import.inc:174 +#: ../../../../inc/themes/material-blue/import.inc:103 msgid "" "Los formatos de archivos XML soportados son: sysPass, KeePass y KeePassX" msgstr "The supported XML file formats are: sysPass, KeePass and KeePassX" -#: ../../../../inc/themes/classic/import.inc:179 -#: ../../../../inc/themes/material-blue/import.inc:108 +#: ../../../../inc/themes/classic/import.inc:176 +#: ../../../../inc/themes/material-blue/import.inc:105 msgid "" "Arrastar el archivo a importar a la zona indicada o hacer click sobre la " "flecha." msgstr "Drag&Drop the file to the import zone or click over the arrow." -#: ../../../../inc/themes/classic/import.inc:181 -#: ../../../../inc/themes/material-blue/import.inc:110 +#: ../../../../inc/themes/classic/import.inc:178 +#: ../../../../inc/themes/material-blue/import.inc:107 msgid "" "Para archivos de KeePass o KeePassX, el nombre del cliente será igual a " "KeePass o KeePassX y la categoría igual al nombre de los grupos." @@ -3939,18 +3993,18 @@ msgstr "" "For KeePass or KeePassX files, the customer name will be KeePass or KeePassX " "and the category name like groups names." -#: ../../../../inc/themes/classic/import.inc:183 -#: ../../../../inc/themes/material-blue/import.inc:112 +#: ../../../../inc/themes/classic/import.inc:180 +#: ../../../../inc/themes/material-blue/import.inc:109 msgid "La importación de archivos CSV se realiza con el siguiente formato:" msgstr "The CSV file import is done with the following format:" -#: ../../../../inc/themes/classic/import.inc:185 -#: ../../../../inc/themes/material-blue/import.inc:114 +#: ../../../../inc/themes/classic/import.inc:182 +#: ../../../../inc/themes/material-blue/import.inc:111 msgid "nombre_de_cuenta;cliente;categoría;url;usuario;clave;notas" msgstr "account_name;customer;category;url;user;password;notes" -#: ../../../../inc/themes/classic/import.inc:187 -#: ../../../../inc/themes/material-blue/import.inc:116 +#: ../../../../inc/themes/classic/import.inc:184 +#: ../../../../inc/themes/material-blue/import.inc:113 msgid "" "En todos los casos, si el cliente o la categoría no están creados, se crean " "automáticamente." @@ -4561,7 +4615,6 @@ msgid "" msgstr "Scan the provided QR code and then enter the 6 digits code." #: ../../../../inc/themes/classic/security.inc:29 -#: ../../../../inc/themes/material-blue/preferences.inc:86 #: ../../../../inc/themes/material-blue/security.inc:27 msgid "Activar" msgstr "Activate" @@ -4786,8 +4839,8 @@ msgstr "Password (Repeat)" #: ../../../../inc/themes/material-blue/backup.inc:58 #: ../../../../inc/themes/material-blue/backup.inc:144 -#: ../../../../inc/themes/material-blue/encryption.inc:118 -#: ../../../../inc/themes/material-blue/import.inc:217 +#: ../../../../inc/themes/material-blue/encryption.inc:115 +#: ../../../../inc/themes/material-blue/import.inc:214 msgid "Realizar" msgstr "Perform" @@ -4844,7 +4897,7 @@ msgstr "Field help" msgid "Preferencias de usuario" msgstr "User preferences" -#: ../../../../inc/themes/material-blue/import.inc:104 +#: ../../../../inc/themes/material-blue/import.inc:101 msgid "" "Permite realizar la importación de Cuentas, Categorías y Clientes desde " "archivos XML y CSV." @@ -4924,6 +4977,9 @@ msgstr "Make a backup and export" msgid "Autentificación" msgstr "Authentication" +#~ msgid "Gestión de Clientes y Categorías" +#~ msgstr "Customer and Categories management" + #~ msgid "Reset" #~ msgstr "Restablecer" diff --git a/inc/themes/classic/account.inc b/inc/themes/classic/account.inc index 06bc0de1..f9b45ad6 100644 --- a/inc/themes/classic/account.inc +++ b/inc/themes/classic/account.inc @@ -199,7 +199,7 @@
-
upload diff --git a/inc/themes/classic/debug.inc b/inc/themes/classic/debug.inc index 2c70cc44..72a90dfd 100644 --- a/inc/themes/classic/debug.inc +++ b/inc/themes/classic/debug.inc @@ -1,19 +1,16 @@

DEBUG INFO

    -
  • RENDER -> sec
  • +
  • RENDER -> sec
  • MEM -> Init: KB - End: KB - Total: KB
  • SESSION:
  • -
  • MASTER PASS:
  • +
  • MASTER PASS:
  • CONFIG FILE: -
    +
diff --git a/inc/themes/classic/encryption.inc b/inc/themes/classic/encryption.inc index d4a2a98e..698e764a 100644 --- a/inc/themes/classic/encryption.inc +++ b/inc/themes/classic/encryption.inc @@ -1,8 +1,5 @@ -
+
diff --git a/inc/themes/classic/eventlog.inc b/inc/themes/classic/eventlog.inc index 8eff067b..aff41b78 100644 --- a/inc/themes/classic/eventlog.inc +++ b/inc/themes/classic/eventlog.inc @@ -1,7 +1,5 @@
- +
diff --git a/inc/themes/classic/import.inc b/inc/themes/classic/import.inc index c9e241ba..b4607e54 100644 --- a/inc/themes/classic/import.inc +++ b/inc/themes/classic/import.inc @@ -1,8 +1,5 @@ -
+
diff --git a/inc/themes/material-blue/account.inc b/inc/themes/material-blue/account.inc index 59358faa..3044b2ee 100644 --- a/inc/themes/material-blue/account.inc +++ b/inc/themes/material-blue/account.inc @@ -241,7 +241,7 @@
-
cloud_upload diff --git a/inc/themes/material-blue/debug.inc b/inc/themes/material-blue/debug.inc index 2c70cc44..16e4b390 100644 --- a/inc/themes/material-blue/debug.inc +++ b/inc/themes/material-blue/debug.inc @@ -1,19 +1,16 @@

DEBUG INFO

    -
  • RENDER -> sec
  • +
  • RENDER -> sec
  • MEM -> Init: KB - End: KB - Total: KB
  • SESSION:
  • -
  • MASTER PASS:
  • +
  • MASTER PASS:
  • CONFIG FILE: -
    +
diff --git a/inc/themes/material-blue/encryption.inc b/inc/themes/material-blue/encryption.inc index 6bcfe4e4..c299429b 100644 --- a/inc/themes/material-blue/encryption.inc +++ b/inc/themes/material-blue/encryption.inc @@ -1,8 +1,5 @@ -
+
diff --git a/inc/themes/material-blue/eventlog.inc b/inc/themes/material-blue/eventlog.inc index ec9da35e..72e98f4c 100644 --- a/inc/themes/material-blue/eventlog.inc +++ b/inc/themes/material-blue/eventlog.inc @@ -1,6 +1,5 @@
- +
diff --git a/inc/themes/material-blue/import.inc b/inc/themes/material-blue/import.inc index e7e1595f..4689b554 100644 --- a/inc/themes/material-blue/import.inc +++ b/inc/themes/material-blue/import.inc @@ -1,8 +1,5 @@ -
+
@@ -223,7 +220,7 @@ echo $import_tabIndex; ?>">