(2003-2009) * @author Froxlor team (2010-) * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * @package Panel * */ use Froxlor\Database\Database; use Froxlor\Settings; use Froxlor\Api\Commands\Froxlor; use Froxlor\UI\Panel\UI; use Froxlor\UI\Request; const AREA = 'admin'; require __DIR__ . '/lib/init.php'; // get sql-root access data Database::needRoot(true); Database::needSqlData(); $sql_root = Database::getSqlData(); Database::needRoot(false); if ($page == 'overview' && $userinfo['change_serversettings'] == '1') { $settings_data = \Froxlor\PhpHelper::loadConfigArrayDir('./actions/admin/settings/'); Settings::loadSettingsInto($settings_data); if (isset($_POST['send']) && $_POST['send'] == 'send') { $_part = isset($_GET['part']) ? $_GET['part'] : ''; if ($_part == '') { $_part = isset($_POST['part']) ? $_POST['part'] : ''; } if ($_part != '') { if ($_part == 'all') { $settings_all = true; $settings_part = false; } else { $settings_all = false; $settings_part = true; } $only_enabledisable = false; } else { $settings_all = false; $settings_part = false; $only_enabledisable = true; } // check if the session timeout is too low #815 if (isset($_POST['session_sessiontimeout']) && $_POST['session_sessiontimeout'] < 60) { \Froxlor\UI\Response::standard_error($lng['error']['session_timeout'], $lng['error']['session_timeout_desc']); } if (\Froxlor\UI\Form::processForm($settings_data, $_POST, array( 'filename' => $filename, 'action' => $action, 'page' => $page ), $_part, $settings_all, $settings_part, $only_enabledisable)) { $log->logAction(\Froxlor\FroxlorLogger::ADM_ACTION, LOG_INFO, "rebuild configfiles due to changed setting"); \Froxlor\System\Cronjob::inserttask(\Froxlor\Cron\TaskId::REBUILD_VHOST); // Using nameserver, insert a task which rebuilds the server config \Froxlor\System\Cronjob::inserttask(\Froxlor\Cron\TaskId::REBUILD_DNS); // cron.d file \Froxlor\System\Cronjob::inserttask(\Froxlor\Cron\TaskId::REBUILD_CRON); \Froxlor\UI\Response::standard_success('settingssaved', '', array( 'filename' => $filename, 'action' => $action, 'page' => $page )); } } else { $_part = isset($_GET['part']) ? $_GET['part'] : ''; if ($_part == '') { $_part = isset($_POST['part']) ? $_POST['part'] : ''; } $fields = \Froxlor\UI\Form::buildForm($settings_data, $_part); if ($_part == '' || $_part == 'all') { UI::twigBuffer('settings/index.html.twig', ['fields' => $fields]); } else { $em = Request::get('em', ''); UI::twigBuffer('settings/detailpart.html.twig', ['fields' => $fields, 'em' => $em]); } UI::twigOutputBuffer(); } } elseif ($page == 'phpinfo' && $userinfo['change_serversettings'] == '1') { ob_start(); phpinfo(); $phpinfo = array( 'phpinfo' => array() ); if (preg_match_all('#(?:

