Explorar o código

SecImprove: Use internal function to parse object key/value strings

- 'parse_object_kv_list' will also validate the string format
Robert Zollner %!s(int64=6) %!d(string=hai) anos
pai
achega
1f56a42430
Modificáronse 63 ficheiros con 148 adicións e 146 borrados
  1. 1 1
      bin/v-add-letsencrypt-host
  2. 2 2
      bin/v-add-remote-dns-domain
  3. 1 1
      bin/v-add-remote-dns-record
  4. 1 1
      bin/v-add-web-domain-ssl-force
  5. 1 1
      bin/v-add-web-domain-ssl-hsts
  6. 2 2
      bin/v-change-database-owner
  7. 1 1
      bin/v-change-dns-record
  8. 2 2
      bin/v-change-domain-owner
  9. 1 1
      bin/v-change-remote-dns-domain-exp
  10. 1 1
      bin/v-change-remote-dns-domain-soa
  11. 1 1
      bin/v-change-remote-dns-domain-ttl
  12. 1 1
      bin/v-delete-cron-restart-job
  13. 1 1
      bin/v-delete-dns-on-web-alias
  14. 1 1
      bin/v-delete-firewall-chain
  15. 1 1
      bin/v-delete-remote-dns-domain
  16. 2 1
      bin/v-delete-remote-dns-domains
  17. 1 1
      bin/v-delete-remote-dns-host
  18. 1 1
      bin/v-delete-remote-dns-record
  19. 1 1
      bin/v-delete-web-domain-ssl-force
  20. 1 1
      bin/v-delete-web-domain-ssl-hsts
  21. 1 1
      bin/v-list-cron-job
  22. 4 4
      bin/v-list-cron-jobs
  23. 1 1
      bin/v-list-database
  24. 4 4
      bin/v-list-database-hosts
  25. 4 4
      bin/v-list-databases
  26. 1 1
      bin/v-list-dns-domain
  27. 4 4
      bin/v-list-dns-domains
  28. 4 4
      bin/v-list-dns-records
  29. 4 4
      bin/v-list-dns-template
  30. 4 4
      bin/v-list-firewall
  31. 4 4
      bin/v-list-firewall-ban
  32. 1 1
      bin/v-list-firewall-rule
  33. 1 1
      bin/v-list-mail-account
  34. 4 4
      bin/v-list-mail-accounts
  35. 2 2
      bin/v-list-mail-domain
  36. 4 4
      bin/v-list-mail-domains
  37. 4 4
      bin/v-list-remote-dns-hosts
  38. 1 1
      bin/v-list-sys-db-status
  39. 2 2
      bin/v-list-sys-hestia-updates
  40. 2 1
      bin/v-list-sys-mysql-config
  41. 1 1
      bin/v-list-sys-nginx-config
  42. 1 1
      bin/v-list-sys-php-config
  43. 4 4
      bin/v-list-sys-services
  44. 1 1
      bin/v-list-user-backup
  45. 4 4
      bin/v-list-user-backups
  46. 4 4
      bin/v-list-user-notifications
  47. 1 1
      bin/v-list-user-packages
  48. 4 4
      bin/v-list-user-stats
  49. 4 4
      bin/v-list-users-stats
  50. 1 1
      bin/v-list-web-domain
  51. 1 1
      bin/v-list-web-domain-ssl
  52. 4 4
      bin/v-list-web-domains
  53. 4 4
      bin/v-restore-user
  54. 1 1
      bin/v-stop-firewall
  55. 1 1
      bin/v-suspend-dns-record
  56. 1 1
      bin/v-unsuspend-dns-record
  57. 3 3
      bin/v-update-firewall
  58. 5 5
      bin/v-update-user-counters
  59. 9 9
      func/db.sh
  60. 3 3
      func/domain.sh
  61. 6 6
      func/main.sh
  62. 4 4
      func/rebuild.sh
  63. 1 1
      func/remote.sh

+ 1 - 1
bin/v-add-letsencrypt-host

@@ -46,7 +46,7 @@ is_object_unsuspended 'web' 'DOMAIN' "$domain"
 get_domain_values 'web'
 
 # Load domain data
-eval $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
+parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
 
 # Set ssl installation to yes
 add_ssl="yes"

+ 2 - 2
bin/v-add-remote-dns-domain

@@ -51,10 +51,10 @@ IFS=$'\n'
 for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
 
     # Parsing remote dns host parameters
-    eval $cluster
+    parse_object_kv_list "$cluster"
 
     # Parsing domain parameters
-    eval $str
+    parse_object_kv_list "$str"
 
     # Syncing domain data
     cluster_cmd v-insert-dns-domain $DNS_USER "$str" $HOSTNAME $flush 'no'

+ 1 - 1
bin/v-add-remote-dns-record

@@ -52,7 +52,7 @@ IFS=$'\n'
 for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
 
     # Parsing remote host parameters
-    eval $cluster
+    parse_object_kv_list "$cluster"
 
     # Syncing serial
     str=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)

+ 1 - 1
bin/v-add-web-domain-ssl-force

@@ -38,7 +38,7 @@ check_hestia_demo_mode
 #----------------------------------------------------------#
 
 # Load domain data
-eval $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
+parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
 
 # Check if SSL is enabled
 if [ "$SSL" != 'yes' ]; then

+ 1 - 1
bin/v-add-web-domain-ssl-hsts

@@ -38,7 +38,7 @@ check_hestia_demo_mode
 #----------------------------------------------------------#
 
 # Load domain data
-eval $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
+parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
 
 # Check if SSL is enabled
 if [ "$SSL" != 'yes' ]; then

+ 2 - 2
bin/v-change-database-owner

@@ -75,7 +75,7 @@ mkdir -p $BACKUP/tmp.$database
 $BIN/v-suspend-database $owner $database > /dev/null 2>&1
 
 # Dump database
-eval $db_data
+parse_object_kv_list "$db_data"
 dump="$tmpdir/$database.$TYPE.sql"
 grants="$tmpdir/$database.$TYPE.$DBUSER"
 case $TYPE in
@@ -86,7 +86,7 @@ esac
 # Import configuration
 db_data=$(echo "$db_data" | sed "s/'${owner}_/'${user}_/g")
 echo "$db_data" >> $HESTIA/data/users/$user/db.conf
-eval $db_data
+parse_object_kv_list "$db_data"
 
 # Unsuspend db
 $BIN/v-unsuspend-database $user $new_db > /dev/null 2>&1

+ 1 - 1
bin/v-change-dns-record

@@ -54,7 +54,7 @@ check_hestia_demo_mode
 
 # Parsing domain config
 line=$(grep "ID='$id'" $USER_DATA/dns/$domain.conf)
-eval $line
+parse_object_kv_list "$line"
 
 # Null priority for none MX/SRV records
 if [ "$TYPE" != 'MX' ] && [ "$TYPE" != 'SRV' ]; then

+ 2 - 2
bin/v-change-domain-owner

@@ -47,7 +47,7 @@ check_hestia_demo_mode
 web_data=$(grep "DOMAIN='$domain'" $HESTIA/data/users/$owner/web.conf)
 if [ ! -z "$web_data" ]; then
     $BIN/v-suspend-web-domain $owner $domain >> /dev/null 2>&1
-    eval $web_data
+    parse_object_kv_list "$web_data"
 
     # Change IP
     if [ ! -z "$ip" ]; then
@@ -95,7 +95,7 @@ fi
 # DNS domain
 dns_data=$(grep "DOMAIN='$domain'" $HESTIA/data/users/$owner/dns.conf)
 if [ ! -z "$dns_data" ]; then
-    eval $dns_data
+    parse_object_kv_list "$dns_data"
 
     # Change IP
     if [ ! -z "$ip" ]; then

