/** * Dispatch a module view request. * * @return mixed */ public function dispatch() { if (!SecurityUtil::checkPermission('Extensions::', '::', ACCESS_ADMIN)) { return LogUtil::registerPermissionError(); } // Get input. $moduleName = $this->request->getGet()->filter('_module', null, FILTER_SANITIZE_STRING); $pluginName = $this->request->getGet()->filter('_plugin', null, FILTER_SANITIZE_STRING); $action = $this->request->getGet()->filter('_action', null, FILTER_SANITIZE_STRING); // Load plugins. if (!$moduleName) { $type = 'SystemPlugin'; PluginUtil::loadAllSystemPlugins(); } else { $type = 'ModulePlugin'; PluginUtil::loadAllModulePlugins(); } if ($moduleName) { $serviceId = PluginUtil::getServiceId("{$type}_{$moduleName}_{$pluginName}_Plugin"); } else { $serviceId = PluginUtil::getServiceId("{$type}_{$pluginName}_Plugin"); } $this->throwNotFoundUnless($this->serviceManager->hasService($serviceId)); $this->plugin = $this->serviceManager->getService($serviceId); // Sanity checks. $this->throwNotFoundUnless($this->plugin->isInstalled(), __f('Plugin "%s" is not installed', $this->plugin->getMetaDisplayName())); $this->throwForbiddenUnless($this->plugin instanceof Zikula_Plugin_ConfigurableInterface, __f('Plugin "%s" is not configurable', $this->plugin->getMetaDisplayName())); $this->pluginController = $this->plugin->getConfigurationController(); $this->throwNotFoundUnless($this->pluginController->getReflection()->hasMethod($action)); return $this->pluginController->{$action}(); }
private function installPlugins() { $result = true; $systemPlugins = \PluginUtil::loadAllSystemPlugins(); foreach ($systemPlugins as $plugin) { $result = $result && \PluginUtil::install($plugin); } return $result; }
/** * Install controller. * * @return void */ function install(Core $core) { define('_ZINSTALLVER', Core::VERSION_NUM); $serviceManager = $core->getContainer(); $eventManager = $core->getDispatcher(); // Lazy load DB connection to avoid testing DSNs that are not yet valid (e.g. no DB created yet) $dbEvent = new GenericEvent(null, array('lazy' => true)); $eventManager->dispatch('doctrine.init_connection', $dbEvent); $core->init(Core::STAGE_ALL & ~Core::STAGE_THEME & ~Core::STAGE_MODS & ~Core::STAGE_LANGS & ~Core::STAGE_DECODEURLS & ~Core::STAGE_SESSIONS); // Power users might have moved the temp folder out of the root and changed the config.php // accordingly. Make sure we respect this security related settings $tempDir = isset($GLOBALS['ZConfig']['System']['temp']) ? $GLOBALS['ZConfig']['System']['temp'] : 'ztemp'; // define our smarty object $smarty = new Smarty(); $smarty->caching = false; $smarty->compile_check = true; $smarty->left_delimiter = '{'; $smarty->right_delimiter = '}'; $smarty->compile_dir = $tempDir . '/view_compiled'; $smarty->template_dir = 'install/templates'; $smarty->plugins_dir = array('plugins', 'install/templates/plugins'); $smarty->clear_compiled_tpl(); file_put_contents("{$tempDir}/view_compiled/index.html", ''); $lang = FormUtil::getPassedValue('lang', '', 'GETPOST'); $dbhost = FormUtil::getPassedValue('dbhost', '', 'GETPOST'); $dbusername = FormUtil::getPassedValue('dbusername', '', 'GETPOST'); $dbpassword = FormUtil::getPassedValue('dbpassword', '', 'GETPOST'); $dbname = FormUtil::getPassedValue('dbname', '', 'GETPOST'); $dbprefix = ''; $dbdriver = FormUtil::getPassedValue('dbdriver', '', 'GETPOST'); $dbtabletype = FormUtil::getPassedValue('dbtabletype', '', 'GETPOST'); $username = FormUtil::getPassedValue('username', '', 'POST'); $password = FormUtil::getPassedValue('password', '', 'POST'); $repeatpassword = FormUtil::getPassedValue('repeatpassword', '', 'POST'); $email = FormUtil::getPassedValue('email', '', 'GETPOST'); $action = FormUtil::getPassedValue('action', '', 'GETPOST'); $notinstalled = isset($_GET['notinstalled']); $installedState = isset($GLOBALS['ZConfig']['System']['installed']) ? $GLOBALS['ZConfig']['System']['installed'] : 0; // If somehow we are browsing the not installed page but installed, redirect back to homepage if ($installedState && $notinstalled) { $response = new RedirectResponse(System::getHomepageUrl()); return $response->send(); } // see if the language was already selected $languageAlreadySelected = $lang ? true : false; if (!$notinstalled && $languageAlreadySelected && empty($action)) { $response = new RedirectResponse(System::getBaseUri() . "/install.php?action=requirements&lang={$lang}"); return $response->send(); } // see if the language was already selected $languageAlreadySelected = $lang ? true : false; if (!$notinstalled && $languageAlreadySelected && empty($action)) { $response = new RedirectResponse(System::getBaseUri() . "/install.php?action=requirements&lang={$lang}"); return $response->send(); } // load the installer language files if (empty($lang)) { if (is_readable('config/installer.ini')) { $test = parse_ini_file('config/installer.ini'); $lang = isset($test['language']) ? $test['language'] : 'en'; } else { $available = ZLanguage::getInstalledLanguages(); $detector = new ZLanguageBrowser($available); $lang = $detector->discover(); } $lang = DataUtil::formatForDisplay($lang); } // setup multilingual $GLOBALS['ZConfig']['System']['language_i18n'] = $lang; $GLOBALS['ZConfig']['System']['multilingual'] = true; $GLOBALS['ZConfig']['System']['languageurl'] = true; $GLOBALS['ZConfig']['System']['language_detect'] = false; $serviceManager->loadArguments($GLOBALS['ZConfig']['System']); $_lang = ZLanguage::getInstance(); $_lang->setup(); $lang = ZLanguage::getLanguageCode(); $installbySQL = file_exists("install/sql/custom-{$lang}.sql") ? "install/sql/custom-{$lang}.sql" : false; $smarty->assign('lang', $lang); $smarty->assign('installbySQL', $installbySQL); $smarty->assign('langdirection', ZLanguage::getDirection()); $smarty->assign('charset', ZLanguage::getEncoding()); // show not installed case if ($notinstalled) { header('HTTP/1.1 503 Service Unavailable'); $smarty->display('notinstalled.tpl'); $smarty->clear_compiled_tpl(); file_put_contents("{$tempDir}/view_compiled/index.html", ''); exit; } // assign the values from config.php $smarty->assign($GLOBALS['ZConfig']['System']); // if the system is already installed, halt. if ($GLOBALS['ZConfig']['System']['installed']) { _installer_alreadyinstalled($smarty); } // check for an empty action - if so then show the first installer page if (empty($action)) { $action = 'lang'; } // perform tasks based on our action switch ($action) { case 'processBDInfo': $dbname = trim($dbname); $dbusername = trim($dbusername); if (empty($dbname) || empty($dbusername)) { $action = 'dbinformation'; $smarty->assign('dbconnectmissing', true); } elseif (!preg_match('/^[\\w-]*$/', $dbname) || strlen($dbname) > 64) { $action = 'dbinformation'; $smarty->assign('dbinvalidname', true); } else { update_config_php($dbhost, $dbusername, $dbpassword, $dbname, $dbdriver, $dbtabletype); update_installed_status(0); try { $dbh = new PDO("{$dbdriver}:host={$dbhost};dbname={$dbname}", $dbusername, $dbpassword); } catch (PDOException $e) { $action = 'dbinformation'; $smarty->assign('reason', $e->getMessage()); $smarty->assign('dbconnectfailed', true); } } if ($action != 'dbinformation') { $action = 'createadmin'; } break; case 'finish': if (!$username || preg_match('/[^\\p{L}\\p{N}_\\.\\-]/u', $username)) { $action = 'createadmin'; $smarty->assign('uservalidatefailed', true); $smarty->assign(array('username' => $username, 'password' => $password, 'repeatpassword' => $repeatpassword, 'email' => $email)); } elseif (mb_strlen($password) < 7) { $action = 'createadmin'; $smarty->assign('badpassword', true); $smarty->assign(array('username' => $username, 'password' => $password, 'repeatpassword' => $repeatpassword, 'email' => $email)); } elseif ($password !== $repeatpassword) { $action = 'createadmin'; $smarty->assign('passwordcomparefailed', true); $smarty->assign(array('username' => $username, 'password' => $password, 'repeatpassword' => $repeatpassword, 'email' => $email)); } elseif (!validateMail($email)) { $action = 'createadmin'; $smarty->assign('emailvalidatefailed', true); $smarty->assign(array('username' => $username, 'password' => $password, 'repeatpassword' => $repeatpassword, 'email' => $email)); } else { $installedOk = false; // if it is the distribution and the process have not failed in a previous step if ($installbySQL) { // checks if exists a previous installation with the same prefix $proceed = true; $dbnameConfig = $GLOBALS['ZConfig']['DBInfo']['databases']['default']['dbname']; $exec = $dbdriver == 'mysql' || $dbdriver == 'mysqli' ? "SHOW TABLES FROM `{$dbnameConfig}` LIKE '%'" : "SHOW TABLES FROM {$dbnameConfig} LIKE '%'"; $tables = DBUtil::executeSQL($exec); if ($tables->rowCount() > 0) { $proceed = false; $action = 'dbinformation'; $smarty->assign('dbexists', true); } if ($proceed) { // checks if file exists if (!file_exists($installbySQL)) { $action = 'dbinformation'; $smarty->assign('dbdumpfailed', true); } else { // execute the SQL dump $lines = file($installbySQL); $exec = ''; foreach ($lines as $line_num => $line) { $line = trim($line); if (empty($line) || strpos($line, '--') === 0) { continue; } $exec .= $line; if (strrpos($line, ';') === strlen($line) - 1) { if (!DBUtil::executeSQL($exec)) { $action = 'dbinformation'; $smarty->assign('dbdumpfailed', true); break; } $exec = ''; } } ModUtil::dbInfoLoad('Users', 'Users'); ModUtil::dbInfoLoad('Extensions', 'Extensions'); ModUtil::initCoreVars(true); createuser($username, $password, $email); $installedOk = true; } } } else { installmodules($lang); createuser($username, $password, $email); $installedOk = true; } if ($installedOk) { // create our new site admin // TODO: Email username/password to administrator email address. Cannot use ModUtil::apiFunc for this. $serviceManager->get('session')->start(); $authenticationInfo = array('login_id' => $username, 'pass' => $password); $authenticationMethod = array('modname' => 'Users', 'method' => 'uname'); UserUtil::loginUsing($authenticationMethod, $authenticationInfo); // add admin email as site email System::setVar('adminmail', $email); if (!$installbySQL) { Theme_Util::regenerate(); } // set site status as installed and protect config.php file update_installed_status(1); @chmod('config/config.php', 0400); if (!is_readable('config/config.php')) { @chmod('config/config.php', 0440); if (!is_readable('config/config.php')) { @chmod('config/config.php', 0444); } } // install all plugins $systemPlugins = PluginUtil::loadAllSystemPlugins(); foreach ($systemPlugins as $plugin) { PluginUtil::install($plugin); } LogUtil::registerStatus(__('Congratulations! Zikula has been successfullly installed.')); $response = new RedirectResponse(ModUtil::url('Admin', 'admin', 'adminpanel')); $response->send(); exit; } } break; case 'requirements': $checks = _check_requirements(); $ok = true; foreach ($checks as $check) { if (!$check) { $ok = false; break; } } foreach ($checks['files'] as $check) { if (!$check['writable']) { $ok = false; break; } } if ($ok) { $response = new RedirectResponse(System::getBaseUri() . "/install.php?action=dbinformation&lang={$lang}"); $response->send(); exit; } $smarty->assign('checks', $checks); break; } // check our action template exists $action = DataUtil::formatForOS($action); if ($smarty->template_exists("installer_{$action}.tpl")) { $smarty->assign('action', $action); $templateName = "installer_{$action}.tpl"; } else { $smarty->assign('action', 'error'); $templateName = 'installer_error.tpl'; } $smarty->assign('maincontent', $smarty->fetch($templateName)); $smarty->display('installer_page.tpl'); $smarty->clear_compiled_tpl(); file_put_contents("{$tempDir}/view_compiled/index.html", ''); }
/** * Lists all plugins. * @return string HTML output string */ public function viewPlugins() { // Security check if (!SecurityUtil::checkPermission('Extensions::', '::', ACCESS_ADMIN)) { return LogUtil::registerPermissionError(); } $state = FormUtil::getPassedValue('state', -1, 'GETPOST'); $sort = FormUtil::getPassedValue('sort', null, 'GETPOST'); $module = FormUtil::getPassedValue('bymodule', null, 'GETPOST'); $systemplugins = FormUtil::getPassedValue('systemplugins', false, 'GETPOST')? true : null; $this->view->assign('state', $state); // generate an auth key to use in urls $csrfToken = SecurityUtil::generateCsrfToken($this->serviceManager, true); $plugins = array(); $pluginClasses = ($systemplugins) ? PluginUtil::loadAllSystemPlugins() : PluginUtil::loadAllModulePlugins(); foreach ($pluginClasses as $className) { $instance = PluginUtil::loadPlugin($className); $pluginstate = PluginUtil::getState($instance->getServiceId(), PluginUtil::getDefaultState()); // Tweak UI if the plugin is AlwaysOn if ($instance instanceof Zikula_Plugin_AlwaysOnInterface) { $pluginstate['state'] = PluginUtil::ENABLED; $pluginstate['version'] = $instance->getMetaVersion(); } // state filer if ($state >= 0 && $pluginstate['state'] != $state) { continue; } // module filter if (!empty($module) && $instance->getModuleName() != $module) { continue; } $actions = array(); // Translate state switch ($pluginstate['state']) { case PluginUtil::NOTINSTALLED: $status = $this->__('Not installed'); $statusimage = 'redled.png'; $actions[] = array('url' => ModUtil::url('Extensions', 'admin', 'initialisePlugin', array('plugin' => $className, 'state' => $state, 'bymodule' => $module, 'sort' => $sort, 'systemplugins' => $systemplugins, 'csrftoken' => $csrfToken) ), 'image' => 'folder_new.png', 'title' => $this->__('Install')); break; case PluginUtil::ENABLED: $status = $this->__('Active'); $statusimage = 'greenled.png'; $pluginLink = array(); if (!$systemplugins) { $pluginLink['_module'] = $instance->getModuleName(); } $pluginLink['_plugin'] = $instance->getPluginName(); $pluginLink['_action'] = 'configure'; if ($instance instanceof Zikula_Plugin_ConfigurableInterface) { $actions[] = array('url' => ModUtil::url('Extensions', 'adminplugin', 'dispatch', $pluginLink), 'image' => 'configure.png', 'title' => $this->__('Configure plugin')); } // Dont allow to disable/uninstall plugins that are AlwaysOn if (!$instance instanceof Zikula_Plugin_AlwaysOnInterface) { $actions[] = array('url' => ModUtil::url('Extensions', 'admin', 'deactivatePlugin', array('plugin' => $className, 'state' => $state, 'bymodule' => $module, 'sort' => $sort, 'systemplugins' => $systemplugins, 'csrftoken' => $csrfToken) ), 'image' => 'folder_red.png', 'title' => $this->__('Deactivate')); $actions[] = array('url' => ModUtil::url('Extensions', 'admin', 'removePlugin', array('plugin' => $className, 'state' => $state, 'bymodule' => $module, 'sort' => $sort, 'systemplugins' => $systemplugins, 'csrftoken' => $csrfToken) ), 'image' => '14_layer_deletelayer.png', 'title' => $this->__('Remove plugin')); } break; case PluginUtil::DISABLED: $status = $this->__('Inactive'); $statusimage = 'yellowled.png'; $actions[] = array('url' => ModUtil::url('Extensions', 'admin', 'activatePlugin', array('plugin' => $className, 'state' => $state, 'bymodule' => $module, 'sort' => $sort, 'systemplugins' => $systemplugins, 'csrftoken' => $csrfToken) ), 'image' => 'folder_green.png', 'title' => $this->__('Activate')); $actions[] = array('url' => ModUtil::url('Extensions', 'admin', 'removePlugin', array('plugin' => $className, 'state' => $state, 'bymodule' => $module, 'sort' => $sort, 'systemplugins' => $systemplugins, 'csrftoken' => $csrfToken) ), 'image' => '14_layer_deletelayer.png', 'title' => $this->__('Remove plugin')); break; } // upgrade ? if ($pluginstate['state'] != PluginUtil::NOTINSTALLED && $pluginstate['version'] != $instance->getMetaVersion()) { $status = $this->__('New version'); $statusimage = 'redled.png'; $actions = array(); $actions[] = array('url' => ModUtil::url('Extensions', 'admin', 'upgradePlugin', array('plugin' => $className, 'state' => $state, 'bymodule' => $module, 'sort' => $sort, 'systemplugins' => $systemplugins, 'csrftoken' => $csrfToken) ), 'image' => 'folder_favorites.png', 'title' => $this->__('Upgrade')); $actions[] = array('url' => ModUtil::url('Extensions', 'admin', 'removePlugin', array('plugin' => $className, 'state' => $state, 'bymodule' => $module, 'sort' => $sort, 'systemplugins' => $systemplugins, 'csrftoken' => $csrfToken) ), 'image' => '14_layer_deletelayer.png', 'title' => $this->__('Remove plugin')); } $info = array('instance' => $instance, 'status' => $status, 'statusimage' => $statusimage, 'actions' => $actions, 'version' => $pluginstate['state'] == PluginUtil::NOTINSTALLED ? $instance->getMetaVersion() : $pluginstate['version']); // new version of plugin? if ($pluginstate['state'] != PluginUtil::NOTINSTALLED && $pluginstate['version'] != $instance->getMetaVersion()) { $info['newversion'] = $instance->getMetaVersion(); } $plugins[] = $info; } // sort plugins array if (empty($sort) || $sort == 'module') { usort($plugins, array($this, 'viewPluginsSorter_byModule')); } elseif ($sort == 'name') { usort($plugins, array($this, 'viewPluginsSorter_byName')); } $this->view->assign('plugins', $plugins) ->assign('module', $module) ->assign('sort', $sort) ->assign('state', $state) ->assign('systemplugins', $systemplugins) ->assign('_type', ($systemplugins) ? 'system' : 'module'); // Return the output that has been generated by this function return $this->view->fetch('extensions_admin_viewPlugins.tpl'); }