Browse Source

Merge branch 'master' into feature-osal

Ernesto Nicolás Carrea 5 years ago
parent
commit
4ef78fca87
43 changed files with 598 additions and 716 deletions
  1. 12 0
      bin/v-add-sys-quota
  2. 8 1
      bin/v-add-web-domain-stats
  3. 1 1
      bin/v-backup-user
  4. 106 0
      bin/v-change-sys-db-alias
  5. 0 88
      bin/v-change-sys-pma
  6. 25 32
      bin/v-change-web-domain-stats
  7. 2 0
      bin/v-delete-sys-quota
  8. 2 2
      bin/v-delete-user-2fa
  9. 9 9
      bin/v-list-sys-config
  10. 4 0
      bin/v-restore-user
  11. 21 0
      func/upgrade.sh
  12. 36 18
      install/deb/filemanager/install-fm.sh
  13. 1 1
      install/deb/nginx/phpmyadmin.inc
  14. 1 1
      install/deb/nginx/phppgadmin.inc
  15. 1 1
      install/deb/pga/phppgadmin.conf
  16. 1 1
      install/deb/pma/apache.conf
  17. 5 0
      install/deb/themes/dark.css
  18. 61 28
      install/hst-install-debian.sh
  19. 61 28
      install/hst-install-ubuntu.sh
  20. 31 7
      install/upgrade/versions/latest.sh
  21. 3 0
      src/deb/hestia/postinst
  22. 21 0
      src/hst_bootstrap_install.sh
  23. 2 2
      web/add/db/index.php
  24. 1 0
      web/css/active-theme.css
  25. 136 159
      web/css/src/styles.css
  26. 0 0
      web/css/styles.min.css
  27. 4 4
      web/edit/server/index.php
  28. 7 0
      web/edit/web/index.php
  29. 2 2
      web/inc/i18n/de.php
  30. 6 6
      web/inc/i18n/en.php
  31. 2 2
      web/inc/i18n/it.php
  32. 0 6
      web/inc/secure_login.php
  33. 0 53
      web/js/i18n.js.php
  34. 0 240
      web/js/templates.js
  35. 2 2
      web/templates/admin/edit_server.html
  36. 6 7
      web/templates/admin/list_db.html
  37. 1 1
      web/templates/admin/list_firewall_ipset.html
  38. 1 1
      web/templates/admin/list_rrd.html
  39. 1 1
      web/templates/admin/list_server_info.html
  40. 1 1
      web/templates/admin/list_weblog.html
  41. 1 1
      web/templates/header.html
  42. 5 0
      web/templates/reset2fa.html
  43. 8 10
      web/templates/user/list_db.html

+ 12 - 0
bin/v-add-sys-quota

@@ -18,6 +18,17 @@ source $HESTIA/conf/hestia.conf
 #                    Verifications                         #
 #----------------------------------------------------------#
 
+# Ensure that quota kernel modules are installed
+kernel_module_check=$(find /lib/modules/`uname -r` -type f -name '*quota_v*.ko*' | egrep '.*' && [ $? -eq 0 ])
+if [ -z "$kernel_module_check" ]; then
+    # Install kernel modules for quota support. 
+    # Requires reboot to activate updated kernel.
+    echo "Installing required kernel modules for quota support..."
+    reboot_req="Y"
+    apt-get -qq install linux-image-extra-virtual -y
+    check_result $? "kernel module installation failed" $E_UPDATE
+fi
+
 # Checking quota package
 quota=$(which --skip-alias --skip-functions quota 2>/dev/null)
 if [ $? -ne 0 ]; then
@@ -85,6 +96,7 @@ done
 #----------------------------------------------------------#
 
 # Logging
+log_history "system quota enforcement enabled"
 log_event "$OK" "$ARGUMENTS"
 
 exit

+ 8 - 1
bin/v-add-web-domain-stats

@@ -55,6 +55,13 @@ get_domain_values 'web'
 
 # Adding statistic config
 prepare_web_domain_values
