From 7c9dfd4c05bd2b0afda9bb47836fc05d7970b274 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Wed, 15 Feb 2023 14:00:04 +0100 Subject: [PATCH 001/462] Update v-activate-rocket-nginx --- bin/v-activate-rocket-nginx | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/v-activate-rocket-nginx b/bin/v-activate-rocket-nginx index f6957975..8e5d8ee1 100644 --- a/bin/v-activate-rocket-nginx +++ b/bin/v-activate-rocket-nginx @@ -83,6 +83,7 @@ fi echo "Proxy Template is ready" # Disabling wp-cron in wp-config.php +cd /home/$user/web/$domain/public_html checkstring_disable="define('DISABLE_WP_CRON', true)" checkstring_enable="define('DISABLE_WP_CRON', false)" string_disable="define( 'DISABLE_WP_CRON', true );" From a997f6f59c7bc134a00f5ad4b97e76d0aef54128 Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Thu, 16 Feb 2023 20:50:57 +0100 Subject: [PATCH 002/462] Update v-activate-rocket-nginx --- bin/v-activate-rocket-nginx | 38 ++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/bin/v-activate-rocket-nginx b/bin/v-activate-rocket-nginx index 8e5d8ee1..770cb866 100644 --- a/bin/v-activate-rocket-nginx +++ b/bin/v-activate-rocket-nginx @@ -104,23 +104,31 @@ fi # Adding cron job -echo "Adding cron job..." - -TPL=$(/usr/local/vesta/bin/v-list-web-domain $user $domain shell | grep 'TEMPLATE:' | awk '{print $2}') -if [[ $TPL == "PHP-FPM-"* ]]; then - fpm_tpl_ver=${TPL:8:2} - fpm_ver="${TPL:8:1}.${TPL:9:1}" +# Check if a cron job already exists for any of the specified PHP-FPM versions +existing_cron=$(crontab -l -u $user | grep "*/15.*wp-cron.php.*php[5-8].[6-9]\|8.[0-2]" | grep -v "grep") +​ +if [ ! -z "$existing_cron" ]; then + echo "There is already a cron job added for user $user and domain $domain." +else + echo "Adding cron job..." +​ + # Add the cron job + TPL=$(/usr/local/vesta/bin/v-list-web-domain $user $domain shell | grep 'TEMPLATE:' | awk '{print $2}') + if [[ $TPL == "PHP-FPM-"* ]]; then + fpm_tpl_ver=${TPL:8:2} + fpm_ver="${TPL:8:1}.${TPL:9:1}" + fi +​ + touch /home/$user/web/$domain/cron.log + chown $user:$user /home/$user/web/$domain/cron.log +​ + case $fpm_ver in + 5.6 | 7.0 | 7.1 | 7.2 | 7.3 | 7.4 | 8.0 | 8.1 | 8.2) + /usr/local/vesta/bin/v-add-cron-job "$user" "*/15" "*" "*" "*" "*" "cd /home/$user/web/$domain/public_html; /usr/bin/php$fpm_ver wp-cron.php >/home/$user/web/$domain/cron.log 2>&1" + ;; + esac fi -touch /home/$user/web/$domain/cron.log -chown $user:$user /home/$user/web/$domain/cron.log - -case $fpm_ver in - 5.6 | 7.0 | 7.1 | 7.2 | 7.3 | 7.4 | 8.0 | 8.1 | 8.2) - /usr/local/vesta/bin/v-add-cron-job "$user" "*/15" "*" "*" "*" "*" "cd /home/$user/web/$domain/public_html; /usr/bin/php$fpm_ver wp-cron.php >/home/$user/web/$domain/cron.log 2>&1" - ;; -esac - #----------------------------------------------------------# # Vesta # #----------------------------------------------------------# From 38ec1b872f73fa4f531f14c3c943e58ca3d836c2 Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Thu, 16 Feb 2023 21:04:20 +0100 Subject: [PATCH 003/462] Update v-activate-rocket-nginx --- bin/v-activate-rocket-nginx | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/bin/v-activate-rocket-nginx b/bin/v-activate-rocket-nginx index 770cb866..f42a1fc3 100644 --- a/bin/v-activate-rocket-nginx +++ b/bin/v-activate-rocket-nginx @@ -73,14 +73,24 @@ fi #----------------------------------------------------------# # Changing Proxy Template -echo "Do you want to force-https in your Proxy Template or not (y/n):" -read answer -if [ "$answer" == "y" ]; then - /usr/local/vesta/bin/v-change-web-domain-proxy-tpl "$user" "$domain" "wprocket-force-https" +# Check if the proxy template is already set correctly +current_template=$(/usr/local/vesta/bin/v-list-web-domain $user $domain | grep 'PROXY:' | awk '{print $2}') +if [ "$current_template" == "wprocket-force-https" ] || [ "$current_template" == "wprocket-hosting" ]; then + echo "Proxy Template is already set up correctly" else - /usr/local/vesta/bin/v-change-web-domain-proxy-tpl "$user" "$domain" "wprocket-hosting" + # Prompt the user to choose whether to force HTTPS or not + echo "Do you want to force-https in your Proxy Template or not (y/n):" + read answer + + # Change the proxy template based on the user's choice + if [ "$answer" == "y" ]; then + /usr/local/vesta/bin/v-change-web-domain-proxy-tpl "$user" "$domain" "wprocket-force-https" + else + /usr/local/vesta/bin/v-change-web-domain-proxy-tpl "$user" "$domain" "wprocket-hosting" + fi + + echo "Proxy Template is ready" fi -echo "Proxy Template is ready" # Disabling wp-cron in wp-config.php cd /home/$user/web/$domain/public_html From 72e659ac187e5ff1d8a5048c12ca15648939847b Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 16 Feb 2023 21:20:11 +0100 Subject: [PATCH 004/462] Update v-get-php-version-of-domain --- bin/v-get-php-version-of-domain | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/bin/v-get-php-version-of-domain b/bin/v-get-php-version-of-domain index bd0e7a51..b3b320fc 100644 --- a/bin/v-get-php-version-of-domain +++ b/bin/v-get-php-version-of-domain @@ -40,12 +40,12 @@ is_object_valid 'user' 'USER' "$user" is_object_unsuspended 'user' 'USER' "$user" if [ ! -d "/home/$user" ]; then - echo "User doesn't exist"; + # echo "User doesn't exist"; exit 1; fi if [ ! -d "/home/$user/web/$domain/public_html" ]; then - echo "Domain doesn't exist"; + # echo "Domain doesn't exist"; exit 1; fi @@ -59,11 +59,12 @@ TPL=$(/usr/local/vesta/bin/v-list-web-domain $user $domain shell | grep 'TEMPLAT if [[ $TPL == "PHP-FPM-"* ]]; then fpm_tpl_ver=${TPL:8:2} fpm_ver="${TPL:8:1}.${TPL:9:1}" + echo "$fpm_ver" + exit 0; fi #----------------------------------------------------------# # Vesta # #----------------------------------------------------------# -echo "PHP-FPM version running on given domain is: $fpm_ver" -exit +exit 1; From d267a3deaa08552cf03373a7b2d1de9b0064d4f7 Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Thu, 16 Feb 2023 21:28:28 +0100 Subject: [PATCH 005/462] Update v-activate-rocket-nginx --- bin/v-activate-rocket-nginx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/v-activate-rocket-nginx b/bin/v-activate-rocket-nginx index f42a1fc3..0c491c68 100644 --- a/bin/v-activate-rocket-nginx +++ b/bin/v-activate-rocket-nginx @@ -112,10 +112,9 @@ else fi - # Adding cron job # Check if a cron job already exists for any of the specified PHP-FPM versions -existing_cron=$(crontab -l -u $user | grep "*/15.*wp-cron.php.*php[5-8].[6-9]\|8.[0-2]" | grep -v "grep") +existing_cron=$(crontab -l -u $user | grep -o "wp-cron.php >/home/$user/web/$domain/cron.log" | grep -v "grep") ​ if [ ! -z "$existing_cron" ]; then echo "There is already a cron job added for user $user and domain $domain." From ca4abdb864c2b7965edd030c469104ab17b05c27 Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Thu, 16 Feb 2023 21:38:17 +0100 Subject: [PATCH 006/462] Update v-activate-rocket-nginx --- bin/v-activate-rocket-nginx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/bin/v-activate-rocket-nginx b/bin/v-activate-rocket-nginx index 0c491c68..c142f122 100644 --- a/bin/v-activate-rocket-nginx +++ b/bin/v-activate-rocket-nginx @@ -122,11 +122,7 @@ else echo "Adding cron job..." ​ # Add the cron job - TPL=$(/usr/local/vesta/bin/v-list-web-domain $user $domain shell | grep 'TEMPLATE:' | awk '{print $2}') - if [[ $TPL == "PHP-FPM-"* ]]; then - fpm_tpl_ver=${TPL:8:2} - fpm_ver="${TPL:8:1}.${TPL:9:1}" - fi + fpm_ver=$(/usr/local/vesta/bin/v-get-php-version-of-domain "$domain") ​ touch /home/$user/web/$domain/cron.log chown $user:$user /home/$user/web/$domain/cron.log From 84cf1269fbe5e8066766afa936ff2c4c2bbe6a7f Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Mon, 20 Feb 2023 11:16:08 +0100 Subject: [PATCH 007/462] Update sr.php --- web/inc/i18n/sr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/inc/i18n/sr.php b/web/inc/i18n/sr.php index 3dfcc0f5..8c437ab9 100644 --- a/web/inc/i18n/sr.php +++ b/web/inc/i18n/sr.php @@ -119,7 +119,7 @@ $LANG['sr'] = array( 'Editing DNS Domain' => 'Izmena DNS-a za domen', 'Adding DNS Record' => 'Dodavanje DNS zapisa (DNS record)', 'Editing DNS Record' => 'Izmena DNS zapisa (DNS record)', - 'Adding Mail Domain' => 'Dodavanje Mail-a za domee', + 'Adding Mail Domain' => 'Dodavanje Mail-a za domene', 'Editing Mail Domain' => 'Izmena Mail-a za domen', 'Adding Mail Account' => 'Dodavanje Mail naloga', 'Editing Mail Account' => 'Izmena Mail naloga', From d0bba785bee13c7cf3f8746ce0aef02029998be0 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Tue, 21 Feb 2023 20:29:16 +0100 Subject: [PATCH 008/462] Update v-activate-rocket-nginx --- bin/v-activate-rocket-nginx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bin/v-activate-rocket-nginx b/bin/v-activate-rocket-nginx index c142f122..bd4145cc 100644 --- a/bin/v-activate-rocket-nginx +++ b/bin/v-activate-rocket-nginx @@ -115,18 +115,16 @@ fi # Adding cron job # Check if a cron job already exists for any of the specified PHP-FPM versions existing_cron=$(crontab -l -u $user | grep -o "wp-cron.php >/home/$user/web/$domain/cron.log" | grep -v "grep") -​ + if [ ! -z "$existing_cron" ]; then echo "There is already a cron job added for user $user and domain $domain." else echo "Adding cron job..." -​ # Add the cron job fpm_ver=$(/usr/local/vesta/bin/v-get-php-version-of-domain "$domain") -​ touch /home/$user/web/$domain/cron.log chown $user:$user /home/$user/web/$domain/cron.log -​ + case $fpm_ver in 5.6 | 7.0 | 7.1 | 7.2 | 7.3 | 7.4 | 8.0 | 8.1 | 8.2) /usr/local/vesta/bin/v-add-cron-job "$user" "*/15" "*" "*" "*" "*" "cd /home/$user/web/$domain/public_html; /usr/bin/php$fpm_ver wp-cron.php >/home/$user/web/$domain/cron.log 2>&1" From f8a3f209c4c0c6c7dd593c0011d43588f323eabb Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 23 Feb 2023 14:55:45 +0100 Subject: [PATCH 009/462] Update fix-fpm-poold.sh --- src/deb/for-download/tools/patches/fix-fpm-poold.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/deb/for-download/tools/patches/fix-fpm-poold.sh b/src/deb/for-download/tools/patches/fix-fpm-poold.sh index 88534bfd..25cd7f84 100644 --- a/src/deb/for-download/tools/patches/fix-fpm-poold.sh +++ b/src/deb/for-download/tools/patches/fix-fpm-poold.sh @@ -35,6 +35,8 @@ if [ -d "/etc/php" ]; then fi if [ -f "/etc/apache2/mods-enabled/mpm_event.conf" ]; then + rm /etc/apache2/mods-enabled/mpm_event.conf + ln -s /etc/apache2/mods-available/mpm_event.conf /etc/apache2/mods-enabled/mpm_event.conf sed -i "s#MaxRequestWorkers.*#MaxRequestWorkers 200#g" /etc/apache2/mods-enabled/mpm_event.conf systemctl restart apache2 fi From db554bacb7bf026d58e9d965fbfb4ff562df51b2 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 23 Feb 2023 14:57:37 +0100 Subject: [PATCH 010/462] Update fix-fpm-poold.sh --- src/deb/for-download/tools/patches/fix-fpm-poold.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deb/for-download/tools/patches/fix-fpm-poold.sh b/src/deb/for-download/tools/patches/fix-fpm-poold.sh index 25cd7f84..94566768 100644 --- a/src/deb/for-download/tools/patches/fix-fpm-poold.sh +++ b/src/deb/for-download/tools/patches/fix-fpm-poold.sh @@ -37,6 +37,6 @@ fi if [ -f "/etc/apache2/mods-enabled/mpm_event.conf" ]; then rm /etc/apache2/mods-enabled/mpm_event.conf ln -s /etc/apache2/mods-available/mpm_event.conf /etc/apache2/mods-enabled/mpm_event.conf - sed -i "s#MaxRequestWorkers.*#MaxRequestWorkers 200#g" /etc/apache2/mods-enabled/mpm_event.conf + sed -i "s#MaxRequestWorkers.*#MaxRequestWorkers 200#g" /etc/apache2/mods-available/mpm_event.conf systemctl restart apache2 fi From 8dcbafcc73dd45a892f14cf02b21e1ab71a5263a Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 23 Feb 2023 15:47:30 +0100 Subject: [PATCH 011/462] Update v-get-php-version-of-domain --- bin/v-get-php-version-of-domain | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/v-get-php-version-of-domain b/bin/v-get-php-version-of-domain index b3b320fc..c87b4e4c 100644 --- a/bin/v-get-php-version-of-domain +++ b/bin/v-get-php-version-of-domain @@ -15,6 +15,8 @@ fi # Importing system environment source /etc/profile +SILENT_MODE=1 + # Argument definition domain=$1 From 0fae1613e31e74fa081d84d65bcb000edc3b57d6 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 23 Feb 2023 15:58:00 +0100 Subject: [PATCH 012/462] Update main.sh --- func/main.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/func/main.sh b/func/main.sh index c4169b01..10de469a 100644 --- a/func/main.sh +++ b/func/main.sh @@ -86,7 +86,9 @@ log_history() { # Result checker check_result() { if [ $1 -ne 0 ]; then - echo "Error: $2" + if [ -z "$SILENT_MODE" ]; then + echo "Error: $2" + fi if [ ! -z "$3" ]; then log_event "$3" "$ARGUMENTS" exit $3 @@ -100,7 +102,9 @@ check_result() { # Argument list checker check_args() { if [ "$1" -gt "$2" ]; then - echo "Usage: $(basename $0) $3" + if [ -z "$SILENT_MODE" ]; then + echo "Usage: $(basename $0) $3" + fi check_result $E_ARGS "not enought arguments" >/dev/null fi } From 33911259254493c9e7b2a81da3d1e869eb7a15aa Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 23 Feb 2023 16:18:31 +0100 Subject: [PATCH 013/462] SILENT_MODE in v-search-domain-owner --- bin/v-search-domain-owner | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/v-search-domain-owner b/bin/v-search-domain-owner index 5b88f495..f807ebd2 100755 --- a/bin/v-search-domain-owner +++ b/bin/v-search-domain-owner @@ -9,6 +9,8 @@ # Variable&Function # #----------------------------------------------------------# +SILENT_MODE=1 + # Argument definition domain=$(idn -t --quiet -u "$1" ) type=${2-any} From 91c6ff09ab96df883fa739bf5c7c785b5ec5f42a Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 23 Feb 2023 20:45:28 +0100 Subject: [PATCH 014/462] Revert "Include "hidden" files to backup" --- bin/v-backup-user | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/v-backup-user b/bin/v-backup-user index 8bd0bb25..e2d7cac9 100755 --- a/bin/v-backup-user +++ b/bin/v-backup-user @@ -265,7 +265,7 @@ if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB" != '*' ]; then set +f # Backup files - tar --anchored -cpf- ${fargs[@]} --exclude={'./','../'} . |gzip -$BACKUP_GZIP - > $tmpdir/web/$domain/domain_data.tar.gz + tar --anchored -cpf- ${fargs[@]} * |gzip -$BACKUP_GZIP - > $tmpdir/web/$domain/domain_data.tar.gz done # Print total From 47d55cff76206530588a10321106fb7ea3b6c5ba Mon Sep 17 00:00:00 2001 From: N1ebieski Date: Fri, 24 Feb 2023 11:52:37 +0100 Subject: [PATCH 015/462] Update v-backup-user Include "hidden" files to backup with support for exclusions in old pattern --- bin/v-backup-user | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/v-backup-user b/bin/v-backup-user index e2d7cac9..0db5d376 100755 --- a/bin/v-backup-user +++ b/bin/v-backup-user @@ -251,6 +251,11 @@ if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB" != '*' ]; then if [ ! -z "$exlusion" ]; then xdirs="$(echo -e "$exlusion" |tr ':' '\n' |grep -v $domain)" for xpath in $xdirs; do + # Add ./ at the beginning of the path if the path is in old pattern + if [[ $xpath != ./* ]]; then + xpath=(./$xpath) + fi + if [ -d "$xpath" ]; then fargs+=(--exclude=$xpath/*) echo "$(date "+%F %T") excluding directory $xpath" @@ -265,7 +270,7 @@ if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB" != '*' ]; then set +f # Backup files - tar --anchored -cpf- ${fargs[@]} * |gzip -$BACKUP_GZIP - > $tmpdir/web/$domain/domain_data.tar.gz + tar --anchored -cpf- ${fargs[@]} --exclude={'./','../'} . |gzip -$BACKUP_GZIP - > $tmpdir/web/$domain/domain_data.tar.gz done # Print total From 6db5f28ae53cb6379d8b2d12ca88b081290ecbaa Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 2 Mar 2023 15:29:26 +0100 Subject: [PATCH 016/462] Update v-commander --- bin/v-commander | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/v-commander b/bin/v-commander index 6fe05286..f6b24612 100644 --- a/bin/v-commander +++ b/bin/v-commander @@ -391,8 +391,8 @@ do if [ "$answer" = 'm' ] || [ "$answer" = 'M' ]; then echo "=============================" echo "== installing php-memcache modules" - apt-get install -y $(systemctl --full --type service --all | grep "php...-fpm" | awk '{print $1}' | cut -c1-6 | xargs -n 1 printf "%s-memcache ") - apt-get install -y $(systemctl --full --type service --all | grep "php...-fpm" | awk '{print $1}' | cut -c1-6 | xargs -n 1 printf "%s-memcached ") + apt-get install -y $(systemctl --full --type service --all | grep "php...-fpm" | sed 's#●##g' | awk '{print $1}' | cut -c1-6 | xargs -n 1 printf "%s-memcache ") + apt-get install -y $(systemctl --full --type service --all | grep "php...-fpm" | sed 's#●##g' | awk '{print $1}' | cut -c1-6 | xargs -n 1 printf "%s-memcached ") fi if [ "$answer" = 'd' ] || [ "$answer" = 'D' ]; then From 38137b3ba9c125f2ffb4554a0997f233f8b351b8 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Fri, 3 Mar 2023 10:47:25 +0100 Subject: [PATCH 017/462] Do not delete ssl.$domain* --- bin/v-delete-web-domain-ssl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bin/v-delete-web-domain-ssl b/bin/v-delete-web-domain-ssl index 05e8c940..30272928 100755 --- a/bin/v-delete-web-domain-ssl +++ b/bin/v-delete-web-domain-ssl @@ -57,8 +57,14 @@ fi # Deleting old certificate tmpdir=$(mktemp -p $HOMEDIR/$user/web/$domain/private -d) -rm -f $HOMEDIR/$user/conf/web/ssl.$domain.* -mv $USER_DATA/ssl/$domain.* $tmpdir +rm -f $HOMEDIR/$user/conf/web/ssl.$domain.ca +rm -f $HOMEDIR/$user/conf/web/ssl.$domain.crt +rm -f $HOMEDIR/$user/conf/web/ssl.$domain.key +rm -f $HOMEDIR/$user/conf/web/ssl.$domain.pem +mv $USER_DATA/ssl/$domain.ca $tmpdir +mv $USER_DATA/ssl/$domain.crt $tmpdir +mv $USER_DATA/ssl/$domain.key $tmpdir +mv $USER_DATA/ssl/$domain.pem $tmpdir chown -R $user:$user $tmpdir From 16e1000f1cac5f4b0fefcb94badbbf6188c5450c Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 11 Mar 2023 10:40:40 +0100 Subject: [PATCH 018/462] str_get_between PHP function --- func/string.php | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/func/string.php b/func/string.php index c94f85a2..111c57eb 100644 --- a/func/string.php +++ b/func/string.php @@ -11,3 +11,33 @@ function myvesta_replace_in_file($find, $replace, $file) { $r=file_put_contents($file, $buf); return $r; } + +function myvesta_str_get_between (&$text, $left_substring, $right_substring, $start=0, $do_not_return_left_substring=1, $do_not_return_right_substring=1, $left_substring_necessary=1, $right_substring_necessary=1) +{ + $from_null=0; + $pos1=strpos($text, $left_substring, $start); + if ($pos1===FALSE) + { + if ($left_substring_necessary==1) return ""; + $pos1=$start; + $from_null=1; + } + + if ($do_not_return_left_substring==1) + { + if ($from_null==0) $pos1=$pos1+strlen($left_substring); + } + $pos2=strpos($text, $right_substring, $pos1+1); + if ($pos2===FALSE) + { + if ($right_substring_necessary==1) return ""; + $pos2=strlen($text); + } + if ($do_not_return_right_substring==1) $len=$pos2-$pos1; + else $len=($pos2-$pos1)+strlen($right_substring); + + $slen=strlen($text); + if ($pos1+$len>$slen) $len=$slen-$pos1; + + return substr($text, $pos1, $len); +} From 8ae36f7df53c174eef34fbf945ca241705b8d715 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 11 Mar 2023 14:50:11 +0100 Subject: [PATCH 019/462] Update string.php --- func/string.php | 102 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 26 deletions(-) diff --git a/func/string.php b/func/string.php index 111c57eb..8677af04 100644 --- a/func/string.php +++ b/func/string.php @@ -12,32 +12,82 @@ function myvesta_replace_in_file($find, $replace, $file) { return $r; } -function myvesta_str_get_between (&$text, $left_substring, $right_substring, $start=0, $do_not_return_left_substring=1, $do_not_return_right_substring=1, $left_substring_necessary=1, $right_substring_necessary=1) +function myvesta_str_get_between (&$text, $left_substring, $right_substring, $start=0, $return_left_substring=0, $return_right_substring=0, $left_substring_necessary=1, $right_substring_necessary=1) { - $from_null=0; - $pos1=strpos($text, $left_substring, $start); - if ($pos1===FALSE) - { - if ($left_substring_necessary==1) return ""; - $pos1=$start; - $from_null=1; - } + global $myvesta_str_found_at, $myvesta_str_end_at; + $myvesta_str_found_at=0; + $myvesta_str_end_at=0; + $from_null=0; + $pos1=strpos($text, $left_substring, $start); + if ($pos1===FALSE) + { + if ($left_substring_necessary==1) return ""; + $pos1=$start; + $from_null=1; + } - if ($do_not_return_left_substring==1) - { - if ($from_null==0) $pos1=$pos1+strlen($left_substring); - } - $pos2=strpos($text, $right_substring, $pos1+1); - if ($pos2===FALSE) - { - if ($right_substring_necessary==1) return ""; - $pos2=strlen($text); - } - if ($do_not_return_right_substring==1) $len=$pos2-$pos1; - else $len=($pos2-$pos1)+strlen($right_substring); - - $slen=strlen($text); - if ($pos1+$len>$slen) $len=$slen-$pos1; - - return substr($text, $pos1, $len); + if ($return_left_substring==0) + { + if ($from_null==0) $pos1=$pos1+strlen($left_substring); + } + $pos2=strpos($text, $right_substring, $pos1+1); + if ($pos2===FALSE) + { + if ($right_substring_necessary==1) return ""; + $pos2=strlen($text); + } + if ($return_right_substring==0) $len=$pos2-$pos1; + else $len=($pos2-$pos1)+strlen($right_substring); + + $slen=strlen($text); + if ($pos1+$len>$slen) $len=$slen-$pos1; + + $myvesta_str_found_at=$pos1; + $myvesta_str_end_at=$pos1+$len; + + return substr($text, $pos1, $len); +} + +function myvesta_str_replace_once_between_including_borders(&$text, $left, $right, $replace_with) { + $pos1=strpos($text, $left); + if ($pos1===false) return $text; + $pos2=strpos($text, $right, $left+strlen($left)); + if ($pos2===false) return $text; + return substr($text, 0, $pos1).$replace_with.substr($text, $pos2+strlen($right)); +} + +function myvesta_str_strip_once_between_including_borders(&$text, $left, $right) { + $pos1=strpos($text, $left); + if ($pos1===false) return $text; + $pos2=strpos($text, $right, $left+strlen($left)); + if ($pos2===false) return $text; + return substr($text, 0, $pos1).substr($text, $pos2+strlen($right)); +} + + +function myvesta_str_replace_between_including_borders($text, $left, $right, $replace_with) { + $start=0; + $left_len=strlen($left); + $right_len=strlen($right); + while (true) { + $pos1=strpos($text, $left); + if ($pos1===false) break; + $pos2=strpos($text, $right, $left+$left_len); + if ($pos2===false) break; + $text=substr($text, 0, $pos1).$replace_with.substr($text, $pos2+$right_len); + } + return $text; +} + +function myvesta_str_strip_between_including_borders($text, $left, $right) { + $left_len=strlen($left); + $right_len=strlen($right); + while (true) { + $pos1=strpos($text, $left); + if ($pos1===false) break; + $pos2=strpos($text, $right, $left+$left_len); + if ($pos2===false) break; + $text=substr($text, 0, $pos1).substr($text, $pos2+$right_len); + } + return $text; } From bdc75152d20e183b4f5d0a4fc9d5dc91c4f78a07 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Tue, 21 Mar 2023 17:49:08 +0100 Subject: [PATCH 020/462] php8.2.patch --- .../for-download/tools/patches/php8.2.patch | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/deb/for-download/tools/patches/php8.2.patch diff --git a/src/deb/for-download/tools/patches/php8.2.patch b/src/deb/for-download/tools/patches/php8.2.patch new file mode 100644 index 00000000..1083a720 --- /dev/null +++ b/src/deb/for-download/tools/patches/php8.2.patch @@ -0,0 +1,81 @@ +--- /etc/php/8.2/fpm/php.ini.orig 2023-03-21 14:35:10.000000000 +0100 ++++ /etc/php/8.2/fpm/php.ini 2023-03-21 14:43:42.000000000 +0100 +@@ -320,7 +320,7 @@ + ; This directive allows you to disable certain functions. + ; It receives a comma-delimited list of function names. + ; https://php.net/disable-functions +-disable_functions = ++ disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,exec,system,passthru,shell_exec,proc_open,popen + + ; This directive allows you to disable certain classes. + ; It receives a comma-delimited list of class names. +@@ -423,7 +423,7 @@ + ;max_input_nesting_level = 64 + + ; How many GET/POST/COOKIE input variables may be accepted +-;max_input_vars = 1000 ++max_input_vars = 6000 + + ; How many multipart body parts (combined input variable and file uploads) may + ; be accepted. +@@ -432,7 +432,7 @@ + + ; Maximum amount of memory a script may consume + ; https://php.net/memory-limit +-memory_limit = 128M ++memory_limit = 256M + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; Error handling and logging ; +@@ -700,7 +700,7 @@ + ; Its value may be 0 to disable the limit. It is ignored if POST data reading + ; is disabled through enable_post_data_reading. + ; https://php.net/post-max-size +-post_max_size = 8M ++post_max_size = 80M + + ; Automatically add files before PHP document. + ; https://php.net/auto-prepend-file +@@ -852,7 +852,7 @@ + + ; Maximum allowed size for uploaded files. + ; https://php.net/upload-max-filesize +-upload_max_filesize = 2M ++upload_max_filesize = 80M + + ; Maximum number of files that can be uploaded via a single request + max_file_uploads = 20 +@@ -1108,7 +1108,7 @@ + + ; The path to a log file that will log all mail() calls. Log entries include + ; the full path of the script, line number, To address and headers. +-;mail.log = ++mail.log = /var/log/php-mail.log + ; Log mail to syslog (Event Log on Windows). + ;mail.log = syslog + +@@ -1786,20 +1786,20 @@ + + [opcache] + ; Determines if Zend OPCache is enabled +-;opcache.enable=1 ++opcache.enable=1 + + ; Determines if Zend OPCache is enabled for the CLI version of PHP +-;opcache.enable_cli=0 ++opcache.enable_cli=0 + + ; The OPcache shared memory storage size. +-;opcache.memory_consumption=128 ++opcache.memory_consumption=512 + + ; The amount of memory for interned strings in Mbytes. + ;opcache.interned_strings_buffer=8 + + ; The maximum number of keys (scripts) in the OPcache hash table. + ; Only numbers between 200 and 1000000 are allowed. +-;opcache.max_accelerated_files=10000 ++opcache.max_accelerated_files=100000 + + ; The maximum percentage of "wasted" memory until a restart is scheduled. + ;opcache.max_wasted_percentage=5 From afa72dc25836775e01e6183dfdfd34dde71e1ab4 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Tue, 21 Mar 2023 17:50:14 +0100 Subject: [PATCH 021/462] Update multi-php-install.sh --- src/deb/for-download/tools/multi-php-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/deb/for-download/tools/multi-php-install.sh b/src/deb/for-download/tools/multi-php-install.sh index 14253444..764f56cf 100644 --- a/src/deb/for-download/tools/multi-php-install.sh +++ b/src/deb/for-download/tools/multi-php-install.sh @@ -332,8 +332,8 @@ if [ "$inst_82" -eq 1 ]; then chmod a+x /usr/local/vesta/data/templates/web/apache2/PHP-FPM-82.sh chmod a+x /usr/local/vesta/data/templates/web/apache2/PHP-FPM-82-public.sh echo "=== Patching php.ini for php8.2" - wget -nv https://c.myvestacp.com/tools/patches/php8.1.patch -O /root/php8.1.patch - patch /etc/php/8.2/fpm/php.ini < /root/php8.1.patch + wget -nv https://c.myvestacp.com/tools/patches/php8.2.patch -O /root/php8.2.patch + patch /etc/php/8.2/fpm/php.ini < /root/php8.2.patch if [ $memory -gt 9999999 ]; then sed -i "s|opcache.memory_consumption=512|opcache.memory_consumption=2048|g" /etc/php/8.2/fpm/php.ini fi From 172d66b4d2b9eba11cbcfb3920d09f692c81a826 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Wed, 22 Mar 2023 15:02:22 +0100 Subject: [PATCH 022/462] Add files via upload --- .../for-download/tools/patches/php8.1.patch | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/deb/for-download/tools/patches/php8.1.patch b/src/deb/for-download/tools/patches/php8.1.patch index 479af689..9e1648ab 100644 --- a/src/deb/for-download/tools/patches/php8.1.patch +++ b/src/deb/for-download/tools/patches/php8.1.patch @@ -1,5 +1,5 @@ ---- /etc/php/8.1/fpm/php.ini.orig 2021-11-25 21:48:52.000000000 +0100 -+++ /etc/php/8.1/fpm/php.ini 2021-12-12 20:25:01.000000000 +0100 +--- /etc/php/8.1/fpm/php.ini.orig 2023-03-16 15:37:38.000000000 +0100 ++++ /etc/php/8.1/fpm/php.ini 2023-03-22 14:58:38.000000000 +0100 @@ -320,7 +320,7 @@ ; This directive allows you to disable certain functions. ; It receives a comma-delimited list of function names. @@ -9,13 +9,17 @@ ; This directive allows you to disable certain classes. ; It receives a comma-delimited list of class names. -@@ -423,11 +423,11 @@ +@@ -423,7 +423,7 @@ ;max_input_nesting_level = 64 ; How many GET/POST/COOKIE input variables may be accepted -;max_input_vars = 1000 +max_input_vars = 6000 + ; How many multipart body parts (combined input variable and file uploads) may + ; be accepted. +@@ -432,7 +432,7 @@ + ; Maximum amount of memory a script may consume ; https://php.net/memory-limit -memory_limit = 128M @@ -23,7 +27,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Error handling and logging ; -@@ -695,7 +695,7 @@ +@@ -700,7 +700,7 @@ ; Its value may be 0 to disable the limit. It is ignored if POST data reading ; is disabled through enable_post_data_reading. ; https://php.net/post-max-size @@ -32,7 +36,7 @@ ; Automatically add files before PHP document. ; https://php.net/auto-prepend-file -@@ -847,7 +847,7 @@ +@@ -852,7 +852,7 @@ ; Maximum allowed size for uploaded files. ; https://php.net/upload-max-filesize @@ -41,7 +45,7 @@ ; Maximum number of files that can be uploaded via a single request max_file_uploads = 20 -@@ -1093,7 +1093,7 @@ +@@ -1103,7 +1103,7 @@ ; The path to a log file that will log all mail() calls. Log entries include ; the full path of the script, line number, To address and headers. @@ -50,7 +54,7 @@ ; Log mail to syslog (Event Log on Windows). ;mail.log = syslog -@@ -1764,20 +1764,20 @@ +@@ -1774,20 +1774,20 @@ [opcache] ; Determines if Zend OPCache is enabled From e9ca648f12c7a772a12dfd48127b89105e5ed6dd Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 23 Mar 2023 14:14:40 +0100 Subject: [PATCH 023/462] v-commander: inst-memchached and inst-redis --- bin/v-commander | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/bin/v-commander b/bin/v-commander index f6b24612..06a5f737 100644 --- a/bin/v-commander +++ b/bin/v-commander @@ -82,6 +82,8 @@ myhelp() { echo "inst p = install multi-php" echo "inst pgw = install php-gate" echo "inst r = install new Roundcube" + echo "inst memcached = install memcached" + echo "inst redis = install Redis" echo "dis fb = stop and disable fail2ban" echo "dis dove = stop and disable dovecot" echo "dis spam = stop and disable spam" @@ -430,6 +432,46 @@ do /root/install-phpgate.sh fi + if [ "$answer" = 'inst memcache' ] || [ "$answer" = 'inst memcached' ] || [ "$answer" = 'INST MEMCACHE' ] || [ "$answer" = 'INST MEMCACHED' ]; then + echo "=============================" + echo "== Installing memcached" + memory=$(grep 'MemTotal' /proc/meminfo |tr ' ' '\n' |grep [0-9]) + apt-get update + apt-get -y install memcached + apt-get install $(systemctl --full --type service --all | grep "php...-fpm" | sed 's#●##g' | awk '{print $1}' | cut -c1-6 | xargs -n 1 printf "%s-memcache ") + apt-get install $(systemctl --full --type service --all | grep "php...-fpm" | sed 's#●##g' | awk '{print $1}' | cut -c1-6 | xargs -n 1 printf "%s-memcached ") + if [ $memory -lt 15000000 ]; then + sed -i "s/-m 64/-m 256/" /etc/memcached.conf + else + sed -i "s/-m 64/-m 1024/" /etc/memcached.conf + fi + systemctl restart memcached + echo "== memcached installed." + echo "-----------------------" + fi + + if [ "$answer" = 'inst redis' ] || [ "$answer" = 'INST REDIS' ]; then + echo "=============================" + echo "== Installing Redis" + memory=$(grep 'MemTotal' /proc/meminfo |tr ' ' '\n' |grep [0-9]) + apt-get update + apt-get install -y redis-server + apt-get install $(systemctl --full --type service --all | grep "php...-fpm" | sed 's#●##g' | awk '{print $1}' | cut -c1-6 | xargs -n 1 printf "%s-redis ") + + sed -i "s|^supervised no|supervised systemd|g" /etc/redis/redis.conf + sed -i "s|^save |# save |g" /etc/redis/redis.conf + if [ $memory -lt 15000000 ]; then + sed -i "s|^# maxmemory .*|maxmemory 256m|g" /etc/redis/redis.conf + else + sed -i "s|^# maxmemory .*|maxmemory 1g|g" /etc/redis/redis.conf + fi + sed -i "s|^# maxmemory-policy .*|maxmemory-policy allkeys-lru|g" /etc/redis/redis.conf + systemctl restart redis + redis-cli info memory + echo "== Redis installed." + echo "-------------------" + fi + if [ "$answer" = 'check fc' ] || [ "$answer" = 'CHECK FC' ]; then echo "== Checking if FreshClam is up" clamavup=$(/usr/local/vesta/bin/v-list-sys-services | grep 'clamav-daemon' | grep -c 'running') From cd5cc2eda4e685490f2638969fc5b1345f1b9575 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Fri, 24 Mar 2023 20:36:20 +0100 Subject: [PATCH 024/462] Forward from primary ip, not from secondary --- install/debian/11/exim/exim4.conf.template-RC | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/install/debian/11/exim/exim4.conf.template-RC b/install/debian/11/exim/exim4.conf.template-RC index 605d848a..36ba2a0d 100644 --- a/install/debian/11/exim/exim4.conf.template-RC +++ b/install/debian/11/exim/exim4.conf.template-RC @@ -140,6 +140,11 @@ acl_check_rcpt: warn set acl_m3 = no + warn !authenticated = * + hosts = !+relay_from_hosts + condition = ${lookup{$local_part@$domain}lsearch{/etc/exim4/domains/$domain/aliases}{true}{false}} + set acl_m3 = yes + deny message = Restricted characters in address domains = +local_domains local_parts = ^[.] : ^.*[@%!/|] From a235ba63847464e7b1e4e63efd69799e45a3a3f0 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Fri, 24 Mar 2023 23:15:17 +0100 Subject: [PATCH 025/462] exim_forwarding.patch --- .../tools/patches/exim_forwarding.patch | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/deb/for-download/tools/patches/exim_forwarding.patch diff --git a/src/deb/for-download/tools/patches/exim_forwarding.patch b/src/deb/for-download/tools/patches/exim_forwarding.patch new file mode 100644 index 00000000..78b7ef69 --- /dev/null +++ b/src/deb/for-download/tools/patches/exim_forwarding.patch @@ -0,0 +1,14 @@ +--- old 2023-03-23 14:17:42.536656160 +0100 ++++ new 2023-03-24 23:07:08.186018906 +0100 +@@ -140,6 +140,11 @@ + + warn set acl_m3 = no + ++ warn !authenticated = * ++ hosts = !+relay_from_hosts ++ condition = ${lookup{$local_part@$domain}lsearch{/etc/exim4/domains/$domain/aliases}{true}{false}} ++ set acl_m3 = yes ++ + deny message = Restricted characters in address + domains = +local_domains + local_parts = ^[.] : ^.*[@%!/|] From 77857f92f016df78420d1eaa167c2b491c071ad9 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 25 Mar 2023 15:39:57 +0100 Subject: [PATCH 026/462] https redirect to the same host --- install/debian/10/templates/web/nginx/force-https-legacy.tpl | 2 +- install/debian/10/templates/web/nginx/force-https-public.tpl | 2 +- .../10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl | 2 +- install/debian/10/templates/web/nginx/force-https.tpl | 2 +- install/debian/10/templates/web/nginx/private-force-https.tpl | 2 +- install/debian/11/templates/web/nginx/force-https-legacy.tpl | 2 +- install/debian/11/templates/web/nginx/force-https-public.tpl | 2 +- .../11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl | 2 +- install/debian/11/templates/web/nginx/force-https.tpl | 2 +- install/debian/11/templates/web/nginx/private-force-https.tpl | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/install/debian/10/templates/web/nginx/force-https-legacy.tpl b/install/debian/10/templates/web/nginx/force-https-legacy.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/10/templates/web/nginx/force-https-legacy.tpl +++ b/install/debian/10/templates/web/nginx/force-https-legacy.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/10/templates/web/nginx/force-https-public.tpl b/install/debian/10/templates/web/nginx/force-https-public.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/10/templates/web/nginx/force-https-public.tpl +++ b/install/debian/10/templates/web/nginx/force-https-public.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl b/install/debian/10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl +++ b/install/debian/10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/10/templates/web/nginx/force-https.tpl b/install/debian/10/templates/web/nginx/force-https.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/10/templates/web/nginx/force-https.tpl +++ b/install/debian/10/templates/web/nginx/force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/10/templates/web/nginx/private-force-https.tpl b/install/debian/10/templates/web/nginx/private-force-https.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/10/templates/web/nginx/private-force-https.tpl +++ b/install/debian/10/templates/web/nginx/private-force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/force-https-legacy.tpl b/install/debian/11/templates/web/nginx/force-https-legacy.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/11/templates/web/nginx/force-https-legacy.tpl +++ b/install/debian/11/templates/web/nginx/force-https-legacy.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/force-https-public.tpl b/install/debian/11/templates/web/nginx/force-https-public.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/11/templates/web/nginx/force-https-public.tpl +++ b/install/debian/11/templates/web/nginx/force-https-public.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl b/install/debian/11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl +++ b/install/debian/11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/force-https.tpl b/install/debian/11/templates/web/nginx/force-https.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/11/templates/web/nginx/force-https.tpl +++ b/install/debian/11/templates/web/nginx/force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/private-force-https.tpl b/install/debian/11/templates/web/nginx/private-force-https.tpl index 851ac0dc..8bdbea42 100644 --- a/install/debian/11/templates/web/nginx/private-force-https.tpl +++ b/install/debian/11/templates/web/nginx/private-force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host%$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } From ce7f31121dbf800f5e738749303dcef7ed39c6b2 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 25 Mar 2023 16:10:09 +0100 Subject: [PATCH 027/462] https redirect to the same host (deb9) --- .../web/nginx/force-https-legacy.stpl | 39 ++++++++++++ .../web/nginx/force-https-legacy.tpl | 8 +++ .../web/nginx/force-https-public.stpl | 39 ++++++++++++ .../web/nginx/force-https-public.tpl | 8 +++ .../nginx/force-https-webmail-phpmyadmin.stpl | 63 +++++++++++++++++++ .../nginx/force-https-webmail-phpmyadmin.tpl | 8 +++ .../8/templates/web/nginx/force-https.stpl | 39 ++++++++++++ .../8/templates/web/nginx/force-https.tpl | 8 +++ .../web/nginx/private-force-https.stpl | 39 ++++++++++++ 9 files changed, 251 insertions(+) create mode 100644 install/debian/8/templates/web/nginx/force-https-legacy.stpl create mode 100644 install/debian/8/templates/web/nginx/force-https-legacy.tpl create mode 100644 install/debian/8/templates/web/nginx/force-https-public.stpl create mode 100644 install/debian/8/templates/web/nginx/force-https-public.tpl create mode 100644 install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.stpl create mode 100644 install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.tpl create mode 100644 install/debian/8/templates/web/nginx/force-https.stpl create mode 100644 install/debian/8/templates/web/nginx/force-https.tpl create mode 100644 install/debian/8/templates/web/nginx/private-force-https.stpl diff --git a/install/debian/8/templates/web/nginx/force-https-legacy.stpl b/install/debian/8/templates/web/nginx/force-https-legacy.stpl new file mode 100644 index 00000000..79e55a26 --- /dev/null +++ b/install/debian/8/templates/web/nginx/force-https-legacy.stpl @@ -0,0 +1,39 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + disable_symlinks if_not_owner from=%docroot%; + + include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; + include %home%/%user%/conf/web/s%proxy_system%.%domain%.conf*; +} diff --git a/install/debian/8/templates/web/nginx/force-https-legacy.tpl b/install/debian/8/templates/web/nginx/force-https-legacy.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/8/templates/web/nginx/force-https-legacy.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} diff --git a/install/debian/8/templates/web/nginx/force-https-public.stpl b/install/debian/8/templates/web/nginx/force-https-public.stpl new file mode 100644 index 00000000..ac422df6 --- /dev/null +++ b/install/debian/8/templates/web/nginx/force-https-public.stpl @@ -0,0 +1,39 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%/public; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + disable_symlinks if_not_owner from=%docroot%/public; + + include %home%/%user%/conf/web/snginx.%domain_idn%.conf*; +} + diff --git a/install/debian/8/templates/web/nginx/force-https-public.tpl b/install/debian/8/templates/web/nginx/force-https-public.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/8/templates/web/nginx/force-https-public.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} diff --git a/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.stpl b/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.stpl new file mode 100644 index 00000000..7e0e71d1 --- /dev/null +++ b/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.stpl @@ -0,0 +1,63 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /webmail { + disable_symlinks off; + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root /var/lib/roundcube; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /phpmyadmin { + disable_symlinks off; + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root /usr/share; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + disable_symlinks if_not_owner from=%docroot%; + + include %home%/%user%/conf/web/snginx.%domain%.conf*; +} + diff --git a/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.tpl b/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} diff --git a/install/debian/8/templates/web/nginx/force-https.stpl b/install/debian/8/templates/web/nginx/force-https.stpl new file mode 100644 index 00000000..33fab443 --- /dev/null +++ b/install/debian/8/templates/web/nginx/force-https.stpl @@ -0,0 +1,39 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + disable_symlinks if_not_owner from=%docroot%; + + include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; + include %home%/%user%/conf/web/s%proxy_system%.%domain%.conf*; +} diff --git a/install/debian/8/templates/web/nginx/force-https.tpl b/install/debian/8/templates/web/nginx/force-https.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/8/templates/web/nginx/force-https.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} diff --git a/install/debian/8/templates/web/nginx/private-force-https.stpl b/install/debian/8/templates/web/nginx/private-force-https.stpl new file mode 100644 index 00000000..64094fb8 --- /dev/null +++ b/install/debian/8/templates/web/nginx/private-force-https.stpl @@ -0,0 +1,39 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + auth_basic "Restricted area"; + auth_basic_user_file /etc/nginx/.htpasswd; + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; + include %home%/%user%/conf/web/s%proxy_system%.%domain%.conf*; +} From fdd8350fef054a18d55d5a848d4c51566a6068ff Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 25 Mar 2023 16:12:44 +0100 Subject: [PATCH 028/462] https redirect to the same host (deb9) --- .../web/nginx/force-https-legacy.stpl | 39 ++++++++++++ .../web/nginx/force-https-legacy.tpl | 8 +++ .../web/nginx/force-https-public.stpl | 39 ++++++++++++ .../web/nginx/force-https-public.tpl | 8 +++ .../nginx/force-https-webmail-phpmyadmin.stpl | 63 +++++++++++++++++++ .../nginx/force-https-webmail-phpmyadmin.tpl | 8 +++ .../9/templates/web/nginx/force-https.stpl | 39 ++++++++++++ .../9/templates/web/nginx/force-https.tpl | 8 +++ .../web/nginx/private-force-https.stpl | 39 ++++++++++++ 9 files changed, 251 insertions(+) create mode 100644 install/debian/9/templates/web/nginx/force-https-legacy.stpl create mode 100644 install/debian/9/templates/web/nginx/force-https-legacy.tpl create mode 100644 install/debian/9/templates/web/nginx/force-https-public.stpl create mode 100644 install/debian/9/templates/web/nginx/force-https-public.tpl create mode 100644 install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.stpl create mode 100644 install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.tpl create mode 100644 install/debian/9/templates/web/nginx/force-https.stpl create mode 100644 install/debian/9/templates/web/nginx/force-https.tpl create mode 100644 install/debian/9/templates/web/nginx/private-force-https.stpl diff --git a/install/debian/9/templates/web/nginx/force-https-legacy.stpl b/install/debian/9/templates/web/nginx/force-https-legacy.stpl new file mode 100644 index 00000000..79e55a26 --- /dev/null +++ b/install/debian/9/templates/web/nginx/force-https-legacy.stpl @@ -0,0 +1,39 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + disable_symlinks if_not_owner from=%docroot%; + + include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; + include %home%/%user%/conf/web/s%proxy_system%.%domain%.conf*; +} diff --git a/install/debian/9/templates/web/nginx/force-https-legacy.tpl b/install/debian/9/templates/web/nginx/force-https-legacy.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/9/templates/web/nginx/force-https-legacy.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} diff --git a/install/debian/9/templates/web/nginx/force-https-public.stpl b/install/debian/9/templates/web/nginx/force-https-public.stpl new file mode 100644 index 00000000..ac422df6 --- /dev/null +++ b/install/debian/9/templates/web/nginx/force-https-public.stpl @@ -0,0 +1,39 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%/public; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + disable_symlinks if_not_owner from=%docroot%/public; + + include %home%/%user%/conf/web/snginx.%domain_idn%.conf*; +} + diff --git a/install/debian/9/templates/web/nginx/force-https-public.tpl b/install/debian/9/templates/web/nginx/force-https-public.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/9/templates/web/nginx/force-https-public.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} diff --git a/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.stpl b/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.stpl new file mode 100644 index 00000000..7e0e71d1 --- /dev/null +++ b/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.stpl @@ -0,0 +1,63 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /webmail { + disable_symlinks off; + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root /var/lib/roundcube; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /phpmyadmin { + disable_symlinks off; + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root /usr/share; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + disable_symlinks if_not_owner from=%docroot%; + + include %home%/%user%/conf/web/snginx.%domain%.conf*; +} + diff --git a/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.tpl b/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} diff --git a/install/debian/9/templates/web/nginx/force-https.stpl b/install/debian/9/templates/web/nginx/force-https.stpl new file mode 100644 index 00000000..33fab443 --- /dev/null +++ b/install/debian/9/templates/web/nginx/force-https.stpl @@ -0,0 +1,39 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + disable_symlinks if_not_owner from=%docroot%; + + include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; + include %home%/%user%/conf/web/s%proxy_system%.%domain%.conf*; +} diff --git a/install/debian/9/templates/web/nginx/force-https.tpl b/install/debian/9/templates/web/nginx/force-https.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/9/templates/web/nginx/force-https.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} diff --git a/install/debian/9/templates/web/nginx/private-force-https.stpl b/install/debian/9/templates/web/nginx/private-force-https.stpl new file mode 100644 index 00000000..64094fb8 --- /dev/null +++ b/install/debian/9/templates/web/nginx/private-force-https.stpl @@ -0,0 +1,39 @@ +server { + listen %ip%:%proxy_ssl_port% ssl http2; + server_name %domain_idn% %alias_idn%; + + ssl_certificate %ssl_pem%; + ssl_certificate_key %ssl_key%; + error_log /var/log/%web_system%/domains/%domain%.error.log error; + + location / { + auth_basic "Restricted area"; + auth_basic_user_file /etc/nginx/.htpasswd; + proxy_pass https://%ip%:%web_ssl_port%; + location ~* ^.+\.(%proxy_extentions%)$ { + root %sdocroot%; + access_log /var/log/%web_system%/domains/%domain%.log combined; + access_log /var/log/%web_system%/domains/%domain%.bytes bytes; + expires max; + # try_files $uri @fallback; + } + } + + location /error/ { + alias %home%/%user%/web/%domain%/document_errors/; + } + + location @fallback { + proxy_pass https://%ip%:%web_ssl_port%; + } + + location ~ /\.ht {return 404;} + location ~ /\.env {return 404;} + location ~ /\.svn/ {return 404;} + location ~ /\.git/ {return 404;} + location ~ /\.hg/ {return 404;} + location ~ /\.bzr/ {return 404;} + + include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; + include %home%/%user%/conf/web/s%proxy_system%.%domain%.conf*; +} From 66097392bf6fe30edabb679615211f3b16a04980 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 25 Mar 2023 16:22:49 +0100 Subject: [PATCH 029/462] deb8 ttp2->ssl fix --- .../debian/8/templates/web/nginx/force-https-legacy.stpl | 2 +- .../debian/8/templates/web/nginx/force-https-public.stpl | 2 +- .../web/nginx/force-https-webmail-phpmyadmin.stpl | 2 +- install/debian/8/templates/web/nginx/force-https.stpl | 2 +- .../debian/8/templates/web/nginx/private-force-https.stpl | 2 +- .../debian/8/templates/web/nginx/private-force-https.tpl | 8 ++++++++ 6 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 install/debian/8/templates/web/nginx/private-force-https.tpl diff --git a/install/debian/8/templates/web/nginx/force-https-legacy.stpl b/install/debian/8/templates/web/nginx/force-https-legacy.stpl index 79e55a26..4e51748d 100644 --- a/install/debian/8/templates/web/nginx/force-https-legacy.stpl +++ b/install/debian/8/templates/web/nginx/force-https-legacy.stpl @@ -1,5 +1,5 @@ server { - listen %ip%:%proxy_ssl_port% ssl http2; + listen %ip%:%proxy_ssl_port% ssl; server_name %domain_idn% %alias_idn%; ssl_certificate %ssl_pem%; diff --git a/install/debian/8/templates/web/nginx/force-https-public.stpl b/install/debian/8/templates/web/nginx/force-https-public.stpl index ac422df6..9522313b 100644 --- a/install/debian/8/templates/web/nginx/force-https-public.stpl +++ b/install/debian/8/templates/web/nginx/force-https-public.stpl @@ -1,5 +1,5 @@ server { - listen %ip%:%proxy_ssl_port% ssl http2; + listen %ip%:%proxy_ssl_port% ssl; server_name %domain_idn% %alias_idn%; ssl_certificate %ssl_pem%; diff --git a/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.stpl b/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.stpl index 7e0e71d1..2d62e72b 100644 --- a/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.stpl +++ b/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.stpl @@ -1,5 +1,5 @@ server { - listen %ip%:%proxy_ssl_port% ssl http2; + listen %ip%:%proxy_ssl_port% ssl; server_name %domain_idn% %alias_idn%; ssl_certificate %ssl_pem%; diff --git a/install/debian/8/templates/web/nginx/force-https.stpl b/install/debian/8/templates/web/nginx/force-https.stpl index 33fab443..d138ea63 100644 --- a/install/debian/8/templates/web/nginx/force-https.stpl +++ b/install/debian/8/templates/web/nginx/force-https.stpl @@ -1,5 +1,5 @@ server { - listen %ip%:%proxy_ssl_port% ssl http2; + listen %ip%:%proxy_ssl_port% ssl; server_name %domain_idn% %alias_idn%; ssl_certificate %ssl_pem%; diff --git a/install/debian/8/templates/web/nginx/private-force-https.stpl b/install/debian/8/templates/web/nginx/private-force-https.stpl index 64094fb8..c77baf91 100644 --- a/install/debian/8/templates/web/nginx/private-force-https.stpl +++ b/install/debian/8/templates/web/nginx/private-force-https.stpl @@ -1,5 +1,5 @@ server { - listen %ip%:%proxy_ssl_port% ssl http2; + listen %ip%:%proxy_ssl_port% ssl; server_name %domain_idn% %alias_idn%; ssl_certificate %ssl_pem%; diff --git a/install/debian/8/templates/web/nginx/private-force-https.tpl b/install/debian/8/templates/web/nginx/private-force-https.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/8/templates/web/nginx/private-force-https.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} From 71f91ba16dbbe713d78c632b2dc94ce7827ae826 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 25 Mar 2023 16:24:20 +0100 Subject: [PATCH 030/462] deb9 private-force-https.tpl --- .../debian/9/templates/web/nginx/private-force-https.tpl | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 install/debian/9/templates/web/nginx/private-force-https.tpl diff --git a/install/debian/9/templates/web/nginx/private-force-https.tpl b/install/debian/9/templates/web/nginx/private-force-https.tpl new file mode 100644 index 00000000..8bdbea42 --- /dev/null +++ b/install/debian/9/templates/web/nginx/private-force-https.tpl @@ -0,0 +1,8 @@ +server { + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { + rewrite ^(.*) https://$host%$1 permanent; + } +include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; +} From 797ae8e515f72987234130326225144b671c9191 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 25 Mar 2023 18:19:29 +0100 Subject: [PATCH 031/462] force-https.patch --- src/deb/for-download/tools/patches/force-https.patch | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/deb/for-download/tools/patches/force-https.patch diff --git a/src/deb/for-download/tools/patches/force-https.patch b/src/deb/for-download/tools/patches/force-https.patch new file mode 100644 index 00000000..8de3c241 --- /dev/null +++ b/src/deb/for-download/tools/patches/force-https.patch @@ -0,0 +1,11 @@ +--- force-https.tpl.orig 2023-03-25 18:15:15.577555584 +0100 ++++ force-https.tpl 2023-03-25 16:51:48.044997322 +0100 +@@ -2,7 +2,7 @@ + listen %ip%:%proxy_port%; + server_name %domain_idn% %alias_idn%; + location / { +- rewrite ^(.*) https://%domain_idn%$1 permanent; ++ rewrite ^(.*) https://$host%$1 permanent; + } + include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; + } From 505c4085f5f8b0ef7894dd03d7220b9f26b47113 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 25 Mar 2023 18:30:41 +0100 Subject: [PATCH 032/462] Update force-https.patch --- src/deb/for-download/tools/patches/force-https.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deb/for-download/tools/patches/force-https.patch b/src/deb/for-download/tools/patches/force-https.patch index 8de3c241..05c2004d 100644 --- a/src/deb/for-download/tools/patches/force-https.patch +++ b/src/deb/for-download/tools/patches/force-https.patch @@ -5,7 +5,7 @@ server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; -+ rewrite ^(.*) https://$host%$1 permanent; ++ rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } From d84a021354d4f8bf317e558b1225c6cdd6acb728 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 25 Mar 2023 23:59:28 +0100 Subject: [PATCH 033/462] force-https fix --- install/debian/10/templates/web/nginx/force-https-legacy.tpl | 2 +- install/debian/10/templates/web/nginx/force-https-public.tpl | 2 +- .../10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl | 2 +- install/debian/10/templates/web/nginx/force-https.tpl | 2 +- install/debian/10/templates/web/nginx/private-force-https.tpl | 2 +- install/debian/11/templates/web/nginx/force-https-legacy.tpl | 2 +- install/debian/11/templates/web/nginx/force-https-public.tpl | 2 +- .../11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl | 2 +- install/debian/11/templates/web/nginx/force-https.tpl | 2 +- install/debian/11/templates/web/nginx/private-force-https.tpl | 2 +- install/debian/8/templates/web/nginx/force-https-legacy.tpl | 2 +- install/debian/8/templates/web/nginx/force-https-public.tpl | 2 +- .../8/templates/web/nginx/force-https-webmail-phpmyadmin.tpl | 2 +- install/debian/8/templates/web/nginx/force-https.tpl | 2 +- install/debian/8/templates/web/nginx/private-force-https.tpl | 2 +- install/debian/9/templates/web/nginx/force-https-legacy.tpl | 2 +- install/debian/9/templates/web/nginx/force-https-public.tpl | 2 +- .../9/templates/web/nginx/force-https-webmail-phpmyadmin.tpl | 2 +- install/debian/9/templates/web/nginx/force-https.tpl | 2 +- install/debian/9/templates/web/nginx/private-force-https.tpl | 2 +- .../nodejs-nginx-templates/node-app-3000-pass-to-https.tpl | 2 +- .../for-download/tools/nodejs-nginx-templates/node-app-3000.tpl | 2 +- .../nodejs-nginx-templates/node-app-4000-and-websocket-6001.tpl | 2 +- .../force-https-firewall-burst-2-speed-2-conn-4.tpl | 2 +- .../rate-limit-tpl/force-https-firewall-burst-2-speed-2.tpl | 2 +- .../tools/rate-limit-tpl/force-https-firewall-burst-2.tpl | 2 +- .../for-download/tools/rate-limit-tpl/force-https-firewall.tpl | 2 +- .../tools/rocket-nginx-templates/wprocket-force-https.tpl | 2 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/install/debian/10/templates/web/nginx/force-https-legacy.tpl b/install/debian/10/templates/web/nginx/force-https-legacy.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/10/templates/web/nginx/force-https-legacy.tpl +++ b/install/debian/10/templates/web/nginx/force-https-legacy.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/10/templates/web/nginx/force-https-public.tpl b/install/debian/10/templates/web/nginx/force-https-public.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/10/templates/web/nginx/force-https-public.tpl +++ b/install/debian/10/templates/web/nginx/force-https-public.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl b/install/debian/10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl +++ b/install/debian/10/templates/web/nginx/force-https-webmail-phpmyadmin.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/10/templates/web/nginx/force-https.tpl b/install/debian/10/templates/web/nginx/force-https.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/10/templates/web/nginx/force-https.tpl +++ b/install/debian/10/templates/web/nginx/force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/10/templates/web/nginx/private-force-https.tpl b/install/debian/10/templates/web/nginx/private-force-https.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/10/templates/web/nginx/private-force-https.tpl +++ b/install/debian/10/templates/web/nginx/private-force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/force-https-legacy.tpl b/install/debian/11/templates/web/nginx/force-https-legacy.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/11/templates/web/nginx/force-https-legacy.tpl +++ b/install/debian/11/templates/web/nginx/force-https-legacy.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/force-https-public.tpl b/install/debian/11/templates/web/nginx/force-https-public.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/11/templates/web/nginx/force-https-public.tpl +++ b/install/debian/11/templates/web/nginx/force-https-public.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl b/install/debian/11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl +++ b/install/debian/11/templates/web/nginx/force-https-webmail-phpmyadmin.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/force-https.tpl b/install/debian/11/templates/web/nginx/force-https.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/11/templates/web/nginx/force-https.tpl +++ b/install/debian/11/templates/web/nginx/force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/11/templates/web/nginx/private-force-https.tpl b/install/debian/11/templates/web/nginx/private-force-https.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/11/templates/web/nginx/private-force-https.tpl +++ b/install/debian/11/templates/web/nginx/private-force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/8/templates/web/nginx/force-https-legacy.tpl b/install/debian/8/templates/web/nginx/force-https-legacy.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/8/templates/web/nginx/force-https-legacy.tpl +++ b/install/debian/8/templates/web/nginx/force-https-legacy.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/8/templates/web/nginx/force-https-public.tpl b/install/debian/8/templates/web/nginx/force-https-public.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/8/templates/web/nginx/force-https-public.tpl +++ b/install/debian/8/templates/web/nginx/force-https-public.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.tpl b/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.tpl +++ b/install/debian/8/templates/web/nginx/force-https-webmail-phpmyadmin.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/8/templates/web/nginx/force-https.tpl b/install/debian/8/templates/web/nginx/force-https.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/8/templates/web/nginx/force-https.tpl +++ b/install/debian/8/templates/web/nginx/force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/8/templates/web/nginx/private-force-https.tpl b/install/debian/8/templates/web/nginx/private-force-https.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/8/templates/web/nginx/private-force-https.tpl +++ b/install/debian/8/templates/web/nginx/private-force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/9/templates/web/nginx/force-https-legacy.tpl b/install/debian/9/templates/web/nginx/force-https-legacy.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/9/templates/web/nginx/force-https-legacy.tpl +++ b/install/debian/9/templates/web/nginx/force-https-legacy.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/9/templates/web/nginx/force-https-public.tpl b/install/debian/9/templates/web/nginx/force-https-public.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/9/templates/web/nginx/force-https-public.tpl +++ b/install/debian/9/templates/web/nginx/force-https-public.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.tpl b/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.tpl +++ b/install/debian/9/templates/web/nginx/force-https-webmail-phpmyadmin.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/9/templates/web/nginx/force-https.tpl b/install/debian/9/templates/web/nginx/force-https.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/9/templates/web/nginx/force-https.tpl +++ b/install/debian/9/templates/web/nginx/force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/install/debian/9/templates/web/nginx/private-force-https.tpl b/install/debian/9/templates/web/nginx/private-force-https.tpl index 8bdbea42..5a463370 100644 --- a/install/debian/9/templates/web/nginx/private-force-https.tpl +++ b/install/debian/9/templates/web/nginx/private-force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://$host%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/src/deb/for-download/tools/nodejs-nginx-templates/node-app-3000-pass-to-https.tpl b/src/deb/for-download/tools/nodejs-nginx-templates/node-app-3000-pass-to-https.tpl index 851ac0dc..5a463370 100644 --- a/src/deb/for-download/tools/nodejs-nginx-templates/node-app-3000-pass-to-https.tpl +++ b/src/deb/for-download/tools/nodejs-nginx-templates/node-app-3000-pass-to-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/src/deb/for-download/tools/nodejs-nginx-templates/node-app-3000.tpl b/src/deb/for-download/tools/nodejs-nginx-templates/node-app-3000.tpl index 851ac0dc..5a463370 100644 --- a/src/deb/for-download/tools/nodejs-nginx-templates/node-app-3000.tpl +++ b/src/deb/for-download/tools/nodejs-nginx-templates/node-app-3000.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/src/deb/for-download/tools/nodejs-nginx-templates/node-app-4000-and-websocket-6001.tpl b/src/deb/for-download/tools/nodejs-nginx-templates/node-app-4000-and-websocket-6001.tpl index 958b2594..ee8db90e 100644 --- a/src/deb/for-download/tools/nodejs-nginx-templates/node-app-4000-and-websocket-6001.tpl +++ b/src/deb/for-download/tools/nodejs-nginx-templates/node-app-4000-and-websocket-6001.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } location /app { diff --git a/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2-speed-2-conn-4.tpl b/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2-speed-2-conn-4.tpl index 851ac0dc..5a463370 100644 --- a/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2-speed-2-conn-4.tpl +++ b/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2-speed-2-conn-4.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2-speed-2.tpl b/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2-speed-2.tpl index 851ac0dc..5a463370 100644 --- a/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2-speed-2.tpl +++ b/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2-speed-2.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2.tpl b/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2.tpl index 851ac0dc..5a463370 100644 --- a/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2.tpl +++ b/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall-burst-2.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall.tpl b/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall.tpl index 851ac0dc..5a463370 100644 --- a/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall.tpl +++ b/src/deb/for-download/tools/rate-limit-tpl/force-https-firewall.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } diff --git a/src/deb/for-download/tools/rocket-nginx-templates/wprocket-force-https.tpl b/src/deb/for-download/tools/rocket-nginx-templates/wprocket-force-https.tpl index 851ac0dc..5a463370 100644 --- a/src/deb/for-download/tools/rocket-nginx-templates/wprocket-force-https.tpl +++ b/src/deb/for-download/tools/rocket-nginx-templates/wprocket-force-https.tpl @@ -2,7 +2,7 @@ server { listen %ip%:%proxy_port%; server_name %domain_idn% %alias_idn%; location / { - rewrite ^(.*) https://%domain_idn%$1 permanent; + rewrite ^(.*) https://$host$1 permanent; } include %home%/%user%/conf/web/*nginx.%domain_idn%.conf_letsencrypt; } From 09dcc123be70b17f53d1b72bed77285d95a1b023 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sun, 26 Mar 2023 03:40:33 +0200 Subject: [PATCH 034/462] Interpreter for calling myVesta PHP functions --- bin/v-php-func | 11 ++++++++ func/bash-to-php-interpreter.php | 21 ++++++++++++++ func/main.php | 21 ++++++++++++-- func/string.php | 48 +++++++++++++++++++++++++++++--- 4 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 bin/v-php-func create mode 100644 func/bash-to-php-interpreter.php diff --git a/bin/v-php-func b/bin/v-php-func new file mode 100644 index 00000000..dd75df43 --- /dev/null +++ b/bin/v-php-func @@ -0,0 +1,11 @@ +#!/bin/bash +# info: calling myVesta PHP functions +# options: FUNCTION +# +# The function is calling myVesta PHP functions. + +#----------------------------------------------------------# +# Action # +#----------------------------------------------------------# + +php /usr/local/vesta/func/bash-to-php-interpreter.php "$@" diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php new file mode 100644 index 00000000..6f06dae2 --- /dev/null +++ b/func/bash-to-php-interpreter.php @@ -0,0 +1,21 @@ + Date: Sun, 26 Mar 2023 03:49:38 +0200 Subject: [PATCH 035/462] Update bash-to-php-interpreter.php --- func/bash-to-php-interpreter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index 6f06dae2..f47e7f9c 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -6,7 +6,7 @@ include ("/usr/local/vesta/func/main.php"); include ("/usr/local/vesta/func/string.php"); $counter=count($argv); -if ($counter<1) myvesta_throw_error(2, 'Function is missing'); +if ($counter<2) myvesta_throw_error(2, 'Function is missing'); $func="myvesta_".$argv[1]; if (!function_exists($func)) myvesta_throw_error(2, 'Function does not exists'); From beccead3889bd42459f8933ad55cdd6a17dc5a6d Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sun, 26 Mar 2023 14:58:10 +0200 Subject: [PATCH 036/462] php-func fix --- bin/v-php-func | 1 + func/bash-to-php-interpreter.php | 21 +++++++++++++++++---- func/main.php | 1 + func/string.php | 25 +++++++++++++++---------- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/bin/v-php-func b/bin/v-php-func index dd75df43..f6192c33 100644 --- a/bin/v-php-func +++ b/bin/v-php-func @@ -9,3 +9,4 @@ #----------------------------------------------------------# php /usr/local/vesta/func/bash-to-php-interpreter.php "$@" +exit $? diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index f47e7f9c..6c1c2fa0 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -1,6 +1,6 @@ Date: Sun, 26 Mar 2023 15:01:52 +0200 Subject: [PATCH 037/462] tabs fix --- func/bash-to-php-interpreter.php | 22 +++++++++++----------- func/main.php | 22 +++++++++++----------- func/string.php | 20 ++++++++++---------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index 6c1c2fa0..9c67ab55 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -10,25 +10,25 @@ if ($counter<2) myvesta_throw_error(2, 'Function is missing'); $func=$argv[1]; if (!function_exists($func)) { - $func="myvesta_".$argv[1]; - if (!function_exists($func)) myvesta_throw_error(2, 'Function does not exists'); + $func="myvesta_".$argv[1]; + if (!function_exists($func)) myvesta_throw_error(2, 'Function does not exists'); } $params=array(); for ($i=2; $i<$counter; $i++) { - $argv[$i]=myvesta_fix_backslashes($argv[$i]); - $params[]=$argv[$i]; + $argv[$i]=myvesta_fix_backslashes($argv[$i]); + $params[]=$argv[$i]; } $r=call_user_func_array($func, $params); if (is_bool($r)) { - if ($r) { - exit(0); - } else { - exit(MYVESTA_ERROR_GENERAL); - } + if ($r) { + exit(0); + } else { + exit(MYVESTA_ERROR_GENERAL); + } } else { - echo $r; - exit(0); + echo $r; + exit(0); } diff --git a/func/main.php b/func/main.php index d09a6bd8..1a932fa7 100644 --- a/func/main.php +++ b/func/main.php @@ -18,10 +18,10 @@ function myvesta_throw_error($code, $message) { } function myvesta_fix_backslashes($s) { - $s=str_replace("\\n", "\n", $s); - $s=str_replace("\\r", "\r", $s); - $s=str_replace("\\t", "\t", $s); - return $s; + $s=str_replace("\\n", "\n", $s); + $s=str_replace("\\r", "\r", $s); + $s=str_replace("\\t", "\t", $s); + return $s; } function myvesta_check_args ($requried_arguments, $arguments) { @@ -45,11 +45,11 @@ function myvesta_check_args ($requried_arguments, $arguments) { function myvesta_fix_args() { global $argv; - $i=0; + $i=0; foreach ($argv as $argument) { - if ($i==0) {$i++; continue;} + if ($i==0) {$i++; continue;} $argv[$i]=myvesta_fix_backslashes($argv[$i]); - $i++; + $i++; } } @@ -60,8 +60,8 @@ function myvesta_exit($code) { } function myvesta_test_func () { - $args=func_get_args(); - echo "You said: "; - print_r ($args); - echo "\n"; + $args=func_get_args(); + echo "You said: "; + print_r ($args); + echo "\n"; } diff --git a/func/string.php b/func/string.php index 0fa284cf..3882c069 100644 --- a/func/string.php +++ b/func/string.php @@ -11,49 +11,49 @@ function myvesta_replace_in_file($file, $find, $replace) { $buf=str_replace($find, $replace, $buf); $r=file_put_contents($file, $buf); - if ($r===false) return false; + if ($r===false) return false; return true; } function myvesta_get_between_in_file($file, $left_substring, $right_substring, $start=0, $return_left_substring=0, $return_right_substring=0, $left_substring_necessary=1, $right_substring_necessary=1) { if (!file_exists($file)) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); $text=file_get_contents($file); - return myvesta_str_get_between ($text, $left_substring, $right_substring, $start, $return_left_substring, $return_right_substring, $left_substring_necessary, $right_substring_necessary); + return myvesta_str_get_between ($text, $left_substring, $right_substring, $start, $return_left_substring, $return_right_substring, $left_substring_necessary, $right_substring_necessary); } function myvesta_replace_in_file_once_between_including_borders($file, $left, $right, $replace_with) { if (!file_exists($file)) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); $text=file_get_contents($file); - $buf=myvesta_str_replace_once_between_including_borders($text, $left, $right, $replace_with); + $buf=myvesta_str_replace_once_between_including_borders($text, $left, $right, $replace_with); $r=file_put_contents($file, $buf); - if ($r===false) return false; + if ($r===false) return false; return true; } function myvesta_strip_once_in_file_between_including_borders($file, $left, $right) { if (!file_exists($file)) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); $text=file_get_contents($file); - $buf=myvesta_str_strip_once_between_including_borders($text, $left, $right); + $buf=myvesta_str_strip_once_between_including_borders($text, $left, $right); $r=file_put_contents($file, $buf); - if ($r===false) return false; + if ($r===false) return false; return true; } function myvesta_replace_in_file_between_including_borders($file, $left, $right, $replace_with) { if (!file_exists($file)) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); $text=file_get_contents($file); - $buf=myvesta_str_replace_between_including_borders($text, $left, $right, $replace_with); + $buf=myvesta_str_replace_between_including_borders($text, $left, $right, $replace_with); $r=file_put_contents($file, $buf); - if ($r===false) return false; + if ($r===false) return false; return true; } function myvesta_strip_in_file_between_including_borders($file, $left, $right) { if (!file_exists($file)) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); $text=file_get_contents($file); - $buf=myvesta_str_strip_between_including_borders($text, $left, $right); + $buf=myvesta_str_strip_between_including_borders($text, $left, $right); $r=file_put_contents($file, $buf); - if ($r===false) return false; + if ($r===false) return false; return true; } From 201cdad4b30f0b36e6cfe975fedd9170872960b9 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sun, 26 Mar 2023 15:06:22 +0200 Subject: [PATCH 038/462] exit with brackets fix --- func/bash-to-php-interpreter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index 9c67ab55..6ed31455 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -1,6 +1,6 @@ Date: Sun, 26 Mar 2023 15:11:50 +0200 Subject: [PATCH 039/462] Strip 'BROWSER MEDIA CACHE' block in rocket-nginx conf --- src/deb/for-download/tools/install-rocket-nginx.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/deb/for-download/tools/install-rocket-nginx.sh b/src/deb/for-download/tools/install-rocket-nginx.sh index 3e298c7d..20364f80 100644 --- a/src/deb/for-download/tools/install-rocket-nginx.sh +++ b/src/deb/for-download/tools/install-rocket-nginx.sh @@ -17,6 +17,8 @@ fi cd rocket-nginx cp rocket-nginx.ini.disabled rocket-nginx.ini php rocket-parser.php +/usr/local/vesta/bin/v-php-func 'strip_once_in_file_between_including_borders' '/etc/nginx/rocket-nginx/conf.d/default.conf' '# BROWSER MEDIA CACHE' '}' + wget -nv -O /usr/local/vesta/data/templates/web/nginx/wprocket-force-https.tpl https://c.myvestacp.com/tools/rocket-nginx-templates/wprocket-force-https.tpl wget -nv -O /usr/local/vesta/data/templates/web/nginx/wprocket-force-https.stpl https://c.myvestacp.com/tools/rocket-nginx-templates/wprocket-force-https.stpl wget -nv -O /usr/local/vesta/data/templates/web/nginx/wprocket-hosting.tpl https://c.myvestacp.com/tools/rocket-nginx-templates/wprocket-hosting.tpl From da136faf08b8cc83b8532cd04fe3fae53bb3b6ef Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sun, 26 Mar 2023 19:04:45 +0200 Subject: [PATCH 040/462] php function "find_in_file" --- func/main.php | 2 +- func/string.php | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/func/main.php b/func/main.php index 1a932fa7..cf13f3f0 100644 --- a/func/main.php +++ b/func/main.php @@ -12,7 +12,7 @@ define('MYVESTA_ERROR_GENERAL', 5); function myvesta_throw_error($code, $message) { global $myvesta_exit_on_error; - echo "ERROR: ".$message."\n"; + if ($message!=='') echo "ERROR: ".$message."\n"; if ($myvesta_exit_on_error) myvesta_exit($code); return $code; } diff --git a/func/string.php b/func/string.php index 3882c069..2b6a63d9 100644 --- a/func/string.php +++ b/func/string.php @@ -2,6 +2,17 @@ // --- file functions --- +function myvesta_find_in_file($file, $find) { + if (!file_exists($file)) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); + + $buf=file_get_contents($file); + + $pos=strpos($buf, $find); + if ($pos===false) return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, ""); + + return $pos; +} + function myvesta_replace_in_file($file, $find, $replace) { if (!file_exists($file)) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); From b1a3b88877efe2dd8f22bc2a2e5454ee825c0635 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Tue, 28 Mar 2023 10:39:38 +0200 Subject: [PATCH 041/462] new line on the output end if v-php-func called directly from shell --- func/bash-to-php-interpreter.php | 6 ++++++ func/main.php | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index 6ed31455..cd849d6c 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -1,5 +1,8 @@ Date: Tue, 28 Mar 2023 17:07:52 +0200 Subject: [PATCH 042/462] Security Improvements --- bin/v-install-wordpress | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/v-install-wordpress b/bin/v-install-wordpress index 4bf82c5f..70f3fc7b 100644 --- a/bin/v-install-wordpress +++ b/bin/v-install-wordpress @@ -128,7 +128,9 @@ sudo -H -u$user wp core config --dbname=$DBUSER --dbuser=$DBUSER --dbpass=$PASSW password=$(LC_CTYPE=C tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+= < /dev/urandom | head -c 12) -sudo -H -u$user wp core install --url="$domain" --title="$domain" --admin_user="admin" --admin_password="$password" --admin_email="$email" --path=$WORKINGDIR +wpadmin=$(echo "$domain" | sed 's#\.#_#g')_4dm1n + +sudo -H -u$user wp core install --url="$domain" --title="$domain" --admin_user="$wpadmin" --admin_password="$password" --admin_email="$email" --path=$WORKINGDIR mysql -u$DBUSER -p$PASSWDDB -e "USE $DBUSER; update wp_options set option_value = '$PROTOCOL://$domain' where option_name = 'siteurl'; update wp_options set option_value = '$PROTOCOL://$domain' where option_name = 'home';" @@ -138,7 +140,7 @@ echo "" echo "Site: $PROTOCOL://$domain/" echo "" echo "Login: $PROTOCOL://$domain/wp-admin/" -echo "Username: admin" +echo "Username: $wpadmin" echo "Password: $password" echo "" echo "=================================================================" From 551df0b5a6cea7d8bce07053f5add474fd1cc30d Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Wed, 29 Mar 2023 15:45:36 +0200 Subject: [PATCH 043/462] Update v-clean-garbage --- bin/v-clean-garbage | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/v-clean-garbage b/bin/v-clean-garbage index 5b402653..72e8560e 100644 --- a/bin/v-clean-garbage +++ b/bin/v-clean-garbage @@ -45,13 +45,13 @@ find /var/log/exim4/ -type f -exec truncate -s 0 {} \; clean_home() { nice -n 19 ionice -c 3 find $1/*/tmp/ -type f -delete find $1/ -name '.wp-cli' -type d -exec rm -rf {} \; > /dev/null 2>&1 - find $1/*/web/*/public_html/wp-content/aiowps_backups/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete - find $1/*/web/*/public_html/wp-content/envato-backups/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete - find $1/*/web/*/public_html/wp-content/ai1wm-backups/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete - find $1/*/web/*/public_html/wp-content/wpvividbackups/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete - find $1/*/web/*/public_html/wp-content/updraft/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete + find $1/*/web/*/public_html/wp-content/aiowps_backups/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete > /dev/null 2>&1 + find $1/*/web/*/public_html/wp-content/envato-backups/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete > /dev/null 2>&1 + find $1/*/web/*/public_html/wp-content/ai1wm-backups/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete > /dev/null 2>&1 + find $1/*/web/*/public_html/wp-content/wpvividbackups/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete > /dev/null 2>&1 + find $1/*/web/*/public_html/wp-content/updraft/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete > /dev/null 2>&1 find $1/*/web/*/public_html/wp-content/plugins/ezpz-one-click-backup/backups/ -type f -not -name ".htaccess" -not -name "index.php" -not -name "index.html" -not -name "web.config" -delete > /dev/null 2>&1 - find $1/*/web/*/public_html/ -type f -name "*.wpress" -delete + find $1/*/web/*/public_html/ -type f -name "*.wpress" -delete > /dev/null 2>&1 nice -n 19 ionice -c 3 find $1/*/web/*/public_html/ -type f -name "error_log" -exec truncate -s 0 {} \; nice -n 19 ionice -c 3 find $1/*/web/*/public_html/ -type f -name "error_log.txt" -exec truncate -s 0 {} \; nice -n 19 ionice -c 3 find $1/ -type f -name "*.log" -exec truncate -s 0 {} \; From a47603156d5da0b7c7fa1cdb640aaf63fc7f97c6 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Wed, 29 Mar 2023 15:48:42 +0200 Subject: [PATCH 044/462] Update exim_forwarding.patch --- src/deb/for-download/tools/patches/exim_forwarding.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/deb/for-download/tools/patches/exim_forwarding.patch b/src/deb/for-download/tools/patches/exim_forwarding.patch index 78b7ef69..1fa6d408 100644 --- a/src/deb/for-download/tools/patches/exim_forwarding.patch +++ b/src/deb/for-download/tools/patches/exim_forwarding.patch @@ -1,9 +1,9 @@ --- old 2023-03-23 14:17:42.536656160 +0100 +++ new 2023-03-24 23:07:08.186018906 +0100 @@ -140,6 +140,11 @@ - + warn set acl_m3 = no - + + warn !authenticated = * + hosts = !+relay_from_hosts + condition = ${lookup{$local_part@$domain}lsearch{/etc/exim4/domains/$domain/aliases}{true}{false}} From 3bafc5b064fdbbe1e31da69eef801548b4514985 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 1 Apr 2023 23:29:35 +0200 Subject: [PATCH 045/462] myvesta_echo php function --- func/bash-to-php-interpreter.php | 13 ++++++----- func/main.php | 37 +++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index cd849d6c..13995e1c 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -1,5 +1,7 @@ Date: Wed, 5 Apr 2023 21:07:11 +0200 Subject: [PATCH 046/462] LetsEncrypt check if 'certificate' is empty on step 6 --- bin/v-add-letsencrypt-domain | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bin/v-add-letsencrypt-domain b/bin/v-add-letsencrypt-domain index faa51f8c..9d9b7cbe 100755 --- a/bin/v-add-letsencrypt-domain +++ b/bin/v-add-letsencrypt-domain @@ -323,6 +323,14 @@ if [[ "$status" -ne 200 ]]; then echo "[$(date)] : EXIT=Let's Encrypt finalize bad status $status" >> /usr/local/vesta/log/letsencrypt.log check_result $E_CONNECT "Let's Encrypt finalize bad status $status" fi +if [ "$certificate" = "" ]; then + echo "[$(date)] : EXIT=Let's Encrypt 'certificate' is empty on step 6" >> /usr/local/vesta/log/letsencrypt.log + check_result $E_CONNECT "Let's Encrypt 'certificate' is empty on step 6" +fi +if [ "$nonce" = "" ]; then + echo "[$(date)] : EXIT=Let's Encrypt 'nonce' is empty on step 6" >> /usr/local/vesta/log/letsencrypt.log + check_result $E_CONNECT "Let's Encrypt 'nonce' is empty on step 6" +fi # Downloading signed certificate / STEP 7 echo "[$(date)] : --- Downloading signed certificate / STEP 7 ---" >> /usr/local/vesta/log/letsencrypt.log From cdde300f80ce8abe9d5fa21ab5c711923715e4d3 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Wed, 5 Apr 2023 21:08:38 +0200 Subject: [PATCH 047/462] Version 0.9.8-26-61 --- src/deb/latest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deb/latest.txt b/src/deb/latest.txt index 68750920..4ee18f6a 100644 --- a/src/deb/latest.txt +++ b/src/deb/latest.txt @@ -1 +1 @@ -vesta-0.9.8-26-60 +vesta-0.9.8-26-61 From a098a9831c8760cfc15c1d58470cfcc184d4a2d8 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Wed, 5 Apr 2023 21:10:28 +0200 Subject: [PATCH 048/462] Update Changelog.md --- Changelog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Changelog.md b/Changelog.md index 9af9791b..e4938183 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,7 @@ +Version 0.9.8-26-61 [05-Apr-2023] +================================================== +* Many bugfixes + Version 0.9.8-26-60 [12-Feb-2023] ================================================== * New script: v-commander (useful for maintaining the server) From f5132329c8500cccb48fcfc2e3657822071ebed5 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Wed, 5 Apr 2023 23:13:38 +0200 Subject: [PATCH 049/462] Update Changelog.md --- Changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.md b/Changelog.md index e4938183..28f5cd6c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,7 @@ Version 0.9.8-26-61 [05-Apr-2023] ================================================== * Many bugfixes +* Hotfix for LetsEncrypt to prevent Apache falling Version 0.9.8-26-60 [12-Feb-2023] ================================================== From 4771d2502c9f523a5d29bd25211ee443897af849 Mon Sep 17 00:00:00 2001 From: Jaap Marcus <9754650+jaapmarcus@users.noreply.github.com> Date: Thu, 6 Apr 2023 01:23:10 +0200 Subject: [PATCH 050/462] Fix: Changes in Certificate request Lets Encrypt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See: https://community.letsencrypt.org/t/myvesta-hestiacp-vestacp-fail-issuance-with-async-finalization/195923 And https://github.com/hestiacp/hestiacp/pull/3442 Not tested on Vesta CP ❤️ --- bin/v-add-letsencrypt-domain | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/bin/v-add-letsencrypt-domain b/bin/v-add-letsencrypt-domain index 9d9b7cbe..c37492b7 100755 --- a/bin/v-add-letsencrypt-domain +++ b/bin/v-add-letsencrypt-domain @@ -56,7 +56,7 @@ query_le_v2() { # Save http response to file passed as "$4" arg or print to stdout if not provided # http response headers are always sent to stdout local save_to_file=${4:-"/dev/stdout"} - curl --silent --dump-header /dev/stdout --data "$post_data" "$1" --header "$content" --output "$save_to_file" + curl --location --user-agent "MyVestaCP" --insecure --retry 5 --retry-connrefused --silent --dump-header /dev/stdout --data "$post_data" "$1" --header "$content" --output "$save_to_file" } @@ -154,6 +154,8 @@ authz=$(echo "$answer" |grep "acme/authz" |cut -f2 -d '"') echo "[$(date)] : authz=$authz" >> /usr/local/vesta/log/letsencrypt.log finalize=$(echo "$answer" |grep 'finalize":' |cut -f4 -d '"') echo "[$(date)] : finalize=$finalize" >> /usr/local/vesta/log/letsencrypt.log +order=$(echo -e "$answer" | grep -i location | cut -f2 -d \ | tr -d '\r\n') +echo "[$(date)] : order=$order" >> /usr/local/vesta/log/letsencrypt.log status=$(echo "$answer" |grep HTTP/ |tail -n1 |cut -f2 -d ' ') echo "[$(date)] : status=$status" >> /usr/local/vesta/log/letsencrypt.log if [[ "$status" -ne 201 ]]; then @@ -324,16 +326,34 @@ if [[ "$status" -ne 200 ]]; then check_result $E_CONNECT "Let's Encrypt finalize bad status $status" fi if [ "$certificate" = "" ]; then - echo "[$(date)] : EXIT=Let's Encrypt 'certificate' is empty on step 6" >> /usr/local/vesta/log/letsencrypt.log - check_result $E_CONNECT "Let's Encrypt 'certificate' is empty on step 6" + validation="processing" + i=1 + while [ "$validation" = "processing" ]; do + echo "[$(date)] : --- Polling server waiting for Certificate / STEP 7 ---" >> /usr/local/vesta/log/letsencrypt.log + answer=$(query_le_v2 "$order" "" "$nonce") + i=$((i + 1)) + + nonce=$(echo "$answer" | grep -i nonce | cut -f2 -d \ | tr -d '\r\n') + echo "[$(date)] : answer=$answer" >> /usr/local/vesta/log/letsencrypt.log + status=$(echo "$answer" | grep HTTP/ | tail -n1 | cut -f 2 -d ' ') + echo "[$(date)] : status=$status" >> /usr/local/vesta/log/letsencrypt.log + validation=$(echo "$answer" | grep 'status":' | cut -f4 -d '"') + echo "[$(date)] : validation=$validation" >> /usr/local/vesta/log/letsencrypt.log + certificate=$(echo "$answer" | grep 'certificate":' | cut -f4 -d '"') + echo "[$(date)] : certificate=$certificate" >> /usr/local/vesta/log/letsencrypt.log + sleep $((i * 2)) # Sleep for 2s, 4s, 6s, 8s + if [ $i -gt 10 ]; then + check_result "$E_CONNECT" "Certificate processing timeout ($domain)" + fi + done fi if [ "$nonce" = "" ]; then echo "[$(date)] : EXIT=Let's Encrypt 'nonce' is empty on step 6" >> /usr/local/vesta/log/letsencrypt.log check_result $E_CONNECT "Let's Encrypt 'nonce' is empty on step 6" fi -# Downloading signed certificate / STEP 7 -echo "[$(date)] : --- Downloading signed certificate / STEP 7 ---" >> /usr/local/vesta/log/letsencrypt.log +# Downloading signed certificate / STEP 8 +echo "[$(date)] : --- Downloading signed certificate / STEP 8 ---" >> /usr/local/vesta/log/letsencrypt.log echo "[$(date)] : query_le_v2 \"$certificate\" \"\" \"$nonce\"" >> /usr/local/vesta/log/letsencrypt.log answer=$(query_le_v2 "$certificate" "" "$nonce" "$ssl_dir/$domain.pem") echo "[$(date)] : answer=$answer" >> /usr/local/vesta/log/letsencrypt.log From 2f395f0a5e09c18ac3b75e364964b8ed40777da5 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 6 Apr 2023 09:06:03 +0200 Subject: [PATCH 051/462] Add staging --- bin/v-add-letsencrypt-domain | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bin/v-add-letsencrypt-domain b/bin/v-add-letsencrypt-domain index c37492b7..117d3eff 100755 --- a/bin/v-add-letsencrypt-domain +++ b/bin/v-add-letsencrypt-domain @@ -17,6 +17,10 @@ aliases=$3 # LE API API='https://acme-v02.api.letsencrypt.org' +if [[ "$LE_STAGING" = 'yes' ]]; then + LE_API='https://acme-staging-v02.api.letsencrypt.org' +fi + # Includes source $VESTA/func/main.sh source $VESTA/func/domain.sh From f50a785fffcfd1cdd1e8c94bf0af38207d24a763 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 6 Apr 2023 09:10:50 +0200 Subject: [PATCH 052/462] Changing user-agent in v-add-letsencrypt-domain --- bin/v-add-letsencrypt-domain | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/v-add-letsencrypt-domain b/bin/v-add-letsencrypt-domain index 117d3eff..305589e6 100755 --- a/bin/v-add-letsencrypt-domain +++ b/bin/v-add-letsencrypt-domain @@ -60,8 +60,8 @@ query_le_v2() { # Save http response to file passed as "$4" arg or print to stdout if not provided # http response headers are always sent to stdout local save_to_file=${4:-"/dev/stdout"} - curl --location --user-agent "MyVestaCP" --insecure --retry 5 --retry-connrefused --silent --dump-header /dev/stdout --data "$post_data" "$1" --header "$content" --output "$save_to_file" -} + curl --location --user-agent "myVesta" --insecure --retry 5 --retry-connrefused --silent --dump-header /dev/stdout --data "$post_data" "$1" --header "$content" --output "$save_to_file" + } @@ -127,7 +127,7 @@ fi # Requesting nonce / STEP 1 echo "[$(date)] : --- Requesting nonce / STEP 1 ---" >> /usr/local/vesta/log/letsencrypt.log echo "[$(date)] : curl -s -I \"$API/directory\"" >> /usr/local/vesta/log/letsencrypt.log -answer=$(curl -s -I "$API/directory") +answer=$(curl --user-agent "myVesta" -s -I "$API/directory") echo "[$(date)] : answer=$answer" >> /usr/local/vesta/log/letsencrypt.log nonce=$(echo "$answer" |grep -i nonce |cut -f2 -d \ |tr -d '\r\n') echo "[$(date)] : nonce=$nonce" >> /usr/local/vesta/log/letsencrypt.log @@ -294,7 +294,7 @@ for auth in $authz; do check_result $E_CONNECT "Let's Encrypt domain validation timeout" fi echo "[$(date)] : curl: $url2 :" >> /usr/local/vesta/log/letsencrypt.log - get_answer=$(curl --silent -S "$url2") + get_answer=$(curl --user-agent "myVesta" --silent -S "$url2") echo "[$(date)] : get_answer=$get_answer" >> /usr/local/vesta/log/letsencrypt.log sleeping=$((i*2)) echo "[$(date)] : sleep $sleeping (i=$i)" >> /usr/local/vesta/log/letsencrypt.log From a18ee316a220265faf5d0cb329fee2c5b6c13b92 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 6 Apr 2023 09:56:18 +0200 Subject: [PATCH 053/462] $LE_API to $API --- bin/v-add-letsencrypt-domain | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/v-add-letsencrypt-domain b/bin/v-add-letsencrypt-domain index 305589e6..457557f0 100755 --- a/bin/v-add-letsencrypt-domain +++ b/bin/v-add-letsencrypt-domain @@ -18,7 +18,7 @@ aliases=$3 API='https://acme-v02.api.letsencrypt.org' if [[ "$LE_STAGING" = 'yes' ]]; then - LE_API='https://acme-staging-v02.api.letsencrypt.org' + API='https://acme-staging-v02.api.letsencrypt.org' fi # Includes From 1056cd624bc8319e1bc51de674a7a9da50329bf1 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 6 Apr 2023 10:00:57 +0200 Subject: [PATCH 054/462] Adding LE_STAGING to v-add-letsencrypt-user --- bin/v-add-letsencrypt-user | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bin/v-add-letsencrypt-user b/bin/v-add-letsencrypt-user index 11aec113..9c7181c0 100755 --- a/bin/v-add-letsencrypt-user +++ b/bin/v-add-letsencrypt-user @@ -15,6 +15,10 @@ user=$1 # LE API API='https://acme-v02.api.letsencrypt.org' +if [[ "$LE_STAGING" = 'yes' ]]; then + API='https://acme-staging-v02.api.letsencrypt.org' +fi + # Includes source $VESTA/func/main.sh source $VESTA/conf/vesta.conf From fbf1d3390a97da4dfd2f0619644b3f0ad52e58ea Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 6 Apr 2023 10:24:54 +0200 Subject: [PATCH 055/462] Checking for $nonce before step 7, and check for $certificate after step 7 --- bin/v-add-letsencrypt-domain | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/bin/v-add-letsencrypt-domain b/bin/v-add-letsencrypt-domain index 457557f0..7a306ab3 100755 --- a/bin/v-add-letsencrypt-domain +++ b/bin/v-add-letsencrypt-domain @@ -329,6 +329,12 @@ if [[ "$status" -ne 200 ]]; then echo "[$(date)] : EXIT=Let's Encrypt finalize bad status $status" >> /usr/local/vesta/log/letsencrypt.log check_result $E_CONNECT "Let's Encrypt finalize bad status $status" fi + +if [ "$nonce" = "" ]; then + echo "[$(date)] : EXIT=Let's Encrypt 'nonce' is empty after step 6" >> /usr/local/vesta/log/letsencrypt.log + check_result $E_CONNECT "Let's Encrypt 'nonce' is empty after step 6" +fi + if [ "$certificate" = "" ]; then validation="processing" i=1 @@ -351,9 +357,10 @@ if [ "$certificate" = "" ]; then fi done fi -if [ "$nonce" = "" ]; then - echo "[$(date)] : EXIT=Let's Encrypt 'nonce' is empty on step 6" >> /usr/local/vesta/log/letsencrypt.log - check_result $E_CONNECT "Let's Encrypt 'nonce' is empty on step 6" + +if [ "$certificate" = "" ]; then + echo "[$(date)] : EXIT=Let's Encrypt 'certificate' is empty after step 7" >> /usr/local/vesta/log/letsencrypt.log + check_result $E_CONNECT "Let's Encrypt 'certificate' is empty after step 7" fi # Downloading signed certificate / STEP 8 From b21efb09b6ca5441f157597ae6ef146df95782c2 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 6 Apr 2023 10:28:44 +0200 Subject: [PATCH 056/462] Adding user-agent in v-add-letsencrypt-user --- bin/v-add-letsencrypt-user | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/v-add-letsencrypt-user b/bin/v-add-letsencrypt-user index 9c7181c0..d2338e82 100755 --- a/bin/v-add-letsencrypt-user +++ b/bin/v-add-letsencrypt-user @@ -45,7 +45,7 @@ query_le_v2() { post_data=$post_data'"payload":"'"$payload_"'",' post_data=$post_data'"signature":"'"$signature_"'"}' - curl -s -i -d "$post_data" "$1" -H "$content" + curl --user-agent "myVesta" -s -i -d "$post_data" "$1" -H "$content" } From 7a3fc4fcea84ab4c902936807d2bd36feb166f0b Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 6 Apr 2023 11:13:17 +0200 Subject: [PATCH 057/462] Update Changelog.md --- Changelog.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 28f5cd6c..87f48b62 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,4 +1,8 @@ -Version 0.9.8-26-61 [05-Apr-2023] +Version 0.9.8-26-62 [05-Apr-2023] +================================================== +* Fix for LetsEncrypt Asynchronous Order Finalization (in collaboration with @HestiaCP ) + +Version 0.9.8-26-61 [04-Apr-2023] ================================================== * Many bugfixes * Hotfix for LetsEncrypt to prevent Apache falling From 0b7b8cef857ef9d335f59b98b907cf88d967f877 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Thu, 6 Apr 2023 11:14:44 +0200 Subject: [PATCH 058/462] Version 0.9.8-26-62 --- src/deb/latest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/deb/latest.txt b/src/deb/latest.txt index 4ee18f6a..5e8393bb 100644 --- a/src/deb/latest.txt +++ b/src/deb/latest.txt @@ -1 +1 @@ -vesta-0.9.8-26-61 +vesta-0.9.8-26-62 From 863f3e2aa5f3b06bbf53eb465ca1834653cb8dec Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Fri, 7 Apr 2023 13:40:23 +0200 Subject: [PATCH 059/462] Update README.md --- README.md | 87 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index c34d496b..6dfe1024 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,81 @@ -myVesta -================================================== -Visit our homepage: -- https://www.myvestacp.com/ +

