getMessage();
trigger_error($errstr);
echo $errstr;
exit(1);
}
define('HESTIA_DIR_BIN', '/usr/local/hestia/bin/');
define('HESTIA_CMD', '/usr/bin/sudo /usr/local/hestia/bin/');
define('DEFAULT_PHP_VERSION', 'php-' . exec('php -r "echo substr(phpversion(),0,3);"'));
// Load Hestia Config directly
load_hestia_config();
require_once(dirname(__FILE__) . '/prevent_csrf.php');
require_once(dirname(__FILE__) . '/helpers.php');
function destroy_sessions()
{
unset($_SESSION);
session_unset();
session_destroy();
session_start();
}
$i = 0;
// Saving user IPs to the session for preventing session hijacking
$user_combined_ip = '';
if (isset($_SERVER['REMOTE_ADDR'])) {
$user_combined_ip = $_SERVER['REMOTE_ADDR'];
}
if (isset($_SERVER['HTTP_CLIENT_IP'])) {
$user_combined_ip .= '|' . $_SERVER['HTTP_CLIENT_IP'];
}
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$user_combined_ip .= '|' . $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
$user_combined_ip .= '|' . $_SERVER['HTTP_FORWARDED_FOR'];
}
if (isset($_SERVER['HTTP_X_FORWARDED'])) {
$user_combined_ip .= '|' . $_SERVER['HTTP_X_FORWARDED'];
}
if (isset($_SERVER['HTTP_FORWARDED'])) {
$user_combined_ip .= '|' . $_SERVER['HTTP_FORWARDED'];
}
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$user_combined_ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
}
}
if (!isset($_SESSION['user_combined_ip'])) {
$_SESSION['user_combined_ip'] = $user_combined_ip;
}
// Checking user to use session from the same IP he has been logged in
if ($_SESSION['user_combined_ip'] != $user_combined_ip) {
$v_user = quoteshellarg($_SESSION['user']);
$v_session_id = quoteshellarg($_SESSION['token']);
exec(HESTIA_CMD . 'v-log-user-logout ' . $v_user . ' ' . $v_session_id, $output, $return_var);
destroy_sessions();
header('Location: /login/');
exit;
}
// Check system settings
if ((!isset($_SESSION['VERSION'])) && (!defined('NO_AUTH_REQUIRED'))) {
destroy_sessions();
header('Location: /login/');
exit;
}
// Check user session
if ((!isset($_SESSION['user'])) && (!defined('NO_AUTH_REQUIRED'))) {
destroy_sessions();
header('Location: /login/');
exit;
}
// Generate CSRF Token
if (isset($_SESSION['user'])) {
if (!isset($_SESSION['token'])) {
$token = bin2hex(random_bytes(16));
$_SESSION['token'] = $token;
}
}
if ($_SESSION['RELEASE_BRANCH'] == 'release' && $_SESSION['DEBUG_MODE'] == 'false') {
define('JS_LATEST_UPDATE', 'v=' . $_SESSION['VERSION']);
} else {
define('JS_LATEST_UPDATE', 'r=' . time());
}
if (!defined('NO_AUTH_REQUIRED')) {
if (empty($_SESSION['LAST_ACTIVITY']) || empty($_SESSION['INACTIVE_SESSION_TIMEOUT'])) {
destroy_sessions();
header('Location: /login/');
} elseif ($_SESSION['INACTIVE_SESSION_TIMEOUT'] * 60 + $_SESSION['LAST_ACTIVITY'] < time()) {
$v_user = quoteshellarg($_SESSION['user']);
$v_session_id = quoteshellarg($_SESSION['token']);
exec(HESTIA_CMD . 'v-log-user-logout ' . $v_user . ' ' . $v_session_id, $output, $return_var);
destroy_sessions();
header('Location: /login/');
exit;
} else {
$_SESSION['LAST_ACTIVITY'] = time();
}
}
function ipUsed(){
list($http_host, $port) = explode(':', $_SERVER["HTTP_HOST"].":");
if(filter_var($http_host, FILTER_VALIDATE_IP)){
return true;
}else{
return false;
}
}
if (isset($_SESSION['user'])) {
$user = quoteshellarg($_SESSION['user']);
$user_plain = htmlentities($_SESSION['user']);
}
if (isset($_SESSION['look']) && $_SESSION['look'] != '' && ($_SESSION['userContext'] === 'admin')) {
$user = quoteshellarg($_SESSION['look']);
$user_plain = htmlentities($_SESSION['look']);
}
require_once(dirname(__FILE__) . '/i18n.php');
function check_error($return_var)
{
if ($return_var > 0) {
header('Location: /error/');
exit;
}
}
function check_return_code($return_var, $output)
{
if ($return_var != 0) {
$error = implode('
', $output);
if (empty($error)) {
$error = sprintf(_('Error code:'), $return_var);
}
$_SESSION['error_msg'] = $error;
}
}
function check_return_code_redirect($return_var, $output, $location)
{
if ($return_var != 0) {
$error = implode('
', $output);
if (empty($error)) {
$error = sprintf(_('Error code:'), $return_var);
}
$_SESSION['error_msg'] = $error;
header("Location:".$location);
}
}
function render_page($user, $TAB, $page)
{
$__template_dir = dirname(__DIR__) . '/templates/';
$__pages_js_dir = dirname(__DIR__) . '/js/pages/';
// Header
include($__template_dir . 'header.html');
// Panel
$panel = top_panel(empty($_SESSION['look']) ? $_SESSION['user'] : $_SESSION['look'], $TAB);
// Extract global variables
// I think those variables should be passed via arguments
extract($GLOBALS, EXTR_SKIP);
// Policies controller
@include_once(dirname(__DIR__) . '/inc/policies.php');
// Body
include($__template_dir . 'pages/' . $page . '.html');
// Including common js files
@include_once(dirname(__DIR__) . '/templates/includes/end_js.html');
// Including page specific js file
if (file_exists($__pages_js_dir . $page . '.js')) {
echo '';
}
// Footer
include($__template_dir . 'footer.html');
}
// Match $_SESSION['token'] against $_GET['token'] or $_POST['token']
// Usage: verify_csrf($_POST) or verify_csrf($_GET); Use verify_csrf($_POST,true) to return on failure instead of redirect
function verify_csrf($method, $return = false)
{
if ($method['token'] !== $_SESSION['token'] || empty($method['token']) || empty($_SESSION['token'])) {
if ($return === true) {
return false;
} else {
header('Location: /login/');
die();
}
} else {
return true;
}
}
function show_alert_message($data) {
if (!empty($data['error_msg']) || !empty($data['ok_msg'])) {
if (!empty($data['error_msg'])) {
$msg_icon = 'fa-circle-exclamation status-icon red';
$msg_text = htmlentities($data['error_msg']);
$msg_class = 'inline-danger';
} else {
$msg_icon = 'fa-circle-check status-icon green';
$msg_text = $data['ok_msg'];
$msg_class = 'inline-success';
}
echo '
'.$msg_text.'
'; } } function top_panel($user, $TAB) { $command = HESTIA_CMD . 'v-list-user ' . $user . " 'json'"; exec($command, $output, $return_var); if ($return_var > 0) { destroy_sessions(); $_SESSION['error_msg'] = _('You have been logged out. Please log in again.'); header('Location: /login/'); exit; } $panel = json_decode(implode('', $output), true); unset($output); // Log out active sessions for suspended users if (($panel[$user]['SUSPENDED'] === 'yes') && ($_SESSION['POLICY_USER_VIEW_SUSPENDED'] !== 'yes')) { if (empty($_SESSION['look'])) { destroy_sessions(); $_SESSION['error_msg'] = _('You have been logged out. Please log in again.'); header('Location: /login/'); } } // Reset user permissions if changed while logged in if (($panel[$user]['ROLE']) !== ($_SESSION['userContext']) && (!isset($_SESSION['look']))) { unset($_SESSION['userContext']); $_SESSION['userContext'] = $panel[$user]['ROLE']; } // Load user's selected theme and do not change it when impersonting user if ((isset($panel[$user]['THEME'])) && (!isset($_SESSION['look']))) { $_SESSION['userTheme'] = $panel[$user]['THEME']; } // Unset userTheme override variable if POLICY_USER_CHANGE_THEME is set to no if ($_SESSION['POLICY_USER_CHANGE_THEME'] === 'no') { unset($_SESSION['userTheme']); } // Set preferred sort order if (!isset($_SESSION['look'])) { $_SESSION['userSortOrder'] = $panel[$user]['PREF_UI_SORT']; } // Set home location URLs if (($_SESSION['userContext'] === 'admin') && (empty($_SESSION['look']))) { // Display users list for administrators unless they are impersonating a user account $home_url = '/list/user/'; } else { // Set home location URL based on available package features from account if ($panel[$user]['WEB_DOMAINS'] != '0') { $home_url = '/list/web/'; } elseif ($panel[$user]['DNS_DOMAINS'] != '0') { $home_url = '/list/dns/'; } elseif ($panel[$user]['MAIL_DOMAINS'] != '0') { $home_url = '/list/mail/'; } elseif ($panel[$user]['DATABASES'] != '0') { $home_url = '/list/db/'; } elseif ($panel[$user]['CRON_JOBS'] != '0') { $home_url = '/list/cron/'; } elseif ($panel[$user]['BACKUPS'] != '0') { $home_url = '/list/backups/'; } } include(dirname(__FILE__) . '/../templates/includes/panel.html'); return $panel; } function translate_date($date) { $date = new DateTime($date); return $date -> format('d').' '. _($date -> format('M')).' '.$date -> format('Y'); } function humanize_time($usage) { if ($usage > 60) { $usage = $usage / 60; if ($usage > 24) { $usage = $usage / 24; $usage = number_format($usage); return sprintf(ngettext('%d day', '%d days', $usage), $usage); } else { $usage = round($usage); return sprintf(ngettext('%d hour', '%d hours', $usage), $usage); } } else { $usage = round($usage); return sprintf(ngettext('%d minute', '%d minutes', $usage), $usage); } } function humanize_usage_size($usage) { if ($usage == 'unlimited') { return '∞'; } if ($usage > 1024) { $usage = $usage / 1024; if ($usage > 1024) { $usage = $usage / 1024 ; if ($usage > 1024) { $usage = $usage / 1024 ; $usage = number_format($usage, 2); } else { $usage = number_format($usage, 2); } } else { $usage = number_format($usage, 2); } } return $usage; } function humanize_usage_measure($usage) { if ($usage == 'unlimited') { return 'mb'; } $measure = 'kb'; if ($usage > 1024) { $usage = $usage / 1024; if ($usage > 1024) { $usage = $usage / 1024 ; $measure = ($usage > 1024) ? 'pb' : 'tb'; } else { $measure = 'gb'; } } else { $measure = 'mb'; } return $measure; } function get_percentage($used, $total) { if ($total = "unlimited") { //return 0 if unlimited return 0; } if (!isset($total)) { $total = 0; } if (!isset($used)) { $used = 0; } if ($total == 0) { $percent = 0; } else { $percent = $used / $total; $percent = $percent * 100; $percent = number_format($percent, 0, '', ''); if ($percent < 0) { $percent = 0; } elseif ($percent > 100) { $percent = 100; } } return $percent; } function send_email($to, $subject, $mailtext, $from, $from_name, $to_name = '') { $mail = new PHPMailer(); if (isset($_SESSION['USE_SERVER_SMTP']) && $_SESSION['USE_SERVER_SMTP'] == "true") { if(!empty($_SESSION['SERVER_SMTP_ADDR']) && $_SESSION['SERVER_SMTP_ADDR'] != ''){ if(filter_var($_SESSION['SERVER_SMTP_ADDR'], FILTER_VALIDATE_EMAIL)){ $from = $_SESSION['SERVER_SMTP_ADDR']; } } $mail->IsSMTP(); $mail->Mailer = "smtp"; $mail->SMTPDebug = 0; $mail->SMTPAuth = true; $mail->SMTPSecure = $_SESSION['SERVER_SMTP_SECURITY']; $mail->Port = $_SESSION['SERVER_SMTP_PORT']; $mail->Host = $_SESSION['SERVER_SMTP_HOST']; $mail->Username = $_SESSION['SERVER_SMTP_USER']; $mail->Password = $_SESSION['SERVER_SMTP_PASSWD']; } $mail->IsHTML(true); $mail->ClearReplyTos(); if (empty($to_name)) { $mail->AddAddress($to); } else { $mail->AddAddress($to, $to_name); } $mail->SetFrom($from, $from_name); $mail->CharSet = "utf-8"; $mail->Subject = $subject; $content = $mailtext; $content = nl2br($content); $mail->MsgHTML($content); $mail->Send(); } function list_timezones() { foreach (['AKST', 'AKDT', 'PST', 'PDT', 'MST', 'MDT', 'CST', 'CDT', 'EST', 'EDT', 'AST', 'ADT'] as $timezone) { $tz = new DateTimeZone($timezone); $timezone_offsets[$timezone] = $tz->getOffset(new DateTime()); } foreach (DateTimeZone::listIdentifiers() as $timezone) { $tz = new DateTimeZone($timezone); $timezone_offsets[$timezone] = $tz->getOffset(new DateTime()); } foreach ($timezone_offsets as $timezone => $offset) { $offset_prefix = $offset < 0 ? '-' : '+'; $offset_formatted = gmdate('H:i', abs($offset)); $pretty_offset = "UTC${offset_prefix}${offset_formatted}"; $c = new DateTime(gmdate('Y-M-d H:i:s'), new DateTimeZone('UTC')); $c->setTimezone(new DateTimeZone($timezone)); $current_time = $c->format('H:i:s'); $timezone_list[$timezone] = "$timezone [ $current_time ] ${pretty_offset}"; #$timezone_list[$timezone] = "$timezone ${pretty_offset}"; } return $timezone_list; } /** * A function that tells is it MySQL installed on the system, or it is MariaDB. * * Explanation: * $_SESSION['DB_SYSTEM'] has 'mysql' value even if MariaDB is installed, so you can't figure out is it really MySQL or it's MariaDB. * So, this function will make it clear. * * If MySQL is installed, function will return 'mysql' as a string. * If MariaDB is installed, function will return 'mariadb' as a string. * * Hint: if you want to check if PostgreSQL is installed - check value of $_SESSION['DB_SYSTEM'] * * @return string */ function is_it_mysql_or_mariadb() { exec(HESTIA_CMD . 'v-list-sys-services json', $output, $return_var); $data = json_decode(implode('', $output), true); unset($output); $mysqltype = 'mysql'; if (isset($data['mariadb'])) { $mysqltype = 'mariadb'; } return $mysqltype; } function load_hestia_config() { // Check system configuration exec(HESTIA_CMD . "v-list-sys-config json", $output, $return_var); $data = json_decode(implode('', $output), true); $sys_arr = $data['config']; foreach ($sys_arr as $key => $value) { $_SESSION[$key] = $value; } } /** * Returns the list of all web domains from all users grouped by Backend Template used and owner * * @return array */ function backendtpl_with_webdomains() { exec(HESTIA_CMD . 'v-list-users json', $output, $return_var); $users = json_decode(implode('', $output), true); unset($output); $backend_list=[]; foreach ($users as $user => $user_details) { exec(HESTIA_CMD . 'v-list-web-domains '. quoteshellarg($user) . ' json', $output, $return_var); $domains = json_decode(implode('', $output), true); unset($output); foreach ($domains as $domain => $domain_details) { if (!empty($domain_details['BACKEND'])) { $backend = $domain_details['BACKEND']; $backend_list[$backend][$user][] = $domain; } } } return $backend_list; } /** * Check if password is valid * * @return int; 1 / 0 */ function validate_password($password) { return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(.){8,}$/', $password); }