From cdda6b98d785f103d9be6643a99a882c0d65b64c Mon Sep 17 00:00:00 2001
From: fantu <fantu@ispconfig3>
Date: Sun, 21 Dec 2008 04:51:07 -0500
Subject: [PATCH] fix parse error

---
 interface/lib/classes/tform.inc.php |  518 +++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 358 insertions(+), 160 deletions(-)

diff --git a/interface/lib/classes/tform.inc.php b/interface/lib/classes/tform.inc.php
index 0336e11..1f80db2 100644
--- a/interface/lib/classes/tform.inc.php
+++ b/interface/lib/classes/tform.inc.php
@@ -1,7 +1,7 @@
 <?php
 
 /*
-Copyright (c) 2005, Till Brehm, projektfarm Gmbh
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification,
@@ -31,43 +31,37 @@
 /**
 * Formularbehandlung
 *
-* Funktionen zur Umwandlung von Formulardaten
-* sowie zum vorbereiten von HTML und SQL
-* Ausgaben
+* Functions to validate, display and save form values
 *
-*        Tabellendefinition
+*        Database table field definitions
 *
-*        Datentypen:
-*        - INTEGER (Wandelt Ausdr�cke in Int um)
+*        Datatypes:
+*        - INTEGER (Converts data to int automatically)
 *        - DOUBLE
-*        - CURRENCY (Formatiert Zahlen nach W�hrungsnotation)
-*        - VARCHAR (kein weiterer Format Check)
-*        - DATE (Datumsformat, Timestamp Umwandlung)
+*        - CURRENCY (Formats digits in currency notation)
+*        - VARCHAR (No format check)
+*        - DATE (Date format, converts from and to linux timestamps automatically)
 *
 *        Formtype:
-*        - TEXT (normales Textfeld)
-*        - PASSWORD (Feldinhalt wird nicht angezeigt)
-*        - SELECT (Gibt Werte als option Feld aus)
-*        - MULTIPLE (Select-Feld mit nehreren Werten)
+*        - TEXT (Normal text field)
+*        - PASSWORD (password field, the content will not be displayed again to the user)
+*        - SELECT (Option fiield)
+*        - MULTIPLE (Allows selection of multiple values)
 *
 *        VALUE:
-*        - Wert oder Array
+*        - Value or array
 *
 *        SEPARATOR
-*        - Trennzeichen f�r multiple Felder
+*        - separator char used for fileds with multiple values
 *
-*        Hinweis:
-*        Das ID-Feld ist nicht bei den Table Values einzuf�gen.
+*        Hint: The auto increment (ID) filed of the table has not be be definied eoarately.
 *
-* @package form
-* @author Till Brehm
-* @version 1.1
 */
 
 class tform {
 
         /**
-        * Definition der Tabelle (array)
+        * Table definition (array)
         * @var tableDef
         */
         var $tableDef;
@@ -79,40 +73,40 @@
         var $action;
 
         /**
-        * Tabellenname (String)
+        * Table name (String)
         * @var table_name
         */
         var $table_name;
 
         /**
-        * Debug Variable
+        * Enable debigging
         * @var debug
         */
         var $debug = 0;
 
         /**
-        * name des primary Field der Tabelle (string)
+        * name of the primary field of the datbase table (string)
         * @var table_index
         */
         var $table_index;
 
         /**
-        * enth�lt die Fehlermeldung bei �berpr�fung
-        * der Variablen mit Regex
+        * contains the error message
         * @var errorMessage
         */
         var $errorMessage = '';
 
         var $dateformat = "d.m.Y";
-    var $formDef;
+    	var $formDef;
         var $wordbook;
         var $module;
         var $primary_id;
+		var $diffrec = array();
 
         /**
-        * Laden der Tabellendefinition
+        * Loading of the table definition
         *
-        * @param file: Pfad zur Tabellendefinition
+        * @param file: path to the form definition file
         * @return true
         */
         /*
@@ -134,10 +128,19 @@
                 $this->formDef = $form;
 
                 $this->module = $module;
+				$wb = array();
+				
+				$lng_file = ISPC_WEB_PATH.'/lang/lib/lang/'.$_SESSION['s']['language'].'_tform.lng';
+				if(!file_exists($lng_file)) $lng_file = ISPC_WEB_PATH.'/lang/lib/lang/en'.'_tform.lng';
+				include($lng_file);
                 if($module == '') {
-                        include_once("lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng");
+					$lng_file = "lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng";
+					if(!file_exists($lng_file)) $lng_file = "lib/lang/en_".$this->formDef["name"].".lng";
+					include($lng_file);
                 } else {
-                        include_once("../$module/lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng");
+					$lng_file = "../$module/lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng";
+					if(!file_exists($lng_file)) $lng_file = "../$module/lib/lang/en_".$this->formDef["name"].".lng";
+					include($lng_file);
                 }
                 $this->wordbook = $wb;
 
@@ -146,16 +149,16 @@
 
 
         /**
-        * Konvertiert die Daten des �bergebenen assoziativen
-        * Arrays in "menschenlesbare" Form.
-        * Datentyp Konvertierung, z.B. f�r Ausgabe in Listen.
+        * Converts the data in the array to human readable format
+        * Datatype conversion e.g. to show the data in lists
         *
         * @param record
         * @return record
         */
         function decode($record,$tab) {
-                if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab).");
-                if(is_array($record)) {
+                if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab does not exist or the tab is empty (TAB: $tab).");
+                $new_record = '';
+				if(is_array($record)) {
                         foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) {
                                 switch ($field['datatype']) {
                                 case 'VARCHAR':
@@ -190,6 +193,7 @@
                         }
 
                 }
+				
         return $new_record;
         }
 
@@ -215,7 +219,11 @@
                         $querystring = str_replace("{GROUPID}",$_SESSION["s"]["user"]["default_group"],$querystring);
                         $querystring = str_replace("{GROUPS}",$_SESSION["s"]["user"]["groups"],$querystring);
                         $table_idx = $this->formDef['db_table_idx'];
-                        $querystring = str_replace("{RECORDID}",$record[$table_idx],$querystring);
+						
+						$tmp_recordid = (isset($record[$table_idx]))?$record[$table_idx]:0;
+                        $querystring = str_replace("{RECORDID}",$tmp_recordid,$querystring);
+						unset($tmp_recordid);
+						
                         $querystring = str_replace("{AUTHSQL}",$this->getAuthSQL('r'),$querystring);
 
                         // Getting the records
@@ -239,7 +247,7 @@
                                 $app->uses($datasource_class);
                                 $values = $app->$datasource_class->$datasource_function($field, $record);
                         } else {
-                                $this->errorMessage .= "Custom datasource class or function is empty<br>\r\n";
+                                $this->errorMessage .= "Custom datasource class or function is empty<br />\r\n";
                         }
                 }
 
