diff --git a/inc/SP/Account/AccountCrypt.class.php b/inc/SP/Account/AccountCrypt.class.php index 343546d8..6010700e 100644 --- a/inc/SP/Account/AccountCrypt.class.php +++ b/inc/SP/Account/AccountCrypt.class.php @@ -32,6 +32,7 @@ use SP\Core\OldCrypt; use SP\Core\Exceptions\SPException; use SP\Core\Session; use SP\Core\Task; +use SP\Core\TaskFactory; use SP\DataModel\AccountData; use SP\Log\Email; use SP\Log\Log; @@ -51,7 +52,7 @@ class AccountCrypt * Actualiza las claves de todas las cuentas con la clave maestra actual * usando nueva encriptación. * - * @param $currentMasterPass + * @param string $currentMasterPass * @return bool */ public function updateOldPass(&$currentMasterPass) @@ -87,10 +88,9 @@ class AccountCrypt } $AccountDataBase = new AccountData(); - $Task = Session::getTask(); - $Message = new TaskMessage(); - $Message->setTask(__('Actualizar Clave Maestra')); + TaskFactory::$Message->setTask(__('Actualizar Clave Maestra')); + TaskFactory::sendTaskMessage(); $counter = 0; $startTime = time(); @@ -107,11 +107,10 @@ class AccountCrypt if ($counter % 100 === 0) { $eta = Util::getETA($startTime, $counter, $numAccounts); - $Message->setMessage(__('Cuentas actualizadas') . ': ' . $counter . '/' . $numAccounts); - $Message->setProgress(round(($counter * 100) / $numAccounts, 2)); - $Message->setTime(sprintf('ETA: %ds (%.2f/s)', $eta[0], $eta[1])); - - $Task->writeJsonStatusAndFlush($Message); + TaskFactory::$Message->setMessage(__('Cuentas actualizadas') . ': ' . $counter . '/' . $numAccounts); + TaskFactory::$Message->setProgress(round(($counter * 100) / $numAccounts, 2)); + TaskFactory::$Message->setTime(sprintf('ETA: %ds (%.2f/s)', $eta[0], $eta[1])); + TaskFactory::sendTaskMessage(); } $AccountData = clone $AccountDataBase; @@ -178,11 +177,12 @@ class AccountCrypt /** * Actualiza las claves de todas las cuentas con la nueva clave maestra. * - * @param $currentMasterPass - * @param $newMasterPass + * @param string $currentMasterPass + * @param string $newMasterPass + * @param Task $Task * @return bool */ - public function updatePass($currentMasterPass, $newMasterPass) + public function updatePass($currentMasterPass, $newMasterPass, Task $Task) { set_time_limit(0); @@ -208,11 +208,13 @@ class AccountCrypt } $AccountDataBase = new AccountData(); - $Task = new Task(__FUNCTION__); $Message = new TaskMessage(); + $Message->setTaskId($Task->getTaskId()); $Message->setTask(__('Actualizar Clave Maestra')); + $Task->writeJsonStatusAndFlush($Message); + $counter = 0; $startTime = time(); diff --git a/inc/SP/Account/AccountHistoryCrypt.class.php b/inc/SP/Account/AccountHistoryCrypt.class.php index 110ab700..3f771743 100644 --- a/inc/SP/Account/AccountHistoryCrypt.class.php +++ b/inc/SP/Account/AccountHistoryCrypt.class.php @@ -31,7 +31,8 @@ use SP\Core\Exceptions\QueryException; use SP\Core\Messages\TaskMessage; use SP\Core\OldCrypt; use SP\Core\Exceptions\SPException; -use SP\Core\Session; +use SP\Core\Task; +use SP\Core\TaskFactory; use SP\Log\Email; use SP\Log\Log; use SP\Storage\DB; @@ -55,7 +56,7 @@ class AccountHistoryCrypt * Actualiza las claves de todas las cuentas con la clave maestra actual * usando nueva encriptación. * - * @param $currentMasterPass + * @param string $currentMasterPass * @return bool */ public function updateOldPass(&$currentMasterPass) @@ -95,10 +96,8 @@ class AccountHistoryCrypt $AccountDataBase->key = ''; $AccountDataBase->hash = Hash::hashKey($currentMasterPass); - $Task = Session::getTask(); - - $Message = new TaskMessage(); - $Message->setTask(__('Actualizar Clave Maestra (H)')); + TaskFactory::$Message->setTask(__('Actualizar Clave Maestra (H)')); + TaskFactory::sendTaskMessage(); $counter = 0; $startTime = time(); @@ -115,11 +114,11 @@ class AccountHistoryCrypt if ($counter % 100 === 0) { $eta = Util::getETA($startTime, $counter, $numAccounts); - $Message->setMessage(__('Cuentas actualizadas') . ': ' . $counter . '/' . $numAccounts); - $Message->setProgress(round(($counter * 100) / $numAccounts, 2)); - $Message->setTime(sprintf('ETA: %ds (%.2f/s)', $eta[0], $eta[1])); + TaskFactory::$Message->setMessage(__('Cuentas actualizadas') . ': ' . $counter . '/' . $numAccounts); + TaskFactory::$Message->setProgress(round(($counter * 100) / $numAccounts, 2)); + TaskFactory::$Message->setTime(sprintf('ETA: %ds (%.2f/s)', $eta[0], $eta[1])); - $Task->writeJsonStatusAndFlush($Message); + TaskFactory::sendTaskMessage(); } $AccountData = clone $AccountDataBase; @@ -189,11 +188,12 @@ class AccountHistoryCrypt /** * Actualiza las claves de todas las cuentas con la nueva clave maestra. * - * @param $currentMasterPass - * @param $newMasterPass + * @param string $currentMasterPass + * @param string $newMasterPass + * @param Task $Task * @return bool */ - public function updatePass($currentMasterPass, $newMasterPass) + public function updatePass($currentMasterPass, $newMasterPass, Task $Task) { set_time_limit(0); @@ -223,11 +223,12 @@ class AccountHistoryCrypt $AccountDataBase->key = ''; $AccountDataBase->hash = Hash::hashKey($newMasterPass); - $Task = Session::getTask(); - $Message = new TaskMessage(); + $Message->setTaskId($Task->getTaskId()); $Message->setTask(__('Actualizar Clave Maestra (H)')); + $Task->writeJsonStatusAndFlush($Message); + $counter = 0; $startTime = time(); diff --git a/inc/SP/Account/AccountUtil.class.php b/inc/SP/Account/AccountUtil.class.php index 6592cab1..f6a13239 100644 --- a/inc/SP/Account/AccountUtil.class.php +++ b/inc/SP/Account/AccountUtil.class.php @@ -296,4 +296,20 @@ class AccountUtil return DB::getResultsArray($Data); } + + /** + * Devolver el número de cuentas a procesar + * + * @return int + */ + public static function getTotalNumAccounts() + { + $query = /** @lang SQL */ + 'SELECT SUM(n) AS num FROM (SELECT COUNT(*) AS n FROM accounts UNION SELECT COUNT(*) AS n FROM accHistory) a'; + + $Data = new QueryData(); + $Data->setQuery($query); + + return (int)DB::getResults($Data)->num; + } } \ No newline at end of file diff --git a/inc/SP/Controller/AccountController.class.php b/inc/SP/Controller/AccountController.class.php index 602e01b2..a6e5d83b 100644 --- a/inc/SP/Controller/AccountController.class.php +++ b/inc/SP/Controller/AccountController.class.php @@ -287,7 +287,7 @@ class AccountController extends ControllerBase implements ActionsInterface $publicLinkUrl = (Checks::publicLinksIsEnabled() && $PublicLinkData ? Init::$WEBURI . '/index.php?h=' . $PublicLinkData->getPublicLinkHash() . '&a=link' : null); $this->view->assign('publicLinkUrl', $publicLinkUrl); - $this->view->assign('publicLinkId', $PublicLinkData->getPublicLinkId()); + $this->view->assign('publicLinkId', $PublicLinkData ? $PublicLinkData->getPublicLinkId() : 0); $this->view->assign('accountPassDate', date('Y-m-d H:i:s', $this->AccountData->getAccountPassDate())); $this->view->assign('accountPassDateChange', date('Y-m-d', $this->AccountData->getAccountPassDateChange() ?: 0)); @@ -324,6 +324,14 @@ class AccountController extends ControllerBase implements ActionsInterface $this->view->assign('customFields', CustomField::getItem(new CustomFieldData(ActionsInterface::ACTION_ACC))->getById($this->getId())); } + /** + * @return int + */ + private function getId() + { + return $this->id; + } + /** * @return \SP\Account\Account|AccountHistory */ @@ -378,14 +386,6 @@ class AccountController extends ControllerBase implements ActionsInterface return true; } - /** - * @return int - */ - private function getId() - { - return $this->id; - } - /** * Obtener los datos para mostrar el interface para editar cuenta * diff --git a/inc/SP/Controller/ConfigActionController.class.php b/inc/SP/Controller/ConfigActionController.class.php index 0efaf4e8..94f8a32f 100644 --- a/inc/SP/Controller/ConfigActionController.class.php +++ b/inc/SP/Controller/ConfigActionController.class.php @@ -38,6 +38,7 @@ use SP\Core\Init; use SP\Core\Messages\LogMessage; use SP\Core\Messages\NoticeMessage; use SP\Core\Session; +use SP\Core\Task; use SP\Core\XmlExport; use SP\Http\Request; use SP\Import\Import; @@ -420,7 +421,6 @@ class ConfigActionController implements ItemControllerInterface */ protected function mailAction() { - $Log = Log::newLog(__('Modificar Configuración', false)); $Config = Session::getConfig(); // Mail @@ -519,20 +519,27 @@ class ConfigActionController implements ItemControllerInterface return; } + $Task = new Task(__FUNCTION__, Request::analyze('taskId')); + $Task->register(); + $Account = new AccountCrypt(); - if (!$Account->updatePass($currentMasterPass, $newMasterPass)) { + if (!$Account->updatePass($currentMasterPass, $newMasterPass, $Task)) { DB::rollbackTransaction(); + $Task->end(); + $this->JsonResponse->setDescription(__('Errores al actualizar las claves de las cuentas', false)); return; } $AccountHistory = new AccountHistoryCrypt(); - if (!$AccountHistory->updatePass($currentMasterPass, $newMasterPass)) { + if (!$AccountHistory->updatePass($currentMasterPass, $newMasterPass, $Task)) { DB::rollbackTransaction(); + $Task->end(); + $this->JsonResponse->setDescription(__('Errores al actualizar las claves de las cuentas del histórico', false)); return; } @@ -540,15 +547,21 @@ class ConfigActionController implements ItemControllerInterface if (!CustomFieldsUtil::updateCustomFieldsCrypt($currentMasterPass, $newMasterPass)) { DB::rollbackTransaction(); + $Task->end(); + $this->JsonResponse->setDescription(__('Errores al actualizar datos de campos personalizados', false)); return; } if (!DB::endTransaction()) { + $Task->end(); + $this->JsonResponse->setDescription(__('No es posible finalizar una transacción', false)); return; } + $Task->end(); + Util::unlockApp(); } diff --git a/inc/SP/Controller/ConfigController.class.php b/inc/SP/Controller/ConfigController.class.php index bdcca632..7cc474d8 100644 --- a/inc/SP/Controller/ConfigController.class.php +++ b/inc/SP/Controller/ConfigController.class.php @@ -26,6 +26,7 @@ namespace SP\Controller; defined('APP_ROOT') || die(); +use SP\Account\AccountUtil; use SP\Config\Config; use SP\Config\ConfigData; use SP\Config\ConfigDB; @@ -37,6 +38,7 @@ use SP\Core\Language; use SP\Core\Plugin\PluginUtil; use SP\Core\Session; use SP\Core\SessionUtil; +use SP\Core\Task; use SP\Core\Template; use SP\Mgmt\Groups\Group; use SP\Mgmt\Profiles\Profile; @@ -312,6 +314,9 @@ class ConfigController extends ControllerBase implements ActionsInterface $this->view->addTemplate('encryption'); + $this->view->assign('numAccounts', AccountUtil::getTotalNumAccounts()); + $this->view->assign('taskId', Task::genTaskId('masterpass')); + $this->view->assign('lastUpdateMPass', isset($this->configDB['lastupdatempass']) ? $this->configDB['lastupdatempass'] : 0); $this->view->assign('tempMasterPassTime', isset($this->configDB['tempmaster_passtime']) ? $this->configDB['tempmaster_passtime'] : 0); $this->view->assign('tempMasterMaxTime', isset($this->configDB['tempmaster_maxtime']) ? $this->configDB['tempmaster_maxtime'] : 0); diff --git a/inc/SP/Controller/MainActionController.class.php b/inc/SP/Controller/MainActionController.class.php index ce292953..c5a7db98 100644 --- a/inc/SP/Controller/MainActionController.class.php +++ b/inc/SP/Controller/MainActionController.class.php @@ -27,6 +27,7 @@ namespace SP\Controller; use SP\Config\Config; use SP\Core\Exceptions\ValidationException; use SP\Core\Session; +use SP\Core\TaskFactory; use SP\Core\Upgrade\Upgrade; use SP\Http\JsonResponse; use SP\Http\Request; @@ -51,6 +52,7 @@ class MainActionController { $version = Request::analyze('version', $version); $type = Request::analyze('type'); + $taskId = Request::analyze('taskId'); if (Request::analyze('a') === 'upgrade' && Request::analyze('upgrade', 0) === 1 @@ -65,12 +67,17 @@ class MainActionController throw new ValidationException(__('Es necesario confirmar la actualización', false)); } + TaskFactory::createTask('upgrade', $taskId); + $this->upgrade($version, $type); + $JsonResponse->setDescription(__('Aplicación actualizada correctamente', false)); $JsonResponse->addMessage(__('En 5 segundos será redirigido al login', false)); $JsonResponse->setStatus(0); } catch (\Exception $e) { + TaskFactory::endTask(); + $JsonResponse->setDescription($e->getMessage()); } @@ -94,6 +101,8 @@ class MainActionController { Upgrade::doUpgrade($version); + TaskFactory::endTask(); + $Config = Config::getConfig(); $Config->setMaintenance(false); $Config->setUpgradeKey(''); diff --git a/inc/SP/Controller/MainController.class.php b/inc/SP/Controller/MainController.class.php index 1cea402c..34b10d86 100644 --- a/inc/SP/Controller/MainController.class.php +++ b/inc/SP/Controller/MainController.class.php @@ -26,6 +26,7 @@ namespace SP\Controller; defined('APP_ROOT') || die(); +use SP\Account\AccountUtil; use SP\Config\Config; use SP\Core\Acl; use SP\Core\ActionsInterface; @@ -37,6 +38,7 @@ use SP\Core\Messages\NoticeMessage; use SP\Core\Plugin\PluginUtil; use SP\Core\Session; use SP\Core\SessionUtil; +use SP\Core\Task; use SP\Core\Template; use SP\Core\Upgrade\Account; use SP\Core\Upgrade\Check; @@ -443,6 +445,7 @@ class MainController extends ControllerBase implements ActionsInterface $this->view->assign('type', $type); $this->view->assign('version', $version); $this->view->assign('upgradeVersion', implode('.', Util::getVersion(true))); + $this->view->assign('taskId', Task::genTaskId('masterpass')); if ($version < 1316011001) { $this->view->assign('checkConstraints', Check::checkConstraints()); @@ -459,7 +462,7 @@ class MainController extends ControllerBase implements ActionsInterface } if ($version < 21017022601) { - $this->view->assign('numAccounts', Account::getNumAccounts()); + $this->view->assign('numAccounts', AccountUtil::getTotalNumAccounts()); } $this->view(); diff --git a/inc/SP/Controller/TaskController.class.php b/inc/SP/Controller/TaskController.class.php index 0cff8032..845381b5 100644 --- a/inc/SP/Controller/TaskController.class.php +++ b/inc/SP/Controller/TaskController.class.php @@ -25,9 +25,9 @@ namespace SP\Controller; use SP\Core\Messages\TaskMessage; -use SP\Core\Session; use SP\Core\Task; use SP\Http\Request; +use SP\Util\Util; /** * Class TaskController @@ -52,6 +52,27 @@ class TaskController * @var string Archivo de bloqueo */ protected $lockFile; + /** + * @var string Directorio de las tareas + */ + protected $dir; + /** + * @var string ID de la tarea + */ + protected $taskId; + /** + * @var string Archivo de la tarea + */ + protected $taskFile; + + /** + * TaskController constructor. + */ + public function __construct() + { + $this->dir = Util::getTempDir(); + $this->taskId = Request::analyze('taskId'); + } /** * Realizar acción @@ -60,93 +81,94 @@ class TaskController */ public function doAction() { + session_write_close(); + $source = Request::analyze('source'); - if ($this->checkWait($source)) { + if ($this->dir === false || !$this->getLock($source)) { return false; } + $this->taskFile = $this->dir . DIRECTORY_SEPARATOR . $this->taskId . '.task'; + $count = 0; - do { - session_write_close(); - + while (!$this->checkTaskRegistered() || !$this->checkTaskFile()) { if ($count >= $this->startupWaitCount) { debugLog('Aborting ...'); - $this->removeLock(); - - return false; + die(1); } - debugLog('Waiting task ...'); + debugLog('Waiting for task ...'); - sleep($this->startupWaitTime); - - session_start(); - - $this->Task = Session::getTask(); $count++; - } while (!is_object($this->Task)); - - session_write_close(); - - if ($this->checkFile()) { - $this->readTaskStatus(); + sleep($this->startupWaitTime); } - $this->removeLock(); + $this->readTaskStatus(); - return true; + die(0); } /** - * Comprobar si hay una tarea a la espera + * Comprueba si una tarea ha sido registrada en la sesión * - * @param $source * @return bool */ - protected function checkWait($source) + protected function checkTaskRegistered() { - $this->lockFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $source . '.lock'; + if (is_object($this->Task)) { + debugLog('Task detected: ' . $this->Task->getTaskId()); - if (file_exists($this->lockFile) || !touch($this->lockFile)) { return true; } + if (file_exists($this->taskFile)) { + $task = file_get_contents($this->taskFile); + + if ($task !== false) { + $this->Task = unserialize($task); + } + + return is_object($this->Task); + } + return false; } /** * Comprobar si el archivo de salida de la tarea existe */ - protected function checkFile() + protected function checkTaskFile() { - return file_exists($this->Task->getFile()); + return file_exists($this->Task->getFileOut()); } /** - * Leer el estdo de una tarea y enviarlo + * Leer el estado de una tarea y enviarlo */ protected function readTaskStatus() { + debugLog('Tracking task: ' . $this->Task->getTaskId()); + $id = 0; $failCount = 0; - $file = $this->Task->getFile(); + $file = $this->Task->getFileOut(); $interval = $this->Task->getInterval(); $Message = new TaskMessage(); $Message->setTask($this->Task->getTaskId()); $Message->setMessage(__('Esperando actualización de progreso ...')); - while ($failCount <= 10) { + while ($failCount <= 30 && file_exists($this->taskFile)) { $content = file_get_contents($file); - if ($content !== false) { + if (!empty($content)) { $this->sendMessage($id, $content); $id++; } else { - debugLog($Message->composeText()); + debugLog($Message->composeJson()); $this->sendMessage($id, $Message->composeJson()); $failCount++; @@ -170,6 +192,33 @@ class TaskController flush(); } + /** + * Comprobar si hay una tarea a la espera + * + * @param $source + * @return bool + */ + protected function checkWait($source) + { + $this->lockFile = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $source . '.lock'; + + if (file_exists($this->lockFile)) { + $timeout = $this->startupWaitCount * $this->startupWaitTime; + + if (filemtime($this->lockFile) + $timeout < time()) { + unlink($this->lockFile); + + return false; + } + + return true; + } + + touch($this->lockFile); + + return false; + } + /** * Eliminar bloqueo */ @@ -179,4 +228,42 @@ class TaskController unlink($this->lockFile); } + + /** + * Obtener un bloqueo para la ejecución de la tarea + * + * @param $source + * + * @return bool + */ + private function getLock($source) + { + if ($source === '') { + $source = 'task'; + } + + $this->lockFile = $this->dir . DIRECTORY_SEPARATOR . $source . '.lock'; + + if (file_exists($this->lockFile)) { + $timeout = $this->startupWaitCount * $this->startupWaitTime; + + if (filemtime($this->lockFile) + $timeout < time()) { + unlink($this->lockFile); + + return $this->updateLock(); + } + + return false; + } else { + return $this->updateLock(); + } + } + + /** + * Actualizar el tiempo del archivo de bloqueo + */ + protected function updateLock() + { + return file_put_contents($this->lockFile, time()) !== false; + } } \ No newline at end of file diff --git a/inc/SP/Core/Init.class.php b/inc/SP/Core/Init.class.php index 19a8009f..b44eb928 100644 --- a/inc/SP/Core/Init.class.php +++ b/inc/SP/Core/Init.class.php @@ -563,7 +563,7 @@ class Init if ($check === true || Checks::isAjax() - || Request::analyze('a') === 'upgrade' + || (Request::analyze('a') === 'upgrade' && Request::analyze('type') !== '') || Request::analyze('nodbupgrade', 0) === 1 || (self::$LOCK > 0 && self::isLoggedIn() && self::$LOCK === Session::getUserData()->getUserId()) ) { diff --git a/inc/SP/Core/Messages/TaskMessage.class.php b/inc/SP/Core/Messages/TaskMessage.class.php index 89479de4..844d06f2 100644 --- a/inc/SP/Core/Messages/TaskMessage.class.php +++ b/inc/SP/Core/Messages/TaskMessage.class.php @@ -33,6 +33,10 @@ use JsonSerializable; */ class TaskMessage implements MessageInterface, JsonSerializable { + /** + * @var string + */ + protected $taskId; /** * @var string */ @@ -142,6 +146,7 @@ class TaskMessage implements MessageInterface, JsonSerializable public function composeText() { return implode(PHP_EOL, [ + 'taskId' => $this->taskId, 'task' => $this->task, 'message' => $this->message, 'time' => $this->time, @@ -158,6 +163,7 @@ class TaskMessage implements MessageInterface, JsonSerializable public function composeHtml() { return [ + 'taskId' => $this->taskId, 'task' => $this->task, 'message' => $this->message, 'time' => $this->time, @@ -186,4 +192,20 @@ class TaskMessage implements MessageInterface, JsonSerializable { return get_object_vars($this); } + + /** + * @return string + */ + public function getTaskId() + { + return $this->taskId; + } + + /** + * @param string $taskId + */ + public function setTaskId($taskId) + { + $this->taskId = $taskId; + } } \ No newline at end of file diff --git a/inc/SP/Core/Session.class.php b/inc/SP/Core/Session.class.php index 1ec01523..b46d2bc4 100644 --- a/inc/SP/Core/Session.class.php +++ b/inc/SP/Core/Session.class.php @@ -51,7 +51,7 @@ class Session * * @param UserData $UserData */ - public static function setUserData($UserData = null) + public static function setUserData(UserData $UserData = null) { self::setSessionKey('userData', $UserData); } @@ -681,7 +681,7 @@ class Session * * @param Task $task */ - public static function setTask(Task $task) + public static function setTask(Task $task = null) { self::setSessionKey('task', $task); } diff --git a/inc/SP/Core/Task.class.php b/inc/SP/Core/Task.class.php index 5256c5a5..45d5082a 100644 --- a/inc/SP/Core/Task.class.php +++ b/inc/SP/Core/Task.class.php @@ -25,6 +25,7 @@ namespace SP\Core; use SP\Core\Messages\TaskMessage; +use SP\Util\Util; /** * Class Task @@ -41,10 +42,14 @@ class Task * @var string ID de la tarea */ protected $taskId; + /** + * @var string Ruta y archivo salida de la tarea + */ + protected $fileOut; /** * @var string Ruta y archivo de la tarea */ - protected $file; + protected $fileTask; /** * @var resource Manejador del archivo */ @@ -62,11 +67,12 @@ class Task * Task constructor. * * @param string $name Nombre de la tarea + * @param string $id */ - public function __construct($name) + public function __construct($name, $id) { $this->name = $name; - $this->taskId = uniqid($this->name, true); + $this->taskId = $id; $this->initialized = $this->checkFile(); } @@ -77,29 +83,41 @@ class Task */ protected function checkFile() { - $fileName = $this->taskId . '.out'; - $fileTmp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $fileName; + $tempDir = Util::getTempDir(); - if (touch($fileTmp)) { - $this->file = $fileTmp; - } else { - $fileTmpAlt = Init::$SERVERROOT . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $fileName; - $dirAlt = dirname($fileTmpAlt); + if ($tempDir !== false) { + $this->fileOut = $tempDir . DIRECTORY_SEPARATOR . $this->taskId . '.out'; + $this->fileTask = $tempDir . DIRECTORY_SEPARATOR . $this->taskId . '.task'; - if (!file_exists($dirAlt) && !mkdir($dirAlt)) { - return false; - } + $this->deleteTaskFiles(); - if (!touch($fileTmpAlt)) { - return false; - } - - $this->file = $fileTmpAlt; + return true; } - debugLog('Start Task: ' . $this->name); + return false; + } - return true; + /** + * Eliminar los archivos de la tarea no usados + */ + protected function deleteTaskFiles() + { + $filesOut = dirname($this->fileOut) . DIRECTORY_SEPARATOR . $this->taskId . '*.out'; + $filesTask = dirname($this->fileOut) . DIRECTORY_SEPARATOR . $this->taskId . '*.task'; + + array_map('unlink', glob($filesOut)); + array_map('unlink', glob($filesTask)); + } + + /** + * Generar un ID de tarea + * + * @param $name + * @return string + */ + public static function genTaskId($name) + { + return uniqid($name, true); } /** @@ -120,7 +138,7 @@ class Task protected function openFile() { if ($this->initialized === false - || !$this->fileHandler = fopen($this->file, 'wb') + || !$this->fileHandler = fopen($this->fileOut, 'wb') ) { return false; } @@ -157,7 +175,7 @@ class Task { return $this->initialized === true && !is_resource($this->fileHandler) - && file_put_contents($this->file, $Message->composeText()) !== false; + && file_put_contents($this->fileOut, $Message->composeText()) !== false; } /** @@ -170,19 +188,34 @@ class Task { return $this->initialized === true && !is_resource($this->fileHandler) - && file_put_contents($this->file, $Message->composeJson()) !== false; + && file_put_contents($this->fileOut, $Message->composeJson()) !== false; } /** * Iniciar la tarea * + * @param bool $startSession * @return bool */ - public function end() + public function end($startSession = true) { - debugLog('End Task: ' . $this->name); + if ($startSession) { + session_start(); + } - return $this->closeFile() && @unlink($this->file); + $this->deregister(); + + return $this->closeFile() && @unlink($this->fileOut); + } + + /** + * Desregistrar la tarea en la sesión + */ + public function deregister() + { + debugLog('Deregister Task: ' . $this->name); + + unlink($this->fileTask); } /** @@ -226,8 +259,34 @@ class Task /** * @return string */ - public function getFile() + public function getFileOut() { - return $this->file; + return $this->fileOut; + } + + /** + * Registrar la tarea en la sesión. + * + * Es necesario bloquear la sesión para permitir la ejecución de otros scripts + * + * @param bool $lockSession Bloquear la sesión + */ + public function register($lockSession = true) + { + debugLog('Register Task: ' . $this->name); + + file_put_contents($this->fileTask, serialize($this)); + + if ($lockSession === true) { + session_write_close(); + } + } + + /** + * @return string + */ + public function getFileTask() + { + return $this->fileTask; } } \ No newline at end of file diff --git a/inc/SP/Core/TaskFactory.class.php b/inc/SP/Core/TaskFactory.class.php new file mode 100644 index 00000000..106efb39 --- /dev/null +++ b/inc/SP/Core/TaskFactory.class.php @@ -0,0 +1,82 @@ +. + */ + +namespace SP\Core; + +use SP\Core\Messages\TaskMessage; + +/** + * Class TaskFactory + * + * @package SP\Core + */ +class TaskFactory +{ + /** + * @var TaskMessage + */ + public static $Message; + /** + * @var Task + */ + private static $Task; + + /** + * Crear una tarea para la actualización de estado de la actualización + * + * @param $name + * @param $id + */ + public static function createTask($name, $id) + { + if (self::$Task === null) { + self::$Task = new Task($name, $id); + self::$Task->register(); + } + + self::$Message = new TaskMessage(); + self::$Message->setTaskId($id); + } + + /** + * Finalizar la tarea + */ + public static function endTask() + { + if (self::$Task !== null) { + self::$Task->end(); + self::$Task = null; + } + } + + /** + * Enviar un mensaje de actualización a la tarea + */ + public static function sendTaskMessage() + { + if (self::$Task !== null) { + self::$Task->writeJsonStatusAndFlush(self::$Message); + } + } +} \ No newline at end of file diff --git a/inc/SP/Core/Upgrade/Account.class.php b/inc/SP/Core/Upgrade/Account.class.php index 7ea0329d..51acff15 100644 --- a/inc/SP/Core/Upgrade/Account.class.php +++ b/inc/SP/Core/Upgrade/Account.class.php @@ -25,6 +25,7 @@ namespace SP\Core\Upgrade; use SP\Core\Exceptions\SPException; +use SP\Core\TaskFactory; use SP\Storage\DB; use SP\Storage\QueryData; @@ -42,6 +43,10 @@ class Account */ public static function fixAccountsId() { + TaskFactory::$Message->setTask(__FUNCTION__); + TaskFactory::$Message->setMessage(__('Actualizando IDs de cuentas')); + TaskFactory::sendTaskMessage(); + try { DB::beginTransaction(); @@ -61,20 +66,4 @@ class Account return false; } } - - /** - * Devolver el número de cuentas a procesar - * - * @return int - */ - public static function getNumAccounts() - { - $query = /** @lang SQL */ - 'SELECT SUM(n) AS num FROM (SELECT COUNT(*) AS n FROM accounts UNION SELECT COUNT(*) AS n FROM accHistory) a'; - - $Data = new QueryData(); - $Data->setQuery($query); - - return (int)DB::getResults($Data)->num; - } } \ No newline at end of file diff --git a/inc/SP/Core/Upgrade/Category.class.php b/inc/SP/Core/Upgrade/Category.class.php index cc312452..bedc5c3a 100644 --- a/inc/SP/Core/Upgrade/Category.class.php +++ b/inc/SP/Core/Upgrade/Category.class.php @@ -25,6 +25,7 @@ namespace SP\Core\Upgrade; use SP\Core\Exceptions\SPException; +use SP\Core\TaskFactory; use SP\Storage\DB; use SP\Storage\QueryData; @@ -43,6 +44,10 @@ class Category */ public static function fixCategoriesId($categoryId) { + TaskFactory::$Message->setTask(__FUNCTION__); + TaskFactory::$Message->setMessage(__('Actualizando IDs de categorías')); + TaskFactory::sendTaskMessage(); + try { DB::beginTransaction(); diff --git a/inc/SP/Core/Upgrade/Crypt.class.php b/inc/SP/Core/Upgrade/Crypt.class.php index dcddfb10..b1bd2dc8 100644 --- a/inc/SP/Core/Upgrade/Crypt.class.php +++ b/inc/SP/Core/Upgrade/Crypt.class.php @@ -31,9 +31,6 @@ use SP\Config\ConfigDB; use SP\Core\Crypt\Hash; use SP\Core\Exceptions\SPException; use SP\Core\Init; -use SP\Core\Messages\TaskMessage; -use SP\Core\Session; -use SP\Core\Task; use SP\Log\Log; use SP\Mgmt\CustomFields\CustomFieldsUtil; use SP\Mgmt\Users\UserMigrate; @@ -58,12 +55,6 @@ class Crypt global $timeStart; try { - $Task = new Task(__FUNCTION__); - - Session::setTask($Task); - - session_write_close(); - AccountHistoryCrypt::$currentMPassHash = ConfigDB::getValue('masterPwd'); if (!DB::beginTransaction()) { @@ -82,20 +73,12 @@ class Crypt debugLog('Total time: ' . (Init::microtime_float() - $timeStart)); - $Task->end(); - - session_start(); - return true; } catch (\Exception $e) { if (DB::rollbackTransaction()) { debugLog('Rollback: ' . __METHOD__); } - $Task->end(); - - session_start(); - throw $e; } } @@ -126,8 +109,8 @@ class Crypt // Hash de clave maestra anterior a 2.0.0.17013101 // Hash de clave maestra anterior a 2.0.0.17021601 - } elseif (hash_equals(crypt($masterPass, substr($configHashMPass, 0, 72)), substr($configHashMPass, 72)) - || hash_equals(crypt($masterPass, substr($configHashMPass, 0, 30)), substr($configHashMPass, 30)) + } elseif ((substr($configHashMPass, 72) !== false && hash_equals(crypt($masterPass, substr($configHashMPass, 0, 72)), substr($configHashMPass, 72))) + || (substr($configHashMPass, 30) !== false && hash_equals(crypt($masterPass, substr($configHashMPass, 0, 30)), substr($configHashMPass, 30))) ) { ConfigDB::setValue('masterPwd', Hash::hashKey($masterPass)); Log::writeNewLog(__('Aviso', false), __('Se ha regenerado el HASH de clave maestra. No es necesaria ninguna acción.', false), Log::NOTICE); diff --git a/inc/SP/Core/Upgrade/Customer.class.php b/inc/SP/Core/Upgrade/Customer.class.php index 403e4c56..b3bec748 100644 --- a/inc/SP/Core/Upgrade/Customer.class.php +++ b/inc/SP/Core/Upgrade/Customer.class.php @@ -25,6 +25,7 @@ namespace SP\Core\Upgrade; use SP\Core\Exceptions\SPException; +use SP\Core\TaskFactory; use SP\Storage\DB; use SP\Storage\QueryData; @@ -43,6 +44,10 @@ class Customer */ public static function fixCustomerId($customerId) { + TaskFactory::$Message->setTask(__FUNCTION__); + TaskFactory::$Message->setMessage(__('Actualizando IDs de clientes')); + TaskFactory::sendTaskMessage(); + try { DB::beginTransaction(); diff --git a/inc/SP/Core/Upgrade/Group.class.php b/inc/SP/Core/Upgrade/Group.class.php index 9de7b4ea..be0916fb 100644 --- a/inc/SP/Core/Upgrade/Group.class.php +++ b/inc/SP/Core/Upgrade/Group.class.php @@ -25,6 +25,7 @@ namespace SP\Core\Upgrade; use SP\Core\Exceptions\SPException; +use SP\Core\TaskFactory; use SP\Storage\DB; use SP\Storage\QueryData; @@ -46,6 +47,10 @@ class Group */ public static function fixGroupId($groupId) { + TaskFactory::$Message->setTask(__FUNCTION__); + TaskFactory::$Message->setMessage(__('Actualizando IDs de grupos')); + TaskFactory::sendTaskMessage(); + try { DB::beginTransaction(); diff --git a/inc/SP/Core/Upgrade/Profile.class.php b/inc/SP/Core/Upgrade/Profile.class.php index 40d9b62d..ffe8db8a 100644 --- a/inc/SP/Core/Upgrade/Profile.class.php +++ b/inc/SP/Core/Upgrade/Profile.class.php @@ -25,6 +25,7 @@ namespace SP\Core\Upgrade; use SP\Core\Exceptions\SPException; +use SP\Core\TaskFactory; use SP\DataModel\ProfileData; use SP\Storage\DB; use SP\Storage\QueryData; @@ -49,6 +50,10 @@ class Profile $Data = new QueryData(); try { + TaskFactory::$Message->setTask(__FUNCTION__); + TaskFactory::$Message->setMessage(__('Actualizando IDs de perfil')); + TaskFactory::sendTaskMessage(); + DB::beginTransaction(); if ($profileId === 0){ diff --git a/inc/SP/Core/Upgrade/Upgrade.class.php b/inc/SP/Core/Upgrade/Upgrade.class.php index f9f8f773..d689c398 100644 --- a/inc/SP/Core/Upgrade/Upgrade.class.php +++ b/inc/SP/Core/Upgrade/Upgrade.class.php @@ -32,6 +32,7 @@ use SP\Controller\MainActionController; use SP\Core\Exceptions\SPException; use SP\Core\Init; use SP\Core\Session as CoreSession; +use SP\Core\TaskFactory; use SP\Http\Request; use SP\Log\Email; use SP\Log\Log; @@ -109,10 +110,18 @@ class Upgrade */ private static function auxPreDbUpgrade($version) { + if ((int)ConfigDB::getValue('version') >= $version) { + return true; + } + switch ($version) { case 1316011001: + debugLog(__FUNCTION__ . ': ' . $version); + return self::upgradeDB(1300000000); case 1316100601: + debugLog(__FUNCTION__ . ': ' . $version); + return Account::fixAccountsId() && UserUpgrade::fixUsersId(Request::analyze('userid', 0)) @@ -146,6 +155,12 @@ class Upgrade return true; } + TaskFactory::$Message->setTask(__('Actualizar BBDD')); + TaskFactory::$Message->setMessage(sprintf('%s : %s', __('Versión'), $version)); + TaskFactory::sendTaskMessage(); + + debugLog(__FUNCTION__ . ': ' . $version); + $Data = new QueryData(); foreach ($queries as $query) { @@ -221,10 +236,17 @@ class Upgrade $masterPass = Request::analyzeEncrypted('masterkey'); $UserData = User::getItem()->getByLogin(Request::analyze('userlogin')); + if (!is_object($UserData)) { + throw new SPException(SPException::SP_ERROR, __('Error al obtener los datos del usuario', false)); + } + + @session_start(); + CoreSession::setUserData($UserData); + @session_write_close(); + return $dbResult === true - && is_object($UserData) && !empty($masterPass) && Crypt::migrate($masterPass); } @@ -243,12 +265,20 @@ class Upgrade try { switch ($version) { case 12001: + debugLog(__FUNCTION__ . ': ' . $version); + return (ProfileUtil::migrateProfiles() && UserMigrate::migrateUsersGroup()); case 12002: + debugLog(__FUNCTION__ . ': ' . $version); + return UserMigrate::setMigrateUsers(); case 20017010901: + debugLog(__FUNCTION__ . ': ' . $version); + return CustomFieldsUtil::migrateCustomFields() && UserPreferencesUtil::migrate(); case 20017011202: + debugLog(__FUNCTION__ . ': ' . $version); + return UserPreferencesUtil::migrate(); } } catch (SPException $e) { @@ -284,6 +314,8 @@ class Upgrade if (version_compare($version, $upgradeVersion) < 0) { switch ($upgradeVersion) { case 20017011202: + debugLog(__FUNCTION__ . ': ' . $version); + $Config->setSiteTheme('material-blue'); $Config->setConfigVersion($upgradeVersion); Config::saveConfig($Config, false); diff --git a/inc/SP/Core/Upgrade/User.class.php b/inc/SP/Core/Upgrade/User.class.php index 0a492614..2685ddd3 100644 --- a/inc/SP/Core/Upgrade/User.class.php +++ b/inc/SP/Core/Upgrade/User.class.php @@ -27,6 +27,7 @@ namespace SP\Core\Upgrade; use Defuse\Crypto\Exception\CryptoException; use SP\Core\Exceptions\SPException; use SP\Core\OldCrypt; +use SP\Core\TaskFactory; use SP\DataModel\UserLoginData; use SP\Mgmt\Users\UserPass; use SP\Storage\DB; @@ -47,6 +48,10 @@ class User */ public static function fixUsersId($userId) { + TaskFactory::$Message->setTask(__FUNCTION__); + TaskFactory::$Message->setMessage(__('Actualizando IDs de usuarios')); + TaskFactory::sendTaskMessage(); + try { DB::beginTransaction(); diff --git a/inc/SP/Util/Util.class.php b/inc/SP/Util/Util.class.php index be1b748f..6c290d0e 100644 --- a/inc/SP/Util/Util.class.php +++ b/inc/SP/Util/Util.class.php @@ -43,7 +43,7 @@ class Util /** * Generar una clave aleatoria * - * @param int $length Longitud de la clave + * @param int $length Longitud de la clave * @param bool $useNumbers Usar números * @param bool $useSpecial Usar carácteres especiales * @param bool $checKStrength @@ -246,10 +246,10 @@ class Util /** * Obtener datos desde una URL usando CURL * - * @param string $url - * @param array $data + * @param string $url + * @param array $data * @param bool|null $useCookie - * @param bool $weak + * @param bool $weak * @return bool|string * @throws SPException */ @@ -453,8 +453,8 @@ class Util * such as 'false','N','yes','on','off', etc. * * @author Samuel Levy - * @param mixed $in The variable to check - * @param bool $strict If set to false, consider everything that is not false to + * @param mixed $in The variable to check + * @param bool $strict If set to false, consider everything that is not false to * be true. * @return bool The boolean equivalent or null (if strict, and no exact equivalent) */ @@ -528,7 +528,7 @@ class Util /** * Cast an object to another class, keeping the properties, but changing the methods * - * @param string $class Class name + * @param string $class Class name * @param string|object $object * @return mixed * @link http://blog.jasny.net/articles/a-dark-corner-of-php-class-casting/ @@ -584,9 +584,9 @@ class Util /** * Comprobar si un valor existe en un array de objetos * - * @param array $objectArray + * @param array $objectArray * @param string $method - * @param mixed $value + * @param mixed $value * @return bool */ public static function checkInObjectArray(array $objectArray, $method, $value) @@ -660,4 +660,30 @@ class Util return [0, 0]; } + + /** + * Comprueba y devuelve un directorio temporal válido + * + * @return bool|string + */ + public static function getTempDir() + { + $sysTmp = sys_get_temp_dir(); + $appTmp = Init::$SERVERROOT . DIRECTORY_SEPARATOR . 'tmp'; + $file = 'syspass.test'; + + if (file_exists($appTmp . DIRECTORY_SEPARATOR . $file)) { + return $appTmp; + } elseif (file_exists($sysTmp . DIRECTORY_SEPARATOR . $file)) { + return $sysTmp; + } + + if (is_dir($appTmp) || @mkdir($appTmp)) { + if (touch($appTmp . DIRECTORY_SEPARATOR . $file)) { + return $appTmp; + } + } + + return touch($sysTmp . DIRECTORY_SEPARATOR . $file) ? $sysTmp : false; + } } \ No newline at end of file diff --git a/inc/locales/en_US/LC_MESSAGES/messages.mo b/inc/locales/en_US/LC_MESSAGES/messages.mo index 8944cff3..8aaf8d2e 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 aa7f6f61..094486d0 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: 2017-02-26 11:46+0100\n" -"PO-Revision-Date: 2017-02-26 13:19+0100\n" +"POT-Creation-Date: 2017-02-28 12:31+0100\n" +"PO-Revision-Date: 2017-02-28 12:31+0100\n" "Last-Translator: nuxsmin \n" "Language-Team: nuxsmin@syspass.org\n" "Language: en_US\n" @@ -69,7 +69,7 @@ msgstr "Invalid file" #: ../../../../ajax/ajax_filesMgmt.php:104 #: ../../../../ajax/ajax_filesMgmt.php:166 #: ../../../../inc/SP/Controller/ItemActionController.class.php:841 -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:352 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:372 #: ../../../../inc/SP/Mgmt/Files/File.class.php:95 #: ../../../../inc/themes/material-blue/views/config/import.inc:66 #: ../../../../inc/themes/material-blue/views/config/import.inc:69 @@ -155,7 +155,7 @@ msgstr "Account" #: ../../../../inc/SP/Controller/LoginController.class.php:512 #: ../../../../inc/SP/Controller/LoginController.class.php:530 #: ../../../../inc/SP/Controller/LoginController.class.php:538 -#: ../../../../inc/SP/Controller/MainActionController.class.php:118 +#: ../../../../inc/SP/Controller/MainActionController.class.php:116 #: ../../../../inc/SP/Core/Init.class.php:445 #: ../../../../inc/SP/Mgmt/Files/File.class.php:96 #: ../../../../inc/SP/Mgmt/PublicLinks/PublicLink.class.php:75 @@ -278,10 +278,10 @@ msgstr "Error while creating the account" #: ../../../../inc/SP/Account/Account.class.php:321 #: ../../../../inc/SP/Account/Account.class.php:324 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:127 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:237 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:137 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:256 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:138 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:258 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:149 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:278 #: ../../../../inc/SP/Api/ApiBase.class.php:200 #: ../../../../inc/SP/Api/ApiBase.class.php:203 #: ../../../../inc/SP/Api/ApiRequest.class.php:147 @@ -321,54 +321,54 @@ msgstr "Error while deleting the account" msgid "Error al actualizar la clave" msgstr "Error while updating the password" -#: ../../../../inc/SP/Account/AccountCrypt.class.php:66 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:102 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:188 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:216 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:68 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:94 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:199 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:218 #: ../../../../inc/SP/Controller/ConfigActionController.class.php:558 #: ../../../../inc/SP/Controller/ConfigActionController.class.php:586 msgid "Actualizar Clave Maestra" msgstr "Update Master Password" -#: ../../../../inc/SP/Account/AccountCrypt.class.php:67 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:189 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:70 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:198 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:69 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:200 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:72 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:210 msgid "Inicio" msgstr "Start" -#: ../../../../inc/SP/Account/AccountCrypt.class.php:71 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:74 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:73 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:76 msgid "Error en el módulo de encriptación" msgstr "Error on the encryption module" -#: ../../../../inc/SP/Account/AccountCrypt.class.php:81 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:196 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:83 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:207 msgid "Error al obtener las claves de las cuentas" msgstr "Error while retrieving the accounts' passwords" -#: ../../../../inc/SP/Account/AccountCrypt.class.php:103 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:144 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:217 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:254 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:110 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:154 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:231 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:273 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:113 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:155 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:237 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:275 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:121 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:166 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:252 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:295 msgid "Cuentas actualizadas" msgstr "Accounts updated" -#: ../../../../inc/SP/Account/AccountCrypt.class.php:137 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:140 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:247 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:250 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:148 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:151 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:268 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:271 msgid "Fallo al actualizar la clave de la cuenta" msgstr "Error while updating the account's password" -#: ../../../../inc/SP/Account/AccountCrypt.class.php:145 -#: ../../../../inc/SP/Account/AccountCrypt.class.php:255 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:155 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:274 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:156 +#: ../../../../inc/SP/Account/AccountCrypt.class.php:276 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:167 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:296 #: ../../../../inc/SP/Controller/ItemActionController.class.php:1077 msgid "Errores" msgstr "Errors" @@ -385,29 +385,29 @@ msgstr "Error while deleting favorite" msgid "Error al actualizar el historial" msgstr "Error while updating history" -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:69 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:109 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:197 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:230 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:71 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:102 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:209 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:233 msgid "Actualizar Clave Maestra (H)" msgstr "Update Master Password (H)" -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:84 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:205 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:86 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:217 #: ../../../../inc/themes/material-blue/views/accountsearch/index.inc:11 #: ../../../../inc/themes/material-blue/views/eventlog/eventlog.inc:11 msgid "No se encontraron registros" msgstr "No records found" -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:124 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:243 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:136 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:265 msgid "La clave maestra del registro no coincide" msgstr "The record's master password does not match" -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:147 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:150 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:266 -#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:269 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:159 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:162 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:288 +#: ../../../../inc/SP/Account/AccountHistoryCrypt.class.php:291 msgid "Fallo al actualizar la clave del histórico" msgstr "Error on updating the history's master password" @@ -969,8 +969,8 @@ msgid "Modificar configuración" msgstr "Update Configuration" #: ../../../../inc/SP/Config/ConfigDB.class.php:149 -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:325 -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:331 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:345 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:351 msgid "Parámetro" msgstr "Parameter" @@ -1115,10 +1115,10 @@ msgid "Conexión correcta" msgstr "Connection successful" #: ../../../../inc/SP/Controller/ChecksController.class.php:138 -#: ../../../../inc/SP/Controller/MainActionController.class.php:117 +#: ../../../../inc/SP/Controller/MainActionController.class.php:115 #: ../../../../inc/SP/Core/Init.class.php:444 -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:139 -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:345 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:147 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:365 #: ../../../../inc/themes/material-blue/views/config/info.inc:40 #: ../../../../inc/themes/material-blue/views/itemshow/plugins.inc:25 msgid "Versión" @@ -1307,7 +1307,7 @@ msgid "La clave maestra actual no coincide" msgstr "The current master password does not match" #: ../../../../inc/SP/Controller/ConfigActionController.class.php:518 -#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:59 +#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:70 #: ../../../../inc/SP/Import/Import.class.php:89 msgid "No es posible iniciar una transacción" msgstr "Unable to start a transaction" @@ -1325,7 +1325,7 @@ msgid "Errores al actualizar datos de campos personalizados" msgstr "Error while updating the custom fields data" #: ../../../../inc/SP/Controller/ConfigActionController.class.php:548 -#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:68 +#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:80 #: ../../../../inc/SP/Import/Import.class.php:95 msgid "No es posible finalizar una transacción" msgstr "Unable to finish a transaction" @@ -2377,7 +2377,7 @@ msgstr "Using temporary password" #: ../../../../inc/SP/Controller/LoginController.class.php:319 #: ../../../../inc/SP/Controller/LoginController.class.php:338 #: ../../../../inc/SP/Controller/LoginController.class.php:340 -#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:61 +#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:72 msgid "Clave maestra incorrecta" msgstr "Wrong Master Password" @@ -2410,7 +2410,7 @@ msgid "Autentificación" msgstr "Authentication" #: ../../../../inc/SP/Controller/MainActionController.class.php:60 -#: ../../../../inc/SP/Controller/MainActionController.class.php:115 +#: ../../../../inc/SP/Controller/MainActionController.class.php:113 #: ../../../../inc/SP/Core/Init.class.php:442 msgid "Actualización" msgstr "Update" @@ -2432,7 +2432,7 @@ msgstr "Application successfully updated" msgid "En 5 segundos será redirigido al login" msgstr "You will be redirected to log in within 5 seconds" -#: ../../../../inc/SP/Controller/MainActionController.class.php:116 +#: ../../../../inc/SP/Controller/MainActionController.class.php:114 #: ../../../../inc/SP/Core/Init.class.php:443 ../../../../res/upgrade.php:121 msgid "Actualización de versión realizada." msgstr "Version updating done." @@ -2510,6 +2510,10 @@ msgstr "Link viewed" msgid "Agente" msgstr "Agent" +#: ../../../../inc/SP/Controller/TaskController.class.php:140 +msgid "Esperando actualización de progreso ..." +msgstr "Waiting for progress updating ..." + #: ../../../../inc/SP/Controller/UserPreferencesController.class.php:90 msgid "Preferencias" msgstr "Preferences" @@ -2939,16 +2943,16 @@ msgstr "Template does not contain files" msgid "Error al crear la categoría" msgstr "Error while creating the category" -#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:104 -#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:115 +#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:122 +#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:133 #: ../../../../inc/SP/Log/Email.class.php:141 #: ../../../../inc/themes/material-blue/inc/Icons.class.php:70 #: ../../../../js/strings.js.php:85 msgid "Aviso" msgstr "Warning" -#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:104 -#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:115 +#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:122 +#: ../../../../inc/SP/Core/Upgrade/Crypt.class.php:133 msgid "" "Se ha regenerado el HASH de clave maestra. No es necesaria ninguna acción." msgstr "" @@ -2959,12 +2963,12 @@ msgstr "" msgid "Error al crear el cliente" msgstr "Error while creating the customer" -#: ../../../../inc/SP/Core/Upgrade/Group.class.php:87 +#: ../../../../inc/SP/Core/Upgrade/Group.class.php:98 #: ../../../../inc/SP/Mgmt/Groups/Group.class.php:67 msgid "Error al crear el grupo" msgstr "Error while creating the group" -#: ../../../../inc/SP/Core/Upgrade/Profile.class.php:84 +#: ../../../../inc/SP/Core/Upgrade/Profile.class.php:92 #: ../../../../inc/SP/Mgmt/Profiles/Profile.class.php:68 msgid "Error al crear perfil" msgstr "Error while creating the profile" @@ -2982,7 +2986,7 @@ msgid "Compruebe el registro de eventos para más detalles" msgstr "Please, check the event log for more details" #: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:79 -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:156 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:166 msgid "Error al aplicar la actualización de la Base de Datos" msgstr "Error while updating the database" @@ -2990,42 +2994,48 @@ msgstr "Error while updating the database" msgid "Error al aplicar la actualización de la aplicación" msgstr "Error while applying the application update" -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:138 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:146 msgid "Actualizar BBDD" msgstr "Update DB" -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:144 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:152 msgid "No es necesario actualizar la Base de Datos." msgstr "Database update not needed." -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:168 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:178 msgid "Actualización de la Base de Datos realizada correctamente." msgstr "Database updating was completed successfully." -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:312 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:235 +#: ../../../../inc/SP/Mgmt/Users/User.class.php:336 +#: ../../../../inc/SP/Mgmt/Users/User.class.php:393 +msgid "Error al obtener los datos del usuario" +msgstr "Error while retrieving the user's data" + +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:332 msgid "Actualizar Configuración" msgstr "Update Configuration" -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:351 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:371 msgid "Error al actualizar la configuración" msgstr "Error while updating the configuration" -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:478 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:498 msgid "La aplicación necesita actualizarse" msgstr "The application needs to be updated" -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:478 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:498 #, php-format msgid "Si es un administrador pulse en el enlace: %s" msgstr "If you are an administrator, click on the link: %s" -#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:478 +#: ../../../../inc/SP/Core/Upgrade/Upgrade.class.php:498 #: ../../../../inc/themes/material-blue/inc/Icons.class.php:57 -#: ../../../../inc/themes/material-blue/views/main/upgrade.inc:162 +#: ../../../../inc/themes/material-blue/views/main/upgrade.inc:167 msgid "Actualizar" msgstr "Update" -#: ../../../../inc/SP/Core/Upgrade/User.class.php:149 +#: ../../../../inc/SP/Core/Upgrade/User.class.php:151 #: ../../../../inc/SP/Mgmt/Users/User.class.php:88 msgid "Error al crear el usuario" msgstr "Error while creating the user" @@ -3671,11 +3681,6 @@ msgstr "Error while retrieving the users" msgid "Error al modificar la clave" msgstr "Error while updating the password" -#: ../../../../inc/SP/Mgmt/Users/User.class.php:336 -#: ../../../../inc/SP/Mgmt/Users/User.class.php:393 -msgid "Error al obtener los datos del usuario" -msgstr "Error while retrieving the user's data" - #: ../../../../inc/SP/Mgmt/Users/UserLdap.class.php:108 #: ../../../../inc/themes/material-blue/inc/Icons.class.php:54 msgid "Usuario de LDAP" @@ -4149,6 +4154,11 @@ msgstr "This action will reset all plugin data. Do you want to continue?" msgid "Este proceso puede durar algo de tiempo. Desea continuar?" msgstr "This process could long some time. Do you wish to continue?" +#: ../../../../js/strings.js.php:87 +msgid "" +"Realizando tarea. Por favor, no cierre la ventana/pestaña del navegador." +msgstr "Performing task. Please, do not close the browser window/tab." + #: ../../../../inc/themes/material-blue/views/account/account-editpass.inc:67 #: ../../../../inc/themes/material-blue/views/account/account.inc:135 #: ../../../../inc/themes/material-blue/views/account/account.inc:142 @@ -5885,21 +5895,21 @@ msgstr "" #, php-format msgid "" "Se van a actualizar %s cuentas. Este proceso puede tardar algo de tiempo." -msgstr "It will be updated %s accounts. This process could take a some time." +msgstr "It will be updated %s accounts. This process could take some time." #: ../../../../inc/themes/material-blue/views/main/upgrade.inc:135 msgid "Introducir login de usuario válido" msgstr "Enter a valid user login" -#: ../../../../inc/themes/material-blue/views/main/upgrade.inc:141 +#: ../../../../inc/themes/material-blue/views/main/upgrade.inc:146 msgid "He realizado una copia de seguridad completa de sysPass" msgstr "I've done a full sysPass backup" -#: ../../../../inc/themes/material-blue/views/main/upgrade.inc:154 +#: ../../../../inc/themes/material-blue/views/main/upgrade.inc:159 msgid "Por favor espere mientras el proceso se ejecuta" msgstr "Please, wait while the process is running" -#: ../../../../inc/themes/material-blue/views/main/upgrade.inc:164 +#: ../../../../inc/themes/material-blue/views/main/upgrade.inc:169 msgid "Iniciar Actualización" msgstr "Start Update" @@ -5950,9 +5960,3 @@ msgstr "Search results of '%s'" #: ../../../../inc/themes/material-blue/views/wiki/wikipage.inc:23 msgid "Página" msgstr "Page" - -#~ msgid "Error al eliminar archivo" -#~ msgstr "Error while deleting the file" - -#~ msgid "Error al aplicar la actualización de la Base de Datos." -#~ msgstr "Error while updating database." diff --git a/inc/themes/material-blue/views/config/encryption.inc b/inc/themes/material-blue/views/config/encryption.inc index 61082366..22202c62 100644 --- a/inc/themes/material-blue/views/config/encryption.inc +++ b/inc/themes/material-blue/views/config/encryption.inc @@ -88,17 +88,20 @@
getIconWarning()->getIcon(); ?>
+ class="icon material-icons getIconWarning()->getClass(); ?>">getIconWarning()->getIcon(); ?>
getIconWarning()->getIcon(); ?>
+ class="icon material-icons getIconWarning()->getClass(); ?>">getIconWarning()->getIcon(); ?>
getIconWarning()->getIcon(); ?>
+ class="icon material-icons getIconWarning()->getClass(); ?>">getIconWarning()->getIcon(); ?>
+
getIconWarning()->getIcon(); ?>
+