myVesta

-Forum: -- https://forum.myvestacp.com/ +
+ +[![Screenshot of myVesta](https://www.myvestacp.com/screenshot1.png)](https://www.myvestacp.com/) + +
+ +

About

+ +

myVesta is a security and stability-focused fork of VestaCP, exclusively supporting Debian in order to maintain a streamlined ecosystem. Boasting a clean, clutter-free interface and the latest innovative technologies, our project is committed to staying synchronized with official VestaCP commits. We work independently to enhance security and develop new features, driven by our passion for contributing to the open-source community rather than monetary gain. As such, we will offer all features built for myVesta to the official VestaCP project through pull requests, without interfering with their development milestones.

+ +

Latest stable release: Version 1.7.0 | View Changelog +

+ +

Links

+ + +

Features of myVesta

+ + +

How to install

+Download the installation script: + +```shell +curl -O http://c.myvestacp.com/vst-install-debian.sh +``` + +Then run it: + +```shell +bash vst-install-debian.sh +``` + +Or use our installer generator. + +

Licence

+myVesta is licensed under GPL v3 license. -Knowledge base: -- https://wiki.myvestacp.com/ -Changelog: -- https://github.com/myvesta/vesta/blob/master/Changelog.md From 5eabdd4784ca09356e865361b86ce6ac1ce8ca2f Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Fri, 7 Apr 2023 13:41:06 +0200 Subject: [PATCH 060/462] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6dfe1024..55b6c2c8 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@

myVesta is a security and stability-focused fork of VestaCP, exclusively supporting Debian in order to maintain a streamlined ecosystem. Boasting a clean, clutter-free interface and the latest innovative technologies, our project is committed to staying synchronized with official VestaCP commits. We work independently to enhance security and develop new features, driven by our passion for contributing to the open-source community rather than monetary gain. As such, we will offer all features built for myVesta to the official VestaCP project through pull requests, without interfering with their development milestones.

-

Latest stable release: Version 1.7.0 | View Changelog +

Latest stable release: Version 0.9.8-26-62 | View Changelog

Links

From e86585568d4baefb50b81f25ed9d692ddb3522a4 Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Fri, 7 Apr 2023 13:44:53 +0200 Subject: [PATCH 061/462] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55b6c2c8..cc5d56d4 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@

myVesta is a security and stability-focused fork of VestaCP, exclusively supporting Debian in order to maintain a streamlined ecosystem. Boasting a clean, clutter-free interface and the latest innovative technologies, our project is committed to staying synchronized with official VestaCP commits. We work independently to enhance security and develop new features, driven by our passion for contributing to the open-source community rather than monetary gain. As such, we will offer all features built for myVesta to the official VestaCP project through pull requests, without interfering with their development milestones.

-

Latest stable release: Version 0.9.8-26-62 | View Changelog +

View Changelog

Links

From f0a82f02d3ca34f8a0e4d03a81e5bf414b0c9775 Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Fri, 7 Apr 2023 13:50:02 +0200 Subject: [PATCH 062/462] Update README.md --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index cc5d56d4..62207405 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,20 @@ bash vst-install-debian.sh Or use our installer generator. +

UUseful scripts

+ + +

Licence

myVesta is licensed under GPL v3 license. From 0e16d8d59c8f9276a3bf3de9cd21ab7c2ec16ca9 Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Fri, 7 Apr 2023 13:50:17 +0200 Subject: [PATCH 063/462] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 62207405..1848be5d 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ bash vst-install-debian.sh Or use our installer generator. -

UUseful scripts

+

Useful scripts

  • How to move accounts from one (my)Vesta server to another myVesta server
  • WordPress installer in one second
  • (v-install-wordpress) From 8dbfa3e2103790411c43084024db3fbd832ca06e Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Fri, 7 Apr 2023 13:53:10 +0200 Subject: [PATCH 064/462] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1848be5d..44d414b8 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@
  • Literally no PHP scripts will be alive on your hosting panel (won't be able to get executed), unless you access the hosting panel with secret URL parameter. Thus, when it happens that, let's say, some zero-day exploit pops up - attackers won't be able to access it without knowing your secret URL - PHP scripts from VestaCP will be simply dead - no one will be able to interact with your panel unless they have the secret URL.
  • You can see for yourself how this mechanism was built by looking at:
  • If you didn't set the secret URL during installation, you can do it anytime. Just execute in shell: echo " /usr/local/vesta/web/inc/login_url.php
  • From e2fcade5bb91ab978d6ffb59574d632858386e8b Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Sun, 9 Apr 2023 00:17:27 +0200 Subject: [PATCH 065/462] Update v-clone-website --- bin/v-clone-website | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/v-clone-website b/bin/v-clone-website index df98c6db..57749f74 100644 --- a/bin/v-clone-website +++ b/bin/v-clone-website @@ -434,6 +434,9 @@ else sudo -H -u$TO_USER wp search-replace "/home/$FROM_USER/" "/home/$TO_USER/" --precise --all-tables --skip-columns=guid fi sudo -H -u$TO_USER wp cache flush + cd $TO_FOLDER + sudo -H -u$TO_USER wp config shuffle-salts WP_CACHE_KEY_SALT --force + sudo -H -u$TO_USER wp config shuffle-salts fi echo "===== DONE ====" From 2fae00ae7dcce79657f54c3e8c057694a3451566 Mon Sep 17 00:00:00 2001 From: isscbta <53144593+isscbta@users.noreply.github.com> Date: Sun, 9 Apr 2023 00:22:04 +0200 Subject: [PATCH 066/462] Update v-clone-website --- bin/v-clone-website | 6 ------ 1 file changed, 6 deletions(-) diff --git a/bin/v-clone-website b/bin/v-clone-website index 57749f74..74de3271 100644 --- a/bin/v-clone-website +++ b/bin/v-clone-website @@ -420,12 +420,6 @@ if [ $IT_IS_WP -eq 0 ]; then fi else cd $TO_FOLDER - if [ -d "wp-content/plugins/w3-total-cache" ]; then - rm -f wp-content/object-cache.php - rm -f wp-content/db.php - rm -f wp-content/advanced-cache.php - rm -rf wp-content/w3tc-config - rm -rf wp-content/plugins/w3-total-cache fi echo "=== Replacing $FROM_DOMAIN to $TO_DOMAIN in database $TO_DATABASE_NAME" sudo -H -u$TO_USER wp search-replace "$FROM_DOMAIN" "$TO_DOMAIN" --precise --all-tables --skip-columns=guid From 706e365a5e031f9d6d90630954d03cfabc1f0489 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sun, 9 Apr 2023 14:01:18 +0200 Subject: [PATCH 067/462] syntax fix --- bin/v-clone-website | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/v-clone-website b/bin/v-clone-website index 74de3271..46623db4 100644 --- a/bin/v-clone-website +++ b/bin/v-clone-website @@ -420,7 +420,6 @@ if [ $IT_IS_WP -eq 0 ]; then fi else cd $TO_FOLDER - fi echo "=== Replacing $FROM_DOMAIN to $TO_DOMAIN in database $TO_DATABASE_NAME" sudo -H -u$TO_USER wp search-replace "$FROM_DOMAIN" "$TO_DOMAIN" --precise --all-tables --skip-columns=guid if [ "$FROM_USER" != "$TO_USER" ]; then @@ -428,7 +427,6 @@ else sudo -H -u$TO_USER wp search-replace "/home/$FROM_USER/" "/home/$TO_USER/" --precise --all-tables --skip-columns=guid fi sudo -H -u$TO_USER wp cache flush - cd $TO_FOLDER sudo -H -u$TO_USER wp config shuffle-salts WP_CACHE_KEY_SALT --force sudo -H -u$TO_USER wp config shuffle-salts fi From 77467eeebddd6853c04f462be8117a24f3603c53 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Wed, 12 Apr 2023 19:58:32 +0200 Subject: [PATCH 068/462] exim4 HELO authenticated patch --- install/debian/10/exim/exim4.conf.template | 10 ++++++---- install/debian/11/exim/exim4.conf.template | 10 ++++++---- install/debian/11/exim/exim4.conf.template-RC | 10 ++++++---- install/debian/8/exim/exim4.conf.template | 10 ++++++---- install/debian/9/exim/exim4.conf.template | 10 ++++++---- .../tools/patches/exim_helo_authenticated.patch | 14 ++++++++++++++ 6 files changed, 44 insertions(+), 20 deletions(-) create mode 100644 src/deb/for-download/tools/patches/exim_helo_authenticated.patch diff --git a/install/debian/10/exim/exim4.conf.template b/install/debian/10/exim/exim4.conf.template index 70577b6e..0e5afaac 100644 --- a/install/debian/10/exim/exim4.conf.template +++ b/install/debian/10/exim/exim4.conf.template @@ -91,16 +91,18 @@ acl_check_mail: deny condition = ${if eq{$sender_helo_name}{}} message = HELO required before MAIL - drop message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid + drop !authenticated = * + message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid condition = ${if match{$sender_helo_name}{\N((\d{1,3}[.-]\d{1,3}[.-]\d{1,3}[.-]\d{1,3})|([0-9a-f]{8})|([0-9A-F]{8}))\N}{yes}{no}} - condition = ${if match{${lc:$sender_host_name}}{.telenor.rs}{false}{true}} condition = ${if match {${lookup dnsdb{>: defer_never,ptr=$sender_host_address}}\}{$sender_helo_name}{no}{yes}} delay = 45s - drop condition = ${if isip{$sender_helo_name}} + drop !authenticated = * + condition = ${if isip{$sender_helo_name}} message = Access denied - Invalid HELO name (See RFC2821 4.1.3) - drop condition = ${if eq{[$interface_address]}{$sender_helo_name}} + drop !authenticated = * + condition = ${if eq{[$interface_address]}{$sender_helo_name}} message = $interface_address is _my_ address accept diff --git a/install/debian/11/exim/exim4.conf.template b/install/debian/11/exim/exim4.conf.template index 4b3c0dd9..72e3f668 100644 --- a/install/debian/11/exim/exim4.conf.template +++ b/install/debian/11/exim/exim4.conf.template @@ -91,16 +91,18 @@ acl_check_mail: deny condition = ${if eq{$sender_helo_name}{}} message = HELO required before MAIL - drop message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid + drop !authenticated = * + message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid condition = ${if match{$sender_helo_name}{\N((\d{1,3}[.-]\d{1,3}[.-]\d{1,3}[.-]\d{1,3})|([0-9a-f]{8})|([0-9A-F]{8}))\N}{yes}{no}} - condition = ${if match{${lc:$sender_host_name}}{.telenor.rs}{false}{true}} condition = ${if match {${lookup dnsdb{>: defer_never,ptr=$sender_host_address}}\}{$sender_helo_name}{no}{yes}} delay = 45s - drop condition = ${if isip{$sender_helo_name}} + drop !authenticated = * + condition = ${if isip{$sender_helo_name}} message = Access denied - Invalid HELO name (See RFC2821 4.1.3) - drop condition = ${if eq{[$interface_address]}{$sender_helo_name}} + drop !authenticated = * + condition = ${if eq{[$interface_address]}{$sender_helo_name}} message = $interface_address is _my_ address accept diff --git a/install/debian/11/exim/exim4.conf.template-RC b/install/debian/11/exim/exim4.conf.template-RC index 36ba2a0d..e5ba36ab 100644 --- a/install/debian/11/exim/exim4.conf.template-RC +++ b/install/debian/11/exim/exim4.conf.template-RC @@ -108,16 +108,18 @@ acl_check_mail: deny condition = ${if eq{$sender_helo_name}{}} message = HELO required before MAIL - drop message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid + drop !authenticated = * + message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid condition = ${if match{$sender_helo_name}{\N((\d{1,3}[.-]\d{1,3}[.-]\d{1,3}[.-]\d{1,3})|([0-9a-f]{8})|([0-9A-F]{8}))\N}{yes}{no}} - condition = ${if match{${lc:$sender_host_name}}{.telenor.rs}{false}{true}} condition = ${if match {${lookup dnsdb{>: defer_never,ptr=$sender_host_address}}\}{$sender_helo_name}{no}{yes}} delay = 45s - drop condition = ${if isip{$sender_helo_name}} + drop !authenticated = * + condition = ${if isip{$sender_helo_name}} message = Access denied - Invalid HELO name (See RFC2821 4.1.3) - drop condition = ${if eq{[$interface_address]}{$sender_helo_name}} + drop !authenticated = * + condition = ${if eq{[$interface_address]}{$sender_helo_name}} message = $interface_address is _my_ address accept diff --git a/install/debian/8/exim/exim4.conf.template b/install/debian/8/exim/exim4.conf.template index e49bbf4e..261947d2 100644 --- a/install/debian/8/exim/exim4.conf.template +++ b/install/debian/8/exim/exim4.conf.template @@ -87,16 +87,18 @@ acl_check_mail: deny condition = ${if eq{$sender_helo_name}{}} message = HELO required before MAIL - drop message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid + drop !authenticated = * + message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid condition = ${if match{$sender_helo_name}{\N((\d{1,3}[.-]\d{1,3}[.-]\d{1,3}[.-]\d{1,3})|([0-9a-f]{8})|([0-9A-F]{8}))\N}{yes}{no}} - condition = ${if match{${lc:$sender_host_name}}{.telenor.rs}{false}{true}} condition = ${if match {${lookup dnsdb{>: defer_never,ptr=$sender_host_address}}\}{$sender_helo_name}{no}{yes}} delay = 45s - drop condition = ${if isip{$sender_helo_name}} + drop !authenticated = * + condition = ${if isip{$sender_helo_name}} message = Access denied - Invalid HELO name (See RFC2821 4.1.3) - drop condition = ${if eq{[$interface_address]}{$sender_helo_name}} + drop !authenticated = * + condition = ${if eq{[$interface_address]}{$sender_helo_name}} message = $interface_address is _my_ address accept diff --git a/install/debian/9/exim/exim4.conf.template b/install/debian/9/exim/exim4.conf.template index e49bbf4e..261947d2 100644 --- a/install/debian/9/exim/exim4.conf.template +++ b/install/debian/9/exim/exim4.conf.template @@ -87,16 +87,18 @@ acl_check_mail: deny condition = ${if eq{$sender_helo_name}{}} message = HELO required before MAIL - drop message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid + drop !authenticated = * + message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid condition = ${if match{$sender_helo_name}{\N((\d{1,3}[.-]\d{1,3}[.-]\d{1,3}[.-]\d{1,3})|([0-9a-f]{8})|([0-9A-F]{8}))\N}{yes}{no}} - condition = ${if match{${lc:$sender_host_name}}{.telenor.rs}{false}{true}} condition = ${if match {${lookup dnsdb{>: defer_never,ptr=$sender_host_address}}\}{$sender_helo_name}{no}{yes}} delay = 45s - drop condition = ${if isip{$sender_helo_name}} + drop !authenticated = * + condition = ${if isip{$sender_helo_name}} message = Access denied - Invalid HELO name (See RFC2821 4.1.3) - drop condition = ${if eq{[$interface_address]}{$sender_helo_name}} + drop !authenticated = * + condition = ${if eq{[$interface_address]}{$sender_helo_name}} message = $interface_address is _my_ address accept diff --git a/src/deb/for-download/tools/patches/exim_helo_authenticated.patch b/src/deb/for-download/tools/patches/exim_helo_authenticated.patch new file mode 100644 index 00000000..9dd8dbad --- /dev/null +++ b/src/deb/for-download/tools/patches/exim_helo_authenticated.patch @@ -0,0 +1,14 @@ +--- /etc/exim4/exim4.conf.template.orig 2023-04-12 19:05:20.745847763 +0200 ++++ /etc/exim4/exim4.conf.template 2023-04-12 19:34:29.000000000 +0200 +@@ -94 +94,2 @@ +- drop message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid ++ drop !authenticated = * ++ message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid +@@ -100 +101,2 @@ +- drop condition = ${if isip{$sender_helo_name}} ++ drop !authenticated = * ++ condition = ${if isip{$sender_helo_name}} +@@ -103 +105,2 @@ +- drop condition = ${if eq{[$interface_address]}{$sender_helo_name}} ++ drop !authenticated = * ++ condition = ${if eq{[$interface_address]}{$sender_helo_name}} From 4dd6d22f077370e88ff049fc7ee9aab487008efb Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Fri, 14 Apr 2023 15:39:33 +0200 Subject: [PATCH 069/462] myvesta-php-func support for stdin --- bin/v-php-func | 9 +++ func/bash-to-php-interpreter.php | 8 +++ func/main.php | 2 + func/string.php | 113 +++++++++++++++++++++++++++++-- 4 files changed, 126 insertions(+), 6 deletions(-) diff --git a/bin/v-php-func b/bin/v-php-func index f6192c33..f7a73385 100644 --- a/bin/v-php-func +++ b/bin/v-php-func @@ -8,5 +8,14 @@ # Action # #----------------------------------------------------------# + +if [ -p /dev/stdin ]; then + STDIN=$(cat -) + if [ ! -z "$STDIN" ]; then + echo "$STDIN" | php /usr/local/vesta/func/bash-to-php-interpreter.php "$@" + exit $? + fi +fi + php /usr/local/vesta/func/bash-to-php-interpreter.php "$@" exit $? diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index 13995e1c..e780d41c 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -7,6 +7,14 @@ else $SHLVL=3; if (!isset($argv)) exit(5); +stream_set_blocking(STDIN, false); +$myvesta_stdin=''; +$myvesta_f = fopen( 'php://stdin', 'r' ); +while( $myvesta_line = fgets( $myvesta_f ) ) { + $myvesta_stdin .= $myvesta_line; +} +fclose( $myvesta_f ); + include ("/usr/local/vesta/func/main.php"); include ("/usr/local/vesta/func/string.php"); diff --git a/func/main.php b/func/main.php index fcc96610..03a501a1 100644 --- a/func/main.php +++ b/func/main.php @@ -71,7 +71,9 @@ function myvesta_fix_args() { } function myvesta_test_func () { + global $myvesta_stdin; $args=func_get_args(); + if ($myvesta_stdin!='') array_splice( $args, 0, 0, array($myvesta_stdin) ); myvesta_echo ("You said: "); myvesta_echo (trim(print_r ($args, true))); } diff --git a/func/string.php b/func/string.php index 2b6a63d9..a38e068e 100644 --- a/func/string.php +++ b/func/string.php @@ -70,8 +70,23 @@ function myvesta_strip_in_file_between_including_borders($file, $left, $right) { // --- string functions --- -function myvesta_str_get_between (&$text, $left_substring, $right_substring, $start=0, $return_left_substring=0, $return_right_substring=0, $left_substring_necessary=1, $right_substring_necessary=1) { - global $myvesta_str_found_at, $myvesta_str_end_at; +function myvesta_str_get_between () { + global $myvesta_stdin, $myvesta_str_found_at, $myvesta_str_end_at; + $args=func_get_args(); + $args_i=-1; + if ($myvesta_stdin!='') { + $text=$myvesta_stdin; + } else { + $args_i++; $text=$args[$args_i]; + } + $args_i++; $left_substring=$args[$args_i]; + $args_i++; $right_substring=$args[$args_i]; + $args_i++; $start=0; if (!empty($args[$args_i])) $start=intval($args[$args_i]); + $args_i++; $return_left_substring=0; if (!empty($args[$args_i])) $return_left_substring=intval($args[$args_i]); + $args_i++; $return_right_substring=0; if (!empty($args[$args_i])) $return_right_substring=intval($args[$args_i]); + $args_i++; $left_substring_necessary=1; if (!empty($args[$args_i])) $left_substring_necessary=intval($args[$args_i]); + $args_i++; $right_substring_necessary=1; if (!empty($args[$args_i])) $right_substring_necessary=intval($args[$args_i]); + $myvesta_str_found_at=0; $myvesta_str_end_at=0; $from_null=0; @@ -105,7 +120,19 @@ function myvesta_str_get_between (&$text, $left_substring, $right_substring, $st return substr($text, $pos1, $len); } -function myvesta_str_replace_once_between_including_borders(&$text, $left, $right, $replace_with) { +function myvesta_str_replace_once_between_including_borders() { + global $myvesta_stdin; + $args=func_get_args(); + $args_i=-1; + if ($myvesta_stdin!='') { + $text=$myvesta_stdin; + } else { + $args_i++; $text=$args[$args_i]; + } + $args_i++; $left=$args[$args_i]; + $args_i++; $right=$args[$args_i]; + $args_i++; $replace_with=$args[$args_i]; + $pos1=strpos($text, $left); if ($pos1===false) return $text; $pos2=strpos($text, $right, $pos1+strlen($left)); @@ -113,7 +140,18 @@ function myvesta_str_replace_once_between_including_borders(&$text, $left, $righ return substr($text, 0, $pos1).$replace_with.substr($text, $pos2+strlen($right)); } -function myvesta_str_strip_once_between_including_borders(&$text, $left, $right) { +function myvesta_str_strip_once_between_including_borders() { + global $myvesta_stdin; + $args=func_get_args(); + $args_i=-1; + if ($myvesta_stdin!='') { + $text=$myvesta_stdin; + } else { + $args_i++; $text=$args[$args_i]; + } + $args_i++; $left=$args[$args_i]; + $args_i++; $right=$args[$args_i]; + $pos1=strpos($text, $left); if ($pos1===false) return $text; $pos2=strpos($text, $right, $pos1+strlen($left)); @@ -121,7 +159,19 @@ function myvesta_str_strip_once_between_including_borders(&$text, $left, $right) return substr($text, 0, $pos1).substr($text, $pos2+strlen($right)); } -function myvesta_str_replace_between_including_borders($text, $left, $right, $replace_with) { +function myvesta_str_replace_between_including_borders() { + global $myvesta_stdin; + $args=func_get_args(); + $args_i=-1; + if ($myvesta_stdin!='') { + $text=$myvesta_stdin; + } else { + $args_i++; $text=$args[$args_i]; + } + $args_i++; $left=$args[$args_i]; + $args_i++; $right=$args[$args_i]; + $args_i++; $replace_with=$args[$args_i]; + $start=0; $left_len=strlen($left); $right_len=strlen($right); @@ -135,7 +185,18 @@ function myvesta_str_replace_between_including_borders($text, $left, $right, $re return $text; } -function myvesta_str_strip_between_including_borders($text, $left, $right) { +function myvesta_str_strip_between_including_borders() { + global $myvesta_stdin; + $args=func_get_args(); + $args_i=-1; + if ($myvesta_stdin!='') { + $text=$myvesta_stdin; + } else { + $args_i++; $text=$args[$args_i]; + } + $args_i++; $left=$args[$args_i]; + $args_i++; $right=$args[$args_i]; + $left_len=strlen($left); $right_len=strlen($right); while (true) { @@ -147,3 +208,43 @@ function myvesta_str_strip_between_including_borders($text, $left, $right) { } return $text; } + +function myvesta_str_find() { + global $myvesta_stdin; + $args=func_get_args(); + $args_i=-1; + if ($myvesta_stdin!='') { + $text=$myvesta_stdin; + } else { + $args_i++; $text=$args[$args_i]; + } + $args_i++; $find=$args[$args_i]; + + $pos=strpos($text, $find); + if ($pos===false) return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, ""); + return $pos; +} + +function myvesta_str_uppercase() { + global $myvesta_stdin; + $args=func_get_args(); + $args_i=-1; + if ($myvesta_stdin!='') { + $text=$myvesta_stdin; + } else { + $args_i++; $text=$args[$args_i]; + } + return strtoupper($text); +} + +function myvesta_str_lowercase() { + global $myvesta_stdin; + $args=func_get_args(); + $args_i=-1; + if ($myvesta_stdin!='') { + $text=$myvesta_stdin; + } else { + $args_i++; $text=$args[$args_i]; + } + return strtolower($text); +} From 452f8a81d94380d02f163d110ab3ba4f2c22ea24 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Fri, 14 Apr 2023 16:21:00 +0200 Subject: [PATCH 070/462] php myvesta_str_substring --- func/string.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/func/string.php b/func/string.php index a38e068e..9e531fb8 100644 --- a/func/string.php +++ b/func/string.php @@ -248,3 +248,19 @@ function myvesta_str_lowercase() { } return strtolower($text); } + +function myvesta_str_substring() { + global $myvesta_stdin; + $args=func_get_args(); + $args_i=-1; + if ($myvesta_stdin!='') { + $text=$myvesta_stdin; + } else { + $args_i++; $text=$args[$args_i]; + } + $args_i++; $start=$args[$args_i]; + $args_i++; $length=null; if (!empty($args[$args_i])) $length=intval($args[$args_i]); + + if ($length===null) return substr($text, $start); + if ($length!==null) return substr($text, $start, $length); +} From c5144bcbae09a3e332ce934127800b85cc1526df Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Fri, 14 Apr 2023 16:47:42 +0200 Subject: [PATCH 071/462] v-php-func str_find quiet --- func/string.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/func/string.php b/func/string.php index 9e531fb8..ffc7bf68 100644 --- a/func/string.php +++ b/func/string.php @@ -2,14 +2,18 @@ // --- file functions --- -function myvesta_find_in_file($file, $find) { - if (!file_exists($file)) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); - +function myvesta_find_in_file($file, $find, $quiet=false) { + if (!file_exists($file)) { + if ($quiet) return false; + return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); + } + $buf=file_get_contents($file); $pos=strpos($buf, $find); + if ($pos===false) return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, ""); - + if ($quiet) return true; return $pos; } @@ -219,9 +223,11 @@ function myvesta_str_find() { $args_i++; $text=$args[$args_i]; } $args_i++; $find=$args[$args_i]; + $args_i++; $quiet=false; if (!empty($args[$args_i])) $quiet=boolval($args[$args_i]); $pos=strpos($text, $find); if ($pos===false) return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, ""); + if ($quiet) return true; return $pos; } From 2f371245455db8e982ddf853c37c820d6b447d54 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Fri, 14 Apr 2023 19:01:07 +0200 Subject: [PATCH 072/462] simplifying php str functions --- func/bash-to-php-interpreter.php | 1 + func/string.php | 110 ++++--------------------------- 2 files changed, 12 insertions(+), 99 deletions(-) diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index e780d41c..461c1af0 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -29,6 +29,7 @@ if (!function_exists($func)) { $params=array(); +if ($myvesta_stdin!='') $params[]=$myvesta_stdin; for ($i=2; $i<$counter; $i++) { $argv[$i]=myvesta_fix_backslashes($argv[$i]); $params[]=$argv[$i]; diff --git a/func/string.php b/func/string.php index ffc7bf68..69881c8f 100644 --- a/func/string.php +++ b/func/string.php @@ -7,7 +7,7 @@ function myvesta_find_in_file($file, $find, $quiet=false) { if ($quiet) return false; return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File '$file' not found"); } - + $buf=file_get_contents($file); $pos=strpos($buf, $find); @@ -74,23 +74,8 @@ function myvesta_strip_in_file_between_including_borders($file, $left, $right) { // --- string functions --- -function myvesta_str_get_between () { - global $myvesta_stdin, $myvesta_str_found_at, $myvesta_str_end_at; - $args=func_get_args(); - $args_i=-1; - if ($myvesta_stdin!='') { - $text=$myvesta_stdin; - } else { - $args_i++; $text=$args[$args_i]; - } - $args_i++; $left_substring=$args[$args_i]; - $args_i++; $right_substring=$args[$args_i]; - $args_i++; $start=0; if (!empty($args[$args_i])) $start=intval($args[$args_i]); - $args_i++; $return_left_substring=0; if (!empty($args[$args_i])) $return_left_substring=intval($args[$args_i]); - $args_i++; $return_right_substring=0; if (!empty($args[$args_i])) $return_right_substring=intval($args[$args_i]); - $args_i++; $left_substring_necessary=1; if (!empty($args[$args_i])) $left_substring_necessary=intval($args[$args_i]); - $args_i++; $right_substring_necessary=1; if (!empty($args[$args_i])) $right_substring_necessary=intval($args[$args_i]); - +function myvesta_str_get_between (&$text, $left_substring, $right_substring, $start=0, $return_left_substring=0, $return_right_substring=0, $left_substring_necessary=1, $right_substring_necessary=1) { + global $myvesta_str_found_at, $myvesta_str_end_at; $myvesta_str_found_at=0; $myvesta_str_end_at=0; $from_null=0; @@ -124,19 +109,7 @@ function myvesta_str_get_between () { return substr($text, $pos1, $len); } -function myvesta_str_replace_once_between_including_borders() { - global $myvesta_stdin; - $args=func_get_args(); - $args_i=-1; - if ($myvesta_stdin!='') { - $text=$myvesta_stdin; - } else { - $args_i++; $text=$args[$args_i]; - } - $args_i++; $left=$args[$args_i]; - $args_i++; $right=$args[$args_i]; - $args_i++; $replace_with=$args[$args_i]; - +function myvesta_str_replace_once_between_including_borders(&$text, $left, $right, $replace_with) { $pos1=strpos($text, $left); if ($pos1===false) return $text; $pos2=strpos($text, $right, $pos1+strlen($left)); @@ -144,18 +117,7 @@ function myvesta_str_replace_once_between_including_borders() { return substr($text, 0, $pos1).$replace_with.substr($text, $pos2+strlen($right)); } -function myvesta_str_strip_once_between_including_borders() { - global $myvesta_stdin; - $args=func_get_args(); - $args_i=-1; - if ($myvesta_stdin!='') { - $text=$myvesta_stdin; - } else { - $args_i++; $text=$args[$args_i]; - } - $args_i++; $left=$args[$args_i]; - $args_i++; $right=$args[$args_i]; - +function myvesta_str_strip_once_between_including_borders(&$text, $left, $right) { $pos1=strpos($text, $left); if ($pos1===false) return $text; $pos2=strpos($text, $right, $pos1+strlen($left)); @@ -163,19 +125,7 @@ function myvesta_str_strip_once_between_including_borders() { return substr($text, 0, $pos1).substr($text, $pos2+strlen($right)); } -function myvesta_str_replace_between_including_borders() { - global $myvesta_stdin; - $args=func_get_args(); - $args_i=-1; - if ($myvesta_stdin!='') { - $text=$myvesta_stdin; - } else { - $args_i++; $text=$args[$args_i]; - } - $args_i++; $left=$args[$args_i]; - $args_i++; $right=$args[$args_i]; - $args_i++; $replace_with=$args[$args_i]; - +function myvesta_str_replace_between_including_borders($text, $left, $right, $replace_with) { $start=0; $left_len=strlen($left); $right_len=strlen($right); @@ -189,7 +139,7 @@ function myvesta_str_replace_between_including_borders() { return $text; } -function myvesta_str_strip_between_including_borders() { +function myvesta_str_strip_between_including_borders($text, $left, $right) { global $myvesta_stdin; $args=func_get_args(); $args_i=-1; @@ -213,60 +163,22 @@ function myvesta_str_strip_between_including_borders() { return $text; } -function myvesta_str_find() { - global $myvesta_stdin; - $args=func_get_args(); - $args_i=-1; - if ($myvesta_stdin!='') { - $text=$myvesta_stdin; - } else { - $args_i++; $text=$args[$args_i]; - } - $args_i++; $find=$args[$args_i]; - $args_i++; $quiet=false; if (!empty($args[$args_i])) $quiet=boolval($args[$args_i]); - +function myvesta_str_find($text, $find, $quiet=false) { $pos=strpos($text, $find); if ($pos===false) return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, ""); if ($quiet) return true; return $pos; } -function myvesta_str_uppercase() { - global $myvesta_stdin; - $args=func_get_args(); - $args_i=-1; - if ($myvesta_stdin!='') { - $text=$myvesta_stdin; - } else { - $args_i++; $text=$args[$args_i]; - } +function myvesta_str_uppercase($text) { return strtoupper($text); } -function myvesta_str_lowercase() { - global $myvesta_stdin; - $args=func_get_args(); - $args_i=-1; - if ($myvesta_stdin!='') { - $text=$myvesta_stdin; - } else { - $args_i++; $text=$args[$args_i]; - } +function myvesta_str_lowercase($text) { return strtolower($text); } -function myvesta_str_substring() { - global $myvesta_stdin; - $args=func_get_args(); - $args_i=-1; - if ($myvesta_stdin!='') { - $text=$myvesta_stdin; - } else { - $args_i++; $text=$args[$args_i]; - } - $args_i++; $start=$args[$args_i]; - $args_i++; $length=null; if (!empty($args[$args_i])) $length=intval($args[$args_i]); - +function myvesta_str_substring($text, $start, $length=null) { if ($length===null) return substr($text, $start); if ($length!==null) return substr($text, $start, $length); } From 888db2bc72a9951b53051ab32ac25a6eb7341ca8 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 15 Apr 2023 15:50:27 +0200 Subject: [PATCH 073/462] myvesta php replacement for gnu 'grep' (but without regular expression) --- bin/v-php-func | 2 +- func/bash-to-php-interpreter.php | 27 ++++++++++- func/main.php | 83 ++++++++++++++++++++++++++++++-- func/string.php | 34 +++++++++++++ 4 files changed, 140 insertions(+), 6 deletions(-) diff --git a/bin/v-php-func b/bin/v-php-func index f7a73385..0c789863 100644 --- a/bin/v-php-func +++ b/bin/v-php-func @@ -2,7 +2,7 @@ # info: calling myVesta PHP functions # options: FUNCTION # -# The function is calling myVesta PHP functions. +# The function is calling myVesta or standard PHP functions directly from bash #----------------------------------------------------------# # Action # diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index 461c1af0..baf9475e 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -11,7 +11,7 @@ stream_set_blocking(STDIN, false); $myvesta_stdin=''; $myvesta_f = fopen( 'php://stdin', 'r' ); while( $myvesta_line = fgets( $myvesta_f ) ) { - $myvesta_stdin .= $myvesta_line; + $myvesta_stdin .= $myvesta_line; } fclose( $myvesta_f ); @@ -27,13 +27,36 @@ if (!function_exists($func)) { if (!function_exists($func)) myvesta_throw_error(2, 'Function does not exists'); } +$insert_stdin_at_position=false; +if ($func=="myvesta_grep") $insert_stdin_at_position=1; + $params=array(); -if ($myvesta_stdin!='') $params[]=$myvesta_stdin; +$added=0; +$stdin_content=''; + $myvesta_stdin_return_not_found=false; +if ($myvesta_stdin!='' && $insert_stdin_at_position===false) {$params[]=$myvesta_stdin; $added++;} + for ($i=2; $i<$counter; $i++) { $argv[$i]=myvesta_fix_backslashes($argv[$i]); + if ($insert_stdin_at_position!==false && $myvesta_stdin=='') if ($insert_stdin_at_position==$added) {$stdin_content=$argv[$i]; $added++; continue;} $params[]=$argv[$i]; + $added++; } +if ($insert_stdin_at_position!=false) { + if ($myvesta_stdin=='') { + $file_or_stdin=$stdin_content; + if (!file_exists($file_or_stdin)) { + $myvesta_stdin_return_not_found=true; + $myvesta_stdin=''; + } else { + $myvesta_stdin=file_get_contents($file_or_stdin); + } + } + if (isset($params[$insert_stdin_at_position])) array_splice($params, $insert_stdin_at_position, 0, array($myvesta_stdin)); + else $params[$insert_stdin_at_position]=$myvesta_stdin; +} +//print_r($params); exit; $r=call_user_func_array($func, $params); if (is_bool($r)) { diff --git a/func/main.php b/func/main.php index 03a501a1..650f52ef 100644 --- a/func/main.php +++ b/func/main.php @@ -14,9 +14,88 @@ function myvesta_echo($str) { echo $str; } -function myvesta_exit($code) { +function myvesta_exit($code, $echo='') { global $SHLVL, $myvesta_echo_done, $myvesta_last_echo; // myvesta_echo ("==================== ".$argv[0].": ".$code." ====================\n"); + if ($echo!='') myvesta_echo($echo); + if ($SHLVL<3 && $myvesta_echo_done==true) { + $last_char=substr($myvesta_last_echo, -1, 1); + if ($last_char!="\n") echo "\n"; + } + exit($code); +} + +$myvesta_current_user=exec('whoami', $myvesta_output, $myvesta_return_var); +if ($myvesta_current_user != 'root') {myvesta_echo ("ERROR: You must be root to execute this script"); myvesta_exit(1);} + +function myvesta_throw_error($code, $message) { + global $myvesta_exit_on_error; + if ($message!=='') myvesta_echo ("ERROR: ".$message); + if ($myvesta_exit_on_error) myvesta_exit($code); + return $code; +} + +function myvesta_fix_backslashes($s) { + $s=str_replace("\\n", "\n", $s); + $s=str_replace("\\r", "\r", $s); + $s=str_replace("\\t", "\t", $s); + return $s; +} + +function myvesta_check_args ($requried_arguments, $arguments) { + global $argv; + $argument_counter=count($argv); + $argument_counter--; + $argv[0]=str_replace('/usr/local/vesta/bin/', '', $argv[0]); + // myvesta_echo ( "-------------------- ".$argv[0]." --------------------\n"); + if ($argument_counter<$requried_arguments) { + $arguments=str_replace(" ", "' '", $arguments); + $arguments="'".$arguments."'"; + return myvesta_throw_error(MYVESTA_ERROR_MISSING_ARGUMENTS, "Usage: $command $arguments"); + } + $argument_arr=explode(" ", $arguments); + $i=1; + foreach ($argument_arr as $argument) { + $GLOBALS[$argument]=myvesta_fix_backslashes($argv[$i]); + $i++; + } +} + +function myvesta_fix_args() { + global $argv; + $i=0; + foreach ($argv as $argument) { + if ($i==0) {$i++; continue;} + $argv[$i]=myvesta_fix_backslashes($argv[$i]); + $i++; + } +} + +function myvesta_test_func () { + $args=func_get_args(); + myvesta_echo ("You said: "); + myvesta_echo (trim(print_r ($args, true))); +} + Date: Sat, 15 Apr 2023 15:53:21 +0200 Subject: [PATCH 074/462] correction for main.php --- func/main.php | 78 --------------------------------------------------- 1 file changed, 78 deletions(-) diff --git a/func/main.php b/func/main.php index 650f52ef..b521ea2e 100644 --- a/func/main.php +++ b/func/main.php @@ -76,81 +76,3 @@ function myvesta_test_func () { myvesta_echo ("You said: "); myvesta_echo (trim(print_r ($args, true))); } - Date: Sat, 15 Apr 2023 16:38:53 +0200 Subject: [PATCH 075/462] myvesta php replacement for gnu 'sed' (but without regular expression) --- func/bash-to-php-interpreter.php | 3 +++ func/main.php | 20 ++++++++++++-------- func/string.php | 26 +++++++++++++++++++++++--- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index baf9475e..09c9c499 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -29,11 +29,13 @@ if (!function_exists($func)) { $insert_stdin_at_position=false; if ($func=="myvesta_grep") $insert_stdin_at_position=1; +if ($func=="myvesta_sed") $insert_stdin_at_position=2; $params=array(); $added=0; $stdin_content=''; +$myvesta_stdin_from_file=''; $myvesta_stdin_return_not_found=false; if ($myvesta_stdin!='' && $insert_stdin_at_position===false) {$params[]=$myvesta_stdin; $added++;} @@ -51,6 +53,7 @@ if ($insert_stdin_at_position!=false) { $myvesta_stdin=''; } else { $myvesta_stdin=file_get_contents($file_or_stdin); + $myvesta_stdin_from_file=$file_or_stdin; } } if (isset($params[$insert_stdin_at_position])) array_splice($params, $insert_stdin_at_position, 0, array($myvesta_stdin)); diff --git a/func/main.php b/func/main.php index b521ea2e..967fb8fb 100644 --- a/func/main.php +++ b/func/main.php @@ -1,6 +1,7 @@ Date: Sat, 15 Apr 2023 18:51:15 +0200 Subject: [PATCH 076/462] MYVESTA_QUIET as export variable --- func/main.php | 2 ++ func/string.php | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/func/main.php b/func/main.php index 967fb8fb..22834d42 100644 --- a/func/main.php +++ b/func/main.php @@ -2,6 +2,8 @@ $myvesta_exit_on_error=true; $myvesta_quiet_mode=0; +if (isset($_SERVER['MYVESTA_QUIET'])) $myvesta_quiet_mode=intval($_SERVER['MYVESTA_QUIET']); + define('MYVESTA_ERROR_PERMISSION_DENIED', 1); define('MYVESTA_ERROR_MISSING_ARGUMENTS', 2); define('MYVESTA_ERROR_FILE_DOES_NOT_EXISTS', 3); diff --git a/func/string.php b/func/string.php index e4ba2a5f..371c643c 100644 --- a/func/string.php +++ b/func/string.php @@ -81,8 +81,8 @@ function myvesta_grep($find, $file_or_stdin, $count=0, $quiet=0) { $myvesta_quiet_mode=$quiet; //echo "find = " . $find."\n"; echo "file_or_stdin = " . $file_or_stdin."\n"; echo "count = " . $count."\n"; echo "quiet = " . $quiet."\n"; exit; if ($myvesta_stdin_return_not_found==true) { - if ($count==1) return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, "0"); - return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, ""); + if ($count==1) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "0"); + return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, ""); } $arr=explode("\n", $file_or_stdin); @@ -111,7 +111,7 @@ function myvesta_sed($find, $replace, $file_or_stdin) { global $myvesta_stdin, $myvesta_stdin_return_not_found, $myvesta_stdin_from_file; //echo "find = " . $find."\n"; echo "replace = " . $replace."\n"; echo "file_or_stdin = " . $file_or_stdin."\n"; echo "stdin_from_file = " . $myvesta_stdin_from_file."\n"; exit; if ($myvesta_stdin_return_not_found==true) { - return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, "File not found"); + return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File not found"); } if (strpos($file_or_stdin, $find)===false) return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, "String '$find' not found"); From 502acb44c01a21fe4435d93ed59e1fe605441ac9 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 15 Apr 2023 19:03:11 +0200 Subject: [PATCH 077/462] v-grep and v-sed --- bin/v-grep | 21 +++++++++++++++++++++ bin/v-sed | 21 +++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 bin/v-grep create mode 100644 bin/v-sed diff --git a/bin/v-grep b/bin/v-grep new file mode 100644 index 00000000..3e467129 --- /dev/null +++ b/bin/v-grep @@ -0,0 +1,21 @@ +#!/bin/bash +# info: calling myvesta_grep PHP function +# options: PARAMETERS +# +# The function is calling myVesta PHP replacement for GNU 'grep' command (but without regular expression) + +#----------------------------------------------------------# +# Action # +#----------------------------------------------------------# + + +if [ -p /dev/stdin ]; then + STDIN=$(cat -) + if [ ! -z "$STDIN" ]; then + echo "$STDIN" | php /usr/local/vesta/func/bash-to-php-interpreter.php 'myvesta_grep' "$@" + exit $? + fi +fi + +php /usr/local/vesta/func/bash-to-php-interpreter.php 'myvesta_grep' "$@" +exit $? diff --git a/bin/v-sed b/bin/v-sed new file mode 100644 index 00000000..9d1a82ee --- /dev/null +++ b/bin/v-sed @@ -0,0 +1,21 @@ +#!/bin/bash +# info: calling myvesta_sed PHP function +# options: PARAMETERS +# +# The function is calling myVesta PHP replacement for GNU 'sed' command (but without regular expression) + +#----------------------------------------------------------# +# Action # +#----------------------------------------------------------# + + +if [ -p /dev/stdin ]; then + STDIN=$(cat -) + if [ ! -z "$STDIN" ]; then + echo "$STDIN" | php /usr/local/vesta/func/bash-to-php-interpreter.php 'myvesta_sed' "$@" + exit $? + fi +fi + +php /usr/local/vesta/func/bash-to-php-interpreter.php 'myvesta_sed' "$@" +exit $? From ae45e4a57198557a47a31ddf5e847dc0579d060b Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sun, 16 Apr 2023 00:10:54 +0200 Subject: [PATCH 078/462] simplifying php code --- func/bash-to-php-interpreter.php | 11 +++++++---- func/string.php | 26 +++++++++++++------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/func/bash-to-php-interpreter.php b/func/bash-to-php-interpreter.php index 09c9c499..4c1e9dc5 100644 --- a/func/bash-to-php-interpreter.php +++ b/func/bash-to-php-interpreter.php @@ -41,13 +41,15 @@ if ($myvesta_stdin!='' && $insert_stdin_at_position===false) {$params[]=$myvesta for ($i=2; $i<$counter; $i++) { $argv[$i]=myvesta_fix_backslashes($argv[$i]); - if ($insert_stdin_at_position!==false && $myvesta_stdin=='') if ($insert_stdin_at_position==$added) {$stdin_content=$argv[$i]; $added++; continue;} + //if ($insert_stdin_at_position!==false && $myvesta_stdin=='') if ($insert_stdin_at_position==$added) {$stdin_content=$argv[$i]; $added++; continue;} $params[]=$argv[$i]; $added++; } +//print_r($params); exit; + if ($insert_stdin_at_position!=false) { if ($myvesta_stdin=='') { - $file_or_stdin=$stdin_content; + $file_or_stdin=$params[$insert_stdin_at_position]; if (!file_exists($file_or_stdin)) { $myvesta_stdin_return_not_found=true; $myvesta_stdin=''; @@ -55,9 +57,10 @@ if ($insert_stdin_at_position!=false) { $myvesta_stdin=file_get_contents($file_or_stdin); $myvesta_stdin_from_file=$file_or_stdin; } + $params[$insert_stdin_at_position]=$myvesta_stdin; + } else { + array_splice($params, $insert_stdin_at_position, 0, array($myvesta_stdin)); } - if (isset($params[$insert_stdin_at_position])) array_splice($params, $insert_stdin_at_position, 0, array($myvesta_stdin)); - else $params[$insert_stdin_at_position]=$myvesta_stdin; } //print_r($params); exit; diff --git a/func/string.php b/func/string.php index 371c643c..7ada2546 100644 --- a/func/string.php +++ b/func/string.php @@ -74,25 +74,25 @@ function myvesta_strip_in_file_between_including_borders($file, $left, $right) { // --- mixed functions --- -function myvesta_grep($find, $file_or_stdin, $count=0, $quiet=0) { +function myvesta_grep($find, $content, $count=0, $quiet=0) { global $myvesta_stdin, $myvesta_stdin_return_not_found, $myvesta_quiet_mode; if ($count==='-c') {$count=1; $quiet=0;} if ($count==='-q') {$count=0; $quiet=1;} - $myvesta_quiet_mode=$quiet; - //echo "find = " . $find."\n"; echo "file_or_stdin = " . $file_or_stdin."\n"; echo "count = " . $count."\n"; echo "quiet = " . $quiet."\n"; exit; + if ($myvesta_quiet_mode==0) $myvesta_quiet_mode=$quiet; + //echo "find = " . $find."\n"; echo "file_or_stdin = " . $content."\n"; echo "count = " . $count."\n"; echo "quiet = " . $quiet."\n"; exit; if ($myvesta_stdin_return_not_found==true) { if ($count==1) return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "0"); return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, ""); } - $arr=explode("\n", $file_or_stdin); + $arr=explode("\n", $content); - $buf=''; + $buffer=''; $hits=0; foreach ($arr as $line) { if (strpos($line, $find)!==false) { $hits++; - if ($quiet==false && $count==false) $buf.=$line."\n"; + if ($quiet==false && $count==false) $buffer.=$line."\n"; } } if ($count==1) { @@ -104,24 +104,24 @@ function myvesta_grep($find, $file_or_stdin, $count=0, $quiet=0) { return true; } if ($hits==0) return myvesta_exit (MYVESTA_ERROR_STRING_NOT_FOUND, ""); - return $buf; + return $buffer; } -function myvesta_sed($find, $replace, $file_or_stdin) { +function myvesta_sed($find, $replace, $content) { global $myvesta_stdin, $myvesta_stdin_return_not_found, $myvesta_stdin_from_file; - //echo "find = " . $find."\n"; echo "replace = " . $replace."\n"; echo "file_or_stdin = " . $file_or_stdin."\n"; echo "stdin_from_file = " . $myvesta_stdin_from_file."\n"; exit; + //echo "find = " . $find."\n"; echo "replace = " . $replace."\n"; echo "file_or_stdin = " . $content."\n"; echo "stdin_from_file = " . $myvesta_stdin_from_file."\n"; exit; if ($myvesta_stdin_return_not_found==true) { return myvesta_throw_error (MYVESTA_ERROR_FILE_DOES_NOT_EXISTS, "File not found"); } - if (strpos($file_or_stdin, $find)===false) return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, "String '$find' not found"); + if (strpos($content, $find)===false) return myvesta_throw_error (MYVESTA_ERROR_STRING_NOT_FOUND, "String '$find' not found"); - $file_or_stdin=str_replace($find, $replace, $file_or_stdin); + $content=str_replace($find, $replace, $content); if ($myvesta_stdin_from_file!='') { - $r=file_put_contents($myvesta_stdin_from_file, $file_or_stdin); + $r=file_put_contents($myvesta_stdin_from_file, $content); if ($r===false) return false; } else { - myvesta_echo ($file_or_stdin); + myvesta_echo ($content); } return true; } From 22d524cfceb793cf9c1a1f337fa2c58e0a70004e Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sun, 30 Apr 2023 15:15:43 +0200 Subject: [PATCH 079/462] apache templates -FollowSymLinks +SymLinksIfOwnerMatch --- install/debian/10/templates/web/apache2/PHP-FPM-73-public.stpl | 2 +- install/debian/10/templates/web/apache2/PHP-FPM-73-public.tpl | 2 +- install/debian/10/templates/web/apache2/PHP-FPM-73.stpl | 2 +- install/debian/10/templates/web/apache2/PHP-FPM-73.tpl | 2 +- install/debian/11/templates/web/apache2/PHP-FPM-74-public.stpl | 2 +- install/debian/11/templates/web/apache2/PHP-FPM-74-public.tpl | 2 +- install/debian/11/templates/web/apache2/PHP-FPM-74.stpl | 2 +- install/debian/11/templates/web/apache2/PHP-FPM-74.tpl | 2 +- install/debian/8/templates/web/apache2/basedir.stpl | 2 +- install/debian/8/templates/web/apache2/basedir.tpl | 2 +- install/debian/8/templates/web/apache2/default.stpl | 2 +- install/debian/8/templates/web/apache2/default.tpl | 2 +- install/debian/8/templates/web/apache2/hosting.stpl | 2 +- install/debian/8/templates/web/apache2/hosting.tpl | 2 +- install/debian/8/templates/web/apache2/phpcgi.stpl | 2 +- install/debian/8/templates/web/apache2/phpcgi.tpl | 2 +- install/debian/8/templates/web/apache2/phpfcgid.stpl | 2 +- install/debian/8/templates/web/apache2/phpfcgid.tpl | 2 +- install/debian/9/templates/web/apache2/basedir.stpl | 2 +- install/debian/9/templates/web/apache2/basedir.tpl | 2 +- install/debian/9/templates/web/apache2/default.stpl | 2 +- install/debian/9/templates/web/apache2/default.tpl | 2 +- install/debian/9/templates/web/apache2/hosting.stpl | 2 +- install/debian/9/templates/web/apache2/hosting.tpl | 2 +- install/debian/9/templates/web/apache2/phpcgi.stpl | 2 +- install/debian/9/templates/web/apache2/phpcgi.tpl | 2 +- install/debian/9/templates/web/apache2/phpfcgid.stpl | 2 +- install/debian/9/templates/web/apache2/phpfcgid.tpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.tpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.tpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.tpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.tpl | 2 +- .../for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.tpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.tpl | 2 +- .../for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.tpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.tpl | 2 +- .../for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.tpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.tpl | 2 +- .../for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.tpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.tpl | 2 +- .../for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.tpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.stpl | 2 +- src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.tpl | 2 +- 56 files changed, 56 insertions(+), 56 deletions(-) diff --git a/install/debian/10/templates/web/apache2/PHP-FPM-73-public.stpl b/install/debian/10/templates/web/apache2/PHP-FPM-73-public.stpl index 9660c234..39777224 100644 --- a/install/debian/10/templates/web/apache2/PHP-FPM-73-public.stpl +++ b/install/debian/10/templates/web/apache2/PHP-FPM-73-public.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/install/debian/10/templates/web/apache2/PHP-FPM-73-public.tpl b/install/debian/10/templates/web/apache2/PHP-FPM-73-public.tpl index 892c0d1f..b6e306d7 100644 --- a/install/debian/10/templates/web/apache2/PHP-FPM-73-public.tpl +++ b/install/debian/10/templates/web/apache2/PHP-FPM-73-public.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/install/debian/10/templates/web/apache2/PHP-FPM-73.stpl b/install/debian/10/templates/web/apache2/PHP-FPM-73.stpl index 28224413..902d647a 100644 --- a/install/debian/10/templates/web/apache2/PHP-FPM-73.stpl +++ b/install/debian/10/templates/web/apache2/PHP-FPM-73.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/install/debian/10/templates/web/apache2/PHP-FPM-73.tpl b/install/debian/10/templates/web/apache2/PHP-FPM-73.tpl index 7bec5e73..40df2629 100644 --- a/install/debian/10/templates/web/apache2/PHP-FPM-73.tpl +++ b/install/debian/10/templates/web/apache2/PHP-FPM-73.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/install/debian/11/templates/web/apache2/PHP-FPM-74-public.stpl b/install/debian/11/templates/web/apache2/PHP-FPM-74-public.stpl index fdbc26f9..739cb48d 100644 --- a/install/debian/11/templates/web/apache2/PHP-FPM-74-public.stpl +++ b/install/debian/11/templates/web/apache2/PHP-FPM-74-public.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/install/debian/11/templates/web/apache2/PHP-FPM-74-public.tpl b/install/debian/11/templates/web/apache2/PHP-FPM-74-public.tpl index 614f20c3..f31ed5a8 100644 --- a/install/debian/11/templates/web/apache2/PHP-FPM-74-public.tpl +++ b/install/debian/11/templates/web/apache2/PHP-FPM-74-public.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/install/debian/11/templates/web/apache2/PHP-FPM-74.stpl b/install/debian/11/templates/web/apache2/PHP-FPM-74.stpl index df607247..fbc1d9c6 100644 --- a/install/debian/11/templates/web/apache2/PHP-FPM-74.stpl +++ b/install/debian/11/templates/web/apache2/PHP-FPM-74.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/install/debian/11/templates/web/apache2/PHP-FPM-74.tpl b/install/debian/11/templates/web/apache2/PHP-FPM-74.tpl index 7b6e2cb5..aaf8f62c 100644 --- a/install/debian/11/templates/web/apache2/PHP-FPM-74.tpl +++ b/install/debian/11/templates/web/apache2/PHP-FPM-74.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/install/debian/8/templates/web/apache2/basedir.stpl b/install/debian/8/templates/web/apache2/basedir.stpl index 2db1d52c..60a8f7fd 100644 --- a/install/debian/8/templates/web/apache2/basedir.stpl +++ b/install/debian/8/templates/web/apache2/basedir.stpl @@ -14,7 +14,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %sdocroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/8/templates/web/apache2/basedir.tpl b/install/debian/8/templates/web/apache2/basedir.tpl index 96c94a1b..3b8f875a 100644 --- a/install/debian/8/templates/web/apache2/basedir.tpl +++ b/install/debian/8/templates/web/apache2/basedir.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %docroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/8/templates/web/apache2/default.stpl b/install/debian/8/templates/web/apache2/default.stpl index ec34c279..3fc7e160 100644 --- a/install/debian/8/templates/web/apache2/default.stpl +++ b/install/debian/8/templates/web/apache2/default.stpl @@ -14,7 +14,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %sdocroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/8/templates/web/apache2/default.tpl b/install/debian/8/templates/web/apache2/default.tpl index 3a227015..464257ec 100644 --- a/install/debian/8/templates/web/apache2/default.tpl +++ b/install/debian/8/templates/web/apache2/default.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %docroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/8/templates/web/apache2/hosting.stpl b/install/debian/8/templates/web/apache2/hosting.stpl index c9c19512..b17014cd 100644 --- a/install/debian/8/templates/web/apache2/hosting.stpl +++ b/install/debian/8/templates/web/apache2/hosting.stpl @@ -14,7 +14,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value upload_max_filesize 10M php_admin_value max_execution_time 20 php_admin_value post_max_size 8M diff --git a/install/debian/8/templates/web/apache2/hosting.tpl b/install/debian/8/templates/web/apache2/hosting.tpl index 1eb26910..34f55b29 100644 --- a/install/debian/8/templates/web/apache2/hosting.tpl +++ b/install/debian/8/templates/web/apache2/hosting.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value upload_max_filesize 10M php_admin_value max_execution_time 20 php_admin_value post_max_size 8M diff --git a/install/debian/8/templates/web/apache2/phpcgi.stpl b/install/debian/8/templates/web/apache2/phpcgi.stpl index ae560dbe..7c1248d4 100644 --- a/install/debian/8/templates/web/apache2/phpcgi.stpl +++ b/install/debian/8/templates/web/apache2/phpcgi.stpl @@ -14,7 +14,7 @@ SSLRequireSSL AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %sdocroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/8/templates/web/apache2/phpcgi.tpl b/install/debian/8/templates/web/apache2/phpcgi.tpl index c6796d29..603ea8b9 100644 --- a/install/debian/8/templates/web/apache2/phpcgi.tpl +++ b/install/debian/8/templates/web/apache2/phpcgi.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %docroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/8/templates/web/apache2/phpfcgid.stpl b/install/debian/8/templates/web/apache2/phpfcgid.stpl index bc3688d9..98304f2a 100644 --- a/install/debian/8/templates/web/apache2/phpfcgid.stpl +++ b/install/debian/8/templates/web/apache2/phpfcgid.stpl @@ -14,7 +14,7 @@ SSLRequireSSL AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %sdocroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/8/templates/web/apache2/phpfcgid.tpl b/install/debian/8/templates/web/apache2/phpfcgid.tpl index a4c01269..525b1f53 100644 --- a/install/debian/8/templates/web/apache2/phpfcgid.tpl +++ b/install/debian/8/templates/web/apache2/phpfcgid.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %docroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/9/templates/web/apache2/basedir.stpl b/install/debian/9/templates/web/apache2/basedir.stpl index 2db1d52c..60a8f7fd 100644 --- a/install/debian/9/templates/web/apache2/basedir.stpl +++ b/install/debian/9/templates/web/apache2/basedir.stpl @@ -14,7 +14,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %sdocroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/9/templates/web/apache2/basedir.tpl b/install/debian/9/templates/web/apache2/basedir.tpl index 96c94a1b..3b8f875a 100644 --- a/install/debian/9/templates/web/apache2/basedir.tpl +++ b/install/debian/9/templates/web/apache2/basedir.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %docroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/9/templates/web/apache2/default.stpl b/install/debian/9/templates/web/apache2/default.stpl index ec34c279..3fc7e160 100644 --- a/install/debian/9/templates/web/apache2/default.stpl +++ b/install/debian/9/templates/web/apache2/default.stpl @@ -14,7 +14,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %sdocroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/9/templates/web/apache2/default.tpl b/install/debian/9/templates/web/apache2/default.tpl index 3a227015..464257ec 100644 --- a/install/debian/9/templates/web/apache2/default.tpl +++ b/install/debian/9/templates/web/apache2/default.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %docroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/9/templates/web/apache2/hosting.stpl b/install/debian/9/templates/web/apache2/hosting.stpl index c9c19512..b17014cd 100644 --- a/install/debian/9/templates/web/apache2/hosting.stpl +++ b/install/debian/9/templates/web/apache2/hosting.stpl @@ -14,7 +14,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value upload_max_filesize 10M php_admin_value max_execution_time 20 php_admin_value post_max_size 8M diff --git a/install/debian/9/templates/web/apache2/hosting.tpl b/install/debian/9/templates/web/apache2/hosting.tpl index 1eb26910..34f55b29 100644 --- a/install/debian/9/templates/web/apache2/hosting.tpl +++ b/install/debian/9/templates/web/apache2/hosting.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value upload_max_filesize 10M php_admin_value max_execution_time 20 php_admin_value post_max_size 8M diff --git a/install/debian/9/templates/web/apache2/phpcgi.stpl b/install/debian/9/templates/web/apache2/phpcgi.stpl index ae560dbe..7c1248d4 100644 --- a/install/debian/9/templates/web/apache2/phpcgi.stpl +++ b/install/debian/9/templates/web/apache2/phpcgi.stpl @@ -14,7 +14,7 @@ SSLRequireSSL AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %sdocroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/9/templates/web/apache2/phpcgi.tpl b/install/debian/9/templates/web/apache2/phpcgi.tpl index c6796d29..603ea8b9 100644 --- a/install/debian/9/templates/web/apache2/phpcgi.tpl +++ b/install/debian/9/templates/web/apache2/phpcgi.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %docroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/9/templates/web/apache2/phpfcgid.stpl b/install/debian/9/templates/web/apache2/phpfcgid.stpl index bc3688d9..98304f2a 100644 --- a/install/debian/9/templates/web/apache2/phpfcgid.stpl +++ b/install/debian/9/templates/web/apache2/phpfcgid.stpl @@ -14,7 +14,7 @@ SSLRequireSSL AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %sdocroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/install/debian/9/templates/web/apache2/phpfcgid.tpl b/install/debian/9/templates/web/apache2/phpfcgid.tpl index a4c01269..525b1f53 100644 --- a/install/debian/9/templates/web/apache2/phpfcgid.tpl +++ b/install/debian/9/templates/web/apache2/phpfcgid.tpl @@ -13,7 +13,7 @@ ErrorLog /var/log/%web_system%/domains/%domain%.error.log AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch php_admin_value open_basedir %docroot%:%home%/%user%/tmp php_admin_value upload_tmp_dir %home%/%user%/tmp php_admin_value session.save_path %home%/%user%/tmp diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.stpl index eb5631db..a24b368f 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.tpl index cd4e797d..55bc8233 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-56.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.stpl index 38285302..5d944c0f 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.tpl index 7d30d39c..c9378152 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-70.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.stpl index c5d284f7..a718b21f 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.tpl index 695b9937..9f0cf8a7 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-71.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.stpl index 2b4363b4..20792e92 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.tpl index be2ca7ae..89b19147 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-72.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.stpl index 9660c234..39777224 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.tpl index 892c0d1f..b6e306d7 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73-public.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.stpl index 28224413..902d647a 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.tpl index 7bec5e73..40df2629 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-73.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.stpl index fdbc26f9..739cb48d 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.tpl index 614f20c3..f31ed5a8 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74-public.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.stpl index df607247..fbc1d9c6 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.tpl index 7b6e2cb5..aaf8f62c 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-74.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.stpl index 4ce4b993..b1335a44 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.tpl index 41a5d506..1b0a610c 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80-public.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.stpl index f39e9631..fae336fc 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.tpl index b9e32f14..64699c22 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-80.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.stpl index 0d6404ec..4116fd42 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.tpl index f2814063..ee319a20 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81-public.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.stpl index fb191d03..5822a27a 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.tpl index 1a02ec15..7864b3a4 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-81.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch # # RMode config diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.stpl index 6afebb6e..809e7f33 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.tpl index 03e67a3d..679d1409 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82-public.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.stpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.stpl index ed39fad4..e0d04794 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.stpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.stpl @@ -17,7 +17,7 @@ AllowOverride All SSLRequireSSL - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch SSLEngine on SSLVerifyClient none diff --git a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.tpl b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.tpl index 789ee9d3..eba95935 100644 --- a/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.tpl +++ b/src/deb/for-download/tools/apache-fpm-tpl/PHP-FPM-82.tpl @@ -16,7 +16,7 @@ AllowOverride All - Options +Includes -Indexes +ExecCGI + Options +Includes -Indexes -FollowSymLinks +SymLinksIfOwnerMatch From c2511876c2a73489a5885efd5ff38af97babb662 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Tue, 2 May 2023 12:59:16 +0200 Subject: [PATCH 080/462] --retry-connrefused exception for Debian8 --- bin/v-add-letsencrypt-domain | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bin/v-add-letsencrypt-domain b/bin/v-add-letsencrypt-domain index 7a306ab3..1f1f5a6e 100755 --- a/bin/v-add-letsencrypt-domain +++ b/bin/v-add-letsencrypt-domain @@ -21,6 +21,8 @@ if [[ "$LE_STAGING" = 'yes' ]]; then API='https://acme-staging-v02.api.letsencrypt.org' fi +deb_release=$(cat /etc/debian_version | tr "." "\n" | head -n1) + # Includes source $VESTA/func/main.sh source $VESTA/func/domain.sh @@ -60,7 +62,11 @@ query_le_v2() { # Save http response to file passed as "$4" arg or print to stdout if not provided # http response headers are always sent to stdout local save_to_file=${4:-"/dev/stdout"} - curl --location --user-agent "myVesta" --insecure --retry 5 --retry-connrefused --silent --dump-header /dev/stdout --data "$post_data" "$1" --header "$content" --output "$save_to_file" + if [ "$deb_release" -gt 8 ]; then + curl --location --user-agent "myVesta" --insecure --retry 5 --retry-connrefused --silent --dump-header /dev/stdout --data "$post_data" "$1" --header "$content" --output "$save_to_file" + else + curl --location --user-agent "myVesta" --insecure --retry 5 --silent --dump-header /dev/stdout --data "$post_data" "$1" --header "$content" --output "$save_to_file" + fi } From ec8e1741588dc9554d07a0d6b2f3a764d461d9d4 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sat, 27 May 2023 19:03:41 +0200 Subject: [PATCH 081/462] Update README.md, fixing < char --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 44d414b8..71d9f5a9 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@
  • src/deb/for-download/php/php.ini
  • web/inc/secure_login.php
-
  • If you didn't set the secret URL during installation, you can do it anytime. Just execute in shell: echo " /usr/local/vesta/web/inc/login_url.php
  • +
  • If you didn't set the secret URL during installation, you can do it anytime. Just execute in shell: echo "<?php \$login_url='MY-SECRET-URL';" > /usr/local/vesta/web/inc/login_url.php
  • We disabled dangerous PHP functions in php.ini, so even if, for example, your customer's CMS gets compromised, hacker will not be able to execute shell scripts from within PHP.
  • From 2afbc2cddfbbc57f296640cb28d89fb29b2526c2 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sun, 4 Jun 2023 16:41:08 +0200 Subject: [PATCH 082/462] Patching exim4.conf for: smtputf8_advertise_hosts --- install/debian/10/exim/exim4.conf.template | 1 + install/debian/11/exim/exim4.conf.template | 1 + install/debian/9/exim/exim4.conf.template | 1 + src/deb/vesta/postinst | 20 ++++++++++++++++++++ 4 files changed, 23 insertions(+) diff --git a/install/debian/10/exim/exim4.conf.template b/install/debian/10/exim/exim4.conf.template index 0e5afaac..8fa12c2d 100644 --- a/install/debian/10/exim/exim4.conf.template +++ b/install/debian/10/exim/exim4.conf.template @@ -11,6 +11,7 @@ disable_ipv6=true add_environment=<; PATH=/bin:/usr/bin keep_environment= +smtputf8_advertise_hosts = domainlist local_domains = dsearch;/etc/exim4/domains/ domainlist relay_to_domains = dsearch;/etc/exim4/domains/ diff --git a/install/debian/11/exim/exim4.conf.template b/install/debian/11/exim/exim4.conf.template index 72e3f668..cbc2e75f 100644 --- a/install/debian/11/exim/exim4.conf.template +++ b/install/debian/11/exim/exim4.conf.template @@ -11,6 +11,7 @@ disable_ipv6=true add_environment=<; PATH=/bin:/usr/bin keep_environment= +smtputf8_advertise_hosts = domainlist local_domains = dsearch;/etc/exim4/domains/ domainlist relay_to_domains = dsearch;/etc/exim4/domains/ diff --git a/install/debian/9/exim/exim4.conf.template b/install/debian/9/exim/exim4.conf.template index 261947d2..c9344903 100644 --- a/install/debian/9/exim/exim4.conf.template +++ b/install/debian/9/exim/exim4.conf.template @@ -11,6 +11,7 @@ disable_ipv6=true add_environment=<; PATH=/bin:/usr/bin keep_environment= +smtputf8_advertise_hosts = domainlist local_domains = dsearch;/etc/exim4/domains/ domainlist relay_to_domains = dsearch;/etc/exim4/domains/ diff --git a/src/deb/vesta/postinst b/src/deb/vesta/postinst index 975d12cd..97df816e 100755 --- a/src/deb/vesta/postinst +++ b/src/deb/vesta/postinst @@ -25,6 +25,26 @@ fi echo "1" > /usr/local/vesta/data/upgrades/show_changelog chmod a=rw /usr/local/vesta/data/upgrades/show_changelog +# Patching exim4.conf for: smtputf8_advertise_hosts +if [ "$release" -gt 8 ]; then + if [ -f "/etc/exim4/exim4.conf.template" ]; then + if ! grep -q 'smtputf8_advertise_hosts' /etc/exim4/exim4.conf.template; then + echo 'Patching exim4.conf for: smtputf8_advertise_hosts' + sed -i "/^domainlist local_domains = dsearch;\/etc\/exim4\/domains\//i smtputf8_advertise_hosts =" /etc/exim4/exim4.conf.template + systemctl restart exim4 + fi + fi +fi + +# Patching exim4.conf for: Helo name contains a ip address +if [ -f "/etc/exim4/exim4.conf.template" ]; then + if grep -q 'drop message = Helo name contains a ip address (HELO was $sender_helo_name) and not is valid' /etc/exim4/exim4.conf.template; then + echo 'Patching exim4.conf for: Helo name contains a ip address' + patch /etc/exim4/exim4.conf.template < /usr/local/vesta/src/deb/for-download/tools/patches/exim_helo_authenticated.patch + sed -i '/telenor\.rs/d' /etc/exim4/exim4.conf.template + systemctl restart exim4 + fi +fi # Making sure yescrypt is disabled if [ "$release" -eq 11 ]; then From c3d0c17c518153a6bcb725b0d6842706206bb814 Mon Sep 17 00:00:00 2001 From: myvesta <38690722+myvesta@users.noreply.github.com> Date: Sun, 4 Jun 2023 17:56:44 +0200 Subject: [PATCH 083/462] Redesign of hosting panel --- bin/v-list-user-log | 8 +- bin/v-update-sys-rrd-la | 4 +- web/add/user/index.php | 2 +- web/css/styles.fix.css | 1001 ++++++ web/css/styles.fix.css.map | 1 + web/css/styles.min.css | 3491 ++++++++++----------- web/images/myvesta-large-white-130.png | Bin 0 -> 5284 bytes web/images/sprite.png | Bin 57521 -> 35005 bytes web/images/vesta_logo.png | Bin 5902 -> 5438 bytes web/inc/main.php | 5 +- web/js/fix.js | 157 + web/js/init.js | 20 +- web/templates/admin/list_dns_rec.html | 2 +- web/templates/admin/list_server_info.html | 6 +- web/templates/admin/list_user.html | 19 +- web/templates/admin/list_weblog.html | 6 +- web/templates/admin/panel.html | 25 +- web/templates/footer.html | 3 - web/templates/header.html | 15 +- web/templates/login.html | 2 +- web/templates/reset_1.html | 6 +- web/templates/reset_2.html | 6 +- web/templates/reset_3.html | 6 +- web/templates/scripts.html | 161 + web/templates/user/list_dns_rec.html | 2 +- web/templates/user/list_user.html | 2 +- web/templates/user/panel.html | 23 +- 27 files changed, 3143 insertions(+), 1830 deletions(-) create mode 100644 web/css/styles.fix.css create mode 100644 web/css/styles.fix.css.map create mode 100644 web/images/myvesta-large-white-130.png create mode 100644 web/js/fix.js diff --git a/bin/v-list-user-log b/bin/v-list-user-log index ca317f7d..6be9f9ae 100755 --- a/bin/v-list-user-log +++ b/bin/v-list-user-log @@ -12,6 +12,7 @@ # Argument definition user=$1 format=${2-shell} +limit=${3-300} # Includes source $VESTA/func/main.sh @@ -34,6 +35,9 @@ json_list() { "TIME": "'$TIME'", "DATE": "'$DATE'" }' + if [ "$limit" -gt 0 ] && [ "$i" = "$limit" ]; then + break; + fi if [ "$i" -lt "$objects" ]; then echo ',' else @@ -83,7 +87,7 @@ csv_list() { # Verifications # #----------------------------------------------------------# -check_args '1' "$#" 'USER [FORMAT]' +check_args '1' "$#" 'USER [FORMAT] [LIMIT]' is_format_valid 'user' is_object_valid 'user' 'USER' "$user" @@ -93,7 +97,7 @@ is_object_valid 'user' 'USER' "$user" #----------------------------------------------------------# # Parsing history log -logs=$(tail -n 300 $USER_DATA/history.log 2>/dev/null) +logs=$(tail -n $limit $USER_DATA/history.log | tac) case $format in json) json_list ;; diff --git a/bin/v-update-sys-rrd-la b/bin/v-update-sys-rrd-la index c8266626..860bdec6 100755 --- a/bin/v-update-sys-rrd-la +++ b/bin/v-update-sys-rrd-la @@ -74,7 +74,7 @@ rrdtool graph $RRD/la/$period-la.png \ -c "SHADEA#ffffff" \ -c "SHADEB#ffffff" \ -c "FONT#555555" \ - -c "CANVAS#302c2d" \ + -c "CANVAS#F2F2F2" \ -c "GRID#666666" \ -c "MGRID#AAAAAA" \ -c "FRAME#777777" \ @@ -82,7 +82,7 @@ rrdtool graph $RRD/la/$period-la.png \ DEF:la=$RRD/la/la.rrd:LA:AVERAGE \ DEF:pr=$RRD/la/la.rrd:PR:AVERAGE \ COMMENT:'\r' \ - AREA:la#C8EA2E:"LA * 100"\ + AREA:la#00CD2E:"LA * 100"\ GPRINT:la:'LAST: Current\:''%8.0lf' \ GPRINT:la:'MIN: Min\:''%8.0lf' \ GPRINT:la:'MAX: Max\:''%8.0lf\j' \ diff --git a/web/add/user/index.php b/web/add/user/index.php index 1ed521e3..04043484 100644 --- a/web/add/user/index.php +++ b/web/add/user/index.php @@ -100,7 +100,7 @@ if (!empty($_POST['ok'])) { // Flush field values on success if (empty($_SESSION['error_msg'])) { $_SESSION['ok_msg'] = __('USER_CREATED_OK',htmlentities($_POST['v_username']),htmlentities($_POST['v_username'])); - $_SESSION['ok_msg'] .= " / " . __('login as') ." ".htmlentities($_POST['v_username']). ""; + $_SESSION['ok_msg'] .= " / " . __('login as') ." ".htmlentities($_POST['v_username']). ""; unset($v_username); unset($v_password); unset($v_email); diff --git a/web/css/styles.fix.css b/web/css/styles.fix.css new file mode 100644 index 00000000..5fbdb6ec --- /dev/null +++ b/web/css/styles.fix.css @@ -0,0 +1,1001 @@ +body { + background: #f0f3f5; + color: #58666f; + font-family: 'Source Sans Pro', sans-serif; +} +b, strong { + color: #58666f; +} +.l-percent { + border-bottom: none; + margin-top: 1px; + width: 200px; + background: #e4eaed; +} +.l-percent__fill { + background-color: #2ac34e; + bottom: 0; +} +.to-top { + z-index: 100; + top: unset; + bottom: 30px; + right: 85px; +} +.to-shortcuts { + z-index: 100; + top: unset; + bottom: 30px; + right: 130px; +} +.shortcuts { + right: calc(50% - 400px); + bottom: calc(50% - 213px); +} +.l-separator { + display: none; +} +.l-header { + position: fixed; + width: calc(100% - 40px); + z-index: 99; + background: #fff; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(0, 0, 0, 0.05); + color: #58666f; + height: 50px; + padding: 0 20px; + margin-bottom: unset; +} +.l-header a { + color: #58666f; + font-size: 14px; +} +.l-header a:hover { + color: #58666f; +} +.l-header .l-center { + max-width: none !important; +} +.l-header .l-center .l-logo { + background-position: -65px -182px; + /* background-position: -125px -478px; */ + background-repeat: no-repeat; + display: block; + height: 40px; + margin-top: 0; + width: 80px; + /* width: 42px; */ + margin-left: 0; + background-size: 235px 325px; + position: relative; + top: 5px; + left: 0; + float: left; + padding-right: 20px; +} +.l-header .l-center .l-menu { + position: unset; + margin-left: unset; +} +.l-header .l-center .l-menu .l-menu__item a { + line-height: 50px; + padding: 0 18px; + display: inline-block; +} +.l-header .l-center .l-menu .l-menu__item a:hover { + background-color: rgba(0, 0, 0, 0.05); +} +.l-header .l-center .l-menu .l-menu__item a:active { + background-color: rgba(0, 0, 0, 0.05); +} +.l-header .l-center .l-menu .l-menu__item.l-menu__item--active a { + color: unset; + font-size: unset; + font-weight: unset; + text-transform: unset; + background-color: rgba(0, 0, 0, 0.05); +} +.l-header .l-center .l-profile .l-profile__notifications { + margin-top: 13px; +} +.l-header .l-center .l-profile .l-profile__notifications:hover { + background-color: rgba(0, 0, 0, 0.05); +} +.l-header .l-center .l-profile .l-profile__username { + padding: 15px 0 0 10px; +} +.l-header .l-center .l-profile .l-profile__logout { + padding: 15px 0 0 10px; +} +.l-header > .l-center { + margin-left: 200px; +} +.l-content { + position: relative; + top: 50px; +} +.l-content + div { + right: 100px !important; + top: unset !important; + bottom: 40px !important; +} +.l-content + div div { + background-color: #e4eaed !important; + padding: 10px; + border-radius: 5px; +} +.l-content .l-center { + max-width: none !important; +} +.l-content .l-center .l-stat { + display: block; + position: fixed; + z-index: 100; + padding-top: 0 !important; + width: 200px; + height: 100%; + top: 0; + margin-top: 0; + background: #1c2b35; + overflow-y: scroll; + scrollbar-width: thin; + /* Firefox */ + -ms-overflow-style: scrollbar; + /* Internet Explorer 10+ */ + /* width */ +} +.l-content .l-center .l-stat::-webkit-scrollbar { + display: block; + width: 7px; + /* Track */ +} +.l-content .l-center .l-stat::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0); + /* Handle */ +} +.l-content .l-center .l-stat::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.15); +} +.l-content .l-center .l-stat:hover { + /* Handle on hover */ +} +.l-content .l-center .l-stat:hover::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.4); +} +.l-content .l-center .l-stat .l-stat__col--active ul { + display: block !important; +} +.l-content .l-center .l-stat .l-stat__col--active { + background: #131e27; +} +.l-content .l-center .l-stat .l-stat__col--active a { + border-bottom: 2px solid #131e27; +} +.l-content .l-center .l-stat .l-stat__col--active a .l-stat__col-title { + background: #16232d; + color: white !important; + font-size: 20px; + font-weight: 400; + margin-top: unset; + letter-spacing: unset; + margin-right: unset; +} +.l-content .l-center .l-stat .l-stat__col--active span { + display: none; +} +.l-content .l-center .l-stat .focus { + background: #5e5e5e; +} +.l-content .l-center .l-stat .focus a { + border-bottom: 2px solid #131e27; +} +.l-content .l-center .l-stat .focus a ul li { + color: #c2e5ff !important; +} +.l-content .l-center .l-stat .focus a .l-stat__col-title { + background: #5e5e5e; + color: #c4d0d8; + font-size: 20px; + font-weight: 400; + margin-top: unset; + letter-spacing: unset; + margin-right: unset; +} +.l-content .l-center .l-stat .l-stat__col { + display: block; + float: unset; +} +.l-content .l-center .l-stat .l-stat__col:hover .l-stat__col-title { + color: #fff; +} +.l-content .l-center .l-stat .l-stat__col:hover .l-stat__col-title:after { + color: #fff; +} +.l-content .l-center .l-stat .l-stat__col a { + height: unset !important; + min-height: unset !important; + display: block; + width: unset; + border-bottom: 2px solid #131e27; + background-color: transparent; + padding-left: unset; + padding-bottom: 10px; + padding-top: unset; + margin-top: unset; +} +.l-content .l-center .l-stat .l-stat__col a .l-stat__col-title { + min-height: unset !important; + color: #869fb2; + font-size: 20px; + font-weight: 400; + padding: 15px 15px 15px 20px; + margin-bottom: 0; + margin-top: 0 !important; +} +.l-content .l-center .l-stat .l-stat__col a .l-stat__col-title:after { + font-family: 'Font Awesome 5 Free'; + font-weight: bold; + content: "\f054"; + float: right; + font-size: 10px; + color: #5c798f; + margin-top: 8px; + margin-right: 26px; +} +.l-content .l-center .l-stat .l-stat__col a .l-stat__col-title:before { + font-family: 'Font Awesome 5 Free'; + font-weight: bold; + content: "\f233"; + padding-right: 10px; + font-size: 17px; +} + +.l-content .l-center .l-stat .l-stat__col--active a .l-stat__col-title:after { + margin-right: 26px; +} + +.l-content .l-center .l-stat .l-stat__col a ul { + margin: 0; + display: none; +} +.l-content .l-center .l-stat .l-stat__col a ul li { + color: #92adc2; + margin-bottom: unset; + padding: 10px 20px 10px 20px; + font-size: 14px; +} +.l-content .l-center .l-stat .l-stat__col a ul li span { + float: right; + padding: 3px 5px 4px 5px; + font-size: 13px; + color: #fff; + background-color: #27c54e; + font-weight: 700; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); + display: inline-block; + min-width: 10px; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25em; + left: 140px; +} +.l-content .l-center .l-stat .l-stat__col a ul li:first-child span { + float: right; + padding: 3px 5px 4px 5px; + font-size: 13px; + color: #fff; + background-color: #34b5dd; + font-weight: 700; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); + display: inline-block; + min-width: 10px; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 10px; +} +.l-content .l-center .l-stat .l-stat__col a ul li:before { + font-family: 'Font Awesome 5 Free'; + font-weight: bold; + content: "\f03a"; + padding-right: 15px; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(1) a .l-stat__col-title:before { + content: "\f500"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(1) a ul li:nth-of-type(1):before { + content: "\f0a0"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(1) a ul li:nth-of-type(2):before { + content: "\f75b"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(1) a ul li:nth-of-type(3):before { + content: "\f05e"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(2) a .l-stat__col-title:before { + content: "\f233"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(2) a ul li:nth-of-type(1):before { + content: "\f0ac"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(2) a ul li:nth-of-type(2):before { + content: "\f0c5"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(2) a ul li:nth-of-type(3):before { + content: "\f05e"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(3) a .l-stat__col-title:before { + content: "\f6ff"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(3) a ul li:nth-of-type(1):before { + content: "\f0ac"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(3) a ul li:nth-of-type(2):before { + content: "\f303"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(3) a ul li:nth-of-type(3):before { + content: "\f05e"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(4) a .l-stat__col-title:before { + content: "\f674"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(4) a ul li:nth-of-type(1):before { + content: "\f0ac"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(4) a ul li:nth-of-type(2):before { + content: "\f2bb"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(4) a ul li:nth-of-type(3):before { + content: "\f05e"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(5) a .l-stat__col-title:before { + content: "\f1c0"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(5) a ul li:nth-of-type(1):before { + content: "\f1c0"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(5) a ul li:nth-of-type(2):before { + content: "\f05e"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(5) a ul li:nth-of-type(3):before { + content: "\f05e"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(6) a .l-stat__col-title:before { + content: "\f120"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(6) a ul li:nth-of-type(1):before { + content: "\f120"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(6) a ul li:nth-of-type(2):before { + content: "\f05e"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(6) a ul li:nth-of-type(3):before { + content: "\f05e"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(7) a .l-stat__col-title:before { + content: "\f019"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(7) a ul li:nth-of-type(1):before { + content: "\f019"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(7) a ul li:nth-of-type(2):before { + content: "\f05e"; +} +.l-content .l-center .l-stat .l-stat__col:nth-of-type(7) a ul li:nth-of-type(3):before { + content: "\f05e"; +} +.l-content .l-center .l-sort { + padding: 0 20px; + position: relative; + z-index: 98; + width: auto; + margin-top: unset !important; + background-color: #f6f8f8; + border-bottom: 1px solid #dee5e8; + margin-bottom: 30px; +} +.l-content .l-center .l-sort .l-sort__create-btn { + bottom: -20px; +} +.l-content .l-center .l-sort .context-menu { + top: 77px; +} +.l-content .l-center .l-sort .l-sort-toolbar { + padding: 24px 0 22px 0; + color: #98a6ac; +} +.l-content .l-center .l-sort .l-sort-toolbar .l-select { + border-radius: 3px 0 0 3px; + background: #fff; + border: 1px solid #dee5e8; +} +.l-content .l-center .l-sort .l-sort-toolbar .l-sort-toolbar__filter-apply { + border-radius: 0 3px 3px 0; +} +.l-content .l-center .l-sort .l-sort-toolbar table tbody tr .l-sort-toolbar__search-box form .search-input { + border-radius: 3px 0 0 3px; + border: 1px solid #dee5e8; +} +.l-content .l-center .l-sort .l-sort-toolbar table tbody tr .l-sort-toolbar__search-box form .l-sort-toolbar__search { + border-radius: 0 3px 3px 0; +} +.l-content .l-center .l-sort .l-sort-toolbar table tbody tr .sort-by { + padding-left: 30px; +} +.l-content .l-center .l-unit { + padding: 0 0 0 15px; + overflow: hidden; + margin: 0px 20px 20px 20px; + background: #fff; + border-radius: 3px; + border-bottom: none !important; + border-left: none !important; + color: #98a6ac; + font-size: 14px; +} +.l-content .l-center .l-unit.selected { + background-color: #e4eaed; +} +.l-content .l-center .l-unit--suspended { + background-color: #eaeaea !important; +} +.l-content .l-center .l-unit.selected .l-percent { + border-bottom: none; + margin-top: 1px; + width: 200px; + background: #cbd3d7; +} +.l-content .l-center .l-unit .l-unit-toolbar .l-unit-toolbar__col.l-unit-toolbar__col--right { + position: relative; + top: 20px; + right: 20px; + display: block; +} +.l-content .l-center .l-unit .l-unit-toolbar .l-unit-toolbar__col.l-unit-toolbar__col--right .actions-panel__col { + margin-left: 10px; + border-radius: 3px; + overflow: hidden; + border-right: none; + background-color: #dde6e8; +} +.l-content .l-center .l-unit .l-unit-toolbar .l-unit-toolbar__col.l-unit-toolbar__col--right .actions-panel__col a { + font-weight: 500; +} +.l-content .l-center .l-unit .l-unit-toolbar .l-unit-toolbar__col .check-label:before { + z-index: 97; +} +.l-content .l-center .l-unit .l-unit__col .l-unit__name { + color: #34b5dd; + font-weight: 500; + font-size: 24px; + margin-bottom: unset; +} +.l-content .l-center .l-unit .l-unit__col .l-unit__ip { + font-size: 18px; +} +.l-content .l-center .l-unit .l-unit__col .l-unit__date { + letter-spacing: unset; + display: inline-block; + border-bottom: solid 10px #ffeb0087; + line-height: 3px; + padding: 0 0px; + margin-bottom: 30px; + font-weight: 400; + font-size: 16px; +} +.l-content .l-center .l-unit .l-unit__col .l-unit__stats td { + height: 27px; +} +.l-content .l-center .io-box { + overflow: hidden; + margin: 20px 20px 0px 20px; + color: #98a6ac; +} +.l-content .l-center .io-box .io-box-left { + float: left; + width: calc(100% - 800px); + min-width: 410px; + text-align: center; +} +.l-content .l-center .io-box .io-box-left .io-box-left-items { + float: left; + width: calc(50% - 20px); + height: 137px; + margin-right: 20px; + margin-bottom: 20px; + background: #fff; + border-radius: 3px; +} +.l-content .l-center .io-box .io-box-left .io-box-left-items a { + display: block; + font-size: 36px; + font-weight: 300; + margin-top: 32px; +} +.l-content .l-center .io-box .io-box-left .io-1-homepage-block { + color: #98a6ac; +} +.l-content .l-center .io-box .io-box-left .io-1-homepage-block a { + color: #34b5dd; +} +.l-content .l-center .io-box .io-box-left .io-2-homepage-block { + color: #b4efc2; + background-color: #27c54e; +} +.l-content .l-center .io-box .io-box-left .io-2-homepage-block a { + color: #ecfff1; +} +.l-content .l-center .io-box .io-box-left .io-3-homepage-block { + color: #b0e1f1; + background-color: #34b5dd; +} +.l-content .l-center .io-box .io-box-left .io-3-homepage-block a { + color: #dcf2f8; +} +.l-content .l-center .io-box .io-box-left .io-4-homepage-block { + color: #98a6ac; +} +.l-content .l-center .io-box .io-box-left .io-4-homepage-block a { + color: #58666f; +} +.l-content .l-center .io-box .io-box-left .io-5-homepage-block { + width: calc(100% - 20px); + color: #98a6ac; + background: #e4eaed; +} +.l-content .l-center .io-box .io-box-left .io-5-homepage-block a { + color: #27c54e; +} +.l-content .l-center .io-box .io-box-left .io-5-homepage-block:before { + font-family: 'Font Awesome 5 Free'; + font-weight: bold; + font-size: 32px; + background: #dde6e8; + height: 121px; + width: 115px; + line-height: 90px; + content: "\f581"; + color: #fff; + float: left; + border-radius: 5px 0 0 5px; + padding-top: 16px; +} +.l-content .l-center .io-box .io-box-right { + float: right; + width: 800px; + background: #fff; + height: 450px; + overflow: hidden; + border-radius: 3px; + text-align: center; +} +.l-content .l-center .io-box .io-box-right img { + margin-top: 8px; + width: 767px; + height: 433px; + position: relative; +} +.l-content .l-center .l-unit-ft { + padding: 0 0 37px 15px; + overflow: hidden; + margin: 0px 20px 19px 20px; + background: #e4eaed; + border-radius: 3px; + border-bottom: none !important; + border-left: none !important; + position: relative; + color: #a6b0b4; + font-weight: bold; + text-transform: uppercase; + font-size: 11px; +} +.l-content .l-center .l-unit-ft:before { + font-family: "Font Awesome 5 Free"; + font-weight: bold; + font-size: 32px; + background: #dde6e8; + height: 100%; + width: 90px; + line-height: 108px; + content: "\f05a"; + color: #fff; + float: left; + border-radius: 5px 0 0 5px; + position: absolute; + left: 0; + text-align: center; +} +.l-content .l-center .l-unit-ft .data { + margin: 0 0 50px 0; +} +.l-content .l-center #vstobjects { + padding: 0 0 0 15px; + overflow: hidden; + margin: 0px 20px 20px 20px; + background: #fff; + border-radius: 3px; + border-bottom: none !important; + border-left: none !important; + color: #98a6ac; + font-size: 14px; +} +.l-content .l-center #vstobjects .data-date { + color: #98A6AC; + letter-spacing: unset; + display: inline-block; + border-bottom: solid 10px #ffeb0087; + line-height: 3px; + padding: 0 0px; + margin-bottom: 30px; + font-weight: 400; + font-size: 16px; +} +.l-content .l-center .vst-text.step-top.helper-container { + margin-bottom: unset; + margin-top: 0; + float: unset; + height: auto; + width: auto; +} +.l-content .l-center .vst-text.step-top.helper-container #tabs.cron-helper-tabs { + padding: 0 0 0 15px; + overflow: hidden; + margin: 0 20px 20px 20px; + background: #fff; + border-radius: 3px; + border-bottom: none !important; + border-left: none !important; + color: #98a6ac; + font-size: 14px; + border: none !important; +} +.l-content > .units.l-center::before { + content: ''; + display: block; + height: 0; +} +.l-content > .l-center { + margin-left: 200px; + margin-right: 40px; +} +.l-content > .l-center:first-child { + margin-left: 0; +} +.l-content #vstobjects > .l-center { + margin-left: 200px; + margin-right: 40px; + padding-top: 0; + padding-bottom: 1px; +} +.l-content .io-log { + color: #58666f; + border-left: 1px solid #dee5e8; + width: 240px; + position: fixed; + display: block; + /*overflow-scrolling: auto;*/ + z-index: 98; + top: 50px; + right: -200px; + background: #fff; + word-break: break-word; + overflow: hidden; + border-right: 10px solid #e3e3e3; + box-sizing: border-box; + /* Firefox */ + /* width */ +} +.l-content .io-log::-webkit-scrollbar { + width: 7px; + /* Track */ +} +.l-content .io-log::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0); + /* Handle */ +} +.l-content .io-log::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.15); + border-radius: 7px; + /* Handle on hover */ +} +.l-content .io-log::-webkit-scrollbar-thumb:hover { + background: rgba(0, 0, 0, 0.4); + border-radius: 7px; +} +.l-content .io-log > * { + margin: 0 20px; +} +.l-content .io-log h2 { + margin: 0 0 20px 0; + padding-left: 20px; + font-size: 24px; + font-weight: 300; + line-height: 60px; + color: #98a6ac; + border-bottom: 1px solid #dee5e8; + cursor: pointer; +} +.l-content .io-log h2:before { + font-family: "Font Awesome 5 Free"; + font-weight: bold; + content: "\f15c"; + padding-right: 10px; + font-size: 17px; +} +.l-content .io-log > div { + /* border-left: solid 1px #dee5e8; */ + padding-left: 15px; + position: relative; + margin-left: 25px; +} +.l-content .io-log > div > div { + position: relative; + margin-bottom: 25px; +} +.l-content .io-log > div > div > div:nth-of-type(2) { + color: #98a6ac; + font-size: 13px; + margin-bottom: 5px; +} +.l-content .io-log > div > div > div:nth-of-type(3) { + color: #98a6ac; + font-size: 13px; + margin-bottom: 5px; +} +.l-content .io-log > div > div:before { + content: ''; + position: absolute; + height: 100%; + width: 7px; + border-radius: 10px; + border: solid 1px #dee5e8; + background: #e0fff9; + left: -20px; +} +.l-content .io-log > div > div:first-child(1n):before { + background: #e0fff9; +} +.l-content .io-log > div > div:nth-child(2n):before { + background: #fbffe0; +} +.l-content .io-log > div > div:nth-child(3n):before { + background: #fbffe0; +} +.l-content .io-log > div > div:nth-child(4n):before { + background: #fbffe0; +} +.l-content .io-log > div > div:nth-child(5n):before { + background: #fbffe0; +} + + +.l-content .io-log2 { + color: #58666f; + border-left: 1px solid #dee5e8; + border-top: 1px solid #cecece; + width: 240px; + position: fixed; + height: 100%; + display: block; + /*overflow-scrolling: auto;*/ + z-index: 98; + top: 380px; + right: -200px; + background: #fff; + word-break: break-word; + overflow-y: scroll; + scrollbar-width: thin; + box-sizing: border-box; + /* Firefox */ + /* width */ +} +.l-content .io-log2::-webkit-scrollbar { + width: 7px; + /* Track */ +} +.l-content .io-log2::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0); + /* Handle */ +} +.l-content .io-log2::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.15); + border-radius: 7px; + /* Handle on hover */ +} +.l-content .io-log2::-webkit-scrollbar-thumb:hover { + background: rgba(0, 0, 0, 0.4); + border-radius: 7px; +} +.l-content .io-log2 > * { + margin: 0 20px; +} +.l-content .io-log2 h2 { + margin: 0 0 20px 0; + padding-left: 20px; + font-size: 24px; + font-weight: 300; + line-height: 60px; + color: #98a6ac; + border-bottom: 1px solid #dee5e8; + cursor: pointer; +} +.l-content .io-log2 h2:before { + font-family: "Font Awesome 5 Free"; + font-weight: bold; + content: "\f15c"; + padding-right: 10px; + font-size: 17px; +} +.l-content .io-log2 > div { + border-left: solid 1px #dee5e8; + padding-left: 15px; + position: relative; + margin-left: 25px; +} +.l-content .io-log2 > div > div { + position: relative; + margin-bottom: 25px; +} +.l-content .io-log2 > div > div > div:nth-of-type(2) { + color: #98a6ac; + font-size: 12px; + margin-bottom: 5px; +} +.l-content .io-log2 > div > div:before { + content: ''; + position: absolute; + height: 100%; + width: 7px; + border-radius: 10px; + border: solid 1px #dee5e8; + background: #fff; + left: -20px; +} +.l-content .io-log2 > div > div:nth-child(2n):before { + border: solid 1px #27c54e; +} +.l-content .io-log2 > div > div:nth-child(3n):before { + border: solid 1px #27bbc5; +} +.l-content .io-log2 > div > div:nth-child(4n):before { + border: solid 1px #275bc5; +} +.l-content .io-log2 > div > div:nth-child(5n):before { + border: solid 1px #ffcc00; +} + + +#tooltip { + background-color: #34b5dd; +} +.l-sort__create-btn.edit:hover #tooltip { + background-color: #49c8ef; +} +.l-sort__create-btn.edit:active #tooltip { + background-color: #00d8ff !important; +} +.l-sort__create-btn:active #tooltip { + background-color: #00d8ff; +} +.body-login, .body-reset { + background-color: #f0f3f5; +} +.body-login .login, .body-reset .login { + font-family: Arial, Helvetica, sans-serif; + border: 1px solid #e7ecee; + border-radius: 10px; + overflow: hidden; + position: relative; + padding: 35px 35px 10px 35px; + display: block; + width: 420px; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(0, 0, 0, 0.05); +} +.body-login .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(1), .body-reset .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(1) { + position: absolute; + text-align: center; + width: calc(100% - 46px); +} +/* +.body-login .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(1) a, .body-reset .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(1) a { + background-image: url(/images/sprite.png?1446554103); + background-position: -65px -182px; + background-repeat: no-repeat; + display: inline-block; + height: 40px; + margin-top: 0; + width: 80px; + margin-left: 0; + background-size: 235px 325px; + position: relative; +} +*/ +/* +.body-login .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(1) a img, .body-reset .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(1) a img { + display: none; +} +*/ +.body-login .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2), .body-reset .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2) { + position: relative; + padding: 65px 0 0 0 !important; +} +.body-login .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2) .vst-input, .body-reset .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2) .vst-input { + padding: 5px 10px; + margin: 0; + width: 320px !important; + margin-top: 7px; + border-radius: 3px; + border: solid 1px #d3d9e2; +} +.body-login .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2) .button, .body-reset .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2) .button, .body-login .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2) .button:hover, .body-reset .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2) .button:hover, .body-login .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2) .button:active, .body-reset .login > tbody > tr > td > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2) .button:active { + width: 100% !important; + border: 1px solid #27c54e; + background-color: #27c54e; + color: #f4f3f9; + margin-bottom: 20px; +} +.body-login .login > tbody > tr > td > table > tbody > tr:nth-of-type(2) .login-bottom, .body-reset .login > tbody > tr > td > table > tbody > tr:nth-of-type(2) .login-bottom { + width: auto; + text-align: center; + padding-bottom: unset; + padding: 0; +} +.body-login .login-box .vst-advanced, .body-reset .login-box .vst-advanced { + color: #34b5dd; +} +.body-web-log .l-header > .l-center { + margin-left: 0; +} +.l-stat__col span { + padding: 4px 0; + font-size: 15px; + position: fixed; + display: inline-block; + left: 159px; +} +.l-sort__create-btn2 { + background-image: url("/images/sprite.png?1446554103"); + background-position: -331px -107px; + background-repeat: no-repeat; + display: inline-block; + height: 45px; + width: 45px; +} +/* +.ui-resizable-handle { + background-color: #333 !important; +} +*/ +/* +div.ui-dialog div { + background-color: #333 !important; +} +*/ +div.ui-dialog > div { + background-color: #333 !important; +} +div.ui-dialog > div div { + background-color: #333 !important; +} +/* +div.ui-dialog > div > div { + background-color: #333 !important; +} +div.ui-dialog + div { + background-color: #333 !important; +} +div.ui-dialog + div div{ + background-color: #333 !important; +} +*/ +/* +.ui-dialog-titlebar { + background-color: #333 !important; +} +.ui-dialog-buttonpane { + background-color: #333 !important; +} +*/ diff --git a/web/css/styles.fix.css.map b/web/css/styles.fix.css.map new file mode 100644 index 00000000..c6718a78 --- /dev/null +++ b/web/css/styles.fix.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["styles.fix.scss"],"names":[],"mappings":";AAAA;EACI;EACA;EACA;;;AAMJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAOJ;EACI;EACA;EACA;EACA;;AAOJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACI;EACA;;AAEA;EACI;;AAMR;EACI;;AAEA;EACI;AACA;EACA;EACA;EACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAII;EACI;EACA;EACA;;AAEA;EACI;;AAEJ;EACI;;AAMJ;EACI;EACA;EACA;EACA;EACA;;AAQZ;EACI;;AAEA;EACI;;AAIR;EACI;;AAGJ;EACI;;AAKZ;EACI;;;AAQR;EACI;EACA;;AAEA;EACI;;AAEA;EACI;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EAyCA;EAEA;AAAwB;EACxB;AAAgC;AAEhC;AAMA;AAKA;;AAVA;EACI;EACA;;AAIJ;EACI;;AAIJ;EACI;;AAIJ;AACI;;AACA;EACI;;AAKR;EAEI;EAKA;EACA;EACA;EACA;EACA;EAGA;EACA;;AAIJ;EACI;;AAEA;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAQZ;EACI;EACA;;AAII;EACI;;AAEA;EACI;;AAMZ;EACI;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EAEI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;EAEA;EACA;EACA;EAEA;;AA8BA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;EAEA;EACA;EACA;EAEA;;AAIR;EACI;EACA;EACA;EACA;;AASR;EACI;;AAKA;EACI;;AAEJ;EAEI;;AAEJ;EACI;;AAQR;EACI;;AAKA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAQR;EACI;;AAKA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAQR;EACI;;AAKA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAQR;EACI;;AAKA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAQR;EACI;;AAKA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAQR;EACI;;AAKA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAWxB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAcJ;EACI;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;;AAiBgB;EACI;EACA;;AAGJ;EACI;;AAqCZ;EACI;;AAmBxB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEI;;AAOI;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAUR;EACI;;AAQZ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOJ;EACI;;AAYZ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAQR;EACI;;AAEA;EACI;;AAGR;EACI;EAEA;;AAEA;EACI;;AAGR;EACI;EACA;;AAEA;EACI;;AAGR;EACI;;AAEA;EACI;;AAGR;EACI;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAII;EACA;EACA;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKZ;EACI;EACA;EACA;;AAEJ;EACI;EACA;;AAEA;EACI;;AAUJ;EACI;EACA;EACA;EACA;;AA0BR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;EAQA;EAEA;AAAwB;AAExB;AAKA;AAKA;AAMA;;AAfA;EACI;;AAIJ;EACI;;AAIJ;EACI;EACA;;AAIJ;EACI;EACA;;AAGJ;EACI;;AAIJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAKR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIA;EACI;;AAKJ;EACI;;AAKJ;EACI;;AAKJ;EACI;;;AA8CxB;EACI;;;AAGJ;EACI;;;AAEJ;EACI;;;AAGJ;EACI;;;AAIJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAQwB;EACI;EACA;EACA;;AAEA;EACI;EACA;AACA;EACA;EACA;EACA;EACA;EACA;AACA;EACA;EACA;EACA;;AAEA;EACI;;AAIZ;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAKR;EACI;EACA;EACA;EACA;;AAUhC;EACI;;;AAMJ;EACI","file":"styles.fix.css"} \ No newline at end of file diff --git a/web/css/styles.min.css b/web/css/styles.min.css index edc706d5..5f63b030 100644 --- a/web/css/styles.min.css +++ b/web/css/styles.min.css @@ -149,20 +149,20 @@ * `em` units. */ html { - font-family: sans-serif; - /* 1 */ - -ms-text-size-adjust: 100%; - /* 2 */ - -webkit-text-size-adjust: 100%; - /* 2 */ + font-family: sans-serif; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ } /** * Remove default margin. */ body { - margin: 0; - background-color: #fff; + margin: 0; + background-color: #fff; } /* HTML5 display definitions @@ -173,34 +173,19 @@ body { * and Firefox. * Correct `block` display not defined for `main` in IE 11. */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; +article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { + display: block; } /** * 1. Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. */ -audio, -canvas, -progress, -video { - display: inline-block; - /* 1 */ - vertical-align: baseline; - /* 2 */ +audio, canvas, progress, video { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ } /** @@ -208,61 +193,55 @@ video { * Remove excess height in iOS 5 devices. */ audio:not([controls]) { - display: none; - height: 0; + display: none; + height: 0; } /** * Address `[hidden]` styling not present in IE 8/9/10. * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. */ -[hidden], -template { - display: none; +[hidden], template, .hidden { + display: none; } -.hidden { - display: none; -} /* Links ========================================================================== */ /** * Remove the gray background color from active links in IE 10. */ a { - background-color: transparent; + background-color: transparent; +} +a:active, a:hover { + outline: 0; } /** * Improve readability when focused and also mouse hovered in all browsers. */ -a:active, a:hover { - outline: 0; -} - /* Text-level semantics ========================================================================== */ /** * Address styling not present in IE 8/9/10/11, Safari, and Chrome. */ abbr[title] { - border-bottom: 1px dotted; + border-bottom: 1px dotted; } /** * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. */ -b, -strong { - font-weight: bold; - color: #5f5f5f; +b, strong { + font-weight: bold; + color: #5f5f5f; } /** * Address styling not present in Safari and Chrome. */ dfn { - font-style: italic; + font-style: italic; } /** @@ -270,42 +249,45 @@ dfn { * contexts in Firefox 4+, Safari, and Chrome. */ h1 { - font-size: 2em; - margin: 0.67em 0; + font-size: 2em; + margin: 0.67em 0; } /** * Addresses styling not present in IE 8/9. */ mark { - background: #ff0; - color: #000; + background: #ff0; + color: #000; } /** * Address inconsistent and variable font size in all browsers. */ small { - font-size: 80%; + font-size: 80%; } /** * Prevent `sub` and `sup` affecting `line-height` in all browsers. */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; +sub { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } sup { - top: -0.5em; + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + top: -0.5em; } sub { - bottom: -0.25em; + bottom: -0.25em; } /* Embedded content @@ -315,14 +297,14 @@ sub { * 2. Improves image quality when scaled in IE 7. */ img { - border: 0; + border: 0; } /** * Correct overflow not hidden in IE 9/10/11. */ svg:not(:root) { - overflow: hidden; + overflow: hidden; } /* Grouping content @@ -331,34 +313,31 @@ svg:not(:root) { * Address margin not present in IE 8/9 and Safari. */ figure { - margin: 1em 40px; + margin: 1em 40px; } /** * Address differences between Firefox and other browsers. */ hr { - box-sizing: content-box; - height: 0; + box-sizing: content-box; + height: 0; } /** * Contain overflow in all browsers. */ pre { - overflow: auto; + overflow: auto; } /** * Address odd `em`-unit font size rendering in all browsers. * Correct font family set oddly in IE 6, Safari 4/5, and Chrome. */ -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; +code, kbd, pre, samp { + font-family: monospace, monospace; + font-size: 1em; } /* Forms @@ -374,24 +353,23 @@ samp { * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. * 4. Improves appearance and consistency in all browsers. */ -button, -input, -optgroup, -select, -textarea { - color: inherit; - /* 1 */ - font: inherit; - /* 2 */ - margin: 0; - /* 3 */ +button, input, optgroup, select, textarea { + color: inherit; + /* 1 */ + font: inherit; + /* 2 */ + margin: 0; + /* 3 */ } /** * Address `overflow` set to `hidden` in IE 8/9/10/11. */ button { - overflow: visible; + overflow: visible; + text-transform: none; + /*color: transparent !important;*/ + text-shadow: 0 0 0 #555 !important; } /** @@ -400,11 +378,10 @@ button { * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. * Correct `select` style inheritance in Firefox. */ -button, select { - text-transform: none; - /*color: transparent !important;*/ - text-shadow: 0 0 0 #555 !important; + text-transform: none; + /*color: transparent !important;*/ + text-shadow: 0 0 0 #555 !important; } /** @@ -416,93 +393,92 @@ select { * 4. Removes inner spacing in IE 7 without affecting normal text inputs. * Known issue: inner spacing remains in IE 6. */ -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - /* 2 */ - cursor: pointer; - /* 3 */ +button, html input[type=button] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ +} + +input[type=reset], input[type=submit] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ } /** * Re-set default cursor for disabled elements. */ -button[disabled], -html input[disabled] { - cursor: default; +button[disabled], html input[disabled] { + cursor: default; } /** * Remove inner padding and border in Firefox 4+. */ -button::-moz-focus-inner, +button::-moz-focus-inner { + border: 0; + padding: 0; +} + +input { + line-height: normal; +} input::-moz-focus-inner { - border: 0; - padding: 0; + border: 0; + padding: 0; +} +input[type=checkbox], input[type=radio] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} +input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { + height: auto; +} +input[type=search] { + -webkit-appearance: textfield; + /* 1 */ + /* 2 */ + box-sizing: content-box; +} +input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration { + -webkit-appearance: none; } /** * Address Firefox 4+ setting `line-height` on `input` using `!important` in * the UA stylesheet. */ -input { - line-height: normal; -} - /** * 1. Address box sizing set to `content-box` in IE 8/9/10. * 2. Remove excess padding in IE 8/9/10. * Known issue: excess padding remains in IE 6. */ -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ -} - /** * Fix the cursor style for Chrome's increment/decrement buttons. For certain * `font-size` values of the `input`, it causes the cursor style of the * decrement button to change from `default` to `text`. */ -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - /** * 1. Address `appearance` set to `searchfield` in Safari and Chrome. * 2. Address `box-sizing` set to `border-box` in Safari and Chrome * (include `-moz` to future-proof). */ -input[type="search"] { - -webkit-appearance: textfield; - /* 1 */ - /* 2 */ - box-sizing: content-box; -} - /** * Remove inner padding and search cancel button in Safari and Chrome on OS X. * Safari (but not Chrome) clips the cancel button when the search input has * padding (and `textfield` appearance). */ -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - /** * Define consistent border, margin, and padding. */ fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } /** @@ -512,17 +488,17 @@ fieldset { * 4. Corrects alignment displayed oddly in IE 6/7. */ legend { - border: 0; - /* 1 */ - padding: 0; - /* 2 */ + border: 0; + /* 1 */ + padding: 0; + /* 2 */ } /** * Remove default vertical scrollbar in IE 8/9/10/11. */ textarea { - overflow: auto; + overflow: auto; } /** @@ -530,7 +506,7 @@ textarea { * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. */ optgroup { - font-weight: bold; + font-weight: bold; } /* Tables @@ -539,2249 +515,2248 @@ optgroup { * Remove most spacing between table cells. */ table { - border-collapse: collapse; - border-spacing: 0; + border-collapse: collapse; + border-spacing: 0; } -td, -th { - padding: 0; +td, th { + padding: 0; } * { - -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; } body { -/* -webkit-touch-callout: none; - -webkit-text-size-adjust: none; - -webkit-user-select: none; */ + /* -webkit-touch-callout: none; + -webkit-text-size-adjust: none; + -webkit-user-select: none; */ } -html, -input, -textarea, -select, -button { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +html, input, textarea, select, button { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } html { - height: 100%; + height: 100%; } body { - font-family: arial; - overflow-x: hidden; - font-size: 14px; - height: 100%; - color: #929292; + font-family: arial; + overflow-x: hidden; + font-size: 14px; + height: 100%; + color: #929292; } .body-login, .body-reset { - height: auto; - padding-top: 10%; - /*background: url(/images/edit_bg.png);*/ - background-color: #eee; + height: auto; + padding-top: 10%; + /*background: url(/images/edit_bg.png);*/ + background-color: #eee; } a { - text-decoration: none; - color: #929292; + text-decoration: none; + color: #929292; } .disabled { - text-decoration: line-through; + text-decoration: line-through; } -.clearfix:before, -.clearfix:after { - content: ''; - display: table; +.clearfix:before { + content: ""; + display: table; } - .clearfix:after { - clear: both; + content: ""; + display: table; + clear: both; } .text-right { - text-align: right; + text-align: right; } .text-center { - text-align: center; + text-align: center; } .check-label { - display: inline-block; - cursor: pointer; - position: relative; - line-height: 16px; - padding-left: 26px; + display: inline-block; + cursor: pointer; + position: relative; + line-height: 16px; + padding-left: 26px; } - .check-label:before { - content: ''; - width: 16px; - height: 16px; - position: absolute; - left: 0; - top: 0; - display: inline-block; - background-image: url("/images/sprite.png?1446554103"); - background-size: 450px auto; - background-repeat: no-repeat; - background-position: -232px -9px; - z-index: 99; + content: ""; + width: 16px; + height: 16px; + position: absolute; + left: 0; + top: 0; + display: inline-block; + background-image: url("/images/sprite.png?1446554103"); + background-size: 450px auto; + background-repeat: no-repeat; + background-position: -232px -9px; + z-index: 99; } -input[type="checkbox"] { - display: none; +input[type=checkbox] { + display: none; } -.clicked-on.check-label:before, -.selected .check-label:before { - content: ''; - display: inline-block; - width: 27px; - height: 27px; - background-position: -225px -42px; - left: -6px; - top: -6px; + +.clicked-on.check-label:before, .selected .check-label:before { + content: ""; + display: inline-block; + width: 27px; + height: 27px; + background-position: -225px -42px; + left: -6px; + top: -6px; } .l-center { - margin: 0 auto; - max-width: 998px; + margin: 0 auto; + max-width: 998px; } .l-logo { - background-image: url("/images/sprite.png?1446554103"); - background-position: -117px -7px; -/* background-position: -125px -478px; */ - background-repeat: no-repeat; - display: inline-block; - float: left; - height: 22px; - margin-top: 4px; - width: 73px; -/* width: 42px; */ - margin-left: -2px; + background-image: url("/images/sprite.png?1446554103"); + background-position: -117px -7px; + /* background-position: -125px -478px; */ + background-repeat: no-repeat; + display: inline-block; + float: left; + height: 22px; + margin-top: 4px; + width: 73px; + /* width: 42px; */ + margin-left: -2px; } .l-header { - background-color: #5d5d5d; - overflow: hidden; - margin-bottom: 28px; - position: fixed; - width: 100%; - z-index: 100; - height: 34px + background-color: #5d5d5d; + overflow: hidden; + margin-bottom: 28px; + position: fixed; + width: 100%; + z-index: 100; + height: 34px; } .l-header a { - font-size: 12px; -} - -.l-menu__item--active { - //background-color: #fff; + font-size: 12px; } .l-menu__item.l-menu__item--active a { - color: #ff6701; - font-size: 10px; - font-weight: bold; - text-transform: uppercase; - background-color: #fff; + color: #9c8cff; + font-size: 10px; + font-weight: bold; + text-transform: uppercase; + background-color: #fff; } .l-menu { - float: left; - position: fixed; - margin-left: 70px; + float: left; + position: fixed; + margin-left: 70px; } + .l-menu__item { - float: left; + float: left; } .l-menu__item a { - color: #f7f7f7; - position: relative; - line-height: 34px; - padding: 11px 18px; + color: #f7f7f7; + position: relative; + line-height: 34px; + padding: 11px 18px; } .l-menu__item a:hover { - background-color: #f79b44; - color: #fff; + background-color: #f79b44; + color: #fff; } .l-menu__item a:active { - color: #fff; - background-color: #ff6701; + color: #fff; + background-color: #9c8cff; } .l-menu.active .l-menu__item.focus a { - text-decoration: underline; - color: #5edad0; + text-decoration: underline; + color: #5edad0; } .l-menu.active .l-menu__item.focus a:hover { - background-color: #f79b44; - color: #fff; + background-color: #f79b44; + color: #fff; } +.lang-ua .l-menu__item a, .lang-nl .l-menu__item a, .lang-fr .l-menu__item a, .lang-ru .l-menu__item a { + padding: 11px 18px; +} -.lang-ua .l-menu__item a, -.lang-nl .l-menu__item a, -.lang-fr .l-menu__item a, -.lang-ru .l-menu__item a { - padding: 11px 18px; -} -.lang-el .l-menu__item a, -.lang-tr .l-menu__item a { - padding: 11px 15px; +.lang-el .l-menu__item a, .lang-tr .l-menu__item a { + padding: 11px 15px; } + .lang-ar .l-menu__item a { - padding: 11px 11px; -} -.lang-ar .l-menu__item a { - line-height: 35px; + padding: 11px 11px; + line-height: 35px; } .lang-de .l-menu__item a { - padding: 11px 12px; + padding: 11px 12px; } .lang-tw .l-menu__item a { - padding: 13px 18px; + padding: 13px 18px; } .l-profile { - overflow: hidden; - float: right; + overflow: hidden; + float: right; } + .l-profile__username { - float: left; - color: #a4abad; - font-weight: 700; - padding: 10px 0 0 10px; - margin-right: 12px; + float: left; + color: #a4abad; + font-weight: 700; + padding: 10px 0 0 10px; + margin-right: 12px; } .l-profile__username:hover { - color: #ffd62e; + color: #ffd62e; } .l-profile__username:active { - color: #f79b44; + color: #f79b44; } - .l-profile__logout { - float: left; - color: #fff; -/* margin-left: 40px; */ - padding: 10px 0 0 10px; + float: left; + color: #fff; + /* margin-left: 40px; */ + padding: 10px 0 0 10px; } .l-profile__logout:hover { - color: #C0E60E; + color: #C0E60E; } .l-profile__logout:active { - color: #ffd62e; + color: #ffd62e; } -.lang-cn .l-profile__logout { - padding: 8px 5px; -} -.lang-tw .l-profile__logout { - padding: 8px 5px; + +.lang-cn .l-profile__logout, .lang-tw .l-profile__logout { + padding: 8px 5px; } .l-profile__notifications { - background: url("/images/sprite.png?1446554103") no-repeat scroll -129px -135px; - border-radius: 30px; - color: #fff; - cursor: pointer; - float: left; - font-weight: bold; - height: 15px; - margin-right: 4px; - margin-top: 5px; - padding: 10px 5px 0; - width: 15px; + background: url("/images/sprite.png?1446554103") no-repeat scroll -129px -135px; + border-radius: 30px; + color: #fff; + cursor: pointer; + float: left; + font-weight: bold; + height: 15px; + margin-right: 4px; + margin-top: 5px; + padding: 10px 5px 0; + width: 15px; } .l-profile__notifications.active { - background-color: #454545; + background-color: #454545; } .l-profile__notifications:hover { - background-color: #333; + background-color: #333; } .l-profile__notifications:active { - background-color: #c4da5e; + background-color: #c4da5e; } .l-profile__notifications.updates { - background-position: -202px -135px; + background-position: -202px -135px; } .notification-container { - background-color: #454545; - box-shadow: 0 2px 7px 0 rgba(0, 0, 0, 0.3); - list-style-type: none; - margin: 0; - overflow: hidden; - padding-left: 0; - position: fixed; - top: 34px; - width: 351px; - z-index: 200; - font-size: 12px; - padding: 0; - color: #7f7f7f; + background-color: #454545; + box-shadow: 0 2px 7px 0 rgba(0, 0, 0, 0.3); + list-style-type: none; + margin: 0; + overflow: hidden; + padding-left: 0; + position: fixed; + top: 34px; + width: 351px; + z-index: 200; + font-size: 12px; + padding: 0; + color: #7f7f7f; } .notification-container .unseen { - color: #ABABAB; + color: #ABABAB; } - - .notification-container li { - border-bottom: 1px solid #555; - padding: 10px 15px 24px; + border-bottom: 1px solid #555; + padding: 10px 15px 24px; } .notification-container .mark-seen { - background-color: #abc04b; - border: 2px solid #454545; - border-radius: 10px; - cursor: pointer; - display: none; - float: right; - height: 7px; - margin-right: -5px; - margin-top: 0; - width: 7px; + background-color: #abc04b; + border: 2px solid #454545; + border-radius: 10px; + cursor: pointer; + display: none; + float: right; + height: 7px; + margin-right: -5px; + margin-top: 0; + width: 7px; } .notification-container .mark-seen:hover { - background-color: #333; - border-color: #abc04b; + background-color: #333; + border-color: #abc04b; } .notification-container .mark-seen:active { - background-color: #777; - border-color: #777; + background-color: #777; + border-color: #777; } -.notification-container .unseen .mark-seen{ - display: inline-block; +.notification-container .unseen .mark-seen { + display: inline-block; } .notification-container .title { - color: #9e9e9e; - font-weight: bold; - line-height: 30px; - padding: 0; - text-transform: none; - float: none; - display: block; + color: #9e9e9e; + font-weight: bold; + line-height: 30px; + padding: 0; + text-transform: none; + float: none; + display: block; } .notification-container .title a { - color: #9e9e9e; + color: #9e9e9e; } - -.notification-container .unseen .title a, .notification-container .unseen .title { - color: #C4DA5E; + color: #C4DA5E; +} +.notification-container .unseen .title a { + color: #C4DA5E; } .notification-container .unseen .title a:hover { - color: #ffcc00; + color: #ffcc00; } .notification-container .unseen .title a:active { - color: #dacf2e; + color: #dacf2e; } - .notification-container a { - color: #5ABDB5;/* #eee;*/ + color: #5ABDB5; + /* #eee;*/ } .notification-container a:hover { - color: #2CA99B; + color: #2CA99B; } .notification-container a:active { - color: #00C0C0; + color: #00C0C0; } - .notification-container .icon { - display: inline-block; - width: 0; + display: inline-block; + width: 0; } .notification-container .icon.filemanager { - display: inline-block; - width: 22px; - background: url("/images/flat_icons.png") repeat scroll -31px -100px; + display: inline-block; + width: 22px; + background: url("/images/flat_icons.png") repeat scroll -31px -100px; } .notification-container .icon.starred { - display: inline-block; - width: 21px; - background: url("/images/sprite.png?1446554103") repeat scroll -184px 556px; + display: inline-block; + width: 21px; + background: url("/images/sprite.png?1446554103") repeat scroll -184px 556px; } - - .l-stat { - margin: 0 auto; - margin: 34px auto; - position: fixed; - background-color: #fff; - z-index: 100; - padding-top: 30px; - width: 100%; - overflow: hidden; + margin: 0 auto; + margin: 34px auto; + position: fixed; + background-color: #fff; + z-index: 100; + padding-top: 30px; + width: 100%; + overflow: hidden; } + .l-stat__col { - display: block; - vertical-align: top; - float: left; + display: block; + vertical-align: top; + float: left; } .l-stat__col a { - display: inline-block; - padding-bottom: 36px; - min-height: 111px; - width: 138px; - border-bottom: 3px solid #fff; - overflow: hidden; - background-color: #fff; - padding-top: 3px; - margin-top: -3px; - padding-left: 5px; + display: inline-block; + padding-bottom: 36px; + min-height: 111px; + width: 138px; + border-bottom: 3px solid #fff; + overflow: hidden; + background-color: #fff; + padding-top: 3px; + margin-top: -3px; + padding-left: 5px; } .l-stat__col a:hover { - border-bottom: 3px solid #ff8e61; + border-bottom: 3px solid #ff8e61; } .l-stat__col a:active { - border-bottom: 3px solid #f72b44; + border-bottom: 3px solid #796cc7; } + .l-stat__col--active a { - border-bottom: 3px solid #ff6e42; + border-bottom: 3px solid #ff6e42; } .l-stat.active .l-stat__col.focus a { - border-bottom: 3px solid #5edad0; + border-bottom: 3px solid #5edad0; } .l-stat.active .l-stat__col.focus a .l-stat__col-title { - color: #36B3A9; + color: #36B3A9; } - - .l-stat__col a:hover .l-stat__col-title { - color: #ff6701; + color: #9c8cff; } .l-stat__col a:active .l-stat__col-title { - color: #f72b44; + color: #796cc7; } - - .l-stat__col ul { - list-style-type: none; - font-size: 12px; - padding-left: 0; + list-style-type: none; + font-size: 12px; + padding-left: 0; } .l-stat__col li { - color: #a0a0a0; - margin-bottom: 8px; - text-transform: lowercase; + color: #a0a0a0; + margin-bottom: 8px; + text-transform: lowercase; } .l-stat__col span { - padding-left: 15px; -} -.l-stat__col-title { - text-transform: uppercase; - font-weight: 700; - color: #212134; - min-height: 21px; -} -.l-stat__col--active .l-stat__col-title { - color: #ff6701; - font-size: 24px; - margin-top: -7px; - letter-spacing: -1px; - margin-right: -8px; + padding-left: 15px; +} + +.l-stat__col-title { + text-transform: uppercase; + font-weight: 700; + color: #212134; + min-height: 21px; +} + +.l-stat__col--active .l-stat__col-title { + color: #9c8cff; + font-size: 24px; + margin-top: -7px; + letter-spacing: -1px; + margin-right: -8px; } -.l-separator.selected, .l-separator { - height: 1px; - background-color: #ddd; + height: 1px; + background-color: #ddd; +} +.l-separator.selected { + height: 1px; + background-color: #ddd; } div.l-content > div.l-separator:nth-of-type(2) { - margin-top: 214px; - width: 100%; - position: fixed; - z-index: 120; + margin-top: 214px; + width: 100%; + position: fixed; + z-index: 120; } - div.l-content > div.l-separator:nth-of-type(4) { - margin-top: 259px; - width: 100%; - position: fixed; - z-index: 100; + margin-top: 259px; + width: 100%; + position: fixed; + z-index: 100; } .l-sort { - position: fixed; - width: 998px; - background-color: #fff; - z-index: 110; - margin-top: 215px; + position: fixed; + width: 998px; + background-color: #fff; + z-index: 110; + margin-top: 215px; } + .l-sort__create-btn { - background-image: url("/images/sprite.png?1446554103"); - background-position: -331px -107px; - background-repeat: no-repeat; - bottom: -23px; - display: inline-block; - height: 45px; - left: 30px; - position: absolute; - width: 45px; - z-index: 3; + background-image: url("/images/sprite.png?1446554103"); + background-position: -331px -107px; + background-repeat: no-repeat; + bottom: -23px; + display: inline-block; + height: 45px; + left: 30px; + position: absolute; + width: 45px; + z-index: 3; } .l-sort__create-btn:hover { - background-position: -378px -107px; + background-position: -378px -107px; } .l-sort__create-btn:active { - background-position: -425px -107px; + background-position: -425px -107px; } + .l-sort__create-btn--active { - background-position: -425px -107px; + background-position: -425px -107px; } .l-sort__create-btn.restore { - background-position: -331px -250px; - bottom: -22px; + background-position: -331px -250px; + bottom: -22px; } -.l-sort__create-btn.restore:hover { - background-position: -331px -250px; +.l-sort__create-btn.restore:hover, .l-sort__create-btn.restore:active { + background-position: -331px -250px; } -.l-sort__create-btn.restore:active { - background-position: -331px -250px; -} - .l-sort__create-btn.edit { - background-position: -331px -154px; - bottom: -22px; + background-position: -331px -154px; + bottom: -22px; } .l-sort__create-btn.edit:hover { - background-position: -378px -154px; + background-position: -378px -154px; } .l-sort__create-btn.edit:active { - background-position: -425px -154px; + background-position: -425px -154px; } .context-menu.sort-order { - display: inline-block; - position: absolute; - z-index: 3; - left: 397px; - margin: 0; - overflow: hidden; - top: 42px; - width: 201px; - background-color: #5c5c5c; - list-style-type: none; - padding-left: 0; - box-shadow: 0 2px 7px 0 rgba(0, 0, 0, 0.3); + display: inline-block; + position: absolute; + z-index: 3; + left: 397px; + margin: 0; + overflow: hidden; + top: 42px; + width: 201px; + background-color: #5c5c5c; + list-style-type: none; + padding-left: 0; + box-shadow: 0 2px 7px 0 rgba(0, 0, 0, 0.3); } .context-menu.sort-order li { - padding: 0; + padding: 0; } .context-menu li { - border-bottom: 1px solid #777; - color: #fff; - cursor: pointer; - font-size: 12px; - padding: 12px; + border-bottom: 1px solid #777; + color: #fff; + cursor: pointer; + font-size: 12px; + padding: 12px; } .context-menu.sort-order span.name { - background: url("/images/sprite.png?1446554103") no-repeat scroll -292px -361px rgba(0, 0, 0, 0); - display: inline-block; - padding: 12px 28px 12px 12px; - width: 117px; - text-transform: uppercase; - font-weight: bold; + background: url("/images/sprite.png?1446554103") no-repeat scroll -292px -361px rgba(0, 0, 0, 0); + display: inline-block; + padding: 12px 28px 12px 12px; + width: 117px; + text-transform: uppercase; + font-weight: bold; } .context-menu.sort-order span.up { - background: url("/images/sprite.png?1446554103") no-repeat scroll -434px -417px rgba(0, 0, 0, 0); - display: inline-block; - padding: 12px 14px; - width: 16px; + background: url("/images/sprite.png?1446554103") no-repeat scroll -434px -417px rgba(0, 0, 0, 0); + display: inline-block; + padding: 12px 14px; + width: 16px; } .context-menu.sort-order span.active { - background-color: #FFD437; - color: #555; + background-color: #FFD437; + color: #555; } .context-menu.sort-order span:hover { - background-color: #777; - color: #fff; + background-color: #777; + color: #fff; } .context-menu.sort-order span:active { - background-color: #ffcc00; + background-color: #ffcc00; } - - - .l-sort-toolbar { - float: right; - padding: 7px 0 7px 0; - width: 100%; + float: right; + padding: 7px 0 7px 0; + width: 100%; } -.l-sort-toolbar table{ - float: right; +.l-sort-toolbar table { + float: right; } - .l-sort-toolbar td.toggle-all { - padding-top: 7px; - padding-right: 20px; + padding-top: 7px; + padding-right: 20px; } - .l-sort-toolbar .sort-by { - cursor: pointer; - padding-top: 7px; - padding-left: 40px; + cursor: pointer; + padding-top: 7px; + padding-left: 40px; } .l-sort-toolbar .sort-by:hover { - color: #555; + color: #555; } .l-sort-toolbar .sort-by:hover b { - color: #555; + color: #555; } .l-sort-toolbar .sort-by:active { - color: #55c9c0; + color: #23b7e5; } .l-sort-toolbar .sort-by:active b { - color: #55c9c0; + color: #23b7e5; } - .l-sort-toolbar .sort-by b { - text-transform: uppercase; - padding-left: 3px; - font-size: 12px; + text-transform: uppercase; + padding-left: 3px; + font-size: 12px; } - .l-sort-toolbar .toggle-all:hover { - color: #555; + color: #555; } .l-sort-toolbar .toggle-all:active { - color: #55c9c0; + color: #23b7e5; } - .l-sort-toolbar .l-select { - float: left; + float: left; } .l-sort-toolbar td { - vertical-align: middle; + vertical-align: middle; } - -.l-sort-toolbar.subtitle { - padding-left: 96px; +.l-sort-toolbar.subtitle { + padding-left: 96px; } - - .l-sort-toolbar td:first-of-type { - padding-left: 40px; + padding-left: 40px; } - - .l-sort-toolbar td.step-right:first-of-type { - padding-right: 20px; + padding-right: 20px; } - .l-sort-toolbar td:nth-of-type(2) { -/* /// padding-right: 60px;*/ - padding-right: 20px; + /* /// padding-right: 60px;*/ + padding-right: 20px; } .l-sort-toolbar td:last-of-type { -/* /// padding-left: 40px; */ + /* /// padding-left: 40px; */ } + .l-sort-toolbar__filter-apply { - float: left; - width: 30px; - height: 30px; - background-image: url("/images/sprite.png?1446554103"); - background-position: -333px -1px; - border: none; + float: left; + width: 30px; + height: 30px; + background-image: url("/images/sprite.png?1446554103"); + background-position: -333px -1px; + border: none; } .l-sort-toolbar__filter-apply:hover { - background-position: -368px -1px; - border-color: #afafac; + background-position: -368px -1px; + border-color: #afafac; } .l-sort-toolbar__filter-apply:active { - background-position: -404px -1px; - border-color: #afafac; + background-position: -404px -1px; + border-color: #afafac; } + .l-sort-toolbar__filter-apply--active { - background-position: -404px -1px; - border-color: #50bdb5; + background-position: -404px -1px; + border-color: #50bdb5; } .l-sort-toolbar__search { - float: left; - width: 25px; - height: 25px; - background-image: url("/images/sprite.png?1446554103"); - background-position: -333px -37px; - border: none; + float: left; + width: 25px; + height: 25px; + background-image: url("/images/sprite.png?1446554103"); + background-position: -333px -37px; + border: none; } .l-sort-toolbar__search:hover { - background-position: -368px -37px; - border-color: #afafac; + background-position: -368px -37px; + border-color: #afafac; } .l-sort-toolbar__search:active { - background-position: -404px -37px; - border-color: #50bdb5; + background-position: -404px -37px; + border-color: #50bdb5; } + .l-sort-toolbar__search--active { - background-position: -404px -37px; - border-color: #50bdb5; + background-position: -404px -37px; + border-color: #50bdb5; } + .l-sort-toolbar .vst { - padding: 0 12px; - color: #777; - text-transform: uppercase; - font-size: 11px; - font-weight: bold; - line-height: 30px; + padding: 0 12px; + color: #777; + text-transform: uppercase; + font-size: 11px; + font-weight: bold; + line-height: 30px; } .l-sort-toolbar .vst:hover { - color: #ff6701; + color: #9c8cff; } .l-sort-toolbar .vst:active { - color: #55C9C0; + color: #23b7e5; } .l-sort-toolbar .vst.selected { - color: #ff6701; -// color: #92af0b; + color: #9c8cff; } - - .l-select { - width: 178px; - height: 28px; - border: 1px solid #ddd; - border-radius: 0; - overflow-x: hidden; - position: relative; - display: inline-block; - border-style: solid none solid solid; + width: 178px; + height: 28px; + border: 1px solid #ddd; + border-radius: 0; + overflow-x: hidden; + position: relative; + display: inline-block; + border-style: solid none solid solid; } + .lang-ru .l-select { - width: 199px; + width: 199px; } .l-select:after { - pointer-events: none; - background-image: url("/images/sprite.png?1446554103"); - background-position: -245px -175px; - width: 7px; - height: 4px; - margin-top: -2px; - content: ''; - position: absolute; - right: 10px; - top: 50%; + pointer-events: none; + background-image: url("/images/sprite.png?1446554103"); + background-position: -245px -175px; + width: 7px; + height: 4px; + margin-top: -2px; + content: ""; + position: absolute; + right: 10px; + top: 50%; } .l-select select { - border: 0; - background-color: transparent; - line-height: 28px; - height: 28px; - min-width: 208px; - padding-left: 4px; - appearance:none; - -moz-appearance:none; - -webkit-appearance:none; - padding-left: 10px; + border: 0; + background-color: transparent; + line-height: 28px; + height: 28px; + min-width: 208px; + padding-left: 4px; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + padding-left: 10px; } .l-select select:focus { - border: 0; - outline: 0; + border: 0; + outline: 0; } + .lang-ru .l-select select { - min-width: 215px; + min-width: 215px; } + .l-select select option { - padding: 7px; + padding: 7px; } .l-unit { - color: #888; - padding: 0 0 0 15px; - overflow: hidden; - font-size: 13px; -} -.units .l-unit { - border-bottom: 1px solid #ddd; - border-left: 2px solid #fff; -} -.units .l-unit.l-unit--starred { - border-left: 2px solid #ff6701; -} -.units.active .l-unit.focus { - border-left: 2px solid #5edad0; -} -.units.active .l-unit.focus .l-unit__name { - color: #36b3a9; -} -.units.active .l-unit.focus .l-unit-toolbar__col--right { - display: block; + color: #888; + padding: 0 0 0 15px; + overflow: hidden; + font-size: 13px; } +.units .l-unit { + border-bottom: 1px solid #ddd; + border-left: 2px solid #fff; +} +.units .l-unit.l-unit--starred { + border-left: 2px solid #9c8cff; +} +.units.active .l-unit.focus { + border-left: 2px solid #5edad0; + background: #f4faff; +} +.units.active .l-unit.focus .l-unit__name { + color: #36b3a9; +} +.units.active .l-unit.focus .l-unit-toolbar__col--right { + display: block; +} .units > div:last-child { - border-bottom: none; + border-bottom: none; } .l-unit-ft { - color: #929292; - padding: 0 0 0 15px; + color: #929292; + padding: 0 0 0 15px; } .l-unit:hover .l-unit-toolbar__col--right { - display: block; + display: block; } + .l-unit--blue { - border-left: 2px solid #55c9c0; + border-left: 2px solid #23b7e5; } .l-unit--suspended { - background-color: #eaeaea; - color: #c0c0c0; + background-color: #eaeaea; + color: #c0c0c0; } - .units .l-unit.l-unit--outdated { - background-color: #ffcaca; - color: #555; - border-left: 5px solid #ff6f6f; - border-bottom: 1px solid #fff; + background-color: #ffcaca; + color: #555; + border-left: 5px solid #ff6f6f; + border-bottom: 1px solid #fff; } -.l-unit--suspended .l-unit__name, -.l-unit--suspended b, -.l-unit--outdated .l-unit__name, -.l-unit--outdated b { - color: #c0c0c0; +.l-unit--suspended .l-unit__name, .l-unit--suspended b { + color: #c0c0c0; } +.l-unit--outdated .l-unit__name, .l-unit--outdated b { + color: #c0c0c0; +} .l-unit--outdated .l-unit__name { - color: #333; + color: #333; } .l-unit--outdated b { - color: #555; + color: #555; } .l-unit--suspended .l-percent { - border-color: #fff; + border-color: #fff; } .l-unit--suspended .l-percent__fill { - background-color: #fff; + background-color: #fff; +} +.l-unit--suspended .l-unit__name { + color: #ADADAD; } -.l-unit--suspended .l-unit__name, .l-unit--suspended .l-unit__name span { - color: #ADADAD; + color: #ADADAD; } - -.l-unit--suspended.selected .l-unit__name, -.l-unit--suspended.selected .l-unit__name span { - color: #777; -} - .l-unit--suspended.selected { - background-color: #f2eab8 !important; - color: #b2ac87 !important; + background-color: #f2eab8 !important; + color: #b2ac87 !important; +} +.l-unit--suspended.selected .l-unit__name { + color: #777; +} +.l-unit--suspended.selected .l-unit__name span { + color: #777; } .l-unit--outdated.selected { - background: #765D5D !important; - color: #333 !important; + background: #765D5D !important; + color: #333 !important; } +.l-unit--suspended.selected .l-unit__name, .l-unit--suspended.selected b { + color: #333 !important; +} +.l-unit--outdated.selected .l-unit__name, .l-unit--outdated.selected b { + color: #333 !important; +} -.l-unit--suspended.selected .l-unit__name, -.l-unit--suspended.selected b, -.l-unit--outdated.selected .l-unit__name, -.l-unit--outdated.selected b, -.l-unit--suspended.selected .l-percent, -.l-unit--suspended.selected .l-percent__fill, -.l-unit--suspended.selected .l-unit__name, +.l-unit--suspended.selected .l-percent, .l-unit--suspended.selected .l-percent__fill { + color: #333 !important; +} +.l-unit--suspended.selected .l-unit__name { + color: #333 !important; +} .l-unit--suspended.selected .l-unit__name span { - color: #333 !important; + color: #333 !important; } .l-unit.selected .l-percent { - border-bottom: 1px dotted #777; + border-bottom: 1px dotted #777; } - .l-unit--selected { - background-color: #d1eddc; + background-color: #d1eddc; } -.l-unit-toolbar{ - height: 39px; + +.l-unit-toolbar { + height: 39px; } .l-unit label { - margin-bottom: 20px; + margin-bottom: 20px; } + .l-unit__columns { - display: table; - width: 100%; + display: table; + width: 100%; } + .l-unit__col { - display: table-cell; - padding-top: 1px; - vertical-align: top; + display: table-cell; + padding-top: 1px; + vertical-align: top; } + .l-unit__col--left { - width: 124px; - padding-right: 10px; + width: 124px; + padding-right: 10px; } + .units.compact .l-unit__col--left { - vertical-align: top; + vertical-align: top; } .l-unit__col--left.step-left { - padding-left: 30px; + padding-left: 30px; } .l-unit__col--right.total { - padding-left: 16px; + padding-left: 16px; } - .l-unit__col--right.back { - padding-left: 78px + padding-left: 78px; } .l-sort-toolbar .step-left { - padding-left: 40px; + padding-left: 40px; } + .step-right { - padding-right: 40px; + padding-right: 40px; } .l-unit__date { - font-size: 12px; - letter-spacing: 1px; - margin-top: 10px; - padding-bottom: 30px; + font-size: 12px; + letter-spacing: 1px; + margin-top: 10px; + padding-bottom: 30px; } .l-unit__suspended { - display: none; - font-size: 11px; - font-weight: bold; - letter-spacing: 3px; - margin-top: 36px; - text-transform: uppercase; - margin-bottom: 14px; + display: none; + font-size: 11px; + font-weight: bold; + letter-spacing: 3px; + margin-top: 36px; + text-transform: uppercase; + margin-bottom: 14px; } .units.compact .l-unit__suspended { - margin-top: 1px; + margin-top: 1px; } -.l-unit--outdated .l-unit__suspended, -.l-unit--suspended .l-unit__suspended { - display: block; +.l-unit--outdated .l-unit__suspended, .l-unit--suspended .l-unit__suspended { + display: block; +} + +.l-unit-ft .subtitle { + color: #9c8cff; + font-size: 12px; + font-weight: bold; + margin: 20px 0 18px 129px; + text-transform: uppercase; } -.l-unit-ft .subtitle, .l-unit .subtitle { - color: #ff6701; - font-size: 12px; - font-weight: bold; - margin: 20px 0 18px 129px; - text-transform: uppercase; + color: #9c8cff; + font-size: 12px; + font-weight: bold; + margin: 20px 0 18px 129px; + text-transform: uppercase; } - .l-unit.l-unit--outdated .l-unit__date { - color: #d24c4c; - font-size: 10px; - letter-spacing: 3px; - text-transform: uppercase; - font-weight: bold; + color: #d24c4c; + font-size: 10px; + letter-spacing: 3px; + text-transform: uppercase; + font-weight: bold; } .l-unit__name { - color: #111; - font-size: 32px; - margin-bottom: 10px; + color: #111; + font-size: 32px; + margin-bottom: 10px; } -.l-unit__stats.separate, + +.l-unit__stats.separate { + padding-bottom: 15px; +} + .l-unit__name.separate { - padding-bottom: 15px; + padding-bottom: 15px; } - .l-unit__name.small { - font-size: 19px; + font-size: 19px; } - .l-unit__name.small-2 { - font-size: 24px; + font-size: 24px; } - - .l-unit__name span { - color: #999; - margin-left: 30px; - font-size: 14px; - font-style: italic; + color: #999; + margin-left: 30px; + font-size: 14px; + font-style: italic; } .l-unit__name span:first-of-type { - margin-left: 39px; + margin-left: 39px; } .l-unit__name b { - font-weight: normal; - font-style: italic; + font-weight: normal; + font-style: italic; } .l-unit__ip { - margin-bottom: 26px; - font-size: 12px; - letter-spacing: 1px; + margin-bottom: 26px; + font-size: 12px; + letter-spacing: 1px; } .l-unit__ip span { - padding-left: 3px; - padding-right: 3px; + padding-left: 3px; + padding-right: 3px; } + .display-ip { - font-size: 12px; - letter-spacing: 1px; + font-size: 12px; + letter-spacing: 1px; } .display-ip span { - padding-left: 3px; - padding-right: 3px; + padding-left: 3px; + padding-right: 3px; } .l-unit__stats { - margin-bottom: 50px; + margin-bottom: 50px; } .l-unit__stats table { - width: 100%; - table-layout: fixed; + width: 100%; + table-layout: fixed; } .l-unit__stats td { - height: 22px; - padding-bottom: 3px; - vertical-align: top; + height: 22px; + padding-bottom: 3px; + vertical-align: top; } + .l-unit__stat-col--left { - float: left; - width: 124px; + float: left; + width: 124px; } .l-unit__stat-col--left.compact { - width: 70px; + width: 70px; } .l-unit__stat-col--left.compact-2 { - width: 95px; + width: 95px; } .l-unit__stat-col--left.wide { - width: 190px; + width: 190px; } .l-unit__stat-col--left.wide-2 { - width: 230px; + width: 230px; } .l-unit__stat-col--left.wide-3 { - width: 250px; + width: 250px; } .l-unit__stat-col--left.wide-4 { - width: 550px; + width: 550px; } - - .l-unit__stat-col--left.small-2 { - line-height: 11px; + line-height: 11px; } - .l-unit__stat-col--left.tiny { - font-size: 11px; + font-size: 11px; } - .l-unit__stat-col--left.tiny b { - font-size: 18px; + font-size: 18px; } - .l-unit__stat-col--right { - float: left; - max-width: 152px; + float: left; + max-width: 152px; } .l-unit-toolbar__col--left { - float: left; - margin-left: -15px; - margin-top: 0; - padding-bottom: 0px;/* 8px */ - padding-left: 15px; - padding-top: 15px; - width: 30px; - cursor: pointer; + float: left; + margin-left: -15px; + margin-top: 0; + padding-bottom: 0px; + /* 8px */ + padding-left: 15px; + padding-top: 15px; + width: 30px; + cursor: pointer; } .l-unit-toolbar__col--right { - float: right; - display: none; + float: right; + display: none; } body.mobile .l-unit-toolbar__col--right { - display: block; + display: block; } .l-unit-toolbar .shortcut { - display: none; + display: none; } .units.active .l-unit.focus .l-unit-toolbar .shortcut { - display: block; - background-color: #69a298; - border-radius: 13px; - color: #fff; - cursor: pointer; - display: block; - font-size: 12px; - font-weight: 700; - line-height: 25px; - padding-left: 7px; - padding-right: 9px; - position: absolute; - right: 3px; - top: 3px; + display: block; + background-color: #69a298; + border-radius: 13px; + color: #fff; + cursor: pointer; + display: block; + font-size: 12px; + font-weight: 700; + line-height: 25px; + padding-left: 7px; + padding-right: 9px; + position: absolute; + right: 3px; + top: 3px; } .units.active .l-unit.focus .l-unit-toolbar .shortcut.delete { - font-size: 10px; - padding-left: 2px; - padding-right: 5px; - text-transform: capitalize; + font-size: 10px; + padding-left: 2px; + padding-right: 5px; + text-transform: capitalize; } .units.active .l-unit.focus .l-unit-toolbar .shortcut.enter { - font-size: 17px; - padding-left: 1px; - padding-right: 7px; + font-size: 17px; + padding-left: 1px; + padding-right: 7px; } .units.active .l-unit.focus .l-unit-toolbar i { - background: none; + background: none; } .l-unit__stat-col.volume { - font-size: 12px; - line-height: 17px; - float: right; + font-size: 12px; + line-height: 17px; + float: right; } .actions-panel__col { - float: left; - min-width: 95px; - min-height: 31px; - text-transform: uppercase; - background-color: #dfdedd; - border-right: 1px solid #d8d7d7; - position: relative; + float: left; + min-width: 95px; + min-height: 31px; + text-transform: uppercase; + background-color: #dde6e9; + border-right: 1px solid #dde6e9; + position: relative; } + .selected .actions-panel__col { - -webkit-filter: contrast(80%); - filter: contrast(80%); + -webkit-filter: contrast(80%); + filter: contrast(80%); } + .actions-panel__col i { - background-image: url("/images/sprite.png?1446554103"); - background-repeat: no-repeat; - display: inline-block; - float: right; - content: ''; - width: 31px; - height: 31px; - position: absolute; - top: 0; - right: 0; + background-image: url("/images/sprite.png?1446554103"); + background-repeat: no-repeat; + display: inline-block; + float: right; + content: ""; + width: 31px; + height: 31px; + position: absolute; + top: 0; + right: 0; } .actions-panel__col a { - line-height: 31px; - color: #777; - font-weight: 700; - font-size: 12px; - padding-left: 13px; - display: block; - cursor: pointer; - position: relative; - padding-right: 36px; -} -.lang-ru .actions-panel__col a { - font-size: 11px; - padding-top: 1px; -} -.lang-tw .actions-panel__col a { - font-size: 15px; - font-weight: normal; - line-height: 29px; -} -.lang-ar .actions-panel__col a { - font-size: 15px; - font-weight: normal; - line-height: 31px; + line-height: 31px; + color: #777; + font-weight: 700; + font-size: 12px; + padding-left: 13px; + display: block; + cursor: pointer; + position: relative; + padding-right: 36px; } +.lang-ru .actions-panel__col a { + font-size: 11px; + padding-top: 1px; +} + +.lang-tw .actions-panel__col a { + font-size: 15px; + font-weight: normal; + line-height: 29px; +} + +.lang-ar .actions-panel__col a { + font-size: 15px; + font-weight: normal; + line-height: 31px; +} .actions-panel__favorite a { - background-color: #afafac; - color: #fff; + background-color: #afafac; + color: #fff; } .actions-panel__favorite i { - background-position: -39px -85px; + background-position: -39px -85px; } .actions-panel__edit i { - background-position: -1px -169px; + background-position: -1px -169px; } .actions-panel__edit:hover a { - background-color: #9fbf0c; - color: #fff; + background-color: #27c24c; + color: #fff; } .actions-panel__edit:active a { - background-color: #c0e60f; - color: #555; + background-color: #32f360; + color: #555; } .actions-panel__edit:hover a i { - background-position: -41px -169px; + background-position: -41px -169px; } .actions-panel__edit:active a i { - background-position: -81px -169px; + background-position: -81px -169px; } + .actions-panel__edit--active a { - background-color: #c0e60f; - color: #fff; + background-color: #32f360; + color: #fff; } .actions-panel__edit--active i { - background-position: -78px -169px; + background-position: -78px -169px; } .actions-panel__restart i { - background-position: -1px -520px; + background-position: -1px -520px; } .actions-panel__restart:hover a { - background-color: #9fbf0c; - color: #fff; + background-color: #27c24c; + color: #fff; } .actions-panel__restart:active a { - background-color: #c0e60f; - color: #555; + background-color: #32f360; + color: #555; } .actions-panel__restart:hover a i { - background-position: -41px -520px; + background-position: -41px -520px; } .actions-panel__restart:active a i { - background-position: -81px -520px; + background-position: -81px -520px; } + .actions-panel__restart--active a { - background-color: #c0e60f; - color: #fff; + background-color: #32f360; + color: #fff; } .actions-panel__restart--active i { - background-position: -78px -520px; + background-position: -78px -520px; } .actions-panel__add i { - background-position: -1px -285px; + background-position: -1px -285px; } .actions-panel__add:hover a { - background-color: #9fbf0c; - color: #fff; + background-color: #27c24c; + color: #fff; } .actions-panel__add:active a { - background-color: #c0e60f; - color: #555; + background-color: #32f360; + color: #555; } .actions-panel__add:hover a i { - background-position: -41px -285px; + background-position: -41px -285px; } .actions-panel__add:active a i { - background-position: -81px -285px; + background-position: -81px -285px; } .actions-panel__add--active a { - background-color: #c0e60f; - color: #fff; + background-color: #32f360; + color: #fff; } .actions-panel__add--active i { - background-position: -78px -285px; + background-position: -78px -285px; } .actions-panel__update i { - background-position: -1px -481px; + background-position: -1px -481px; } .actions-panel__update:hover a { - background-color: #9fbf0c; - color: #fff; + background-color: #27c24c; + color: #fff; } .actions-panel__update:active a { - background-color: #c0e60f; - color: #555; + background-color: #32f360; + color: #555; } .actions-panel__update:hover a i { - background-position: -41px -481px; + background-position: -41px -481px; } .actions-panel__update:active a i { - background-position: -81px -481px; + background-position: -81px -481px; } + .actions-panel__update--active a { - background-color: #c0e60f; - color: #fff; + background-color: #32f360; + color: #fff; } .actions-panel__update--active i { - background-position: -78px -481px; + background-position: -78px -481px; } .actions-panel__logs i { - background-position: -2px -130px; + background-position: -2px -130px; } .actions-panel__logs:hover a { - background-color: #afafac; - color: #fff; + background-color: #afafac; + color: #fff; } .actions-panel__logs:active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__logs:hover a i { - background-position: -42px -130px; + background-position: -42px -130px; } .actions-panel__logs:active a i { - background-position: -82px -130px; + background-position: -82px -130px; } + .actions-panel__logs--active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__logs--active i { - background-position: -79px -130px; + background-position: -79px -130px; } .actions-panel__db i { - background-position: -2px -363px; + background-position: -2px -363px; } .actions-panel__db:hover a { - background-color: #afafac; - color: #fff; + background-color: #afafac; + color: #fff; } .actions-panel__db:active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__db:hover a i { - background-position: -42px -363px; + background-position: -42px -363px; } .actions-panel__db:active a i { - background-position: -82px -363px; + background-position: -82px -363px; } + .actions-panel__db--active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__db--active i { - background-position: -79px -362px; + background-position: -79px -362px; } .actions-panel__suspend i { - background-position: -1px -51px; + background-position: -1px -51px; } .actions-panel__suspend:hover a { - background-color: #afafac; - color: #fff; + background-color: #afafac; + color: #fff; } .actions-panel__suspend:active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__suspend:hover a i { - background-position: -41px -51px; + background-position: -41px -51px; } .actions-panel__suspend:active a i { - background-position: -81px -51px; + background-position: -81px -51px; } + .actions-panel__suspend--active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__suspend--active i { - background-position: -78px -51px; + background-position: -78px -51px; } .actions-panel__unsuspend i { - background-position: -1px -12px; + background-position: -1px -12px; } .actions-panel__unsuspend:hover a { - background-color: #afafac; - color: #fff; + background-color: #afafac; + color: #fff; } .actions-panel__unsuspend:active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__unsuspend:hover a i { - background-position: -41px -12px; + background-position: -41px -12px; } .actions-panel__unsuspend:active a i { - background-position: -81px -12px; + background-position: -81px -12px; } + .actions-panel__unsuspend--active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__unsuspend--active i { - background-position: -78px -12px; + background-position: -78px -12px; } - .actions-panel__loginas i { - background-position: -1px -245px; + background-position: -1px -245px; } .actions-panel__loginas:hover a { - background-color: #afafac; - color: #fff; + background-color: #afafac; + color: #fff; } .actions-panel__loginas:active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__loginas:hover a i { - background-position: -41px -245px; + background-position: -41px -245px; } .actions-panel__loginas:active a i { - background-position: -81px -245px; + background-position: -81px -245px; } + .actions-panel__loginas--active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__loginas--active i { - background-position: -78px -245px; + background-position: -78px -245px; } .actions-panel__download i { - background-position: -1px -402px; + background-position: -1px -402px; } .actions-panel__download:hover a { - background-color: #9fbf0c; - color: #fff; + background-color: #27c24c; + color: #fff; } .actions-panel__download:active a { - background-color: #c0e60f; - color: #555; + background-color: #32f360; + color: #555; } .actions-panel__download:hover a i { - background-position: -41px -402px; + background-position: -41px -402px; } .actions-panel__download:active a i { - background-position: -81px -402px; + background-position: -81px -402px; } + .actions-panel__download--active a { - background-color: #c0e60f; - color: #fff; + background-color: #32f360; + color: #fff; } .actions-panel__download--active i { - background-position: -78px -402px; + background-position: -78px -402px; } .actions-panel__configure i { - background-position: -1px -442px; + background-position: -1px -442px; } .actions-panel__configure:hover a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__configure:active a { - background-color: #afafac; - color: #fff; + background-color: #afafac; + color: #fff; } .actions-panel__configure:hover a i { - background-position: -81px -442px; + background-position: -81px -442px; } .actions-panel__configure:active a i { - background-position: -41px -442px; + background-position: -41px -442px; } + .actions-panel__configure--active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__configure--active i { - background-position: -78px -442px; + background-position: -78px -442px; } .actions-panel__.l-icon-starmail i { - background-position: -1px -324px; + background-position: -1px -324px; } + .actions-panel__mail:hover a { - background-color: #afafac; - color: #fff; + background-color: #afafac; + color: #fff; } .actions-panel__mail:active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__mail:hover a i { - background-position: -41px -324px; + background-position: -41px -324px; } .actions-panel__mail:active a i { - background-position: -81px -324px; + background-position: -81px -324px; } + .actions-panel__mail--active a { - background-color: #55c9c0; - color: #fff; + background-color: #23b7e5; + color: #fff; } .actions-panel__mail--active i { - background-position: -78px -324px; + background-position: -78px -324px; } .actions-panel__delete i { - background-position: -1px -207px; + background-position: -1px -207px; } .actions-panel__delete:hover a { - background-color: #ff3438; - color: #fff; + background-color: #ff3438; + color: #fff; } .actions-panel__delete:active a { - background-color: #ff5f5f; - color: #fff; + background-color: #ff5f5f; + color: #fff; } .actions-panel__delete:hover a i { - background-position: -41px -207px; + background-position: -41px -207px; } .actions-panel__delete:active a i { - background-position: -81px -207px; + background-position: -81px -207px; } + .actions-panel__delete--active a { - background-color: #ff5f5f; - color: #fff; + background-color: #ff5f5f; + color: #fff; } .actions-panel__delete--active i { - background-position: -78px -207px; + background-position: -78px -207px; } .actions-panel__stop i { - background-position: -1px -561px; + background-position: -1px -561px; } .actions-panel__stop:hover a { - background-color: #ff3438; - color: #fff; + background-color: #ff3438; + color: #fff; } .actions-panel__stop:active a { - background-color: #ff5f5f; - color: #fff; + background-color: #ff5f5f; + color: #fff; } .actions-panel__stop:hover a i { - background-position: -41px -561px; + background-position: -41px -561px; } .actions-panel__stop:active a i { - background-position: -81px -561px; + background-position: -81px -561px; } + .actions-panel__stop--active a { - background-color: #ff5f5f; - color: #fff; + background-color: #ff5f5f; + color: #fff; } .actions-panel__stop--active i { - background-position: -78px -561px; + background-position: -78px -561px; } .actions-panel__start i { - background-position: -1px -482px; + background-position: -1px -482px; } .actions-panel__start:hover a { - background-color: #9fbf0c; - color: #fff; + background-color: #27c24c; + color: #fff; } .actions-panel__start:active a { - background-color: #c0e60f; - color: #555; + background-color: #32f360; + color: #555; } .actions-panel__start:hover a i { - background-position: -41px -482px; + background-position: -41px -482px; } .actions-panel__start:active a i { - background-position: -81px -482px; + background-position: -81px -482px; } + .actions-panel__start--active a { - background-color: #c0e60f; - color: #fff; + background-color: #32f360; + color: #fff; } .actions-panel__start--active i { - background-position: -78px -482px; + background-position: -78px -482px; } - .l-icon-up-arrow, .l-icon-down-arrow, .l-icon-star, .l-icon-to-top, .l-icon-shortcuts, .l-icon-star-orange, .l-icon-star-blue { - display: inline-block; - vertical-align: middle; - background-image: url("/images/sprite.png?1446554103"); + display: inline-block; + vertical-align: middle; + background-image: url("/images/sprite.png?1446554103"); } .l-icon-down-arrow { - width: 7px; - height: 15px; - background-position: -280px -128px; + width: 7px; + height: 15px; + background-position: -280px -128px; } .l-icon-up-arrow { - width: 7px; - height: 15px; - background-position: -299px -129px; + width: 7px; + height: 15px; + background-position: -299px -129px; } - .l-icon-star { - width: 36px; - height: 36px; - background-position: -216px 560px; - cursor: pointer; - visibility: hidden; + width: 36px; + height: 36px; + background-position: -216px 560px; + cursor: pointer; + visibility: hidden; } + .l-unit--starred .l-icon-star { - background-position: -174px 560px; - visibility: visible; + background-position: -174px 560px; + visibility: visible; } + .selected .l-icon-star { - filter: contrast(70%); - -webkit-filter: contrast(70%); + filter: contrast(70%); + -webkit-filter: contrast(70%); } .units.compact .l-icon-star { - margin-top: -14px; + margin-top: -14px; } .l-icon-star:hover { - background-position: 0px 560px; + background-position: 0px 560px; } - .l-icon-star:active { - -background-position: -174px 560px; - background-position: -80px 562px; + -background-position: -174px 560px; + background-position: -80px 562px; } .l-unit:hover .l-icon-star { - visibility: visible; + visibility: visible; } - .l-icon-to-top { - width: 35px; - height: 35px; - background-position: -330px -68px; + width: 35px; + height: 35px; + background-position: -330px -68px; } .l-icon-to-top:hover { - background-position: -366px -68px; + background-position: -366px -68px; } .l-icon-to-top:active { - background-position: -402px -68px; + background-position: -402px -68px; } .l-icon-shortcuts { - width: 35px; - height: 35px; - background-position: -240px -281px; - border-radius: 18px; + width: 35px; + height: 35px; + background-position: -240px -281px; + border-radius: 18px; } .l-icon-shortcuts:hover { - background-position: -160px -281px; + background-position: -160px -281px; } .l-icon-shortcuts:active { - background-position: -198px -281px; + background-position: -198px -281px; } -body.mobile .l-icon-to-top, -body.mobile .l-icon-shortcuts { - display: none; +body.mobile .l-icon-to-top, body.mobile .l-icon-shortcuts { + display: none; } - .l-icon-star-orange { - width: 13px; - height: 13px; - background-position: -178px -97px; + width: 13px; + height: 13px; + background-position: -178px -97px; } .l-icon-star-blue { - width: 13px; - height: 13px; - background-position: -134px -97px; + width: 13px; + height: 13px; + background-position: -134px -97px; } .media-top { - vertical-align: top; + vertical-align: top; } .l-unit__stat-cols { - padding-right: 10px; + padding-right: 10px; } .l-unit__stat-cols.last { - padding-right: 0; + padding-right: 0; } .l-unit__stat-cols.graph { - width: 200px; + width: 200px; } .l-unit__stat-cols.tiny { - font-size:11px; - line-height: 19px; + font-size: 11px; + line-height: 19px; } .l-percent { - border-bottom: 1px dotted #ccc; - margin-top: 1px; - width: 200px; + border-bottom: 1px dotted #ccc; + margin-top: 1px; + width: 200px; } + .l-percent__fill { - background-color: #aacc0d; - height: 3px; - position: relative; - bottom: -1px; + background-color: #aacc0d; + height: 3px; + position: relative; + bottom: -1px; } .to-top { - display: inline-block; - position: fixed; - top: 92%; - right: 1%; + display: inline-block; + position: fixed; + top: 92%; + right: 1%; } .to-shortcuts { - display: inline-block; - position: fixed; - top: 92%; - right: 4%; + display: inline-block; + position: fixed; + top: 92%; + right: 4%; } - /* #vstobjects { margin-top: -1px; } */ - #vstobjects .l-center { - padding-top: 20px; - padding-bottom: 30px; - font-size: 12px; + padding-top: 20px; + padding-bottom: 30px; + font-size: 12px; } .timer-container { - margin-top: 4px; + margin-top: 4px; } - .timer-container .refresh-timer { - border: 2px solid #9f9f9f; - border-radius: 14px; - height: 14px; - width: 14px; - float: left; - margin: 2px 10px 0 0; + border: 2px solid #9f9f9f; + border-radius: 14px; + height: 14px; + width: 14px; + float: left; + margin: 2px 10px 0 0; } .timer-container .refresh-timer.paused { - border: 2px solid #9f9f9f; + border: 2px solid #9f9f9f; } -.timer-container .refresh-timer.paused .loader-half.right, -.timer-container .refresh-timer.paused .loader-half.dark { - background-color: #9d9f9f; +.timer-container .refresh-timer.paused .loader-half.right, .timer-container .refresh-timer.paused .loader-half.dark { + background-color: #9d9f9f; } .timer-container .loader-half { - border-radius: 0 14px 14px 0; - height: 14px; - width: 7px; - float: left; + border-radius: 0 14px 14px 0; + height: 14px; + width: 7px; + float: left; } .timer-container .loader-half.left { - border-radius: 14px 0 0 14px; - background-color: #fff; + border-radius: 14px 0 0 14px; + background-color: #fff; } .timer-container .loader-half.right { - margin-left: 7px; - background-color: #9f9f9f; + margin-left: 7px; + background-color: #9f9f9f; } .timer-container .loader-half.dark { - background-color: #9f9f9f; + background-color: #9f9f9f; } .timer-container .movement { - float: left; - width: 14px; - height: 14px; - position: absolute; + float: left; + width: 14px; + height: 14px; + position: absolute; } .timer-container .movement.left { - z-index: 10; + z-index: 10; } .timer-container .movement.right { - transform: rotate(180deg); - -webkit-transform: rotate(180deg); + transform: rotate(180deg); + -webkit-transform: rotate(180deg); } .timer-container .timer-button { - cursor: pointer; - text-decotation: underline; - margin: 7px 0 0 38px; - width: 15px; - float: left; - height: 10px; + cursor: pointer; + text-decotation: underline; + margin: 7px 0 0 38px; + width: 15px; + float: left; + height: 10px; } .timer-container .timer-button.pause { - background: url(/images/pause.png) no-repeat ; + background: url(/images/pause.png) no-repeat; } .timer-container .timer-button.play { - background: url(/images/start.png) no-repeat; + background: url(/images/start.png) no-repeat; } .uppercase { - text-transform: uppercase; -} - -.title b, -.title { - color: #ff6701; - font-size: 12px; - font-weight: bold; - padding: 0 30px 0px 73px; - line-height: 30px; - text-transform: uppercase; + text-transform: uppercase; } .title { - display: inline-block; - float: left; + color: #9c8cff; + font-size: 12px; + font-weight: bold; + padding: 0 30px 0px 73px; + line-height: 30px; + text-transform: uppercase; + display: inline-block; + float: left; +} +.title b { + color: #9c8cff; + font-size: 12px; + font-weight: bold; + padding: 0 30px 0px 73px; + line-height: 30px; + text-transform: uppercase; } - - - /* form styles */ - - - .vst-error { - color: #BE5ABF; - font-weight: bold; - display: inline-block; - height: 17px; - overflow: hidden; - padding-top: 6px; - width: 593px; + color: #BE5ABF; + font-weight: bold; + display: inline-block; + height: 17px; + overflow: hidden; + padding-top: 6px; + width: 593px; } .vst-ok { - color: #9fbf0c; - font-weight: bold; - display: inline-block; - height: 17px; - overflow: hidden; - padding-top: 6px; - max-width: 600px; + color: #27c24c; + font-weight: bold; + display: inline-block; + height: 17px; + overflow: hidden; + padding-top: 6px; + max-width: 600px; } - .vst-ok a { - color: #2c9491; + color: #27c24c; } .vst-ok a:hover { - color: #ff6701; + color: #9c8cff; } .vst-ok a:active { - color: #f72b44; + color: #796cc7; } - - - .data { - margin: 0 0 90px 0; + margin: 0 0 90px 0; } + .data-col1 { - width: 148px; + width: 148px; } - .data-col1 td { - padding: 10px 0 0 5px; + padding: 10px 0 0 5px; } - .data-col1 tr:first-child td { - padding: 59px 0 0 5px; + padding: 59px 0 0 5px; } -.login-box td, -.data td { - color: #555; - font-size: 15px; - padding-bottom: 3px; - font-weight: bold; +.login-box td, .data td { + color: #555; + font-size: 15px; + padding-bottom: 3px; + font-weight: bold; } + .input-label { - padding-top: 20px; + padding-top: 20px; } -.data input[type="checkbox"] { - display: inline; - cursor: pointer; + +.data input[type=checkbox] { + display: inline; + cursor: pointer; } + .step-top { - padding-top: 42px; + padding-top: 42px; } + .step-top-small { - padding-top: 22px; + padding-top: 22px; } + .jump-top { - margin-top: -60px; + margin-top: -60px; } + .jump-small-top { - margin-top: -12px; + margin-top: -12px; } + .float-right { display: inline-block; float: right; } .data a { - text-decoration: none; -} -label { - cursor: pointer; + text-decoration: none; } +label { + cursor: pointer; +} label:hover { - color: #333; + color: #333; } .vst-input { - background-color: #fff; - border: 1px solid #cfcfcf; - border-radius: 0px; - color: #555; - font-family: Arial; - font-size: 19px; - height: 28px; - margin: 2px 6px 0 0; - padding: 7px 3px 9px 14px; - width: 360px; - font-weight: normal; + background-color: #fff; + border: 1px solid #dee5e7; + border-radius: 3px; + color: #555; + font-family: Arial; + font-size: 19px; + height: 28px; + margin: 2px 6px 0 0; + padding: 7px 3px 9px 14px; + width: 360px; + font-weight: normal; } .vst-input:hover { - border: 1px solid #909090; + border: 1px solid #909090; } .vst-input:focus { - border: 1px solid #55C9C0; - background-color: #D7F9FF; - color: #333; + border: 1px solid #23b7e5; + background-color: #fff; + color: #333; +} +.vst-input:disabled { + background-color: #e0e0e0; } -.vst-input:disabled, .vst-list:disabled { - background-color: #e0e0e0; + background-color: #e0e0e0; } + .vst-input:focus:disabled { - border-color: #f1f1f1; - background-color: #f1f1f1; + border-color: #f1f1f1; + background-color: #f1f1f1; } .vst-input.long { - width: 832px; + width: 100%; } .vst-input.short { - width: 200px; + width: 200px; } .vst-list { - background-color: #fff; - border: 1px solid #ccc; - border-radius: 0; - color: #555; - font-family: Arial,Helvetica,sans-serif; - font-size: 19px; - font-weight: normal; - height: 43px; - cursor: pointer; - margin: 2px 6px 0 0; - min-width: 138px; - padding: 8px 1px 6px 10px; - background-image: url("/images/sprite.png?1446554103"); - background-position: -185px -604px; - width: 270px; - appearance:none; - -moz-appearance:none; - -webkit-appearance:none; - text-shadow: 0 0 0 #555; + background-color: #fff; + border: 1px solid #dee5e7; + border-radius: 3px; + color: #555; + font-family: Arial, Helvetica, sans-serif; + font-size: 19px; + font-weight: normal; + height: 43px; + cursor: pointer; + margin: 2px 6px 0 0; + min-width: 138px; + padding: 8px 1px 6px 10px; + background-image: url("/images/sprite.png?1446554103"); + background-position: -185px -604px; + width: 270px; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + text-shadow: 0 0 0 #555; } - .vst-list.long-2 { - width: 486px; - background-position: 502px -604px; + width: 486px; + background-position: 502px -604px; } .vst-list option { - padding: 6px 1px 6px 15px; + padding: 6px 1px 6px 15px; } .vst-list:hover { - border: 1px solid #909090; + border: 1px solid #909090; } .vst-list:focus { - border: 1px solid #55C9C0; - color: #333; + border: 1px solid #23b7e5; + color: #333; } - .vst-list.flat { - border: 1px solid #fff; - color: #2c9491; - text-transform: uppercase; - font-weight: bold; - font-size: 11px; - margin-left: -14px; - background-position: -210px -604px; - text-shadow: none !important; + border: 1px solid #fff; + color: #27c24c; + text-transform: uppercase; + font-weight: bold; + font-size: 11px; + margin-left: -14px; + background-position: -210px -604px; + text-shadow: none !important; } .vst-list.flat:hover { - color: #ff6701; + color: #9c8cff; } .vst-list.flat option { - color: #555; + color: #555; } -a.vst-text, -a.vst-text b{ - color: #2c9491; +a.vst-text { + color: #27c24c; } -a.vst-text:hover, -a.vst-text:hover b{ - color: #ff6701; +a.vst-text b { + color: #27c24c; } -a.vst-text:active, -a.vst-text:active b{ - color: #ff6701; +a.vst-text:hover, a.vst-text:active { + color: #9c8cff; +} +a.vst-text:hover b, a.vst-text:active b { + color: #9c8cff; } .vst-textinput { - background-color: #fff; - border: 1px solid #cfcfcf; - border-radius: 0px; - color: #555; - font-size: 19px; - padding: 5px; - width: 560px; - height: 90px; - font-family:Arial, Helvetica, sans-serif; - padding: 9px 1px 6px 14px; - font-weight: normal; + background-color: #fff; + border: 1px solid #dee5e7; + border-radius: 3px; + color: #555; + font-size: 19px; + padding: 5px; + width: 560px; + height: 90px; + font-family: Arial, Helvetica, sans-serif; + padding: 9px 1px 6px 14px; + font-weight: normal; } .vst-textinput:hover { - border: 1px solid #909090; + border: 1px solid #909090; } .vst-textinput:focus { - border: 1px solid #55C9C0; - background-color: #D7F9FF; - color: #333; + border: 1px solid #23b7e5; + background-color: #fff; + color: #333; } .vst-textinput:disabled { - background-color: #f1f1f1; + background-color: #f1f1f1; } -.vst-textinput.console{ - font-size: 13px; - width: 630px; - height: 300px; - font-family:"Lucida Console", Monaco, monospace; - white-space: pre; +.vst-textinput.console { + font-size: 13px; + width: 630px; + height: 300px; + font-family: "Lucida Console", Monaco, monospace; + white-space: pre; } .vst-textinput.short { - width: 360px; + width: 360px; } -#advanced-options .console{ - width: 833px; - height: 600px; + +#advanced-options .console { + width: 833px; + height: 600px; } + .generate { - color: #2C9491; - text-decoration: underline; - cursor: pointer; - margin-left: -3px; - padding: 0 3px; + color: #27c24c; + text-decoration: underline; + cursor: pointer; + margin-left: -3px; + padding: 0 3px; } .generate:hover { - background-color: #ff6701; - border-color: #ff6701; - color: #fff; + background-color: #9c8cff; + border-color: #9c8cff; + color: #fff; } .generate:active { - background-color: #F7D616; - border-color: #F7D616; + background-color: #F7D616; + border-color: #F7D616; } + .vst-advanced { - border-bottom: 1px solid #2c9491; - color: #2c9491; - font-size: 11px; - letter-spacing: 1px; - padding: 2px 2px 0; - text-decoration: none; - text-transform: uppercase; + border-bottom: 1px solid #27c24c; + color: #27c24c; + font-size: 11px; + letter-spacing: 1px; + padding: 2px 2px 0; + text-decoration: none; + text-transform: uppercase; } + .login-box .vst-advanced:hover { - color: #ff6701; - background-color: transparent; - border-color: transparent; + color: #9c8cff; + background-color: transparent; + border-color: transparent; } .vst-advanced:hover { - color: #fff; - background-color: #ff6701; - border-color: #ff6701; + color: #fff; + background-color: #9c8cff; + border-color: #9c8cff; } -.login-box .vst-advanced:active, -.vst-advanced:active { - color: #fff; - background-color: #F7D616; - border-color: #F7D616; +.login-box .vst-advanced:active, .vst-advanced:active { + color: #fff; + background-color: #F7D616; + border-color: #F7D616; } .login-box .vst-advanced { - border-bottom: none; - color: #2c9491; - font-size: 10px; - letter-spacing: 1px; - padding: 2px 2px 0; - text-decoration: none; - text-transform: uppercase; + border-bottom: none; + color: #27c24c; + font-size: 10px; + letter-spacing: 1px; + padding: 2px 2px 0; + text-decoration: none; + text-transform: uppercase; } + .vst-checkbox { - font-size: 19px; - margin: 2px 6px 0 3px; - padding: 5px; + font-size: 19px; + margin: 2px 6px 0 3px; + padding: 5px; } + .lets-encrypt-note { - color: #89a40a !important; - font-style: italic; - font-weight: normal !important; - height: 30px; - padding-top: 10px; - vertical-align: top; + color: #89a40a !important; + font-style: italic; + font-weight: normal !important; + height: 30px; + padding-top: 10px; + vertical-align: top; } .additional-control { - margin-left: 17px; - color: #2C9491; - border-bottom: 1px solid #2C9491; - font-size: 11px; - letter-spacing: 1px; - cursor: pointer; - text-transform: uppercase; - font-weight: bold; - padding: 2px 2px 0; + margin-left: 17px; + color: #27c24c; + border-bottom: 1px solid #27c24c; + font-size: 11px; + letter-spacing: 1px; + cursor: pointer; + text-transform: uppercase; + font-weight: bold; + padding: 2px 2px 0; } .additional-control:hover { - background-color: #ff6701; - border-color: #ff6701; - color: #fff; + background-color: #9c8cff; + border-color: #9c8cff; + color: #fff; } .additional-control:active { - color: #fff; - background-color: #aaa; + color: #fff; + background-color: #aaa; } - .additional-control.ftp-remove-user { - padding: 2px 0 0 0; + padding: 2px 0 0 0; } - -.additional-control.delete:hover, -.additional-control.ftp-remove-user:hover { - background-color: #FF3438; - border-color: #FF3438; +.additional-control.delete:hover, .additional-control.ftp-remove-user:hover { + background-color: #FF3438; + border-color: #FF3438; } -.additional-control.delete:active, -.additional-control.ftp-remove-user:active { - background-color: #FF5F5F; - border-color: #FF5F5F; +.additional-control.delete:active, .additional-control.ftp-remove-user:active { + background-color: #FF5F5F; + border-color: #FF5F5F; } .additional-control.add:hover { - background-color: #9FBF0C; - border-color: #9FBF0C; + background-color: #27c24c; + border-color: #27c24c; } -.additional-control.add:active{ - background-color: #c0e60f; - border-color: #c0e60f; +.additional-control.add:active { + background-color: #32f360; + border-color: #32f360; } - .additional-control.remove-ns { - display: none; + display: none; } .data .step-left { - padding-left: 50px; + padding-left: 50px; } + .hide-password { - color: #2361a1; - margin-left: -36px; - padding-left: 3px; - z-index: 1; + color: #2361a1; + margin-left: -36px; + padding-left: 3px; + z-index: 1; } + .toggle-psw-visibility-icon { - cursor: pointer; - opacity: 1; + cursor: pointer; + opacity: 1; } + .show-passwords-enabled-action { - opacity: 0.4; -} -.ftp-path-value, -.hint, -td.hint { - color: #777; - font-size: 15px; - font-style: italic; - font-weight: normal; -} -.ftp-path-prefix { padding-top: 7px; } - -.ui-button, -.button { - filter:chroma(color=#000); - cursor: pointer; - border-radius: 3px 3px 3px 3px; - font-size: 13px; - font-weight: bold; - padding: 1px 16px 3px 16px; - width: 108px; - height: 34px; - color: #fafafa; - border: 1px solid #9FBF0C; - background-color: #9FBF0C; -} -.ui-button:hover, -.button:hover { - color: #555; - border: 1px solid #C0E60F; - background-color: #C0E60F; -} -.ui-button:active, -.button:active { - border: 1px solid #D1D70D !important; - background-color: #D1D70D !important; + opacity: 0.4; } -.ui-button:focus, -.button:focus { - border: 1px solid #90AD0D; - background-color: #90AD0D; +.ftp-path-value, .hint, td.hint { + color: #777; + font-size: 15px; + font-style: italic; + font-weight: normal; } -.ui-button.cancel, -.button.cancel { - color: #777; - border: 1px solid #DFDEDD; - background-color: #DFDEDD; +.ftp-path-prefix { + padding-top: 7px; } -.ui-button.cancel:hover, -.button.cancel:hover { - color: #fff; - border: 1px solid #999; - background-color: #999; + +.ui-button, .button { + filter: chroma(color=#000); + cursor: pointer; + border-radius: 3px 3px 3px 3px; + font-size: 13px; + font-weight: bold; + padding: 1px 16px 3px 16px; + width: 108px; + height: 34px; + color: #fafafa; + border: 1px solid #27c24c; + background-color: #27c24c; } -.ui-button.cancel:active, -.button.cancel:active { - border: 1px solid #D1D70D; - background-color: #D1D70D; + +.ui-button:hover, .button:hover { + color: #555; + border: 1px solid #32f360; + background-color: #32f360; } + +.ui-button:active, .button:active { + border: 1px solid #54ca70 !important; + background-color: #54ca70 !important; +} + +.ui-button:focus, .button:focus { + border: 1px solid #25af49; + background-color: #25af49; +} + +.ui-button.cancel, .button.cancel { + color: #777; + border: 1px solid #dde6e9; + background-color: #dde6e9; +} + +.ui-button.cancel:hover, .button.cancel:hover { + color: #fff; + border: 1px solid #999; + background-color: #999; +} + +.ui-button.cancel:active, .button.cancel:active { + border: 1px solid #54ca70; + background-color: #54ca70; +} + a.button.cancel { - padding: 8px 38px; - text-transform: capitalize; + padding: 8px 38px; + text-transform: capitalize; } - .ui-dialog button.cancel { - color: #000; - border: 1px solid #555; - background-color: #555; + color: #000; + border: 1px solid #555; + background-color: #555; } + /* .ui-dialog button.cancel:hover { color: #fff; @@ -2789,105 +2764,101 @@ a.button.cancel { background-color: #999; } .ui-dialog button.cancel:active { - border: 1px solid #D1D70D; - background-color: #D1D70D; + border: 1px solid #54ca70; + background-color: #54ca70; } */ - - - .ui-button span { - color: #fff; + color: #fff; } .ui-button:hover span { - color: #555 !important; + color: #555 !important; } .ui-button:active span { - color: #555; + color: #555; } .ui-button.cancel span { - color: #777; + color: #777; } -.ui-button:hover span { - color: #fff; -} -.ui-button:active span { - color: #fff; +.ui-button:hover span, .ui-button:active span { + color: #fff; } .ui-dialog button.cancel span { - color: #ccc; + color: #ccc; } - .unlim-trigger { - cursor: pointer; - margin-left: -36px; - padding-left: 3px; - z-index: 1; + cursor: pointer; + margin-left: -36px; + padding-left: 3px; + z-index: 1; } + .optional { - font-size: 12px; - padding: 0 0 0 6px; - font-weight: normal; + font-size: 12px; + padding: 0 0 0 6px; + font-weight: normal; } + .data-active b { - color: #9FBF0C; - font-size: 11px; - letter-spacing: 1px; - text-transform: uppercase; + color: #27c24c; + font-size: 11px; + letter-spacing: 1px; + text-transform: uppercase; } + .data-suspended b { - color: #A3A3A3; - font-size: 11px; - letter-spacing: 3px; - font-weight: bold; - text-transform: uppercase; + color: #A3A3A3; + font-size: 11px; + letter-spacing: 3px; + font-weight: bold; + text-transform: uppercase; } + .data-date { - font-weight: normal; - color: #777; - font-size: 12px; - letter-spacing: 1px; - line-height: 23px; + font-weight: normal; + color: #777; + font-size: 12px; + letter-spacing: 1px; + line-height: 23px; } -.data-dotted { - vertical-align: top; -} -.mail-infoblock-td { - vertical-align: top; + +.data-dotted, .mail-infoblock-td { + vertical-align: top; } + .mail-infoblock { - margin-left: -110px; - font-size: 12px; - color: #777; - border: 1px solid #d9d9d9; - padding: 0px 5px 12px 20px; - margin-top: 64px; - width: 334px; - overflow: hidden; + margin-left: -110px; + font-size: 12px; + color: #777; + border: 1px solid #d9d9d9; + padding: 0px 5px 12px 20px; + margin-top: 64px; + width: 334px; + overflow: hidden; } .mail-infoblock:hover { - overflow: visible; + overflow: visible; } .mail-infoblock td { - color: #777; - font-size: 14px; - height: 18px; - font-weight: normal; + color: #777; + font-size: 14px; + height: 18px; + font-weight: normal; } -.mail-infoblock td:first-child{ - padding-right: 15px; +.mail-infoblock td:first-child { + padding-right: 15px; } .mail-infoblock div { - width: 190px; - white-space: nowrap; + width: 190px; + white-space: nowrap; } .mail-infoblock a { - color: #2c9491; + color: #27c24c; } .mail-infoblock a:hover { - color: #ff6701; + color: #9c8cff; } .additional-info { @@ -2904,489 +2875,467 @@ a.button.cancel { padding-left: 20px; } +:focus { + outline: none; +} - -:focus {outline:none;} -::-moz-focus-inner {border:0;} +::-moz-focus-inner { + border: 0; +} .login { - background-color: #fff; - box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); - font-family: Arial,Helvetica,sans-serif; - margin: 0; - padding: 0; - text-align: left; - vertical-align: top; - width: 550px; + background-color: #fff; + box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); + font-family: Arial, Helvetica, sans-serif; + margin: 0; + padding: 0; + text-align: left; + vertical-align: top; + width: 500px; +} +.login a.error { + color: #BE5ABF; } -.login a.error { - color: #BE5ABF; -} .vestacp { - color: #505050; - font-size: 10px; - text-align: right; + color: #505050; + font-size: 10px; + text-align: right; } .vestacp:hover { - color: #2c9491; + color: #27c24c; } .vestacp:active { - color: #ff6701; + color: #9c8cff; } + .login-bottom { - height: 50px; - margin: 0; - padding: 0 26px 0 0; - text-align: right; - vertical-align: top; - width: 520px; + height: 50px; + margin: 0; + padding: 0 26px 0 0; + text-align: right; + vertical-align: top; + width: 474px; } .l-unit.selected { - background-color: #feef9a; - color: #555; - border-bottom: 1px solid #c0b990; + background-color: #feef9a; + color: #555; + border-bottom: 1px solid #c0b990; } - -.l-unit.selected b, -.l-unit.selected strong { - color: #555; +.l-unit.selected b, .l-unit.selected strong { + color: #555; } - /* MAIN MENU COLLAPSED */ .collapsed .l-stat { - padding-top: 20px; + padding-top: 20px; } - .collapsed .l-stat__col a { - height: 0; - min-height: 0; - overflow: hidden; + height: 0; + min-height: 0; + overflow: hidden; } - .collapsed .l-stat__col-title { - padding-top: 2px; + padding-top: 2px; } div.l-content.collapsed > div.l-separator:nth-of-type(2) { - margin-top: 93px; - position: fixed; + margin-top: 93px; + position: fixed; } - div.l-content.collapsed > div.l-separator:nth-of-type(4) { - margin-top: 138px; - position: fixed; + margin-top: 138px; + position: fixed; } - div.l-content.collapsed .l-sort { - margin-top: 94px; + margin-top: 94px; } .l-content > .units.l-center::before { - content: ''; - display: block; - height: 260px; + content: ""; + display: block; + height: 260px; } form#vstobjects { - padding-top: 280px; + padding-top: 280px; } - form#vstobjects.suspended { - background-color: #EAEAEA; - padding-bottom: 30px; + background-color: #EAEAEA; + padding-bottom: 30px; } #add-icon { - width: 45px; - height: 45px; - background-image: url("/images/sprite.png?1446554103"); - background-position: -378px -107px; - background-repeat: no-repeat; - display: inline-block; - z-index: 3; + width: 45px; + height: 45px; + background-image: url("/images/sprite.png?1446554103"); + background-position: -378px -107px; + background-repeat: no-repeat; + display: inline-block; + z-index: 3; } + .l-sort__create-btn.restore #add-icon { - background-position: -378px -250px; + background-position: -378px -250px; } .l-sort__create-btn.edit #add-icon { - background-position: -378px -154px; + background-position: -378px -154px; } + #tooltip { - background-color: #aacc0d; - border-radius: 15px; - bottom: 6px; - color: #fff; - font-size: 12px; - font-weight: bold; - height: 26px; - left: 12px; - letter-spacing: 0; - line-height: 25px; - margin-left: 12px; - margin-top: 7px; - padding: 3px 14px 3px 27px; - position: absolute; - text-transform: uppercase; - white-space: nowrap; - word-break: keep-all; - z-index: -1; + background-color: #aacc0d; + border-radius: 15px; + bottom: 6px; + color: #fff; + font-size: 12px; + font-weight: bold; + height: 26px; + left: 12px; + letter-spacing: 0; + line-height: 25px; + margin-left: 12px; + margin-top: 7px; + padding: 3px 14px 3px 27px; + position: absolute; + text-transform: uppercase; + white-space: nowrap; + word-break: keep-all; + z-index: -1; } .l-sort__create-btn:active #add-icon { - background-position: -425px -107px; + background-position: -425px -107px; } .l-sort__create-btn.restore:active #add-icon { - background-position: -425px -250px !important; + background-position: -425px -250px !important; } - .l-sort__create-btn.edit:active #add-icon { - background-position: -425px -154px !important; + background-position: -425px -154px !important; } - .l-sort__create-btn.edit:hover #tooltip { - background-color: #55C9C0; + background-color: #23b7e5; } .l-sort__create-btn.edit:active #tooltip { - background-color: #3BF0E6 !important; + background-color: #3BF0E6 !important; } - - - - .l-sort__create-btn:active #tooltip { - background-color: #D9F210; + background-color: #D9F210; } .noselect { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } .search-input { - background-color: #fff; - border: 1px solid #ddd; - height: 21px; - line-height: 28px; - padding-left: 7px; - float: left; - width: 74px; -/* visibility: hidden;*/ - -webkit-transition: width .2s ease-out; - -moz-transition: width .2s ease-out; - -o-transition: width .2s ease-out; - transition: width .2s ease-out; -} -.lang-ru .search-input.activated{ - width: 70px; -} -.search-input.activated{ - width: 130px; - visibility: visible; -} -.search-input:focus { -// background-color: #e8fcff; -// border-color: #75c9c2; -// color: #333; + background-color: #fff; + border: 1px solid #ddd; + height: 21px; + line-height: 28px; + padding-left: 7px; + float: left; + width: 74px; + /* visibility: hidden;*/ + -webkit-transition: width 0.2s ease-out; + -moz-transition: width 0.2s ease-out; + -o-transition: width 0.2s ease-out; + transition: width 0.2s ease-out; } +.lang-ru .search-input.activated { + width: 70px; +} + +.search-input.activated { + width: 130px; + visibility: visible; +} .float-left { - float: left; + float: left; } + .float-right { - float: right; + float: right; } + .display-inline-block { - display: inline-block; + display: inline-block; } + .width-100p { - width: 100%; + width: 100%; } .l-sort-toolbar table td { - float: left; + float: left; } + .l-sort-toolbar__search-box { - float: right !important; - padding-top: 3px; - padding-right: 0 !important; + float: right !important; + padding-top: 3px; + padding-right: 0 !important; } + .ui-dialog .ui-dialog-buttonpane button:nth-of-type(2) { - -background-color: #dfdedd; + -background-color: #dde6e9; } .shortcuts { - background: rgba(50, 50, 50, 0.9); - display: inline-block; - position: fixed; - left: 50%; - bottom: 0; - color: #eee; - width: 800px; - border: 1px solid #333; - font-size: 13px; - z-index: 120; - transform: translate(-50%, 0); + background: rgba(50, 50, 50, 0.9); + display: inline-block; + position: fixed; + left: 50%; + bottom: 0; + color: #eee; + width: 800px; + border: 1px solid #333; + font-size: 13px; + z-index: 120; + transform: translate(-50%, 0); } .shortcuts .header { - border-bottom: 1px solid #333; - height: 43px; + border-bottom: 1px solid #333; + height: 43px; } .shortcuts .title { - text-transform: uppercase; - color: #ffcc00; - padding: 7px 0 7px 14px; - display: inline-block; - float: left; - font-size: 11px; - letter-spacing: 3px; + text-transform: uppercase; + color: #ffcc00; + padding: 7px 0 7px 14px; + display: inline-block; + float: left; + font-size: 11px; + letter-spacing: 3px; } .shortcuts .close { - background: url("/images/sprite.png?1446554103") repeat scroll -408px -469px; - cursor: pointer; - display: inline-block; - float: right; - height: 32px; - padding-top: 11px; - width: 46px; + background: url("/images/sprite.png?1446554103") repeat scroll -408px -469px; + cursor: pointer; + display: inline-block; + float: right; + height: 32px; + padding-top: 11px; + width: 46px; } .shortcuts .close:hover { - background-color: #000; + background-color: #000; } .shortcuts .close:active { - background-color: #55c9c0; + background-color: #23b7e5; } .shortcuts ul { - list-style-type: none; - padding: 30px 20px; - display: inline-block; - float: left; - width: 360px; + list-style-type: none; + padding: 30px 20px; + display: inline-block; + float: left; + width: 360px; } .shortcuts ul li { - padding: 5px 20px; + padding: 5px 20px; } .shortcuts ul li.step-top { - padding-top: 30px; + padding-top: 30px; } .shortcuts ul li span { - color: #48F4EF; - display: inline-block; - font-weight: bold; - padding: 0 20px 0 0; - text-align: right; -/* width: 140px;*/ + color: #48F4EF; + display: inline-block; + font-weight: bold; + padding: 0 20px 0 0; + text-align: right; + /* width: 140px;*/ } .shortcuts ul li span.bigger { - font-size: 18px; + font-size: 18px; } .description { - font-weight: normal; - line-height: 25px; - padding-bottom: 45px; - margin-left: 50px; + font-weight: normal; + line-height: 25px; + padding-bottom: 45px; + margin-left: 50px; } -.description ul{ - margin-top: 15px; - list-style: none; - padding-left: 0; +.description ul { + margin-top: 15px; + list-style: none; + padding-left: 0; } - -.description li{ - margin: 10px 0; +.description li { + margin: 10px 0; } - .description a { - line-height: 30px; - text-decoration: underline; - color: #2c9491; + line-height: 30px; + text-decoration: underline; + color: #27c24c; } .description a.purchase { - color: #FFF; - background-color: #9fbf0c; - border: none; - border-radius: 3px; - font-size: 13px; - font-weight: bold; - padding: 7px 15px;; - text-transform: capitalize; - text-decoration: none; + color: #FFF; + background-color: #27c24c; + border: none; + border-radius: 3px; + font-size: 13px; + font-weight: bold; + padding: 7px 15px; + text-transform: capitalize; + text-decoration: none; } .description a.purchase:hover { - background-color: #c0e60f; - color: #555; + background-color: #32f360; + color: #555; } .description a.purchase:active { - background-color: #D9F210; - color: #555; + background-color: #D9F210; + color: #555; } - .description a.cancel { - background-color: #999; - border: none; - border-radius: 3px; - color: #fff; - font-size: 13px; - font-weight: bold; - padding: 7px 15px; - text-transform: capitalize; - text-decoration: none; + background-color: #999; + border: none; + border-radius: 3px; + color: #fff; + font-size: 13px; + font-weight: bold; + padding: 7px 15px; + text-transform: capitalize; + text-decoration: none; } .description a.cancel:hover { - background-color: #2c9491; + background-color: #27c24c; } .description a.cancel:active { - background-color: #5f9491; + background-color: #5f9491; } - .description.cancel-success { - color: #8fac0a; - font-weight: bold; + color: #8fac0a; + font-weight: bold; } - .description .licence { - padding: 20px 0; - color: #2c9491; + padding: 20px 0; + color: #27c24c; } - .description .licence input { - margin-left: 17px; - width: 137px; + margin-left: 17px; + width: 137px; } - .description span { - font-style: italic; - line-height: 45px; - padding-top: 20px; + font-style: italic; + line-height: 45px; + padding-top: 20px; } - .description .twoco { - font-style: italic; - line-height: 15px; - font-size: 12px; + font-style: italic; + line-height: 15px; + font-size: 12px; } .ui-dialog .ui-dialog-content { - padding: 10px 26px 30px !important; + padding: 10px 26px 30px !important; } .helper-container { - float: right; - height: 293px; - margin-bottom: -450px; - margin-top: 459px; - padding-top: 3px; - width: 563px; + float: right; + height: 293px; + margin-bottom: -450px; + margin-top: 459px; + padding-top: 3px; + width: 563px; } .context-helper { - text-transform: uppercase; -# text-decoration: underline; - color: #777; - font-size: 11px; - cursor: pointer; - font-weight: bold; - float: right; + text-transform: uppercase; + color: #777; + font-size: 11px; + cursor: pointer; + font-weight: bold; + float: right; } .context-helper:hover { - color: #55C9C0; + color: #23b7e5; } .context-helper:active { - color: #ff6701; + color: #9c8cff; } - .cron-helper-tabs { -/* margin-top: 30px;*/ - border: 1px solid #d9d9d9 !important; + /* margin-top: 30px;*/ + border: 1px solid #d9d9d9 !important; } - .cron-helper-tabs a { - color: #777; - font-size: 11px; - font-weight: bold; - line-height: 30px; - padding: 0 12px; - text-transform: uppercase; + color: #777; + font-size: 11px; + font-weight: bold; + line-height: 30px; + padding: 0 12px; + text-transform: uppercase; } - .cron-helper-tabs a:hover { - color: #ff6701; + color: #9c8cff; } .cron-helper-tabs a:active { - color: #55C9C0; + color: #23b7e5; } .cron-helper-tabs .ui-tabs-selected a { - color: #ff6701; + color: #9c8cff; } - .cron-helper-tabs select { - font-size: 15px !important; + font-size: 15px !important; } .cron-helper-tabs select.short { - background-position: -388px -604px; - min-width: 30px; - width: 70px; + background-position: -388px -604px; + min-width: 30px; + width: 70px; } - .cron-helper-tabs p { - color: #777; - font-size: 12px; + color: #777; + font-size: 12px; } -.cron-helper-tabs p span{ - padding-right: 15px; - padding-left: 25px; +.cron-helper-tabs p span { + padding-right: 15px; + padding-left: 25px; } -.cron-helper-tabs p span.first{ - display: inline-block; - padding-right: 15px; - width: 100px; - padding-left: 0; +.cron-helper-tabs p span.first { + display: inline-block; + padding-right: 15px; + width: 100px; + padding-left: 0; } - .cron-helper-tabs .button { - width: auto; - background-color: #55C9C0; - border: 1px solid #55C9C0; - text-transform: capitalize; + width: auto; + background-color: #23b7e5; + border: 1px solid #23b7e5; + text-transform: capitalize; } .cron-helper-tabs .button:hover { - background-color: #5BD8CF; - border: 1px solid #5BD8CF; + background-color: #00d8ff; + border: 1px solid #00d8ff; } .cron-helper-tabs .button:active { - background-color: #4FBCB4; - border: 1px solid #4FBCB4; + background-color: #49c8ef; + border: 1px solid #49c8ef; } .context-helper-close { - background: rgba(0, 0, 0, 0) url("/images/sprite.png?1446554103") repeat scroll -408px -469px; - cursor: pointer; - display: inline-block; - float: right; - height: 32px; - padding-top: 11px; - width: 46px; - filter: contrast(50%); + background: rgba(0, 0, 0, 0) url("/images/sprite.png?1446554103") repeat scroll -408px -469px; + cursor: pointer; + display: inline-block; + float: right; + height: 32px; + padding-top: 11px; + width: 46px; + filter: contrast(50%); } .context-helper-close:hover { - background-color: #aaa; - filter: none; + background-color: #aaa; + filter: none; } .context-helper-close:active { - background-color: #999; - filter: none; + background-color: #999; + filter: none; } @media screen and (max-width: 950px) { - .helper-container { - display: none; - } + .helper-container { + display: none; + } } diff --git a/web/images/myvesta-large-white-130.png b/web/images/myvesta-large-white-130.png new file mode 100644 index 0000000000000000000000000000000000000000..2007b0bcf7cdd0506f97f510834aee84386c42b8 GIT binary patch literal 5284 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 literal 0 HcmV?d00001 diff --git a/web/images/sprite.png b/web/images/sprite.png index 456ab6f8d441083a881bcfca34a77bb118374c79..061392c3677cc4e7d9659d877a407891e538dde4 100644 GIT binary patch literal 35005 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 literal 57521 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\n' + + '
    \n' + + ' myVesta\n' + + ' website\n' + + '
    \n' + + '
    \n' + + ' Forum\n' + + ' Ask the questions on our forum\n' + + '
    \n' + + '
    \n' + + ' Git\n' + + ' Become our code contributor\n' + + '
    \n' + + '
    \n' + + ' Donate\n' + + ' Buy us a coffe\n' + + '
    \n' + + '
    \n' + + ' Wiki\n' + + ' Find solution in our documentation\n' + + '
    \n' + + ' \n' + + '
    \n' + + ' SysLoad\n' + + '
    \n' + + ' '; + +$(document).ready(function(){ + var sys_height=$(".io-log").height(); + $(".io-log2").css("top", sys_height+50); + setTimeout(function() { + iolog = getCookie("iolog"); + //console.log('cookie: "'+iolog+'"'); + if (iolog === '1') { + showIoLog(0); + return 1; + } + if (iolog === '0') { + //setCookie("iolog", 0, 365); + hideIoLog(0); + return 0; + } + if (iolog == '') { + //console.log('cookie is empty'); + //setCookie("iolog", 1, 365); + showIoLog(0); + return ''; + } + }, 1); + + if (GLOBAL.CURRENT_USER_FINAL == 'admin') $(".body-user .l-content > .l-center.units").first().prepend( iohtml ); + + $(".io-log").on("click", function() { + var showlog=checkCookie(); + //console.log('cookie = "'+iolog+'"'); + if (showlog===1 || showlog=='') { + //console.log('cookie is active or empty, calling hidelog()'); + setCookie("iolog", 0, 365); + hideIoLog(1); + } + if (showlog===0) { + //console.log('cookie is inactive, calling showlog()'); + setCookie("iolog", 1, 365); + showIoLog(1); + } + + }); +}); + diff --git a/web/js/init.js b/web/js/init.js index 6c60ff85..4da9422f 100644 --- a/web/js/init.js +++ b/web/js/init.js @@ -32,15 +32,17 @@ $(document).ready(function(){ // CREATE BUTTON - - $('.l-sort__create-btn').hover(function(){ - $(".l-sort__create-btn").append("
    "); - $(".l-sort__create-btn").append("
    "+$('.l-sort__create-btn').attr('title').replace(' ',' ')+"
    "); - }, function(){ - $("#add-icon").remove(); - $("#tooltip").remove(); - }); - + if ($(".l-sort__create-btn").length>0) { + $(".l-sort__create-btn").append("
    "); + $(".l-sort__create-btn").append("
    "+$('.l-sort__create-btn').attr('title').replace(' ',' ')+"
    "); + $('.l-sort__create-btn').hover(function(){ + $("#tooltip").css('background-color', '#1ca2cc'); + }, function() { + $("#tooltip").css('background-color', '#34b5dd'); + //$("#add-icon").remove(); + //$("#tooltip").remove(); + }); + } // SEARCH BOX diff --git a/web/templates/admin/list_dns_rec.html b/web/templates/admin/list_dns_rec.html index 24f28103..f84b504f 100644 --- a/web/templates/admin/list_dns_rec.html +++ b/web/templates/admin/list_dns_rec.html @@ -105,7 +105,7 @@ v_unit_id="" v_section="dns_rec">
    12 ) echo '...'; ?>
     
    -
    +
    diff --git a/web/templates/admin/list_server_info.html b/web/templates/admin/list_server_info.html index 7a131572..7ff5feec 100644 --- a/web/templates/admin/list_server_info.html +++ b/web/templates/admin/list_server_info.html @@ -5,6 +5,10 @@ Vesta - <?=__($TAB)?> + + + + @@ -12,7 +16,7 @@ - + diff --git a/web/templates/admin/list_user.html b/web/templates/admin/list_user.html index 4ad3daec..1e5a67cc 100644 --- a/web/templates/admin/list_user.html +++ b/web/templates/admin/list_user.html @@ -1,9 +1,9 @@
    '; - } else { + if ($user != 'admin') { + //echo ''; + //} else { echo ''; } ?> @@ -61,12 +61,15 @@
    -

    ".__("What's new:")."


    ".$changelog."
    ".__("This only admin see after myVesta upgrade, and will dissapear on next refresh.")." ".__("If you missed an update, see our previous")." ".__("change logs").".
    ".__("Check out our")." ".__("new site, forum and knowledge base").".


    "; - + if ($user == 'admin') { + echo ''; + } + if (isset($changelog)) { + echo "

    ".__("What's new:")."


    ".$changelog."
    ".__("This only admin see after myVesta upgrade, and will dissapear on next refresh.")." ".__("If you missed an update, see our previous")." ".__("change logs").".
    ".__("Check out our")." ".__("new site, forum and knowledge base").".


    "; + } + foreach ($data as $key => $value) { ++$i; if ($data[$key]['SUSPENDED'] == 'yes') { @@ -176,7 +179,7 @@ sort-bandwidth="" sort-disk="
    -
    :
    +
    :
    diff --git a/web/templates/admin/list_weblog.html b/web/templates/admin/list_weblog.html index b46e7979..08fea512 100644 --- a/web/templates/admin/list_weblog.html +++ b/web/templates/admin/list_weblog.html @@ -5,6 +5,10 @@ Vesta - <?=__('Web Log Manager')?> + + + + @@ -12,7 +16,7 @@ - + diff --git a/web/templates/admin/panel.html b/web/templates/admin/panel.html index b4534ccd..4c1fdaf7 100644 --- a/web/templates/admin/panel.html +++ b/web/templates/admin/panel.html @@ -40,9 +40,10 @@
    +
    -
    +
    • :
    • :
    • @@ -52,7 +53,7 @@
      -
      +
      • :
      • :
      • @@ -64,7 +65,7 @@
        -
        +
        • :
        • :
        • @@ -76,7 +77,7 @@
          -
          +
          -
          -
          myVesta
          Build date:
          -