+ 1 - 1
bin/v-change-remote-dns-domain-exp

@@ -40,7 +40,7 @@ IFS=$'\n'
 for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
 
     # Parsing remote host parameters
-    eval $cluster
+    parse_object_kv_list "$cluster"
 
     # Syncing domain
     str=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)

+ 1 - 1
bin/v-change-remote-dns-domain-soa

@@ -40,7 +40,7 @@ IFS=$'\n'
 for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
 
     # Parsing remote host parameters
-    eval $cluster
+    parse_object_kv_list "$cluster"
 
     # Syncing SOA
     str=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)

+ 1 - 1
bin/v-change-remote-dns-domain-ttl

@@ -40,7 +40,7 @@ IFS=$'\n'
 for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
 
     # Parsing remote host parameters
-    eval $cluster
+    parse_object_kv_list "$cluster"
 
     # Syncing TTL
     str=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)

+ 1 - 1
bin/v-delete-cron-restart-job

@@ -29,7 +29,7 @@ is_system_enabled "$CRON_SYSTEM" 'CRON_SYSTEM'
 cmd="sudo $HESTIA/bin/v-update-sys-queue restart"
 check_cron=$(grep "$cmd" $HESTIA/data/users/admin/cron.conf 2> /dev/null)
 if [ ! -z "$check_cron" ]; then
-    eval $check_cron
+    parse_object_kv_list "$check_cron"
     $BIN/v-delete-cron-job admin "$JOB"
 fi
 

+ 1 - 1
bin/v-delete-dns-on-web-alias

@@ -70,7 +70,7 @@ else
             rec=$(grep -w "RECORD='$sub'" $USER_DATA/dns/$root.conf)
         fi
         if [ ! -z "$rec" ]; then
-            eval "$rec"
+            parse_object_kv_list "$rec"
             $BIN/v-delete-dns-record $user "$root" "$ID" $restart
         fi
     fi

+ 1 - 1
bin/v-delete-firewall-chain

@@ -44,7 +44,7 @@ chains=$HESTIA/data/firewall/chains.conf
 banlist=$HESTIA/data/firewall/banlist.conf
 chain_param=$(grep "CHAIN='$chain'" $chains 2>/dev/null)
 if [ ! -z "$chain_param" ]; then
-    eval $chain_param
+    parse_object_kv_list "$chain_param"
     sed -i "/CHAIN='$chain'/d" $chains
     sed -i "/CHAIN='$chain'/d" $banlist
     $iptables -D INPUT -p $PROTOCOL \

+ 1 - 1
bin/v-delete-remote-dns-domain

@@ -39,7 +39,7 @@ IFS=$'\n'
 for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
 
     # Parsing remote host parameters
-    eval $cluster
+    parse_object_kv_list "$cluster"
 
     # Syncing domain
     cluster_cmd v-delete-dns-domain $DNS_USER $domain 'yes'

+ 2 - 1
bin/v-delete-remote-dns-domains

@@ -21,6 +21,7 @@ source $HESTIA/conf/hestia.conf
 #                    Verifications                         #
 #----------------------------------------------------------#
 
+is_format_valid 'host'
 is_system_enabled "$DNS_CLUSTER" 'DNS_CLUSTER'
 is_procces_running
 remote_dns_health_check
@@ -42,7 +43,7 @@ fi
 for cluster in $hosts; do
 
     # Parsing remote host parameters
-    eval $cluster
+    parse_object_kv_list "$cluster"
 
     # Deleting source records
     cluster_cmd v-delete-dns-domains-src $DNS_USER $HOSTNAME 'no'

+ 1 - 1
bin/v-delete-remote-dns-host

@@ -48,7 +48,7 @@ if [ "$check_cluster" -eq '0' ]; then
     cmd="sudo $HESTIA/bin/v-update-sys-queue dns-cluster"
     check_cron=$(grep "$cmd" $HESTIA/data/users/admin/cron.conf 2> /dev/null)
     if [ ! -z "$check_cron" ]; then
-        eval $check_cron
+        parse_object_kv_list "$check_cron"
         $BIN/v-delete-cron-job admin "$JOB"
     fi
 fi

+ 1 - 1
bin/v-delete-remote-dns-record

@@ -41,7 +41,7 @@ IFS=$'\n'
 for cluster in $(cat $HESTIA/conf/dns-cluster.conf); do
 
     # Parsing remote host parameters
-    eval $cluster
+    parse_object_kv_list "$cluster"
 
     # Syncing serial
     str=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)

+ 1 - 1
bin/v-delete-web-domain-ssl-force

@@ -39,7 +39,7 @@ check_hestia_demo_mode
 #----------------------------------------------------------#
 
 # Load domain data
-eval $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
+parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
 
 # Remove forcessl configs
 if [ -f $HOMEDIR/$user/conf/web/$domain/$WEB_SYSTEM.forcessl.conf ]; then

+ 1 - 1
bin/v-delete-web-domain-ssl-hsts

@@ -39,7 +39,7 @@ check_hestia_demo_mode
 #----------------------------------------------------------#
 
 # Load domain data
-eval $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
+parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
 
 # Check for Apache/Nginx or Nginx/PHP-FPM configuration
 if [ -z $PROXY_SYSTEM ]; then

+ 1 - 1
bin/v-list-cron-job

@@ -84,7 +84,7 @@ if [ -z "$cron_line" ]; then
 fi
 
 # Parsing cron job
-eval $cron_line
+parse_object_kv_list "$cron_line"
 
 # Replacing quoted and backslahed text
 CMD=$(echo "$CMD" |sed -e 's/"/\\"/g' -e "s/%quote%/'/g")

+ 4 - 4
bin/v-list-cron-jobs