@@ -249,7 +257,7 @@
 
 
         /**
-        * Record f�r Ausgabe in Formularen vorbereiten.
+        * Prepare the data record to show the data in a form.
         *
         * @param record = Datensatz als Array
         * @param action = NEW oder EDIT
@@ -261,8 +269,8 @@
 
                 $this->action = $action;
 
-                if(!is_array($this->formDef)) $app->error("Keine Formdefinition vorhanden.");
-                if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab).");
+                if(!is_array($this->formDef)) $app->error("No form definition found.");
+                if(!is_array($this->formDef['tabs'][$tab])) $app->error("The tab is empty or does not exist (TAB: $tab).");
 
                 $new_record = array();
                 if($action == 'EDIT') {
@@ -272,14 +280,14 @@
                                         $val = $record[$key];
 
                                         // If Datasource is set, get the data from there
-                                        if(is_array($field['datasource'])) {
+                                        if(isset($field['datasource']) && is_array($field['datasource'])) {
                                                 $field["value"] = $this->getDatasourceData($field, $record);
                                         }
 
                                         switch ($field['formtype']) {
                                         case 'SELECT':
+												$out = '';
                                                 if(is_array($field['value'])) {
-                                                        $out = '';
                                                         foreach($field['value'] as $k => $v) {
                                                                 $selected = ($k == $val)?' SELECTED':'';
                                                                 $out .= "<option value='$k'$selected>$v</option>\r\n";
@@ -290,10 +298,10 @@
                                         case 'MULTIPLE':
                                                 if(is_array($field['value'])) {
 
-                                                        // aufsplitten ergebnisse
+                                                        // Split
                                                         $vals = explode($field['separator'],$val);
 
-                                                        // HTML schreiben
+                                                        // write HTML
                                                         $out = '';
                                                         foreach($field['value'] as $k => $v) {
 
@@ -313,8 +321,8 @@
                                         break;
 
                                         case 'CHECKBOX':
-                                                $checked = (empty($val))?'':' CHECKED';
-                                                $new_record[$key] = "<input name=\"".$key."\" type=\"checkbox\" value=\"".$field['value']."\" $checked>\r\n";
+                                                $checked = ($val == $field['value'][1])?' CHECKED':'';
+                                                $new_record[$key] = "<input name=\"".$key."\" type=\"checkbox\" value=\"".$field['value'][1]."\" $checked>\r\n";
                                         break;
 
                                         case 'CHECKBOXARRAY':
@@ -331,8 +339,10 @@
                                                                 foreach($vals as $tvl) {
                                                                         if(trim($tvl) == trim($k)) $checked = ' CHECKED';
                                                                 }
-
-                                                                $out .= "<input name=\"".$key."[]\" type=\"checkbox\" value=\"$k\" $checked>$v <br />\r\n";
+                                                                $out .= "<span class=\"wf_oneChoice\">\r\n
+                                                                <input type=\"checkbox\" value=\"$k\" id=\"".$key."[]\" name=\"".$key."[]\" $checked>\r\n
+                                                                <label for=\"".$key."[]\" id=\"".$key."[]-L\" class=\"wf_postField\">$v</label>\r\n
+                                                                </span><br />\r\n";
                                                         }
                                                 }
                                                 $new_record[$key] = $out;
@@ -345,7 +355,10 @@
                                                         $out = '';
                                                         foreach($field['value'] as $k => $v) {
                                                                 $checked = ($k == $val)?' CHECKED':'';
-                                                                $out .= "<input name='".$key."[]' type='radio' value='$k'$checked> $v<br>\r\n";
+                                                                $out .= "<span class=\"wf_oneChoice\">\r\n
+                                                                <input type=\"radio\" value=\"$k\" id=\"".$key."[]\" name=\"".$key."[]\" $checked>\r\n
+                                                                <label for=\"".$key."[]\" id=\"".$key."[]-L\" class=\"wf_postField\">$v</label>\r\n
+                                                                </span><br />\r\n";
                                                         }
                                                 }
                                                 $new_record[$key] = $out;
@@ -361,7 +374,7 @@
                         foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) {
 
                                 // If Datasource is set, get the data from there
-                                if(is_array($field['datasource'])) {
+                                if(@is_array($field['datasource'])) {
                                         $field["value"] = $this->getDatasourceData($field, $record);
                                 }
 
@@ -370,11 +383,12 @@
                                         if(is_array($field['value'])) {
                                                 $out = '';
                                                 foreach($field['value'] as $k => $v) {
-                                                        $selected = ($k == $val)?' SELECTED':'';
-                                                        $out .= "<option value='$k'$selected>$v</option>\r\n";
+                                                    //$selected = ($k == $val)?' SELECTED':'';
+													$selected = '';
+                                                    $out .= "<option value='$k'$selected>$v</option>\r\n";
                                                 }
                                         }
-                                        $new_record[$key] = $out;
+                                        if(isset($out)) $new_record[$key] = $out;
                                 break;
                                 case 'MULTIPLE':
                                                 if(is_array($field['value'])) {
@@ -397,8 +411,9 @@
                                 break;
 
                                 case 'CHECKBOX':
-                                        $checked = (empty($field["default"]))?'':' CHECKED';
-                                        $new_record[$key] = "<input name=\"".$key."\" type=\"checkbox\" value=\"".$field['value']."\" $checked>\r\n";
+                                        // $checked = (empty($field["default"]))?'':' CHECKED';
+										                    $checked = ($field["default"] == $field['value'][1])?' CHECKED':'';
+                                        $new_record[$key] = "<input name=\"".$key."\" type=\"checkbox\" value=\"".$field['value'][1]."\" $checked>\r\n";
                                 break;
 
                                 case 'CHECKBOXARRAY':
@@ -415,8 +430,10 @@
                                                         foreach($vals as $tvl) {
                                                                 if(trim($tvl) == trim($k)) $checked = ' CHECKED';
                                                         }
-
-                                                        $out .= "<input name=\"".$key."[]\" type=\"checkbox\" value=\"$k\" $checked> $v<br />\r\n";
+                                                        $out .= "<span class=\"wf_oneChoice\">\r\n
+                                                        <input type=\"checkbox\" value=\"$k\" id=\"".$key."[]\" name=\"".$key."[]\" $checked>\r\n
+                                                        <label for=\"".$key."[]\" id=\"".$key."[]-L\" class=\"wf_postField\">$v</label>\r\n
+                                                        </span><br />\r\n";
                                                 }
                                         }
                                         $new_record[$key] = $out;
@@ -429,7 +446,10 @@
                                                 $out = '';
                                                 foreach($field['value'] as $k => $v) {
                                                         $checked = ($k == $field["default"])?' CHECKED':'';
-                                                        $out .= "<input name='".$key."[]' type='radio' value='$k'$checked> $v<br>\r\n";
+                                                        $out .= "<span class=\"wf_oneChoice\">\r\n
+                                                        <input type=\"radio\" value=\"$k\" id=\"".$key."[]\" name=\"".$key."[]\" $checked>\r\n
+                                                        <label for=\"".$key."[]\" id=\"".$key."[]-L\" class=\"wf_postField\">$v</label>\r\n
+                                                        </span><br />\r\n";
                                                 }
                                         }
                                         $new_record[$key] = $out;
@@ -448,33 +468,34 @@
         }
 
         /**
-        * Record in "maschinen lesbares" Format �berf�hren
-        * und Werte gegen regul�re Ausdr�cke pr�fen.
+        * Rewrite the record data to be stored in the database
+        * and check values with regular expressions.
         *
         * @param record = Datensatz als Array
         * @return record
         */
         function encode($record,$tab) {
-
-                if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab ist leer oder existiert nicht (TAB: $tab).");
+			global $app;
+			
+                if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab is empty or does not exist (TAB: $tab).");
                 //$this->errorMessage = '';
 
                 if(is_array($record)) {
                         foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) {
 
-                                if(is_array($field['validators'])) $this->validateField($key, $record[$key], $field['validators']);
+                                if(isset($field['validators']) && is_array($field['validators'])) $this->validateField($key, (isset($record[$key]))?$record[$key]:'', $field['validators']);
 
                                 switch ($field['datatype']) {
                                 case 'VARCHAR':
-                                        if(!is_array($record[$key])) {
-                                                $new_record[$key] = addslashes($record[$key]);
+                                        if(!@is_array($record[$key])) {
+                                                $new_record[$key] = (isset($record[$key]))?$app->db->quote($record[$key]):'';
                                         } else {
                                                 $new_record[$key] = implode($field['separator'],$record[$key]);
                                         }
                                 break;
                                 case 'TEXT':
                                         if(!is_array($record[$key])) {
-                                                $new_record[$key] = addslashes($record[$key]);
+                                                $new_record[$key] = $app->db->quote($record[$key]);
                                         } else {
                                                 $new_record[$key] = implode($field['separator'],$record[$key]);
                                         }
@@ -483,15 +504,17 @@
                                         if($record[$key] > 0) {
                                                 list($tag,$monat,$jahr) = explode('.',$record[$key]);
                                                 $new_record[$key] = mktime(0,0,0,$monat,$tag,$jahr);
-                                        }
+                                        } else {
+											$new_record[$key] = 0;
+										}
                                 break;
                                 case 'INTEGER':
-                                        $new_record[$key] = intval($record[$key]);
+                                        $new_record[$key] = (isset($record[$key]))?$record[$key]:0;
                                         //if($new_record[$key] != $record[$key]) $new_record[$key] = $field['default'];
                                         //if($key == 'refresh') die($record[$key]);
                                 break;
                                 case 'DOUBLE':
-                                        $new_record[$key] = addslashes($record[$key]);
+                                        $new_record[$key] = $app->db->quote($record[$key]);
                                 break;
                                 case 'CURRENCY':
                                         $new_record[$key] = str_replace(",",".",$record[$key]);
@@ -499,12 +522,12 @@
                                 }
 
                                 // The use of the field value is deprecated, use validators instead
-                                if($field['regex'] != '') {
+                                if(isset($field['regex']) && $field['regex'] != '') {
                                         // Enable that "." matches also newlines
                                         $field['regex'] .= 's';
                                         if(!preg_match($field['regex'], $record[$key])) {
                                                 $errmsg = $field['errmsg'];
-                                                $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n";
+                                                $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
                                         }
                                 }
 
@@ -526,7 +549,9 @@
         function validateField($field_name, $field_value, $validators) {
 
                 global $app;
-
+				
+				$escape = '`';
+				
                 // loop trough the validators
                 foreach($validators as $validator) {
 
@@ -535,7 +560,11 @@
                                         $validator['regex'] .= 's';
                                         if(!preg_match($validator['regex'], $field_value)) {
                                                 $errmsg = $validator['errmsg'];
-                                                $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n";
+                                                if(isset($this->wordbook[$errmsg])) {
+                                                	$this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
+												} else {
+													$this->errorMessage .= $errmsg."<br />\r\n";
+												}
                                         }
                                 break;
                                 case 'UNIQUE':
@@ -543,39 +572,81 @@
                                                 $num_rec = $app->db->queryOneRecord("SELECT count(*) as number FROM ".$escape.$this->formDef['db_table'].$escape. " WHERE $field_name = '".$app->db->quote($field_value)."'");
                                                 if($num_rec["number"] > 0) {
                                                         $errmsg = $validator['errmsg'];
-                                                        $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n";
+														if(isset($this->wordbook[$errmsg])) {
+                                                        	$this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
+														} else {
+															$this->errorMessage .= $errmsg."<br />\r\n";
+														}
                                                 }
                                         } else {
                                                 $num_rec = $app->db->queryOneRecord("SELECT count(*) as number FROM ".$escape.$this->formDef['db_table'].$escape. " WHERE $field_name = '".$app->db->quote($field_value)."' AND ".$this->formDef['db_table_idx']." != ".$this->primary_id);
                                                 if($num_rec["number"] > 0) {
                                                         $errmsg = $validator['errmsg'];
-                                                        $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n";
+                                                        if(isset($this->wordbook[$errmsg])) {
+                                                        	$this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
+														} else {
+															$this->errorMessage .= $errmsg."<br />\r\n";
+														}
                                                 }
                                         }
                                 break;
                                 case 'NOTEMPTY':
                                         if(empty($field_value)) {
                                                 $errmsg = $validator['errmsg'];
-                                                $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n";
+                                                if(isset($this->wordbook[$errmsg])) {
+                                                    $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
+												} else {
+													$this->errorMessage .= $errmsg."<br />\r\n";
+												}
                                         }
                                 break;
                                 case 'ISEMAIL':
                                         if(!preg_match("/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,10}$/i", $field_value)) {
                                                 $errmsg = $validator['errmsg'];
-                                                $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n";
+                                                if(isset($this->wordbook[$errmsg])) {
+                                                    $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
+												} else {
+													$this->errorMessage .= $errmsg."<br />\r\n";
+												}
                                         }
                                 break;
                                 case 'ISINT':
                                         $tmpval = intval($field_value);
                                         if($tmpval === 0 and !empty($field_value)) {
                                                 $errmsg = $validator['errmsg'];
-                                                $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n";
+                                                if(isset($this->wordbook[$errmsg])) {
+                                                    $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
+												} else {
+													$this->errorMessage .= $errmsg."<br />\r\n";
+												}
                                         }
                                 break;
                                 case 'ISPOSITIVE':
                                         if(!is_numeric($field_value) || $field_value <= 0){
                                           $errmsg = $validator['errmsg'];
-                                          $this->errorMessage .= $this->wordbook[$errmsg]."<br>\r\n";
+                                          if(isset($this->wordbook[$errmsg])) {
+                                             $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
+										  } else {
+											 $this->errorMessage .= $errmsg."<br />\r\n";
+										  }
+                                        }
+                                break;
+								case 'ISIPV4':
+								$vip=1;
+								if(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $field_value)){
+								$groups=explode(".",$field_value);
+								foreach($groups as $group){
+									if($group<0 OR $group>255)
+									$vip=0;
+								}
+								}else{$vip=0;}
+                                        if($vip==0) {
+                                                $errmsg = $validator['errmsg'];
+                                                if(isset($this->wordbook[$errmsg])) {
+                                                    $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
+												} else {
+													$this->errorMessage .= $errmsg."<br />\r\n";
+												}
                                         }
                                 break;
                                 case 'CUSTOM':
@@ -584,11 +655,14 @@
                                                 $validator_class = $validator['class'];
                                                 $validator_function = $validator['function'];
                                                 $app->uses($validator_class);
-                                                $this->errorMessage .= $app->$validator_class->$validator_function($validator);
+                                                $this->errorMessage .= $app->$validator_class->$validator_function($field_name, $field_value, $validator);
                                         } else {
-                                                $this->errorMessage .= "Custom validator class or function is empty<br>\r\n";
+                                                $this->errorMessage .= "Custom validator class or function is empty<br />\r\n";
                                         }
                                 break;
+								default:
+									$this->errorMessage .= "Unknown Validator: ".$validator['type'];
+								break;
                         }
 
 
@@ -598,7 +672,7 @@
         }
 
         /**
-        * SQL Statement f�r Record erzeugen.
+        * Create the SQL staement.
         *
         * @param record = Datensatz als Array
         * @param action = INSERT oder UPDATE
@@ -613,11 +687,11 @@
                 if(count($this->formDef['tabs'][$tab]['fields']) == 0) return '';
 
                 // checking permissions
-                if($this->formDef['auth'] == 'yes') {
+                if($this->formDef['auth'] == 'yes' && $_SESSION["s"]["user"]["typ"] != 'admin') {
                         if($action == "INSERT") {
-                                if(!$this->checkPerm($primary_id,'i')) $this->errorMessage .= "Insert denied.<br>\r\n";
+                                if(!$this->checkPerm($primary_id,'i')) $this->errorMessage .= "Insert denied.<br />\r\n";
                         } else {
-                                if(!$this->checkPerm($primary_id,'u')) $this->errorMessage .= "Insert denied.<br>\r\n";
+                                if(!$this->checkPerm($primary_id,'u')) $this->errorMessage .= "Update denied.<br />\r\n";
                         }
                 }
 
@@ -642,31 +716,78 @@
                                                 if($field['formtype'] == 'PASSWORD') {
                                                         $sql_insert_key .= "`$key`, ";
                                                         if($field['encryption'] == 'CRYPT') {
-                                                                $sql_insert_val .= "'".crypt($record[$key])."', ";
+                                                                $salt="$1$";
+																for ($n=0;$n<11;$n++) {
+																	$salt.=chr(mt_rand(64,126));
+																}
+																$salt.="$";
+																// $salt = substr(md5(time()),0,2);
+																$record[$key] = crypt($record[$key],$salt);
+																$sql_insert_val .= "'".$app->db->quote($record[$key])."', ";
+														} elseif ($field['encryption'] == 'MYSQL') {
+																$sql_insert_val .= "PASSWORD('".$app->db->quote($record[$key])."'), ";
+														} elseif ($field['encryption'] == 'CLEARTEXT') {
+																$sql_insert_val .= "'".$app->db->quote($record[$key])."', ";
                                                         } else {
-                                                                $sql_insert_val .= "md5('".$record[$key]."'), ";
+                                                                $record[$key] = md5($record[$key]);
+																$sql_insert_val .= "'".$app->db->quote($record[$key])."', ";
                                                         }
+														
+                                                } elseif ($field['formtype'] == 'CHECKBOX') {
+                                                        $sql_insert_key .= "`$key`, ";
+														if($record[$key] == '') {
+															// if a checkbox is not set, we set it to the unchecked value
+															$sql_insert_val .= "'".$field['value'][0]."', ";
+															$record[$key] = $field['value'][0];
+														} else {
+															$sql_insert_val .= "'".$record[$key]."', ";
+														}
                                                 } else {
                                                         $sql_insert_key .= "`$key`, ";
                                                         $sql_insert_val .= "'".$record[$key]."', ";
                                                 }
                                         } else {
                                                 if($field['formtype'] == 'PASSWORD') {
-                                                        if($field['encryption'] == 'CRYPT') {
-                                                                $sql_update .= "`$key` = '".crypt($record[$key])."', ";
+														if(isset($field['encryption']) && $field['encryption'] == 'CRYPT') {
+                                                                $salt="$1$";
+																for ($n=0;$n<11;$n++) {
+																	$salt.=chr(mt_rand(64,126));
+																}
+																$salt.="$";
+																// $salt = substr(md5(time()),0,2);
+																$record[$key] = crypt($record[$key],$salt);
+																$sql_update .= "`$key` = '".$app->db->quote($record[$key])."', ";
+														} elseif (isset($field['encryption']) && $field['encryption'] == 'MYSQL') {
+																$sql_update .= "`$key` = PASSWORD('".$app->db->quote($record[$key])."'), ";
+														} elseif (isset($field['encryption']) && $field['encryption'] == 'CLEARTEXT') {
+																$sql_update .= "`$key` = '".$app->db->quote($record[$key])."', ";
                                                         } else {
-                                                                $sql_update .= "`$key` = md5('".$record[$key]."'), ";
+                                                                $record[$key] = md5($record[$key]);
+																$sql_update .= "`$key` = '".$app->db->quote($record[$key])."', ";
                                                         }
+                                                        
+                                                } elseif ($field['formtype'] == 'CHECKBOX') {
+														if($record[$key] == '') {
+															// if a checkbox is not set, we set it to the unchecked value
+															$sql_update .= "`$key` = '".$field['value'][0]."', ";
+															$record[$key] = $field['value'][0];
+														} else {
+															$sql_update .= "`$key` = '".$record[$key]."', ";
+														}
                                                 } else {
                                                         $sql_update .= "`$key` = '".$record[$key]."', ";
                                                 }
                                         }
-                                }
+                                } else {
+									// we unset the password filed, if empty to tell the datalog function 
+									// that the password has not been changed
+								    unset($record[$key]);
+								}
                         }
         }
 
 
-                // F�ge Backticks nur bei unvollst�ndigen Tabellennamen ein
+                // Add backticks for incomplete table names
                 if(stristr($this->formDef['db_table'],'.')) {
                         $escape = '';
                 } else {
@@ -676,7 +797,7 @@
 
                 if($action == "INSERT") {
                         if($this->formDef['auth'] == 'yes') {
-                                // Setze User und Gruppe
+                                // Set user and group
                                 $sql_insert_key .= "`sys_userid`, ";
                                 $sql_insert_val .= ($this->formDef["auth_preset"]["userid"] > 0)?"'".$this->formDef["auth_preset"]["userid"]."', ":"'".$_SESSION["s"]["user"]["userid"]."', ";
                                 $sql_insert_key .= "`sys_groupid`, ";
@@ -692,18 +813,25 @@
                         $sql_insert_val = substr($sql_insert_val,0,-2);
                         $sql = "INSERT INTO ".$escape.$this->formDef['db_table'].$escape." ($sql_insert_key) VALUES ($sql_insert_val)";
                 } else {
+					if($this->formDef['auth'] == 'yes') {
                         if($primary_id != 0) {
+                                $sql_update = substr($sql_update,0,-2);
+                                $sql = "UPDATE ".$escape.$this->formDef['db_table'].$escape." SET ".$sql_update." WHERE ".$this->getAuthSQL('u')." AND ".$this->formDef['db_table_idx']." = ".$primary_id;
+                                if($sql_ext_where != '') $sql .= " and ".$sql_ext_where;
+                        } else {
+                                $app->error("Primary ID fehlt!");
+                        }
+					} else {
+						if($primary_id != 0) {
                                 $sql_update = substr($sql_update,0,-2);
                                 $sql = "UPDATE ".$escape.$this->formDef['db_table'].$escape." SET ".$sql_update." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id;
                                 if($sql_ext_where != '') $sql .= " and ".$sql_ext_where;
                         } else {
                                 $app->error("Primary ID fehlt!");
                         }
+					}
                 }
-
-                // Daten in History tabelle speichern
-                if($this->errorMessage == '' and $this->formDef['db_history'] == 'yes') $this->datalogSave($action,$primary_id,$record);
-
+                
                 return $sql;
         }
 
@@ -728,30 +856,33 @@
 
                 $active_tab = $this->getNextTab();
 
-        // definiere Tabs
+        // go trough the tabs
         foreach( $this->formDef["tabs"] as $key => $tab) {
 
-                        $tab['name'] = $key;
+            $tab['name'] = $key;
             if($tab['name'] == $active_tab) {
 
-                                // Wenn Modul gesetzt, dann setzte template pfad relativ zu modul.
-                                if($this->module != '') $tab["template"] = "../".$this->module."/".$tab["template"];
+                // If module is set, then set the template path relative to the module..
+                if($this->module != '') $tab["template"] = "../".$this->module."/".$tab["template"];
 
-                                // �berpr�fe, ob das Template existiert, wenn nicht
-                                // dann generiere das Template
-                                if(!is_file($tab["template"])) {
-                                        $app->uses('tform_tpl_generator');
-                                        $app->tform_tpl_generator->buildHTML($this->formDef,$tab['name']);
-                                }
+                // Generate the template if it does not exist yet.
+				
+				// Translate the title of the tab
+				$tab['title'] = $this->lng($tab['title']);
+								
+                if(!is_file($tab["template"])) {
+                     $app->uses('tform_tpl_generator');
+                     $app->tform_tpl_generator->buildHTML($this->formDef,$tab['name']);
+                }
 
-                    $app->tpl->setInclude('content_tpl',$tab["template"]);
+                $app->tpl->setInclude('content_tpl',$tab["template"]);
                 $tab["active"] = 1;
                 $_SESSION["s"]["form"]["tab"] = $tab['name'];
             } else {
                     $tab["active"] = 0;
             }
 
-                        // Die Datenfelder werden f�r die Tabs nicht ben�tigt
+                        // Unset unused variables.
                         unset($tab["fields"]);
                         unset($tab["plugins"]);
 
@@ -766,61 +897,103 @@
                 $app->tpl->setVar('form_active_tab',$active_tab);
 
                 // Set form title
-                $form_hint = '<b>'.$this->formDef["title"].'</b>';
-                if($this->formDef["description"] != '') $form_hint .= '<br><br>'.$this->formDef["description"];
+                $form_hint = $this->lng($this->formDef["title"]);
+                if($this->formDef["description"] != '') $form_hint .= '<div class="pageForm_description">'.$this->lng($this->formDef["description"]).'</div>';
                 $app->tpl->setVar('form_hint',$form_hint);
 
                 // Set Wordbook for this form
 
                 $app->tpl->setVar($this->wordbook);
-    }
+    	}
 
+		function getDataRecord($primary_id) {
+			global $app;
+			$escape = '`';
+			$sql = "SELECT * FROM ".$escape.$this->formDef['db_table'].$escape." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id;
+            return $app->db->queryOneRecord($sql);
+		}
+		
 
-
-        function datalogSave($action,$primary_id,$record_new) {
+        function datalogSave($action,$primary_id, $record_old, $record_new) {
                 global $app,$conf;
 
-                // F�ge Backticks nur bei unvollst�ndigen Tabellennamen ein
+                // Add backticks for incomplete table names.
                 if(stristr($this->formDef['db_table'],'.')) {
                         $escape = '';
                 } else {
                         $escape = '`';
                 }
 
-                if($action == "UPDATE") {
-                        $sql = "SELECT * FROM ".$escape.$this->formDef['db_table'].$escape." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id;
-                        $record_old = $app->db->queryOneRecord($sql);
-                } else {
-                        $record_old = array();
-                }
-
-                $diffrec = array();
-
-                if(is_array($record_new)) {
+                $this->diffrec = array();
+				/*
+                if(is_array($record_new) && count($record_new) > 0) {
                         foreach($record_new as $key => $val) {
-                                if($record_old[$key] != $val) {
-                                        // Datensatz hat sich ge�ndert
-                                        $diffrec[$key] = array('old' => $record_old[$key],
-                                                                           'new' => $val);
+                                if(@$record_old[$key] != $val) {
+										// Record has changed
+                                        $diffrec[$key] = array('old' => @$record_old[$key],
+                                                               'new' => $val);
+                                }
+                        }
+                } elseif(is_array($record_old)) {
+                        foreach($record_old as $key => $val) {
+                                if($record_new[$key] != $val) {
+										// Record has changed
+                                        $diffrec[$key] = array('new' => $record_new[$key],
+                                                               'old' => $val);
                                 }
                         }
                 }
+				$this->diffrec = $diffrec;
+				*/
 				
