Falko Timme
2013-10-22 391e05cbee6ff84bce60b665be60b4e5f049ee7f
interface/lib/classes/tform.inc.php
@@ -54,14 +54,14 @@
*        SEPARATOR
*        - separator char used for fileds with multiple values
*
*        Hint: The auto increment (ID) filed of the table has not be be definied eoarately.
*        Hint: The auto increment (ID) filed of the table has not be be definied separately.
*
*/
class tform {
        /**
        * Table definition (array)
        * Definition of the database table (array)
        * @var tableDef
        */
        var $tableDef;
@@ -79,25 +79,25 @@
        var $table_name;
        /**
        * Enable debigging
        * Debug Variable
        * @var debug
        */
        var $debug = 0;
        /**
        * name of the primary field of the datbase table (string)
        * name of the primary field of the database table (string)
        * @var table_index
        */
        var $table_index;
        /**
        * contains the error message
        * contains the error messages
        * @var errorMessage
        */
        var $errorMessage = '';
        var $dateformat = "d.m.Y";
       var $formDef;
       var $formDef = array();
        var $wordbook;
        var $module;
        var $primary_id;
@@ -124,7 +124,7 @@
    function loadFormDef($file,$module = '') {
                global $app,$conf;
                include_once($file);
                include($file);
                $this->formDef = $form;
                $this->module = $module;
@@ -169,7 +169,7 @@
            if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab does not exist or the tab is empty (TAB: $tab).");
                $new_record = '';
            $table_idx = $this->formDef['db_table_idx'];
            if(isset($record[$table_idx])) $new_record[$table_idx] = intval($record[$table_idx ]);
            if(isset($record[$table_idx])) $new_record[$table_idx] = $app->functions->intval($record[$table_idx ]);
            
            if(is_array($record)) {
                  foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) {
@@ -202,7 +202,7 @@
                                break;
                                case 'INTEGER':
                                        $new_record[$key] = intval($record[$key]);
                                        $new_record[$key] = $app->functions->intval($record[$key]);
                                break;
                                case 'DOUBLE':
@@ -224,7 +224,7 @@
        }
        /**
        * Get the key => value array of a form filed from a datasource definitiom
        * Get the key => value array of a form filled from a datasource definitiom
        *
        * @param field = array with field definition
        * @param record = Dataset as array
@@ -247,11 +247,11 @@
                        $table_idx = $this->formDef['db_table_idx'];
                  
                  $tmp_recordid = (isset($record[$table_idx]))?$record[$table_idx]:0;
                  //$tmp_recordid = intval($this->primary_id);
                        $querystring = str_replace("{RECORDID}",$tmp_recordid,$querystring);
                  unset($tmp_recordid);
                  
                        $querystring = str_replace("{AUTHSQL}",$this->getAuthSQL('r'),$querystring);
                  $querystring = preg_replace_callback('@{AUTHSQL::(.+?)}@', "self::table_auth_sql", $querystring);
                  
                        // Getting the records
                        $tmp_records = $app->db->queryAllRecords($querystring);
@@ -277,10 +277,25 @@
                                $this->errorMessage .= "Custom datasource class or function is empty<br />\r\n";
                        }
                }
                if(isset($field['filters']) && is_array($field['filters'])) {
                    $new_values = array();
                    foreach($values as $index => $value) {
                        $new_index = $this->filterField($index, $index, $field['filters'], 'SHOW');
                        $new_values[$new_index] = $this->filterField($index, (isset($values[$index]))?$values[$index]:'', $field['filters'], 'SHOW');
                    }
                    $values = $new_values;
                    unset($new_values);
                    unset($new_index);
                }
                return $values;
        }
      function table_auth_sql($matches){
         return $this->getAuthSQL('r', $matches[1]);
      }
      
      //* If the parameter 'valuelimit' is set
      function applyValueLimit($limit,$values) {
@@ -400,7 +415,7 @@
                                                                $selected = ($k == $val)?' SELECTED':'';
                                                if(!empty($this->wordbook[$v]))
                                                   $v = $this->wordbook[$v];
                                                                $out .= "<option value='$k'$selected>$v</option>\r\n";
                                                                $out .= "<option value='$k'$selected>".$this->lng($v)."</option>\r\n";
                                                        }
                                                }
                                                $new_record[$key] = $out;
@@ -543,7 +558,8 @@
                                        break;
                                case 'PASSWORD':
                                        $new_record[$key] = '';
                                        //$new_record[$key] = '';
                              $new_record[$key] = htmlspecialchars($field['default']);
                                break;
                                case 'CHECKBOX':
@@ -630,7 +646,6 @@
                                if(isset($field['filters']) && is_array($field['filters'])) {
                           $record[$key] = $this->filterField($key, (isset($record[$key]))?$record[$key]:'', $field['filters'], 'SAVE');
                        }
                        //* Validate record value
                        if(isset($field['validators']) && is_array($field['validators'])) {
                           $this->validateField($key, (isset($record[$key]))?$record[$key]:'', $field['validators']);
@@ -678,7 +693,7 @@
                              }
                                break;
                                case 'INTEGER':
                                        $new_record[$key] = (isset($record[$key]))?$record[$key]:0;
                              $new_record[$key] = (isset($record[$key]))?$app->functions->intval($record[$key]):0;
                                        //if($new_record[$key] != $record[$key]) $new_record[$key] = $field['default'];
                                        //if($key == 'refresh') die($record[$key]);
                                break;
@@ -739,24 +754,16 @@
            if($filter['event'] == $filter_event) {
               switch ($filter['type']) {
                  case 'TOLOWER':
                     $returnval = strtolower($field_value);
                     $returnval = strtolower($returnval);
                  break;
                  case 'TOUPPER':
                     $returnval = strtoupper($field_value);
                     $returnval = strtoupper($returnval);
                  break;
                  case 'IDNTOASCII':
                     if(function_exists('idn_to_ascii')) {
                        $returnval = idn_to_ascii($field_value);
                     } else {
                        $returnval = $field_value;
                     }
                     $returnval = $app->functions->idn_encode($returnval);
                  break;
                  case 'IDNTOUTF8':
                     if(function_exists('idn_to_utf8')) {
                        $returnval = idn_to_utf8($field_value);
                     } else {
                        $returnval = $field_value;
                     }
                     $returnval = $app->functions->idn_decode($returnval);
                  break;
                  default:
                     $this->errorMessage .= "Unknown Filter: ".$filter['type'];
@@ -764,8 +771,7 @@
               }
            }
         }
         return $returnval;
            return $returnval;
        }
        /**
@@ -799,7 +805,9 @@
                                        }
                                break;
                                case 'UNIQUE':
                                        if($this->action == 'NEW') {
                              if($validator['allowempty'] != 'y') $validator['allowempty'] = 'n';
                              if($validator['allowempty'] == 'n' || ($validator['allowempty'] == 'y' && $field_value != '')){
                                 if($this->action == 'NEW') {
                                                $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'];
@@ -809,7 +817,7 @@
                                             $this->errorMessage .= $errmsg."<br />\r\n";
                                          }
                                                }
                                        } else {
                                 } 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'];
@@ -819,7 +827,8 @@
                                             $this->errorMessage .= $errmsg."<br />\r\n";
                                          }
                                                }
                                        }
                                 }
                              }
                                break;
                                case 'NOTEMPTY':
                                        if(empty($field_value)) {
@@ -853,7 +862,7 @@
                           }
                                break;
                                case 'ISINT':
                           if(function_exists('filter_var')) {
                           if(function_exists('filter_var') && $field_value < 2147483647) {
                              if($field_value != '' && filter_var($field_value, FILTER_VALIDATE_INT) === false) {
                                 $errmsg = $validator['errmsg'];
                                 if(isset($this->wordbook[$errmsg])) {
@@ -863,7 +872,7 @@
                                 }
                                        }
                           } else {
                                        $tmpval = intval($field_value);
                                        $tmpval = $app->functions->intval($field_value);
                                        if($tmpval === 0 and !empty($field_value)) {
                                                $errmsg = $validator['errmsg'];
                                                if(isset($this->wordbook[$errmsg])) {
@@ -884,6 +893,39 @@
                                }
                                        }
                                break;
            /*
            case 'ISV6PREFIX':
               $v6_prefix_ok = 0;
               $explode_field_value = explode(':',$field_value);
               if ($explode_field_value[count($explode_field_value)-1]=='' && $explode_field_value[count($explode_field_value)-2]=='' ){
                       if ( count($explode_field_value) <= 9 ) {
                               if(filter_var(substr($field_value,0,strlen($field_value)-2),FILTER_VALIDATE_IP,FILTER_FLAG_IPV6) or filter_var(substr($field_value,0,strlen($field_value)-2).'::0',FILTER_VALIDATE_IP,FILTER_FLAG_IPV6) or filter_var(substr($field_value,0,strlen($field_value)-2).':0',FILTER_VALIDATE_IP,FILTER_FLAG_IPV6) ) {
                                       $v6_prefix_ok = 1;
                               }
                       }
               } else {
                  $v6_prefix_ok = 2;
               }
               // check subnet against defined server-ipv6
               $sql_v6 = $app->db->queryOneRecord("SELECT ip_address FROM server_ip WHERE ip_type = 'IPv6' AND virtualhost = 'y' LIMIT 0,1");
               $sql_v6_explode=explode(':',$sql_v6['ip_address']);
               if ( count($sql_v6_explode) < count($explode_field_value) && isset($sql_v6['ip_address']) )  {
                  $v6_prefix_ok = 3;
               }
               if($v6_prefix_ok == 0) {
                  $errmsg = $validator['errmsg'];
               }
               if($v6_prefix_ok == 2) {
                  $errmsg = 'IPv6 Prefix must end with ::';
               }
               if($v6_prefix_ok == 3) {
                  $errmsg = 'IPv6 Prefix too long (according to Server IP Addresses)';
               }
               if($v6_prefix_ok <> 1){
                  $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)){
@@ -903,31 +945,45 @@
                              }
                                break;
                        case 'ISIP':
                        //* Check if its a IPv4 or IPv6 address
                        if(function_exists('filter_var')) {
                           if(!filter_var($field_value,FILTER_VALIDATE_IP)) {
                              $errmsg = $validator['errmsg'];
                              if(isset($this->wordbook[$errmsg])) {
                                 $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
                              } else {
                                 $this->errorMessage .= $errmsg."<br />\r\n";
                              }
                           }
                        if($validator['allowempty'] != 'y') $validator['allowempty'] = 'n';
                        if($validator['allowempty'] == 'y' && $field_value == '') {
                           //* Do nothing
                        } else {
                           //* Check content with regex, if we use php < 5.2
                           $ip_ok = 0;
                           if(preg_match("/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i", $field_value)){
                              $ip_ok = 1;
                        //* Check if its a IPv4 or IPv6 address
                           if(isset($validator['separator']) && $validator['separator'] != '') {
                              //* When the field may contain several IP addresses, split them by the char defined as separator
                              $field_value_array = explode($validator['separator'],$field_value);
                           } else {
                              $field_value_array[] = $field_value;
                           }
                           if(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $field_value)){
                              $ip_ok = 1;
                           }
                           if($ip_ok == 0) {
                              $errmsg = $validator['errmsg'];
                              if(isset($this->wordbook[$errmsg])) {
                                 $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
                           foreach($field_value_array as $field_value) {
                              $field_value = trim($field_value);
                              if(function_exists('filter_var')) {
                                 if(!filter_var($field_value,FILTER_VALIDATE_IP)) {
                                    $errmsg = $validator['errmsg'];
                                    if(isset($this->wordbook[$errmsg])) {
                                       $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
                                    } else {
                                       $this->errorMessage .= $errmsg."<br />\r\n";
                                    }
                                 }
                              } else {
                                 $this->errorMessage .= $errmsg."<br />\r\n";
                                 //* Check content with regex, if we use php < 5.2
                                 $ip_ok = 0;
                                 if(preg_match("/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i", $field_value)){
                                    $ip_ok = 1;
                                 }
                                 if(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $field_value)){
                                    $ip_ok = 1;
                                 }
                                 if($ip_ok == 0) {
                                    $errmsg = $validator['errmsg'];
                                    if(isset($this->wordbook[$errmsg])) {
                                       $this->errorMessage .= $this->wordbook[$errmsg]."<br />\r\n";
                                    } else {
                                       $this->errorMessage .= $errmsg."<br />\r\n";
                                    }
                                 }
                              }
                           }
                        }
@@ -976,7 +1032,7 @@
        }
        /**
        * Create the SQL staement.
        * Create SQL statement
        *
        * @param record = Datensatz als Array
        * @param action = INSERT oder UPDATE
@@ -1023,7 +1079,9 @@
                                                $record[$key] = $app->auth->crypt_password(stripslashes($record[$key]));
                                                $sql_insert_val .= "'".$app->db->quote($record[$key])."', ";
                                          } elseif ($field['encryption'] == 'MYSQL') {
                                                $sql_insert_val .= "PASSWORD('".$app->db->quote($record[$key])."'), ";
                                                $tmp = $app->db->queryOneRecord("SELECT PASSWORD('".$app->db->quote(stripslashes($record[$key]))."') as `crypted`");
                                                $record[$key] = $tmp['crypted'];
                                                $sql_insert_val .= "'".$app->db->quote($record[$key])."', ";
                                          } elseif ($field['encryption'] == 'CLEARTEXT') {
                                                $sql_insert_val .= "'".$app->db->quote($record[$key])."', ";
                                                        } else {
@@ -1050,7 +1108,9 @@
                                                                $record[$key] = $app->auth->crypt_password(stripslashes($record[$key]));
                                                $sql_update .= "`$key` = '".$app->db->quote($record[$key])."', ";
                                          } elseif (isset($field['encryption']) && $field['encryption'] == 'MYSQL') {
                                                $sql_update .= "`$key` = PASSWORD('".$app->db->quote($record[$key])."'), ";
                                                $tmp = $app->db->queryOneRecord("SELECT PASSWORD('".$app->db->quote(stripslashes($record[$key]))."') as `crypted`");
                                                $record[$key] = $tmp['crypted'];
                                                $sql_update .= "`$key` = '".$app->db->quote($record[$key])."', ";
                                          } elseif (isset($field['encryption']) && $field['encryption'] == 'CLEARTEXT') {
                                                $sql_update .= "`$key` = '".$app->db->quote($record[$key])."', ";
                                                        } else {
@@ -1205,7 +1265,7 @@
      function getDataRecord($primary_id) {
         global $app;
         $escape = '`';
         $sql = "SELECT * FROM ".$escape.$this->formDef['db_table'].$escape." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id;
         $sql = "SELECT * FROM ".$escape.$this->formDef['db_table'].$escape." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id." AND ".$this->getAuthSQL('r',$this->formDef['db_table']);
            return $app->db->queryOneRecord($sql);
      }
      
@@ -1215,70 +1275,6 @@
            
            $app->db->datalogSave($this->formDef['db_table'], $action, $this->formDef['db_table_idx'], $primary_id, $record_old, $record_new);
            return true;
            /*
                // Add backticks for incomplete table names.
                if(stristr($this->formDef['db_table'],'.')) {
                        $escape = '';
                } else {
                        $escape = '`';
                }
                $this->diffrec = array();
            // Full diff records for ISPConfig, they have a different format then the simple diffrec
            $diffrec_full = array();
                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';
                  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);
                }
                return true;
            */
        }
        function getAuthSQL($perm, $table = '') {