+
+if [ -z "${aliases//,/ }" ]; then
+    stats_alias="localhost"
+else
+    stats_alias=${aliases_idn//,/ }
+fi
+
 cat $WEBTPL/$type/$type.tpl |\
     sed -e "s|%ip%|$ip|g" \
         -e "s|%web_port%|$WEB_PORT|g" \
@@ -69,7 +76,7 @@ cat $WEBTPL/$type/$type.tpl |\
         -e "s|%user%|$user|g" \
         -e "s|%home%|$HOMEDIR|g" \
         -e "s|%alias%|${aliases//,/ }|g" \
-        -e "s|%alias_idn%|${aliases_idn//,/ }|g" \
+        -e "s|%alias_idn%|$stats_alias|g" \
     > $HOMEDIR/$user/conf/web/$domain/$type.conf
 
 if [ "$type" == 'awstats' ]; then

+ 1 - 1
bin/v-backup-user

@@ -948,7 +948,7 @@ if [ -e "$BACKUP/$user.log" ] && [ "$notify" = "yes" ]; then
     email=$(get_user_value '$CONTACT')
     cat $BACKUP/$user.log |$SENDMAIL -s "$subj" $email $notify
     rm $BACKUP/$user.log
-    $BIN/v-add-user-notification $user "$subj" "$email"
+    $BIN/v-add-user-notification "$user" "Backup created successfully" "<b>Archive:</b> $user.$backup_new_date.tar"
 fi
 
 # Logging

+ 106 - 0
bin/v-change-sys-db-alias

@@ -0,0 +1,106 @@
+#!/bin/bash
+# info: change phpmyadmin/phppgadmin alias url
+# options: type alias
+# example:  v-change-sys-db-alias pma phpmyadmin
+#           Sets phpMyAdmin alias to phpmyadmin
+#
+# example:  v-change-sys-db-alias pga phppgadmin
+#           Sets phpPgAdmin alias to phppgadmin
+#
+# This function changes the database editor url in
+# apache2 or nginx configuration.
+
+
+#----------------------------------------------------------#
+#                    Variable&Function                     #
+#----------------------------------------------------------#
+
+# Argument definition
+type=$1
+alias=$2
+
+# Includes
+source $HESTIA/func/main.sh
+source $HESTIA/conf/hestia.conf
+
+
+#----------------------------------------------------------#
+#                    Verifications                         #
+#----------------------------------------------------------#
+
+check_args '2' "$#" 'type alias'
+
+# Perform verification if read-only mode is enabled
+check_hestia_demo_mode
+
+
+#----------------------------------------------------------#
+#                       Action                             #
+#----------------------------------------------------------#
+
+# Detect common allowed entries for phpMyAdmin
+if [ "$type" = "pma" ] || [ "$type" = "PMA" ] || [ "$type" = "phpmyadmin" ]; then
+    # Set database editor friendly name
+    db_editor="phpMyAdmin"
+
+    # Set new alias value
+    $BIN/v-change-sys-config-value 'DB_PMA_ALIAS' "$alias"
+
+    # Replace old configuration files and update alias
+    if [ -e "/etc/apache2/conf.d/phpmyadmin.conf" ]; then
+        rm -f /etc/apache2/conf.d/phpmyadmin.conf
+        cp -f $HESTIA_INSTALL_DIR/pma/apache.conf /etc/apache2/conf.d/phpmyadmin.conf
+        sed -i "s|%pma_alias%|$alias|g" /etc/apache2/conf.d/phpmyadmin.conf
+        
+        # Restart services
+        $HESTIA/bin/v-restart-service apache2
+    fi
+
+    if [ -e "/etc/nginx/conf.d/phpmyadmin.inc" ]; then
+        rm -f /etc/nginx/conf.d/phpmyadmin.inc
+        cp -f $HESTIA_INSTALL_DIR/nginx/phpmyadmin.inc /etc/nginx/conf.d/phpmyadmin.inc
+        sed -i "s|%pma_alias%|$alias|g" /etc/nginx/conf.d/phpmyadmin.inc
+        
+        # Restart services
+        $HESTIA/bin/v-restart-service nginx
+    fi
+fi
+
+# Detect common allowed entries for phpPgAdmin
+if [ "$type" = "pga" ] || [ "$type" = "PGA" ] || [ "$type" = "phppgadmin" ]; then
+    # Set database editor friendly name
+    db_editor="phpPgAdmin"
+
+    # Set new alias value
+    $BIN/v-change-sys-config-value 'DB_PGA_ALIAS' "$alias"
+
+    # Replace old configuration files and update alias
+    if [ -e "/etc/apache2/conf.d/phppgadmin.conf" ]; then
+        rm -f /etc/apache2/conf.d/phppgadmin.conf
+        cp -f $HESTIA_INSTALL_DIR/pga/phppgadmin.conf /etc/apache2/conf.d/phppgadmin.conf
+        sed -i "s|%pga_alias%|$alias|g" /etc/apache2/conf.d/phppgadmin.conf 
+        
+        # Restart services
+        $HESTIA/bin/v-restart-service apache2
+    fi
+
+    if [ -e "/etc/nginx/conf.d/phppgadmin.inc" ]; then
+        rm -f /etc/nginx/conf.d/phppgadmin.inc
+        cp -f $HESTIA_INSTALL_DIR/nginx/phppgadmin.inc /etc/nginx/conf.d/phppgadmin.inc
+        sed -i "s|%pga_alias%|$alias|g" /etc/nginx/conf.d/phppgadmin.inc
+        
+        # Restart services
+        $HESTIA/bin/v-restart-service nginx
+    fi
+fi
+
+
+#----------------------------------------------------------#
+#                       Hestia                             #
+#----------------------------------------------------------#
+
+# Logging
+log_history "changed $db_editor alias to $alias"
+log_event "$OK" "$ARGUMENTS"
+
+exit

+ 0 - 88
bin/v-change-sys-pma

@@ -1,88 +0,0 @@
-#!/bin/bash
-# info: change phpmyadmin alias url
-# options: PMA
-#
-# This function changes the phpmyadmin url in apache2 or nginx configuration.
-
-
-#----------------------------------------------------------#
-#                    Variable&Function                     #
-#----------------------------------------------------------#
-
-# Argument definition
-PMA=$1
-
-# Includes
-source $HESTIA/func/main.sh
-source $HESTIA/conf/hestia.conf
-
-
-#----------------------------------------------------------#
-#                    Verifications                         #
-#----------------------------------------------------------#
-
-check_args '1' "$#" 'PMA'
-
-# Check if string has leading /
-if [[ ! ${PMA:0:1} == "/" ]]; then
-    PMA="/$PMA"
-fi
-
-# Perform verification if read-only mode is enabled
-check_hestia_demo_mode
-
-
-#----------------------------------------------------------#
-#                       Action                             #
-#----------------------------------------------------------#
-
-# Get existing apache2 pma alias
-if [ -f /etc/apache2/conf.d/phpmyadmin.conf ]; then
-    apache_pma=$(cat /etc/apache2/conf.d/phpmyadmin.conf | grep "Alias" | { IFS=' '; read -r -a array; echo "${array[1]}"; })
-fi
-
-# Get existing nginx pma alias
-if [ -f /etc/nginx/conf.d/phpmyadmin.inc ]; then
-    nginx_pma=$(cat /etc/nginx/conf.d/phpmyadmin.inc | grep "location" | { IFS=' '; read -r -a array; echo "${array[1]}"; })
-fi
-
-# Check if alias is different for apache2
-if [ ! -z "$apache_pma" ]; then
-    if [ ! "$apache_pma" = "$PMA" ]; then
-        # Replace pma alias in config files.
-        sed -i "s|Alias $apache_pma|Alias $PMA|" /etc/apache2/conf.d/phpmyadmin.conf
-
-        # Replace in Backend UI
-        sed -i "s|$apache_pma/|$PMA/|" /usr/local/hestia/web/templates/admin/list_db.html
-        sed -i "s|$apache_pma/|$PMA/|" /usr/local/hestia/web/templates/user/list_db.html
-
-        # Restart services
-        $HESTIA/bin/v-restart-service apache2
-    fi
-fi
-
-# Check if alias is different for nginx
-if [ ! -z "$nginx_pma" ]; then
-    if [ ! "$nginx_pma" = "$PMA" ]; then
-        # Replace pma alias in config files.
-        sed -i "s|$nginx_pma|$PMA|" /etc/nginx/conf.d/phpmyadmin.inc
-        sed -i "s|/usr/share$PMA|/usr/share/phpmyadmin|" /etc/nginx/conf.d/phpmyadmin.inc
-
-        # Replace in Backend UI
-        sed -i "s|$nginx_pma/|$PMA/|" /usr/local/hestia/web/templates/admin/list_db.html
-        sed -i "s|$nginx_pma/|$PMA/|" /usr/local/hestia/web/templates/user/list_db.html
-
-        # Restart services
-        $HESTIA/bin/v-restart-service nginx
-    fi
-fi
-
-
-#----------------------------------------------------------#
-#                       Hestia                             #
-#----------------------------------------------------------#
-
-# Logging
-#log_event "$OK" "$ARGUMENTS"
-
-exit

+ 25 - 32
bin/v-change-web-domain-stats

@@ -38,7 +38,6 @@ is_object_valid 'user' 'USER' "$user"
 is_object_unsuspended 'user' 'USER' "$user"
 is_object_valid 'web' 'DOMAIN' "$domain"
 is_object_unsuspended 'web' 'DOMAIN' "$domain"
-is_object_value_exist 'web' 'DOMAIN' "$domain" '$STATS'
 
 # Perform verification if read-only mode is enabled
 check_hestia_demo_mode
@@ -48,50 +47,44 @@ check_hestia_demo_mode
 #                       Action                             #
 #----------------------------------------------------------#
 
-# Defining statistic type
+# Parse aliases
 get_domain_values 'web'
 
-# Comparing stats types
-if [ "$STATS" == $type ]; then
-    log_event "$OK" "$ARGUMENTS"
-    exit 0
-fi
-
-# Defining statistic dir
-stats_dir="$HOMEDIR/$user/web/$domain/stats"
-
-# Deleting dir content
-rm -rf $stats_dir/*
-
 # Deleting config
-rm -f $HOMEDIR/$user/conf/web/$domain/$STATS.conf
+rm -f $HOMEDIR/$user/conf/web/$domain/$type.conf
 
 # Adding statistic config
 prepare_web_domain_values
+
+if [ -z "${aliases//,/ }" ]; then
+    stats_alias="localhost"
+else
+    stats_alias=${aliases_idn//,/ }
+fi
+
 cat $WEBTPL/$type/$type.tpl |\
-    sed -e "s/%ip%/$ip/g" \
-        -e "s/%web_port%/$WEB_PORT/g" \
-        -e "s/%web_system%/$WEB_SYSTEM/g" \
-        -e "s/%web_ssl_port%/$WEB_SSL_PORT/g" \
-        -e "s/%rgroups%/$WEB_RGROUPS/g" \
-        -e "s/%proxy_system%/$PROXY_SYSTEM/g" \
-        -e "s/%proxy_port%/$PROXY_PORT/g" \
-        -e "s/%proxy_ssl_port%/$PROXY_SSL_PORT/g" \
-        -e "s/%domain_idn%/$domain_idn/g" \
-        -e "s/%domain%/$domain/g" \
-        -e "s/%user%/$user/g" \
-        -e "s/%home%/${HOMEDIR////\/}/g" \
-        -e "s/%alias%/${aliases//,/ }/g" \
-        -e "s/%alias_idn%/${aliases_idn//,/ }/g" \
-    > $HOMEDIR/$user/conf/web/$type.$domain.conf
+    sed -e "s|%ip%|$ip|g" \
+        -e "s|%web_port%|$WEB_PORT|g" \
+        -e "s|%web_system%|$WEB_SYSTEM|g" \
+        -e "s|%web_ssl_port%|$WEB_SSL_PORT|g" \
+        -e "s|%rgroups%|$WEB_RGROUPs|g" \
+        -e "s|%proxy_system%|$PROXY_SYSTEM|g" \
+        -e "s|%proxy_port%|$PROXY_PORT|g" \
+        -e "s|%proxy_ssl_port%|$PROXY_SSL_PORT|g" \
+        -e "s|%domain_idn%|$domain_idn|g" \
+        -e "s|%domain%|$domain|g" \
+        -e "s|%user%|$user|g" \
+        -e "s|%home%|$HOMEDIR|g" \
+        -e "s|%alias%|${aliases//,/ }|g" \
+        -e "s|%alias_idn%|$stats_alias|g" \
+    > $HOMEDIR/$user/conf/web/$domain/$type.conf
 
 if [ "$type" == 'awstats' ]; then
     rm -f /etc/awstats/$type.$domain_idn.conf
-    ln -s $HOMEDIR/$user/conf/web/$type.$domain.conf \
+    ln -s $HOMEDIR/$user/conf/web/$domain/$type.conf \
         /etc/awstats/$type.$domain_idn.conf
 fi
 
-
 #----------------------------------------------------------#
 #                       Hestia                             #
 #----------------------------------------------------------#

+ 2 - 0
bin/v-delete-sys-quota

@@ -63,6 +63,8 @@ fi
 #----------------------------------------------------------#
 
 # Logging
+log_history 
+log_history "system quota enforcement disabled"
 log_event "$OK" "$ARGUMENTS"
 
 exit

+ 2 - 2
bin/v-delete-user-2fa

@@ -38,7 +38,7 @@ source $USER_DATA/user.conf
 
 # Check if 2FA is enabled
 if [ -z "$TWOFA" ]; then
-    echo "Error: 2FA is not enabled"
+    echo "Error: two-factor authentication is not enabled"
     exit $E_NOTEXIST
 fi
 
@@ -50,7 +50,7 @@ sed -i '/QRCODE=/d' $USER_DATA/user.conf
 #                       Hestia                             #
 #----------------------------------------------------------#
 
-log_history "2FA Disabled for $user"
+log_history "[WARNING] two-factor authentication disabled for $user"
 log_event "$OK" "$ARGUMENTS"
 
 exit

+ 9 - 9
bin/v-list-sys-config

@@ -50,8 +50,8 @@ json_list() {
         "BACKUP_GZIP": "'$BACKUP_GZIP'",
         "BACKUP": "'$BACKUP'",
         "WEBMAIL_ALIAS": "'$WEBMAIL_ALIAS'",
-        "DB_PMA_URL": "'$DB_PMA_URL'",
-        "DB_PGA_URL": "'$DB_PGA_URL'",
+        "DB_PMA_ALIAS": "'$DB_PMA_ALIAS'",
+        "DB_PGA_ALIAS": "'$DB_PGA_ALIAS'",
         "SOFTACULOUS": "'$SOFTACULOUS'"
     }
 }'
@@ -94,11 +94,11 @@ shell_list() {
     fi
     if [ ! -z "$DB_SYSTEM" ]; then
         echo "Database:         ${DB_SYSTEM//,/, }"
-        if [ ! -z "$DB_PMA_URL" ]; then
-            echo "PMA URL:          $DB_PMA_URL"
+        if [ ! -z "$DB_PMA_ALIAS" ]; then
+            echo "PMA ALIAS:          $DB_PMA_ALIAS"
         fi
-        if [ ! -z "$DB_PGA_URL" ]; then
-            echo "PGA URL:          $DB_PGA_URL"
+        if [ ! -z "$DB_PGA_ALIAS" ]; then
+            echo "PGA ALIAS:          $DB_PGA_ALIAS"
         fi
     fi
     if [ ! -z "$DNS_SYSTEM" ]; then
@@ -147,7 +147,7 @@ plain_list() {
     echo -ne "$DNS_SYSTEM\t$DNS_CLUSTER\t$STATS_SYSTEM\t$BACKUP_SYSTEM\t"
     echo -ne "$CRON_SYSTEM\t$DISK_QUOTA\t$FIREWALL_SYSTEM\t$FIREWALL_EXTENSION\t"
     echo -ne "$REPOSITORY\t$VERSION\t$DEMO_MODE\t$RELEASE_BRANCH\t$THEME\t$LANGUAGE\t"
-    echo -e "$BACKUP_GZIP\t$BACKUP\t$WEBMAIL_ALIAS\t$DB_PMA_URL\t$DB_PGA_URL"
+    echo -e "$BACKUP_GZIP\t$BACKUP\t$WEBMAIL_ALIAS\t$DB_PMA_ALIAS\t$DB_PGA_ALIAS"
 }
 
 
@@ -161,7 +161,7 @@ csv_list() {
     echo -n "'CRON_SYSTEM','DISK_QUOTA','FIREWALL_SYSTEM',"
     echo -n "'FIREWALL_EXTENSION','REPOSITORY',"
     echo -n "'VERSION','LANGUAGE','BACKUP_GZIP','BACKUP','WEBMAIL_ALIAS',"
-    echo -n "'DB_PMA_URL','DB_PGA_URL'"
+    echo -n "'DB_PMA_ALIAS','DB_PGA_ALIAS'"
     echo
     echo -n "'$WEB_SYSTEM','$WEB_RGROUPS','$WEB_PORT','$WEB_SSL',"
     echo -n "'$WEB_SSL_PORT','$WEB_BACKEND','$PROXY_SYSTEM','$PROXY_PORT',"
@@ -170,7 +170,7 @@ csv_list() {
     echo -n "'$DNS_CLUSTER','$STATS_SYSTEM','$BACKUP_SYSTEM','$CRON_SYSTEM',"
     echo -n "'$DISK_QUOTA','$FIREWALL_SYSTEM','$REPOSITORY','$FIREWALL_EXTENSION',"
     echo -n "'$VERSION','$DEMO_MODE','$RELEASE_BRANCH','$THEME','$LANGUAGE',"
-    echo -n "'$BACKUP_GZIP','$BACKUP','$WEBMAIL_ALIAS','$DB_PMA_URL','$DB_PGA_URL'"
+    echo -n "'$BACKUP_GZIP','$BACKUP','$WEBMAIL_ALIAS','$DB_PMA_ALIAS','$DB_PGA_ALIAS'"
     echo
 }
 

+ 4 - 0
bin/v-restore-user

@@ -815,6 +815,9 @@ chown -R $user:$user $HOMEDIR/$user/tmp
 subj="$user → restore has been completed"
 cat $tmpdir/restore.log |$SENDMAIL -s "$subj" $email $notify
 
+# Send notification to panel
+$HESTIA/bin/v-add-user-notification "$user" "Backup restored successfully" "<b>Archive:</b> $backup"
+
 # Deleting temporary data
 rm -rf $tmpdir
 
@@ -832,6 +835,7 @@ $BIN/v-update-user-counters admin
 $BIN/v-update-sys-ip-counters
 
 # Logging
+log_history "restored contents from backup archive $backup"
 log_event "$OK" "$ARGUMENTS"
 
 exit

+ 21 - 0
func/upgrade.sh

@@ -214,6 +214,27 @@ upgrade_phpmyadmin() {
     fi
 }
 
+update_php_templates() {
+    echo "(*) Updating default PHP templates..."
+    # Update default template
+    cp -f $HESTIA_INSTALL_DIR/templates/web/php-fpm/default.tpl \
+        $HESTIA/data/templates/web/php-fpm/default.tpl
+
+    # Update no-php template
+    cp -f $HESTIA_INSTALL_DIR/templates/web/php-fpm/no-php.tpl \
+        $HESTIA/data/templates/web/php-fpm/no-php.tpl
+
+    # Update  socket template
+    cp -f $HESTIA_INSTALL_DIR/templates/web/php-fpm/socket.tpl \
+        $HESTIA/data/templates/web/php-fpm/socket.tpl
+
+    for version in $($HESTIA/bin/v-list-sys-php plain); do 
+        echo "(*) Updating templates for PHP ${version}..."
+        cp -f $HESTIA_INSTALL_DIR/php-fpm/multiphp.tpl \
+            $HESTIA/data/templates/web/php-fpm/PHP-${version/\./_}.tpl; 
+    done
+}
+
 upgrade_get_version() {
     # Retrieve new version number for Hestia Control Panel from .deb package
     new_version=$(dpkg -l | awk '$2=="hestia" { print $3 }')

+ 36 - 18
install/deb/filemanager/install-fm.sh

@@ -11,6 +11,7 @@ if [ -z "$HESTIA" ]; then
 fi
 
 user='admin'
+fm_error='no'
 source $HESTIA/func/main.sh
 
 if [ -z "$HOMEDIR" ] || [ -z "$HESTIA_INSTALL_DIR" ]; then
@@ -28,28 +29,45 @@ FM_URL="https://github.com/filegator/filegator/releases/download/v${FM_V}/${FM_F
 COMPOSER_BIN="$HOMEDIR/$user/.composer/composer"
 if [ ! -f "$COMPOSER_BIN" ]; then
     $BIN/v-add-user-composer "$user"
-    check_result $? "Install composer failed"
+    if [ $? -ne 0 ]; then
+        $BIN/v-add-user-notification admin 'Composer installation failed!' '<b>The File Manager will not work without Composer.</b><br><br>Please try running the installer from a shell session:<br>bash $HESTIA/install/deb/filemanager/install-fm.sh<br><br>If this issue continues, please open an issue report on <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a>.'
+        fm_error='yes'
+    fi
 fi
 
-rm --recursive --force "$FM_INSTALL_DIR"
-mkdir -p "$FM_INSTALL_DIR"
-cd "$FM_INSTALL_DIR"
+if [ "$fm_error" != "yes" ]; then
+    rm --recursive --force "$FM_INSTALL_DIR"
+    mkdir -p "$FM_INSTALL_DIR"
+    cd "$FM_INSTALL_DIR"
 
-[ ! -f "${FM_INSTALL_DIR}/${FM_FILE}" ] && 
-    wget "$FM_URL" --quiet -O "${FM_INSTALL_DIR}/${FM_FILE}"
+    [ ! -f "${FM_INSTALL_DIR}/${FM_FILE}" ] && 
+        wget "$FM_URL" --quiet -O "${FM_INSTALL_DIR}/${FM_FILE}"
 
-unzip -qq "${FM_INSTALL_DIR}/${FM_FILE}"
-mv --force ${FM_INSTALL_DIR}/filegator/* "${FM_INSTALL_DIR}"
-rm --recursive --force ${FM_INSTALL_DIR}/filegator
-[[ -f "${FM_INSTALL_DIR}/${FM_FILE}" ]] && rm "${FM_INSTALL_DIR}/${FM_FILE}"
+    unzip -qq "${FM_INSTALL_DIR}/${FM_FILE}"
+    mv --force ${FM_INSTALL_DIR}/filegator/* "${FM_INSTALL_DIR}"
+    rm --recursive --force ${FM_INSTALL_DIR}/filegator
+    [[ -f "${FM_INSTALL_DIR}/${FM_FILE}" ]] && rm "${FM_INSTALL_DIR}/${FM_FILE}"
 
-cp --recursive --force ${HESTIA_INSTALL_DIR}/filemanager/filegator/* "${FM_INSTALL_DIR}"
+    cp --recursive --force ${HESTIA_INSTALL_DIR}/filemanager/filegator/* "${FM_INSTALL_DIR}"
 
-chown $user: -R "${FM_INSTALL_DIR}"
-COMPOSER_HOME="$HOMEDIR/$user/.config/composer" user_exec /usr/bin/php $COMPOSER_BIN --quiet --no-dev install
-check_result $? "Install filemanager dependency"
+    chown $user: -R "${FM_INSTALL_DIR}"
 
-chown root: -R "${FM_INSTALL_DIR}"
-chown $user: "${FM_INSTALL_DIR}/private"
-chown $user: "${FM_INSTALL_DIR}/private/logs"
-chown $user: "${FM_INSTALL_DIR}/repository"
+    # Check if php7.3 is available and run the installer
+    if [ -f "/usr/bin/php7.3" ]; then
+        COMPOSER_HOME="$HOMEDIR/$user/.config/composer" user_exec /usr/bin/php7.3 $COMPOSER_BIN --quiet --no-dev install
+        if [ $? -ne 0 ]; then
+            $BIN/v-add-user-notification admin 'File Manager installation failed!' 'Please try running the installer from a shell session:<br>bash $HESTIA/install/deb/filemanager/install-fm.sh<br><br>If this issue continues, please open an issue report on <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a>.'
+            fm_error="yes"
+        fi
+    else
+        $BIN/v-add-user-notification admin 'File Manager installation failed!' '<b>Unable to proceed with installation of File Manager.</b><br><br>Package <b>php7.3-cli</b> is missing from your system. Please check your PHP installation and environment settings.'
+        fm_error="yes"
+    fi
+
+    if [ "$fm_error" != "yes" ]; then
+        chown root: -R "${FM_INSTALL_DIR}"
+        chown $user: "${FM_INSTALL_DIR}/private"
+        chown $user: "${FM_INSTALL_DIR}/private/logs"
+        chown $user: "${FM_INSTALL_DIR}/repository"
+    fi
+fi

+ 1 - 1
install/deb/nginx/phpmyadmin.inc

@@ -1,4 +1,4 @@
-location /phpmyadmin {
+location /%pma_alias% {
     alias /usr/share/phpmyadmin/;
 
     location ~ /(libraries|setup) {

+ 1 - 1
install/deb/nginx/phppgadmin.inc

@@ -1,4 +1,4 @@
-location /phppgadmin {
+location /%pga_alias% {
     alias /usr/share/phppgadmin/;
 
     location ~ ^/phppgadmin/(.*\.php)$ {

+ 1 - 1
install/deb/pga/phppgadmin.conf

@@ -1,4 +1,4 @@
-Alias /phppgadmin /usr/share/phppgadmin
+Alias /%pga_alias% /usr/share/phppgadmin
 
 <Directory /usr/share/phppgadmin>
 

+ 1 - 1
install/deb/pma/apache.conf

@@ -1,6 +1,6 @@
 # phpMyAdmin default Apache configuration
 
-Alias /phpmyadmin /usr/share/phpmyadmin
+Alias /%pma_alias% /usr/share/phpmyadmin
 
 <Directory /usr/share/phpmyadmin>
 	Options FollowSymLinks

+ 5 - 0
install/deb/themes/dark.css

@@ -585,6 +585,7 @@ div.l-content > div.l-separator:nth-of-type(4) {
 }
 
 .vst-ok a {
+  color: #ffffff;
 }
 
 .vst-ok a:hover {
@@ -1464,6 +1465,10 @@ form#vstobjects.suspended {
   color: #cacaca !important; 
 }
 
+.graph-rounded {
+  border-radius: 8px;
+}
+
 .body-rrd .units .l-unit {
   background-color: #282828 !important;
   border-left: 1px solid transparent !important;

+ 61 - 28
install/hst-install-debian.sh

@@ -436,22 +436,28 @@ fi
 #                       Brief Info                         #
 #----------------------------------------------------------#
 
+install_welcome_message() {
+    echo
+    echo '                _   _           _   _        ____ ____                  '
+    echo '               | | | | ___  ___| |_(_) __ _ / ___|  _ \                 '
+    echo '               | |_| |/ _ \/ __| __| |/ _` | |   | |_) |                '
+    echo '               |  _  |  __/\__ \ |_| | (_| | |___|  __/                 '
+    echo '               |_| |_|\___||___/\__|_|\__,_|\____|_|                    '
+    echo "                                                                        "
+    echo "                          Hestia Control Panel                          "
+    echo "                                  ${HESTIA_INSTALL_VER}                 "
+    echo "                            www.hestiacp.com                            "
+    echo
+    echo "========================================================================"
+    echo 
+    echo "Thank you for downloading Hestia Control Panel! In a few moments,"
+    echo "we will begin installing the following components on your server:"          
+    echo
+}
+
 # Printing nice ASCII logo
 clear
-echo
-echo '  _   _           _   _        ____ ____  '
-echo ' | | | | ___  ___| |_(_) __ _ / ___|  _ \ '
-echo ' | |_| |/ _ \/ __| __| |/ _` | |   | |_) |'
-echo ' |  _  |  __/\__ \ |_| | (_| | |___|  __/ '
-echo ' |_| |_|\___||___/\__|_|\__,_|\____|_|    '
-echo
-echo '                      Hestia Control Panel'
-echo "                                    v${HESTIA_INSTALL_VER}"
-echo -e "\n"
-echo "===================================================================="
-echo -e "\n"
-echo 'The following components will be installed on your server:'
-echo
+install_welcome_message
 
 # Web stack
 if [ "$nginx" = 'yes' ]; then
@@ -521,7 +527,7 @@ if [ "$iptables" = 'yes' ] && [ "$fail2ban" = 'yes' ]; then
     echo -n ' + Fail2Ban Access Monitor'
 fi
 echo -e "\n"
-echo "===================================================================="
+echo "========================================================================"
 echo -e "\n"
 
 # Asking for confirmation to proceed
@@ -856,7 +862,7 @@ echo -e '#!/bin/sh\nexit 101' > /usr/sbin/policy-rc.d
 chmod a+x /usr/sbin/policy-rc.d
 
 # Installing apt packages
-echo "Now installing Hestia Control Panel and all required dependencies."
+echo "The installer is now downloading and installing all required packages."
 echo -ne "NOTE: This process may take 10 to 15 minutes to complete, please wait... "
 echo
 apt-get -y install $software > /dev/null 2>&1 &
@@ -876,31 +882,41 @@ echo
 wait $BACK_PID
 check_result $? "apt-get install failed"
 
+echo
+echo "========================================================================"
+echo
+
 # Install Hestia packages from local folder
 if [ ! -z "$withdebs" ] && [ -d "$withdebs" ]; then
-    dpkg -i $withdebs/hestia_*.deb
+    echo "(*) Installing local package files..."
+    echo "    - hestia core package"
+    dpkg -i $withdebs/hestia_*.deb > /dev/null 2>&1
 
     if [ -z $(ls $withdebs/hestia-php_*.deb 2>/dev/null) ]; then
+        echo "    - hestia-php backend package (from apt)"
         apt-get -y install hestia-php > /dev/null 2>&1
     else
-        dpkg -i $withdebs/hestia-php_*.deb
+        echo "    - hestia-php backend package"
+        dpkg -i $withdebs/hestia-php_*.deb > /dev/null 2>&1
     fi
 
     if [ -z $(ls $withdebs/hestia-nginx_*.deb 2>/dev/null) ]; then
+        echo "    - hestia-nginx backend package (from apt)"
         apt-get -y install hestia-nginx > /dev/null 2>&1
     else
-        dpkg -i $withdebs/hestia-nginx_*.deb
+        echo "    - hestia-nginx backend package"
+        dpkg -i $withdebs/hestia-nginx_*.deb > /dev/null 2>&1
     fi
 fi
 
 # Restoring autostart policy
 rm -f /usr/sbin/policy-rc.d
 
-
 #----------------------------------------------------------#
 #                     Configure system                     #
 #----------------------------------------------------------#
 
+
 echo "(*) Configuring system settings..."
 # Enable SSH password authentication
 sed -i "s/rdAuthentication no/rdAuthentication yes/g" /etc/ssh/sshd_config
@@ -1212,7 +1228,7 @@ if [ "$apache" = 'yes' ]; then
     a2enmod ssl > /dev/null 2>&1
     a2enmod actions > /dev/null 2>&1
     a2dismod --quiet status > /dev/null 2>&1
-    a2enmod --quiet hestia-status
+    a2enmod --quiet hestia-status > /dev/null 2>&1
 
     if [ "$phpfpm" = 'yes' ]; then
         # Disable prefork and php, enable event
@@ -1402,9 +1418,16 @@ if [ "$mysql" = 'yes' ]; then
     mkdir /usr/share/phpmyadmin/tmp
     chmod 777 /usr/share/phpmyadmin/tmp
 
+    if [ -e /var/lib/phpmyadmin/blowfish_secret.inc.php ]; then
+        chmod 0644 /var/lib/phpmyadmin/blowfish_secret.inc.php
+    fi
+    
     # Clear Up
     rm -fr phpMyAdmin-$pma_v-all-languages
     rm -f phpMyAdmin-$pma_v-all-languages.tar.gz
+
+    echo "DB_PMA_ALIAS='phpmyadmin'" >> $HESTIA/conf/hestia.conf
+    $HESTIA/bin/v-change-sys-db-alias 'pma' "phpmyadmin"
 fi
 
 
@@ -1424,6 +1447,9 @@ if [ "$postgresql" = 'yes' ]; then
         cp -f $HESTIA_INSTALL_DIR/pga/phppgadmin.conf /etc/apache2/conf.d/
     fi
     cp -f $HESTIA_INSTALL_DIR/pga/config.inc.php /etc/phppgadmin/
+
+    echo "DB_PGA_ALIAS='phppgadmin'" >> $HESTIA/conf/hestia.conf
+    $HESTIA/bin/v-change-sys-db-alias 'pga' "phppgadmin"
 fi
 
 
@@ -1622,12 +1648,12 @@ if [ "$dovecot" = 'yes' ] && [ "$exim" = 'yes' ] && [ "$mysql" = 'yes' ]; then
     cp -f $HESTIA_INSTALL_DIR/roundcube/plugins/config_zipdownload.inc.php /etc/roundcube/plugins/zipdownload/config.inc.php
     
     # Fixes for PHP 7.4 compatibility
-    sed -i 's/$identities, "\\n"/"\\n", $identities/g' /usr/share/roundcube/plugins/enigma/lib/enigma_ui.php
-    sed -i 's/(array_keys($post_search), \x27|\x27)/(\x27|\x27, array_keys($post_search))/g' /usr/share/roundcube/program/lib/Roundcube/rcube_contacts.php
-    sed -i 's/implode($name, \x27.\x27)/implode(\x27.\x27, $name)/g' /usr/share/roundcube/program/lib/Roundcube/rcube_db.php
-    sed -i 's/$fields, \x27,\x27/\x27,\x27, $fields/g' /usr/share/roundcube/program/steps/addressbook/search.inc
-    sed -i 's/implode($fields, \x27,\x27)/implode(\x27,\x27, $fields)/g' /usr/share/roundcube/program/steps/addressbook/search.inc
-    sed -i 's/implode($bstyle, \x27; \x27)/implode(\x27; \x27, $bstyle)/g' /usr/share/roundcube/program/steps/mail/sendmail.inc
+    [ -f "/usr/share/roundcube/plugins/enigma/lib/enigma_ui.php" ] && sed -i 's/$identities, "\\n"/"\\n", $identities/g' /usr/share/roundcube/plugins/enigma/lib/enigma_ui.php
+    [ -f "/usr/share/roundcube/program/lib/Roundcube/rcube_contacts.php" ] && sed -i 's/(array_keys($post_search), \x27|\x27)/(\x27|\x27, array_keys($post_search))/g' /usr/share/roundcube/program/lib/Roundcube/rcube_contacts.php
+    [ -f "/usr/share/roundcube/program/lib/Roundcube/rcube_db.php" ] && sed -i 's/implode($name, \x27.\x27)/implode(\x27.\x27, $name)/g' /usr/share/roundcube/program/lib/Roundcube/rcube_db.php
+    [ -f "/usr/share/roundcube/program/steps/addressbook/search.inc" ] && sed -i 's/$fields, \x27,\x27/\x27,\x27, $fields/g' /usr/share/roundcube/program/steps/addressbook/search.inc
+    [ -f "/usr/share/roundcube/program/steps/addressbook/search.inc" ] && sed -i 's/implode($fields, \x27,\x27)/implode(\x27,\x27, $fields)/g' /usr/share/roundcube/program/steps/addressbook/search.inc
+    [ -f "/usr/share/roundcube/program/steps/mail/sendmail.inc" ] && sed -i 's/implode($bstyle, \x27; \x27)/implode(\x27; \x27, $bstyle)/g' /usr/share/roundcube/program/steps/mail/sendmail.inc
     
     # Configure webmail alias
     echo "WEBMAIL_ALIAS='webmail'" >> $HESTIA/conf/hestia.conf
@@ -1838,6 +1864,13 @@ $HESTIA/bin/v-change-sys-port $port > /dev/null 2>&1
 # Set default theme
 $HESTIA/bin/v-change-sys-theme 'default'
 
+# Update remaining packages since repositories have changed
+echo -ne "(*) Installing remaining software updates..."
+apt-get -qq update
+apt-get -y upgrade >> $LOG &
+BACK_PID=$!
+echo
+
 # Starting Hestia service
 update-rc.d hestia defaults
 systemctl start hestia
@@ -1910,7 +1943,7 @@ cat $tmpfile
 rm -f $tmpfile
 
 # Add welcome message to notification panel
-$HESTIA/bin/v-add-user-notification admin 'Welcome to Hestia Control Panel!' 'Please report any bugs or issues via <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a> or e-mail <a href="mailto:info@hestiacp.com?Subject="['$new_version'] Bug Report: ">info@hestiacp.com</a><br><br><b>Have a wonderful day!</b><br><br><i class="fas fa-heart status-icon red"></i> The Hestia Control Panel development team'
+$HESTIA/bin/v-add-user-notification admin 'Welcome to Hestia Control Panel!' '<br>You are now ready to begin <a href="/add/user/">adding user accounts</a> and <a href="/add/web/">domains</a>. For help and assistance, view the <a href="https://docs.hestiacp.com/" target="_new">documentation</a> or visit our <a href="https://forum.hestiacp.com/" target="_new">user forum</a>.<br><br>Please report any bugs or issues via <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a> or e-mail <a href="mailto:info@hestiacp.com?Subject="['$new_version'] Bug Report: ">info@hestiacp.com</a>.<br><br><b>Have a wonderful day!</b><br><br><i class="fas fa-heart status-icon red"></i> The Hestia Control Panel development team'
 
 echo "(!) IMPORTANT: You must logout or restart the server before continuing."
 echo ""

+ 61 - 28
install/hst-install-ubuntu.sh

@@ -411,22 +411,28 @@ fi
 #                       Brief Info                         #
 #----------------------------------------------------------#
 
+install_welcome_message() {
+    echo
+    echo '                _   _           _   _        ____ ____                  '
+    echo '               | | | | ___  ___| |_(_) __ _ / ___|  _ \                 '
+    echo '               | |_| |/ _ \/ __| __| |/ _` | |   | |_) |                '
+    echo '               |  _  |  __/\__ \ |_| | (_| | |___|  __/                 '
+    echo '               |_| |_|\___||___/\__|_|\__,_|\____|_|                    '
+    echo "                                                                        "
+    echo "                          Hestia Control Panel                          "
+    echo "                                  ${HESTIA_INSTALL_VER}                 "
+    echo "                            www.hestiacp.com                            "
+    echo
+    echo "========================================================================"
+    echo 
+    echo "Thank you for downloading Hestia Control Panel! In a few moments,"
+    echo "we will begin installing the following components on your server:"          
+    echo
+}
+
 # Printing nice ASCII logo
 clear
-echo
-echo '  _   _           _   _        ____ ____  '
-echo ' | | | | ___  ___| |_(_) __ _ / ___|  _ \ '
-echo ' | |_| |/ _ \/ __| __| |/ _` | |   | |_) |'
-echo ' |  _  |  __/\__ \ |_| | (_| | |___|  __/ '
-echo ' |_| |_|\___||___/\__|_|\__,_|\____|_|    '
-echo
-echo '                      Hestia Control Panel'
-echo "                                    v${HESTIA_INSTALL_VER}"
-echo -e "\n"
-echo "===================================================================="
-echo -e "\n"
-echo 'The following components will be installed on your server:'
-echo
+install_welcome_message
 
 # Web stack
 if [ "$nginx" = 'yes' ]; then
@@ -496,7 +502,7 @@ if [ "$iptables" = 'yes' ] && [ "$fail2ban" = 'yes' ]; then
     echo -n ' + Fail2Ban Access Monitor'
 fi
 echo -e "\n"
-echo "===================================================================="
+echo "========================================================================"
 echo -e "\n"
 
 # Asking for confirmation to proceed
@@ -854,7 +860,7 @@ echo -e '#!/bin/sh\nexit 101' > /usr/sbin/policy-rc.d
 chmod a+x /usr/sbin/policy-rc.d
 
 # Installing apt packages
-echo "Now installing Hestia Control Panel and all required dependencies."
+echo "The installer is now downloading and installing all required packages."
 echo -ne "NOTE: This process may take 10 to 15 minutes to complete, please wait... "
 echo
 apt-get -y install $software > /dev/null 2>&1 &
@@ -874,20 +880,30 @@ echo
 wait $BACK_PID
 check_result $? "apt-get install failed"
 
+echo
+echo "========================================================================"
+echo
+
 # Install Hestia packages from local folder
 if [ ! -z "$withdebs" ] && [ -d "$withdebs" ]; then
-    dpkg -i $withdebs/hestia_*.deb
+    echo "(*) Installing local package files..."
+    echo "    - hestia core package"
+    dpkg -i $withdebs/hestia_*.deb > /dev/null 2>&1
 
     if [ -z $(ls $withdebs/hestia-php_*.deb 2>/dev/null) ]; then
+        echo "    - hestia-php backend package (from apt)"
         apt-get -y install hestia-php > /dev/null 2>&1
     else
-        dpkg -i $withdebs/hestia-php_*.deb
+        echo "    - hestia-php backend package"
+        dpkg -i $withdebs/hestia-php_*.deb > /dev/null 2>&1
     fi
 
     if [ -z $(ls $withdebs/hestia-nginx_*.deb 2>/dev/null) ]; then
+        echo "    - hestia-nginx backend package (from apt)"
         apt-get -y install hestia-nginx > /dev/null 2>&1
     else
-        dpkg -i $withdebs/hestia-nginx_*.deb
+        echo "    - hestia-nginx backend package"
+        dpkg -i $withdebs/hestia-nginx_*.deb > /dev/null 2>&1
     fi
 fi
 
@@ -1246,7 +1262,7 @@ if [ "$apache" = 'yes' ]; then
     a2enmod ssl > /dev/null 2>&1
     a2enmod actions > /dev/null 2>&1
     a2dismod --quiet status > /dev/null 2>&1
-    a2enmod --quiet hestia-status
+    a2enmod --quiet hestia-status > /dev/null 2>&1
 
     # Enable mod_ruid/mpm_itk or mpm_event
     if [ "$phpfpm" = 'yes' ]; then
@@ -1433,10 +1449,17 @@ if [ "$mysql" = 'yes' ]; then
     # Create temporary folder and change permission
     [ ! -d "/usr/share/phpmyadmin/tmp" ] && mkdir /usr/share/phpmyadmin/tmp
     chmod 777 /usr/share/phpmyadmin/tmp
+    
+    if [ -e /var/lib/phpmyadmin/blowfish_secret.inc.php ]; then
+        chmod 0644 /var/lib/phpmyadmin/blowfish_secret.inc.php
+    fi
 
     # Clear Up
     rm -fr phpMyAdmin-$pma_v-all-languages
     rm -f phpMyAdmin-$pma_v-all-languages.tar.gz
+
+    echo "DB_PMA_ALIAS='phpmyadmin'" >> $HESTIA/conf/hestia.conf
+    $HESTIA/bin/v-change-sys-db-alias 'pma' "phpmyadmin"
 fi
 
 
@@ -1456,6 +1479,9 @@ if [ "$postgresql" = 'yes' ]; then
         cp -f $HESTIA_INSTALL_DIR/pga/phppgadmin.conf /etc/apache2/conf.d/
     fi
     cp -f $HESTIA_INSTALL_DIR/pga/config.inc.php /etc/phppgadmin/
+
+    echo "DB_PMA_ALIAS='phppgadmin'" >> $HESTIA/conf/hestia.conf
+    $HESTIA/bin/v-change-sys-db-alias 'pga' "phppgadmin"
 fi
 
 
@@ -1624,12 +1650,12 @@ if [ "$dovecot" = 'yes' ] && [ "$exim" = 'yes' ] && [ "$mysql" = 'yes' ]; then
     cp -f $HESTIA_INSTALL_DIR/roundcube/plugins/config_zipdownload.inc.php /etc/roundcube/plugins/zipdownload/config.inc.php
     
     # Fixes for PHP 7.4 compatibility
-    sed -i 's/$identities, "\\n"/"\\n", $identities/g' /usr/share/roundcube/plugins/enigma/lib/enigma_ui.php
-    sed -i 's/(array_keys($post_search), \x27|\x27)/(\x27|\x27, array_keys($post_search))/g' /usr/share/roundcube/program/lib/Roundcube/rcube_contacts.php
-    sed -i 's/implode($name, \x27.\x27)/implode(\x27.\x27, $name)/g' /usr/share/roundcube/program/lib/Roundcube/rcube_db.php
-    sed -i 's/$fields, \x27,\x27/\x27,\x27, $fields/g' /usr/share/roundcube/program/steps/addressbook/search.inc
-    sed -i 's/implode($fields, \x27,\x27)/implode(\x27,\x27, $fields)/g' /usr/share/roundcube/program/steps/addressbook/search.inc
-    sed -i 's/implode($bstyle, \x27; \x27)/implode(\x27; \x27, $bstyle)/g' /usr/share/roundcube/program/steps/mail/sendmail.inc
+    [ -f "/usr/share/roundcube/plugins/enigma/lib/enigma_ui.php" ] && sed -i 's/$identities, "\\n"/"\\n", $identities/g' /usr/share/roundcube/plugins/enigma/lib/enigma_ui.php
+    [ -f "/usr/share/roundcube/program/lib/Roundcube/rcube_contacts.php" ] && sed -i 's/(array_keys($post_search), \x27|\x27)/(\x27|\x27, array_keys($post_search))/g' /usr/share/roundcube/program/lib/Roundcube/rcube_contacts.php
+    [ -f "/usr/share/roundcube/program/lib/Roundcube/rcube_db.php" ] && sed -i 's/implode($name, \x27.\x27)/implode(\x27.\x27, $name)/g' /usr/share/roundcube/program/lib/Roundcube/rcube_db.php
+    [ -f "/usr/share/roundcube/program/steps/addressbook/search.inc" ] && sed -i 's/$fields, \x27,\x27/\x27,\x27, $fields/g' /usr/share/roundcube/program/steps/addressbook/search.inc
+    [ -f "/usr/share/roundcube/program/steps/addressbook/search.inc" ] && sed -i 's/implode($fields, \x27,\x27)/implode(\x27,\x27, $fields)/g' /usr/share/roundcube/program/steps/addressbook/search.inc
+    [ -f "/usr/share/roundcube/program/steps/mail/sendmail.inc" ] && sed -i 's/implode($bstyle, \x27; \x27)/implode(\x27; \x27, $bstyle)/g' /usr/share/roundcube/program/steps/mail/sendmail.inc
     
     # Configure webmail alias
     echo "WEBMAIL_ALIAS='webmail'" >> $HESTIA/conf/hestia.conf
@@ -1763,7 +1789,7 @@ if [ ! -z "$pub_ip" ] && [ "$pub_ip" != "$ip" ]; then
     echo "$HESTIA/bin/v-update-sys-ip" >> /etc/rc.local
     echo "exit 0" >> /etc/rc.local
     chmod +x /etc/rc.local
-    systemctl enable rc-local
+    systemctl enable rc-local > /dev/null 2>&1
     $HESTIA/bin/v-change-sys-ip-nat $ip $pub_ip > /dev/null 2>&1
     ip=$pub_ip
 fi
@@ -1842,6 +1868,13 @@ $HESTIA/bin/v-change-sys-port $port > /dev/null 2>&1
 # Set default theme
 $HESTIA/bin/v-change-sys-theme 'default'
 
+# Update remaining packages since repositories have changed
+echo -ne "(*) Installing remaining software updates..."
+apt-get -qq update
+apt-get -y upgrade >> $LOG &
+BACK_PID=$!
+echo
+
 # Starting Hestia service
 update-rc.d hestia defaults
 systemctl start hestia
@@ -1914,7 +1947,7 @@ cat $tmpfile
 rm -f $tmpfile
 
 # Add welcome message to notification panel
-$HESTIA/bin/v-add-user-notification admin 'Welcome to Hestia Control Panel!' 'Please report any bugs or issues via <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a> or e-mail <a href="mailto:info@hestiacp.com?Subject="['$new_version'] Bug Report: ">info@hestiacp.com</a><br><br><b>Have a wonderful day!</b><br><br><i class="fas fa-heart status-icon red"></i> The Hestia Control Panel development team'
+$HESTIA/bin/v-add-user-notification admin 'Welcome to Hestia Control Panel!' '<br>You are now ready to begin <a href="/add/user/">adding user accounts</a> and <a href="/add/web/">domains</a>. For help and assistance, view the <a href="https://docs.hestiacp.com/" target="_new">documentation</a> or visit our <a href="https://forum.hestiacp.com/" target="_new">user forum</a>.<br><br>Please report any bugs or issues via <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a> or e-mail <a href="mailto:info@hestiacp.com?Subject="['$new_version'] Bug Report: ">info@hestiacp.com</a>.<br><br><b>Have a wonderful day!</b><br><br><i class="fas fa-heart status-icon red"></i> The Hestia Control Panel development team'
 
 echo "(!) IMPORTANT: You must logout or restart the server before continuing."
 echo ""

+ 31 - 7
install/upgrade/versions/latest.sh

@@ -73,19 +73,19 @@ fi
 # Roundcube fixes for PHP 7.4 compatibility
 if [ -d /usr/share/roundcube ]; then
     echo "(*) Updating Roundcube configuration..."
-    sed -i 's/$identities, "\\n"/"\\n", $identities/g' /usr/share/roundcube/plugins/enigma/lib/enigma_ui.php
-    sed -i 's/(array_keys($post_search), \x27|\x27)/(\x27|\x27, array_keys($post_search))/g' /usr/share/roundcube/program/lib/Roundcube/rcube_contacts.php
-    sed -i 's/implode($name, \x27.\x27)/implode(\x27.\x27, $name)/g' /usr/share/roundcube/program/lib/Roundcube/rcube_db.php
-    sed -i 's/$fields, \x27,\x27/\x27,\x27, $fields/g' /usr/share/roundcube/program/steps/addressbook/search.inc
-    sed -i 's/implode($fields, \x27,\x27)/implode(\x27,\x27, $fields)/g' /usr/share/roundcube/program/steps/addressbook/search.inc
-    sed -i 's/implode($bstyle, \x27; \x27)/implode(\x27; \x27, $bstyle)/g' /usr/share/roundcube/program/steps/mail/sendmail.inc
+    [ -f "/usr/share/roundcube/plugins/enigma/lib/enigma_ui.php" ] && sed -i 's/$identities, "\\n"/"\\n", $identities/g' /usr/share/roundcube/plugins/enigma/lib/enigma_ui.php
+    [ -f "/usr/share/roundcube/program/lib/Roundcube/rcube_contacts.php" ] && sed -i 's/(array_keys($post_search), \x27|\x27)/(\x27|\x27, array_keys($post_search))/g' /usr/share/roundcube/program/lib/Roundcube/rcube_contacts.php
+    [ -f "/usr/share/roundcube/program/lib/Roundcube/rcube_db.php" ] && sed -i 's/implode($name, \x27.\x27)/implode(\x27.\x27, $name)/g' /usr/share/roundcube/program/lib/Roundcube/rcube_db.php
+    [ -f "/usr/share/roundcube/program/steps/addressbook/search.inc" ] && sed -i 's/$fields, \x27,\x27/\x27,\x27, $fields/g' /usr/share/roundcube/program/steps/addressbook/search.inc
+    [ -f "/usr/share/roundcube/program/steps/addressbook/search.inc" ] && sed -i 's/implode($fields, \x27,\x27)/implode(\x27,\x27, $fields)/g' /usr/share/roundcube/program/steps/addressbook/search.inc
+    [ -f "/usr/share/roundcube/program/steps/mail/sendmail.inc" ] && sed -i 's/implode($bstyle, \x27; \x27)/implode(\x27; \x27, $bstyle)/g' /usr/share/roundcube/program/steps/mail/sendmail.inc
 fi
 
 # Enable Roundcube plugins
 if [ -d /usr/share/roundcube ]; then
     cp -f $HESTIA_INSTALL_DIR/roundcube/plugins/config_newmail_notifier.inc.php /etc/roundcube/plugins/newmail_notifier/config.inc.php
     cp -f $HESTIA_INSTALL_DIR/roundcube/plugins/config_zipdownload.inc.php /etc/roundcube/plugins/zipdownload/config.inc.php
-    sed -i "s/array('password')/array('password','newmail_notifier','zipdownload')/g" /etc/roundcube/config.inc.php
+    [ -f "/etc/roundcube/config.inc.php" ] && sed -i "s/array('password')/array('password','newmail_notifier','zipdownload')/g" /etc/roundcube/config.inc.php
 fi
 
 # HELO support for multiple domains and IPs
@@ -168,3 +168,27 @@ for user in $($HESTIA/bin/v-list-sys-users plain); do
 
     chown --silent --no-dereference :www-data /home/$user/web/*/public_*html
 done
+
+# Fix phpMyAdmin blowfish_secret error message due to incorrect permissions
+if [ -e /var/lib/phpmyadmin/blowfish_secret.inc.php ]; then
+    echo "(*) Updating phpMyAdmin permissions..."
+    chmod 0644 /var/lib/phpmyadmin/blowfish_secret.inc.php
+fi
+
+# Add phpMyAdmin/phpPgAdmin aliases to hestia.conf and correct configuration/templates
+if [ -e "/var/lib/phpmyadmin" ]; then
+PMA_ALIAS_CHECK=$(cat $HESTIA/conf/hestia.conf | grep DB_PMA_ALIAS)
+    if [ -z "$PMA_ALIAS_CHECK" ]; then
+        echo "(*) Updating phpMyAdmin alias..."
+        $HESTIA/bin/v-change-sys-db-alias "pma" "phpmyadmin"
+    fi
+fi
+
+if [ -e "/var/lib/phppgadmin" ]; then
+PGA_ALIAS_CHECK=$(cat $HESTIA/conf/hestia.conf | grep DB_PGA_ALIAS)
+    if [ -z "$PGA_ALIAS_CHECK" ]; then
+        echo "(*) Updating phpPgAdmin alias..."
+        $HESTIA/bin/v-change-sys-db-alias "pga" "phppgadmin"
+    fi
+fi
+

+ 3 - 0
src/deb/hestia/postinst

@@ -34,6 +34,9 @@ upgrade_welcome_message
 # Execute version-specific upgrade scripts
 upgrade_start_routine
 
+# Update PHP templates
+update_php_templates
+
 # Upgrade phpMyAdmin if applicable
 upgrade_phpmyadmin
 

+ 21 - 0
src/hst_bootstrap_install.sh

@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# Clean installation bootstrap for development purposes only
+# Usage:    ./hst_bootstrap_install.sh [fork] [branch] [os]
+# Example:  ./hst_bootstrap_install.sh hestiacp master ubuntu
+
+# Define variables
+fork=$1
+branch=$2
+os=$3
+
+# Download specified installer and compiler
+wget https://raw.githubusercontent.com/$fork/hestiacp/$branch/install/hst-install-$os.sh
+wget https://raw.githubusercontent.com/$fork/hestiacp/$branch/src/hst_autocompile.sh
+
+# Execute compiler and build hestia core package
+chmod +x hst_autocompile.sh
+./hst_autocompile.sh --hestia master no
+
+# Execute Hestia Control Panel installer with default dummy options for testing
+bash hst-install-$os.sh -f -y no -e admin@test.local -p P@ssw0rd -s hestia-$branch-$os.test.local --with-debs /tmp/hestiacp-src/debs

+ 2 - 2
web/add/db/index.php

@@ -79,10 +79,10 @@ if (!empty($_POST['ok'])) {
         if ($_POST['v_host'] != 'localhost' ) $http_host = $_POST['v_host'];
         if ($_POST['v_type'] == 'mysql') $db_admin = "phpMyAdmin";
         if ($_POST['v_type'] == 'mysql') $db_admin_link = "http://".$http_host."/phpmyadmin/";
-        if (($_POST['v_type'] == 'mysql') && (!empty($_SESSION['DB_PMA_URL']))) $db_admin_link = $_SESSION['DB_PMA_URL'];
+        if (($_POST['v_type'] == 'mysql') && (!empty($_SESSION['DB_PMA_ALIAS']))) $db_admin_link = "http://".$http_host."/".$_SESSION['DB_PMA_ALIAS'];
         if ($_POST['v_type'] == 'pgsql') $db_admin = "phpPgAdmin";
         if ($_POST['v_type'] == 'pgsql') $db_admin_link = "http://".$http_host."/phppgadmin/";
-        if (($_POST['v_type'] == 'pgsql') && (!empty($_SESSION['DB_PGA_URL']))) $db_admin_link = $_SESSION['DB_PGA_URL'];
+        if (($_POST['v_type'] == 'pgsql') && (!empty($_SESSION['DB_PGA_ALIAS']))) $db_admin_link = "http://".$http_host."/".$_SESSION['DB_PGA_ALIAS'];
     }
 
     // Email login credentials

+ 1 - 0
web/css/active-theme.css

@@ -0,0 +1 @@
+/* Theme override file -- will be replaced when theme is changed from default. */

File diff suppressed because it is too large
+ 136 - 159
web/css/src/styles.css


File diff suppressed because it is too large
+ 0 - 0
web/css/styles.min.css


+ 4 - 4
web/edit/server/index.php

@@ -312,8 +312,8 @@ if (!empty($_POST['save'])) {
 
     // Update phpMyAdmin url
     if (empty($_SESSION['error_msg'])) {
-        if ($_POST['v_mysql_url'] != $_SESSION['DB_PMA_URL']) {
-            exec (HESTIA_CMD."v-change-sys-config-value DB_PMA_URL ".escapeshellarg($_POST['v_mysql_url']), $output, $return_var);
+        if ($_POST['v_mysql_url'] != $_SESSION['DB_PMA_ALIAS']) {
+            exec (HESTIA_CMD."v-change-sys-db-alias pma ".escapeshellarg($_POST['v_mysql_url']), $output, $return_var);
             check_return_code($return_var,$output);
             unset($output);
             $v_db_adv = 'yes';
@@ -322,8 +322,8 @@ if (!empty($_POST['save'])) {
 
     // Update phpPgAdmin url
     if (empty($_SESSION['error_msg'])) {
-        if ($_POST['v_pgsql_url'] != $_SESSION['DB_PGA_URL']) {
-            exec (HESTIA_CMD."v-change-sys-config-value DB_PGA_URL ".escapeshellarg($_POST['v_pgsql_url']), $output, $return_var);
+        if ($_POST['v_pgsql_url'] != $_SESSION['DB_PGA_ALIAS']) {
+            exec (HESTIA_CMD."v-change-sys-db-alias pga ".escapeshellarg($_POST['v_pgsql_url']), $output, $return_var);
             check_return_code($return_var,$output);
             unset($output);
             $v_db_adv = 'yes';

+ 7 - 0
web/edit/web/index.php

@@ -244,6 +244,13 @@ if (!empty($_POST['save'])) {
                 }
             }
         }
+        if ((!empty($v_stats)) && ($_POST['v_stats'] == $v_stats) && (empty($_SESSION['error_msg']))) {
+            // Update statistics configuration when changing domain aliases
+            $v_stats = escapeshellarg($_POST['v_stats']);
+            exec (HESTIA_CMD."v-change-web-domain-stats ".$v_username." ".escapeshellarg($v_domain)." ".$v_stats, $output, $return_var);
+            check_return_code($return_var,$output);
+            unset($output);
+        }
     }
     
     // Change backend template

+ 2 - 2
web/inc/i18n/de.php

@@ -850,9 +850,9 @@ $LANG['de'] = array(
     // Set default language
     'SYSTEM_SET_DEFAULT_LANGUAGE' => 'Als Standardsprache für alle Benutzer festlegen',
     
-        //2FA 
+    //2FA 
     'Forgot token' => 'Token vergessen',
-    '2FA Token' => '2FA Token',
+    '2FA Token' => 'OTP PIN',
     '2FA Reset successfully' => '2FA Token wurde mit Erfolg zurückgesetzt. Sie können sich jetzt erneut anmelden',
     'Reset 2FA' => '2FA zurücksetzen',
     '2FA Reset Code' => 'Kontowiederherstellungscode',

+ 6 - 6
web/inc/i18n/en.php

@@ -567,9 +567,9 @@ $LANG['en'] = array(
     'AntiSpam' => 'Spam Filter',
     'Webmail URL' => 'Webmail Alias',
     'MySQL Support' => 'MySQL Support',
-    'phpMyAdmin URL' => 'phpMyAdmin URL',
+    'phpMyAdmin URL' => 'phpMyAdmin Alias',
     'PostgreSQL Support' => 'PostgreSQL Support',
-    'phpPgAdmin URL' => 'phpPgAdmin URL',
+    'phpPgAdmin URL' => 'phpPgAdmin Alias',
     'Maximum Number Of Databases' => 'Maximum Number of Databases',
     'Current Number Of Databases' => 'Current Number of Databases',
     'Local backup' => 'Local backup',
@@ -853,10 +853,10 @@ $LANG['en'] = array(
     'SYSTEM_SET_DEFAULT_LANGUAGE' => 'Set as default language for all users',
     
     //2FA 
-    'Forgot token' => 'Forgot token',
-    '2FA Token' => '2FA Token',
-    '2FA Reset successfully' => '2FA Token has been reset with success. You are now able to login again',
-    'Reset 2FA' => 'Reset 2FA',
+    'Forgot token' => 'Unlock Account',
+    '2FA Token' => 'OTP PIN',
+    '2FA Reset successfully' => 'Two-factor authentication is now turned off for your account.<br><br>You may now proceed to log in.',
+    'Reset 2FA' => 'Unlock Account',
     '2FA Reset Code' => 'Account Recovery Code',
     'Invalid or missing token' => 'Invalid or missing token',
 );

+ 2 - 2
web/inc/i18n/it.php

@@ -851,9 +851,9 @@ $LANG['it'] = array(
     // Set default language
     'SYSTEM_SET_DEFAULT_LANGUAGE' => 'Imposta come lingua predefinita per tutti gli utenti',
     
-        //2FA 
+    //2FA 
     'Forgot token' => 'Codice dimenticato',
-    '2FA Token' => 'Codice 2fa',
+    '2FA Token' => 'PIN OTP',
     '2FA Reset successfully' => 'Il codice 2FA è stato ripristinato correttamente. Ora puoi accedere di nuovo',
     'Reset 2FA' => 'Reimposta il codice 2FA',
     '2FA Reset Code' => 'Codice di recupero dell\'account',

+ 0 - 6
web/inc/secure_login.php

@@ -1,10 +1,4 @@
 <?php
-if (file_exists('/usr/local/hestia/web/inc/nginx_proxy')==true) {
-    if (isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI']=="/") {
-        header("Location: /webmail/");
-        exit;
-    }
-}
 
 $login_url_skip=0;
 if ($_SERVER['SCRIPT_FILENAME']=='/usr/local/hestia/web/reset/mail/index.php') $login_url_skip=1;

+ 0 - 53
web/js/i18n.js.php

@@ -11,57 +11,4 @@ if (empty($_SESSION['language'])) {
 
 App.i18n.ARE_YOU_SURE                           = '<?=__('Are you sure?')?>';
 App.Constants.UNLIM_TRANSLATED_VALUE            = '<?=__('unlimited')?>';
-
-App.Constants.FM_HIT                            = '<?=__('Hit')?>';
-App.Constants.FM_TO_RELOAD_THE_PAGE             = '<?=__('to reload the page')?>'
-App.Constants.FM_DIRECTORY_NAME_CANNOT_BE_EMPTY = '<?=__('Directory name cannot be empty')?>';
-App.Constants.FM_FILE_NAME_CANNOT_BE_EMPTY      = '<?=__('File name cannot be empty')?>';
-App.Constants.FM_NO_FILE_SELECTED               = '<?=__('No file selected')?>';
-App.Constants.FM_NO_FILE_OR_DIRECTORY_SELECTED  = '<?=__('No file or folder selected')?>';
-App.Constants.FM_FILE_TYPE_NOT_SUPPORTED        = '<?=__('File type not supported')?>';
-App.Constants.FM_DIRECTORY_DOWNLOAD_NOT_READY   = '<?=__('Directory download not available in current version')?>';
-
-App.Constants.FM_DIRECTORY_NOT_AVAILABLE        = '<?=__('Directory not available')?>';
-App.Constants.FM_DONE                           = '<?=__('Done')?>';
-App.Constants.FM_CLOSE                          = '<?=__('Close')?>';
-App.Constants.FM_COPY                           = '<?=__('Copy') ?>';
-App.Constants.FM_MOVE                           = '<?=__('Move') ?>';
-App.Constants.FM_CANCEL                         = '<?=__('Cancel')?>';
-App.Constants.FM_RENAME                         = '<?=__('Rename')?>';
-App.Constants.FM_CHMOD                          = '<?=__('Change Rights')?>';
-App.Constants.FM_DELETE                         = '<?=__('Delete')?>';
-App.Constants.FM_CONFIRM_DELETE_BULK            = '<?=__('Delete items')?>';
-App.Constants.FM_EXTRACT                        = '<?=__('Extract')?>';
-App.Constants.FM_CREATE                         = '<?=__('Create')?>';
-App.Constants.FM_PACK                           = '<?=__('Compress')?>';
-App.Constants.FM_PACK_BUTTON                    = '<?=__('Compress')?>';
-App.Constants.FM_OK                             = '<?=__('OK')?>';
-App.Constants.FM_YOU_ARE_COPYING                = '<?=__('YOU ARE COPYING')?>';
-App.Constants.FM_YOU_ARE_REMOVING               = '<?=__('YOU ARE REMOVING')?>';
-
-App.Constants.FM_COPY_BULK                      = '<?=__('Copy files')?>';
-App.Constants.FM_MOVE_BULK                      = '<?=__('Move files')?>';
-
-App.Constants.FM_CONFIRM_COPY                   = '<?=__('Are you sure you want to copy')?>';
-App.Constants.FM_CONFIRM_MOVE                   = '<?=__('Are you sure you want to move')?>';
-App.Constants.FM_CONFIRM_DELETE                 = '<?=__('Are you sure you want to delete')?>';
-App.Constants.FM_INTO_KEYWORD                   = '<?=__('into')?>';
-App.Constants.FM_EXISTING_FILES_WILL_BE_REPLACED= '<?=__('existing files will be replaced')?>';
-App.Constants.FM_ORIGINAL_NAME                  = '<?=__('Original name')?>';
-App.Constants.FM_FILE                           = '<?=__('File')?>';
-App.Constants.FM_ALREADY_EXISTS                 = '<?=__('already exists')?>';
-App.Constants.FM_CREATE_FILE                    = '<?=__('Create file')?>';
-App.Constants.FM_CREATE_DIRECTORY               = '<?=__('Create directory')?>';
-App.Constants.FM_TRANSLATED_DATES               = {'Jan': '<?=__('Jan')?>', 'Feb': '<?=__('Feb')?>','Mar': '<?=__('Mar')?>','Apr': '<?=__('Apr')?>','May': '<?=__('May')?>','Jun': '<?=__('Jun')?>','Jul': '<?=__('Jul')?>','Aug': '<?=__('Aug')?>','Sep': '<?=__('Sep')?>','Oct': '<?=__('Oct')?>','Nov': '<?=__('Nov')?>','Dec': '<?=__('Dec')?>'};
-
-App.Constants.FM_READ_BY_OWNER                  = '<?=__('read by owner')?>';
-App.Constants.FM_WRITE_BY_OWNER                 = '<?=__('write by owner')?>';
-App.Constants.FM_EXECUTE_BY_OWNER               = '<?=__('execute/search by owner')?>';
-App.Constants.FM_READ_BY_GROUP                  = '<?=__('read by group')?>';
-App.Constants.FM_WRITE_BY_GROUP                 = '<?=__('write by group')?>';
-App.Constants.FM_EXECUTE_BY_GROUP               = '<?=__('execute/search by group')?>';
-App.Constants.FM_READ_BY_OTHERS                 = '<?=__('read by others')?>';
-App.Constants.FM_WRITE_BY_OTHERS                = '<?=__('write by others')?>';
-App.Constants.FM_EXECUTE_BY_OTHERS              = '<?=__('execute/search by others')?>';
-
 App.Constants.NOTIFICATIONS_EMPTY               = '<?=__('no notifications')?>';

+ 0 - 240
web/js/templates.js

@@ -17,246 +17,6 @@ App.Templates.html = {
                     '+App.Constants.NOTIFICATIONS_EMPTY+'\</span></li>'
         ]
     },
-
-    // file manager
-    //
-
-    FM: {
-        reload_in_time: [
-                    '<div id="reload-in-time" class="warning-box reload">\
-                        <div class="message-small">'+App.Constants.FM_HIT+' <span>F5</span> '+App.Constants.FM_TO_RELOAD_THE_PAGE+'</div>\
-                    </div>'
-        ],
-        entry_line: ['<li class="dir">\
-                        <span class="marker">\
-                        </span>\
-                        <span class="icon ~!:ITEM_TYPE~!" ></span>\
-                        <input type="hidden" class="source" value=\'~!:SOURCE~!\'/>\
-                        <span class="filename-holder"><div class="filename ripple" ~!:CL_ACTION_1~!>~!:NAME~!</div></span>\
-                        <span class="mode">~!:PERMISSIONS~!</span>\
-                        <span class="owner">~!:OWNER~!</span>\
-                        <span class="size-unit">~!:SIZE_UNIT~!</span>\
-                        <span class="size-value">~!:SIZE_VALUE~!</span>\
-                        <span class="date">~!:DATE~!</span>\
-                        <span class="time">~!:TIME~!</span>\
-                        <!-- span class="subcontext-control ~!:SUBMENU_CLASS~!" onClick="FM.toggleSubContextMenu(this)">&#8226;&#8226;&#8226;&nbsp;\
-                        <ul class="subcontext-menu subcontext-menu-hidden"><li onClick="FM.downloadFileFromSubcontext(this);">Download</li><li onClick="FM.editFileFromSubcontext(this);">Edit</li></ul>\
-                        </span -->\
-                    </li>'],
-        popup_alert: ['<div class="confirm-box alarm popup-box">\
-                            <div class="message">~!:TEXT~!</div>\
-                                <div class="controls">\
-                            <p class="ok" onClick="FM.popupClose();">'+App.Constants.FM_CLOSE+'</p>\
-                            </div>\
-                        </div>'],
-        popup_bulk_remove: ['<div class="confirm-box delete popup-box">\
-                            <div class="message">'+App.Constants.FM_CONFIRM_DELETE_BULK+' (~!:NUMBER_OF_ITEMS~!)?</div>\
-                            <div class="results"></div>\
-                                <div class="controls">\
-                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                            <p class="ok" onClick="FM.bulkRemoveDo();">'+App.Constants.FM_DELETE+'</p>\
-                            </div>\
-                        </div>'],
-        popup_bulk_copy: ['<div class="confirm-box copy popup-box">\
-                            <div class="message">'+App.Constants.FM_COPY_BULK+' (~!:NUMBER_OF_ITEMS~!) '+ App.Constants.FM_INTO_KEYWORD +':</div>\
-                            <div class="actions">\
-                                <input type="text" id="copy_dest" value="~!:DST_FILENAME~!" class="new-title">\
-                            </div>\
-                            <div class="results"></div>\
-                            <div class="warning">'+App.Constants.FM_EXISTING_FILES_WILL_BE_REPLACED+'</div>\
-                                <div class="controls">\
-                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                            <p class="ok" onClick="FM.bulkCopyDo();">'+App.Constants.FM_COPY+'</p>\
-                            </div>\
-                        </div>'],
-        popup_bulk_move: ['<div class="confirm-box copy popup-box">\
-                            <div class="message">'+App.Constants.FM_MOVE_BULK+' (~!:NUMBER_OF_ITEMS~!) '+ App.Constants.FM_INTO_KEYWORD +':</div>\
-                            <div class="actions">\
-                                <input type="text" id="dst-name" value="~!:DST_NAME~!" class="new-title">\
-                            </div>\
-                            <div class="results"></div>\
-                            <div class="warning">'+App.Constants.FM_EXISTING_FILES_WILL_BE_REPLACED+'</div>\
-                                <div class="controls">\
-                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                            <p class="ok" onClick="FM.bulkMoveDo();">'+App.Constants.FM_MOVE+'</p>\
-                            </div>\
-                        </div>'],
-        popup_delete: ['<div class="confirm-box delete popup-box">\
-                            <div class="message">'+App.Constants.FM_CONFIRM_DELETE+' <span class="title">"~!:FILENAME~!"</span>?</div>\
-                            <div class="warning warning-message"></div>\
-                                <div class="controls">\
-                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                            <p class="ok" onClick="FM.confirmDelete();">'+App.Constants.FM_DELETE+'</p>\
-                            </div>\
-                        </div>'],
-        popup_copy: ['<div class="confirm-box copy popup-box">\
-                            <div class="message">'+App.Constants.FM_COPY+' <span class="title">"~!:SRC_FILENAME~!"</span> '+App.Constants.FM_INTO_KEYWORD+':</div>\
-                            <div class="actions">\
-                                <input type="text" id="copy_dest" value="~!:DST_FILENAME~!" class="new-title">\
-                            </div>\
-                            <div class="message"></div>\
-                           <div class="warning warning-message">'+App.Constants.FM_EXISTING_FILES_WILL_BE_REPLACED+'</div>\
-                                <div class="controls">\
-                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                            <p class="ok" onClick="FM.confirmCopyItems();">'+App.Constants.FM_COPY+'</p>\
-                            </div>\
-                        </div>'],
-
-        popup_move: ['<div class="confirm-box copy popup-box">\
-                            <div class="message">'+App.Constants.FM_MOVE+' <span class="title">"~!:FILENAME~!"</span> '+App.Constants.FM_INTO_KEYWORD+':</div>\
-                            <div class="actions">\
-                                <input type="text" id="dst-name" value="~!:DST_NAME~!" class="new-title">\
-                            </div>\
-                            <div class="message"></div>\
-                           <div class="warning warning-message">'+App.Constants.FM_EXISTING_FILES_WILL_BE_REPLACED+'</div>\
-                                <div class="controls">\
-                            <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                            <p class="ok" onClick="FM.confirmMove();">'+App.Constants.FM_MOVE+'</p>\
-                            </div>\
-                        </div>'],
-
-        popup_rename: ['<div class="confirm-box rename warning">\
-                            <div class="message">'+App.Constants.FM_RENAME+': <span class="title">"~!:FILENAME~!"</span></div>\
-                            <div class="warning warning-message"></div>\
-                            <div class="actions">\
-                                <input type="text" id="rename-title" class="new-title"  value="~!:NEW_NAME~!" />\
-                            </div>\
-                            <div class="controls">\
-                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                                <p class="ok" onClick="FM.confirmRename();">'+App.Constants.FM_RENAME+'</p>\
-                            </div>\
-                            <div class="controls replace">\
-                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                                <p class="ok" onClick="FM.confirmRename();">'+App.Constants.FM_RENAME+'</p>\
-                            </div>\
-                        </div>'],
-
-        popup_chmod: ['<div class="confirm-box chmod warning">\
-                            <div class="message">'+App.Constants.FM_CHMOD+': <span class="title">"~!:FILENAME~!"</span></div>\
-                            <div class="warning warning-message"></div>\
-                            <div class="actions">\
-                                <ul>\
-                                    <li><label><input type="checkbox" name="read-by-owner" value="1" ~!:READ_BY_OWNER~! /> '+App.Constants.FM_READ_BY_OWNER+'</label></li>\
-                                    <li><label><input type="checkbox" name="write-by-owner" value="1" ~!:WRITE_BY_OWNER~! /> '+App.Constants.FM_WRITE_BY_OWNER+'</label></li>\
-                                    <li><label><input type="checkbox" name="execute-by-owner" value="1" ~!:EXECUTE_BY_OWNER~! /> '+App.Constants.FM_EXECUTE_BY_OWNER+'</label></li>\
-                                </ul><ul>\
-                                    <li><label><input type="checkbox" name="read-by-group" value="1" ~!:READ_BY_GROUP~! /> '+App.Constants.FM_READ_BY_GROUP+'</label></li>\
-                                    <li><label><input type="checkbox" name="write-by-group" value="1" ~!:WRITE_BY_GROUP~! /> '+App.Constants.FM_WRITE_BY_GROUP+'</label></li>\
-                                    <li><label><input type="checkbox" name="execute-by-group" value="1" ~!:EXECUTE_BY_GROUP~! /> '+App.Constants.FM_EXECUTE_BY_GROUP+'</label></li>\
-                                </ul><ul>\
-                                    <li><label><input type="checkbox" name="read-by-others" value="1" ~!:READ_BY_OTHERS~! /> '+App.Constants.FM_READ_BY_OTHERS+'</label></li>\
-                                    <li><label><input type="checkbox" name="write-by-others" value="1" ~!:WRITE_BY_OTHERS~! /> '+App.Constants.FM_WRITE_BY_OTHERS+'</label></li>\
-                                    <li><label><input type="checkbox" name="execute-by-others" value="1" ~!:EXECUTE_BY_OTHERS~! /> '+App.Constants.FM_EXECUTE_BY_OTHERS+'</label></li>\
-                                </ul>\
-                                <input type="text" name="mask" class="chmod-mask" maxlength="3" />\
-                            </div>\
-                            <div class="controls">\
-                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                                <p class="ok" onClick="FM.confirmChmod();">'+App.Constants.FM_OK+'</p>\
-                            </div>\
-                        </div>'],
-        popup_bulk_chmod: ['<div class="confirm-box chmod warning">\
-                            <div class="message">'+App.Constants.FM_CHMOD+' (~!:NUMBER_OF_ITEMS~!)</div>\
-                            <div class="warning warning-message"></div>\
-                            <div class="actions">\
-                                <ul>\
-                                    <li><label><input type="checkbox" name="read-by-owner" value="1" checked /> '+App.Constants.FM_READ_BY_OWNER+'</label></li>\
-                                    <li><label><input type="checkbox" name="write-by-owner" value="1" checked /> '+App.Constants.FM_WRITE_BY_OWNER+'</label></li>\
-                                    <li><label><input type="checkbox" name="execute-by-owner" value="1" checked /> '+App.Constants.FM_EXECUTE_BY_OWNER+'</label></li>\
-                                </ul><ul>\
-                                    <li><label><input type="checkbox" name="read-by-group" value="1" checked /> '+App.Constants.FM_READ_BY_GROUP+'</label></li>\
-                                    <li><label><input type="checkbox" name="write-by-group" value="1" checked /> '+App.Constants.FM_WRITE_BY_GROUP+'</label></li>\
-                                    <li><label><input type="checkbox" name="execute-by-group" value="1" checked /> '+App.Constants.FM_EXECUTE_BY_GROUP+'</label></li>\
-                                </ul><ul>\
-                                    <li><label><input type="checkbox" name="read-by-others" value="1" checked /> '+App.Constants.FM_READ_BY_OTHERS+'</label></li>\
-                                    <li><label><input type="checkbox" name="write-by-others" value="1" checked /> '+App.Constants.FM_WRITE_BY_OTHERS+'</label></li>\
-                                    <li><label><input type="checkbox" name="execute-by-others" value="1" checked /> '+App.Constants.FM_EXECUTE_BY_OTHERS+'</label></li>\
-                                </ul>\
-                                <input type="text" name="mask" class="chmod-mask" maxlength="3" value="777" />\
-                            </div>\
-                            <div class="controls">\
-                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                                <p class="ok" onClick="FM.confirmBulkChmod();">'+App.Constants.FM_OK+'</p>\
-                            </div>\
-                        </div>'],
-
-        popup_pack: ['<div class="confirm-box pack warning">\
-                            <div class="message">'+App.Constants.FM_PACK+' <span class="title">"~!:FILENAME~!"</span></div>\
-                            <div class="actions">\
-                                <input type="text" id="pack-destination" class="new-title" value="~!:DST_DIRNAME~!">\
-                            </div>\
-                            <div class="warning warning-message"></div>\
-                            <!-- div class="actions">\
-                                <label><input type="checkbox" name="overwrite" class="title" />Overwrite exising files</label>\
-                            </div -->\
-                            <div class="controls">\
-                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                                <p class="ok" onClick="FM.confirmPackItem();">'+App.Constants.FM_PACK_BUTTON+'</p>\
-                            </div>\
-                        </div>'],
-
-        popup_bulk_pack: ['<div class="confirm-box pack warning">\
-                            <div class="message">'+App.Constants.FM_PACK+' (~!:NUMBER_OF_ITEMS~!)</div>\
-                            <div class="actions">\
-                                <input type="text" id="pack-destination" class="new-title" value="~!:DST_DIRNAME~!">\
-                            </div>\
-                            <div class="warning warning-message"></div>\
-                            <!-- div class="actions">\
-                                <label><input type="checkbox" name="overwrite" class="title" />Overwrite exising files</label>\
-                            </div -->\
-                            <div class="controls">\
-                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                                <p class="ok" onClick="FM.confirmPackItem();">'+App.Constants.FM_PACK_BUTTON+'</p>\
-                            </div>\
-                        </div>'],
-
-        popup_unpack: ['<div class="confirm-box unpack warning">\
-                            <div class="message">'+App.Constants.FM_EXTRACT+' <span class="title">"~!:FILENAME~!"</span> '+App.Constants.FM_INTO_KEYWORD+':</div>\
-                            <div class="actions">\
-                                <input type="text" id="unpack-destination" class="new-title" value="~!:DST_DIRNAME~!">\
-                            </div>\
-                            <div class="warning warning-message"></div>\
-                            <!-- div class="actions">\
-                                <label><input type="checkbox" name="overwrite" class="title" />Overwrite exising files</label>\
-                            </div -->\
-                            <div class="controls">\
-                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                                <p class="ok" onClick="FM.confirmUnpackItem();">'+App.Constants.FM_EXTRACT+'</p>\
-                            </div>\
-                        </div>'],
-
-
-        popup_create_file: ['<div class="confirm-box rename warning">\
-                            <div class="message">'+App.Constants.FM_CREATE_FILE+'</div>\
-                            <!-- div class="warning">File <span class="title">"reading.txt"</span> already exists</div -->\
-                            <div class="warning warning-message"></div>\
-                            <div class="actions">\
-                                <input type="text" id="rename-title" class="new-title" />\
-                            </div>\
-                            <div class="controls replace">\
-                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                                <p class="ok" onClick="FM.confirmCreateFile();">'+App.Constants.FM_CREATE+'</p>\
-                            </div>\
-                        </div>'],
-        popup_create_dir: ['<div class="confirm-box rename warning">\
-                            <div class="message">'+App.Constants.FM_CREATE_DIRECTORY+'</div>\
-                            <!-- div class="warning">File <span class="title">"reading.txt"</span> already exists</div -->\
-                            <div class="warning warning-message"></div>\
-                            <div class="actions">\
-                                <input type="text" id="rename-title" class="new-title" />\
-                            </div>\
-                            <div class="controls replace">\
-                                <p class="cancel" onClick="FM.popupClose();">'+App.Constants.FM_CANCEL+'</p>\
-                                <p class="ok" onClick="FM.confirmCreateDir();">'+App.Constants.FM_CREATE+'</p>\
-                            </div>\
-                        </div>'],
-        popup_no_file_selected: ['<div class="confirm-box no-file-selected">\
-                            <div class="message">Please select a file</div>\
-                            <div class="controls">\
-                                <p class="ok" onClick="FM.confirmCreateDir();">'+App.Constants.FM_OK+'</p>\
-                            </div>\
-                        </div>']
-    }
 };
 
 // Internals

+ 2 - 2
web/templates/admin/edit_server.html

@@ -440,7 +440,7 @@
                                         </tr>
                                         <tr>
                                             <td>
-                                                <input type="text" size="20" class="vst-input" name="v_mysql_url" value="<?php echo $_SESSION['DB_PMA_URL']; ?>">
+                                                <input type="text" size="20" class="vst-input" name="v_mysql_url" value="<?php echo $_SESSION['DB_PMA_ALIAS']; ?>">
                                                 <br><br>
                                             </td>
                                         </tr>
@@ -520,7 +520,7 @@
                                         </tr>
                                         <tr>
                                             <td>
-                                                <input type="text" size="20" class="vst-input" name="v_pgsql_url" value="<?php echo $_SESSION['DB_PGA_URL']; ?>">
+                                                <input type="text" size="20" class="vst-input" name="v_pgsql_url" value="<?php echo $_SESSION['DB_PGA_ALIAS']; ?>">
                                                 <br><br>
                                             </td>
                                         </tr>

+ 6 - 7
web/templates/admin/list_db.html

@@ -11,16 +11,15 @@
             foreach ($data as $key => $value) {
               if ($data[$key]['TYPE'] == 'mysql'){
                 $mysql = 1;
-
                 $db_myadmin_link = "//".$http_host."/phpmyadmin/";
-                if (!empty($_SESSION['DB_PMA_URL']))
-                  $db_myadmin_link = $_SESSION['DB_PMA_URL'];
+                if (!empty($_SESSION['DB_PMA_ALIAS']))
+                  $db_myadmin_link = "//".$http_host."/".$_SESSION['DB_PMA_ALIAS'];
               }
               if ($data[$key]['TYPE'] == 'pgsql'){
                 $pgsql = 1;
                 $db_pgadmin_link = "//".$http_host."/phppgadmin/";
-                if (!empty($_SESSION['DB_PGA_URL']))
-                  $db_pgadmin_link = $_SESSION['DB_PGA_URL'];
+                if (!empty($_SESSION['DB_PGA_ALIAS']))
+                  $db_pgadmin_link = "//".$http_host."/".$_SESSION['DB_PGA_ALIAS'];
               }
             }
             if($mysql){
@@ -107,10 +106,10 @@
           if ($data[$key]['HOST'] != 'localhost' ) $http_host = $data[$key]['HOST'];
           if ($data[$key]['TYPE'] == 'mysql') $db_admin = "phpMyAdmin";
           if ($data[$key]['TYPE'] == 'mysql') $db_admin_link = "https://".$http_host."/phpmyadmin/";
-          if (($data[$key]['TYPE'] == 'mysql') && (!empty($_SESSION['DB_PMA_URL']))) $db_admin_link = $_SESSION['DB_PMA_URL'];
+          if (($data[$key]['TYPE'] == 'mysql') && (!empty($_SESSION['DB_PMA_ALIAS']))) $db_admin_link = $_SESSION['DB_PMA_ALIAS'];
           if ($data[$key]['TYPE'] == 'pgsql') $db_admin = "phpPgAdmin";
           if ($data[$key]['TYPE'] == 'pgsql') $db_admin_link = "https://".$http_host."/phppgadmin/";
-          if (($data[$key]['TYPE'] == 'pgsql') && (!empty($_SESSION['DB_PGA_URL']))) $db_admin_link = $_SESSION['DB_PGA_URL'];
+          if (($data[$key]['TYPE'] == 'pgsql') && (!empty($_SESSION['DB_PGA_ALIAS']))) $db_admin_link = $_SESSION['DB_PGA_ALIAS'];
       ?>
 
 

+ 1 - 1
web/templates/admin/list_firewall_ipset.html

@@ -102,7 +102,7 @@
           <div class="data-count l-unit__col l-unit__col--right clearfix">
             <?php
               if ( $i == 0) {
-                echo __('There are currently no Ipset lists defined.');
+                echo __('There are currently no IP lists defined.');
               }
               if ( $i == 1) {
                 echo __('1 Ipset list');

+ 1 - 1
web/templates/admin/list_rrd.html

@@ -56,7 +56,7 @@
           </div>
 
          <div>
-          <a href="/list/rrd/image.php?/rrd/<?php echo $data[$key]['TYPE']."/".$period."-".$data[$key]['RRD'].".png"?>" target="_blank"><img src="/list/rrd/image.php?/rrd/<?=$data[$key]['TYPE']."/".$period."-".$data[$key]['RRD'].".png"?>"></a>
+          <a href="/list/rrd/image.php?/rrd/<?php echo $data[$key]['TYPE']."/".$period."-".$data[$key]['RRD'].".png"?>" target="_blank"><img class="graph-rounded" src="/list/rrd/image.php?/rrd/<?=$data[$key]['TYPE']."/".$period."-".$data[$key]['RRD'].".png"?>"></a>
          </div>
 
         </div>

+ 1 - 1
web/templates/admin/list_server_info.html

@@ -4,7 +4,7 @@
   <meta charset="utf-8">
   <link rel="icon" href="/images/favicon.ico" type="image/x-icon">
   <title><?php echo $_SERVER['HTTP_HOST']; ?> - <?=__($TAB)?> - <?=__('Hestia Control Panel');?></title>
-  <link rel="stylesheet" href="/css/styles.min.css?1446554103">
+  <link rel="stylesheet" href="/css/styles.min.css?1446554105">
   <link rel="stylesheet" href="/css/active-theme.css?<?php echo rand(); ?>">
   <link type="text/css" href="/css/animate.min.css?1446554103" rel="stylesheet" />
   <link type="text/css" href="/css/jquery-custom-dialogs.css?1446554103" rel="stylesheet" />

+ 1 - 1
web/templates/admin/list_weblog.html

@@ -4,7 +4,7 @@
   <meta charset="utf-8">
   <link rel="icon" href="/images/favicon.ico" type="image/x-icon">
   <title><?=__('Web Log Manager')?> - <?=__('Hestia Control Panel');?></title>
-  <link rel="stylesheet" href="/css/styles.min.css?1446554103">
+  <link rel="stylesheet" href="/css/styles.min.css?1446554105">
   <link rel="stylesheet" href="/css/active-theme.css?<?php echo rand(); ?>">
   <link type="text/css" href="/css/animate.min.css?1446554103" rel="stylesheet" />
   <link type="text/css" href="/css/jquery-custom-dialogs.css?1446554103" rel="stylesheet" />

+ 1 - 1
web/templates/header.html

@@ -4,7 +4,7 @@
   <meta charset="utf-8">
   <link rel="icon" href="/images/favicon.ico" type="image/x-icon">
   <title><?php echo $_SERVER['HTTP_HOST']; ?> - <?=__($TAB)?> - <?=__('Hestia Control Panel');?></title>
-  <link type="text/css" rel="stylesheet" href="/css/styles.min.css?1446554103" />
+  <link type="text/css" rel="stylesheet" href="/css/styles.min.css?1446554105" />
   <link type="text/css" rel="stylesheet" href="/css/active-theme.css?<?php echo rand(); ?>" />
   <link type="text/css" href="/css/animate.min.css?1446554103" rel="stylesheet" />
   <link type="text/css" href="/css/jquery-custom-dialogs.css?1446554103" rel="stylesheet" />

+ 5 - 0
web/templates/reset2fa.html

@@ -15,6 +15,11 @@
                                             <?php print __('2FA Reset successfully'); ?>
                                             </td>
                                             </tr>
+                                            <tr>
+                                                <td style="padding: 20px 0 12px 0;">
+                                                    <input type="button" class="button" value="<?php print __('Log in');?>" onclick="location.href='/login/'">
+                                                </td>
+                                            </tr>
                                         </table>
                                         <?php }else{ ?>
                                         <form method="post" action="/reset2fa/">

+ 8 - 10
web/templates/user/list_db.html

@@ -6,22 +6,20 @@
             $mysql = 0;
             $pgsql = 0;
 
-
             list($http_host, $port) = explode(':', $_SERVER["HTTP_HOST"].":");
 
             foreach ($data as $key => $value) {
               if ($data[$key]['TYPE'] == 'mysql'){
                 $mysql = 1;
-
-                $db_myadmin_link = "https://".$http_host."/phpmyadmin/";
-                if (!empty($_SESSION['DB_PMA_URL']))
-                  $db_myadmin_link = $_SESSION['DB_PMA_URL'];
+                $db_myadmin_link = "//".$http_host."/phpmyadmin/";
+                if (!empty($_SESSION['DB_PMA_ALIAS']))
+                  $db_myadmin_link = "//".$http_host."/".$_SESSION['DB_PMA_ALIAS'];
               }
               if ($data[$key]['TYPE'] == 'pgsql'){
                 $pgsql = 1;
-                $db_pgadmin_link = "https://".$http_host."/phppgadmin/";
-                if (!empty($_SESSION['DB_PGA_URL']))
-                  $db_pgadmin_link = $_SESSION['DB_PGA_URL'];
+                $db_pgadmin_link = "//".$http_host."/phppgadmin/";
+                if (!empty($_SESSION['DB_PGA_ALIAS']))
+                  $db_pgadmin_link = "//".$http_host."/".$_SESSION['DB_PGA_ALIAS'];
               }
             }
             if($mysql){
@@ -107,10 +105,10 @@
           if ($data[$key]['HOST'] != 'localhost' ) $http_host = $data[$key]['HOST'];
           if ($data[$key]['TYPE'] == 'mysql') $db_admin = "phpMyAdmin";
           if ($data[$key]['TYPE'] == 'mysql') $db_admin_link = "https://".$http_host."/phpmyadmin/";
-          if (($data[$key]['TYPE'] == 'mysql') && (!empty($_SESSION['DB_PMA_URL']))) $db_admin_link = $_SESSION['DB_PMA_URL'];
+          if (($data[$key]['TYPE'] == 'mysql') && (!empty($_SESSION['DB_PMA_ALIAS']))) $db_admin_link = $_SESSION['DB_PMA_ALIAS'];
           if ($data[$key]['TYPE'] == 'pgsql') $db_admin = "phpPgAdmin";
           if ($data[$key]['TYPE'] == 'pgsql') $db_admin_link = "https://".$http_host."/phppgadmin/";
-          if (($data[$key]['TYPE'] == 'pgsql') && (!empty($_SESSION['DB_PGA_URL']))) $db_admin_link = $_SESSION['DB_PGA_URL'];
+          if (($data[$key]['TYPE'] == 'pgsql') && (!empty($_SESSION['DB_PGA_ALIAS']))) $db_admin_link = $_SESSION['DB_PGA_ALIAS'];
       ?>
 
 

Some files were not shown because too many files changed in this diff