-				// Insert the server_id, if the record has a server_id
-				$server_id = ($record_old["server_id"] > 0)?$record_old["server_id"]:0;
+				// Full diff records for ISPConfig, they have a different format then the simple diffrec
+				$diffrec_full = array();
 
-                if(count($diffrec) > 0) {
-                        
-						// We need the full records in ISPConfig, not only the diffs
-						$diffrec = array(	'old' => $record_old,
-											'new' => $record_new);
-						
-						$diffstr = $app->db->quote(serialize($diffrec));
+                if(is_array($record_old) && count($record_old) > 0) {
+                        foreach($record_old as $key => $val) {
+                                //if(isset($record_new[$key]) && $record_new[$key] != $val) {
+								if(!isset($record_new[$key]) || $record_new[$key] != $val) {
+                                    // Record has changed
+									$diffrec_full['old'][$key] = $val;
+									$diffrec_full['new'][$key] = $record_new[$key];
+									$this->diffrec[$key] = array(	'new' => $record_new[$key],
+                                                               		'old' => $val);
+                                } else {
+									$diffrec_full['old'][$key] = $val;
+									$diffrec_full['new'][$key] = $val;
+								}
+                        }
+                } elseif(is_array($record_new)) {
+                        foreach($record_new as $key => $val) {
+                                if(isset($record_new[$key]) && $record_old[$key] != $val) {
+                                    // Record has changed
+									$diffrec_full['new'][$key] = $val;
+									$diffrec_full['old'][$key] = $record_old[$key];
+									$this->diffrec[$key] = array(	'old' => @$record_old[$key],
+                                                               		'new' => $val);
+                                } else {
+									$diffrec_full['new'][$key] = $val;
+									$diffrec_full['old'][$key] = $val;
+								}
+                        }
+                }
+				
+				//$this->diffrec = $diffrec;
+				// Insert the server_id, if the record has a server_id
+				$server_id = (isset($record_old["server_id"]) && $record_old["server_id"] > 0)?$record_old["server_id"]:0;
+				if(isset($record_new["server_id"])) $server_id = $record_new["server_id"];
+
+                if(count($this->diffrec) > 0) {
+						$diffstr = addslashes(serialize($diffrec_full));
                         $username = $app->db->quote($_SESSION["s"]["user"]["username"]);
                         $dbidx = $this->formDef['db_table_idx'].":".$primary_id;
-                        $action = ($action == 'INSERT')?'i':'u';
+                        // $action = ($action == 'INSERT')?'i':'u';
+						
+						if($action == 'INSERT') $action = 'i';
+						if($action == 'UPDATE') $action = 'u';
+						if($action == 'DELETE') $action = 'd';
                         $sql = "INSERT INTO sys_datalog (dbtable,dbidx,server_id,action,tstamp,user,data) VALUES ('".$this->formDef['db_table']."','$dbidx','$server_id','$action','".time()."','$username','$diffstr')";
-                        $app->db->query($sql);
+						$app->db->query($sql);
                 }
 
                 return true;
@@ -828,25 +1001,29 @@
         }
 
         function getAuthSQL($perm) {
+				if($_SESSION["s"]["user"]["typ"] == 'admin') {
+					return '1';
+				} else {
+                	$groups = ( $_SESSION["s"]["user"]["groups"] ) ? $_SESSION["s"]["user"]["groups"] : 0;
+					$sql = '(';
+                	$sql .= "(sys_userid = ".$_SESSION["s"]["user"]["userid"]." AND sys_perm_user like '%$perm%') OR  ";
+                	$sql .= "(sys_groupid IN (".$groups.") AND sys_perm_group like '%$perm%') OR ";
+                	$sql .= "sys_perm_other like '%$perm%'";
+                	$sql .= ')';
 
-                $sql = '(';
-                $sql .= "(sys_userid = ".$_SESSION["s"]["user"]["userid"]." AND sys_perm_user like '%$perm%') OR  ";
-                $sql .= "(sys_groupid IN (".$_SESSION["s"]["user"]["groups"].") AND sys_perm_group like '%$perm%') OR ";
-                $sql .= "sys_perm_other like '%$perm%'";
-                $sql .= ')';
-
-                return $sql;
+                	return $sql;
+				}
         }
 
         /*
-        Diese funktion �berpr�ft, ob ein User die Berechtigung $perm f�r den Datensatz mit der ID $record_id
-        hat. It record_id = 0, dann wird gegen die user Defaults des Formulares getestet.
+        This function checks if a user has the parmissions $perm for the data record with the ID $record_id
+        If record_id = 0, the the permissions are tested against the defaults of the form file.
         */
         function checkPerm($record_id,$perm) {
                 global $app;
 
                 if($record_id > 0) {
-                        // F�ge Backticks nur bei unvollst�ndigen Tabellennamen ein
+                        // Add backticks for incomplete table names.
                         if(stristr($this->formDef['db_table'],'.')) {
                                 $escape = '';
                         } else {
@@ -861,8 +1038,8 @@
                         }
                 } else {
                         $result = false;
-                        if($this->formDef["auth_preset"]["userid"] == $_SESSION["s"]["user"]["userid"] && stristr($perm,$this->formDef["auth_preset"]["perm_user"])) $result = true;
-                        if($this->formDef["auth_preset"]["groupid"] == $_SESSION["s"]["user"]["groupid"] && stristr($perm,$this->formDef["auth_preset"]["perm_group"])) $result = true;
+                        if(@$this->formDef["auth_preset"]["userid"] == $_SESSION["s"]["user"]["userid"] && stristr($perm,$this->formDef["auth_preset"]["perm_user"])) $result = true;
+                        if(@$this->formDef["auth_preset"]["groupid"] == $_SESSION["s"]["user"]["groupid"] && stristr($perm,$this->formDef["auth_preset"]["perm_group"])) $result = true;
                         if(@stristr($this->formDef["auth_preset"]["perm_other"],$perm)) $result = true;
 
                         // if preset == 0, everyone can insert a record of this type
@@ -875,18 +1052,18 @@
         }
 
         function getNextTab() {
-                // Welcher Tab wird angezeigt
+                // Which tab is shown
                 if($this->errorMessage == '') {
-                    // wenn kein Fehler vorliegt
-                        if($_REQUEST["next_tab"] != '') {
-                                // wenn n�chster Tab bekannt
+                    // If there is no error
+                    if(isset($_REQUEST["next_tab"]) && $_REQUEST["next_tab"] != '') {
+                                // If the next tab is known
                                 $active_tab = $_REQUEST["next_tab"];
                     } else {
-                        // ansonsten ersten tab nehmen
+                        // else use the default tab
                         $active_tab = $this->formDef['tab_default'];
                     }
                 } else {
-                    // bei Fehlern den gleichen Tab nochmal anzeigen
+                    // Show the same tab again in case of an error
                     $active_tab = $_SESSION["s"]["form"]["tab"];
                 }
 
@@ -896,6 +1073,27 @@
         function getCurrentTab() {
                 return $_SESSION["s"]["form"]["tab"];
         }
+		
+		function isReadonlyTab($tab) {
+			if(isset($this->formDef['tabs'][$tab]['readonly']) && $this->formDef['tabs'][$tab]['readonly'] == true) {
+				return true;
+			} else {
+				return false;
+			}
+        }
+		
+		
+		// translation function for forms, tries the form wordbook first and if this fails, it tries the global wordbook
+		function lng($msg) {
+			global $app;
+			
+			if(isset($this->wordbook[$msg])) {
+				return $this->wordbook[$msg];
+			} else {
+				return $app->lng($msg);
+			}
+			
+		}
 
 }
 

--
Gitblit v1.9.1