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 37fc30bc..09858549 100644
Binary files a/inc/locales/en_US/LC_MESSAGES/messages.mo and b/inc/locales/en_US/LC_MESSAGES/messages.mo differ
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 @@
-

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; ?>">