X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Fadmin%2Ffai%2Fclass_faiHook.inc;h=68b5926c504018cce50b411efae7be7a7fa5c181;hb=90cb0cbd940168e234d506e42644e52fc7af5c4d;hp=aaf7f74e0c86d5d6ecf05b3615d3c5532bd5ae85;hpb=87128a9fccb32b389186dde0e429db90441181c9;p=gosa.git diff --git a/plugins/admin/fai/class_faiHook.inc b/plugins/admin/fai/class_faiHook.inc index aaf7f74e0..68b5926c5 100644 --- a/plugins/admin/fai/class_faiHook.inc +++ b/plugins/admin/fai/class_faiHook.inc @@ -24,8 +24,10 @@ class faiHook extends plugin var $subClassName = "faiHookEntry"; /* Attributes to initialise for each subObject */ - var $subAttributes = array("cn","description","FAItask","FAIscript"); + var $subAttributes = array("cn","description","FAItask"); + var $sub_Load_Later = array("FAIscript"); var $sub64coded = array(); + var $subBinary = array("FAIscript"); /* Specific attributes */ var $cn = ""; // The class name for this object @@ -34,49 +36,90 @@ class faiHook extends plugin var $dialog = NULL; // a dialog, e.g. new disk dialog var $SubObjects = array(); // All leafobjects of this object + var $FAIstate = ""; + var $base = ""; + var $release = ""; + var $copy_paste_mode = false; + var $cut_paste_mode = false; + + var $CopyPasteVars = array("SubObjects"); + function faiHook ($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. */ 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); - $ldap->search("(&(objectClass=FAIclass)(objectClass=".$this->subClass."))",$this->subAttributes); + $ldap->search("(&(objectClass=FAIclass)(objectClass=".$this->subClass."))",array("dn")); while($object = $ldap->fetch()){ + /* Set status for save management */ + $objects = array(); + $objects['status'] = "FreshLoaded"; + $objects['dn'] = $object['dn']; + $objects = $this->get_object_attributes($objects,$this->subAttributes); + $this->SubObjects[$objects['cn']] = $objects; + } + } + } + + + /* Reload some attributes */ + function get_object_attributes($object,$attributes) + { + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->cat($object['dn'],$attributes); + $tmp = $ldap->fetch(); - 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]; - } - } - - $this->SubObjects[$object['cn'][0]]['status'] = "edited"; - $this->SubObjects[$object['cn'][0]]['dn'] = $object['dn']; + foreach($attributes as $attrs){ + if(isset($tmp[$attrs][0])){ + $var = $tmp[$attrs][0]; - foreach($this->sub64coded as $codeIt){ - $this->SubObjects[$object['cn'][0]][$codeIt]=base64_decode($this->SubObjects[$object['cn'][0]][$codeIt]); + /* Check if we must decode some attributes */ + if(in_array_ics($attrs,$this->sub64coded)){ + $var = base64_decode($var); } - foreach($this->subAttributes as $attrs){ - $this->SubObjects[$object['cn'][0]][$attrs]=addslashes($this->SubObjects[$object['cn'][0]][$attrs]); + /* check if this is a binary entry */ + if(in_array_ics($attrs,$this->subBinary)){ + $var = $ldap->get_attribute($object['dn'], $attrs,$r_array=0); } - $this->SubObjects[$object['cn'][0]]['FAIscript'] = addslashes($this->readBinary("FAIscript",$object['dn'])); + + /* Fix slashes */ + $var = addslashes($var); + $object[$attrs] = $var; } } + return($object); } + function getUsedFAItask($cn) { $ret = array(); @@ -91,45 +134,62 @@ class faiHook extends plugin return($ret); } + function execute() { - /* Call parent execute */ - plugin::execute(); + /* Call parent execute */ + plugin::execute(); /* Fill templating stuff */ $smarty= get_smarty(); $display= ""; + /* New Listhandling + */ + $once = true; + foreach($_POST as $name => $value){ + if(preg_match("/^editscript_/",$name)&&($once)){ + $once = false; + $entry = preg_replace("/^editscript_/","",$name); + $entry = base64_decode(preg_replace("/_.*/","",$entry)); + + $obj = $this->SubObjects[$entry]; + if($obj['status'] == "FreshLoaded"){ + $obj = $this->get_object_attributes($obj,$this->sub_Load_Later); + } + + $this->dialog= new $this->subClassName($this->config,$this->dn,$obj); + $this->dialog->acl = $this->acl; + $_SESSION['objectinfo'] = $obj['dn']; + $this->dialog->parent = &$this; + $this->is_dialog=true; + } + if(preg_match("/^deletescript_/",$name)&&($once)){ + $once = false; + $entry = preg_replace("/^deletescript_/","",$name); + $entry = base64_decode(preg_replace("/_.*/","",$entry)); + + $status = $this->SubObjects[$entry]['status']; + if($status == "edited" || $status == "FreshLoaded"){ + $this->SubObjects[$entry]['status']= "delete"; + }else{ + unset($this->SubObjects[$entry]); + } + } + } + ///// Ende new list handling + /* Add new sub object */ if(isset($_POST['AddSubObject'])){ $this->dialog= new $this->subClassName($this->config,"new"); + $this->dialog->acl = $this->acl; $this->dialog->parent = &$this; $this->is_dialog=true; } - + if($this->dn != "new"){ $_SESSION['objectinfo']= $this->dn; } - /* Edit selected Sub Object */ - if((isset($_POST['EditSubObject']))&&(isset($_POST['SubObject']))){ - $hook = $_POST['SubObject'][0]; - - $this->dialog= new $this->subClassName($this->config,$this->dn,$this->SubObjects[$hook]); - $this->dialog->parent = &$this; - $_SESSION['objectinfo'] = $this->SubObjects[$hook]['dn']; - $this->is_dialog=true; - } - - /* Remove Sub object */ - if((isset($_POST['DelSubObject']))&&(isset($_POST['SubObject']))){ - foreach($_POST['SubObject'] as $hook){ - if($this->SubObjects[$hook]['status'] == "edited"){ - $this->SubObjects[$hook]['status']= "delete"; - }else{ - unset($this->SubObjects[$hook]); - } - } - } /* Save Dialog */ if(isset($_POST['SaveSubObject'])){ @@ -150,9 +210,10 @@ class faiHook extends plugin /* Get return object */ $obj = $this->dialog->save(); if(isset($obj['remove'])){ + $old_stat = $this->SubObjects[$obj['remove']['from']]['status']; /* Depending on status, set new status */ - if($this->SubObjects[$obj['remove']['from']]['status']=="edited"){ + if($old_stat == "edited" || $old_stat == "FreshLoaded"){ $this->SubObjects[$obj['remove']['from']]['status'] = "delete"; }elseif($this->SubObjects[$obj['remove']['from']]['status']=="new"){ unset($this->SubObjects[$obj['remove']['from']]); @@ -161,8 +222,12 @@ class faiHook extends plugin $this->SubObjects[$obj['remove']['to']] = $obj; unset($this->SubObjects[$obj['remove']['to']]['remove']); }else{ + if($obj['status'] == "FreshLoaded"){ + $obj['status'] = "edited"; + } $this->SubObjects[$obj['cn']]=$obj; } + $this->is_dialog=false; unset($this->dialog); $this->dialog=NULL; @@ -194,10 +259,44 @@ class faiHook extends plugin return($display); } + + + /* Divlist added 28.02.2006 + Containing FAIscripts + */ + + $divlist = new divSelectBox("FAIhooks"); + $divlist->setHeight(400); + if((chkacl($this->acl,"cn")!="") || ($this->FAIstate == "freeze")){ + $img_edit = ""; + $img_remo = ""; + }else{ + $img_edit = ""; + $img_remo = ""; + } + + foreach($this->getList(true) as $key => $name){ + + if(($this->SubObjects[$key]['status'] == "new") || ($this->SubObjects[$key]['dn'] == "new")){ + $down = ""; + }else{ + $down = " + "._("Download")." + "; + } + + $divlist->AddEntry(array( array("string"=>$name['name']), + array("string"=>$down , "attach" => "style='width:20px;'"), + array("string"=>str_replace("%s",base64_encode($key),$img_edit.$img_remo), + "attach"=>"style='border-right: 0px;width:50px;text-align:right;'"))); + } + $smarty->assign("Entry_divlist",$divlist->DrawList()); + /* Divlist creation complete + */ + $smarty->assign("SubObjects",$this->getList()); - $smarty->assign("SubObjectKeys",array_flip($this->getList())); - /* Magic quotes GPC, escapes every ' " \, to solve some security risks + /* 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){ @@ -208,26 +307,40 @@ class faiHook extends plugin } } + foreach($this->attributes as $attr){ + $smarty->assign($attr."ACL",chkacl($this->acl,$attr)); + } + $display.= $smarty->fetch(get_template_path('faiHook.tpl', TRUE)); return($display); } /* Generate listbox friendly SubObject list - */ - function getList(){ + */ + function getList($use_dns=false){ $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']."]"; + if($use_dns){ + if((isset($obj['description']))&&(!empty($obj['description']))){ + $a_return[$obj['cn']]['name']= $obj['cn']." [".stripslashes($obj['description'])."]"; + }else{ + $a_return[$obj['cn']]['name']= $obj['cn']; + } + $a_return[$obj['cn']]['dn']= $obj['dn']; }else{ - $a_return[$obj['cn']]= $obj['cn']; + if((isset($obj['description']))&&(!empty($obj['description']))){ + $a_return[$obj['cn']]= $obj['cn']." [".stripslashes($obj['description'])."]"; + }else{ + $a_return[$obj['cn']]= $obj['cn']; + } } } } return($a_return); } + /* Delete me, and all my subtrees */ function remove_from_parent() @@ -235,6 +348,7 @@ class faiHook extends plugin $ldap = $this->config->get_ldap_link(); $ldap->cd ($this->dn); $ldap->rmdir_recursive($this->dn); + show_ldap_error($ldap->get_error(), _("Removing FAI hook base failed")); $this->handle_post_events("remove"); } @@ -243,7 +357,7 @@ class faiHook extends plugin */ function save_object() { - if(isset($_POST['FAIhook_posted'])){ + if((isset($_POST['FAIhook_posted'])) && ($this->FAIstate != "freeze")){ plugin::save_object(); foreach($this->attributes as $attrs){ if(isset($_POST[$attrs])){ @@ -257,7 +371,22 @@ class faiHook extends plugin /* Check supplied data */ function check() { - $message= array(); + /* Call common method to give check the hook */ + $message= plugin::check(); + + /* If this is a new script, check if a script with this name already exists */ + if(!empty($this->release) && ($this->copy_paste_mode || $this->cut_paste_mode) ){ + + /* Check if current name is already used for fai scripts in selected release */ + $dn = 'cn='.$this->cn.",ou=hooks,".$this->release; + $ldap = $this->config->get_ldap_link(); + $ldap->cat($dn); + if($ldap->count()){ + + $r =convert_department_dn($this->release);; + $message[] = sprintf(_("Can't insert a fai hook named '%s' in '%s' there is already a hook with the given name."),$this->cn,$r); + } + } return ($message); } @@ -266,14 +395,21 @@ class faiHook extends plugin function save() { plugin::save(); - + $ldap = $this->config->get_ldap_link(); - $ldap->cat($this->dn); + /* Copy & Paste : Ensure that FAIstate is copied too */ + if($this->copy_paste_mode && preg_match("/freeze/",$this->FAIstate)){ + $this->attrs['FAIstate'] = $this->FAIstate; + } + + $ldap->cat($this->dn,array("objectClass")); if($ldap->count()!=0){ /* Write FAIscript to ldap*/ $ldap->cd($this->dn); - $ldap->modify($this->attrs); + $this->cleanup(); + $ldap->modify ($this->attrs); + }else{ /* Write FAIscript to ldap*/ $ldap->cd($this->config->current['BASE']); @@ -281,33 +417,60 @@ class faiHook extends plugin $ldap->cd($this->dn); $ldap->add($this->attrs); } - show_ldap_error($ldap->get_error()); - + show_ldap_error($ldap->get_error(), _("Saving FAI hook base failed")); + + /* Do object tagging */ + $this->handle_object_tagging(); + + $ldap->cd($this->dn); + /* 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(); + + + /* We do not need to save untouched objects */ + foreach($this->SubObjects as $name => $obj){ + if($obj['status'] == "FreshLoaded"){ + if($this->copy_paste_mode){ + $this->SubObjects[$name] = $this->get_object_attributes($obj,$this->sub_Load_Later); + $this->SubObjects[$name]['status'] = "new"; + }else{ + unset($this->SubObjects[$name]); + } + } + } + + /* Add objects that must be removed first.*/ foreach($this->SubObjects as $name => $obj){ if($obj['status'] == "delete"){ $Objects[$name] = $obj; } } + + /* Add objects to add/modify */ foreach($this->SubObjects as $name => $obj){ if($obj['status'] != "delete"){ $Objects[$name] = $obj; } } + /* Walk through list of objects */ foreach($Objects as $name => $obj){ + /* Encode attribtues if required */ foreach($this->sub64coded as $codeIt){ $obj[$codeIt]=base64_encode(stripslashes($obj[$codeIt])); } + /* Create ldap entry */ $tmp = array(); - foreach($this->subAttributes as $attrs){ + $attributes = array_merge($this->sub_Load_Later,$this->subAttributes); + foreach($attributes as $attrs){ + if(empty($obj[$attrs])){ $obj[$attrs] = array(); } @@ -323,20 +486,34 @@ class faiHook extends plugin $sub_dn = "cn=".$obj['cn'].",".$this->dn; if($obj['status']=="new"){ - $ldap->cat($sub_dn); + $ldap->cat($sub_dn,array("objectClass")); if($ldap->count()){ - $obj['status']="modify"; + $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"){ $ldap->cd($sub_dn); $ldap->rmdir_recursive($sub_dn); $this->handle_post_events("remove"); + show_ldap_error($ldap->get_error(), _("Removing FAI hook failed")); }elseif($obj['status'] == "edited"){ $ldap->cd($sub_dn); - $ldap->modify($tmp); + $this->cleanup(); + $ldap->modify ($tmp); $this->handle_post_events("modify"); + show_ldap_error($ldap->get_error(), _("Saving FAI hook failed")); }elseif($obj['status']=="new"){ if($tmp['description']==array()){ unset($tmp['description']); @@ -346,42 +523,33 @@ class faiHook extends plugin $ldap->cd($sub_dn); $ldap->add($tmp); $this->handle_post_events("add"); + show_ldap_error($ldap->get_error(), _("Saving FAI hook failed")); } - show_ldap_error($ldap->get_error()); + $this->handle_object_tagging($sub_dn, $this->gosaUnitTag); } } - 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)); + /* return copy & paste dialog + */ + function getCopyDialog() + { + /* Ask for cn */ + $smarty = get_smarty(); + $smarty->assign("cn" ,$this->cn); + $str = $smarty->fetch(get_template_path("paste_fai_object.tpl",TRUE)); + $ret = array(); + $ret['string'] = $str; + $ret['status'] = ""; + return($ret); + } - if ($sr) { - $ei=ldap_first_entry($ds, $sr); - if ($ei) { - if ($info = ldap_get_values_len($ds, $ei, $attr)){ - $Data= $info[0]; - } - } + /* Get posted cn */ + function saveCopyDialog() + { + if(isset($_POST['cn'])){ + $this->cn = $_POST['cn']; } - - /* close conncetion */ - ldap_unbind($ds); - return($Data); } - - } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: