"Eins ist toll", "zwei" => "Zwei ist noch besser"); /* attribute list for save action */ var $ignore_account = TRUE; /* Attributes for this Object */ var $attributes = array("cn","description"); /* ObjectClasses for this Object*/ var $objectclasses = array("top","FAIclass","FAIvariable"); /* Class name of the Ldap ObjectClass for the Sub Object */ var $subClass = "FAIvariableEntry"; var $subClasses = array("top","FAIclass","FAIvariableEntry"); /* Class name of the php class which allows us to edit a Sub Object */ var $subClassName = "faiVariableEntry"; /* Attributes to initialise for each subObject */ var $subAttributes = array("cn","description","FAIvariableContent"); var $sub64coded = array(); /* Specific attributes */ var $cn = ""; // The class name for this object var $description = ""; // The description for this set of partitions var $is_dialog = false; // specifies which buttons will be shown to save or abort var $dialog = NULL; // a dialog, e.g. new disk dialog var $SubObjects = array(); // All leafobjects of this object var $FAIstate = ""; function faiVariable ($config, $dn= NULL) { /* Load Attributes */ plugin::plugin ($config, $dn); $this->acl ="#all#"; /* 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; /* Set acls */ $ui = get_userinfo(); $acl = get_permissions ($this->dn, $ui->subtreeACL); $acli = get_module_permission($acl, "FAIclass", $this->dn); $this->acl=$acli; /* Get FAIstate */ if(isset($this->attrs['FAIstate'][0])){ $this->FAIstate = $this->attrs['FAIstate'][0]; } /* Read all leaf objects of this object (For FAIscript this would be FAIscriptEntry) */ $ldap = $this->config->get_ldap_link(); $ldap->cd ($this->dn); $attrs_to_search = $this->subAttributes; $attrs_to_search[] = "FAIstate"; $ldap->search("(&(objectClass=FAIclass)(objectClass=".$this->subClass."))",$this->subAttributes); while($object = $ldap->fetch()){ /* Skip objects, that are tagged as removed */ if(isset($object['FAIstate'][0])){ if(preg_match("/removed$/",$object['FAIstate'][0])){ continue; } } /* 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]); } $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 $this->subClassName($this->config,"new"); $this->dialog->acl = $this->acl; $this->is_dialog=true; } if($this->dn != "new"){ $_SESSION['objectinfo']= $this->dn; } /* Edit selected Sub Object */ if((isset($_POST['EditSubObject']))&&(isset($_POST['SubObject']))){ $var = $_POST['SubObject'][0]; $this->dialog= new $this->subClassName($this->config,$this->dn,$this->SubObjects[$var]); $this->dialog->acl = $this->acl; $_SESSION['objectinfo'] = $this->SubObjects[$var]['dn']; $this->is_dialog=true; } /* Remove Sub object */ if((isset($_POST['DelSubObject']))&&(isset($_POST['SubObject']))){ foreach($_POST['SubObject'] as $var){ if($this->SubObjects[$var]['status'] == "edited"){ $this->SubObjects[$var]['status']= "delete"; }else{ unset($this->SubObjects[$var]); } } } /* Save Dialog */ if(isset($_POST['SaveSubObject'])){ $this->dialog->save_object(); $msgs = $this->dialog->check(); if(count($msgs)>0){ foreach($msgs as $msg){ print_red($msg); } }else{ $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; unset($this->dialog); $this->dialog=NULL; } /* Print dialog if $this->dialog is set */ if($this->dialog){ $this->dialog->save_object(); $display = $this->dialog->execute(); return($display); } $smarty->assign("SubObjects",$this->getList()); /* Magic quotes GPC, escapes every ' " \, to solve some security risks * If we post the escaped strings they will be escaped again */ foreach($this->attributes as $attrs){ if(get_magic_quotes_gpc()){ $smarty->assign($attrs,htmlentities (stripslashes(utf8_decode($this->$attrs)))); }else{ $smarty->assign($attrs,htmlentities (utf8_decode($this->$attrs))); } } foreach($this->attributes as $attr){ $smarty->assign($attr."ACL",chkacl($this->acl,$attr)); } $display.= $smarty->fetch(get_template_path('faiVariable.tpl', TRUE)); return($display); } /* Generate listbox friendly SubObject list */ function getList(){ $a_return=array(); foreach($this->SubObjects as $obj){ if($obj['status'] != "delete"){ if((isset($obj['description']))&&(!empty($obj['description']))&&(!preg_match("/\[\*\]/",$obj['description']))){ if (preg_match("/\[\*\]/", $obj['description'])){ $a_return[$obj['cn']]= $obj['cn']." [".preg_replace("/\s*\[\*\]\s*/", "", $obj['description'])."]"; } else { $a_return[$obj['cn']]= $obj['cn']."=".$obj['FAIvariableContent']." [".$obj['description']."]"; } }else{ if (preg_match("/\[\*\]/", $obj['description'])){ $a_return[$obj['cn']]= $obj['cn']; } else { $a_return[$obj['cn']]= $obj['cn']."=".$obj['FAIvariableContent']; } } } } return($a_return); } /* Delete me, and all my subtrees */ function remove_from_parent() { $ldap = $this->config->get_ldap_link(); $ldap->cd ($this->dn); # $use_dn = str_ireplace( get_release_dn($this->dn), $_SESSION['faifilter']['branch'], $this->dn); $use_dn = preg_replace("/".normalizePreg(get_release_dn($this->dn))."/i", $_SESSION['faifilter']['branch'], $this->dn); if($_SESSION['faifilter']['branch'] == "main"){ $use_dn = $this->dn; } prepare_to_save_FAI_object($use_dn,array(),true); foreach($this->SubObjects as $name => $obj){ # $use_dn = str_ireplace( get_release_dn($this->dn), $_SESSION['faifilter']['branch'], $obj['dn']); $use_dn = preg_replace("/".normalizePreg(get_release_dn($this->dn))."/i", $_SESSION['faifilter']['branch'], $obj['dn']); if($_SESSION['faifilter']['branch'] == "main"){ $use_dn = $obj['dn']; } prepare_to_save_FAI_object($use_dn,array(),true); } $this->handle_post_events("remove"); } /* Save data to object */ function save_object() { if((isset($_POST['FAIvariable_posted'])) && ($this->FAIstate != "freeze") ){ plugin::save_object(); foreach($this->attributes as $attrs){ if(isset($_POST[$attrs])){ $this->$attrs = $_POST[$attrs]; } } } } /* Check supplied data */ function check() { /* Call common method to give check the hook */ $message= plugin::check(); return ($message); } /* Save to LDAP */ function save() { plugin::save(); $ldap = $this->config->get_ldap_link(); prepare_to_save_FAI_object($this->dn,$this->attrs); show_ldap_error($ldap->get_error(), sprintf(_("Saving of FAI/variable with dn '%s' failed."),$this->dn)); /* Do object tagging */ $this->handle_object_tagging(); /* 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($obj[$codeIt]); } $tmp = array(); foreach($this->subAttributes as $attrs){ if(empty($obj[$attrs])){ $obj[$attrs] = array(); } $tmp[$attrs] = $obj[$attrs]; } $tmp['objectClass'] = $this->subClasses; $sub_dn = "cn=".$obj['cn'].",".$this->dn; if($obj['status']=="new"){ $ldap->cat($sub_dn,array("objectClass")); if($ldap->count()){ $obj['status']="edited"; } } /* Check if gosaAdministrativeUnitTag is required as object class */ if($obj['status'] == "edited"){ $ldap->cat($sub_dn,array("objectClass")); $attrs = $ldap->fetch(); if(isset($attrs['objectClass'])){ if(in_array_ics("gosaAdministrativeUnitTag",$attrs['objectClass'])){ $tmp['objectClass'][] = "gosaAdministrativeUnitTag"; } } } if($obj['status'] == "delete"){ prepare_to_save_FAI_object($sub_dn,array(),true); $this->handle_post_events("remove"); }elseif($obj['status'] == "edited"){ prepare_to_save_FAI_object($sub_dn,$tmp); $this->handle_post_events("modify"); }elseif($obj['status']=="new"){ prepare_to_save_FAI_object($sub_dn,$tmp); $this->handle_post_events("add"); } $this->handle_object_tagging($sub_dn, $this->gosaUnitTag); } } /* Return plugin informations for acl handling */ function plInfo() { return (array( "plShortName" => _("Variable"), "plDescription" => _("FAI variable"), "plSelfModify" => FALSE, "plDepends" => array(), "plPriority" => 0, "plSection" => array("administration"), "plCategory" => array("fai"), "plProvidedAcls" => array( "cn" => _("Name"), "description" => _("Description"), "FAIvariableContent"=> _("Variable content")) )); } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>