From 59de1c4d00ad382b8dfa7af4f5876b91b0f22c78 Mon Sep 17 00:00:00 2001 From: nuxsmin Date: Thu, 1 Nov 2018 19:13:41 +0100 Subject: [PATCH] * [MOD] Improved database checking * [ADD] Added plugin removal when it isn't available * [FIX] Minor bugfixes Signed-off-by: nuxsmin --- app/config/actions.xml | 6 ++ app/modules/api/Init.php | 25 +++-- .../Controllers/ConfigManagerController.php | 5 +- .../web/Controllers/ErrorController.php | 16 ++++ .../Controllers/Helpers/Grid/PluginGrid.php | 27 ++++++ .../web/Controllers/PluginController.php | 36 ++++++++ app/modules/web/Init.php | 27 ++++-- composer.json | 3 + lib/SP/Core/Acl/ActionsInterface.php | 1 + lib/SP/Plugin/PluginManager.php | 2 +- lib/SP/Repositories/RepositoryItemTrait.php | 4 +- lib/SP/Services/Backup/FileBackupService.php | 3 +- lib/SP/Services/Install/Installer.php | 2 +- lib/SP/Services/Install/MySQL.php | 4 +- lib/SP/Storage/Database/DatabaseUtil.php | 91 ++++++++++++------- public/js/app-actions.js | 42 ++++++++- public/js/app-actions.min.js | 37 ++++---- tests/SP/Services/Install/InstallerTest.php | 4 +- 18 files changed, 261 insertions(+), 74 deletions(-) diff --git a/app/config/actions.xml b/app/config/actions.xml index b48c95eb..7fa0eb5b 100644 --- a/app/config/actions.xml +++ b/app/config/actions.xml @@ -565,6 +565,12 @@ Restablecer Plugin plugin/reset + + 1108 + PLUGIN_DELETE + Eliminar Plugin + plugin/delete + 703 USER_VIEW diff --git a/app/modules/api/Init.php b/app/modules/api/Init.php index e81dd776..2ed17ca6 100644 --- a/app/modules/api/Init.php +++ b/app/modules/api/Init.php @@ -33,7 +33,6 @@ use SP\Core\ModuleBase; use SP\Services\Upgrade\UpgradeAppService; use SP\Services\Upgrade\UpgradeDatabaseService; use SP\Services\Upgrade\UpgradeUtil; -use SP\Storage\Database\Database; use SP\Storage\Database\DatabaseUtil; use SP\Util\HttpUtil; @@ -92,18 +91,26 @@ final class Init extends ModuleBase HttpUtil::checkHttps($this->configData, $this->request); // Checks if sysPass is installed - if (!$this->checkInstalled()) { - throw new InitializationException('Not installed'); - } + $this->checkInstalled(); // Checks if maintenance mode is turned on - $this->checkMaintenanceMode($this->context); + if (!$this->checkMaintenanceMode($this->context)) { + throw new InitializationException('Maintenance mode'); + } // Checks if upgrade is needed $this->checkUpgrade(); + $databaseUtil = $this->container->get(DatabaseUtil::class); + // Checks if the database is set up - DatabaseUtil::checkDatabaseExist($this->container->get(Database::class)->getDbHandler(), $this->configData->getDbName()); + if (!$databaseUtil->checkDatabaseConnection()) { + throw new InitializationException('Database connection error'); + } + + if (!$databaseUtil->checkDatabaseTables($this->configData->getDbName())) { + throw new InitializationException('Database checking error'); + } // Initialize event handlers $this->initEventHandlers(); @@ -112,10 +119,14 @@ final class Init extends ModuleBase /** * Comprueba que la aplicación esté instalada * Esta función comprueba si la aplicación está instalada. Si no lo está, redirige al instalador. + * + * @throws InitializationException */ private function checkInstalled() { - return $this->configData->isInstalled(); + if (!$this->configData->isInstalled()) { + throw new InitializationException('Not installed'); + } } /** diff --git a/app/modules/web/Controllers/ConfigManagerController.php b/app/modules/web/Controllers/ConfigManagerController.php index 550fafdf..c6c51c0e 100644 --- a/app/modules/web/Controllers/ConfigManagerController.php +++ b/app/modules/web/Controllers/ConfigManagerController.php @@ -45,7 +45,6 @@ use SP\Services\User\UserService; use SP\Services\UserGroup\UserGroupService; use SP\Services\UserProfile\UserProfileService; use SP\Storage\Database\DatabaseUtil; -use SP\Storage\Database\DBStorageInterface; use SP\Storage\File\FileException; use SP\Storage\File\FileHandler; use SP\Util\Util; @@ -345,7 +344,9 @@ final class ConfigManagerController extends ControllerBase $template->setBase('config'); $template->addTemplate('info'); - $template->assign('dbInfo', DatabaseUtil::getDBinfo($this->dic->get(DBStorageInterface::class))); + $databaseUtil = $this->dic->get(DatabaseUtil::class); + + $template->assign('dbInfo', $databaseUtil->getDBinfo()); $template->assign('dbName', $this->configData->getDbName() . '@' . $this->configData->getDbHost()); $template->assign('configBackupDate', date('r', $this->dic->get(ConfigService::class)->getByParam('config_backup_date', 0))); $template->assign('plugins', $this->dic->get(PluginManager::class)->getLoadedPlugins()); diff --git a/app/modules/web/Controllers/ErrorController.php b/app/modules/web/Controllers/ErrorController.php index c6330d9a..92743c83 100644 --- a/app/modules/web/Controllers/ErrorController.php +++ b/app/modules/web/Controllers/ErrorController.php @@ -126,4 +126,20 @@ final class ErrorController $this->view(); } + + /** + * databaseErrorAction + */ + public function databaseConnectionAction() + { + $this->layoutHelper->getPublicLayout('error-database'); + + $this->view->append('errors', [ + 'type' => SPException::CRITICAL, + 'description' => __('No es posible conectar con la BD'), + 'hint' => __('Consulte con el administrador') + ]); + + $this->view(); + } } \ No newline at end of file diff --git a/app/modules/web/Controllers/Helpers/Grid/PluginGrid.php b/app/modules/web/Controllers/Helpers/Grid/PluginGrid.php index e3aa8c62..ac2257e8 100644 --- a/app/modules/web/Controllers/Helpers/Grid/PluginGrid.php +++ b/app/modules/web/Controllers/Helpers/Grid/PluginGrid.php @@ -68,6 +68,13 @@ final class PluginGrid extends GridBase $grid->addDataAction($this->getEnableAction()); $grid->addDataAction($this->getDisableAction()); $grid->addDataAction($this->getResetAction()); + $grid->addDataAction($this->getDeleteAction()); + $grid->addDataAction( + $this->getDeleteAction() + ->setName(__('Eliminar Seleccionados')) + ->setTitle(__('Eliminar Seleccionados')) + ->setIsSelection(true), + true); $grid->setTime(round(getElapsedTime($this->queryTimeStart), 5)); @@ -208,6 +215,26 @@ final class PluginGrid extends GridBase $gridAction->setFilterRowSource('available', 0); $gridAction->addData('action-route', Acl::getActionRoute(ActionsInterface::PLUGIN_RESET)); $gridAction->addData('action-method', 'get'); + $gridAction->addData('action-next', Acl::getActionRoute(ActionsInterface::PLUGIN)); + + return $gridAction; + } + + /** + * @return \SP\Html\DataGrid\Action\DataGridAction + */ + private function getDeleteAction() + { + $gridAction = new DataGridAction(); + $gridAction->setId(ActionsInterface::PLUGIN_DELETE); + $gridAction->setType(DataGridActionType::DELETE_ITEM); + $gridAction->setName(__('Eliminar Plugin')); + $gridAction->setTitle(__('Eliminar Plugin')); + $gridAction->setIcon($this->icons->getIconDelete()); + $gridAction->setFilterRowSource('available', 1); + $gridAction->setOnClickFunction('plugin/delete'); + $gridAction->addData('action-route', Acl::getActionRoute(ActionsInterface::PLUGIN_DELETE)); + $gridAction->addData('action-next', Acl::getActionRoute(ActionsInterface::PLUGIN)); return $gridAction; } diff --git a/app/modules/web/Controllers/PluginController.php b/app/modules/web/Controllers/PluginController.php index f589e213..50aa36a7 100644 --- a/app/modules/web/Controllers/PluginController.php +++ b/app/modules/web/Controllers/PluginController.php @@ -261,6 +261,42 @@ final class PluginController extends ControllerBase } } + /** + * resetAction + * + * @param $id + * + * @return bool + */ + public function deleteAction($id) + { + try { + $this->checkSecurityToken($this->previousSk, $this->request); + + if (!$this->acl->checkUserAccess(Acl::PLUGIN_DELETE)) { + return $this->returnJsonResponse(JsonResponse::JSON_ERROR, __u('No tiene permisos para realizar esta operación')); + } + + if ($id === null) { + $this->pluginService->deleteByIdBatch($this->getItemsIdFromRequest($this->request)); + + $this->eventDispatcher->notifyEvent('delete.plugin.selection', new Event($this)); + + return $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Plugins eliminados')); + } else { + $this->pluginService->delete($id); + + $this->eventDispatcher->notifyEvent('delete.plugin', new Event($this)); + + return $this->returnJsonResponse(JsonResponse::JSON_SUCCESS, __u('Plugin eliminado')); + } + } catch (\Exception $e) { + processException($e); + + return $this->returnJsonResponseException($e); + } + } + /** * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface diff --git a/app/modules/web/Init.php b/app/modules/web/Init.php index 2e242b86..cd4d802d 100644 --- a/app/modules/web/Init.php +++ b/app/modules/web/Init.php @@ -45,7 +45,6 @@ use SP\Services\Upgrade\UpgradeAppService; use SP\Services\Upgrade\UpgradeDatabaseService; use SP\Services\Upgrade\UpgradeUtil; use SP\Services\UserProfile\UserProfileService; -use SP\Storage\Database\Database; use SP\Storage\Database\DatabaseUtil; use SP\Util\HttpUtil; @@ -165,15 +164,30 @@ final class Init extends ModuleBase HttpUtil::checkHttps($this->configData, $this->request); if (in_array($controller, self::PARTIAL_INIT, true) === false) { + $databaseUtil = $this->container->get(DatabaseUtil::class); + // Checks if sysPass is installed - if ($this->checkInstalled() === false) { + if (!$this->checkInstalled()) { + logger('Not installed', 'ERROR'); + $this->router->response() ->redirect('index.php?r=install/index') ->send(); } + // Checks if the database is set up + if (!$databaseUtil->checkDatabaseConnection()) { + logger('Database connection error', 'ERROR'); + + $this->router->response() + ->redirect('index.php?r=error/databaseConnection') + ->send(); + } + // Checks if maintenance mode is turned on if ($this->checkMaintenanceMode($this->context)) { + logger('Maintenance mode', 'INFO'); + $this->router->response() ->redirect('index.php?r=error/maintenanceError') ->send(); @@ -181,6 +195,8 @@ final class Init extends ModuleBase // Checks if upgrade is needed if ($this->checkUpgrade()) { + logger('Upgrade needed', 'ERROR'); + $this->config->generateUpgradeKey(); $this->router->response() @@ -189,10 +205,9 @@ final class Init extends ModuleBase } // Checks if the database is set up - if (!DatabaseUtil::checkDatabaseExist( - $this->container->get(Database::class)->getDbHandler(), - $this->configData->getDbName()) - ) { + if (!$databaseUtil->checkDatabaseTables($this->configData->getDbName())) { + logger('Database checking error', 'ERROR'); + $this->router->response() ->redirect('index.php?r=error/databaseError') ->send(); diff --git a/composer.json b/composer.json index cd441995..614c1adf 100644 --- a/composer.json +++ b/composer.json @@ -44,6 +44,9 @@ "fzaninotto/faker": "~v1.8", "fabpot/goutte": "~v3.2" }, + "suggest": { + "syspass/plugin-authenticator": "^2.0" + }, "autoload": { "psr-4": { "SP\\": "lib/SP/", diff --git a/lib/SP/Core/Acl/ActionsInterface.php b/lib/SP/Core/Acl/ActionsInterface.php index c55fba0f..92db6d8c 100644 --- a/lib/SP/Core/Acl/ActionsInterface.php +++ b/lib/SP/Core/Acl/ActionsInterface.php @@ -127,6 +127,7 @@ interface ActionsInterface const PLUGIN_ENABLE = 1105; const PLUGIN_DISABLE = 1106; const PLUGIN_RESET = 1107; + const PLUGIN_DELETE = 1108; const WIKI = 1201; const WIKI_SEARCH = 1202; const WIKI_VIEW = 1203; diff --git a/lib/SP/Plugin/PluginManager.php b/lib/SP/Plugin/PluginManager.php index 10a3708b..f03dc8e1 100644 --- a/lib/SP/Plugin/PluginManager.php +++ b/lib/SP/Plugin/PluginManager.php @@ -102,7 +102,7 @@ final class PluginManager if ($dir) { while (false !== ($entry = $dir->read())) { $pluginDir = PLUGINS_PATH . DIRECTORY_SEPARATOR . $entry; - $pluginFile = $pluginDir . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'Plugin.php'; + $pluginFile = $pluginDir . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'Plugin.php'; if (strpos($entry, '.') === false && is_dir($pluginDir) diff --git a/lib/SP/Repositories/RepositoryItemTrait.php b/lib/SP/Repositories/RepositoryItemTrait.php index aa565f98..2f9c64d3 100644 --- a/lib/SP/Repositories/RepositoryItemTrait.php +++ b/lib/SP/Repositories/RepositoryItemTrait.php @@ -74,7 +74,9 @@ trait RepositoryItemTrait { $charsSrc = ['.', ' ', '_', ', ', '-', ';', '\'', '"', ':', '(', ')', '|', '/']; - return md5(strtolower(str_replace($charsSrc, '', DatabaseUtil::escape($name, $DBStorage)))); + $databaseUtil = new DatabaseUtil($DBStorage); + + return md5(strtolower(str_replace($charsSrc, '', $databaseUtil->escape($name)))); } /** diff --git a/lib/SP/Services/Backup/FileBackupService.php b/lib/SP/Services/Backup/FileBackupService.php index a8ff0ae9..87875bd9 100644 --- a/lib/SP/Services/Backup/FileBackupService.php +++ b/lib/SP/Services/Backup/FileBackupService.php @@ -212,6 +212,7 @@ final class FileBackupService extends Service $fileHandler->open('w'); $db = $this->dic->get(Database::class); + $databaseUtil = $this->dic->get(DatabaseUtil::class); $queryData = new QueryData(); @@ -293,7 +294,7 @@ final class FileBackupService extends Service if (is_numeric($value)) { $fileHandler->write($value); } else { - $fileHandler->write(DatabaseUtil::escape($value, $db->getDbHandler())); + $fileHandler->write($databaseUtil->escape($value)); } if ($field < $numColumns) { diff --git a/lib/SP/Services/Install/Installer.php b/lib/SP/Services/Install/Installer.php index a08e3aad..3fe2b84c 100644 --- a/lib/SP/Services/Install/Installer.php +++ b/lib/SP/Services/Install/Installer.php @@ -57,7 +57,7 @@ final class Installer extends Service */ const VERSION = [3, 0, 0]; const VERSION_TEXT = '3.0-beta'; - const BUILD = 18102801; + const BUILD = 18110101; /** * @var DatabaseSetupInterface diff --git a/lib/SP/Services/Install/MySQL.php b/lib/SP/Services/Install/MySQL.php index 01318fbd..84544ba8 100644 --- a/lib/SP/Services/Install/MySQL.php +++ b/lib/SP/Services/Install/MySQL.php @@ -354,7 +354,9 @@ final class MySQL implements DatabaseSetupInterface */ public function checkConnection() { - if (!DatabaseUtil::checkDatabaseExist($this->mysqlHandler, $this->installData->getDbName())) { + $databaseUtil = new DatabaseUtil($this->mysqlHandler); + + if (!$databaseUtil->checkDatabaseTables($this->installData->getDbName())) { $this->rollback(); throw new SPException( diff --git a/lib/SP/Storage/Database/DatabaseUtil.php b/lib/SP/Storage/Database/DatabaseUtil.php index eaf96a78..bf6cbb1e 100644 --- a/lib/SP/Storage/Database/DatabaseUtil.php +++ b/lib/SP/Storage/Database/DatabaseUtil.php @@ -24,8 +24,6 @@ namespace SP\Storage\Database; -use SP\Core\Exceptions\SPException; - /** * Class DBUtil con utilidades de la BD * @@ -64,39 +62,79 @@ final class DatabaseUtil 'account_data_v', 'account_search_v' ]; + /** + * @var DBStorageInterface + */ + private $DBStorage; /** - * Escapar una cadena de texto con funciones de mysqli. + * DatabaseUtil constructor. * - * @param string $str string con la cadena a escapar * @param DBStorageInterface $DBStorage - * - * @return string con la cadena escapada */ - public static function escape($str, DBStorageInterface $DBStorage) + public function __construct(DBStorageInterface $DBStorage) + { + + $this->DBStorage = $DBStorage; + } + + /** + * Comprobar que la base de datos existe. + * + * @param string $dbName + * + * @return bool + */ + public function checkDatabaseTables($dbName) { try { - return $DBStorage->getConnection()->quote(trim($str)); - } catch (SPException $e) { + $tables = implode(',', array_map(function ($value) { + return '\'' . $value . '\''; + }, self::$tables)); + + $query = /** @lang SQL */ + 'SELECT COUNT(*) + FROM information_schema.tables + WHERE table_schema = \'' . $dbName . '\' + AND `table_name` IN (' . $tables . ')'; + + $numTables = (int)$this->DBStorage->getConnection()->query($query)->fetchColumn(); + + return $numTables === count(self::$tables); + } catch (\Exception $e) { processException($e); } - return $str; + return false; + } + + /** + * @return bool + */ + public function checkDatabaseConnection() + { + try { + $this->DBStorage->getConnection(); + + return true; + } catch (\Exception $e) { + processException($e); + + return false; + } } /** * Obtener la información del servidor de base de datos * - * @param DBStorageInterface $DBStorage - * * @return array */ - public static function getDBinfo(DBStorageInterface $DBStorage) + public function getDBinfo() { $dbinfo = []; try { - $db = $DBStorage->getConnection(); + $db = $this->DBStorage->getConnection(); $attributes = [ 'SERVER_VERSION', @@ -118,33 +156,20 @@ final class DatabaseUtil } /** - * Comprobar que la base de datos existe. + * Escapar una cadena de texto con funciones de mysqli. * - * @param DBStorageInterface $DBStorage - * @param string $dbName + * @param string $str string con la cadena a escapar * - * @return bool + * @return string con la cadena escapada */ - public static function checkDatabaseExist(DBStorageInterface $DBStorage, $dbName) + public function escape($str) { try { - $tables = implode(',', array_map(function ($value) { - return '\'' . $value . '\''; - }, self::$tables)); - - $query = /** @lang SQL */ - 'SELECT COUNT(*) - FROM information_schema.tables - WHERE table_schema = \'' . $dbName . '\' - AND `table_name` IN (' . $tables . ')'; - - $numTables = (int)$DBStorage->getConnection()->query($query)->fetchColumn(); - - return $numTables === count(self::$tables); + return $this->DBStorage->getConnection()->quote(trim($str)); } catch (\Exception $e) { processException($e); } - return false; + return $str; } } \ No newline at end of file diff --git a/public/js/app-actions.js b/public/js/app-actions.js index d86281f2..0265bf5b 100644 --- a/public/js/app-actions.js +++ b/public/js/app-actions.js @@ -1398,7 +1398,22 @@ sysPass.Actions = function (log) { onClick: function (e) { e.preventDefault(); - tabs.save($obj); + const opts = sysPassApp.requests.getRequestOpts(); + opts.method = "get"; + opts.url = sysPassApp.util.getUrl(ajaxUrl.entrypoint, + { + r: [$obj.data("action-route"), $obj.data("item-id")], + sk: sysPassApp.sk.get(), + isAjax: 1 + }); + + sysPassApp.requests.getActionCall(opts, function (json) { + sysPassApp.msg.out(json); + + if (json.status === 0) { + getContent({r: $obj.data("action-next")}); + } + }); } } }); @@ -1434,7 +1449,30 @@ sysPass.Actions = function (log) { log.info("plugin:nav"); grid.nav($obj); - } + }, + delete: function ($obj) { + log.info("plugin:delete"); + + grid.delete($obj, function (items) { + const opts = sysPassApp.requests.getRequestOpts(); + opts.method = "get"; + opts.url = sysPassApp.util.getUrl(ajaxUrl.entrypoint, + { + r: [$obj.data("action-route"), (items.length === 0 ? $obj.data("item-id") : null)], + sk: sysPassApp.sk.get(), + isAjax: 1 + }); + opts.data = {items: items}; + + sysPassApp.requests.getActionCall(opts, function (json) { + sysPassApp.msg.out(json); + + if (json.status === 0) { + getContent({r: $obj.data("action-next")}); + } + }); + }); + }, }; /** diff --git a/public/js/app-actions.min.js b/public/js/app-actions.min.js index 398affc5..61c0753e 100644 --- a/public/js/app-actions.min.js +++ b/public/js/app-actions.min.js @@ -2,16 +2,16 @@ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(c,k,e){c $jscomp.getGlobal=function(c){return"undefined"!=typeof window&&window===c?c:"undefined"!=typeof global&&null!=global?global:c};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(c,k,e,f){if(k){e=$jscomp.global;c=c.split(".");for(f=0;f'+b+""),c=d.find("img");if(0===c.length)return h(b); -c.hide();$.magnificPopup.open({items:{src:d,type:"inline"},callbacks:{open:function(){var a=this;c.on("click",function(){a.close()});setTimeout(function(){var a=sysPassApp.util.resizeImage(c);d.css({backgroundColor:"#fff",width:a.width,height:"auto"});c.show("slow")},500)}}})},q=function(){$.magnificPopup.close()},m={view:function(a){c.info("account:show");f({r:[a.data("action-route"),a.data("item-id")]},"account")},viewHistory:function(a){c.info("account:showHistory");f({r:[a.data("action-route"), +d.scrollTop()&&d.animate({scrollTop:0},1E3)})},h=function(a,b){$.magnificPopup.open({items:{src:a||"",type:"inline"},callbacks:{open:function(){var a=$("#box-popup");sysPassApp.triggers.views.common(a);void 0!==b&&"function"===typeof b.open&&b.open();a.find("form input:visible:first").focus()},close:function(){void 0!==b&&"function"===typeof b.close&&b.close()}},showCloseBtn:!1})},p=function(a,b){var d=$('
'+b+"
"),m=d.find("img");if(0===m.length)return h(b); +m.hide();$.magnificPopup.open({items:{src:d,type:"inline"},callbacks:{open:function(){var a=this;m.on("click",function(){a.close()});setTimeout(function(){var a=sysPassApp.util.resizeImage(m);d.css({backgroundColor:"#fff",width:a.width,height:"auto"});m.show("slow")},500)}}})},q=function(){$.magnificPopup.close()},n={view:function(a){c.info("account:show");f({r:[a.data("action-route"),a.data("item-id")]},"account")},viewHistory:function(a){c.info("account:showHistory");f({r:[a.data("action-route"), a.val()]},"account")},edit:function(a){c.info("account:edit");f({r:[a.data("action-route"),a.data("item-id")]},"account")},delete:function(a){c.info("account:delete");var b='

'+sysPassApp.config.LANG[3]+"

";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(d){d=sysPassApp.requests.getRequestOpts(); -d.url=e.entrypoint;d.data={r:"account/saveDelete/"+a.data("item-id"),sk:sysPassApp.sk.get()};sysPassApp.requests.getActionCall(d,function(d){sysPassApp.msg.out(d);sysPassApp.sk.set(d.csrf);m.search(a)})}}})},viewPass:function(a){c.info("account:viewPass");var b=a.data("parent-id")||0,d=0===b?a.data("item-id"):b,n=sysPassApp.requests.getRequestOpts();n.method="get";n.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),d,b],sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(n, -function(a){0!==a.status?sysPassApp.msg.out(a):(a=$(a.data.html),h(a),k=setTimeout(function(){q()},3E4),a.on("mouseleave",function(){clearTimeout(k);k=setTimeout(function(){q()},3E4)}).on("mouseenter",function(){0!==k&&clearTimeout(k)}))})},viewPassHistory:function(a){c.info("account:viewPassHistory");m.viewPass(a)},copyPass:function(a){c.info("account:copyPass");var b=a.data("parent-id");b=0===b?a.data("item-id"):b;var d=sysPassApp.requests.getRequestOpts();d.method="get";d.async=!1;d.url=sysPassApp.util.getUrl(e.entrypoint, -{r:[a.data("action-route"),b],sk:sysPassApp.sk.get(),isAjax:1});return sysPassApp.requests.getActionCall(d)},copyPassHistory:function(a){c.info("account:copyPassHistory");m.copyPassHistory(a)},copy:function(a){c.info("account:copy");f({r:[a.data("action-route"),a.data("item-id")]},"account")},saveFavorite:function(a,b){c.info("account:saveFavorite");var d="on"===a.data("status"),n=d?a.data("action-route-off"):a.data("action-route-on"),t=sysPassApp.requests.getRequestOpts();t.url=e.entrypoint;t.data= -{r:n+"/"+a.data("item-id"),sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(t,function(c){sysPassApp.msg.out(c);0===c.status&&(a.data("status",d?"off":"on"),"function"===typeof b&&b())})},request:function(a){c.info("account:request");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route")+"/"+a.data("item-id");b.data=a.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&void 0!== -a.data.nextAction&&(sysPassApp.sk.set(a.csrf),f({r:a.data.nextAction},"account"))})},menu:function(a){a.hide();a.parent().children(".actions-optional").show(250)},sort:function(a){c.info("account:sort");var b=$("#frmSearch");b.find('input[name="skey"]').val(a.data("key"));b.find('input[name="sorder"]').val(a.data("dir"));b.find('input[name="start"]').val(a.data("start"));m.search()},editPass:function(a){c.info("account:editpass");var b=a.data("parent-id");b=void 0===b?a.data("item-id"):b;f({r:[a.data("action-route"), +d.url=e.entrypoint;d.data={r:"account/saveDelete/"+a.data("item-id"),sk:sysPassApp.sk.get()};sysPassApp.requests.getActionCall(d,function(d){sysPassApp.msg.out(d);sysPassApp.sk.set(d.csrf);n.search(a)})}}})},viewPass:function(a){c.info("account:viewPass");var b=a.data("parent-id")||0,d=0===b?a.data("item-id"):b,m=sysPassApp.requests.getRequestOpts();m.method="get";m.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),d,b],sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(m, +function(a){0!==a.status?sysPassApp.msg.out(a):(a=$(a.data.html),h(a),k=setTimeout(function(){q()},3E4),a.on("mouseleave",function(){clearTimeout(k);k=setTimeout(function(){q()},3E4)}).on("mouseenter",function(){0!==k&&clearTimeout(k)}))})},viewPassHistory:function(a){c.info("account:viewPassHistory");n.viewPass(a)},copyPass:function(a){c.info("account:copyPass");var b=a.data("parent-id");b=0===b?a.data("item-id"):b;var d=sysPassApp.requests.getRequestOpts();d.method="get";d.async=!1;d.url=sysPassApp.util.getUrl(e.entrypoint, +{r:[a.data("action-route"),b],sk:sysPassApp.sk.get(),isAjax:1});return sysPassApp.requests.getActionCall(d)},copyPassHistory:function(a){c.info("account:copyPassHistory");n.copyPassHistory(a)},copy:function(a){c.info("account:copy");f({r:[a.data("action-route"),a.data("item-id")]},"account")},saveFavorite:function(a,b){c.info("account:saveFavorite");var d="on"===a.data("status"),m=d?a.data("action-route-off"):a.data("action-route-on"),t=sysPassApp.requests.getRequestOpts();t.url=e.entrypoint;t.data= +{r:m+"/"+a.data("item-id"),sk:sysPassApp.sk.get(),isAjax:1};sysPassApp.requests.getActionCall(t,function(c){sysPassApp.msg.out(c);0===c.status&&(a.data("status",d?"off":"on"),"function"===typeof b&&b())})},request:function(a){c.info("account:request");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route")+"/"+a.data("item-id");b.data=a.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&void 0!== +a.data.nextAction&&(sysPassApp.sk.set(a.csrf),f({r:a.data.nextAction},"account"))})},menu:function(a){a.hide();a.parent().children(".actions-optional").show(250)},sort:function(a){c.info("account:sort");var b=$("#frmSearch");b.find('input[name="skey"]').val(a.data("key"));b.find('input[name="sorder"]').val(a.data("dir"));b.find('input[name="start"]').val(a.data("start"));n.search()},editPass:function(a){c.info("account:editpass");var b=a.data("parent-id");b=void 0===b?a.data("item-id"):b;f({r:[a.data("action-route"), b]},"account")},saveEditRestore:function(a){c.info("account:restore");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint;b.data={r:a.data("action-route")+"/"+a.data("history-id")+"/"+a.data("item-id"),sk:sysPassApp.sk.get()};sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);void 0!==a.data.itemId&&void 0!==a.data.nextAction&&f({r:[a.data.nextAction,a.data.itemId]},"account")})},listFiles:function(a){c.info("account:getfiles");var b=sysPassApp.requests.getRequestOpts(); -b.method="get";b.type="html";b.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],del:a.data("delete"),sk:sysPassApp.sk.get()});sysPassApp.requests.getActionCall(b,function(b){a.html(b)})},search:function(a){c.info("account:search");var b=$("#frmSearch");b.find("input[name='sk']").val(sysPassApp.sk.get());b.find("input[name='skey']").val();b.find("input[name='sorder']").val();void 0!==a&&b.find("input[name='start']").val(0);a=sysPassApp.requests.getRequestOpts(); +b.method="get";b.type="html";b.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],del:a.data("delete"),sk:sysPassApp.sk.get()});sysPassApp.requests.getActionCall(b,function(d){a.html(d)})},search:function(a){c.info("account:search");var b=$("#frmSearch");b.find("input[name='sk']").val(sysPassApp.sk.get());b.find("input[name='skey']").val();b.find("input[name='sorder']").val();void 0!==a&&b.find("input[name='start']").val(0);a=sysPassApp.requests.getRequestOpts(); a.method="get";a.url=sysPassApp.util.getUrl(e.entrypoint,{r:b.data("action-route")});a.data=b.serialize();sysPassApp.requests.getActionCall(a,function(a){10===a.status&&sysPassApp.msg.out(a);$("#res-content").empty().html(a.data.html)})},save:function(a){c.info("account:save");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route")+"/"+a.data("item-id");b.data=a.serialize();$("select.select-box-tags[data-hash][data-updated=true]").each(function(a,c){b.data+="&"+ c.getAttribute("id")+"_update=1"});sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);void 0!==a.data.itemId&&void 0!==a.data.nextAction&&f({r:[a.data.nextAction,a.data.itemId]},"account")})}},w={logout:function(){sysPassApp.util.redirect("index.php?r=login/logout")},login:function(a){c.info("main:login");var b=sysPassApp.requests.getRequestOpts();b.url=sysPassApp.util.getUrl(e.entrypoint,{r:a.data("route")});b.method="get";b.data=a.serialize();sysPassApp.requests.getActionCall(b, function(b){var d=$(".extra-hidden");switch(b.status){case 0:sysPassApp.util.redirect(b.data.url);break;case 2:sysPassApp.msg.out(b);a.find("input[type='text'],input[type='password']").val("");a.find("input:visible:first").focus();0",c=l.getSelection(a);!1!==c&&mdlDialog().show({text:d,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(a){a.preventDefault();"function"===typeof b&&b(c)}}})},getSelection:function(a){a=a.data("selection");var b=[]; return a&&($(a).find(".is-selected").each(function(){b.push($(this).data("item-id"))}),0===b.length)?!1:b}},v=function(a){var b=$("#taskStatus");b.css("display","block");b.empty().html(sysPassApp.config.LANG[62]);var d=sysPassApp.requests.getRequestOpts();d.method="get";d.url=sysPassApp.util.getUrl(e.entrypoint,{r:["task/runTask",a]});return sysPassApp.requests.getActionEvent(d,function(a){a=a.task+" - "+a.message+" - "+a.time+" - "+a.progress+"%";a+="
"+sysPassApp.config.LANG[62];b.empty().html(a)})}; -return{getContent:f,showFloatingBox:h,closeFloatingBox:q,appMgmt:u,account:m,accountManager:{restore:function(a){c.info("accountManager:restore");g.state.update(a);var b=a.data("item-id"),d=sysPassApp.requests.getRequestOpts();d.method="get";d.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(d,function(d){sysPassApp.msg.out(d);0===d.status&&((d=a.data("action-next"))?f({r:[d,b]}):f({r:g.state.tab.route, +return{getContent:f,showFloatingBox:h,closeFloatingBox:q,appMgmt:u,account:n,accountManager:{restore:function(a){c.info("accountManager:restore");g.state.update(a);var b=a.data("item-id"),d=sysPassApp.requests.getRequestOpts();d.method="get";d.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(d,function(d){sysPassApp.msg.out(d);0===d.status&&((d=a.data("action-next"))?f({r:[d,b]}):f({r:g.state.tab.route, tabIndex:g.state.tab.index}))})}},file:{view:function(a){c.info("file:view");var b=sysPassApp.requests.getRequestOpts();b.method="get";b.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get()});sysPassApp.requests.getActionCall(b,function(b){if(0!==b.status)return sysPassApp.msg.out(b);p(a,b.data.html)})},download:function(a){c.info("file:download");var b=a.data("item-type");a=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")], sk:sysPassApp.sk.get()});"PDF"===b||"application/pdf"===b?window.open(a,"_blank"):$.fileDownload(a,{httpMethod:"GET",successCallback:function(a){sysPassApp.msg.ok(sysPassApp.config.LANG[72])}})},delete:function(a){c.info("file:delete");var b='

'+sysPassApp.config.LANG[15]+"

";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43], -onClick:function(b){b=sysPassApp.requests.getRequestOpts();b.method="get";b.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get()});sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&m.listFiles($("#list-account-files"))})}}})}},checks:{wiki:function(a){c.info("checks:wiki");a=$(a.data("src"));a.find("[name='sk']").val(sysPassApp.sk.get());var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint;b.data=a.serialize(); +onClick:function(b){b=sysPassApp.requests.getRequestOpts();b.method="get";b.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get()});sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&n.listFiles($("#list-account-files"))})}}})}},checks:{wiki:function(a){c.info("checks:wiki");a=$(a.data("src"));a.find("[name='sk']").val(sysPassApp.sk.get());var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint;b.data=a.serialize(); sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&$("#dokuWikiResCheck").html(a.data)})}},config:{save:function(a){c.info("config:save");g.save(a)},masterpass:function(a){var b='

'+sysPassApp.config.LANG[59]+"

";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(b){b.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44]);a.find(":input[type=password]").val("")}},positive:{title:sysPassApp.config.LANG[43], onClick:function(b){var d;(b=a.find("input[name='taskId']").val())&&(d=v(b));var c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint;c.useFullLoading=!!b;c.data=a.serialize();sysPassApp.requests.getActionCall(c,function(b){sysPassApp.msg.out(b);a.find(":input[type=password]").val("");void 0!==d&&d.close()})}}})},backup:function(a){c.info("config:backup");g.state.update(a);var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route");b.useFullLoading=!0;b.data=a.serialize()+ "&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&f({r:g.state.tab.route,tabIndex:g.state.tab.index})})},export:function(a){c.info("config:export");g.save(a)},import:function(a){c.info("config:import");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("action-route");b.data=a.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a)})},refreshMpass:function(a){c.info("config:import"); @@ -48,11 +48,12 @@ b(1)}}})},delete:function(a){c.info("link:delete");var b='

";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b.preventDefault();g.save(a)}}})}},ajaxUrl:e,plugin:{toggle:function(a){c.info("plugin:enable"); g.state.update(a);var b=sysPassApp.requests.getRequestOpts();b.method="get";b.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(b,function(a){sysPassApp.msg.out(a);0===a.status&&setTimeout(function(){sysPassApp.util.redirect("index.php")},2E3)})},reset:function(a){c.info("plugin:reset");var b='

'+sysPassApp.config.LANG[58]+"

";mdlDialog().show({text:b, -negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b.preventDefault();g.save(a)}}})},search:function(a){c.info("plugin:search");l.search(a)},show:function(a){c.info("plugin:show");u.show(a)},save:function(a){c.info("plugin:save");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("route");b.data=a.serialize()+"&sk="+sysPassApp.sk.get(); -sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);0===b.status&&(f({r:a.data("action-next")}),$.magnificPopup.close())})},nav:function(a){c.info("plugin:nav");l.nav(a)}},notification:r,wiki:{show:function(a){c.info("wiki:show");var b=sysPassApp.requests.getRequestOpts();b.method="get";b.url=sysPassApp.util.getUrl(e.entrypoint,{r:a.data("action-route"),pageName:a.data("pagename"),actionId:a.data("action-id"),sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(b, -function(a){0!==a.status?sysPassApp.msg.out(a):h(a.data.html)})}},items:{get:function(a){c.info("items:get");var b=a[0].selectize;b.clearOptions();b.load(function(c){var d=sysPassApp.requests.getRequestOpts();d.method="get";d.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get()});sysPassApp.requests.getActionCall(d,function(d){c(d.data);b.setValue(a.data("selected-id"),!0);sysPassApp.triggers.updateFormHash()})})},update:function(a){c.info("items:update"); -var b=$("#"+a.data("item-dst"))[0].selectize,d=b.getValue();b.clearOptions();b.load(function(c){var f=sysPassApp.requests.getRequestOpts();f.method="get";f.url=sysPassApp.util.getUrl(e.entrypoint,{r:a.data("item-route"),sk:sysPassApp.sk.get()});sysPassApp.requests.getActionCall(f,function(a){c(a);b.setValue(d,!0)})})}},ldap:{check:function(a){c.info("ldap:check");var b=$(a.data("src")),d=sysPassApp.requests.getRequestOpts();d.url=e.entrypoint+"?r="+a.data("action-route");d.data=b.serialize()+"&sk="+ -sysPassApp.sk.get();sysPassApp.requests.getActionCall(d,function(a){sysPassApp.msg.out(a);0===a.status&&void 0!==a.data.template&&void 0!==a.data.items&&h(a.data.template,{open:function(){var b=$("#ldap-results").find(".list-wrap").empty();a.data.items.forEach(function(a){b.append(sysPassApp.theme.html.getList(a.items,a.icon))})}})})},import:function(a){c.info("ldap:import");var b='

'+sysPassApp.config.LANG[57]+"

";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44], -onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b=$(a.data("src"));var c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint+"?r="+a.data("action-route");c.data=b.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(c,function(a){sysPassApp.msg.out(a)})}}})}},track:{unlock:function(a){c.info("track:unlock");var b=sysPassApp.requests.getRequestOpts();b.method="get";b.url= -sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);g.refresh(a)})},clear:function(a){c.info("track:clear");var b='

'+sysPassApp.config.LANG[71]+"

";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43], -onClick:function(b){b.preventDefault();g.save(a)}}})}}}}; +negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b.preventDefault();b=sysPassApp.requests.getRequestOpts();b.method="get";b.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);0===b.status&&f({r:a.data("action-next")})})}}})}, +search:function(a){c.info("plugin:search");l.search(a)},show:function(a){c.info("plugin:show");u.show(a)},save:function(a){c.info("plugin:save");var b=sysPassApp.requests.getRequestOpts();b.url=e.entrypoint+"?r="+a.data("route");b.data=a.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);0===b.status&&(f({r:a.data("action-next")}),$.magnificPopup.close())})},nav:function(a){c.info("plugin:nav");l.nav(a)},delete:function(a){c.info("plugin:delete"); +l.delete(a,function(b){var d=sysPassApp.requests.getRequestOpts();d.method="get";d.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),0===b.length?a.data("item-id"):null],sk:sysPassApp.sk.get(),isAjax:1});d.data={items:b};sysPassApp.requests.getActionCall(d,function(b){sysPassApp.msg.out(b);0===b.status&&f({r:a.data("action-next")})})})}},notification:r,wiki:{show:function(a){c.info("wiki:show");var b=sysPassApp.requests.getRequestOpts();b.method="get";b.url=sysPassApp.util.getUrl(e.entrypoint, +{r:a.data("action-route"),pageName:a.data("pagename"),actionId:a.data("action-id"),sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(b,function(a){0!==a.status?sysPassApp.msg.out(a):h(a.data.html)})}},items:{get:function(a){c.info("items:get");var b=a[0].selectize;b.clearOptions();b.load(function(d){var c=sysPassApp.requests.getRequestOpts();c.method="get";c.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get()});sysPassApp.requests.getActionCall(c, +function(c){d(c.data);b.setValue(a.data("selected-id"),!0);sysPassApp.triggers.updateFormHash()})})},update:function(a){c.info("items:update");var b=$("#"+a.data("item-dst"))[0].selectize,d=b.getValue();b.clearOptions();b.load(function(c){var f=sysPassApp.requests.getRequestOpts();f.method="get";f.url=sysPassApp.util.getUrl(e.entrypoint,{r:a.data("item-route"),sk:sysPassApp.sk.get()});sysPassApp.requests.getActionCall(f,function(a){c(a);b.setValue(d,!0)})})}},ldap:{check:function(a){c.info("ldap:check"); +var b=$(a.data("src")),d=sysPassApp.requests.getRequestOpts();d.url=e.entrypoint+"?r="+a.data("action-route");d.data=b.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(d,function(a){sysPassApp.msg.out(a);0===a.status&&void 0!==a.data.template&&void 0!==a.data.items&&h(a.data.template,{open:function(){var b=$("#ldap-results").find(".list-wrap").empty();a.data.items.forEach(function(a){b.append(sysPassApp.theme.html.getList(a.items,a.icon))})}})})},import:function(a){c.info("ldap:import"); +var b='

'+sysPassApp.config.LANG[57]+"

";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44],onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b=$(a.data("src"));var c=sysPassApp.requests.getRequestOpts();c.url=e.entrypoint+"?r="+a.data("action-route");c.data=b.serialize()+"&sk="+sysPassApp.sk.get();sysPassApp.requests.getActionCall(c,function(a){sysPassApp.msg.out(a)})}}})}}, +track:{unlock:function(a){c.info("track:unlock");var b=sysPassApp.requests.getRequestOpts();b.method="get";b.url=sysPassApp.util.getUrl(e.entrypoint,{r:[a.data("action-route"),a.data("item-id")],sk:sysPassApp.sk.get(),isAjax:1});sysPassApp.requests.getActionCall(b,function(b){sysPassApp.msg.out(b);g.refresh(a)})},clear:function(a){c.info("track:clear");var b='

'+sysPassApp.config.LANG[71]+"

";mdlDialog().show({text:b,negative:{title:sysPassApp.config.LANG[44], +onClick:function(a){a.preventDefault();sysPassApp.msg.error(sysPassApp.config.LANG[44])}},positive:{title:sysPassApp.config.LANG[43],onClick:function(b){b.preventDefault();g.save(a)}}})}}}}; diff --git a/tests/SP/Services/Install/InstallerTest.php b/tests/SP/Services/Install/InstallerTest.php index 37bbaa71..d14d2944 100644 --- a/tests/SP/Services/Install/InstallerTest.php +++ b/tests/SP/Services/Install/InstallerTest.php @@ -279,7 +279,9 @@ class InstallerTest extends TestCase $installer = self::$dic->get(Installer::class); $installer->run($params); - $this->assertTrue(\SP\Storage\Database\DatabaseUtil::checkDatabaseExist(self::$dic->get(DBStorageInterface::class), self::DB_NAME)); + $databaseUtil = new \SP\Storage\Database\DatabaseUtil(self::$dic->get(DBStorageInterface::class)); + + $this->assertTrue($databaseUtil->checkDatabaseTables(self::DB_NAME)); $configData = self::$dic->get(Config::class)->getConfigData();