(?:)?(.*?)(?:)?

)|(?:(.*?)\s*(?:(.*?)\s*(?:(.*?)\s*)?)?)#s', ob_get_clean(), $matches, PREG_SET_ORDER)) { foreach ($matches as $match) { $end = array_keys($phpinfo); $end = end($end); if (strlen($match[1])) { $phpinfo[$match[1]] = array(); } elseif (isset($match[3])) { $phpinfo[$end][$match[2]] = isset($match[4]) ? array( $match[3], $match[4] ) : $match[3]; } else { $phpinfo[$end][] = $match[2]; } } $phpinfohtml = ''; foreach ($phpinfo as $name => $section) { $phpinfoentries = ""; foreach ($section as $key => $val) { if (is_array($val)) { eval("\$phpinfoentries .= \"" . \Froxlor\UI\Template::getTemplate("settings/phpinfo/phpinfo_3") . "\";"); } elseif (is_string($key)) { eval("\$phpinfoentries .= \"" . \Froxlor\UI\Template::getTemplate("settings/phpinfo/phpinfo_2") . "\";"); } else { eval("\$phpinfoentries .= \"" . \Froxlor\UI\Template::getTemplate("settings/phpinfo/phpinfo_1") . "\";"); } } // first header -> show actual php version if (strtolower($name) == "phpinfo") { $name = "PHP " . PHP_VERSION; } eval("\$phpinfohtml .= \"" . \Froxlor\UI\Template::getTemplate("settings/phpinfo/phpinfo_table") . "\";"); } $phpinfo = $phpinfohtml; } else { \Froxlor\UI\Response::standard_error($lng['error']['no_phpinfo']); } eval("echo \"" . \Froxlor\UI\Template::getTemplate("settings/phpinfo") . "\";"); } elseif ($page == 'rebuildconfigs' && $userinfo['change_serversettings'] == '1') { if (isset($_POST['send']) && $_POST['send'] == 'send') { $log->logAction(\Froxlor\FroxlorLogger::ADM_ACTION, LOG_INFO, "rebuild configfiles"); \Froxlor\System\Cronjob::inserttask(\Froxlor\Cron\TaskId::REBUILD_VHOST); \Froxlor\System\Cronjob::inserttask(\Froxlor\Cron\TaskId::CREATE_QUOTA); // Using nameserver, insert a task which rebuilds the server config \Froxlor\System\Cronjob::inserttask(\Froxlor\Cron\TaskId::REBUILD_DNS); // cron.d file \Froxlor\System\Cronjob::inserttask(\Froxlor\Cron\TaskId::REBUILD_CRON); \Froxlor\UI\Response::standard_success('rebuildingconfigs', '', array( 'filename' => 'admin_index.php' )); } else { \Froxlor\UI\HTML::askYesNo('admin_configs_reallyrebuild', $filename, array( 'page' => $page )); } } elseif ($page == 'updatecounters' && $userinfo['change_serversettings'] == '1') { if (isset($_POST['send']) && $_POST['send'] == 'send') { $log->logAction(\Froxlor\FroxlorLogger::ADM_ACTION, LOG_INFO, "updated resource-counters"); $updatecounters = \Froxlor\User::updateCounters(true); $customers = ''; foreach ($updatecounters['customers'] as $customerid => $customer) { eval("\$customers.=\"" . \Froxlor\UI\Template::getTemplate("settings/updatecounters_row_customer") . "\";"); } $admins = ''; foreach ($updatecounters['admins'] as $adminid => $admin) { eval("\$admins.=\"" . \Froxlor\UI\Template::getTemplate("settings/updatecounters_row_admin") . "\";"); } eval("echo \"" . \Froxlor\UI\Template::getTemplate("settings/updatecounters") . "\";"); } else { \Froxlor\UI\HTML::askYesNo('admin_counters_reallyupdate', $filename, array( 'page' => $page )); } } elseif ($page == 'wipecleartextmailpws' && $userinfo['change_serversettings'] == '1') { if (isset($_POST['send']) && $_POST['send'] == 'send') { $log->logAction(\Froxlor\FroxlorLogger::ADM_ACTION, LOG_WARNING, "wiped all cleartext mail passwords"); Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password` = '';"); Database::query("UPDATE `" . TABLE_PANEL_SETTINGS . "` SET `value` = '0' WHERE `settinggroup` = 'system' AND `varname` = 'mailpwcleartext'"); \Froxlor\UI\Response::redirectTo($filename, array( 's' => $s )); } else { \Froxlor\UI\HTML::askYesNo('admin_cleartextmailpws_reallywipe', $filename, array( 'page' => $page )); } } elseif ($page == 'wipequotas' && $userinfo['change_serversettings'] == '1') { if (isset($_POST['send']) && $_POST['send'] == 'send') { $log->logAction(\Froxlor\FroxlorLogger::ADM_ACTION, LOG_WARNING, "wiped all mailquotas"); // Set the quota to 0 which means unlimited Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `quota` = '0';"); Database::query("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET `email_quota_used` = '0'"); \Froxlor\UI\Response::redirectTo($filename, array( 's' => $s )); } else { \Froxlor\UI\HTML::askYesNo('admin_quotas_reallywipe', $filename, array( 'page' => $page )); } } elseif ($page == 'enforcequotas' && $userinfo['change_serversettings'] == '1') { if (isset($_POST['send']) && $_POST['send'] == 'send') { // Fetch all accounts $result_stmt = Database::query("SELECT `quota`, `customerid` FROM `" . TABLE_MAIL_USERS . "`"); if (Database::num_rows() > 0) { $upd_stmt = Database::prepare(" UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET `email_quota_used` = `email_quota_used` + :diff WHERE `customerid` = :customerid "); while ($array = $result_stmt->fetch(PDO::FETCH_ASSOC)) { $difference = Settings::Get('system.mail_quota') - $array['quota']; Database::pexecute($upd_stmt, array( 'diff' => $difference, 'customerid' => $customerid )); } } // Set the new quota $upd_stmt = Database::prepare(" UPDATE `" . TABLE_MAIL_USERS . "` SET `quota` = :quota "); Database::pexecute($upd_stmt, array( 'quota' => Settings::Get('system.mail_quota') )); // Update the Customer, if the used quota is bigger than the allowed quota Database::query("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET `email_quota` = `email_quota_used` WHERE `email_quota` < `email_quota_used`"); $log->logAction(\Froxlor\FroxlorLogger::ADM_ACTION, LOG_WARNING, 'enforcing mailquota to all customers: ' . Settings::Get('system.mail_quota') . ' MB'); \Froxlor\UI\Response::redirectTo($filename, array( 's' => $s )); } else { \Froxlor\UI\HTML::askYesNo('admin_quotas_reallyenforce', $filename, array( 'page' => $page )); } } elseif ($page == 'integritycheck' && $userinfo['change_serversettings'] == '1') { $integrity = new \Froxlor\Database\IntegrityCheck(); if (isset($_POST['send']) && $_POST['send'] == 'send') { $integrity->fixAll(); } elseif (isset($_GET['action']) && $_GET['action'] == "fix") { \Froxlor\UI\HTML::askYesNo('admin_integritycheck_reallyfix', $filename, array( 'page' => $page )); } $integritycheck = []; foreach ($integrity->available as $id => $check) { $integritycheck[] = [ 'displayid' => $id + 1, 'result' => $integrity->$check(), 'checkdesc' => $lng['integrity_check'][$check] ]; } $integrity_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.integrity.php'; $collection = [ 'data' => $integritycheck, 'pagination' => [] ]; UI::twigBuffer('user/table.html.twig', [ 'listing' => \Froxlor\UI\Listing::formatFromArray($collection, $integrity_list_data['integrity_list']), 'actions_links' => [[ 'href' => $linker->getLink(['section' => 'settings', 'page' => $page, 'action' => 'fix']), 'label' => $lng['admin']['integrityfix'], 'icon' => 'fa-solid fa-screwdriver-wrench', 'class' => 'btn-warning' ]] ]); UI::twigOutputBuffer(); } elseif ($page == 'importexport' && $userinfo['change_serversettings'] == '1') { // check for json-stuff if (!extension_loaded('json')) { \Froxlor\UI\Response::standard_error('jsonextensionnotfound'); } if (isset($_GET['action']) && $_GET['action'] == "export") { // export try { $json_result = Froxlor::getLocal($userinfo)->exportSettings(); $json_export = json_decode($json_result, true)['data']; } catch (Exception $e) { \Froxlor\UI\Response::dynamic_error($e->getMessage()); } header('Content-disposition: attachment; filename=Froxlor_settings-' . $version . '-' . $dbversion . '_' . date('d.m.Y') . '.json'); header('Content-type: application/json'); echo $json_export; exit(); } elseif (isset($_GET['action']) && $_GET['action'] == "import") { // import if (isset($_POST['send']) && $_POST['send'] == 'send') { // get uploaded file if (isset($_FILES["import_file"]["tmp_name"])) { $imp_content = file_get_contents($_FILES["import_file"]["tmp_name"]); try { Froxlor::getLocal($userinfo, array( 'json_str' => $imp_content ))->importSettings(); } catch (Exception $e) { \Froxlor\UI\Response::dynamic_error($e->getMessage()); } \Froxlor\UI\Response::standard_success('settingsimported', '', array( 'filename' => 'admin_settings.php' )); } \Froxlor\UI\Response::dynamic_error("Upload failed"); } } else { eval("echo \"" . \Froxlor\UI\Template::getTemplate("settings/importexport/index") . "\";"); } } elseif ($page == 'testmail') { if (isset($_POST['send']) && $_POST['send'] == 'send') { $test_addr = isset($_POST['test_addr']) ? $_POST['test_addr'] : null; /** * Initialize the mailingsystem */ $testmail = new \PHPMailer\PHPMailer\PHPMailer(true); $testmail->CharSet = "UTF-8"; if (Settings::Get('system.mail_use_smtp')) { $testmail->isSMTP(); $testmail->Host = Settings::Get('system.mail_smtp_host'); $testmail->SMTPAuth = Settings::Get('system.mail_smtp_auth') == '1' ? true : false; $testmail->Username = Settings::Get('system.mail_smtp_user'); $testmail->Password = Settings::Get('system.mail_smtp_passwd'); if (Settings::Get('system.mail_smtp_usetls')) { $testmail->SMTPSecure = 'tls'; } else { $testmail->SMTPAutoTLS = false; } $testmail->Port = Settings::Get('system.mail_smtp_port'); } $_mailerror = false; if (\PHPMailer\PHPMailer\PHPMailer::ValidateAddress(Settings::Get('panel.adminmail')) !== false) { // set return-to address and custom sender-name, see #76 $testmail->SetFrom(Settings::Get('panel.adminmail'), Settings::Get('panel.adminmail_defname')); if (Settings::Get('panel.adminmail_return') != '') { $testmail->AddReplyTo(Settings::Get('panel.adminmail_return'), Settings::Get('panel.adminmail_defname')); } try { $testmail->Subject = "Froxlor Test-Mail"; $mail_body = "Yay, this worked :)"; $testmail->AltBody = $mail_body; $testmail->MsgHTML(str_replace("\n", "
", $mail_body)); $testmail->AddAddress($test_addr); $testmail->Send(); } catch (\PHPMailer\PHPMailer\Exception $e) { $mailerr_msg = $e->errorMessage(); $_mailerror = true; } catch (Exception $e) { $mailerr_msg = $e->getMessage(); $_mailerror = true; } if (!$_mailerror) { // success $mail->ClearAddresses(); \Froxlor\UI\Response::standard_success('testmailsent', '', array( 'filename' => 'admin_settings.php', 'page' => 'testmail' )); } } else { // invalid sender e-mail $mailerr_msg = "Invalid sender e-mail address: " . Settings::Get('panel.adminmail'); $_mailerror = true; } } $mail_smtp_user = Settings::Get('system.mail_smtp_user'); $mail_smtp_host = Settings::Get('system.mail_smtp_host'); $mail_smtp_port = Settings::Get('system.mail_smtp_port'); eval("echo \"" . \Froxlor\UI\Template::getTemplate("settings/testmail") . "\";"); }