tbrehm
2008-08-01 1e45da277b6e28ff65967d38c12b298872efb059
interface/lib/classes/tform.inc.php
@@ -104,10 +104,11 @@
        var $errorMessage = '';
        var $dateformat = "d.m.Y";
    var $formDef;
       var $formDef;
        var $wordbook;
        var $module;
        var $primary_id;
      var $diffrec = array();
        /**
        * Laden der Tabellendefinition
@@ -134,10 +135,16 @@
                $this->formDef = $form;
                $this->module = $module;
            $wb = array();
                if($module == '') {
               if(is_file("lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng")) {
                        include_once("lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng");
               }
                } else {
               if(is_file("../$module/lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng")) {
                        include_once("../$module/lib/lang/".$_SESSION["s"]["language"]."_".$this->formDef["name"].".lng");
               }
                }
                $this->wordbook = $wb;
@@ -155,7 +162,8 @@
        */
        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)) {
                $new_record = '';
            if(is_array($record)) {
                        foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) {
                                switch ($field['datatype']) {
                                case 'VARCHAR':
@@ -190,6 +198,7 @@
                        }
                }
        return $new_record;
        }
@@ -215,7 +224,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
@@ -272,14 +285,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";
@@ -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'])) {
@@ -463,12 +477,12 @@
                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]))?addslashes($record[$key]):'';
                                        } else {
                                                $new_record[$key] = implode($field['separator'],$record[$key]);
                                        }
@@ -489,7 +503,7 @@
                              }
                                break;
                                case 'INTEGER':
                                        $new_record[$key] = intval($record[$key]);
                                        $new_record[$key] = (isset($record[$key]))?intval($record[$key]):0;
                                        //if($new_record[$key] != $record[$key]) $new_record[$key] = $field['default'];
                                        //if($key == 'refresh') die($record[$key]);
                                break;
@@ -502,7 +516,7 @@
                                }
                                // 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])) {
@@ -530,6 +544,8 @@
                global $app;
            
            $escape = '`';
                // loop trough the validators
                foreach($validators as $validator) {
@@ -538,7 +554,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':
@@ -611,7 +631,7 @@
                                                $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";
                                        }
@@ -643,11 +663,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";
                        } 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";
                        }
                }
@@ -672,14 +692,23 @@
                                                if($field['formtype'] == 'PASSWORD') {
                                                        $sql_insert_key .= "`$key`, ";
                                                        if($field['encryption'] == 'CRYPT') {
                                                                $sql_insert_val .= "encrypt('".$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);
                                                        } else {
                                                                $sql_insert_val .= "md5('".$record[$key]."'), ";
                                                                $record[$key] = md5($record[$key]);
                                                        }
                                          $sql_insert_val .= "'".addslashes($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]."', ";
                                          }
@@ -689,14 +718,23 @@
                                                }
                                        } else {
                                                if($field['formtype'] == 'PASSWORD') {
                                                        if($field['encryption'] == 'CRYPT') {
                                                                $sql_update .= "`$key` = encrypt('".$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);
                                                        } else {
                                                                $sql_update .= "`$key` = md5('".$record[$key]."'), ";
                                                                $record[$key] = md5($record[$key]);
                                                        }
                                                        $sql_update .= "`$key` = '".addslashes($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]."', ";
                                          }
@@ -704,7 +742,11 @@
                                                        $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]);
                        }
                        }
        }
@@ -737,15 +779,13 @@
                } 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;
                                $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!");
                        }
                }
                // Daten in History tabelle speichern
                if($this->errorMessage == '' and $this->formDef['db_history'] == 'yes') $this->datalogSave($action,$primary_id,$record);
                return $sql;
        }
@@ -773,20 +813,24 @@
        // definiere 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"];
                // Wenn Modul gesetzt, dann setzte template pfad relativ zu modul.
                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']);
                                }
                // überprüfe, ob das Template existiert, wenn nicht
                // dann generiere das Template
            // 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 {
@@ -808,18 +852,24 @@
                $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 = '<b>'.$this->lng($this->formDef["title"]).'</b>';
                if($this->formDef["description"] != '') $form_hint .= '<br><br>'.$this->lng($this->formDef["description"]);
                $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
@@ -829,38 +879,69 @@
                        $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)) {
                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;
            // 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];
                                } 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];
                                } else {
                           $diffrec_full['new'][$key] = $val;
                           $diffrec_full['old'][$key] = $val;
                        }
                        }
                }
            
            // Insert the server_id, if the record has a server_id
            $server_id = ($record_old["server_id"] > 0)?$record_old["server_id"]:0;
            $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($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(count($this->diffrec) > 0) {
                  $diffstr = $app->db->quote(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);
                }
@@ -870,14 +951,18 @@
        }
        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;
            }
        }
        /*
@@ -903,8 +988,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
@@ -920,7 +1005,7 @@
                // Welcher Tab wird angezeigt
                if($this->errorMessage == '') {
                    // wenn kein Fehler vorliegt
                        if($_REQUEST["next_tab"] != '') {
                    if(isset($_REQUEST["next_tab"]) && $_REQUEST["next_tab"] != '') {
                                // wenn nächster Tab bekannt
                                $active_tab = $_REQUEST["next_tab"];
                    } else {
@@ -938,6 +1023,19 @@
        function getCurrentTab() {
                return $_SESSION["s"]["form"]["tab"];
        }
      // 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);
         }
      }
}