You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hestiacp/web/edit/web/index.php

1678 lines
43 KiB

<?php
use function Hestiacp\quoteshellarg\quoteshellarg;
ob_start();
unset($_SESSION["error_msg"]);
$TAB = "WEB";
// Main include
include $_SERVER["DOCUMENT_ROOT"] . "/inc/main.php";
// Check domain argument
if (empty($_GET["domain"])) {
header("Location: /list/web/");
exit();
}
// Edit as someone else?
if ($_SESSION["userContext"] === "admin" && !empty($_GET["user"])) {
$user = quoteshellarg($_GET["user"]);
$user_plain = htmlentities($_GET["user"]);
}
// Get all user domains
exec(HESTIA_CMD . "v-list-web-domains " . $user . " json", $output, $return_var);
$user_domains = json_decode(implode("", $output), true);
$user_domains = array_keys($user_domains);
unset($output);
$v_domain = $_GET["domain"];
exec(
HESTIA_CMD . "v-list-web-domain " . $user . " " . quoteshellarg($v_domain) . " json",
$output,
$return_var,
);
# Check if domain exists if not return /list/web/
check_return_code_redirect($return_var, $output, "/list/web/");
$data = json_decode(implode("", $output), true);
unset($output);
// Parse domain
$v_ip = $data[$v_domain]["IP"];
$v_template = $data[$v_domain]["TPL"];
$v_aliases = str_replace(",", "\n", $data[$v_domain]["ALIAS"]);
$valiases = explode(",", $data[$v_domain]["ALIAS"]);
$v_ssl = $data[$v_domain]["SSL"];
if (!empty($v_ssl)) {
exec(
HESTIA_CMD . "v-list-web-domain-ssl " . $user . " " . quoteshellarg($v_domain) . " json",
$output,
$return_var,
);
$ssl_str = json_decode(implode("", $output), true);
unset($output);
$v_ssl_crt = $ssl_str[$v_domain]["CRT"];
$v_ssl_key = $ssl_str[$v_domain]["KEY"];
$v_ssl_ca = $ssl_str[$v_domain]["CA"];
$v_ssl_subject = $ssl_str[$v_domain]["SUBJECT"];
$v_ssl_aliases = $ssl_str[$v_domain]["ALIASES"];
$v_ssl_not_before = $ssl_str[$v_domain]["NOT_BEFORE"];
$v_ssl_not_after = $ssl_str[$v_domain]["NOT_AFTER"];
$v_ssl_signature = $ssl_str[$v_domain]["SIGNATURE"];
$v_ssl_pub_key = $ssl_str[$v_domain]["PUB_KEY"];
$v_ssl_issuer = $ssl_str[$v_domain]["ISSUER"];
$v_ssl_forcessl = $data[$v_domain]["SSL_FORCE"];
$v_ssl_hsts = $data[$v_domain]["SSL_HSTS"];
}
$v_letsencrypt = $data[$v_domain]["LETSENCRYPT"];
if (empty($v_letsencrypt)) {
$v_letsencrypt = "no";
}
$v_ssl_home = $data[$v_domain]["SSL_HOME"] ?? "";
$v_backend_template = $data[$v_domain]["BACKEND"] ?? "";
$v_nginx_cache = $data[$v_domain]["FASTCGI_CACHE"] ?? "";
$v_nginx_cache_duration = $data[$v_domain]["FASTCGI_DURATION"] ?? "";
$v_nginx_cache_check = "";
if (empty($v_nginx_cache_duration)) {
$v_nginx_cache_duration = "2m";
$v_nginx_cache_check = "";
} else {
$v_nginx_cache_check = "on";
}
$v_proxy = $data[$v_domain]["PROXY"];
$v_proxy_template = $data[$v_domain]["PROXY"];
$v_proxy_ext = str_replace(",", ", ", $data[$v_domain]["PROXY_EXT"]);
$v_proxy_port = $data[$v_domain]["PROXY_PORT_INTERNAL"];
$v_stats = $data[$v_domain]["STATS"];
$v_stats_user = $data[$v_domain]["STATS_USER"];
$v_stats_password = "";
$v_custom_doc_root_prepath = "/home/" . $user_plain . "/web/";
$v_custom_doc_root = "";
$v_custom_doc_domain = "";
$v_custom_doc_folder = "";
if (!empty($data[$v_domain]["CUSTOM_DOCROOT"])) {
$v_custom_doc_root = realpath($data[$v_domain]["CUSTOM_DOCROOT"]) . DIRECTORY_SEPARATOR;
}
if (
!empty($v_custom_doc_root) &&
false !==
preg_match(
"/\/home\/" . $user_plain . "\/web\/([[:alnum:]].*?)\/public_html\/([[:alnum:]].*)?/",
$v_custom_doc_root,
$matches,
)
) {
// Regex for extracting target web domain and custom document root. Regex test: https://regex101.com/r/2CLvIF/1
if (!empty($matches[1])) {
$v_custom_doc_domain = $matches[1];
}
if (!empty($matches[2])) {
$v_custom_doc_folder = rtrim($matches[2], "/");
}
if ($v_custom_doc_domain && !in_array($v_custom_doc_domain, $user_domains)) {
$v_custom_doc_domain = "";
$v_custom_doc_folder = "";
}
}
$redirect_code_options = [301, 302];
$v_redirect = $data[$v_domain]["REDIRECT"];
$v_redirect_code = $data[$v_domain]["REDIRECT_CODE"];
if (!in_array($v_redirect, ["www." . $v_domain, $v_domain])) {
$v_redirect_custom = $v_redirect;
}
$v_ftp_user = $data[$v_domain]["FTP_USER"];
$v_ftp_path = $data[$v_domain]["FTP_PATH"];
if (!empty($v_ftp_user)) {
$v_ftp_password = "";
}
if (isset($v_custom_doc_domain) && $v_custom_doc_domain != "") {
$v_ftp_user_prepath = "/home/" . $user_plain . "/web/" . $v_custom_doc_domain;
} else {
$v_ftp_user_prepath = "/home/" . $user_plain . "/web/" . $v_domain;
}
//$v_ftp_email = $panel[$user]['CONTACT'];
$v_ftp_email = "";
$v_suspended = $data[$v_domain]["SUSPENDED"];
if ($v_suspended == "yes") {
$v_status = "suspended";
} else {
$v_status = "active";
}
$v_time = $data[$v_domain]["TIME"];
$v_date = $data[$v_domain]["DATE"];
// List ip addresses
exec(HESTIA_CMD . "v-list-user-ips " . $user . " json", $output, $return_var);
$ips = json_decode(implode("", $output), true);
unset($output);
$v_ip_public = empty($ips[$v_ip]["NAT"]) ? $v_ip : $ips[$v_ip]["NAT"];
// List web templates
exec(HESTIA_CMD . "v-list-web-templates json", $output, $return_var);
$templates = json_decode(implode("", $output), true);
unset($output);
// List backend templates
if (!empty($_SESSION["WEB_BACKEND"])) {
exec(HESTIA_CMD . "v-list-web-templates-backend json", $output, $return_var);
$backend_templates = json_decode(implode("", $output), true);
unset($output);
}
// List proxy templates
if (!empty($_SESSION["PROXY_SYSTEM"])) {
exec(HESTIA_CMD . "v-list-web-templates-proxy json", $output, $return_var);
$proxy_templates = json_decode(implode("", $output), true);
unset($output);
}
// List web stat engines
exec(HESTIA_CMD . "v-list-web-stats json", $output, $return_var);
$stats = json_decode(implode("", $output), true);
unset($output);
// Check POST request
if (!empty($_POST["save"])) {
$v_domain = $_POST["v_domain"];
if (!in_array($v_domain, $user_domains)) {
check_return_code(3, ["Unknown domain"]);
}
// Check token
verify_csrf($_POST);
// Change web domain IP
$v_newip = "";
$v_newip_public = "";
if (!empty($_POST["v_ip"])) {
$v_newip = $_POST["v_ip"];
$v_newip_public = empty($ips[$v_newip]["NAT"]) ? $v_newip : $ips[$v_newip]["NAT"];
}
if ($v_ip != $_POST["v_ip"] && empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD .
"v-change-web-domain-ip " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($_POST["v_ip"]) .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
$restart_web = "yes";
$restart_proxy = "yes";
unset($output);
}
// Change dns domain IP
if ($v_ip != $_POST["v_ip"] && empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_domain) . " json",
$output,
$return_var,
);
unset($output);
if ($return_var == 0) {
exec(
HESTIA_CMD .
"v-change-dns-domain-ip " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($v_newip_public) .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_dns = "yes";
}
}
// Change dns ip for each alias
if ($v_ip != $_POST["v_ip"] && empty($_SESSION["error_msg"])) {
foreach ($valiases as $v_alias) {
exec(
HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_alias) . " json",
$output,
$return_var,
);
unset($output);
if ($return_var == 0) {
exec(
HESTIA_CMD .
"v-change-dns-domain-ip " .
$user .
" " .
quoteshellarg($v_alias) .
" " .
quoteshellarg($v_newip_public),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_dns = "yes";
}
}
}
// Change mail domain IP
if ($v_ip != $_POST["v_ip"] && empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD . "v-list-mail-domain " . $user . " " . quoteshellarg($v_domain) . " json",
$output,
$return_var,
);
unset($output);
if ($return_var == 0) {
exec(
HESTIA_CMD . "v-rebuild-mail-domain " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_email = "yes";
}
}
if (
$_SESSION["POLICY_USER_EDIT_WEB_TEMPLATES"] == "yes" ||
$_SESSION["userContext"] === "admin"
) {
// Change template
if ($v_template != $_POST["v_template"] && empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD .
"v-change-web-domain-tpl " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($_POST["v_template"]) .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_web = "yes";
}
// Change backend template
if (
!empty($_SESSION["WEB_BACKEND"]) &&
$v_backend_template != $_POST["v_backend_template"] &&
empty($_SESSION["error_msg"])
) {
$v_backend_template = $_POST["v_backend_template"];
exec(
HESTIA_CMD .
"v-change-web-domain-backend-tpl " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($v_backend_template),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
}
// Enable/Disable nginx cache
if (empty($_POST["v_nginx_cache_check"])) {
$_POST["v_nginx_cache_check"] = "";
}
if (empty($v_nginx_cache_duration)) {
$v_nginx_cache_duration = "";
}
if (
($_SESSION["WEB_SYSTEM"] == "nginx" &&
$v_nginx_cache_check != $_POST["v_nginx_cache_check"]) ||
($v_nginx_cache_duration != $_POST["v_nginx_cache_duration"] &&
($_POST["v_nginx_cache"] = "yes") &&
empty($_SESSION["error_msg"]))
) {
if ($_POST["v_nginx_cache_check"] == "on") {
if (empty($_POST["v_nginx_cache_duration"])) {
$_POST["v_nginx_cache_duration"] = "2m";
}
exec(
HESTIA_CMD .
"v-add-fastcgi-cache " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($_POST["v_nginx_cache_duration"]),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
} else {
exec(
HESTIA_CMD . "v-delete-fastcgi-cache " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
}
$restart_web = "yes";
}
// Delete proxy support
if (
!empty($_SESSION["PROXY_SYSTEM"]) &&
!empty($v_proxy) &&
empty($_POST["v_proxy"]) &&
empty($_SESSION["error_msg"])
) {
exec(
HESTIA_CMD .
"v-delete-web-domain-proxy " .
$user .
" " .
quoteshellarg($v_domain) .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
unset($v_proxy);
$restart_web = "yes";
}
// Change proxy template / Update extension list
if (
!empty($_SESSION["PROXY_SYSTEM"]) &&
!empty($v_proxy) &&
!empty($_POST["v_proxy"]) &&
empty($_SESSION["error_msg"])
) {
$ext = preg_replace("/\n/", " ", $_POST["v_proxy_ext"]);
$ext = preg_replace("/,/", " ", $ext);
$ext = preg_replace("/\s+/", " ", $ext);
$ext = trim($ext);
$ext = str_replace(" ", ", ", $ext);
if ($v_proxy_template != $_POST["v_proxy_template"] || $v_proxy_ext != $ext) {
$ext = str_replace(", ", ",", $ext);
if (!empty($_POST["v_proxy_template"])) {
$v_proxy_template = $_POST["v_proxy_template"];
}
if (!empty($_POST["v_proxy_port"])) {
$v_proxy_port = $_POST["v_proxy_port"];
}
exec(
HESTIA_CMD .
"v-change-web-domain-proxy-tpl " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($v_proxy_template) .
" " .
quoteshellarg($ext) .
" 'no'" .
" " .
quoteshellarg($v_proxy_port),
$output,
$return_var,
);
check_return_code($return_var, $output);
$v_proxy_ext = str_replace(",", ", ", $ext);
unset($output);
$restart_proxy = "yes";
}
}
// Add proxy support
if (
!empty($_SESSION["PROXY_SYSTEM"]) &&
empty($v_proxy) &&
!empty($_POST["v_proxy"]) &&
empty($_SESSION["error_msg"])
) {
$v_proxy_template = $_POST["v_proxy_template"];
if (!empty($_POST["v_proxy_ext"])) {
$ext = preg_replace("/\n/", " ", $_POST["v_proxy_ext"]);
$ext = preg_replace("/,/", " ", $ext);
$ext = preg_replace("/\s+/", " ", $ext);
$ext = trim($ext);
$ext = str_replace(" ", ",", $ext);
$v_proxy_ext = str_replace(",", ", ", $ext);
}
if (!empty($_POST["v_proxy_port"])) {
$v_proxy_port = $_POST["v_proxy_port"];
}
exec(
HESTIA_CMD .
"v-add-web-domain-proxy " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($v_proxy_template) .
" " .
quoteshellarg($ext) .
" 'no'" .
" " .
quoteshellarg($v_proxy_port),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_proxy = "yes";
}
}
// Change aliases
if (empty($_SESSION["error_msg"])) {
$waliases = preg_replace("/\n/", " ", $_POST["v_aliases"]);
$waliases = preg_replace("/,/", " ", $waliases);
$waliases = preg_replace("/\s+/", " ", $waliases);
$waliases = trim($waliases);
$aliases = explode(" ", $waliases);
$v_aliases = str_replace(" ", "\n", $waliases);
$result = array_diff($valiases, $aliases);
foreach ($result as $alias) {
if (empty($_SESSION["error_msg"]) && !empty($alias)) {
$restart_web = "yes";
$restart_proxy = "yes";
exec(
HESTIA_CMD .
"v-delete-web-domain-alias " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($alias) .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
if (empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
unset($output);
if ($return_var == 0) {
exec(
HESTIA_CMD .
"v-delete-dns-on-web-alias " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($alias) .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_dns = "yes";
}
}
}
}
$result = array_diff($aliases, $valiases);
foreach ($result as $alias) {
if (empty($_SESSION["error_msg"]) && !empty($alias)) {
$restart_web = "yes";
$restart_proxy = "yes";
exec(
HESTIA_CMD .
"v-add-web-domain-alias " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($alias) .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
if (empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
unset($output);
if ($return_var == 0) {
exec(
HESTIA_CMD .
"v-add-dns-on-web-alias " .
$user .
" " .
quoteshellarg($alias) .
" " .
quoteshellarg($v_newip_public ?: $v_ip_public) .
" no",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_dns = "yes";
}
}
}
}
// Regenerate LE if aliases are different
if (
!empty($_POST["v_ssl"]) &&
$v_letsencrypt == "yes" &&
!empty($_POST["v_letsencrypt"]) &&
empty($_SESSION["error_msg"])
) {
// If aliases are different from stored aliases
if (array_diff($valiases, $aliases) || array_diff($aliases, $valiases)) {
// Add certificate with new aliases
$l_aliases = str_replace("\n", ",", $v_aliases);
exec(
HESTIA_CMD .
"v-add-letsencrypt-domain " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($l_aliases) .
" ''",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_letsencrypt = "yes";
$v_ssl = "yes";
$restart_web = "yes";
$restart_proxy = "yes";
exec(
HESTIA_CMD .
"v-list-web-domain-ssl " .
$user .
" " .
quoteshellarg($v_domain) .
" json",
$output,
$return_var,
);
$ssl_str = json_decode(implode("", $output), true);
unset($output);
$v_ssl_crt = $ssl_str[$v_domain]["CRT"];
$v_ssl_key = $ssl_str[$v_domain]["KEY"];
$v_ssl_ca = $ssl_str[$v_domain]["CA"];
$v_ssl_subject = $ssl_str[$v_domain]["SUBJECT"];
$v_ssl_aliases = $ssl_str[$v_domain]["ALIASES"];
$v_ssl_not_before = $ssl_str[$v_domain]["NOT_BEFORE"];
$v_ssl_not_after = $ssl_str[$v_domain]["NOT_AFTER"];
$v_ssl_signature = $ssl_str[$v_domain]["SIGNATURE"];
$v_ssl_pub_key = $ssl_str[$v_domain]["PUB_KEY"];
$v_ssl_issuer = $ssl_str[$v_domain]["ISSUER"];
}
}
if (!empty($v_stats) && $_POST["v_stats"] == $v_stats && empty($_SESSION["error_msg"])) {
// Update statistics configuration when changing domain aliases
$v_stats = quoteshellarg($_POST["v_stats"]);
exec(
HESTIA_CMD .
"v-change-web-domain-stats " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$v_stats,
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
}
}
// Change SSL certificate
if (
$v_letsencrypt == "no" &&
empty($_POST["v_letsencrypt"]) &&
$v_ssl == "yes" &&
!empty($_POST["v_ssl"]) &&
empty($_SESSION["error_msg"])
) {
if (
$v_ssl_crt != str_replace("\r\n", "\n", $_POST["v_ssl_crt"]) ||
$v_ssl_key != str_replace("\r\n", "\n", $_POST["v_ssl_key"]) ||
$v_ssl_ca != str_replace("\r\n", "\n", $_POST["v_ssl_ca"])
) {
exec("mktemp -d", $mktemp_output, $return_var);
$tmpdir = $mktemp_output[0];
// Certificate
if (!empty($_POST["v_ssl_crt"])) {
$fp = fopen($tmpdir . "/" . $v_domain . ".crt", "w");
fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_crt"]));
fwrite($fp, "\n");
fclose($fp);
}
// Key
if (!empty($_POST["v_ssl_key"])) {
$fp = fopen($tmpdir . "/" . $v_domain . ".key", "w");
fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_key"]));
fwrite($fp, "\n");
fclose($fp);
}
// CA
if (!empty($_POST["v_ssl_ca"])) {
$fp = fopen($tmpdir . "/" . $v_domain . ".ca", "w");
fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_ca"]));
fwrite($fp, "\n");
fclose($fp);
}
exec(
HESTIA_CMD .
"v-change-web-domain-sslcert " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$tmpdir .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_web = "yes";
$restart_proxy = "yes";
exec(
HESTIA_CMD .
"v-list-web-domain-ssl " .
$user .
" " .
quoteshellarg($v_domain) .
" json",
$output,
$return_var,
);
$ssl_str = json_decode(implode("", $output), true);
unset($output);
$v_ssl_crt = $ssl_str[$v_domain]["CRT"];
$v_ssl_key = $ssl_str[$v_domain]["KEY"];
$v_ssl_ca = $ssl_str[$v_domain]["CA"];
$v_ssl_subject = $ssl_str[$v_domain]["SUBJECT"];
$v_ssl_aliases = $ssl_str[$v_domain]["ALIASES"];
$v_ssl_not_before = $ssl_str[$v_domain]["NOT_BEFORE"];
$v_ssl_not_after = $ssl_str[$v_domain]["NOT_AFTER"];
$v_ssl_signature = $ssl_str[$v_domain]["SIGNATURE"];
$v_ssl_pub_key = $ssl_str[$v_domain]["PUB_KEY"];
$v_ssl_issuer = $ssl_str[$v_domain]["ISSUER"];
// Cleanup certificate tempfiles
if (!empty($_POST["v_ssl_crt"])) {
unlink($tmpdir . "/" . $v_domain . ".crt");
}
if (!empty($_POST["v_ssl_key"])) {
unlink($tmpdir . "/" . $v_domain . ".key");
}
if (!empty($_POST["v_ssl_ca"])) {
unlink($tmpdir . "/" . $v_domain . ".ca");
}
rmdir($tmpdir);
}
}
// Delete Lets Encrypt support
if (
$v_letsencrypt == "yes" &&
(empty($_POST["v_letsencrypt"]) || empty($_POST["v_ssl"])) &&
empty($_SESSION["error_msg"])
) {
exec(
HESTIA_CMD .
"v-delete-letsencrypt-domain " .
$user .
" " .
quoteshellarg($v_domain) .
" ''",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_ssl_crt = "";
$v_ssl_key = "";
$v_ssl_ca = "";
$v_letsencrypt = "no";
$v_letsencrypt_deleted = "yes";
$v_ssl = "no";
$restart_web = "yes";
$restart_proxy = "yes";
}
// Delete SSL certificate
if ($v_ssl == "yes" && empty($_POST["v_ssl"]) && empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD .
"v-delete-web-domain-ssl " .
$user .
" " .
quoteshellarg($v_domain) .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_ssl_crt = "";
$v_ssl_key = "";
$v_ssl_ca = "";
$v_ssl = "no";
$v_ssl_forcessl = "no";
$v_ssl_hsts = "no";
$restart_web = "yes";
$restart_proxy = "yes";
}
// Add Lets Encrypt support
if (
!empty($_POST["v_ssl"]) &&
$v_letsencrypt == "no" &&
!empty($_POST["v_letsencrypt"]) &&
empty($_SESSION["error_msg"])
) {
$l_aliases = str_replace("\n", ",", $v_aliases);
exec(
HESTIA_CMD .
"v-add-letsencrypt-domain " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($l_aliases) .
" ''",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
if ($return_var != 0) {
$v_letsencrypt = "no";
} else {
$v_letsencrypt = "yes";
}
$v_ssl = "yes";
if ($_POST["v_ssl_forcessl"] == "on") {
$v_ssl_forcessl = "yes";
} else {
$v_ssl_forcessl = "no";
}
$restart_web = "yes";
$restart_proxy = "yes";
}
// Add SSL certificate
if (
$v_ssl == "no" &&
!empty($_POST["v_ssl"]) &&
empty($v_letsencrypt_deleted) &&
empty($_SESSION["error_msg"])
) {
if (empty($_POST["v_ssl_crt"])) {
$errors[] = "ssl certificate";
}
if (empty($_POST["v_ssl_key"])) {
$errors[] = "ssl key";
}
if (!empty($errors[0])) {
foreach ($errors as $i => $error) {
if ($i == 0) {
$error_msg = $error;
} else {
$error_msg = $error_msg . ", " . $error;
}
}
$_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
} else {
exec("mktemp -d", $mktemp_output, $return_var);
$tmpdir = $mktemp_output[0];
// Certificate
if (!empty($_POST["v_ssl_crt"])) {
$fp = fopen($tmpdir . "/" . $v_domain . ".crt", "w");
fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_crt"]));
fclose($fp);
}
// Key
if (!empty($_POST["v_ssl_key"])) {
$fp = fopen($tmpdir . "/" . $v_domain . ".key", "w");
fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_key"]));
fclose($fp);
}
// CA
if (!empty($_POST["v_ssl_ca"])) {
$fp = fopen($tmpdir . "/" . $v_domain . ".ca", "w");
fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_ca"]));
fclose($fp);
}
//keep using the original value for v_ssl_home
exec(
HESTIA_CMD .
"v-add-web-domain-ssl " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$tmpdir .
" " .
quoteshellarg($v_ssl_home) .
" 'no'",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_ssl = "yes";
$restart_web = "yes";
$restart_proxy = "yes";
exec(
HESTIA_CMD .
"v-list-web-domain-ssl " .
$user .
" " .
quoteshellarg($v_domain) .
" json",
$output,
$return_var,
);
$ssl_str = json_decode(implode("", $output), true);
unset($output);
$v_ssl_crt = $ssl_str[$v_domain]["CRT"];
$v_ssl_key = $ssl_str[$v_domain]["KEY"];
$v_ssl_ca = $ssl_str[$v_domain]["CA"];
$v_ssl_subject = $ssl_str[$v_domain]["SUBJECT"];
$v_ssl_aliases = $ssl_str[$v_domain]["ALIASES"];
$v_ssl_not_before = $ssl_str[$v_domain]["NOT_BEFORE"];
$v_ssl_not_after = $ssl_str[$v_domain]["NOT_AFTER"];
$v_ssl_signature = $ssl_str[$v_domain]["SIGNATURE"];
$v_ssl_pub_key = $ssl_str[$v_domain]["PUB_KEY"];
$v_ssl_issuer = $ssl_str[$v_domain]["ISSUER"];
// Cleanup certificate tempfiles
if (!empty($_POST["v_ssl_crt"])) {
unlink($tmpdir . "/" . $v_domain . ".crt");
}
if (!empty($_POST["v_ssl_key"])) {
unlink($tmpdir . "/" . $v_domain . ".key");
}
if (!empty($_POST["v_ssl_ca"])) {
unlink($tmpdir . "/" . $v_domain . ".ca");
}
rmdir($tmpdir);
}
}
// Add Force SSL
if (
!empty($_POST["v_ssl_forcessl"]) &&
!empty($_POST["v_ssl"]) &&
empty($_SESSION["error_msg"])
) {
exec(
HESTIA_CMD . "v-add-web-domain-ssl-force " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_ssl_forcessl = "yes";
$restart_web = "yes";
$restart_proxy = "yes";
}
// Add SSL HSTS
if (!empty($_POST["v_ssl_hsts"]) && !empty($_POST["v_ssl"]) && empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD . "v-add-web-domain-ssl-hsts " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_ssl_hsts = "yes";
$restart_web = "yes";
$restart_proxy = "yes";
}
// Delete Force SSL
if (
$v_ssl_forcessl == "yes" &&
empty($_POST["v_ssl_forcessl"]) &&
empty($_SESSION["error_msg"])
) {
exec(
HESTIA_CMD . "v-delete-web-domain-ssl-force " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_ssl_forcessl = "no";
$restart_web = "yes";
$restart_proxy = "yes";
}
// Delete SSL HSTS
if ($v_ssl_hsts == "yes" && empty($_POST["v_ssl_hsts"]) && empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD . "v-delete-web-domain-ssl-hsts " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_ssl_hsts = "no";
$restart_web = "yes";
$restart_proxy = "yes";
}
// Delete web stats
if (!empty($v_stats) && $_POST["v_stats"] == "none" && empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD . "v-delete-web-domain-stats " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_stats = "";
}
// Change web stats engine
if (!empty($v_stats) && $_POST["v_stats"] != $v_stats && empty($_SESSION["error_msg"])) {
$v_stats = quoteshellarg($_POST["v_stats"]);
exec(
HESTIA_CMD .
"v-change-web-domain-stats " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$v_stats,
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
}
// Add web stats
if (empty($v_stats) && $_POST["v_stats"] != "none" && empty($_SESSION["error_msg"])) {
$v_stats = quoteshellarg($_POST["v_stats"]);
exec(
HESTIA_CMD .
"v-add-web-domain-stats " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$v_stats,
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
}
// Delete web stats authorization
if (!empty($v_stats_user) && empty($_POST["v_stats_auth"]) && empty($_SESSION["error_msg"])) {
exec(
HESTIA_CMD . "v-delete-web-domain-stats-user " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_stats_user = "";
$v_stats_password = "";
}
// Change web stats user or password
if (empty($v_stats_user) && !empty($_POST["v_stats_auth"]) && empty($_SESSION["error_msg"])) {
if (empty($_POST["v_stats_user"])) {
$errors[] = _("Username");
}
if (!empty($errors[0])) {
foreach ($errors as $i => $error) {
if ($i == 0) {
$error_msg = $error;
} else {
$error_msg = $error_msg . ", " . $error;
}
}
$_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
} else {
$v_stats_user = quoteshellarg($_POST["v_stats_user"]);
$v_stats_password = tempnam("/tmp", "vst");
$fp = fopen($v_stats_password, "w");
fwrite($fp, $_POST["v_stats_password"] . "\n");
fclose($fp);
exec(
HESTIA_CMD .
"v-add-web-domain-stats-user " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$v_stats_user .
" " .
$v_stats_password,
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
unlink($v_stats_password);
$v_stats_password = quoteshellarg($_POST["v_stats_password"]);
}
}
// Add web stats authorization
if (!empty($v_stats_user) && !empty($_POST["v_stats_auth"]) && empty($_SESSION["error_msg"])) {
if (empty($_POST["v_stats_user"])) {
$errors[] = _("Username");
}
if (!empty($errors[0])) {
foreach ($errors as $i => $error) {
if ($i == 0) {
$error_msg = $error;
} else {
$error_msg = $error_msg . ", " . $error;
}
}
$_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
}
if (
$v_stats_user != $_POST["v_stats_user"] ||
(!empty($_POST["v_stats_password"]) && empty($_SESSION["error_msg"]))
) {
$v_stats_user = quoteshellarg($_POST["v_stats_user"]);
$v_stats_password = tempnam("/tmp", "vst");
$fp = fopen($v_stats_password, "w");
fwrite($fp, $_POST["v_stats_password"] . "\n");
fclose($fp);
exec(
HESTIA_CMD .
"v-add-web-domain-stats-user " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$v_stats_user .
" " .
$v_stats_password,
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
unlink($v_stats_password);
$v_stats_password = quoteshellarg($_POST["v_stats_password"]);
}
}
// Update ftp account
if (!empty($_POST["v_ftp_user"])) {
$v_ftp_users_updated = [];
foreach ($_POST["v_ftp_user"] as $i => $v_ftp_user_data) {
if (empty($v_ftp_user_data["v_ftp_user"])) {
continue;
}
$v_ftp_user_data["v_ftp_user"] = preg_replace(
"/^" . $user . "_/i",
"",
$v_ftp_user_data["v_ftp_user"],
);
if ($v_ftp_user_data["is_new"] == 1 && !empty($_POST["v_ftp"])) {
if (
!empty($v_ftp_user_data["v_ftp_email"]) &&
!filter_var($v_ftp_user_data["v_ftp_email"], FILTER_VALIDATE_EMAIL)
) {
$_SESSION["error_msg"] = _("Please enter a valid email address.");
}
if (empty($v_ftp_user_data["v_ftp_user"])) {
$errors[] = "ftp user";
}
if (!empty($errors[0])) {
foreach ($errors as $i => $error) {
if ($i == 0) {
$error_msg = $error;
} else {
$error_msg = $error_msg . ", " . $error;
}
}
$_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
}
// Add ftp account
$v_ftp_username = $v_ftp_user_data["v_ftp_user"];
$v_ftp_username_full = $user . "_" . $v_ftp_user_data["v_ftp_user"];
$v_ftp_user = quoteshellarg($v_ftp_username);
$v_ftp_path = quoteshellarg(trim($v_ftp_user_data["v_ftp_path"]));
if (empty($_SESSION["error_msg"])) {
$v_ftp_password = tempnam("/tmp", "vst");
$fp = fopen($v_ftp_password, "w");
fwrite($fp, $v_ftp_user_data["v_ftp_password"] . "\n");
fclose($fp);
exec(
HESTIA_CMD .
"v-add-web-domain-ftp " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$v_ftp_user .
" " .
$v_ftp_password .
" " .
$v_ftp_path,
$output,
$return_var,
);
check_return_code($return_var, $output);
if (!empty($v_ftp_user_data["v_ftp_email"]) && empty($_SESSION["error_msg"])) {
$to = $v_ftp_user_data["v_ftp_email"];
$template = get_email_template("ftp_credentials", $_SESSION["language"]);
$hostname = get_hostname();
$from = !empty($_SESSION["FROM_EMAIL"])
? $_SESSION["FROM_EMAIL"]
: "noreply@" . $hostname;
$from_name = !empty($_SESSION["FROM_NAME"])
? $_SESSION["FROM_NAME"]
: $_SESSION["APP_NAME"];
$template = get_email_template(
"ftpaccount_created",
$data[$user]["LANGUAGE"],
);
if (!empty($template)) {
preg_match("/<subject>(.*?)<\/subject>/si", $template, $matches);
$subject = $matches[1];
$subject = str_replace(
["{{hostname}}", "{{appname}}", "{{username}}", "{{domain}}"],
[
get_hostname(),
$_SESSION["APP_NAME"],
$user_plain . "_" . $v_ftp_username_for_emailing,
$v_domain,
],
$subject,
);
$template = str_replace($matches[0], "", $template);
} else {
$template = _(
"FTP account has been created and ready to use.\n" .
"\n" .
"Hostname: {{domain}}\n" .
"Username: {{username}}\n" .
"Password: {{password}}\n" .
"\n" .
"Best regards,\n" .
"\n" .
"--\n" .
"{{appname}}",
);
}
if (empty($subject)) {
$subject = str_replace(
["{{subject}}", "{{hostname}}", "{{appname}}"],
[
sprintf(
_("FTP Account Credentials: %s"),
$user_plain . "_" . $v_ftp_username_for_emailing,
),
get_hostname(),
$_SESSION["APP_NAME"],
],
$_SESSION["SUBJECT_EMAIL"],
);
}
$mailtext = translate_email($template, [
"domain" => htmlentities($v_domain),
"username" => htmlentities(
$user_plain . "_" . $v_ftp_username_for_emailing,
),
"password" => htmlentities($v_ftp_user_data["v_ftp_password"]),
"appname" => $_SESSION["APP_NAME"],
]);
send_email($to, $subject, $mailtext, $from, $from_name);
unset($v_ftp_email);
}
unset($output);
unlink($v_ftp_password);
$v_ftp_password = quoteshellarg($v_ftp_user_data["v_ftp_password"]);
}
if ($return_var == 0) {
$v_ftp_password = "";
$v_ftp_user_data["is_new"] = 0;
} else {
$v_ftp_user_data["is_new"] = 1;
}
$v_ftp_users_updated[] = [
"is_new" => empty($_SESSION["error_msg"]) ? 0 : 1,
"v_ftp_user" => $v_ftp_username_full,
"v_ftp_password" => $v_ftp_password,
"v_ftp_path" => $v_ftp_user_data["v_ftp_path"],
"v_ftp_email" => $v_ftp_user_data["v_ftp_email"],
"v_ftp_pre_path" => $v_ftp_user_prepath,
];
continue;
}
// Delete FTP account
if ($v_ftp_user_data["delete"] == 1) {
$v_ftp_username = $user_plain . "_" . $v_ftp_user_data["v_ftp_user"];
exec(
HESTIA_CMD .
"v-delete-web-domain-ftp " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($v_ftp_username),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
continue;
}
if (!empty($_POST["v_ftp"])) {
if (empty($v_ftp_user_data["v_ftp_user"])) {
$errors[] = _("Username");
}
if (!empty($errors[0])) {
foreach ($errors as $i => $error) {
if ($i == 0) {
$error_msg = $error;
} else {
$error_msg = $error_msg . ", " . $error;
}
}
$_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
}
// Change FTP account path
$v_ftp_username_for_emailing = $v_ftp_user_data["v_ftp_user"];
$v_ftp_username = $user_plain . "_" . $v_ftp_user_data["v_ftp_user"]; //preg_replace("/^".$user."_/", "", $v_ftp_user_data['v_ftp_user']);
$v_ftp_username = quoteshellarg($v_ftp_username);
$v_ftp_path = quoteshellarg(trim($v_ftp_user_data["v_ftp_path"]));
if (quoteshellarg(trim($v_ftp_user_data["v_ftp_path_prev"])) != $v_ftp_path) {
exec(
HESTIA_CMD .
"v-change-web-domain-ftp-path " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$v_ftp_username .
" " .
$v_ftp_path,
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
}
// Change FTP account password
if (!empty($v_ftp_user_data["v_ftp_email"]) && empty($_SESSION["error_msg"])) {
$to = $v_ftp_user_data["v_ftp_email"];
$template = get_email_template("ftp_credentials", $_SESSION["language"]);
$hostname = get_hostname();
$from = !empty($_SESSION["FROM_EMAIL"])
? $_SESSION["FROM_EMAIL"]
: "noreply@" . $hostname;
$from_name = !empty($_SESSION["FROM_NAME"])
? $_SESSION["FROM_NAME"]
: $_SESSION["APP_NAME"];
$template = get_email_template("ftpaccount_created", $data[$user]["LANGUAGE"]);
if (!empty($template)) {
preg_match("/<subject>(.*?)<\/subject>/si", $template, $matches);
$subject = $matches[1];
$subject = str_replace(
["{{hostname}}", "{{appname}}", "{{username}}", "{{domain}}"],
[
get_hostname(),
$_SESSION["APP_NAME"],
$user_plain . "_" . $v_ftp_username_for_emailing,
$v_domain,
],
$subject,
);
$template = str_replace($matches[0], "", $template);
} else {
$template = _(
"FTP account has been created and ready to use.\n" .
"\n" .
"Hostname: {{domain}}\n" .
"Username: {{username}}\n" .
"Password: {{password}}\n" .
"\n" .
"Best regards,\n" .
"\n" .
"--\n" .
"{{appname}}",
);
}
if (empty($subject)) {
$subject = str_replace(
["{{subject}}", "{{hostname}}", "{{appname}}"],
[
sprintf(
_("FTP Account Credentials: %s"),
$user_plain . "_" . $v_ftp_username_for_emailing,
),
get_hostname(),
$_SESSION["APP_NAME"],
],
$_SESSION["SUBJECT_EMAIL"],
);
}
$mailtext = translate_email($template, [
"domain" => $v_domain,
"username" => $user_plain . "_" . $v_ftp_username_for_emailing,
"password" => $v_ftp_user_data["v_ftp_password"],
"appname" => $_SESSION["APP_NAME"],
]);
send_email($to, $subject, $mailtext, $from, $from_name);
unset($v_ftp_email);
}
if (empty($v_ftp_user_data["v_ftp_email"])) {
$v_ftp_user_data["v_ftp_email"] = "";
}
$v_ftp_users_updated[] = [
"is_new" => 0,
"v_ftp_user" => $v_ftp_username,
"v_ftp_password" => $v_ftp_user_data["v_ftp_password"],
"v_ftp_path" => $v_ftp_user_data["v_ftp_path"],
"v_ftp_email" => $v_ftp_user_data["v_ftp_email"],
"v_ftp_pre_path" => $v_ftp_user_prepath,
];
}
}
}
//custom docoot with check box disabled
if (!empty($v_custom_doc_root) && empty($_POST["v_custom_doc_root_check"])) {
exec(
HESTIA_CMD .
"v-change-web-domain-docroot " .
$user .
" " .
quoteshellarg($v_domain) .
" default",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
unset($_POST["v-custom-doc-domain"], $_POST["v-custom-doc-folder"]);
$restart_web = "yes";
$restart_proxy = "yes";
}
if (
!empty($_POST["v-custom-doc-domain"]) &&
!empty($_POST["v_custom_doc_root_check"]) &&
$v_custom_doc_root_prepath . $v_custom_doc_domain . "/public_html" . $v_custom_doc_folder !=
$v_custom_doc_root
) {
if ($_POST["v-custom-doc-domain"] == $v_domain && empty($_POST["v-custom-doc-folder"])) {
exec(
HESTIA_CMD .
"v-change-web-domain-docroot " .
$user .
" " .
quoteshellarg($v_domain) .
" default",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
} else {
$v_custom_doc_folder = quoteshellarg(rtrim($_POST["v-custom-doc-folder"], "/"));
$v_custom_doc_domain = quoteshellarg($_POST["v-custom-doc-domain"]);
exec(
HESTIA_CMD .
"v-change-web-domain-docroot " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
$v_custom_doc_domain .
" " .
$v_custom_doc_folder .
" yes",
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$v_custom_doc_root = 1;
}
$restart_web = "yes";
$restart_proxy = "yes";
} else {
unset($v_custom_doc_root);
}
if (!empty($v_redirect) && empty($_POST["v-redirect-checkbox"])) {
exec(
HESTIA_CMD . "v-delete-web-domain-redirect " . $user . " " . quoteshellarg($v_domain),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
unset($_POST["v-redirect"]);
$restart_web = "yes";
$restart_proxy = "yes";
}
if (!empty($_POST["v-redirect"]) && !empty($_POST["v-redirect-checkbox"])) {
if (empty($v_redirect)) {
if ($_POST["v-redirect"] == "custom" && empty($_POST["v-redirect-custom"])) {
} else {
if ($_POST["v-redirect"] == "custom") {
$_POST["v-redirect"] = $_POST["v-redirect-custom"];
}
exec(
HESTIA_CMD .
"v-add-web-domain-redirect " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($_POST["v-redirect"]) .
" " .
quoteshellarg($_POST["v-redirect-code"]),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_web = "yes";
$restart_proxy = "yes";
}
} else {
if ($_POST["v-redirect"] == "custom") {
$_POST["v-redirect"] = $_POST["v-redirect-custom"];
}
if (
$_POST["v-redirect"] != $v_redirect ||
$_POST["v-redirect-code"] != $v_redirect_code
) {
exec(
HESTIA_CMD .
"v-add-web-domain-redirect " .
$user .
" " .
quoteshellarg($v_domain) .
" " .
quoteshellarg($_POST["v-redirect"]) .
" " .
quoteshellarg($_POST["v-redirect-code"]),
$output,
$return_var,
);
check_return_code($return_var, $output);
unset($output);
$restart_web = "yes";
$restart_proxy = "yes";
}
}
}
// Restart web server
if (!empty($restart_web) && empty($_SESSION["error_msg"])) {
exec(HESTIA_CMD . "v-restart-web", $output, $return_var);
check_return_code($return_var, $output);
unset($output);
}
// Restart proxy server
if (
!empty($_SESSION["PROXY_SYSTEM"]) &&
!empty($restart_proxy) &&
empty($_SESSION["error_msg"])
) {
exec(HESTIA_CMD . "v-restart-proxy", $output, $return_var);
check_return_code($return_var, $output);
unset($output);
}
// Restart dns server
if (!empty($restart_dns) && empty($_SESSION["error_msg"])) {
exec(HESTIA_CMD . "v-restart-dns", $output, $return_var);
check_return_code($return_var, $output);
unset($output);
}
// Set success message
if (empty($_SESSION["error_msg"])) {
$_SESSION["ok_msg"] = _("Changes have been saved.");
header("Location: /edit/web/?domain=" . $v_domain);
exit();
}
}
$v_ftp_users_raw = explode(":", $v_ftp_user);
$v_ftp_users_paths_raw = explode(":", $data[$v_domain]["FTP_PATH"]);
$v_ftp_users = [];
foreach ($v_ftp_users_raw as $v_ftp_user_index => $v_ftp_user_val) {
if (empty($v_ftp_user_val)) {
continue;
}
$v_ftp_users[] = [
"is_new" => 0,
"v_ftp_user" => preg_replace("/^" . $user_plain . "_/", "", $v_ftp_user_val),
"v_ftp_password" => $v_ftp_password,
"v_ftp_path" => isset($v_ftp_users_paths_raw[$v_ftp_user_index])
? $v_ftp_users_paths_raw[$v_ftp_user_index]
: "",
"v_ftp_email" => $v_ftp_email,
"v_ftp_pre_path" => $v_ftp_user_prepath,
];
}
if (empty($v_ftp_users)) {
$v_ftp_user = null;
$v_ftp_users[] = [
"is_new" => 1,
"v_ftp_user" => "",
"v_ftp_password" => "",
"v_ftp_path" => isset($v_ftp_users_paths_raw[$v_ftp_user_index])
? $v_ftp_users_paths_raw[$v_ftp_user_index]
: "",
"v_ftp_email" => "",
"v_ftp_pre_path" => $v_ftp_user_prepath,
];
}
// set default pre path for newly created users
$v_ftp_pre_path_new_user = $v_ftp_user_prepath;
if (isset($v_ftp_users_updated)) {
$v_ftp_users = $v_ftp_users_updated;
if (empty($v_ftp_users_updated)) {
$v_ftp_user = null;
$v_ftp_users[] = [
"is_new" => 1,
"v_ftp_user" => "",
"v_ftp_password" => "",
"v_ftp_path" => isset($v_ftp_users_paths_raw[$v_ftp_user_index])
? $v_ftp_users_paths_raw[$v_ftp_user_index]
: "",
"v_ftp_email" => "",
"v_ftp_pre_path" => $v_ftp_user_prepath,
];
}
}
// Render page
render_page($user, $TAB, "edit_web");
// Flush session messages
unset($_SESSION["error_msg"]);
unset($_SESSION["ok_msg"]);