@@ -23,7 +23,7 @@ json_list() {
     objects=$(grep JOB $USER_DATA/cron.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         CMD=$(echo "$CMD" |sed -e 's/"/\\"/g' -e "s/%quote%/'/g")
         echo -n '    "'$JOB'": {
         "MIN": "'$MIN'",
@@ -54,7 +54,7 @@ shell_list() {
     echo "JOB^MIN^HOUR^MONTH^WDAY^COMMAND"
     echo "---^---^----^-----^----^-------"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         CMD=$(echo "$CMD" |sed -e 's/"/\\"/g' -e "s/%quote%/'/g")
         echo "$JOB^$MIN^$HOUR^$MONTH^$WDAY^$CMD"
     done < <(cat $USER_DATA/cron.conf)
@@ -64,7 +64,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         CMD=$(echo "$CMD" |sed -e 's/"/\\"/g' -e "s/%quote%/'/g")
         echo -ne "$JOB\t$MIN\t$HOUR\t$MONTH\t$WDAY\t$CMD\t"
         echo -e "$SUSPENDED\t$TIME\t$DATE"
@@ -76,7 +76,7 @@ csv_list() {
     IFS=$'\n'
     echo  "MIN,HOUR,DAY,WDAY,CMD,SUSPENDED,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         CMD=$(echo "$CMD" |sed -e 's/"/\\"/g' -e "s/%quote%/'/g")
         echo -n "$JOB,$MIN,$HOUR,$MONTH,$WDAY,\"$CMD\","
         echo "$SUSPENDED,$TIME,$DATE"

+ 1 - 1
bin/v-list-database

@@ -75,7 +75,7 @@ is_object_valid 'db' 'DB' "$database"
 #----------------------------------------------------------#
 
 # Parsing database
-eval $(grep "DB='$database'" $USER_DATA/db.conf)
+parse_object_kv_list $(grep "DB='$database'" $USER_DATA/db.conf)
 
 # Listing data
 case $format in

+ 4 - 4
bin/v-list-database-hosts

@@ -32,7 +32,7 @@ json_list() {
     for type in $(echo $DB_SYSTEM |sed -e 's/,/\n/'); do
         if [ -e "$HESTIA/conf/$type.conf" ]; then
             for str in $(cat $HESTIA/conf/$type.conf); do
-                eval $str
+                parse_object_kv_list "$str"
         echo -n '    {
         "HOST": "'$HOST'",
         "TYPE": "'$type'",
@@ -65,7 +65,7 @@ shell_list() {
     for type in $(echo $DB_SYSTEM |sed -e 's/,/\n/'); do
         if [ -e "$HESTIA/conf/$type.conf" ]; then
             for str in $(cat $HESTIA/conf/$type.conf); do
-                eval $str
+                parse_object_kv_list "$str"
                 echo "$HOST $type $MAX_DB $U_DB_BASES $SUSPENDED $TIME $DATE"
             done
         fi
@@ -78,7 +78,7 @@ plain_list() {
     for type in $(echo $DB_SYSTEM |sed -e 's/,/\n/'); do
         if [ -e "$HESTIA/conf/$type.conf" ]; then
             for str in $(cat $HESTIA/conf/$type.conf); do
-                eval $str
+                parse_object_kv_list "$str"
                 echo -ne "$HOST\t$type\t$CHARSETS\t$MAX_DB\t$U_SYS_USERS\t"
                 echo -e "$U_DB_BASES\t$TPL\t$SUSPENDED\t$TIME\t$DATE"
             done
@@ -94,7 +94,7 @@ csv_list() {
     for type in $(echo $DB_SYSTEM |sed -e 's/,/\n/'); do
         if [ -e "$HESTIA/conf/$type.conf" ]; then
             for str in $(cat $HESTIA/conf/$type.conf); do
-                eval $str
+                parse_object_kv_list "$str"
                 echo -n "$HOST,$type,\"$CHARSETS\",$MAX_DB,\"$U_SYS_USERS\","
                 echo "$U_DB_BASES,$TPL,$SUSPENDED,$TIME,$DATE"
             done

+ 4 - 4
bin/v-list-databases

@@ -23,7 +23,7 @@ json_list() {
     objects=$(grep "DB=" $USER_DATA/db.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$DB'": {
         "DATABASE": "'$DB'",
         "DBUSER": "'$DBUSER'",
@@ -51,7 +51,7 @@ shell_list() {
     echo "DATABASE   USER   HOST   TYPE   DISK   SPND   DATE"
     echo "--------   ----   ----   ----   ----   ----   ----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$DB $DBUSER $HOST $TYPE $U_DISK $SUSPENDED $DATE"
     done < <(cat $USER_DATA/db.conf)
 }
@@ -60,7 +60,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$DB\t$DBUSER\t$HOST\t$TYPE\t$CHARSET\t$U_DISK\t"
         echo -e "$SUSPENDED\t$TIME\t$DATE"
     done < <(cat $USER_DATA/db.conf)
@@ -71,7 +71,7 @@ csv_list() {
     IFS=$'\n'
     echo "DATABASE,DBUSER,HOST,TYPE,CHARSET,U_DISK,SUSPENDED,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$DB,$DBUSER,$HOST,$TYPE,$CHARSET,$U_DISK,$SUSPENDED,$TIME,$DATE"
     done < <(cat $USER_DATA/db.conf)
 }

+ 1 - 1
bin/v-list-dns-domain

@@ -81,7 +81,7 @@ is_object_valid 'dns' 'DOMAIN' "$domain"
 #----------------------------------------------------------#
 
 # Parsing domain
-eval $(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)
+parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)
 
 # Listing data
 case $format in

+ 4 - 4
bin/v-list-dns-domains

@@ -23,7 +23,7 @@ json_list() {
     objects=$(grep DOMAIN $USER_DATA/dns.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$DOMAIN'": {
         "IP": "'$IP'",
         "TPL": "'$TPL'",
@@ -53,7 +53,7 @@ shell_list() {
     echo "DOMAIN   IP   TPL   TTL   REC   SPND   DATE"
     echo "------   --   ---   ---   ---   ----   ----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$DOMAIN $IP $TPL $TTL $RECORDS $SUSPENDED $DATE"
     done < <(cat $USER_DATA/dns.conf)
 }
@@ -63,7 +63,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$DOMAIN\t$IP\t$TPL\t$TTL\t$EXP\t$SOA\t$SERIAL\t"
         echo -e "$SRC\t$RECORDS\t$SUSPENDED\t$TIME\t$DATE"
     done < <(cat $USER_DATA/dns.conf)
@@ -75,7 +75,7 @@ csv_list() {
     IFS=$'\n'
     echo "DOMAIN,IP,TPL,TTL,EXP,SOA,SERIAL,SRC,RECORDS,SUSPENDED,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n "$DOMAIN,$IP,$TPL,$TTL,$EXP,$SOA,$SERIAL,"
         echo "$SRC,$RECORDS,$SUSPENDED,$TIME,$DATE"
     done < <(cat $USER_DATA/dns.conf)

+ 4 - 4
bin/v-list-dns-records

@@ -24,7 +24,7 @@ json_list() {
     objects=$(grep ID $USER_DATA/dns/$domain.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         VALUE=$(echo "$VALUE" |sed -e 's/"/\\"/g' -e "s/%quote%/'/g")
         echo -n '    "'$ID'": {
         "RECORD": "'$RECORD'",
@@ -52,7 +52,7 @@ shell_list() {
     echo "ID^RECORD^TYPE^VALUE^DATE"
     echo "--^------^----^-----^----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$ID^$RECORD^$TYPE^${VALUE:0:30}^$DATE"
     done < <(cat $USER_DATA/dns/$domain.conf)
 }
@@ -61,7 +61,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         VALUE=$(echo "$VALUE" |sed -e "s/%quote%/\\'/g")
         echo -ne "$ID\t$RECORD\t$TYPE\t$PRIORITY\t$VALUE\t"
         echo -e "$SUSPENDED\t$TIME\t$DATE"
@@ -73,7 +73,7 @@ csv_list() {
     IFS=$'\n'
     echo "ID,RECORD,TYPE,PRIORITY,VALUE,SUSPENDED,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         VALUE=$(echo "$VALUE" |sed -e "s/%quote%/\\'/g")
         echo -n "$ID,$RECORD,$TYPE,$PRIORITY,\"$VALUE\","
         echo "$SUSPENDED,$TIME,$DATE"

+ 4 - 4
bin/v-list-dns-template

@@ -24,7 +24,7 @@ json_list() {
     objects=$(grep ID $DNSTPL/$template.tpl |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         VALUE=$(echo "$VALUE" |sed -e 's/"/\\"/g' -e "s/%quote%/'/g")
         echo -n '    "'$ID'": {
         "RECORD": "'$RECORD'",
@@ -49,7 +49,7 @@ shell_list() {
     echo "ID^RECORD^TYPE^VALUE"
     echo "--^------^----^-----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$ID^$RECORD^$TYPE^$VALUE"
     done < <(cat $DNSTPL/$template.tpl)
 }
@@ -58,7 +58,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         VALUE=$(echo "$VALUE" |sed -e "s/%quote%/\\'/g")
         echo -e "$ID\t$RECORD\t$TYPE\t$PRIORITY\t$VALUE"
     done < <(cat $DNSTPL/$template.tpl)
@@ -69,7 +69,7 @@ csv_list() {
     IFS=$'\n'
     echo "ID,RECORD,TYPE,PRIORITY,VALUE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         VALUE=$(echo "$VALUE" |sed -e "s/%quote%/\\'/g")
         echo "$ID,$RECORD,$TYPE,$PRIORITY,\"$VALUE\""
     done < <(cat $DNSTPL/$template.tpl)

+ 4 - 4
bin/v-list-firewall

@@ -22,7 +22,7 @@ json_list() {
     objects=$(grep RULE $HESTIA/data/firewall/rules.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$RULE'": {
         "ACTION": "'$ACTION'",
         "PROTOCOL": "'$PROTOCOL'",
@@ -49,7 +49,7 @@ shell_list() {
     echo "RULE^ACTION^PROTO^PORT^IP^SPND^DATE"
     echo "----^------^-----^----^--^----^----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$RULE^$ACTION^$PROTOCOL^$PORT^$IP^$SUSPENDED^$DATE"
     done < <(cat $HESTIA/data/firewall/rules.conf)
 }
@@ -58,7 +58,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$RULE\t$ACTION\t$PROTOCOL\t$PORT\t$IP\t$COMMENT\t"
         echo -e "$SUSPENDED\t$TIME\t$DATE"
     done < <(cat $HESTIA/data/firewall/rules.conf)
@@ -69,7 +69,7 @@ csv_list() {
     IFS=$'\n'
     echo "RULE,ACTION,PROTOCOL,PORT,IP,COMMENT,SUSPENDED,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n "$RULE,$ACTION,$PROTOCOL,$PORT,$IP,\"$COMMENT\","
         echo "$SUSPENDED,$TIME,$DATE"
     done < <(cat $HESTIA/data/firewall/rules.conf)

+ 4 - 4
bin/v-list-firewall-ban

@@ -22,7 +22,7 @@ json_list() {
     objects=$(grep IP $HESTIA/data/firewall/banlist.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$IP'": {
         "IP": "'$IP'",
         "CHAIN": "'$CHAIN'",
@@ -45,7 +45,7 @@ shell_list() {
     echo "IP   CHAIN   TIME   DATE"
     echo "--   -----   ----   ----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$IP $CHAIN $TIME $DATE"
     done < <(cat $HESTIA/data/firewall/banlist.conf)
 }
@@ -54,7 +54,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -e "$IP\t$CHAIN\t$TIME\t$DATE"
     done < <(cat $HESTIA/data/firewall/banlist.conf)
 }
@@ -64,7 +64,7 @@ csv_list() {
     IFS=$'\n'
     echo "IP,CHAIN,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$IP,$CHAIN,$TIME,$DATE"
     done < <(cat $HESTIA/data/firewall/banlist.conf)
 }

+ 1 - 1
bin/v-list-firewall-rule

@@ -70,7 +70,7 @@ is_object_valid '../../data/firewall/rules' 'RULE' "$rule"
 #----------------------------------------------------------#
 
 # Parsing rules
-eval $(grep "RULE='$rule'" $HESTIA/data/firewall/rules.conf)
+parse_object_kv_list $(grep "RULE='$rule'" $HESTIA/data/firewall/rules.conf)
 
 # Listing data
 case $format in

+ 1 - 1
bin/v-list-mail-account

@@ -84,7 +84,7 @@ is_object_valid "mail/$domain" 'ACCOUNT' "$account"
 #----------------------------------------------------------#
 
 # Parsing mail account
-eval $(grep "ACCOUNT='$account'" $USER_DATA/mail/$domain.conf)
+parse_object_kv_list $(grep "ACCOUNT='$account'" $USER_DATA/mail/$domain.conf)
 
 # Listing data
 case $format in

+ 4 - 4
bin/v-list-mail-accounts

@@ -24,7 +24,7 @@ json_list() {
     objects=$(grep ACCOUNT $USER_DATA/mail/$domain.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$ACCOUNT'": {
         "ALIAS": "'$ALIAS'",
         "FWD": "'$FWD'",
@@ -52,7 +52,7 @@ shell_list() {
     echo "ACCOUNT   ALIAS   FWD   DISK  DATE"
     echo "-------   -----   ---   ----  ----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         if [ -z "$ALIAS" ]; then
             ALIAS='no'
         else
@@ -76,7 +76,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$ACCOUNT\t$ALIAS\t$FWD\t$FWD_ONLY\t$AUTOREPLY\t"
         echo -e "$QUOTA\t$U_DISK\t$SUSPENDED\t$TIME\t$DATE"
     done < <(cat $USER_DATA/mail/$domain.conf)
@@ -88,7 +88,7 @@ csv_list() {
     echo -n "ACCOUNT,ALIAS,FWD,FWD_ONLY,AUTOREPLY,QUOTA,U_DISK,"
     echo "SUSPENDED,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n "$ACCOUNT,\"$ALIAS\",\"$FWD\",$FWD_ONLY,$AUTOREPLY,"
         echo "$QUOTA,$U_DISK,$SUSPENDED,$TIME,$DATE"
     done < <(cat $USER_DATA/mail/$domain.conf)

+ 2 - 2
bin/v-list-mail-domain

@@ -20,7 +20,7 @@ source $HESTIA/conf/hestia.conf
 
 # JSON list function
 json_list() {
-    eval $(grep "DOMAIN='$domain'" $USER_DATA/mail.conf)
+    parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/mail.conf)
     echo '{'
     echo '    "'$DOMAIN'": {
         "ANTIVIRUS": "'$ANTIVIRUS'",
@@ -86,7 +86,7 @@ is_object_valid 'mail' 'DOMAIN' "$domain"
 #----------------------------------------------------------#
 
 # Parsing mail domain
-eval $(grep "DOMAIN='$domain'" $USER_DATA/mail.conf)
+parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/mail.conf)
 
 # Listing data
 case $format in

+ 4 - 4
bin/v-list-mail-domains

@@ -23,7 +23,7 @@ json_list() {
     objects=$(grep DOMAIN $USER_DATA/mail.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$DOMAIN'": {
         "ANTIVIRUS": "'$ANTIVIRUS'",
         "ANTISPAM": "'$ANTISPAM'",
@@ -52,7 +52,7 @@ shell_list() {
     echo "DOMAIN   ANTIVIRUS   ANTISPAM   DKIM  SSL   ACC   DISK   SPND   DATE"
     echo "------   ---------   --------   ----  ---   ---   ----   ---   ----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n "$DOMAIN $ANTIVIRUS $ANTISPAM $DKIM $SSL $ACCOUNTS $U_DISK "
         echo "$SUSPENDED $DATE"
     done < <(cat $USER_DATA/mail.conf)
@@ -62,7 +62,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$DOMAIN\t$ANTIVIRUS\t$ANTISPAM\t$DKIM\t$SSL\$CATCHALL\t"
         echo -e "$ACCOUNTS\t$U_DISK\t$SUSPENDED\t$TIME\t$DATE"
     done < <(cat $USER_DATA/mail.conf)
@@ -74,7 +74,7 @@ csv_list() {
     echo -n "DOMAIN,ANTIVIRUS,ANTISPAM,DKIM,SSL,CATCHALL,ACCOUNTS,U_DISK,"
     echo "SUSPENDED,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n "$DOMAIN,$ANTIVIRUS,$ANTISPAM,$DKIM,$SSL,$CATCHALL,$ACCOUNTS,"
         echo "'$U_DISK,$SUSPENDED,$TIME,$DATE"
         echo

+ 4 - 4
bin/v-list-remote-dns-hosts

@@ -22,7 +22,7 @@ json_list() {
     objects=$(grep HOST $HESTIA/conf/dns-cluster.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$HOST'": {
         "PORT": "'$PORT'",
         "TYPE": "'$TYPE'",
@@ -48,7 +48,7 @@ shell_list() {
     echo "HOST   PORT   TYPE   USER  DNS_USER   SPND   DATE"
     echo "----   ----   ----   ----  --------   ----   ----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$HOST $PORT $TYPE $USER $DNS_USER $SUSPENDED $DATE"
     done < <(cat $HESTIA/conf/dns-cluster.conf)
 }
@@ -57,7 +57,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$HOST\t$PORT\t$TYPE\t$USER\t$DNS_USER\t"
         echo -e "$SUSPENDED\t$TIME\t$DATE"
     done < <(cat $HESTIA/conf/dns-cluster.conf)
@@ -68,7 +68,7 @@ csv_list() {
     IFS=$'\n'
     echo "HOST,PORT,TYPE,USER,DNS_USER,SUSPENDED,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$HOST,$PORT,$TYPE,$USER,$DNS_USER,$SUSPENDED,$TIME,$DATE"
     done < <(cat $HESTIA/conf/dns-cluster.conf)
 }

+ 1 - 1
bin/v-list-sys-db-status

@@ -35,7 +35,7 @@ for db in $(echo $DB_SYSTEM| tr ',' '\n'); do
 
         # Checking server status
         for host_str in $(cat $HESTIA/conf/$db.conf); do
-            eval $host_str
+            parse_object_kv_list "$host_str"
 
             # Checking MySQL
             if [ "$db" = 'mysql' ]; then

+ 2 - 2
bin/v-list-sys-hestia-updates

@@ -24,7 +24,7 @@ json_list() {
     objects=$(echo -e "$data" |grep NAME |wc -l)
     echo "{"
     for str in $(echo -e "$data"); do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$NAME'": {
         "VERSION": "'$VERSION'",
         "ARCH": "'$ARCH'",
@@ -49,7 +49,7 @@ shell_list() {
     echo "PKG   VER   ARCH   UPDT   DATE"
     echo "---   ---   ----   ----   ----"
     for str in $(echo -e "$data"); do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$NAME $VERSION $ARCH $UPDATED $DATE"
     done
 }

+ 2 - 1
bin/v-list-sys-mysql-config

@@ -18,8 +18,9 @@ source $HESTIA/conf/hestia.conf
 
 # JSON list function
 json_list() {
-    eval $(echo "$config"|egrep "$keys"|\
+    str=$(echo "$config"|egrep "$keys"|\
         sed -e "s/[ ]*=/=/" -e "s/=[ ]*/=\'/" -e "s/$/'/")
+    parse_object_kv_list "$str"
     echo '{
     "CONFIG": {
         "max_user_connections": "'$max_user_connections'",

+ 1 - 1
bin/v-list-sys-nginx-config

@@ -17,7 +17,7 @@ source $HESTIA/func/main.sh
 
 # JSON list function
 json_list() {
-    eval $(echo "$config" |egrep "$keys" |tr -d ';'| awk '{print $1"="$2}')
+    parse_object_kv_list $(echo "$config" |egrep "$keys" |tr -d ';'| awk '{print $1"="$2}')
     echo '{
     "CONFIG": {
         "worker_processes": "'$worker_processes'",

+ 1 - 1
bin/v-list-sys-php-config

@@ -18,7 +18,7 @@ source $HESTIA/conf/hestia.conf
 
 # JSON list function
 json_list() {
-    eval $(echo "$config"|egrep "$keys"|\
+    parse_object_kv_list $(echo "$config"|egrep "$keys"|\
         sed -e "s/[ ]*=/=/" -e "s/=[ ]*/=\'/" -e "s/$/'/")
     echo '{
     "CONFIG": {

+ 4 - 4
bin/v-list-sys-services

@@ -25,7 +25,7 @@ json_list() {
     objects=$(echo -e "$data" |grep NAME |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$NAME'": {
         "SYSTEM": "'$SYSTEM'",
         "STATE": "'$STATE'",
@@ -49,7 +49,7 @@ shell_list() {
     echo "NAME   STATE   CPU   MEM   UPTIME"
     echo "----   -----   ---   ---   ------"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$NAME $STATE $CPU $MEM $RTIME"
     done < <(echo -e "$data" |grep NAME)
 }
@@ -58,7 +58,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -e "$NAME\t$SYSTEM\t$STATE\t$CPU\t$MEM\t$RTIME"
     done < <(echo -e "$data" |grep NAME)
 }
@@ -68,7 +68,7 @@ csv_list() {
     IFS=$'\n'
     echo "NAME,SYSTEM,STATE,CPU,MEM,RTIME"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$NAME,\"$SYSTEM\",$STATE,$CPU,$MEM,$RTIME"
     done < <(echo -e "$data" |grep NAME)
 }

+ 1 - 1
bin/v-list-user-backup

@@ -85,7 +85,7 @@ is_object_valid 'backup' 'BACKUP' "$backup"
 #----------------------------------------------------------#
 
 # Parsing backup config
-eval $(grep "BACKUP='$backup'" $USER_DATA/backup.conf)
+parse_object_kv_list $(grep "BACKUP='$backup'" $USER_DATA/backup.conf)
 
 # Listing data
 case $format in

+ 4 - 4
bin/v-list-user-backups

@@ -23,7 +23,7 @@ json_list() {
     objects=$(grep BACKUP $USER_DATA/backup.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$BACKUP'": {
         "TYPE": "'$TYPE'",
         "SIZE": "'$SIZE'",
@@ -53,7 +53,7 @@ shell_list() {
     echo "BACKUP   TYPE   SIZE  TIME  DATE"
     echo "------   ----   ---   ----  ----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$BACKUP $TYPE $SIZE $RUNTIME $DATE"
     done < <(cat $USER_DATA/backup.conf)
 }
@@ -62,7 +62,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$BACKUP\t$TYPE\t$SIZE\t$WEB\t$DNS\t$MAIL\t$CRON\t$UDIR\t"
         echo -e "$RUNTIME\t$TIME\t$DATE"
     done < <(cat $USER_DATA/backup.conf)
@@ -73,7 +73,7 @@ csv_list() {
     IFS=$'\n'
     echo "BACKUP,TYPE,SIZE,WEB,DNS,MAIL,CRON,UDIR,RUNTIME,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n "$BACKUP,$TYPE,$SIZE,\"$WEB\",\"$DNS\",\"$MAIL\",\"$CRON\","
         echo "\"$UDIR\",$RUNTIME,$TIME,$DATE"
     done < <(cat $USER_DATA/backup.conf)

+ 4 - 4
bin/v-list-user-notifications

@@ -23,7 +23,7 @@ json_list() {
     objects=$(grep NID $USER_DATA/notifications.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         TOPIC=$(echo "$TOPIC" |sed -e "s/%quote%/'/g")
         NOTICE=$(echo "$NOTICE" |sed -e "s/%quote%/'/g")
         echo -n '    "'$NID'": {
@@ -49,7 +49,7 @@ json_list() {
 shell_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$TOPIC" |sed -e "s/%quote%/'/g"
         echo "$NOTICE" |sed -e "s/%quote%/'/g"
         echo "$DATE $TIME"
@@ -62,7 +62,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         TOPIC=$(echo "$TOPIC" |sed -e "s/%quote%/'/g")
         NOTICE=$(echo "$NOTICE" |sed -e "s/%quote%/'/g")
         echo -e "$NID\t$TOPIC\t$NOTICE\t$TIME\t$DATE"
@@ -74,7 +74,7 @@ csv_list() {
     IFS=$'\n'
     echo "NID,TOPIC,NOTICE,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         TOPIC=$(echo "$TOPIC" |sed -e "s/%quote%/'/g")
         NOTICE=$(echo "$NOTICE" |sed -e "s/%quote%/'/g")
         echo "$NID,\"$TOPIC\",\"$NOTICE\",$TIME,$DATE"

+ 1 - 1
bin/v-list-user-packages

@@ -64,7 +64,7 @@ shell_list() {
         PACKAGE=${package/.pkg/}
         package_data=$(cat $HESTIA/data/packages/$package)
         package_data=$(echo "$package_data" |sed -e 's/unlimited/unlim/g')
-        eval $package_data
+        parse_object_kv_list "$package_data"
         echo -n "$PACKAGE $WEB_TEMPLATE $WEB_DOMAINS $DNS_DOMAINS "
         echo "$MAIL_DOMAINS $DATABASES $SHELL $DISK_QUOTA $BANDWIDTH"
     done

+ 4 - 4
bin/v-list-user-stats

@@ -23,7 +23,7 @@ json_list() {
     objects=$(grep DATE $USER_DATA/stats.log |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$DATE'": {
         "TIME": "'$TIME'",
         "PACKAGE": "'$PACKAGE'",
@@ -64,7 +64,7 @@ shell_list() {
     echo "DATE   WEB   DNS   MAIL   DB   BACKUPS   IP   DISK   BW"
     echo "----   ---   ---   ----   --   -------   --   ----   --"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         if [ -z "$U_USERS" ]; then
             U_USERS=1
         fi
@@ -78,7 +78,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$DATE\t$TIME\t$PACKAGE\t$IP_OWNED\t$DISK_QUOTA\t$U_DISK\t"
         echo -ne "$U_DISK_DIRS\t$U_DISK_WEB\t$U_DISK_MAIL\t$U_DISK_DB\t"
         echo -ne "$BANDWIDTH\t$U_BANDWIDTH\t$U_WEB_DOMAINS\t$U_WEB_SSL\t"
@@ -99,7 +99,7 @@ csv_list() {
     echo "U_DATABASES,U_CRON_JOBS,U_BACKUPS"
 
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n "$DATE,$TIME,$PACKAGE,$IP_OWNED,$DISK_QUOTA,$U_DISK,"
         echo -n "$U_DISK_DIRS,$U_DISK_WEB,$U_DISK_MAIL,$U_DISK_DB,"
         echo -n "$BANDWIDTH,$U_BANDWIDTH,$U_WEB_DOMAINS,$U_WEB_SSL,"

+ 4 - 4
bin/v-list-users-stats

@@ -22,7 +22,7 @@ json_list() {
     objects=$(grep DATE $HESTIA/data/users/admin/overall_stats.log |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$DATE'": {
         "TIME": "'$TIME'",
         "PACKAGE": "'$PACKAGE'",
@@ -64,7 +64,7 @@ shell_list() {
     echo "DATE   USER   WEB   DNS   MAIL   DB   BACKUPS   IP   DISK   BW"
     echo "----   ----   ---   ---   ----   --   -------   --   ----   --"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         if [ -z "$U_USERS" ]; then
             U_USERS=1
         fi
@@ -78,7 +78,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$DATE\t$TIME\t$PACKAGE\t$IP_OWNED\t$DISK_QUOTA\t$U_DISK\t"
         echo -ne "$U_DISK_DIRS\t$U_DISK_WEB\t$U_DISK_MAIL\t$U_DISK_DB\t"
         echo -ne "$BANDWIDTH\t$U_BANDWIDTH\t$U_WEB_DOMAINS\t$U_WEB_SSL\t"
@@ -99,7 +99,7 @@ csv_list() {
     echo "U_DATABASES,U_CRON_JOBS,U_BACKUPS,U_USERS"
 
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n "$DATE,$TIME,$PACKAGE,$IP_OWNED,$DISK_QUOTA,$U_DISK,"
         echo -n "$U_DISK_DIRS,$U_DISK_WEB,$U_DISK_MAIL,$U_DISK_DB,"
         echo -n "$BANDWIDTH,$U_BANDWIDTH,$U_WEB_DOMAINS,$U_WEB_SSL,"

+ 1 - 1
bin/v-list-web-domain

@@ -128,7 +128,7 @@ is_object_valid 'web' 'DOMAIN' "$domain"
 #----------------------------------------------------------#
 
 # Parsing domain
-eval $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
+parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
 
 # Listing data
 case $format in

+ 1 - 1
bin/v-list-web-domain-ssl

@@ -111,7 +111,7 @@ is_object_valid 'web' 'DOMAIN' "$domain"
 #----------------------------------------------------------#
 
 # Load domain data
-eval $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
+parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
 
 # Parsing domain SSL certificate
 if [ -e "$USER_DATA/ssl/$domain.crt" ]; then

+ 4 - 4
bin/v-list-web-domains

@@ -23,7 +23,7 @@ json_list() {
     objects=$(grep DOMAIN $USER_DATA/web.conf |wc -l)
     echo "{"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n '    "'$DOMAIN'": {
         "IP": "'$IP'",
         "IP6": "'$IP6'",
@@ -62,7 +62,7 @@ shell_list() {
     echo "DOMAIN   IP   TPL   SSL   DISK   BW   SPND   DATE"
     echo "------   --   ---   ---   ----   --   ----   -----"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo "$DOMAIN $IP $TPL $SSL $U_DISK $U_BANDWIDTH $SUSPENDED $DATE"
     done < <(cat $USER_DATA/web.conf)
 }
@@ -71,7 +71,7 @@ shell_list() {
 plain_list() {
     IFS=$'\n'
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -ne "$DOMAIN\t$IP\t$IP6\t$U_DISK\t$U_BANDWIDTH\t$TPL\t"
         echo -ne "$ALIAS\t$STATS\t$STATS_USER\t$SSL\t$SSL_HOME\t$LETSENCRYPT\t"
         echo -ne "$FTP_USER\t$FTP_PATH\t$AUTH_USER\t$BACKEND\t$PROXY\t"
@@ -86,7 +86,7 @@ csv_list() {
     echo -n "SSL,SSL_HOME,LETSENCRYPT,FTP_USER,FTP_PATH,AUTH_USER,BACKEND,PROXY,"
     echo "PROXY_EXT,SUSPENDED,TIME,DATE"
     while read str; do
-        eval $str
+        parse_object_kv_list "$str"
         echo -n "$DOMAIN,$IP,$IP6,$U_DISK,$U_BANDWIDTH,$TPL,"
         echo -n "\"$ALIAS\",$STATS,\"$STATS_USER\",$SSL,$SSL_HOME,$LETSENCRYPT,"
         echo -n "\"$FTP_USER\",\"$FTP_PATH\",\"$AUTH_USER\",$BACKEND,$PROXY,"

+ 4 - 4
bin/v-restore-user

@@ -316,7 +316,7 @@ if [ "$web" != 'no' ] && [ ! -z "$WEB_SYSTEM" ]; then
 
         # Restoring web.conf
         if [ -z "$check_config" ]; then
-            eval $(cat $tmpdir/web/$domain/$backup_system/web.conf)
+            parse_object_kv_list $(cat $tmpdir/web/$domain/$backup_system/web.conf)
 
             # Deleting conflicting aliases
             for dom_alias in ${ALIAS//,/ }; do
@@ -480,7 +480,7 @@ if [ "$dns" != 'no' ] && [ ! -z "$DNS_SYSTEM" ]; then
 
         # Restoring dns.conf
         if [ -z "$check_config" ]; then
-            eval $(cat $tmpdir/dns/$domain/$backup_system/dns.conf)
+            parse_object_kv_list $(cat $tmpdir/dns/$domain/$backup_system/dns.conf)
 
             # Checking IP address
             check_ip=$(is_ip_valid $IP $user)
@@ -664,7 +664,7 @@ if [ "$db" != 'no' ] && [ ! -z "$DB_SYSTEM" ]; then
 
         # Restore database config
         if [ -z "$check_config" ]; then
-            eval $(cat $tmpdir/db/$database/$backup_system/db.conf)
+            parse_object_kv_list $(cat $tmpdir/db/$database/$backup_system/db.conf)
             DB=$(echo "$DB"  |sed -e "s/${old_user}_//")
             DB="${user}_${DB}"
             DBUSER=$(echo "$DBUSER" |sed -e "s/${old_user}_//")
@@ -674,7 +674,7 @@ if [ "$db" != 'no' ] && [ ! -z "$DB_SYSTEM" ]; then
             str="$str SUSPENDED='no' TIME='$(date +%T)' DATE='$(date +%F)'"
             echo $str >> $USER_DATA/db.conf
         else
-            eval $(grep "DB='$database'" $USER_DATA/db.conf)
+            parse_object_kv_list $(grep "DB='$database'" $USER_DATA/db.conf)
         fi
 
         # Unzipping database dump

+ 1 - 1
bin/v-stop-firewall

@@ -47,7 +47,7 @@ echo "$iptables -X hestia" >> $tmp
 chains=$(cat $HESTIA/data/firewall/chains.conf 2>/dev/null)
 IFS=$'\n'
 for chain in $chains; do
-    eval $chain
+    parse_object_kv_list "$chain"
     echo "$iptables -F fail2ban-$CHAIN" >> $tmp
     echo "$iptables -X fail2ban-$CHAIN" >> $tmp
 done

+ 1 - 1
bin/v-suspend-dns-record

@@ -49,7 +49,7 @@ check_hestia_demo_mode
 #----------------------------------------------------------#
 
 line=$(grep "ID='$id'" $USER_DATA/dns/$domain.conf)
-eval $line
+parse_object_kv_list "$line"
 sed -i "/^ID='$id'/d" $USER_DATA/dns/$domain.conf
 
 # Adding record

+ 1 - 1
bin/v-unsuspend-dns-record

@@ -45,7 +45,7 @@ is_object_valid "dns/$domain" 'ID' "$id"
 #----------------------------------------------------------#
 
 line=$(grep "ID='$id'" $USER_DATA/dns/$domain.conf)
-eval $line
+parse_object_kv_list "$line"
 sed -i "/^ID='$id'/d" $USER_DATA/dns/$domain.conf
 
 # Adding record

+ 3 - 3
bin/v-update-firewall

@@ -79,7 +79,7 @@ echo "$iptables -A INPUT -s 127.0.0.1 -j ACCEPT" >> $tmp
 # Pasring iptables rules
 IFS=$'\n'
 for line in $(sort -r -n -k 2 -t \' $rules); do
-    eval $line
+    parse_object_kv_list "$line"
     if [ "$SUSPENDED" = 'no' ]; then
         proto="-p $PROTOCOL"
         port="--dport $PORT"
@@ -132,7 +132,7 @@ fi
 # Checking fail2ban support
 if [ ! -z "$FIREWALL_EXTENSION" ]; then
     for chain in $(cat $HESTIA/data/firewall/chains.conf 2>/dev/null); do
-        eval $chain
+        parse_object_kv_list "$chain"
         if [[ "$PORT" =~ ,|-|: ]] ; then
             port="-m multiport --dports $PORT"
         else
@@ -147,7 +147,7 @@ if [ ! -z "$FIREWALL_EXTENSION" ]; then
     rm -f $tmp
 
     for ban in $(cat $HESTIA/data/firewall/banlist.conf 2>/dev/null); do
-        eval $ban
+        parse_object_kv_list "$ban"
         echo -n "$iptables -I fail2ban-$CHAIN 1 -s $IP" >> $tmp
         echo " -j REJECT --reject-with icmp-port-unreachable" >> $tmp
     done

+ 5 - 5
bin/v-update-user-counters

@@ -104,7 +104,7 @@ for user in $user_list; do
     U_WEB_DOMAINS=0
     if [ -f $USER_DATA/web.conf ]; then
         for domain_str in $(cat $USER_DATA/web.conf) ;do
-            eval $domain_str
+            parse_object_kv_list "$domain_str"
             U_DISK_WEB=$((U_DISK_WEB + U_DISK))
             U_WEB_DOMAINS=$((U_WEB_DOMAINS + 1))
 
@@ -126,7 +126,7 @@ for user in $user_list; do
     # Checking dns system
     if [ -f $USER_DATA/dns.conf ]; then
         for domain_str in $(cat $USER_DATA/dns.conf); do
-            eval $domain_str
+            parse_object_kv_list "$domain_str"
             U_DNS_DOMAINS=$((U_DNS_DOMAINS + 1))
             records=$(wc -l $USER_DATA/dns/$DOMAIN.conf| cut -f 1 -d ' ')
             U_DNS_RECORDS=$((U_DNS_RECORDS + records))
@@ -140,7 +140,7 @@ for user in $user_list; do
     # Checking mail system
     if [ -f $USER_DATA/mail.conf ]; then
         for domain_str in $(cat $USER_DATA/mail.conf); do
-            eval $domain_str
+            parse_object_kv_list "$domain_str"
             U_DISK_MAIL=$((U_DISK_MAIL + U_DISK))
             U_MAIL_DOMAINS=$((U_MAIL_DOMAINS + 1))
             accounts=$(wc -l $USER_DATA/mail/$DOMAIN.conf| cut -f 1 -d ' ')
@@ -159,7 +159,7 @@ for user in $user_list; do
     # Checking db system
     if [ -f $USER_DATA/db.conf ]; then
         for db_str in $(cat $USER_DATA/db.conf); do
-            eval $db_str
+            parse_object_kv_list "$db_str"
             U_DISK_DB=$((U_DISK_DB + U_DISK))
             U_DATABASES=$((U_DATABASES + 1))
             if [ "$SUSPENDED" = 'yes' ]; then
@@ -172,7 +172,7 @@ for user in $user_list; do
     # Checking cron system
     if [ -f $USER_DATA/cron.conf ]; then
         for cron_str in $(cat $USER_DATA/cron.conf);do
-            eval $cron_str
+            parse_object_kv_list "$cron_str"
             U_CRON_JOBS=$((U_CRON_JOBS + 1))
             if [ "$SUSPENDED" = 'yes' ]; then
                 SUSPENDED_CRON=$((SUSPENDED_CRON + 1))

+ 9 - 9
func/db.sh

@@ -1,7 +1,7 @@
 # MySQL
 mysql_connect() {
     host_str=$(grep "HOST='$1'" $HESTIA/conf/mysql.conf)
-    eval $host_str
+    parse_object_kv_list "$host_str"
     if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
         echo "Error: mysql config parsing failed"
         log_event "$E_PARSING" "$ARGUMENTS"
@@ -71,7 +71,7 @@ mysql_dump() {
 # PostgreSQL
 psql_connect() {
     host_str=$(grep "HOST='$1'" $HESTIA/conf/pgsql.conf)
-    eval $host_str
+    parse_object_kv_list "$host_str"
     export PGPASSWORD="$PASSWORD"
     if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
         echo "Error: postgresql config parsing failed"
@@ -124,7 +124,7 @@ get_next_dbhost() {
         if [ 0 -lt "$check_row" ]; then
             if [ 1 -eq "$check_row" ]; then
                 for db in $host_str; do
-                    eval $db
+                    parse_object_kv_list "$db"
                     if [ "$MAX_DB" -gt "$U_DB_BASES" ]; then
                         host=$HOST
                     fi
@@ -132,7 +132,7 @@ get_next_dbhost() {
             else
                 old_weight='100'
                 for db in $host_str; do
-                    eval $db
+                    parse_object_kv_list "$db"
                     let weight="$U_DB_BASES * 100 / $MAX_DB" >/dev/null 2>&1
                     if [ "$old_weight" -gt "$weight" ]; then
                         host="$HOST"
@@ -147,7 +147,7 @@ get_next_dbhost() {
 # Database charset validation
 is_charset_valid() {
     host_str=$(grep "HOST='$host'" $HESTIA/conf/$type.conf)
-    eval $host_str
+    parse_object_kv_list "$host_str"
 
     if [ -z "$(echo $CHARSETS | grep -wi $charset )" ]; then
         echo "Error: charset $charset not exist"
@@ -159,7 +159,7 @@ is_charset_valid() {
 # Increase database host value
 increase_dbhost_values() {
     host_str=$(grep "HOST='$host'" $HESTIA/conf/$type.conf)
-    eval $host_str
+    parse_object_kv_list "$host_str"
 
     old_dbbases="U_DB_BASES='$U_DB_BASES'"
     new_dbbases="U_DB_BASES='$((U_DB_BASES + 1))'"
@@ -182,7 +182,7 @@ increase_dbhost_values() {
 # Decrease database host value
 decrease_dbhost_values() {
     host_str=$(grep "HOST='$HOST'" $HESTIA/conf/$TYPE.conf)
-    eval $host_str
+    parse_object_kv_list "$host_str"
 
     old_dbbases="U_DB_BASES='$U_DB_BASES'"
     new_dbbases="U_DB_BASES='$((U_DB_BASES - 1))'"
@@ -261,7 +261,7 @@ is_dbhost_new() {
 
 # Get database values
 get_database_values() {
-    eval $(grep "DB='$database'" $USER_DATA/db.conf)
+    parse_object_kv_list $(grep "DB='$database'" $USER_DATA/db.conf)
 }
 
 # Change MySQL database password
@@ -364,7 +364,7 @@ dump_pgsql_database() {
 # Check if database server is in use
 is_dbhost_free() {
     host_str=$(grep "HOST='$host'" $HESTIA/conf/$type.conf)
-    eval $host_str
+    parse_object_kv_list "$host_str"
     if [ 0 -ne "$U_DB_BASES" ]; then
         echo "Error: host $HOST is used"
         log_event "$E_INUSE" "$ARGUMENTS"

+ 3 - 3
func/domain.sh

@@ -432,7 +432,7 @@ is_dns_domain_new() {
 # Update domain zone
 update_domain_zone() {
     domain_param=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)
-    eval $domain_param
+    parse_object_kv_list "$domain_param"
     SOA=$(idn --quiet -a -t "$SOA")
     if [ -z "$SERIAL" ]; then
         SERIAL=$(date +'%Y%m%d01')
@@ -513,7 +513,7 @@ sort_dns_records() {
 # Check if this is a last record
 is_dns_record_critical() {
     str=$(grep "ID='$id'" $USER_DATA/dns/$domain.conf)
-    eval $str
+    parse_object_kv_list "$str"
     if [ "$TYPE" = 'A' ] || [ "$TYPE" = 'NS' ]; then
         records=$(grep "TYPE='$TYPE'" $USER_DATA/dns/$domain.conf| wc -l)
         if [ $records -le 1 ]; then
@@ -825,5 +825,5 @@ is_domain_new() {
 
 # Get domain variables
 get_domain_values() {
-    eval $(grep "DOMAIN='$domain'" $USER_DATA/$1.conf)
+    parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/$1.conf)
 }

+ 6 - 6
func/main.sh

@@ -302,7 +302,7 @@ is_object_unsuspended() {
 # Check if object value is empty
 is_object_value_empty() {
     str=$(grep "$2='$3'" $USER_DATA/$1.conf)
-    eval $str
+    parse_object_kv_list "$str"
     eval value=$4
     if [ ! -z "$value" ] && [ "$value" != 'no' ]; then
         check_result $E_EXISTS "${4//$}=$value is already exists"
@@ -312,7 +312,7 @@ is_object_value_empty() {
 # Check if object value is empty
 is_object_value_exist() {
     str=$(grep "$2='$3'" $USER_DATA/$1.conf)
-    eval $str
+    parse_object_kv_list "$str"
     eval value=$4
     if [ -z "$value" ] || [ "$value" = 'no' ]; then
         check_result $E_NOTEXIST "${4//$}=$value doesn't exist"
@@ -347,7 +347,7 @@ is_dir_symlink() {
 # Get object value
 get_object_value() {
     object=$(grep "$2='$3'" $USER_DATA/$1.conf)
-    eval "$object"
+    parse_object_kv_list "$object"
     eval echo $4
 }
 
@@ -356,7 +356,7 @@ update_object_value() {
     row=$(grep -nF "$2='$3'" $USER_DATA/$1.conf)
     lnr=$(echo $row | cut -f 1 -d ':')
     object=$(echo $row | sed "s/^$lnr://")
-    eval "$object"
+    parse_object_kv_list "$object"
     eval old="$4"
     old=$(echo "$old" | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g' -e 's/\//\\\//g')
     new=$(echo "$5" | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g' -e 's/\//\\\//g')
@@ -380,7 +380,7 @@ search_objects() {
     OLD_IFS="$IFS"
     IFS=$'\n'
     for line in $(grep $2=\'$3\' $USER_DATA/$1.conf); do
-        eval $line
+        parse_object_kv_list "$line"
         eval echo \$$4
     done
     IFS="$OLD_IFS"
@@ -553,7 +553,7 @@ sync_cron_jobs() {
         echo 'CONTENT_TYPE="text/plain; charset=utf-8"' >> $crontab
     fi
     while read line; do
-        eval $line
+        parse_object_kv_list "$line"
         if [ "$SUSPENDED" = 'no' ]; then
             echo "$MIN $HOUR $DAY $MONTH $WDAY $CMD" |\
                 sed -e "s/%quote%/'/g" -e "s/%dots%/:/g" \

+ 4 - 4
func/rebuild.sh

@@ -513,7 +513,7 @@ rebuild_mail_domain_conf() {
         (( ++accs))
         object=$(grep "ACCOUNT='$account'" $USER_DATA/mail/$domain.conf)
         FWD_ONLY='no'
-        eval "$object"
+        parse_object_kv_list "$object"
         if [ "$SUSPENDED" = 'yes' ]; then
             MD5='SUSPENDED'
         fi
@@ -627,7 +627,7 @@ rebuild_mysql_database() {
 rebuild_pgsql_database() {
 
     host_str=$(grep "HOST='$HOST'" $HESTIA/conf/pgsql.conf)
-    eval $host_str
+    parse_object_kv_list "$host_str"
     export PGPASSWORD="$PASSWORD"
     if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
         echo "Error: postgresql config parsing failed"
@@ -676,7 +676,7 @@ rebuild_pgsql_database() {
 import_mysql_database() {
 
     host_str=$(grep "HOST='$HOST'" $HESTIA/conf/mysql.conf)
-    eval $host_str
+    parse_object_kv_list "$host_str"
     if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
         echo "Error: mysql config parsing failed"
         log_event "$E_PARSING" "$ARGUMENTS"
@@ -691,7 +691,7 @@ import_mysql_database() {
 import_pgsql_database() {
 
     host_str=$(grep "HOST='$HOST'" $HESTIA/conf/pgsql.conf)
-    eval $host_str
+    parse_object_kv_list "$host_str"
     export PGPASSWORD="$PASSWORD"
     if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
         echo "Error: postgresql config parsing failed"

+ 1 - 1
func/remote.sh

@@ -94,7 +94,7 @@ remote_dns_health_check() {
 
     # Starting health-check
     for str in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
-        eval $str
+        parse_object_kv_list "$str"
 
         # Checking host connection
         cluster_cmd v-list-user $DNS_USER