X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Ffai%2Fclass_faiScript.inc;h=b7e122058979700046a0fcd98573d80916ba0316;hb=6cb5be59b017449b99265b7ab8dead4eeab15b19;hp=197fdc44bcdf142da2ed98c2937918f4f35ca660;hpb=7a507f102e522d1b09c9f244af2ce7f2fb764579;p=gosa.git diff --git a/plugins/admin/fai/class_faiScript.inc b/plugins/admin/fai/class_faiScript.inc index 197fdc44b..b7e122058 100644 --- a/plugins/admin/fai/class_faiScript.inc +++ b/plugins/admin/fai/class_faiScript.inc @@ -16,6 +16,17 @@ class faiScript extends plugin /* ObjectClasses for this Object*/ var $objectclasses = array("top","FAIclass","FAIscript"); + /* Class name of the Ldap ObjectClass for the Sub Object */ + var $subClass = "FAIscriptEntry"; + var $subClasses = array("top","FAIclass","FAIscriptEntry"); + + /* Class name of the php class which allows us to edit a Sub Object */ + var $subClassName = "faiScriptEntry"; + + /* Attributes to initialise for each subObject */ + var $subAttributes = array("cn","description","FAIpriority","FAIscript"); + var $sub64coded = array(); + /* Specific attributes */ var $cn = ""; // The class name for this object var $description = ""; // The description for this set of partitions @@ -23,40 +34,90 @@ class faiScript extends plugin var $dialog = NULL; // a dialog, e.g. new disk dialog var $SubObjects = array(); // All leafobjects of this object - /* new dn*/ - var $use_dn =""; - function faiScript ($config, $dn= NULL) { /* Load Attributes */ plugin::plugin ($config, $dn); + + /* If "dn==new" we try to create a new entry + * Else we must read all objects from ldap which belong to this entry. + * First read SubObjects from ldap ... and then the partition definitions for the SubObjects. + */ + if($dn != "new"){ + $this->dn =$dn; + + /* Read all leaf objects of this object (For FAIscript this would be FAIscriptEntry) + */ + $ldap = $this->config->get_ldap_link(); + $ldap->cd ($this->dn); + $ldap->search("(&(objectClass=FAIclass)(objectClass=".$this->subClass."))",$this->subAttributes); + + while($object = $ldap->fetch()){ + /* Set status for save management */ + + foreach($this->subAttributes as $attrs){ + if(!isset($object[$attrs][0])){ + $this->SubObjects[$object['cn'][0]][$attrs]=""; + }else{ + $this->SubObjects[$object['cn'][0]][$attrs]=$object[$attrs][0]; + } + } + + foreach($this->sub64coded as $codeIt){ + $this->SubObjects[$object['cn'][0]][$codeIt]=(base64_decode($this->SubObjects[$object['cn'][0]][$codeIt])); + } + + foreach($this->subAttributes as $attrs){ + $this->SubObjects[$object['cn'][0]][$attrs]=addslashes($this->SubObjects[$object['cn'][0]][$attrs]); + } + + $this->SubObjects[$object['cn'][0]]['FAIscript'] = addslashes ($this->readBinary("FAIscript",$object['dn'])); + + $this->SubObjects[$object['cn'][0]]['status'] = "edited"; + $this->SubObjects[$object['cn'][0]]['dn'] = $object['dn']; + } + } } function execute() { + /* Call parent execute */ + plugin::execute(); + /* Fill templating stuff */ $smarty= get_smarty(); $display= ""; /* Add new sub object */ if(isset($_POST['AddSubObject'])){ - $this->dialog= new faiScriptEntry($this->config,"new"); - $this->dialog->parent = &$this; + $this->dialog= new $this->subClassName($this->config,"new"); $this->is_dialog=true; } + if($this->dn != "new"){ + $_SESSION['objectinfo']= $this->dn; + } + + /* Edit selected Sub Object */ if((isset($_POST['EditSubObject']))&&(isset($_POST['SubObject']))){ - $this->dialog= new faiScriptEntry($this->config,$this->SubObjects[$_POST['SubObject']]['dn']); - $this->dialog->parent = &$this; + $script = $_POST['SubObject'][0]; + + $this->dialog= new $this->subClassName($this->config,$this->dn,$this->SubObjects[$script]); + $_SESSION['objectinfo'] = $this->SubObjects[$script]['dn']; $this->is_dialog=true; } /* Remove Sub object */ if((isset($_POST['DelSubObject']))&&(isset($_POST['SubObject']))){ - $tmp = new faiScriptEntry($this->config,$this->SubObjects[$_POST['SubObject']]['dn']); - $tmp->remove_from_parent(); - unset($tmp); + + foreach($_POST['SubObject'] as $script){ + if($this->SubObjects[$script]['status'] == "edited"){ + $this->SubObjects[$script]['status']= "delete"; + }else{ + unset($this->SubObjects[$script]); + } + } } /* Save Dialog */ @@ -68,14 +129,36 @@ class faiScript extends plugin print_red($msg); } }else{ - $this->dialog->save_object(); - $this->dialog->save(); + $obj = $this->dialog->save(); + if(isset($obj['remove'])){ + if($this->SubObjects[$obj['remove']['from']]['status']=="edited"){ + $this->SubObjects[$obj['remove']['from']]['status'] = "delete"; + }elseif($this->SubObjects[$obj['remove']['from']]['status']=="new"){ + unset($this->SubObjects[$obj['remove']['from']]); + } + $obj['status'] = "new"; + $this->SubObjects[$obj['remove']['to']] = $obj; + unset($this->SubObjects[$obj['remove']['to']]['remove']); + }else{ + $this->SubObjects[$obj['cn']]=$obj; + } $this->is_dialog=false; unset($this->dialog); $this->dialog=NULL; } } + /* Sort entries */ + $tmp = $keys = array(); + foreach($this->SubObjects as $key => $entry){ + $keys[$key]=$key; + } + natcasesort($keys); + foreach($keys as $key){ + $tmp[$key]=$this->SubObjects[$key]; + } + $this->SubObjects = $tmp; + /* Cancel Dialog */ if(isset($_POST['CancelSubObject'])){ $this->is_dialog=false; @@ -90,9 +173,8 @@ class faiScript extends plugin return($display); } - $buffer = $this->getList(); - $smarty->assign("SubObjects",$buffer); - $smarty->assign("SubObjectKeys",array_flip($buffer)); + $smarty->assign("SubObjects",$this->getList()); + $smarty->assign("SubObjectKeys",array_flip($this->getList())); /* Magic quotes GPC, escapes every ' " \, to solve some security risks * If we post the escaped strings they will be escaped again @@ -112,25 +194,14 @@ class faiScript extends plugin /* Generate listbox friendly SubObject list */ function getList(){ - $a_return = array(); - $this->SubObjects = array(); - - $ldap = $this->config->get_ldap_link(); - $ldap->cd ($this->config->current['BASE']); - $ldap->cd ($this->dn); - - $ldap->search("(objectClass=FAIscriptEntry)",array("cn")); - - while($entry = $ldap->fetch()){ - $tmp = array(); - $tmp['cn'] = $entry['cn'][0]; - $tmp['dn']=$entry['dn']; - $this->SubObjects[$tmp['cn']] = $tmp; - - if(isset($entry['description'][0])){ - $a_return[$tmp['cn']] = $tmp['cn']." [".$entry['description'][0]."]"; - }else{ - $a_return[$tmp['cn']] = $tmp['cn']; + $a_return=array(); + foreach($this->SubObjects as $obj){ + if($obj['status'] != "delete"){ + if((isset($obj['description']))&&(!empty($obj['description']))){ + $a_return[$obj['cn']]= $obj['cn']." [".$obj['description']."]"; + }else{ + $a_return[$obj['cn']]= $obj['cn']; + } } } return($a_return); @@ -143,7 +214,6 @@ class faiScript extends plugin $ldap = $this->config->get_ldap_link(); $ldap->cd ($this->dn); $ldap->rmdir_recursive($this->dn); - show_ldap_error($ldap->get_error()); $this->handle_post_events("remove"); } @@ -152,7 +222,7 @@ class faiScript extends plugin */ function save_object() { - if(isset($_POST['FAIscript_submit'])){ + if(isset($_POST['FAIscript_posted'])){ plugin::save_object(); foreach($this->attributes as $attrs){ if(isset($_POST[$attrs])){ @@ -175,12 +245,9 @@ class faiScript extends plugin function save() { plugin::save(); - - if($this->dn == "new"){ - $this->dn = $this->use_dn; - } $ldap = $this->config->get_ldap_link(); + $ldap->cat($this->dn); if($ldap->count()!=0){ /* Write FAIscript to ldap*/ @@ -194,7 +261,114 @@ class faiScript extends plugin $ldap->add($this->attrs); } show_ldap_error($ldap->get_error()); + + /* Prepare FAIscriptEntry to write it to ldap + * First sort array. + * Because we must delete old entries first. + * After deletion, we perform add and modify + */ + $Objects = array(); + foreach($this->SubObjects as $name => $obj){ + if($obj['status'] == "delete"){ + $Objects[$name] = $obj; + } + } + foreach($this->SubObjects as $name => $obj){ + if($obj['status'] != "delete"){ + $Objects[$name] = $obj; + } + } + + foreach($Objects as $name => $obj){ + + foreach($this->sub64coded as $codeIt){ + $obj[$codeIt]=base64_encode(stripslashes($obj[$codeIt])); + } + + $tmp = array(); + foreach($this->subAttributes as $attrs){ + if(empty($obj[$attrs])){ + $obj[$attrs] = array(); + } + if(!is_array($obj[$attrs])){ + $tmp[$attrs] = stripslashes($obj[$attrs]); + }else{ + $tmp[$attrs] = $obj[$attrs]; + } + } + + $tmp['objectClass'] = $this->subClasses; + + $sub_dn = "cn=".$obj['cn'].",".$this->dn; + + if($obj['status']=="new"){ + $ldap->cat($sub_dn); + if($ldap->count()){ + $obj['status']="modify"; + } + } + + if(empty($tmp['FAIpriority'])){ + $tmp['FAIpriority'] ="0"; + } + + if($obj['status'] == "delete"){ + $ldap->cd($sub_dn); + $ldap->rmdir_recursive($sub_dn); + $this->handle_post_events("remove"); + }elseif($obj['status'] == "edited"){ + $ldap->cd($sub_dn); + $ldap->modify($tmp); + $this->handle_post_events("modify"); + }elseif($obj['status']=="new"){ + if($tmp['description']==array()){ + unset($tmp['description']); + } + if($tmp['FAIscript']==array()){ + $tmp['FAIscript']=" "; + } + $ldap->cd($this->config->current['BASE']); + $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $this->dn)); + $ldap->cd($sub_dn); + $ldap->add($tmp); + $this->handle_post_events("add"); + } + show_ldap_error($ldap->get_error()); + } } + + + function readBinary($attr,$dn){ + $Data =""; + $ds= ldap_connect($this->config->current['SERVER']); + ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3); + if (function_exists("ldap_set_rebind_proc") && isset($this->config->current['RECURSIVE']) && $this->config->current['RECURSIVE'] == "true") { + ldap_set_option($this->cid, LDAP_OPT_REFERRALS, 1); + ldap_set_rebind_proc($ds, array(&$this, "rebind")); + } + + if(isset($this->config->current['TLS']) && $this->config->current['TLS'] == "true"){ + ldap_start_tls($ds); + } + + $r = ldap_bind($ds); + $sr = @ldap_read($ds, $dn, $attr."=*", array($attr)); + + if ($sr) { + $ei=ldap_first_entry($ds, $sr); + if ($ei) { + if ($info = ldap_get_values_len($ds, $ei, $attr)){ + $Data= $info[0]; + } + } + } + + /* close conncetion */ + ldap_unbind($ds); + return($Data); + } + + } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: