Jelajahi Sumber

Multiftp support

Serghey Rodin 11 tahun lalu
induk
melakukan
f42face68d

+ 305 - 232
web/add/web/index.php

@@ -4,277 +4,350 @@ error_reporting(NULL);
 ob_start();
 session_start();
 $TAB = 'WEB';
-include($_SERVER['DOCUMENT_ROOT']."/inc/main.php");
 
-// Header
-include($_SERVER['DOCUMENT_ROOT'].'/templates/header.html');
+include($_SERVER['DOCUMENT_ROOT']."/inc/main.php");
 
-// Panel
-top_panel($user,$TAB);
-$v_ftp_email = $panel[$user]['CONTACT'];
-    if (!empty($_POST['ok'])) {
-        // Check input
-        if (empty($_POST['v_domain'])) $errors[] = __('domain');
-        if (empty($_POST['v_ip'])) $errors[] = __('ip');
-        if ((!empty($_POST['v_ssl'])) && (empty($_POST['v_ssl_crt']))) $errors[] = __('ssl certificate');
-        if ((!empty($_POST['v_ssl'])) && (empty($_POST['v_ssl_key']))) $errors[] = __('ssl key');
-        if ((!empty($_POST['v_aliases'])) && ($_POST['v_aliases'] != 'www.'.$_POST['v_domain'])) $v_adv = 'yes';
-        if ((!empty($_POST['v_ssl'])) || (!empty($_POST['v_elog']))) $v_adv = 'yes';
-        if ((!empty($_POST['v_ssl_crt'])) || (!empty($_POST['v_ssl_key']))) $v_adv = 'yes';
-        if ((!empty($_POST['v_ssl_ca'])) || ($_POST['v_stats'] != 'none')) $v_adv = 'yes';
-        if (empty($_POST['v_proxy'])) $v_adv = 'yes';
-        if (!empty($_POST['v_ftp'])) $v_adv = 'yes';
-
-        $v_proxy_ext = 'jpeg, jpg, png, gif, bmp, ico, svg, tif, tiff, css, js, htm, html, ttf,';
-        $v_proxy_ext .= 'otf, webp, woff, txt, csv, rtf, doc, docx, xls, xlsx, ppt, pptx, odf, ';
-        $v_proxy_ext .= 'odp, ods, odt, pdf, psd, ai, eot, eps, ps, zip, tar, tgz, gz, rar, ';
-        $v_proxy_ext .= 'bz2, 7z, aac, m4a, mp3, mp4, ogg, wav, wma, 3gp, avi, flv, m4v, mkv, ';
-        $v_proxy_ext .= 'mov, mp4, mpeg, mpg, wmv, exe, iso, dmg, swf';
-        if ($_POST['v_proxy_ext'] != $v_proxy_ext) $v_adv = 'yes';
-
-        // Protect input
-        $v_domain = preg_replace("/^www\./i", "", $_POST['v_domain']);
-        $v_domain = escapeshellarg($v_domain);
-        $v_domain = strtolower($v_domain);
-        $v_ip = escapeshellarg($_POST['v_ip']);
-        if (empty($_POST['v_dns'])) $v_dns = 'off';
-        if (empty($_POST['v_mail'])) $v_mail = 'off';
-        if (empty($_POST['v_proxy'])) $v_proxy = 'off';
-        $v_aliases = $_POST['v_aliases'];
-        $v_elog = $_POST['v_elog'];
-        $v_ssl = $_POST['v_ssl'];
-        $v_ssl_crt = $_POST['v_ssl_crt'];
-        $v_ssl_key = $_POST['v_ssl_key'];
-        $v_ssl_ca = $_POST['v_ssl_ca'];
-        $v_ssl_home = $data[$v_domain]['SSL_HOME'];
-        $v_stats = escapeshellarg($_POST['v_stats']);
-        $v_stats_user = $data[$v_domain]['STATS_USER'];
-        $v_stats_password = $data[$v_domain]['STATS_PASSWORD'];
-        $v_proxy_ext = preg_replace("/\n/", " ", $_POST['v_proxy_ext']);
-        $v_proxy_ext = preg_replace("/,/", " ", $v_proxy_ext);
-        $v_proxy_ext = preg_replace('/\s+/', ' ',$v_proxy_ext);
-        $v_proxy_ext = trim($v_proxy_ext);
-        $v_proxy_ext = str_replace(' ', ", ", $v_proxy_ext);
-        $v_ftp = $_POST['v_ftp'];
-        $v_ftp_user = $_POST['v_ftp_user'];
-        $v_ftp_password = $_POST['v_ftp_password'];
-        $v_ftp_email = $_POST['v_ftp_email'];
-
-        // Validate email
-        if ((!empty($_POST['v_ftp_email'])) && (!filter_var($_POST['v_ftp_email'], FILTER_VALIDATE_EMAIL))) {
-            $_SESSION['error_msg'] = __('Please enter valid email address.');
-        }
+// Check POST request
+if (!empty($_POST['ok'])) {
 
-        // Check ftp password length
-        if ((!empty($_POST['v_ftp'])) && (empty($_SESSION['error_msg']))) {
-            if (!empty($_POST['v_ftp_user'])) {
-                $pw_len = strlen($_POST['v_ftp_password']);
-                if ($pw_len < 6 ) $_SESSION['error_msg'] = __('Password is too short.',$error_msg);
+    // Check for empty fields
+    if (empty($_POST['v_domain'])) $errors[] = __('domain');
+    if (empty($_POST['v_ip'])) $errors[] = __('ip');
+    if ((!empty($_POST['v_ssl'])) && (empty($_POST['v_ssl_crt']))) $errors[] = __('ssl certificate');
+    if ((!empty($_POST['v_ssl'])) && (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'] = __('Field "%s" can not be blank.',$error_msg);
+    }
 
-        // Check stats password length
-        if ((!empty($v_stats)) && (empty($_SESSION['error_msg']))) {
-            if (!empty($_POST['v_stats_user'])) {
-                $pw_len = strlen($_POST['v_stats_password']);
-                if ($pw_len < 6 ) $_SESSION['error_msg'] = __('Password is too short.',$error_msg);
-            }
+    // Check stats password length
+    if ((!empty($v_stats)) && (empty($_SESSION['error_msg']))) {
+        if (!empty($_POST['v_stats_user'])) {
+            $pw_len = strlen($_POST['v_stats_password']);
+            if ($pw_len < 6 ) $_SESSION['error_msg'] = __('Password is too short.',$error_msg);
         }
+    }
 
-        // Check for errors
-        if (!empty($errors[0])) {
-            foreach ($errors as $i => $error) {
-                if ( $i == 0 ) {
-                    $error_msg = $error;
-                } else {
-                    $error_msg = $error_msg.", ".$error;
+    // Default proxy extention list
+    $v_proxy_ext = 'jpeg, jpg, png, gif, bmp, ico, svg, tif, tiff, css, js, htm, html, ttf, ';
+    $v_proxy_ext .= 'otf, webp, woff, txt, csv, rtf, doc, docx, xls, xlsx, ppt, pptx, odf, ';
+    $v_proxy_ext .= 'odp, ods, odt, pdf, psd, ai, eot, eps, ps, zip, tar, tgz, gz, rar, ';
+    $v_proxy_ext .= 'bz2, 7z, aac, m4a, mp3, mp4, ogg, wav, wma, 3gp, avi, flv, m4v, mkv, ';
+    $v_proxy_ext .= 'mov, mp4, mpeg, mpg, wmv, exe, iso, dmg, swf';
+
+    // Set advanced option checkmark
+    if (empty($_POST['v_proxy'])) $v_adv = 'yes';
+    if (!empty($_POST['v_ftp'])) $v_adv = 'yes';
+    if ($_POST['v_proxy_ext'] != $v_proxy_ext) $v_adv = 'yes';
+
+    // Set domain name to lowercase and remove www prefix
+    $v_domain = preg_replace("/^www\./i", "", $_POST['v_domain']);
+    $v_domain = escapeshellarg($v_domain);
+    $v_domain = strtolower($v_domain);
+
+    // Prepare domain values
+    $v_ip = escapeshellarg($_POST['v_ip']);
+    if ((!empty($_POST['v_aliases'])) && ($_POST['v_aliases'] != 'www.'.$_POST['v_domain'])) $v_adv = 'yes';
+    if ((!empty($_POST['v_ssl'])) || (!empty($_POST['v_elog']))) $v_adv = 'yes';
+    if ((!empty($_POST['v_ssl_crt'])) || (!empty($_POST['v_ssl_key']))) $v_adv = 'yes';
+    if ((!empty($_POST['v_ssl_ca'])) || ($_POST['v_stats'] != 'none')) $v_adv = 'yes';
+    if (!empty($v_domain)) $v_ftp_user_prepath .= $v_domain;
+    if (empty($_POST['v_dns'])) $v_dns = 'off';
+    if (empty($_POST['v_mail'])) $v_mail = 'off';
+    if (empty($_POST['v_proxy'])) $v_proxy = 'off';
+    $v_aliases = $_POST['v_aliases'];
+    $v_elog = $_POST['v_elog'];
+    $v_ssl = $_POST['v_ssl'];
+    $v_ssl_crt = $_POST['v_ssl_crt'];
+    $v_ssl_key = $_POST['v_ssl_key'];
+    $v_ssl_ca = $_POST['v_ssl_ca'];
+    $v_ssl_home = $data[$v_domain]['SSL_HOME'];
+    $v_stats = escapeshellarg($_POST['v_stats']);
+    $v_stats_user = $data[$v_domain]['STATS_USER'];
+    $v_stats_password = $data[$v_domain]['STATS_PASSWORD'];
+    $v_proxy_ext = preg_replace("/\n/", " ", $_POST['v_proxy_ext']);
+    $v_proxy_ext = preg_replace("/,/", " ", $v_proxy_ext);
+    $v_proxy_ext = preg_replace('/\s+/', ' ',$v_proxy_ext);
+    $v_proxy_ext = trim($v_proxy_ext);
+    $v_proxy_ext = str_replace(' ', ", ", $v_proxy_ext);
+    $v_ftp = $_POST['v_ftp'];
+    $v_ftp_user = $_POST['v_ftp_user'];
+    $v_ftp_password = $_POST['v_ftp_password'];
+    $v_ftp_email = $_POST['v_ftp_email'];
+
+
+    // Add web domain
+    if (empty($_SESSION['error_msg'])) {
+        exec (VESTA_CMD."v-add-web-domain ".$user." ".$v_domain." ".$v_ip." 'no'", $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+        $domain_added = empty($_SESSION['error_msg']);
+    }
+
+    // Add DNS domain
+    if (($_POST['v_dns'] == 'on') && (empty($_SESSION['error_msg']))) {
+        exec (VESTA_CMD."v-add-dns-domain ".$user." ".$v_domain." ".$v_ip, $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
+
+    // Add mail domain
+    if (($_POST['v_mail'] == 'on') && (empty($_SESSION['error_msg']))) {
+        exec (VESTA_CMD."v-add-mail-domain ".$user." ".$v_domain, $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
+
+    // Add domain aliases
+    if ((!empty($_POST['v_aliases'])) && (empty($_SESSION['error_msg']))) {
+        $valiases = preg_replace("/\n/", " ", $_POST['v_aliases']);
+        $valiases = preg_replace("/,/", " ", $valiases);
+        $valiases = preg_replace('/\s+/', ' ',$valiases);
+        $valiases = trim($valiases);
+        $aliases = explode(" ", $valiases);
+        foreach ($aliases as $alias) {
+            if ($alias == 'www.'.$_POST['v_domain']) {
+                $www_alias = 'yes';
+            } else {
+                $alias = escapeshellarg($alias);
+                if (empty($_SESSION['error_msg'])) {
+                    exec (VESTA_CMD."v-add-web-domain-alias ".$user." ".$v_domain." ".$alias." 'no'", $output, $return_var);
+                    check_return_code($return_var,$output);
+                    unset($output);
+                }
+                if (($_POST['v_dns'] == 'on') && (empty($_SESSION['error_msg']))) {
+                    exec (VESTA_CMD."v-add-dns-on-web-alias ".$user." ".$v_domain." ".$alias." 'no'", $output, $return_var);
+                    check_return_code($return_var,$output);
+                    unset($output);
                 }
             }
-            $_SESSION['error_msg'] = __('Field "%s" can not be blank.',$error_msg);
         }
+    }
 
-        if (empty($_SESSION['error_msg'])) {
-            // Add WEB
-            exec (VESTA_CMD."v-add-web-domain ".$user." ".$v_domain." ".$v_ip." 'no'", $output, $return_var);
-            check_return_code($return_var,$output);
-            unset($output);
-
-            // Add DNS
-            if (($_POST['v_dns'] == 'on') && (empty($_SESSION['error_msg']))) {
-                exec (VESTA_CMD."v-add-dns-domain ".$user." ".$v_domain." ".$v_ip, $output, $return_var);
-                check_return_code($return_var,$output);
-                unset($output);
-            }
+    // Delete www. alias if it wasn't found
+    if ((empty($www_alias)) && (empty($_SESSION['error_msg']))) {
+        $alias =  preg_replace("/^www./i", "", $_POST['v_domain']);
+        $alias = 'www.'.$alias;
+        $alias = escapeshellarg($alias);
+        exec (VESTA_CMD."v-delete-web-domain-alias ".$user." ".$v_domain." ".$alias." 'no'", $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
 
-            // Add Mail
-            if (($_POST['v_mail'] == 'on') && (empty($_SESSION['error_msg']))) {
-                exec (VESTA_CMD."v-add-mail-domain ".$user." ".$v_domain, $output, $return_var);
-                check_return_code($return_var,$output);
-                unset($output);
-            }
+    // Add proxy support
+    if (($_POST['v_proxy'] == 'on')  && (empty($_SESSION['error_msg']))) {
+        $ext = str_replace(' ', '', $v_proxy_ext);
+        $ext = escapeshellarg($ext);
+        exec (VESTA_CMD."v-add-web-domain-proxy ".$user." ".$v_domain." '' ".$ext." 'no'", $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
 
-            // Add Aliases
-            if ((!empty($_POST['v_aliases'])) && (empty($_SESSION['error_msg']))) {
-                $valiases = preg_replace("/\n/", " ", $_POST['v_aliases']);
-                $valiases = preg_replace("/,/", " ", $valiases);
-                $valiases = preg_replace('/\s+/', ' ',$valiases);
-                $valiases = trim($valiases);
-                $aliases = explode(" ", $valiases);
-                foreach ($aliases as $alias) {
-                    if ($alias == 'www.'.$_POST['v_domain']) {
-                        $www_alias = 'yes';
-                    } else {
-                        $alias = escapeshellarg($alias);
-                        if (empty($_SESSION['error_msg'])) {
-                            exec (VESTA_CMD."v-add-web-domain-alias ".$user." ".$v_domain." ".$alias." 'no'", $output, $return_var);
-                            check_return_code($return_var,$output);
-                        }
-                        unset($output);
-                        if (($_POST['v_dns'] == 'on') && (empty($_SESSION['error_msg']))) {
-                            exec (VESTA_CMD."v-add-dns-on-web-alias ".$user." ".$v_domain." ".$alias." 'no'", $output, $return_var);
-                            check_return_code($return_var,$output);
-                            unset($output);
-                        }
-                    }
-                }
-            }
-            if ((empty($www_alias)) && (empty($_SESSION['error_msg']))) {
-                $alias =  preg_replace("/^www./i", "", $_POST['v_domain']);
-                $alias = 'www.'.$alias;
-                $alias = escapeshellarg($alias);
-                exec (VESTA_CMD."v-delete-web-domain-alias ".$user." ".$v_domain." ".$alias." 'no'", $output, $return_var);
-                check_return_code($return_var,$output);
-            }
+    // Add SSL certificates
+    if ((!empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
+        exec ('mktemp -d', $output, $return_var);
+        $tmpdir = $output[0];
+        unset($output);
 
+        // Save certificate
+        if (!empty($_POST['v_ssl_crt'])) {
+            $fp = fopen($tmpdir."/".$_POST['v_domain'].".crt", 'w');
+            fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_crt']));
+            fwrite($fp, "\n");
+            fclose($fp);
+        }
 
-            // Add proxy
-            if (($_POST['v_proxy'] == 'on') && (empty($_SESSION['error_msg']))) {
-                $ext = str_replace(' ', '', $v_proxy_ext);
-                $ext = escapeshellarg($ext);
-                exec (VESTA_CMD."v-add-web-domain-proxy ".$user." ".$v_domain." '' ".$ext." 'no'", $output, $return_var);
-                check_return_code($return_var,$output);
-                unset($output);
-            }
+        // Save private key
+        if (!empty($_POST['v_ssl_key'])) {
+            $fp = fopen($tmpdir."/".$_POST['v_domain'].".key", 'w');
+            fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_key']));
+            fwrite($fp, "\n");
+            fclose($fp);
+        }
 
-            // Add SSL
-            if (!empty($_POST['v_ssl'])) {
-                exec ('mktemp -d', $output, $return_var);
-                $tmpdir = $output[0];
-
-                // Certificate
-                if (!empty($_POST['v_ssl_crt'])) {
-                    $fp = fopen($tmpdir."/".$_POST['v_domain'].".crt", 'w');
-                    fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_crt']));
-                    fwrite($fp, "\n");
-                    fclose($fp);
+        // Save CA bundle
+        if (!empty($_POST['v_ssl_ca'])) {
+            $fp = fopen($tmpdir."/".$_POST['v_domain'].".ca", 'w');
+            fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_ca']));
+            fwrite($fp, "\n");
+            fclose($fp);
+        }
+
+        $v_ssl_home = escapeshellarg($_POST['v_ssl_home']);
+        exec (VESTA_CMD."v-add-web-domain-ssl ".$user." ".$v_domain." ".$tmpdir." ".$v_ssl_home." 'no'", $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
+
+    // Add web stats
+    if ((!empty($_POST['v_stats'])) && ($_POST['v_stats'] != 'none' ) && (empty($_SESSION['error_msg']))) {
+        $v_stats = escapeshellarg($_POST['v_stats']);
+        exec (VESTA_CMD."v-add-web-domain-stats ".$user." ".$v_domain." ".$v_stats, $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
+
+    // Add web stats password
+    if ((!empty($_POST['v_stats_user'])) && (empty($_SESSION['error_msg']))) {
+        $v_stats_user = escapeshellarg($_POST['v_stats_user']);
+        $v_stats_password = escapeshellarg($_POST['v_stats_password']);
+        exec (VESTA_CMD."v-add-web-domain-stats-user ".$user." ".$v_domain." ".$v_stats_user." ".$v_stats_password, $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
+
+    // Restart DNS server
+    if (($_POST['v_dns'] == 'on') && (empty($_SESSION['error_msg']))) {
+        exec (VESTA_CMD."v-restart-dns", $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
+
+    // Restart web server
+    if (empty($_SESSION['error_msg'])) {
+        exec (VESTA_CMD."v-restart-web", $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
+
+    // Restart proxy server
+    if (($_POST['v_proxy'] == 'on') && (empty($_SESSION['error_msg']))) {
+        exec (VESTA_CMD."v-restart-proxy", $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);
+    }
+
+    // Add FTP
+    if ((!empty($_POST['v_ftp'])) && (empty($_SESSION['error_msg']))) {
+        $v_ftp_users_updated = array();
+        foreach ($_POST['v_ftp_user'] as $i => $v_ftp_user_data) {
+            if ($v_ftp_user_data['is_new'] == 1) {
+                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 valid email address.');
+                if (empty($v_ftp_user_data['v_ftp_user'])) $errors[] = 'ftp user';
+                if (empty($v_ftp_user_data['v_ftp_password'])) $errors[] = 'ftp user password';
+                if (!empty($errors[0])) {
+                    foreach ($errors as $i => $error) {
+                        if ( $i == 0 ) {
+                            $error_msg = $error;
+                        } else {
+                            $error_msg = $error_msg.", ".$error;
+                        }
+                    }
+                    $_SESSION['error_msg'] = __('Field "%s" can not be blank.',$error_msg);
                 }
 
-                // Key
-                if (!empty($_POST['v_ssl_key'])) {
-                    $fp = fopen($tmpdir."/".$_POST['v_domain'].".key", 'w');
-                    fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_key']));
-                    fwrite($fp, "\n");
-                    fclose($fp);
+                // Validate email
+                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 valid email address.');
                 }
 
-                // CA
-                if (!empty($_POST['v_ssl_ca'])) {
-                    $fp = fopen($tmpdir."/".$_POST['v_domain'].".ca", 'w');
-                    fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_ca']));
-                    fwrite($fp, "\n");
-                    fclose($fp);
+                // Check ftp password length
+                if ((!empty($v_ftp_user_data['v_ftp']))) {
+                    if (!empty($v_ftp_user_data['v_ftp_user'])) {
+                        $pw_len = strlen($v_ftp_user_data['v_ftp_password']);
+                        if ($pw_len < 6 ) $_SESSION['error_msg'] = __('Password is too short.',$error_msg);
+                    }
                 }
 
-                $v_ssl_home = escapeshellarg($_POST['v_ssl_home']);
-                exec (VESTA_CMD."v-add-web-domain-ssl ".$user." ".$v_domain." ".$tmpdir." ".$v_ssl_home." 'no'", $output, $return_var);
-                check_return_code($return_var,$output);
-                unset($output);
-            }
+                $v_ftp_user_data['v_ftp_user'] = preg_replace("/^".$user."_/i", "", $v_ftp_user_data['v_ftp_user']);
+                $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 = escapeshellarg($v_ftp_user_data['v_ftp_user']);
+                $v_ftp_password = escapeshellarg($v_ftp_user_data['v_ftp_password']);
 
-            // Add WebStats
-            if ((!empty($_POST['v_stats'])) && ($_POST['v_stats'] != 'none' ) && (empty($_SESSION['error_msg']))) {
-                $v_stats = escapeshellarg($_POST['v_stats']);
-                exec (VESTA_CMD."v-add-web-domain-stats ".$user." ".$v_domain." ".$v_stats, $output, $return_var);
-                check_return_code($return_var,$output);
-                unset($output);
-
-                if ((!empty($_POST['v_stats_user'])) && (empty($_SESSION['error_msg']))) {
-                    $v_stats_user = escapeshellarg($_POST['v_stats_user']);
-                    $v_stats_password = escapeshellarg($_POST['v_stats_password']);
-                    exec (VESTA_CMD."v-add-web-domain-stats-user ".$user." ".$v_domain." ".$v_stats_user." ".$v_stats_password, $output, $return_var);
+                if ($domain_added) {
+                    exec (VESTA_CMD."v-add-web-domain-ftp ".$user." ".$v_domain." ".$v_ftp_username." ".$v_ftp_password . " " . $v_ftp_user_data['v_ftp_path'], $output, $return_var);
                     check_return_code($return_var,$output);
-                    unset($v_stats_user);
-                    unset($v_stats_password);
                     unset($output);
-                }
-            }
-
-
-            // Add FTP
-            if ((!empty($_POST['v_ftp'])) && (empty($_SESSION['error_msg']))) {
-                $v_ftp_user = escapeshellarg($_POST['v_ftp_user']);
-                $v_ftp_password = escapeshellarg($_POST['v_ftp_password']);
-                exec (VESTA_CMD."v-add-web-domain-ftp ".$user." ".$v_domain." ".$v_ftp_user." ".$v_ftp_password, $output, $return_var);
-                check_return_code($return_var,$output);
-                if (empty($_SESSION['error_msg'])) {
-                    if (!empty($v_ftp_email)) {
-                        $to = $_POST['v_ftp_email'];
+                    if ((!empty($v_ftp_user_data['v_ftp_email'])) && (empty($_SESSION['error_msg']))) {
+                        $to = $v_ftp_user_data['v_ftp_email'];
                         $subject = __("FTP login credentials");
-                        $hostname = exec('hostname');
-                        $from = __('MAIL_FROM',$hostname);
-                        $mailtext .= __('FTP_ACCOUNT_READY',$_POST['v_domain'],$user,$_POST['v_ftp_user'],$_POST['v_ftp_password']);
+                        $from = __('MAIL_FROM',$_POST['v_domain']);
+                        $mailtext = __('FTP_ACCOUNT_READY',$_POST['v_domain'],$user,$v_ftp_user_data['v_ftp_user'],$v_ftp_user_data['v_ftp_password']);
                         send_email($to, $subject, $mailtext, $from);
+                        unset($v_ftp_email);
                     }
+                } else {
+                    $return_var = -1;
                 }
-                unset($v_ftp);
-                unset($v_ftp_user);
-                unset($v_ftp_password);
-                unset($output);
-            }
 
-            if (($_POST['v_dns'] == 'on') && (empty($_SESSION['error_msg']))) {
-                exec (VESTA_CMD."v-restart-dns", $output, $return_var);
-                check_return_code($return_var,$output);
-                unset($output);
-            }
-
-            if (empty($_SESSION['error_msg'])) {
-                exec (VESTA_CMD."v-restart-web", $output, $return_var);
-                check_return_code($return_var,$output);
-                unset($output);
-            }
+                if ($return_var == 0) {
+                    $v_ftp_password = "••••••••";
+                    $v_ftp_user_data['is_new'] = 0;
+                } else {
+                    $v_ftp_user_data['is_new'] = 1;
+                }
 
-            if (empty($_SESSION['error_msg'])) {
-                exec (VESTA_CMD."v-restart-proxy", $output, $return_var);
-                check_return_code($return_var,$output);
-                unset($output);
+                $v_ftp_username = preg_replace("/^".$user."_/", "", $v_ftp_user_data['v_ftp_user']);
+                $v_ftp_users_updated[] = array(
+                    'is_new'            => $v_ftp_user_data['is_new'],
+                    'v_ftp_user'        => $return_var == 0 ? $v_ftp_username_full : $v_ftp_username,
+                    '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;
             }
+        }
 
-            if (empty($_SESSION['error_msg'])) {
-                unset($output);
-                $_SESSION['ok_msg'] = __('WEB_DOMAIN_CREATED_OK',$_POST[v_domain],$_POST[v_domain]);
-                unset($v_domain);
-                unset($v_aliases);
-                unset($v_ssl);
-                unset($v_ssl_crt);
-                unset($v_ssl_key);
-                unset($v_ssl_ca);
-            }
+        if (!empty($_SESSION['error_msg']) && $domain_added) {
+            $_SESSION['ok_msg'] = __('WEB_DOMAIN_CREATED_OK',$_POST[v_domain],$_POST[v_domain]);
+            $_SESSION['flash_error_msg'] = $_SESSION['error_msg'];
+            $url = '/edit/web/?domain='.strtolower(preg_replace("/^www\./i", "", $_POST['v_domain']));
+            header('Location: ' . $url);
+            exit;
         }
     }
 
-    exec (VESTA_CMD."v-list-user-ips ".$user." json", $output, $return_var);
-    $ips = json_decode(implode('', $output), true);
-    unset($output);
+    // Flush field values on success
+    if (empty($_SESSION['error_msg'])) {
+        $_SESSION['ok_msg'] = __('WEB_DOMAIN_CREATED_OK',$_POST[v_domain],$_POST[v_domain]);
+        unset($v_domain);
+        unset($v_aliases);
+        unset($v_ssl);
+        unset($v_ssl_crt);
+        unset($v_ssl_key);
+        unset($v_ssl_ca);
+        unset($v_stats_user);
+        unset($v_stats_password);
+        unset($v_ftp);
+    }
+}
+
+
+// Header
+include($_SERVER['DOCUMENT_ROOT'].'/templates/header.html');
+
+// Panel
+top_panel($user,$TAB);
+
+// Define user variables
+$v_ftp_user_prepath = $panel[$user]['HOME'] . "/web";
+$v_ftp_email = $panel[$user]['CONTACT'];
+
+// List IP addresses
+exec (VESTA_CMD."v-list-user-ips ".$user." json", $output, $return_var);
+$ips = json_decode(implode('', $output), true);
+unset($output);
+
+// List web stat engines
+exec (VESTA_CMD."v-list-web-stats json", $output, $return_var);
+$stats = json_decode(implode('', $output), true);
+unset($output);
 
-    exec (VESTA_CMD."v-list-web-stats json", $output, $return_var);
-    $stats = json_decode(implode('', $output), true);
-    unset($output);
+// Display body
+include($_SERVER['DOCUMENT_ROOT'].'/templates/admin/add_web.html');
 
-    include($_SERVER['DOCUMENT_ROOT'].'/templates/admin/add_web.html');
-    unset($_SESSION['error_msg']);
-    unset($_SESSION['ok_msg']);
-//}
+// Flush session messages
+unset($_SESSION['error_msg']);
+unset($_SESSION['ok_msg']);
 
 // Footer
 include($_SERVER['DOCUMENT_ROOT'].'/templates/footer.html');

+ 270 - 154
web/edit/web/index.php

@@ -4,17 +4,11 @@ error_reporting(NULL);
 ob_start();
 session_start();
 unset($_SESSION['error_msg']);
-
 $TAB = 'WEB';
-include($_SERVER['DOCUMENT_ROOT']."/inc/main.php");
-
-// Header
-include($_SERVER['DOCUMENT_ROOT'].'/templates/header.html');
 
-// Panel
-top_panel($user,$TAB);
+include($_SERVER['DOCUMENT_ROOT']."/inc/main.php");
 
-// Check user argument?
+// Check domain argument
 if (empty($_GET['domain'])) {
     header("Location: /list/web/");
     exit;
@@ -25,73 +19,77 @@ if (($_SESSION['user'] == 'admin') && (!empty($_GET['user']))) {
     $user=escapeshellarg($_GET['user']);
 }
 
-// Check domain
+// List domain
 $v_domain = escapeshellarg($_GET['domain']);
 exec (VESTA_CMD."v-list-web-domain ".$user." ".$v_domain." json", $output, $return_var);
-check_return_code($return_var,$output);
-if (empty($_SESSION['error_msg'])) {
-    $data = json_decode(implode('', $output), true);
-    unset($output);
-    $v_username = $user;
-    $v_domain = $_GET['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_tpl = $data[$v_domain]['IP'];
-    $v_cgi = $data[$v_domain]['CGI'];
-    $v_elog = $data[$v_domain]['ELOG'];
-    $v_ssl = $data[$v_domain]['SSL'];
-    if ( $v_ssl == 'yes' ) {
-        exec (VESTA_CMD."v-list-web-domain-ssl ".$user." '".$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_home = $data[$v_domain]['SSL_HOME'];
-    $v_proxy = $data[$v_domain]['PROXY'];
-    $v_proxy_template = $data[$v_domain]['PROXY'];
-    $v_proxy_ext = str_replace(',', ', ', $data[$v_domain]['PROXY_EXT']);
-    $v_stats = $data[$v_domain]['STATS'];
-    $v_stats_user = $data[$v_domain]['STATS_USER'];
-    if (!empty($v_stats_user)) $v_stats_password = "••••••••";
-    $v_ftp_user = $data[$v_domain]['FTP_USER'];
-    if (!empty($v_ftp_user)) $v_ftp_password = "••••••••";
-    $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'];
-
-    exec (VESTA_CMD."v-list-user-ips ".$user." json", $output, $return_var);
-    $ips = json_decode(implode('', $output), true);
-    unset($output);
-
-    exec (VESTA_CMD."v-list-web-templates json", $output, $return_var);
-    $templates = json_decode(implode('', $output), true);
-    unset($output);
-
-    exec (VESTA_CMD."v-list-web-templates-proxy json", $output, $return_var);
-    $proxy_templates = json_decode(implode('', $output), true);
-    unset($output);
-
-    exec (VESTA_CMD."v-list-web-stats json", $output, $return_var);
-    $stats = json_decode(implode('', $output), true);
+$data = json_decode(implode('', $output), true);
+unset($output);
+
+// Parse domain
+$v_username = $user;
+$v_domain = $_GET['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_tpl = $data[$v_domain]['IP'];
+$v_cgi = $data[$v_domain]['CGI'];
+$v_elog = $data[$v_domain]['ELOG'];
+$v_ssl = $data[$v_domain]['SSL'];
+if ( $v_ssl == 'yes' ) {
+    exec (VESTA_CMD."v-list-web-domain-ssl ".$user." '".$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'];
 }
-
-
-// Action
+$v_ssl_home = $data[$v_domain]['SSL_HOME'];
+$v_proxy = $data[$v_domain]['PROXY'];
+$v_proxy_template = $data[$v_domain]['PROXY'];
+$v_proxy_ext = str_replace(',', ', ', $data[$v_domain]['PROXY_EXT']);
+$v_stats = $data[$v_domain]['STATS'];
+$v_stats_user = $data[$v_domain]['STATS_USER'];
+if (!empty($v_stats_user)) $v_stats_password = "••••••••";
+$v_ftp_user = $data[$v_domain]['FTP_USER'];
+if (!empty($v_ftp_user)) $v_ftp_password = "••••••••";
+$v_ftp_user_prepath = $data[$v_domain]['DOCUMENT_ROOT'];
+$v_ftp_user_prepath = str_replace('/public_html', '', $v_ftp_user_prepath, $occurance = 1);
 $v_ftp_email = $panel[$user]['CONTACT'];
+$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 (VESTA_CMD."v-list-user-ips ".$user." json", $output, $return_var);
+$ips = json_decode(implode('', $output), true);
+unset($output);
+
+// List web templates
+exec (VESTA_CMD."v-list-web-templates json", $output, $return_var);
+$templates = json_decode(implode('', $output), true);
+unset($output);
+
+// List proxy templates
+exec (VESTA_CMD."v-list-web-templates-proxy json", $output, $return_var);
+$proxy_templates = json_decode(implode('', $output), true);
+unset($output);
+
+// List web stat engines
+exec (VESTA_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 = escapeshellarg($_POST['v_domain']);
 
-    // IP
+    // Change web domain IP
     if (($v_ip != $_POST['v_ip']) && (empty($_SESSION['error_msg']))) {
         $v_ip = escapeshellarg($_POST['v_ip']);
         exec (VESTA_CMD."v-change-web-domain-ip ".$v_username." ".$v_domain." ".$v_ip." 'no'", $output, $return_var);
@@ -99,27 +97,36 @@ if (!empty($_POST['save'])) {
         $restart_web = 'yes';
         $restart_proxy = 'yes';
         unset($output);
+    }
+
+    // Chane dns domain IP
+    if (empty($_SESSION['error_msg'])) {
         exec (VESTA_CMD."v-list-dns-domain ".$v_username." ".$v_domain." json", $output, $return_var);
-        if ((empty($_SESSION['error_msg'])) && ($return_var == 0 )) {
-            unset($output);
+        unset($output);
+        if ($return_var == 0 ) {
             exec (VESTA_CMD."v-change-dns-domain-ip ".$v_username." ".$v_domain." ".$v_ip." 'no'", $output, $return_var);
             check_return_code($return_var,$output);
+            unset($output);
             $restart_dns = 'yes';
         }
-        unset($output);
+    }
+
+    // Change dns ip for each alias
+    if (empty($_SESSION['error_msg'])) {
         foreach($valiases as $v_alias ){
             exec (VESTA_CMD."v-list-dns-domain ".$v_username." '".$v_alias."' json", $output, $return_var);
-            if ((empty($_SESSION['error_msg'])) && ($return_var == 0 )) {
+            unset($output);
+            if ($return_var == 0 ) {
                 exec (VESTA_CMD."v-change-dns-domain-ip ".$v_username." '".$v_alias."' ".$v_ip, $output, $return_var);
                 check_return_code($return_var,$output);
+                unset($output);
                 $restart_dns = 'yes';
             }
-            unset($output);
         }
     }
 
-    // Template
-    if (( $_SESSION['user'] == 'admin') && ($v_template != $_POST['v_template']) && (empty($_SESSION['error_msg']))) {
+    // Change template (admin only)
+    if (($v_template != $_POST['v_template']) && ( $_SESSION['user'] == 'admin') && (empty($_SESSION['error_msg']))) {
         $v_template = escapeshellarg($_POST['v_template']);
         exec (VESTA_CMD."v-change-web-domain-tpl ".$v_username." ".$v_domain." ".$v_template." 'no'", $output, $return_var);
         check_return_code($return_var,$output);
@@ -127,7 +134,7 @@ if (!empty($_POST['save'])) {
         $restart_web = 'yes';
     }
 
-    // Aliases
+    // Change aliases
     if (empty($_SESSION['error_msg'])) {
         $waliases = preg_replace("/\n/", " ", $_POST['v_aliases']);
         $waliases = preg_replace("/,/", " ", $waliases);
@@ -151,9 +158,9 @@ if (!empty($_POST['save'])) {
                     if ($return_var == 0) {
                         exec (VESTA_CMD."v-delete-dns-on-web-alias ".$v_username." ".$v_domain." '".$alias."' 'no'", $output, $return_var);
                         check_return_code($return_var,$output);
+                        unset($output);
                         $restart_dns = 'yes';
                     }
-                    unset($output);
                 }
             }
         }
@@ -173,15 +180,15 @@ if (!empty($_POST['save'])) {
                     if ($return_var == 0) {
                         exec (VESTA_CMD."v-add-dns-on-web-alias ".$v_username." ".$v_domain." '".$alias."' 'no'", $output, $return_var);
                         check_return_code($return_var,$output);
+                    unset($output);
                         $restart_dns = 'yes';
                     }
                 }
-                unset($output);
             }
         }
     }
 
-    // Proxy
+    // Delete proxy support
     if ((!empty($v_proxy)) && (empty($_POST['v_proxy'])) && (empty($_SESSION['error_msg']))) {
         exec (VESTA_CMD."v-delete-web-domain-proxy ".$v_username." ".$v_domain." 'no'", $output, $return_var);
         check_return_code($return_var,$output);
@@ -189,6 +196,8 @@ if (!empty($_POST['save'])) {
         unset($v_proxy);
         $restart_proxy = 'yes';
     }
+
+    // Change proxy template / Update extention list
     if ((!empty($v_proxy)) && (!empty($_POST['v_proxy'])) && (empty($_SESSION['error_msg']))) {
         $ext = preg_replace("/\n/", " ", $_POST['v_proxy_ext']);
         $ext = preg_replace("/,/", " ", $ext);
@@ -205,6 +214,8 @@ if (!empty($_POST['save'])) {
             $restart_proxy = 'yes';
         }
     }
+
+    // Add proxy support
     if ((empty($v_proxy)) && (!empty($_POST['v_proxy'])) && (empty($_SESSION['error_msg']))) {
         $v_proxy_template = $_POST['v_proxy_template'];
         if (!empty($_POST['v_proxy_ext'])) {
@@ -221,7 +232,7 @@ if (!empty($_POST['save'])) {
         $restart_proxy = 'yes';
     }
 
-    // SSL
+    // Delete SSL certificate
     if (( $v_ssl == 'yes' ) && (empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
         exec (VESTA_CMD."v-delete-web-domain-ssl ".$v_username." ".$v_domain." 'no'", $output, $return_var);
         check_return_code($return_var,$output);
@@ -230,6 +241,8 @@ if (!empty($_POST['save'])) {
         $restart_web = 'yes';
         $restart_proxy = 'yes';
     }
+
+    // Change SSL certificate
     if (($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);
@@ -269,15 +282,8 @@ if (!empty($_POST['save'])) {
             $v_ssl_ca = $_POST['v_ssl_ca'];
         }
     }
-    if (( $v_ssl == 'yes') && (!empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
-        if ( $v_ssl_home != $_POST['v_ssl_home'] ) {
-            $v_ssl_home = escapeshellarg($_POST['v_ssl_home']);
-            exec (VESTA_CMD."v-change-web-domain-sslhome ".$user." ".$v_domain." ".$v_ssl_home." 'no'", $output, $return_var);
-            check_return_code($return_var,$output);
-            $v_ssl_home = $_POST['v_ssl_home'];
-            unset($output);
-        }
-    }
+
+    // Add SSL certificate
     if (( $v_ssl == 'no') && (!empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
         if ((!empty($_POST['v_ssl'])) && (empty($_POST['v_ssl_crt']))) $errors[] = 'ssl certificate';
         if ((!empty($_POST['v_ssl'])) && (empty($_POST['v_ssl_key']))) $errors[] = 'ssl key';
@@ -329,19 +335,34 @@ if (!empty($_POST['save'])) {
         }
     }
 
-    // Web Stats
+    // Change document root for ssl domain
+    if (( $v_ssl == 'yes') && (!empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
+        if ( $v_ssl_home != $_POST['v_ssl_home'] ) {
+            $v_ssl_home = escapeshellarg($_POST['v_ssl_home']);
+            exec (VESTA_CMD."v-change-web-domain-sslhome ".$user." ".$v_domain." ".$v_ssl_home." 'no'", $output, $return_var);
+            check_return_code($return_var,$output);
+            $v_ssl_home = $_POST['v_ssl_home'];
+            unset($output);
+        }
+    }
+
+    // Delete web stats
     if ((!empty($v_stats)) && ($_POST['v_stats'] == 'none') && (empty($_SESSION['error_msg']))) {
         exec (VESTA_CMD."v-delete-web-domain-stats ".$v_username." ".$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 = escapeshellarg($_POST['v_stats']);
         exec (VESTA_CMD."v-change-web-domain-stats ".$v_username." ".$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 = escapeshellarg($_POST['v_stats']);
         exec (VESTA_CMD."v-add-web-domain-stats ".$v_username." ".$v_domain." ".$v_stats, $output, $return_var);
@@ -349,7 +370,7 @@ if (!empty($_POST['save'])) {
         unset($output);
     }
 
-    // Web Stats Auth
+    // Delete web stats authorization
     if ((!empty($v_stats_user)) && (empty($_POST['v_stats_auth'])) && (empty($_SESSION['error_msg']))) {
         exec (VESTA_CMD."v-delete-web-domain-stats-user ".$v_username." ".$v_domain, $output, $return_var);
         check_return_code($return_var,$output);
@@ -357,6 +378,8 @@ if (!empty($_POST['save'])) {
         $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[] = __('stats username');
         if (empty($_POST['v_stats_password'])) $errors[] = __('stats password');
@@ -378,6 +401,8 @@ if (!empty($_POST['save'])) {
             $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[] = __('stats user');
         if (empty($_POST['v_stats_password'])) $errors[] = __('stats password');
@@ -401,112 +426,203 @@ if (!empty($_POST['save'])) {
         }
     }
 
-    // Delete FTP Account
-    if ((!empty($v_ftp_user)) && (empty($_POST['v_ftp'])) && (empty($_SESSION['error_msg']))) {
-        exec (VESTA_CMD."v-delete-web-domain-ftp ".$v_username." ".$v_domain, $output, $return_var);
-        check_return_code($return_var,$output);
-        unset($output);
-        $v_ftp= '';
-        $v_ftp_user = '';
-        $v_ftp_password = '';
-    }
+    // Change ftp accounts
+    if (!empty($_POST['v_ftp_user'])) {
+        $v_ftp_users_updated = array();
+        foreach ($_POST['v_ftp_user'] as $i => $v_ftp_user_data) {
+            $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) {
+                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 valid email address.');
+                if (empty($v_ftp_user_data['v_ftp_user'])) $errors[] = 'ftp user';
+                if (empty($v_ftp_user_data['v_ftp_password'])) $errors[] = 'ftp user password';
+                if (!empty($errors[0])) {
+                    foreach ($errors as $i => $error) {
+                        if ( $i == 0 ) {
+                            $error_msg = $error;
+                        } else {
+                            $error_msg = $error_msg.", ".$error;
+                        }
+                    }
+                    $_SESSION['error_msg'] = __('Field "%s" can not be blank.',$error_msg);
+                }
 
-    // Change FTP Account
-    if ((!empty($v_ftp_user)) && (!empty($_POST['v_ftp'])) && (empty($_SESSION['error_msg']))) {
-        if (empty($_POST['v_ftp_user'])) $errors[] = __('ftp user');
-        if (empty($_POST['v_ftp_password'])) $errors[] = __('ftp user password');
-        if (!empty($errors[0])) {
-            foreach ($errors as $i => $error) {
-                if ( $i == 0 ) {
-                    $error_msg = $error;
-                } else {
-                    $error_msg = $error_msg.", ".$error;
+                $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 = escapeshellarg($v_ftp_username);
+                $v_ftp_password = escapeshellarg($v_ftp_user_data['v_ftp_password']);
+                if (empty($_SESSION['error_msg'])) {
+                    exec (VESTA_CMD."v-add-web-domain-ftp ".$v_username." ".$v_domain." ".$v_ftp_username." ".$v_ftp_password . " " . $v_ftp_user_data['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'];
+                        $subject = __("FTP login credentials");
+                        $hostname = exec('hostname');
+                        $from = __('MAIL_FROM',$hostname);
+                        $mailtext = __('FTP_ACCOUNT_READY',$_GET['domain'],$user,$v_ftp_username,$v_ftp_user_data['v_ftp_password']);
+                        send_email($to, $subject, $mailtext, $from);
+                        unset($v_ftp_email);
+                    }
+                    unset($output);
+                }
+
+                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[] = array(
+                    '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;
             }
-            $_SESSION['error_msg'] = __('Field "%s" can not be blank.',$error_msg);
-        }
-        if (($v_ftp_user != $_POST['v_ftp_user']) || ($_POST['v_ftp_password'] != "••••••••" ) && (empty($_SESSION['error_msg']))) {
-            $v_ftp_user = preg_replace("/^".$user."_/", "", $_POST['v_ftp_user']);
-            $v_ftp_user = escapeshellarg($v_ftp_user);
-            $v_ftp_password = escapeshellarg($_POST['v_ftp_password']);
-            exec (VESTA_CMD."v-add-web-domain-ftp ".$v_username." ".$v_domain." ".$v_ftp_user." ".$v_ftp_password, $output, $return_var);
-            check_return_code($return_var,$output);
-            unset($output);
-            $v_ftp= '';
-            $v_ftp_user = $user."_".preg_replace("/^".$user."_/", "", $_POST['v_ftp_user']);
-            $v_ftp_password = "••••••••";
-        }
-    }
 
-    // Add FTP Account
-    if ((empty($v_ftp_user)) && (!empty($_POST['v_ftp'])) && (empty($_SESSION['error_msg']))) {
-        if ((!empty($_POST['v_ftp_email'])) && (!filter_var($_POST['v_ftp_email'], FILTER_VALIDATE_EMAIL))) $_SESSION['error_msg'] = __('Please enter valid email address.');
-        if (empty($_POST['v_ftp_user'])) $errors[] = 'ftp user';
-        if (empty($_POST['v_ftp_password'])) $errors[] = 'ftp user password';
-        if (!empty($errors[0])) {
-            foreach ($errors as $i => $error) {
-                if ( $i == 0 ) {
-                    $error_msg = $error;
-                } else {
-                    $error_msg = $error_msg.", ".$error;
+
+            if ($v_ftp_user_data['delete'] == 1) {
+                $v_ftp_username = $user . '_' . $v_ftp_user_data['v_ftp_user'];
+                exec (VESTA_CMD."v-delete-web-domain-ftp ".$v_username." ".$v_domain." ".$v_ftp_username, $output, $return_var);
+                check_return_code($return_var,$output);
+                unset($output);
+
+                continue;
+            }
+
+            // Change FTP Account
+            if (empty($v_ftp_user_data['v_ftp_user'])) $errors[] = __('ftp user');
+            if (empty($v_ftp_user_data['v_ftp_password'])) $errors[] = __('ftp user password');
+            if (!empty($errors[0])) {
+                foreach ($errors as $i => $error) {
+                    if ( $i == 0 ) {
+                        $error_msg = $error;
+                    } else {
+                        $error_msg = $error_msg.", ".$error;
+                    }
                 }
+                $_SESSION['error_msg'] = __('Field "%s" can not be blank.',$error_msg);
             }
-            $_SESSION['error_msg'] = __('Field "%s" can not be blank.',$error_msg);
-        }
-        if (empty($_SESSION['error_msg'])) {
-            $v_ftp_user = escapeshellarg($_POST['v_ftp_user']);
-            $v_ftp_password = escapeshellarg($_POST['v_ftp_password']);
-            exec (VESTA_CMD."v-add-web-domain-ftp ".$v_username." ".$v_domain." ".$v_ftp_user." ".$v_ftp_password, $output, $return_var);
-            check_return_code($return_var,$output);
-            if ((!empty($_POST['v_ftp_email'])) && (empty($_SESSION['error_msg']))) {
-                $to = $_POST['v_ftp_email'];
-                $subject = __("FTP login credentials");
-                $hostname = exec('hostname');
-                $from = __('MAIL_FROM',$hostname);
-                $mailtext .= __('FTP_ACCOUNT_READY',$_GET['domain'],$user,$_POST['v_ftp_user'],$_POST['v_ftp_password']);
-                send_email($to, $subject, $mailtext, $from);
-                unset($v_ftp_email);
+
+            $v_ftp_username = $user . '_' . $v_ftp_user_data['v_ftp_user']; //preg_replace("/^".$user."_/", "", $v_ftp_user_data['v_ftp_user']);
+            $v_ftp_username = escapeshellarg($v_ftp_username);
+            $v_ftp_user_data['v_ftp_password'] = escapeshellarg(trim($v_ftp_user_data['v_ftp_password']));
+            exec (VESTA_CMD."v-change-web-domain-ftp-path ".$v_username." ".$v_domain." ".$v_ftp_username." ".$v_ftp_user_data['v_ftp_path'], $output, $return_var);
+            if ($v_ftp_user_data['v_ftp_password'] != "••••••••" && !empty($v_ftp_user_data['v_ftp_password'])) {
+                exec (VESTA_CMD."v-change-web-domain-ftp-password ".$v_username." ".$v_domain." ".$v_ftp_username." ".$v_ftp_user_data['v_ftp_password'], $output, $return_var);
             }
+            check_return_code($return_var, $output);
             unset($output);
-            $v_ftp_user =  $user."_".$_POST['v_ftp_user'];
+
             $v_ftp_password = "••••••••";
+
+            $v_ftp_users_updated[] = array(
+                'is_new'            => 0,
+                'v_ftp_user'        => $v_ftp_username,
+                '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
+            );
         }
     }
 
-    // Restart web
+    // Restart web server
     if (!empty($restart_web) && (empty($_SESSION['error_msg']))) {
         exec (VESTA_CMD."v-restart-web", $output, $return_var);
         check_return_code($return_var,$output);
         unset($output);
     }
 
-    // Restart proxy
+    // Restart proxy server
     if (!empty($restart_proxy) && (empty($_SESSION['error_msg']))) {
         exec (VESTA_CMD."v-restart-proxy", $output, $return_var);
         check_return_code($return_var,$output);
         unset($output);
     }
 
-    // Restart dns
+    // Restart dns server
     if (!empty($restart_dns) && (empty($_SESSION['error_msg']))) {
         exec (VESTA_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 has been saved.');
     }
 
 }
+
+
+$v_ftp_users_raw = explode(':', $v_ftp_user);
+$v_ftp_users_paths_raw = explode(':', $data[$v_domain]['FTP_PATH']);
+$v_ftp_users = array();
+foreach ($v_ftp_users_raw as $v_ftp_user_index => $v_ftp_user_val) {
+    if (empty($v_ftp_user_val)) {
+        continue;
+    }
+    $v_ftp_users[] = array(
+        'is_new'            => 0,
+        'v_ftp_user'        => $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[] = array(
+        '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[] = array(
+            '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
+        );
+    }
+}
+
+// Header
+include($_SERVER['DOCUMENT_ROOT'].'/templates/header.html');
+
+// Panel
+top_panel($user,$TAB);
+
+// Display body
 if ($_SESSION['user'] == 'admin') {
     include($_SERVER['DOCUMENT_ROOT'].'/templates/admin/edit_web.html');
 } else {
     include($_SERVER['DOCUMENT_ROOT'].'/templates/user/edit_web.html');
 }
+
+// Flush session messages
 unset($_SESSION['error_msg']);
 unset($_SESSION['ok_msg']);
 
-
 // Footer
 include($_SERVER['DOCUMENT_ROOT'].'/templates/footer.html');

+ 172 - 102
web/templates/admin/add_web.html

@@ -42,7 +42,7 @@
                     document.v_add_web.v_stats_password.value = webrandom;
                 }
 
-                function FTPrandom() {
+                function FTPrandom(elm) {
                     var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
                     var string_length = 10;
                     var ftprandomstring = '';
@@ -50,7 +50,7 @@
                         var rnum = Math.floor(Math.random() * chars.length);
                         ftprandomstring += chars.substring(rnum,rnum+1);
                     }
-                    document.v_add_web.v_ftp_password.value = ftprandomstring;
+                    $(elm).parents('.ftptable').find('.v-ftp-user-psw').val(ftprandomstring);
                 }
 
                 function elementHideShow(elementToHideOrShow){
@@ -75,7 +75,7 @@
                 <td class="data-dotted">
                     <table class="data-col2">
                         <tr>
-                            <td class="vst-text" style="padding: 24px 0 0 0;">
+                            <td class="vst-text step-top">
                                 <?php print __('Domain');?>
                             </td>
                         </tr>
@@ -85,7 +85,7 @@
                             </td>
                         </tr>
                         <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                            <td class="vst-text input-label">
                                 <?php print __('IP address');?>
                             </td>
                         </tr>
@@ -107,34 +107,24 @@
                             </td>
                         </tr>
                         <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                <?php print __('DNS Support');?>
+                            <td class="vst-text input-label">
+                                <label><input type="checkbox" size="20" class="vst-checkbox" name="v_dns" <?php if (empty($v_dns)) echo "checked=yes"; ?>> <?php print __('DNS Support');?></label>
                             </td>
                         </tr>
                         <tr>
-                            <td>
-                                <input type="checkbox" size="20" class="vst-checkbox" name="v_dns" <?php if (empty($v_dns)) echo "checked=yes"; ?>>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                <?php print __('Mail Support');?>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td>
-                                <input type="checkbox" size="20" class="vst-checkbox" name="v_mail" <?php if (empty($v_mail)) echo "checked=yes"; ?>>
+                            <td class="vst-text input-label">
+                                <label><input type="checkbox" size="20" class="vst-checkbox" name="v_mail" <?php if (empty($v_mail)) echo "checked=yes"; ?>> <?php print __('Mail Support');?></label>
                             </td>
                         </tr>
                         <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                            <td class="step-top vst-text" style="/*padding: 32px 0 20px 0;*/">
                                 <a href="javascript:elementHideShow('advtable');" class="vst-advanced"><?php print __('Advanced options');?></a>
                             </td>
                         </tr>
                     </table>
                     <table class="data-col2" width="600px" style="display:<?php if (empty($v_adv)) echo 'none';?> ;" id="advtable">
                         <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                            <td class="vst-text input-label">
                                 <?php print __('Aliases');?>
                             </td>
                         </tr>
@@ -144,25 +134,20 @@
                             </td>
                         </tr>
                         <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                <?php print __('Proxy Support');?>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td>
-                                <input type="checkbox" size="20" class="vst-checkbox" name="v_proxy" <?php if ($v_proxy !== 'off') echo "checked=yes" ?> onclick="javascript:elementHideShow('proxytable');">
+                            <td class="vst-text step-top" >
+                                <label><input type="checkbox" size="20" class="vst-checkbox" name="v_proxy" <?php if ($v_proxy !== 'off') echo "checked=yes" ?> onclick="javascript:elementHideShow('proxytable');"> <?php print __('Proxy Support');?></label>
                             </td>
                         </tr>
                         <tr>
                             <td>
                                 <table style="display:<?php if ($v_proxy == 'off') { echo 'none';} else {echo 'block';}?>;" id="proxytable" >
                                     <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
+                                        <td class="vst-text input-label step-left">
                                             <?php print __('Proxy Extentions');?>
                                         </td>
                                     </tr>
                                     <tr>
-                                        <td>
+                                        <td class="step-left">
                                             <textarea size="20" class="vst-textinput" name="v_proxy_ext"><?php if (!empty($v_proxy_ext)) { echo $v_proxy_ext;} else { echo 'jpeg, jpg, png, gif, bmp, ico, svg, tif, tiff, css, js, htm, html, ttf, otf, webp, woff, txt, csv, rtf, doc, docx, xls, xlsx, ppt, pptx, odf, odp, ods, odt, pdf, psd, ai, eot, eps, ps, zip, tar, tgz, gz, rar, bz2, 7z, aac, m4a, mp3, mp4, ogg, wav, wma, 3gp, avi, flv, m4v, mkv, mov, mp4, mpeg, mpg, wmv, exe, iso, dmg, swf'; }  ?></textarea>
                                         </td>
                                     </tr>
@@ -170,26 +155,21 @@
                             </td>
                         </tr>
                         <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                <?php print __('SSL Support');?> /
+                            <td class="step-top vst-text">
+                                <label><input type="checkbox" size="20" class="vst-checkbox" name="v_ssl" <?php if($v_ssl == 'yes' || $v_ssl == 'on') echo "checked=yes" ?> onclick="javascript:elementHideShow('ssltable');"> <?php print __('SSL Support');?></label> /
                                 <a class="generate" target="_blank" href="/generate/ssl/"><?php print __('Generate CSR') ?></a>
                             </td>
                         </tr>
-                        <tr>
-                            <td>
-                                <input type="checkbox" size="20" class="vst-checkbox" name="v_ssl" <?php if ($v_ssl == 'yes') echo "checked=yes" ?> onclick="javascript:elementHideShow('ssltable');">
-                            </td>
-                        </tr>
                         <tr>
                             <td>
                                 <table style="display:<?php if (empty($v_ssl)) { echo 'none';} else {echo 'block';}?>;" id="ssltable">
                                     <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
+                                        <td class="vst-text input-label step-left">
                                             <?php print __('SSL Home Directory');?>
                                         </td>
                                     </tr>
                                     <tr>
-                                        <td>
+                                        <td class="step-left">
                                             <select class="vst-list" name="v_ssl_home">
                                                 <option value='same' <?php if ($v_ssl_home == 'same') echo "selected";?>>
                                                      public_html
@@ -201,32 +181,32 @@
                                         </td>
                                     </tr>
                                     <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
+                                        <td class="vst-text input-label step-left">
                                             <?php print __('SSL Certificate');?>
                                         </td>
                                     </tr>
                                     <tr>
-                                        <td>
+                                        <td class="step-left">
                                             <textarea size="20" class="vst-textinput" name="v_ssl_crt"><?php if (!empty($v_ssl_crt)) echo $v_ssl_crt; ?></textarea>
                                         </td>
                                     </tr>
                                     <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
+                                        <td class="vst-text input-label step-left">
                                             <?php print __('SSL Key');?>
                                         </td>
                                     </tr>
                                     <tr>
-                                        <td>
+                                        <td class="step-left">
                                             <textarea size="20" class="vst-textinput" name="v_ssl_key"><?php if (!empty($v_ssl_key)) echo $v_ssl_key; ?></textarea>
                                         </td>
                                     </tr>
                                     <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
+                                        <td class="vst-text input-label step-left">
                                             <?php print __('SSL Certificate Authority / Intermediate');?> <span class="optional">(<?php print __('optional');?>)</span>
                                         </td>
                                     </tr>
                                     <tr>
-                                        <td>
+                                        <td class="step-left">
                                             <textarea size="20" class="vst-textinput" name="v_ssl_ca"><?php if (!empty($v_ssl_ca)) echo $v_ssl_ca; ?></textarea>
                                         </td>
                                     </tr>
@@ -234,7 +214,7 @@
                             </td>
                         </tr>
                         <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                            <td class="vst-text step-top">
                                 <?php print __('Web Statistics');?>
                             </td>
                         </tr>
@@ -256,20 +236,15 @@
                             </td>
                         </tr>
                         <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                <?php print __('Statistics Authorization');?>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td>
-                                <input type="checkbox" size="20" class="vst-checkbox" name="v_stats_auth" <?php if (!empty($v_stats_user)) echo "checked=yes" ?> onclick="javascript:elementHideShow('statstable');">
+                            <td class="vst-text input-label">
+                                <label><input type="checkbox" size="20" class="vst-checkbox" name="v_stats_auth" <?php if (!empty($v_stats_user)) echo "checked=yes" ?> onclick="javascript:elementHideShow('statstable');"> <?php print __('Statistics Authorization');?></label>
                             </td>
                         </tr>
                         <tr>
-                            <td>
+                            <td class="step-left">
                                 <table style="display:<?php if (empty($v_stats_user)) { echo 'none';} else {echo 'block';}?> ;" id="statstable" name="v-add-web-domain-stats-user">
                                     <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
+                                        <td class="vst-text input-label">
                                             <?php print __('Username');?>
                                         </td>
                                     </tr>
@@ -279,73 +254,104 @@
                                         </td>
                                     </tr>
                                     <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
+                                        <td class="vst-text input-label">
                                             <?php print __('Password');?> / <a href="javascript:WEBrandom();" class="generate"><?php print __('generate');?></a>
                                         </td>
                                     </tr>
                                     <tr>
                                         <td>
-                                            <input type="text" size="20" class="vst-input" name="v_stats_password" <?php if (!empty($v_stats_password)) echo "value=".$v_stats_password;  ?> id="v_password">
+                                            <input type="text" size="20" class="vst-input password" name="v_stats_password" <?php if (!empty($v_stats_password)) echo "value=".$v_stats_password;  ?> id="v_password">
                                         </td>
                                     </tr>
                                 </table>
                             </td>
                         </tr>
                         <tr>
-                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                <?php print __('Additional FTP Account');?>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td>
-                                <input type="checkbox" size="20" class="vst-checkbox" name="v_ftp" <?php if (!empty($v_ftp)) echo "checked=yes" ?> onclick="javascript:elementHideShow('ftptable');">
+                            <td class="vst-text step-top">
+                                <label><input type="checkbox" size="20" class="vst-checkbox" name="v_ftp" <?php if (!empty($v_ftp)) echo "checked=yes" ?> onclick="App.Actions.WEB.toggle_additional_ftp_accounts(this)"> <?php print __('Additional FTP Account');?></label>
                             </td>
                         </tr>
                         <tr>
                             <td>
-                                <table style="display:<?php if (empty($v_ftp_user)) { echo 'none';} else {echo 'block';}?> ;" id="ftptable" name="v_add_domain_ftp">
-                                    <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
-                                            <?php print __('Username');?><br>
-                                            <span style="font-size: 10pt; color:#777;"><?php print __('Prefix will be automaticaly added to username',$user."_");?></span>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td>
-                                            <input type="text" size="20" class="vst-input" name="v_ftp_user" <?php if (!empty($v_ftp_user)) echo "value=".$v_ftp_user; ?>>
-                                            <small class="hint"></small>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
-                                            <?php print __('Password');?> / <a href="javascript:FTPrandom();" class="generate" ><?php print __('generate');?></a>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td>
-                                            <input type="text" class="vst-input" name="v_ftp_password" <?php if (!empty($v_ftp_password)) echo "value=".$v_ftp_password; ?>>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td class="vst-text" style="padding: 12px 0 0 0;">
-                                             <?php print __('Send FTP credentials to email');?>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td>
-                                            <input type="text"  class="vst-input" name="v_ftp_email" <?php if (!empty($v_ftp_email)) echo "value=".$v_ftp_email; ?>>
-                                        </td>
-                                    </tr>
+                                    <?php foreach ($v_ftp_users as $i => $ftp_user): ?>
+                                    <?php
+                                        $v_ftp_user     = $ftp_user['v_ftp_user'];
+                                        $v_ftp_password = $ftp_user['v_ftp_password'];
+                                        $v_ftp_path     = $ftp_user['v_ftp_path'];
+                                        $v_ftp_email    = $ftp_user['v_ftp_email'];
+                                        $v_ftp_pre_path = $ftp_user['v_ftp_pre_path'];
+                                    ?>
+                                    <table <?php echo (!empty($v_ftp)) ? "style='display: block'" : "style='display:none;'"  ?> class="ftptable ftptable-nrm" name="v_add_domain_ftp">
+                                        <tr>
+                                            <td class="vst-text input-label">
+                                                <?php print __('FTP') ?> #<span class="ftp-user-number"><?php print $i + 1; ?></span> <a class="ftp-remove-user additional-control" onCLick="App.Actions.WEB.remove_ftp_user(this)">(<?php print __('remove') ?>)</a>
+                                                <input type="hidden" class="v-ftp-user-deleted" name="v_ftp_user[<?php print $i ?>][delete]" value="0" />
+                                                <input type="hidden" class="v-ftp-user-is-new" name="v_ftp_user[<?php print $i ?>][is_new]" value="<?php print $ftp_user['is_new'] ?>" />
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="vst-text step-left input-label">
+                                                <?php print __('Username');?><br>
+                                                <span style="font-size: 10pt; color:#777;"><?php print __('Prefix will be automaticaly added to username',$user."_");?></span>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="step-left">
+                                                <input type="text" size="20" class="vst-input v-ftp-user" <?php print $ftp_user['is_new'] != 1 ? 'disabled="disabled"' : '' ?> name="v_ftp_user[<?php print $i ?>][v_ftp_user]" <?php if (!empty($v_ftp_user)) echo "value=".$v_ftp_user; ?>>
+                                                <small class="hint"></small>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="vst-text step-left  input-label">
+                                                <?php print __('Password');?> / <a href="javascript:void(0);" onClick="FTPrandom(this)"; class="generate" ><?php print __('generate');?></a>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="step-left">
+                                                <input type="text" class="vst-input v-ftp-user-psw password" name="v_ftp_user[<?php print $i ?>][v_ftp_password]" <?php if (!empty($v_ftp_password)) echo "value=".$v_ftp_password; ?>>
+                                            </td>
+                                        </tr>
+
+                                        <tr>
+                                            <td class="vst-text step-left input-label">
+                                                 <?php print __('Path');?>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="step-left">
+                                                <input type="hidden" class="vst-input v-ftp-pre-path" name="v_ftp_pre_path" value="<?php print !empty($v_ftp_pre_path) ? $v_ftp_pre_path : '/'; ?>">
+                                                <input type="text"  class="vst-input v-ftp-path" name="v_ftp_user[<?php print $i ?>][v_ftp_path]" <?php if (!empty($v_ftp_path)) echo "value=".$v_ftp_path; ?>>
+                                                <br /><span class="ftp-path-prefix"><?php print $v_ftp_pre_path ?></span><span class="ftp-path-value v-ftp-path-hint"></span>
+                                            </td>
+                                        </tr>
+
+                                        <tr>
+                                            <td class="vst-text step-left input-label">
+                                                 <?php print __('Send FTP credentials to email');?>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="step-left">
+                                                <input type="text"  class="vst-input" name="v_ftp_user[<?php print $i ?>][v_ftp_email]" <?php if (!empty($v_ftp_email)) echo "value=".$v_ftp_email; ?>>
+                                            </td>
+                                        </tr>
                                 </table>
-                            </td>
-                        </tr>
-                    </table>
+                                    <?php endforeach; ?>
+                                </td>
+                            </tr>
+                            <tr>
+                                <td class="vst-text step-top v-add-new-user step-bottom"  style="display: none;">
+                                    <a class="additional-control" onClick="App.Actions.WEB.add_ftp_user_form()"><?php print __('Add one more FTP Account');?></a>
+                                </td>
+                            </tr>
+                        </table>
+
                     <table class="data-col2">
                         <tr>
-                            <td style="padding: 33px 0 0 0;" width="116px">
+                            <td class="step-top" width="116px">
                                 <input type="submit" name="ok" value="<?php print __('Add');?>" class="button">
                             </td>
-                            <td style="padding: 33px 0 0 0;">
+                            <td class="step-top">
                                 <input type="button" class="button" value="<?php print __('Back');?>" onclick="<?php echo $back ?>">
                             </td>
                         </tr>
@@ -354,7 +360,71 @@
             </tr>
         </table>
     </form>
+    
+    <div id="templates" class="hidden">
+            <table class="ftptable ftptable-nrm" name="v_add_domain_ftp">
+                <tr>
+                    <td class="vst-text input-label">
+                        <?php print __('FTP') ?> #<span class="ftp-user-number"></span> <a class="ftp-remove-user additional-control" onCLick="App.Actions.WEB.remove_ftp_user(this)">(<?php print __('remove') ?>)</a>
+                        <input type="hidden"  class="v-ftp-user-deleted" name="v_ftp_user[%INDEX%][delete]" value="0" />
+                        <input type="hidden" class="v-ftp-user-is-new" name="v_ftp_user[%INDEX%][is_new]" value="1" />
+                    </td>
+                </tr>
+                <tr>
+                    <td class="vst-text step-left input-label">
+                        <?php print __('Username');?><br>
+                        <span style="font-size: 10pt; color:#777;"><?php print __('Prefix will be automaticaly added to username',$user."_");?></span>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="text" size="20" class="vst-input v-ftp-user" name="v_ftp_user[%INDEX%][v_ftp_user]" value="">
+                        <small class="hint"></small>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="vst-text step-left  input-label">
+                        <?php print __('Password');?> / <a href="javascript:void(0);" onClick="FTPrandom(this)"; class="generate" ><?php print __('generate');?></a>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="text" class="vst-input v-ftp-user-psw password" name="v_ftp_user[%INDEX%][v_ftp_password]" value="">
+                    </td>
+                </tr>
+
+                <tr>
+                    <td class="vst-text step-left input-label">
+                         <?php print __('Path');?>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="hidden" class="vst-input v-ftp-pre-path" name="v_ftp_pre_path" value="">
+                        <input type="text"  class="vst-input v-ftp-path" name="v_ftp_user[%INDEX%][v_ftp_path]" value="">
+                        <br /><span class="ftp-path-prefix"><?php print $v_ftp_pre_path_new_user ?></span><span class="ftp-path-value v-ftp-path-hint"></span>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="vst-text step-left input-label">
+                         <?php print __('Send FTP credentials to email');?>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="text"  class="vst-input" name="v_ftp_user[%INDEX%][v_ftp_email]" value="">
+                    </td>
+                </tr>
+        </table>
+        </div>
+
     <script type="text/javascript">
-        GLOBAL.FTP_USER_PREFIX = '<?php echo $user; ?>_';
+        GLOBAL.FTP_USER_PREFIX  = '<?php echo $user; ?>_';
+        GLOBAL.FTP_USER_PREPATH = '<?php echo $v_ftp_user_prepath; ?>';
+        $('#vstobjects').bind('submit', function(evt) {
+                $('input[disabled]').each(function(i, elm) {
+                    $(elm).removeAttr('disabled');
+                });
+            });
     </script>
     <script type="text/javascript" src="/js/pages/add.web.js"></script>

+ 157 - 75
web/templates/admin/edit_web.html

@@ -10,12 +10,15 @@
                 <tr>
                     <td style="padding: 20px 10px;" ><a class="name"><b><?php print __('Editing Domain');?></b></a>
                         <?php
+                            if (!empty($_SESSION['ok_msg'])) {
+                                echo "<span class=\"vst-ok\"> → ".$_SESSION['ok_msg']."</span>";
+                            }
                             if (!empty($_SESSION['error_msg'])) {
                                 echo "<span class=\"vst-error\"> → ".$_SESSION['error_msg']."</span>";
-                            } else {
-                                if (!empty($_SESSION['ok_msg'])) {
-                                    echo "<span class=\"vst-ok\"> → ".$_SESSION['ok_msg']."</span>";
-                                }
+                            }
+                            if (!empty($_SESSION['flash_error_msg'])) {
+                                echo " / <span class=\"vst-error\"> FTP USER ".$_SESSION['flash_error_msg']."</span>";
+                                unset($_SESSION['flash_error_msg']);
                             }
                         ?> 
                     </td>
@@ -36,7 +39,7 @@
                     document.v_edit_web.v_stats_password.value = webrandom;
                 }
 
-                function FTPrandom() {
+                function FTPrandom(elm) {
                     var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
                     var string_length = 10;
                     var ftprandomstring = '';
@@ -44,7 +47,8 @@
                         var rnum = Math.floor(Math.random() * chars.length);
                         ftprandomstring += chars.substring(rnum,rnum+1);
                     }
-                    document.v_edit_web.v_ftp_password.value = ftprandomstring;
+
+                    $(elm).parents('.ftptable').find('.v-ftp-user-psw').val(ftprandomstring);
                 }
 
                 function elementHideShow(elementToHideOrShow){
@@ -72,7 +76,7 @@
                     <td class="data-dotted">
                         <table class="data-col2">
                             <tr>
-                                <td class="vst-text" style="padding: 24px 0 0 0;">
+                                <td class="vst-text step-top">
                                     <?php print __('Domain');?>
                                 </td>
                             </tr>
@@ -82,7 +86,7 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
+                                <td class="vst-text input-label">
                                     <?php print __('IP Address');?>
                                 </td>
                             </tr>
@@ -105,7 +109,7 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
+                                <td class="vst-text input-label">
                                     <?php print __('Aliases');?>
                                 </td>
                             </tr>
@@ -115,7 +119,7 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
+                                <td class="vst-text input-label">
                                     <?php print __('Web Template');?>
                                 </td>
                             </tr>
@@ -136,20 +140,15 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
-                                    <?php print __('Proxy Support');?>
+                                <td class="vst-text step-top">
+                                    <label><input type="checkbox" size="20" class="vst-checkbox" name="v_proxy" <?php if (!empty($v_proxy)) echo "checked=yes" ?> onclick="javascript:elementHideShow('proxytable');"> <?php print __('Proxy Support');?></label>
                                 </td>
                             </tr>
                             <tr>
-                                <td>
-                                    <input type="checkbox" size="20" class="vst-checkbox" name="v_proxy" <?php if (!empty($v_proxy)) echo "checked=yes" ?> onclick="javascript:elementHideShow('proxytable');">
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
+                                <td class="step-left">
                                     <table style="display:<?php if (empty($v_proxy)) { echo 'none';} else {echo 'block';}?> ;" id="proxytable">
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('Proxy Template');?>
                                             </td>
                                         </tr>
@@ -173,7 +172,7 @@
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('Proxy Extensions');?>
                                             </td>
                                         </tr>
@@ -186,21 +185,16 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
-                                    <?php print __('SSL Support');?> /
+                                <td class="vst-text step-top">
+                            	    <label><input type="checkbox" size="20" class="vst-checkbox" name="v_ssl" <?php if ($v_ssl == 'yes') echo "checked=yes" ?> onclick="javascript:elementHideShow('ssltable');"> <?php print __('SSL Support');?></label> /
                                     <a class="generate" target="_blank" href="/generate/ssl/?domain=<?php echo $v_domain ?>"><?php print __('Generate CSR') ?></a>
                                 </td>
                             </tr>
                             <tr>
-                                <td>
-                                    <input type="checkbox" size="20" class="vst-checkbox" name="v_ssl" <?php if ($v_ssl == 'yes') echo "checked=yes" ?> onclick="javascript:elementHideShow('ssltable');">
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
+                                <td class="step-left">
                                     <table style="display:<?php if ($v_ssl == 'no' ) { echo 'none';} else {echo 'block';}?> ;" id="ssltable">
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('SSL Home Directory');?>
                                             </td>
                                         </tr>
@@ -218,7 +212,7 @@
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('SSL Certificate');?> 
                                             </td>
                                         </tr>
@@ -228,7 +222,7 @@
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('SSL Key');?>
                                             </td>
                                         </tr>
@@ -238,7 +232,7 @@
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('SSL Certificate Authority / Intermediate');?> <span class="optional">(<?php print __('optional');?>)</span>
                                             </td>
                                         </tr>
@@ -251,7 +245,7 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
+                                <td class="vst-text step-top">
                                     <?php print __('Web Statistics');?>
                                 </td>
                             </tr>
@@ -273,20 +267,15 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
-                                    <?php print __('Statistics Authorization');?>
+                                <td class="vst-text input-label">
+                                    <label><input type="checkbox" size="20" class="vst-checkbox" name="v_stats_auth" <?php if (!empty($v_stats_user)) echo "checked=yes" ?> onclick="javascript:elementHideShow('statstable');"><?php print __('Statistics Authorization');?></label>
                                 </td>
                             </tr>
                             <tr>
-                                <td>
-                                    <input type="checkbox" size="20" class="vst-checkbox" name="v_stats_auth" <?php if (!empty($v_stats_user)) echo "checked=yes" ?> onclick="javascript:elementHideShow('statstable');">
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
+                                <td class="step-left">
                                     <table style="display:<?php if (empty($v_stats_user)) { echo 'none';} else {echo 'block';}?> ;" id="statstable" name="v-add-web-domain-stats-user">
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('Username');?>
                                             </td>
                                         </tr>
@@ -296,80 +285,106 @@
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('Password');?> / <a href="javascript:WEBrandom();" class="generate"><?php print __('generate');?></a>
                                             </td>
                                         </tr>
                                         <tr>
                                             <td>
-                                                <input type="text" size="20" class="vst-input" name="v_stats_password" <?php if (!empty($v_stats_password)) echo "value=".$v_stats_password;  ?> id="v_password">
+                                                <input type="text" size="20" class="vst-input password" name="v_stats_password" <?php if (!empty($v_stats_password)) echo "value=".$v_stats_password;  ?> id="v_password">
                                             </td>
                                         </tr>
                                     </table>
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
-                                    <?php print __('Additional FTP Account');?>
+                                <td class="vst-text step-top">
+                                    <label><input type="checkbox" size="20" class="vst-checkbox" name="v_ftp" <?php if (!empty($v_ftp_user)) echo "checked=yes" ?> onclick="App.Actions.WEB.toggle_additional_ftp_accounts(this)"> <?php print __('Additional FTP Account');?></label>
                                 </td>
                             </tr>
                             <tr>
                                 <td>
-                                    <input type="checkbox" size="20" class="vst-checkbox" name="v_ftp" <?php if (!empty($v_ftp_user)) echo "checked=yes" ?> onclick="javascript:elementHideShow('ftptable');">
-                                    </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <table style="display:<?php if (empty($v_ftp_user)) { echo 'none';} else {echo 'block';}?> ;" id="ftptable" name="v_add_domain_ftp">
+
+                                    <?php foreach ($v_ftp_users as $i => $ftp_user): ?>
+                                    <?php
+                                        $v_ftp_user     = $ftp_user['v_ftp_user'];
+                                        $v_ftp_password = $ftp_user['v_ftp_password'];
+                                        $v_ftp_path     = $ftp_user['v_ftp_path'];
+                                        $v_ftp_email    = $ftp_user['v_ftp_email'];
+                                        $v_ftp_pre_path = $ftp_user['v_ftp_pre_path'];
+                                    ?>
+                                    <table style="display:<?php if (empty($v_ftp_user)) { echo 'none';} else {echo 'block';}?> ;" class="ftptable ftptable-nrm" name="v_add_domain_ftp">
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                                <?php print __('Username');?>
-                                                <?php if (empty($v_ftp_user)) echo '<br><span style="font-size: 10pt; color:#777;">' . __('Prefix will be automaticaly added to username',$user."_") . '</span>' ?>
+                                            <td class="vst-text input-label">
+                                                <?php print __('FTP') ?> #<span class="ftp-user-number"><?php print $i + 1; ?></span> <a class="ftp-remove-user additional-control" onCLick="App.Actions.WEB.remove_ftp_user(this)">(<?php print __('remove') ?>)</a>
+                                                <input type="hidden" class="v-ftp-user-deleted" name="v_ftp_user[<?php print $i ?>][delete]" value="0" />
+                                                <input type="hidden" class="v-ftp-user-is-new" name="v_ftp_user[<?php print $i ?>][is_new]" value="<?php print $ftp_user['is_new'] ?>" />
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td>
-                                                <input type="text" size="20" class="vst-input" name="v_ftp_user" <?php if (!empty($v_ftp_user)) echo "value=".$v_ftp_user;?>>
+                                            <td class="vst-text step-left input-label">
+                                                <?php print __('Username');?><br>
+                                                <span style="font-size: 10pt; color:#777;"><?php print __('Prefix will be automaticaly added to username',$user."_");?></span>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="step-left">
+                                                <input type="text" size="20" class="vst-input v-ftp-user" <?php print $ftp_user['is_new'] != 1 ? 'disabled="disabled"' : '' ?> name="v_ftp_user[<?php print $i ?>][v_ftp_user]" <?php if (!empty($v_ftp_user)) echo "value=".$v_ftp_user; ?>>
                                                 <small class="hint"></small>
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                                <?php print __('Password');?> / <a href="javascript:FTPrandom();" class="generate"><?php print __('generate');?></a>
+                                            <td class="vst-text step-left  input-label">
+                                                <?php print __('Password');?> / <a href="javascript:void(0);" onClick="FTPrandom(this)"; class="generate" ><?php print __('generate');?></a>
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td>
-                                                <input type="text"  class="vst-input" name="v_ftp_password" <?php if (!empty($v_ftp_password)) echo "value=".$v_ftp_password;?>>
+                                            <td class="step-left">
+                                                <input type="text" class="vst-input v-ftp-user-psw password" name="v_ftp_user[<?php print $i ?>][v_ftp_password]" <?php if (!empty($v_ftp_password)) echo "value=".$v_ftp_password; ?>>
                                             </td>
                                         </tr>
-                                        <?php
-                                            if (empty($v_ftp_user)) {
-                                                echo '';
-                                         ?> 
+
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                                <?php print __('Send FTP credentials to email');?>
+                                            <td class="vst-text step-left input-label">
+                                                 <?php print __('Path');?>
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td>
-                                                <input type="text"  class="vst-input" name="v_ftp_email" <?php if (!empty($v_ftp_email)) echo "value=".$v_ftp_email;  ?>>
+                                            <td class="step-left">
+                                                <input type="hidden" class="vst-input v-ftp-pre-path" name="v_ftp_pre_path" value="<?php print !empty($v_ftp_pre_path) ? $v_ftp_pre_path : '/'; ?>">
+                                                <input type="text"  class="vst-input v-ftp-path" name="v_ftp_user[<?php print $i ?>][v_ftp_path]" <?php if (!empty($v_ftp_path)) echo "value=".($v_ftp_path[0] != '/' ? '/' : '').$v_ftp_path; ?>>
+                                                <br /><span class="ftp-path-prefix"><?php print $v_ftp_pre_path ?></span><span class="ftp-path-value v-ftp-path-hint"></span>
                                             </td>
                                         </tr>
-                                        <?php
-                                            }
-                                        ?> 
-                                    </table>
+                                        <?php if ($ftp_user['is_new'] == 1): ?>
+                                        <tr>
+                                            <td class="vst-text step-left input-label">
+                                                 <?php print __('Send FTP credentials to email');?>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="step-left">
+                                                <input type="text"  class="vst-input" name="v_ftp_user[<?php print $i ?>][v_ftp_email]" <?php if (!empty($v_ftp_email)) echo "value=".$v_ftp_email; ?>>
+                                            </td>
+                                        </tr>
+                                        <?php endif; ?>
+                                </table>
+                                    <?php endforeach; ?>
+                                </td>
+                            </tr>
+                            
+                            <tr class="add-new-ftp-user-button" style="<?php print !empty($v_ftp_user) ? '' : 'display:none;' ?>">
+                                <td class="vst-text step-top v-add-new-user step-bottom">
+                                    <a class="additional-control" onClick="App.Actions.WEB.add_ftp_user_form()"><?php print __('Add one more FTP Account');?></a>
                                 </td>
                             </tr>
                         </table>
                         <table class="data-col2">
                             <tr>
-                                <td style="padding: 24px 0 0 0;" width="116px">
+                                <td class="step-top" width="116px">
                                     <input type="submit" class="button" name="save" value="<?php print __('Save');?>">
                                 </td>
-                                <td style="padding: 24px 0 0 0;">
+                                <td class="step-top">
                                     <input type="button" class="button" value="<?php print __('Back');?>" onclick="<?php echo $back ?>">
                                 </td>
                             </tr>
@@ -378,7 +393,74 @@
                 </tr>
             </table>
         </form>
+        
+        <div id="templates" class="hidden">
+            <table class="ftptable ftptable-nrm" name="v_add_domain_ftp">
+                <tr> 
+                    <td class="vst-text input-label">
+                        <?php print __('FTP') ?> #<span class="ftp-user-number"></span> <a class="ftp-remove-user additional-control" onCLick="App.Actions.WEB.remove_ftp_user(this)">(<?php print __('remove') ?>)</a>
+                        <input type="hidden"  class="v-ftp-user-deleted" name="v_ftp_user[%INDEX%][delete]" value="0" />
+                        <input type="hidden" class="v-ftp-user-is-new" name="v_ftp_user[%INDEX%][is_new]" value="1" />
+                    </td>
+                </tr>
+                <tr>
+                    <td class="vst-text step-left input-label">
+                        <?php print __('Username');?><br>
+                        <span style="font-size: 10pt; color:#777;"><?php print __('Prefix will be automaticaly added to username',$user."_");?></span>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="text" size="20" class="vst-input v-ftp-user" name="v_ftp_user[%INDEX%][v_ftp_user]" value="">
+                        <small class="hint"></small>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="vst-text step-left  input-label">
+                        <?php print __('Password');?> / <a href="javascript:void(0);" onClick="FTPrandom(this)"; class="generate" ><?php print __('generate');?></a>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="text" class="vst-input v-ftp-user-psw password" name="v_ftp_user[%INDEX%][v_ftp_password]" value="">
+                    </td>
+                </tr>
+
+                <tr>
+                    <td class="vst-text step-left input-label">
+                         <?php print __('Path');?>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="hidden" class="vst-input v-ftp-pre-path" name="v_ftp_pre_path" value="">
+                        <input type="text"  class="vst-input v-ftp-path" name="v_ftp_user[%INDEX%][v_ftp_path]" value="">
+                        <br /><span class="ftp-path-prefix"><?php print $v_ftp_pre_path_new_user ?></span><span class="ftp-path-value v-ftp-path-hint"></span>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="vst-text step-left input-label">
+                         <?php print __('Send FTP credentials to email');?>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="text"  class="vst-input" name="v_ftp_user[%INDEX%][v_ftp_email]" value="">
+                    </td>
+                </tr>
+        </table>
+        </div>
+        
         <script type="text/javascript">
             GLOBAL.FTP_USER_PREFIX = '<?php echo $user; ?>_';
+            $('#vstobjects').bind('submit', function(evt) {
+                $('input[disabled]').each(function(i, elm) {
+                    var copy_elm = $(elm).clone(true);
+                    $(copy_elm).attr('type', 'hidden');
+                    $(copy_elm).removeAttr('disabled');
+                    $(elm).after(copy_elm);
+                });
+            });
         </script>
         <script type="text/javascript" src="/js/pages/edit.web.js"></script>
+

+ 155 - 72
web/templates/user/edit_web.html

@@ -10,12 +10,15 @@
                 <tr>
                     <td style="padding: 20px 10px;" ><a class="name"><b><?php print __('Editing Domain');?></b></a>
                         <?php
+                            if (!empty($_SESSION['ok_msg'])) {
+                                echo "<span class=\"vst-ok\"> → ".$_SESSION['ok_msg']."</span>";
+                            }
                             if (!empty($_SESSION['error_msg'])) {
                                 echo "<span class=\"vst-error\"> → ".$_SESSION['error_msg']."</span>";
-                            } else {
-                                if (!empty($_SESSION['ok_msg'])) {
-                                    echo "<span class=\"vst-ok\"> → ".$_SESSION['ok_msg']."</span>";
-                                }
+                            }
+                            if (!empty($_SESSION['flash_error_msg'])) {
+                                echo "<br /><span class=\"vst-error\"> → ".$_SESSION['flash_error_msg']."</span>";
+                                unset($_SESSION['flash_error_msg']);
                             }
                         ?> 
                     </td>
@@ -36,7 +39,7 @@
                     document.v_edit_web.v_stats_password.value = webrandom;
                 }
 
-                function FTPrandom() {
+                function FTPrandom(elm) {
                     var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
                     var string_length = 10;
                     var ftprandomstring = '';
@@ -44,7 +47,8 @@
                         var rnum = Math.floor(Math.random() * chars.length);
                         ftprandomstring += chars.substring(rnum,rnum+1);
                     }
-                    document.v_edit_web.v_ftp_password.value = ftprandomstring;
+                    
+                    $(elm).parents('.ftptable').find('.v-ftp-user-psw').val(ftprandomstring);
                 }
 
                 function elementHideShow(elementToHideOrShow){
@@ -72,7 +76,7 @@
                     <td class="data-dotted">
                         <table class="data-col2">
                             <tr>
-                                <td class="vst-text" style="padding: 24px 0 0 0;">
+                                <td class="vst-text step-top">
                                     <?php print __('Domain');?>
                                 </td>
                             </tr>
@@ -82,7 +86,7 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
+                                <td class="vst-text input-label">
                                     <?php print __('IP Address');?>
                                 </td>
                             </tr>
@@ -105,7 +109,7 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
+                                <td class="vst-text input-label">
                                     <?php print __('Aliases');?>
                                 </td>
                             </tr>
@@ -115,17 +119,12 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
-                                    <?php print __('Proxy Support');?>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <input type="checkbox" size="20" class="vst-checkbox" name="v_proxy" <?php if (!empty($v_proxy)) echo "checked=yes" ?> onclick="javascript:elementHideShow('proxytable');">
+                                <td class="vst-text step-top">
+                                    <label><input type="checkbox" size="20" class="vst-checkbox" name="v_proxy" <?php if (!empty($v_proxy)) echo "checked=yes" ?> onclick="javascript:elementHideShow('proxytable');"> <?php print __('Proxy Support');?></label>
                                 </td>
                             </tr>
                             <tr>
-                                <td>
+                                <td class="step-left">
                                     <table style="display:<?php if (empty($v_proxy)) { echo 'none';} else {echo 'block';}?> ;" id="proxytable">
                                         <tr>
                                             <td class="vst-text" style="padding: 12px 0 0 0;">
@@ -141,21 +140,16 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
-                                    <?php print __('SSL Support');?> /
+                                <td class="vst-text step-top">
+                                    <label><input type="checkbox" size="20" class="vst-checkbox" name="v_ssl" <?php if ($v_ssl == 'yes' || $v_ssl == 'on') echo "checked=yes" ?> onclick="javascript:elementHideShow('ssltable');"> <?php print __('SSL Support');?></label> /
                                     <a class="generate" target="_blank" href="/generate/ssl/?domain=<?php echo $v_domain ?>"><?php print __('Generate CSR') ?></a>
                                 </td>
                             </tr>
                             <tr>
-                                <td>
-                                    <input type="checkbox" size="20" class="vst-checkbox" name="v_ssl" <?php if ($v_ssl == 'yes') echo "checked=yes" ?> onclick="javascript:elementHideShow('ssltable');">
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
+                                <td class="step-left">
                                     <table style="display:<?php if ($v_ssl == 'no' ) { echo 'none';} else {echo 'block';}?> ;" id="ssltable">
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('SSL Home Directory');?>
                                             </td>
                                         </tr>
@@ -164,7 +158,7 @@
                                                 <select class="vst-list" name="v_ssl_home">
 
                                                     <option value='same' <?php if ($v_ssl_home == 'same') echo "selected";?>>
-                                                         public_html
+                                                        public_html
                                                     </option>
                                                     <option value='single' <?php if ($v_ssl_home == 'single') echo "selected";?>>
                                                         public_shtml
@@ -173,7 +167,7 @@
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('SSL Certificate');?> 
                                             </td>
                                         </tr>
@@ -183,7 +177,7 @@
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('SSL Key');?>
                                             </td>
                                         </tr>
@@ -193,7 +187,7 @@
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('SSL Certificate Authority / Intermediate');?> <span class="optional">(<?php print __('optional');?>)</span>
                                             </td>
                                         </tr>
@@ -206,7 +200,7 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
+                                <td class="vst-text step-top">
                                     <?php print __('Web Statistics');?>
                                 </td>
                             </tr>
@@ -228,20 +222,15 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
-                                    <?php print __('Statistics Authorization');?>
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <input type="checkbox" size="20" class="vst-checkbox" name="v_stats_auth" <?php if (!empty($v_stats_user)) echo "checked=yes" ?> onclick="javascript:elementHideShow('statstable');">
+                                <td class="vst-text input-label">
+                                    <label><input type="checkbox" size="20" class="vst-checkbox" name="v_stats_auth" <?php if (!empty($v_stats_user)) echo "checked=yes" ?> onclick="javascript:elementHideShow('statstable');"> <?php print __('Statistics Authorization');?></label>
                                 </td>
                             </tr>
                             <tr>
-                                <td>
+                                <td class="step-left">
                                     <table style="display:<?php if (empty($v_stats_user)) { echo 'none';} else {echo 'block';}?> ;" id="statstable" name="v-add-web-domain-stats-user">
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('Username');?>
                                             </td>
                                         </tr>
@@ -251,7 +240,7 @@
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
+                                            <td class="vst-text input-label">
                                                 <?php print __('Password');?> / <a href="javascript:WEBrandom();" class="generate"><?php print __('generate');?></a>
                                             </td>
                                         </tr>
@@ -264,67 +253,95 @@
                                 </td>
                             </tr>
                             <tr>
-                                <td class="vst-text" style="padding: 12px 0 0 0;">
-                                    <?php print __('Additional FTP Account');?>
+                                <td class="vst-text step-top">
+                                    <label><input type="checkbox" size="20" class="vst-checkbox" name="v_ftp" <?php if (!empty($v_ftp_user)) echo "checked=yes" ?> onclick="App.Actions.WEB.toggle_additional_ftp_accounts(this)"> <?php print __('Additional FTP Account');?></label>
                                 </td>
                             </tr>
                             <tr>
                                 <td>
-                                    <input type="checkbox" size="20" class="vst-checkbox" name="v_ftp" <?php if (!empty($v_ftp_user)) echo "checked=yes" ?> onclick="javascript:elementHideShow('ftptable');">
-                                    </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <table style="display:<?php if (empty($v_ftp_user)) { echo 'none';} else {echo 'block';}?> ;" id="ftptable" name="v_add_domain_ftp">
+
+
+
+                                    <?php foreach ($v_ftp_users as $i => $ftp_user): ?>
+                                    <?php
+                                        $v_ftp_user     = $ftp_user['v_ftp_user'];
+                                        $v_ftp_password = $ftp_user['v_ftp_password'];
+                                        $v_ftp_path     = $ftp_user['v_ftp_path'];
+                                        $v_ftp_email    = $ftp_user['v_ftp_email'];
+                                        $v_ftp_pre_path = $ftp_user['v_ftp_pre_path'];
+                                    ?>
+                                    <table style="display:<?php if (empty($v_ftp_user)) { echo 'none';} else {echo 'block';}?> ;" class="ftptable ftptable-nrm" name="v_add_domain_ftp">
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                                <?php print __('Username');?>
-                                                <?php if (empty($v_ftp_user)) echo '<br><span style="font-size: 10pt; color:#777;">' . __('Prefix will be automaticaly added to username',$user."_") . '</span>' ?> 
+                                            <td class="vst-text input-label">
+                                                <?php print __('FTP') ?> #<span class="ftp-user-number"><?php print $i + 1; ?></span> <a class="ftp-remove-user additional-control" onCLick="App.Actions.WEB.remove_ftp_user(this)">(<?php print __('remove') ?>)</a>
+                                                <input type="hidden" class="v-ftp-user-deleted" name="v_ftp_user[<?php print $i ?>][delete]" value="0" />
+                                                <input type="hidden" class="v-ftp-user-is-new" name="v_ftp_user[<?php print $i ?>][is_new]" value="<?php print $ftp_user['is_new'] ?>" />
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td>
-                                                <input type="text" size="20" class="vst-input" name="v_ftp_user" <?php if (!empty($v_ftp_user)) echo "value=".$v_ftp_user;?>>
+                                            <td class="vst-text step-left input-label">
+                                                <?php print __('Username');?><br>
+                                                <span style="font-size: 10pt; color:#777;"><?php print __('Prefix will be automaticaly added to username',$user."_");?></span>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="step-left">
+                                                <input type="text" size="20" class="vst-input v-ftp-user" <?php print $ftp_user['is_new'] != 1 ? 'disabled="disabled"' : '' ?> name="v_ftp_user[<?php print $i ?>][v_ftp_user]" <?php if (!empty($v_ftp_user)) echo "value=".$v_ftp_user; ?>>
                                                 <small class="hint"></small>
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                                <?php print __('Password');?> / <a href="javascript:FTPrandom();" class="generate"><?php print __('generate');?></a>
+                                            <td class="vst-text step-left  input-label">
+                                                <?php print __('Password');?> / <a href="javascript:void(0);" onClick="FTPrandom(this)"; class="generate" ><?php print __('generate');?></a>
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td>
-                                                <input type="text"  class="vst-input" name="v_ftp_password" <?php if (!empty($v_ftp_password)) echo "value=".$v_ftp_password;?>>
+                                            <td class="step-left">
+                                                <input type="text" class="vst-input v-ftp-user-psw password" name="v_ftp_user[<?php print $i ?>][v_ftp_password]" <?php if (!empty($v_ftp_password)) echo "value=".$v_ftp_password; ?>>
                                             </td>
                                         </tr>
-                                        <?php
-                                            if (empty($v_ftp_user)) {
-                                                echo '';
-                                         ?> 
+
                                         <tr>
-                                            <td class="vst-text" style="padding: 12px 0 0 0;">
-                                                <?php print __('Send FTP credentials to email');?>
+                                            <td class="vst-text step-left input-label">
+                                                 <?php print __('Path');?>
                                             </td>
                                         </tr>
                                         <tr>
-                                            <td>
-                                                <input type="text"  class="vst-input" name="v_ftp_email" <?php if (!empty($v_ftp_email)) echo "value=".$v_ftp_email;  ?>>
+                                            <td class="step-left">
+                                                <input type="hidden" class="vst-input v-ftp-pre-path" name="v_ftp_pre_path" value="<?php print !empty($v_ftp_pre_path) ? $v_ftp_pre_path : '/'; ?>">
+                                                <input type="text"  class="vst-input v-ftp-path" name="v_ftp_user[<?php print $i ?>][v_ftp_path]" <?php if (!empty($v_ftp_path)) echo "value=".($v_ftp_path[0] != '/' ? '/' : '').$v_ftp_path; ?>>
+                                                <br /><span class="ftp-path-prefix"><?php print $v_ftp_pre_path ?></span><span class="ftp-path-value v-ftp-path-hint"></span>
                                             </td>
                                         </tr>
-                                        <?php
-                                            }
-                                        ?> 
-                                    </table>
+                                        <?php if ($ftp_user['is_new'] == 1): ?>
+                                        <tr>
+                                            <td class="vst-text step-left input-label">
+                                                 <?php print __('Send FTP credentials to email');?>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td class="step-left">
+                                                <input type="text"  class="vst-input" name="v_ftp_user[<?php print $i ?>][v_ftp_email]" <?php if (!empty($v_ftp_email)) echo "value=".$v_ftp_email; ?>>
+                                            </td>
+                                        </tr>
+                                        <?php endif; ?>
+                                </table>
+                                    <?php endforeach; ?>
+                                </td>
+                            </tr>
+                            
+                            <tr class="add-new-ftp-user-button" style="<?php print !empty($v_ftp_user) ? '' : 'display:none;' ?>">
+                                <td class="vst-text step-top v-add-new-user step-bottom">
+                                    <a class="additional-control" onClick="App.Actions.WEB.add_ftp_user_form()"><?php print __('Add one more FTP Account');?></a>
                                 </td>
                             </tr>
                         </table>
                         <table class="data-col2">
                             <tr>
-                                <td style="padding: 24px 0 0 0;" width="116px">
+                                <td class="step-top" width="116px">
                                     <input type="submit" class="button" name="save" value="<?php print __('Save');?>">
                                 </td>
-                                <td style="padding: 24px 0 0 0;">
+                                <td class="step-top">
                                     <input type="button" class="button" value="<?php print __('Back');?>" onclick="<?php echo $back ?>">
                                 </td>
                             </tr>
@@ -333,7 +350,73 @@
                 </tr>
             </table>
         </form>
+        
+        <div id="templates" class="hidden">
+            <table class="ftptable ftptable-nrm" name="v_add_domain_ftp">
+                <tr> 
+                    <td class="vst-text input-label">
+                        <?php print __('FTP') ?> #<span class="ftp-user-number"></span> <a class="ftp-remove-user additional-control" onCLick="App.Actions.WEB.remove_ftp_user(this)">(<?php print __('remove') ?>)</a>
+                        <input type="hidden"  class="v-ftp-user-deleted" name="v_ftp_user[%INDEX%][delete]" value="0" />
+                        <input type="hidden" class="v-ftp-user-is-new" name="v_ftp_user[%INDEX%][is_new]" value="1" />
+                    </td>
+                </tr>
+                <tr>
+                    <td class="vst-text step-left input-label">
+                        <?php print __('Username');?><br>
+                        <span style="font-size: 10pt; color:#777;"><?php print __('Prefix will be automaticaly added to username',$user."_");?></span>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="text" size="20" class="vst-input v-ftp-user" name="v_ftp_user[%INDEX%][v_ftp_user]" value="">
+                        <small class="hint"></small>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="vst-text step-left  input-label">
+                        <?php print __('Password');?> / <a href="javascript:void(0);" onClick="FTPrandom(this)"; class="generate" ><?php print __('generate');?></a>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="text" class="vst-input v-ftp-user-psw password" name="v_ftp_user[%INDEX%][v_ftp_password]" value="">
+                    </td>
+                </tr>
+
+                <tr>
+                    <td class="vst-text step-left input-label">
+                         <?php print __('Path');?>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="hidden" class="vst-input v-ftp-pre-path" name="v_ftp_pre_path" value="">
+                        <input type="text"  class="vst-input v-ftp-path" name="v_ftp_user[%INDEX%][v_ftp_path]" value="">
+                        <br /><span class="ftp-path-prefix"><?php print $v_ftp_pre_path_new_user ?></span><span class="ftp-path-value v-ftp-path-hint"></span>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="vst-text step-left input-label">
+                         <?php print __('Send FTP credentials to email');?>
+                    </td>
+                </tr>
+                <tr>
+                    <td class="step-left">
+                        <input type="text"  class="vst-input" name="v_ftp_user[%INDEX%][v_ftp_email]" value="">
+                    </td>
+                </tr>
+        </table>
+        </div>
+        
         <script type="text/javascript">
             GLOBAL.FTP_USER_PREFIX = '<?php echo $user; ?>_';
+            $('#vstobjects').bind('submit', function(evt) {
+                $('input[disabled]').each(function(i, elm) {
+                    var copy_elm = $(elm).clone(true);
+                    $(copy_elm).attr('type', 'hidden');
+                    $(copy_elm).removeAttr('disabled');
+                    $(elm).after(copy_elm);
+                });
+            });
         </script>
         <script type="text/javascript" src="/js/pages/edit.web.js"></script>