| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581 |
- <?php
- session_start();
- use PHPMailer\PHPMailer\PHPMailer;
- use PHPMailer\PHPMailer\SMTP;
- use PHPMailer\PHPMailer\Exception;
- use function Hestiacp\quoteshellarg\quoteshellarg;
- try {
- require_once "vendor/autoload.php";
- } catch (Throwable $ex) {
- $errstr =
- "Unable to load required libraries. Please run v-add-sys-dependencies in command line. Error: " .
- $ex->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";
- $root_directory = dirname(__FILE__) . "/../../";
- 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 &&
- isset($_SESSION["user"]) &&
- $_SESSION["DISABLE_IP_CHECK"] != "yes"
- ) {
- $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() {
- [$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"]);
- }
- if (empty($user_plain)) {
- $user_plain = "";
- }
- if (empty($_SESSION["look"])) {
- $_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("<br>", $output);
- if (empty($error)) {
- $error = sprintf(_("Error code: %s"), $return_var);
- }
- $_SESSION["error_msg"] = $error;
- }
- }
- function check_return_code_redirect($return_var, $output, $location) {
- if ($return_var != 0) {
- $error = implode("<br>", $output);
- if (empty($error)) {
- $error = sprintf(_("Error code: %s"), $return_var);
- }
- $_SESSION["error_msg"] = $error;
- header("Location:" . $location);
- }
- }
- function render_page($user, $TAB, $page) {
- $__template_dir = dirname(__DIR__) . "/templates/";
- // Extract global variables
- // I think those variables should be passed via arguments
- extract($GLOBALS, EXTR_SKIP);
- // Header
- include $__template_dir . "header.php";
- // Panel
- $panel = top_panel(empty($_SESSION["look"]) ? $_SESSION["user"] : $_SESSION["look"], $TAB);
- // Policies controller
- @include_once dirname(__DIR__) . "/inc/policies.php";
- // Body
- include $__template_dir . "pages/" . $page . ".php";
- // Footer
- include $__template_dir . "footer.php";
- }
- // 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) {
- $msgIcon = "";
- $msgText = "";
- $msgClass = "";
- if (!empty($data["error_msg"])) {
- $msgIcon = "fa-circle-exclamation";
- $msgText = htmlentities($data["error_msg"]);
- $msgClass = "inline-alert-danger";
- } elseif (!empty($data["ok_msg"])) {
- $msgIcon = "fa-circle-check";
- $msgText = $data["ok_msg"];
- $msgClass = "inline-alert-success";
- }
- if (!empty($msgText)) {
- printf(
- '<div class="inline-alert %s u-mb20" role="alert"><i class="fas %s"></i><p>%s</p></div>',
- $msgClass,
- $msgIcon,
- $msgText,
- );
- }
- }
- 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 are 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 are 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.php";
- 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, $round = 2) {
- if ($usage == "unlimited") {
- return "∞";
- }
- if ($usage < 1) {
- $usage = "0";
- }
- $display_usage = $usage;
- if ($usage > 1024) {
- $usage = $usage / 1024;
- if ($usage > 1024) {
- $usage = $usage / 1024;
- if ($usage > 1024) {
- $usage = $usage / 1024;
- $display_usage = number_format($usage, $round);
- } else {
- if ($usage > 999) {
- $usage = $usage / 1024;
- }
- $display_usage = number_format($usage, $round);
- }
- } else {
- if ($usage > 999) {
- $usage = $usage / 1024;
- }
- $display_usage = number_format($usage, $round);
- }
- } else {
- if ($usage > 999) {
- $usage = $usage / 1024;
- }
- $display_usage = number_format($usage, $round);
- }
- return $display_usage;
- }
- function humanize_usage_measure($usage) {
- if ($usage == "unlimited") {
- return;
- }
- $measure = "kb";
- if ($usage > 1024) {
- $usage = $usage / 1024;
- if ($usage > 1024) {
- $usage = $usage / 1024;
- $measure = $usage < 1024 ? "tb" : "pb";
- if ($usage > 999) {
- $usage = $usage / 1024;
- $measure = "pb";
- }
- } else {
- $measure = $usage < 1024 ? "gb" : "tb";
- if ($usage > 999) {
- $usage = $usage / 1024;
- $measure = "tb";
- }
- }
- } else {
- $measure = $usage < 1024 ? "mb" : "gb";
- if ($usage > 999) {
- $measure = "gb";
- }
- }
- 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);
- }
- function unset_alerts() {
- if (!empty($_SESSION["unset_alerts"])) {
- if (!empty($_SESSION["error_msg"])) {
- unset($_SESSION["error_msg"]);
- }
- if (!empty($_SESSION["ok_msg"])) {
- unset($_SESSION["ok_msg"]);
- }
- unset($_SESSION["unset_alerts"]);
- }
- }
- register_shutdown_function("unset_alerts");
|