diff options
Diffstat (limited to 'modules-available/sysconfig/page.inc.php')
-rw-r--r-- | modules-available/sysconfig/page.inc.php | 165 |
1 files changed, 53 insertions, 112 deletions
diff --git a/modules-available/sysconfig/page.inc.php b/modules-available/sysconfig/page.inc.php index 05a83924..b11f399e 100644 --- a/modules-available/sysconfig/page.inc.php +++ b/modules-available/sysconfig/page.inc.php @@ -22,39 +22,6 @@ class Page_SysConfig extends Page private $haveOverriddenLocations = false; - /** - * Add a known configuration module. Every addmoule_* file should call this - * for its module provided. - * - * @param string $id Internal identifier for the module - * @param string $startClass Class to start wizard for creating such a module - * @param string $title Title of this module type - * @param string $description Description for this module type - * @param string $group Title for group this module type belongs to - * @param bool $unique Can only one such module be added to a config? - * @param int $sortOrder Lower comes first, alphabetical ordering otherwiese - */ - public static function addModule($id, $startClass, $title, $description, $group, $unique, $sortOrder = 0) - { - self::$moduleTypes[$id] = array( - 'startClass' => $startClass, - 'title' => $title, - 'description' => $description, - 'group' => $group, - 'unique' => $unique, - 'sortOrder' => $sortOrder - ); - } - - /** - * - * @return array All registered module types - */ - public static function getModuleTypes() - { - return self::$moduleTypes; - } - protected function doPreprocess() { User::load(); @@ -146,7 +113,7 @@ class Page_SysConfig extends Page Render::addTemplate('sysconfig_heading'); - $action = Request::any('action', 'list'); + $action = Request::any('action', 'list', 'string'); switch ($action) { case 'addmodule': User::assertPermission('module.edit'); @@ -177,25 +144,20 @@ class Page_SysConfig extends Page return; case 'module': User::assertPermission('module.view-list'); - $listid = Request::post('list'); - if ($listid !== false) { - $this->listModuleContents($listid); - return; - } - break; + $listid = Request::post('list', Request::REQUIRED, 'int'); + $this->listModuleContents($listid); + return; case 'config': User::assertPermission('config.view-list'); - $listid = Request::post('list'); - if ($listid !== false) { - $this->listConfigContents($listid); - return; - } - break; + $listid = Request::post('list', Request::REQUIRED, 'int'); + $this->listConfigContents($listid); + return; + default: } Message::addError('invalid-action', $action, 'main'); } - private function getLocationNames($locations, $ids) + private function getLocationNames(array $locations, array $ids): string { $ret = array(); foreach ($ids as $id) { @@ -213,12 +175,12 @@ class Page_SysConfig extends Page private function listConfigs() { // Configs - $res = Database::simpleQuery("SELECT c.configid, c.title, c.filepath, c.status, c.dateline, - GROUP_CONCAT(DISTINCT cl.locationid) AS loclist, GROUP_CONCAT(cxm.moduleid) AS modlist + $res = Database::simpleQuery("SELECT c.configid, c.title, c.filepath, c.status, c.dateline, c.warnings, + GROUP_CONCAT(DISTINCT cl.locationid) AS loclist, GROUP_CONCAT(DISTINCT cxm.moduleid) AS modlist FROM configtgz c LEFT JOIN configtgz_x_module cxm USING (configid) LEFT JOIN configtgz_location cl ON (c.configid = cl.configid) - GROUP BY configid + GROUP BY configid, title ORDER BY title ASC"); $configs = array(); if ($this->currentLoc !== 0) { @@ -227,7 +189,7 @@ class Page_SysConfig extends Page $locationName = false; } $hasDefault = false; - while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + foreach ($res as $row) { if (is_null($row['loclist'])) { $locList = array(); } else { @@ -247,6 +209,8 @@ class Page_SysConfig extends Page $this->haveOverriddenLocations = true; } $configs[] = array( + 'warnings' => $row['warnings'], + 'warnings_hidden' => (!empty($row['warnings']) && $row['status'] === 'OK') ? '' : 'hidden', 'configid' => $row['configid'], 'config' => $row['title'], 'modlist' => $row['modlist'], @@ -273,7 +237,7 @@ class Page_SysConfig extends Page private function listModules() { // Config modules - $modules = ConfigModule::getAll(); + $modules = ConfigModule::getAll() ?? []; $types = array_map(function ($mod) { return $mod->moduleType(); }, $modules); $titles = array_map(function ($mod) { return $mod->title(); }, $modules); array_multisort($types, SORT_ASC, $titles, SORT_ASC, $modules); @@ -304,27 +268,7 @@ class Page_SysConfig extends Page Taskmanager::addErrorMessage($status); Util::redirect('?do=sysconfig&locationid=' . $this->currentLoc); } - - // Sort files for better display - $dirs = array(); - foreach ($status['data']['entries'] as $file) { - if ($file['isdir']) - continue; - $dirs[dirname($file['name'])][] = $file; - } - ksort($dirs); - $list = array(); - foreach ($dirs as $dir => $files) { - $list[] = array( - 'name' => $dir, - 'isdir' => true - ); - sort($files); - foreach ($files as $file) { - $file['size'] = Util::readableFileSize($file['size']); - $list[] = $file; - } - } + $list = SysConfig::archiveContentsFromTask($status); // render the template Render::addDialog(Dictionary::translate('lang_contentOf') . ' ' . $row['title'], false, 'custom-filelist', array( @@ -348,7 +292,7 @@ class Page_SysConfig extends Page . " ORDER BY module.title ASC", array('configid' => $configid)); $modules = array(); - while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + foreach ($res as $row) { $modules[] = array( 'module' => $row['moduletitle'], 'moduleid' => $row['moduleid'] @@ -363,11 +307,7 @@ class Page_SysConfig extends Page private function activateConfig() { - $configid = Request::post('activate', false, 'int'); - if ($configid === false) { - Message::addError('main.empty-field'); - Util::redirect('?do=sysconfig&locationid=' . $this->currentLoc); - } + $configid = Request::post('activate', Request::REQUIRED, 'int'); // Validate that either the configid is valid (in case we override for a specific location) // or that if the locationid is 0 (=global) that the configid exists, because it's not allowed // to unset the global config @@ -386,15 +326,18 @@ class Page_SysConfig extends Page Database::exec("INSERT INTO configtgz_location (locationid, configid) VALUES (:locationid, :configid)" . " ON DUPLICATE KEY UPDATE configid = :configid", compact('locationid', 'configid')); } - Event::activeConfigChanged(); + $task = ConfigModuleBaseLdap::ldadp(); + if ($task !== false) { + TaskmanagerCallback::addCallback($task, 'ldadpStartup'); + } Util::redirect('?do=sysconfig&locationid=' . $this->currentLoc); } private function rebuildConfig() { - $configid = Request::post('rebuild', 'MISSING'); + $configid = Request::post('rebuild', Request::REQUIRED, 'int'); $config = ConfigTgz::get($configid); - if ($config === false) { + if ($config === null) { Message::addError('config-invalid', $configid); Util::redirect('?do=sysconfig&locationid=' . $this->currentLoc); } @@ -410,21 +353,19 @@ class Page_SysConfig extends Page private function delModule() { - $moduleid = Request::post('del', 'MISSING'); - $row = Database::queryFirst("SELECT title, filepath FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid)); - if ($row === false) { + $moduleid = Request::post('del', Request::REQUIRED, 'int'); + $module = Database::queryFirst("SELECT title, filepath FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid)); + if ($module === false) { Message::addError('config-invalid', $moduleid); Util::redirect('?do=sysconfig'); } - $existing = Database::queryFirst("SELECT title FROM configtgz_x_module" - . " INNER JOIN configtgz USING (configid)" - . " WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid)); - if ($existing !== false) { - Message::addError('module-in-use', $row['title'], $existing['title']); - Util::redirect('?do=sysconfig'); - } + // Get config.tgz using this module *before* deleting it + $existing = Database::simpleQuery("SELECT configid FROM configtgz_x_module + WHERE moduleid = :moduleid", array('moduleid' => $moduleid)); + // Delete DB entries and file + Database::exec("DELETE FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid)); $task = Taskmanager::submit('DeleteFile', array( - 'file' => $row['filepath'] + 'file' => $module['filepath'] )); if (isset($task['statusCode']) && $task['statusCode'] === Taskmanager::TASK_WAITING) { $task = Taskmanager::waitComplete($task['id']); @@ -432,15 +373,21 @@ class Page_SysConfig extends Page if (!isset($task['statusCode']) || $task['statusCode'] === Taskmanager::TASK_ERROR) { Message::addWarning('main.task-error', $task['data']['error']); } elseif ($task['statusCode'] === Taskmanager::TASK_FINISHED) { - Message::addSuccess('module-deleted', $row['title']); + Message::addSuccess('module-deleted', $module['title']); + } + // Rebuild depending config.tgz + foreach ($existing as $crow) { + $config = ConfigTgz::get($crow['configid']); + if ($config !== null) { + $config->generate(); + } } - Database::exec("DELETE FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid)); Util::redirect('?do=sysconfig'); } private function downloadModule() { - $moduleid = Request::post('download', 'MISSING'); + $moduleid = Request::post('download', Request::REQUIRED); $row = Database::queryFirst("SELECT title, filepath FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid)); if ($row === false) { Message::addError('config-invalid', $moduleid); @@ -453,13 +400,13 @@ class Page_SysConfig extends Page private function rebuildModule() { - $moduleid = Request::post('rebuild', 'MISSING'); + $moduleid = Request::post('rebuild', Request::REQUIRED); $module = ConfigModule::get($moduleid); - if ($module === false) { + if ($module === null) { Message::addError('config-invalid', $moduleid); Util::redirect('?do=sysconfig'); } - $ret = $module->generate(false, 250); + $ret = $module->generate(false, null, 500); if ($ret === true) Message::addSuccess('module-rebuilt', $module->title()); elseif ($ret === false) @@ -471,13 +418,15 @@ class Page_SysConfig extends Page private function delConfig() { - $configid = Request::post('del', 'MISSING'); + $configid = Request::post('del', Request::REQUIRED); $config = ConfigTgz::get($configid); - if ($config === false) { + if ($config === null) { Message::addError('config-invalid', $configid); Util::redirect('?do=sysconfig&locationid=' . $this->currentLoc); } - if ($config->delete() !== false) { + if ($config->delete() === false) { + Message::addError('config-delete-error', Database::lastError()); + } else { Message::addSuccess('config-deleted', $config->title()); } Util::redirect('?do=sysconfig&locationid=' . $this->currentLoc); @@ -515,22 +464,14 @@ class Page_SysConfig extends Page if (Request::post('action') === 'status') { $mods = Request::post('mods'); $confs = Request::post('confs'); - $outMods = array(); - $outConfs = array(); $mods = explode(',', $mods); $confs = explode(',', $confs); // Mods - $res = Database::simpleQuery("SELECT moduleid FROM configtgz_module + $outMods = Database::queryAll("SELECT moduleid AS id FROM configtgz_module WHERE moduleid in (:mods) AND status = 'OK'", compact('mods')); - while ($row = $res->fetch(PDO::FETCH_ASSOC)) { - $outMods[] = $row['moduleid']; - } // Confs - $res = Database::simpleQuery("SELECT configid FROM configtgz + $outConfs = Database::queryAll("SELECT configid AS id, warnings FROM configtgz WHERE configid in (:confs) AND status = 'OK'", compact('confs')); - while ($row = $res->fetch(PDO::FETCH_ASSOC)) { - $outConfs[] = $row['configid']; - } Header('Content-Type: application/json'); die(json_encode(array('mods' => $outMods, 'confs' => $outConfs))); } |