X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Ffai%2Fclass_faiProfile.inc;h=e9b59675fe583568bf80df95c71d288fcec7b878;hb=5911441e8460700302accbdc64249b2207324415;hp=5ca3329b1550f2d7c50d21f0d97607efe6b51f97;hpb=37b9ba6c41c1a84cbbd4da1b57e9af9667743e4d;p=gosa.git diff --git a/plugins/admin/fai/class_faiProfile.inc b/plugins/admin/fai/class_faiProfile.inc index 5ca3329b1..e9b59675f 100644 --- a/plugins/admin/fai/class_faiProfile.inc +++ b/plugins/admin/fai/class_faiProfile.inc @@ -2,11 +2,6 @@ class faiProfile extends plugin { - /* CLI vars */ - var $cli_summary = "Manage server basic objects"; - var $cli_description = "Some longer text\nfor help"; - var $cli_parameters = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser"); - /* attribute list for save action */ var $ignore_account = TRUE; @@ -30,41 +25,91 @@ class faiProfile extends plugin var $FAIclasses = array(); // Contains classname seperated in an array var $FAIAllclasses = array(); // Contains all possible Classnames + var $FAIstate = ""; + var $base = ""; + var $release = ""; + var $copy_paste_mode= false; + var $cut_paste_mode = false; + + var $CopyPasteVars = array("FAIclass","FAIclasses","FAIAllclasses"); + function faiProfile($config, $dn= NULL) { /* Load Attributes */ plugin::plugin ($config, $dn); $ldap=$this->config->get_ldap_link(); + $this->acl = "#all#"; + + if($this->dn != "new"){ + /* Set acls + */ + $ui = get_userinfo(); + $acl = get_permissions ($this->dn, $ui->subtreeACL); + $acli = get_module_permission($acl, "FAIclass", $this->dn); + $this->acl=$acli; + } + + /* Parse ldap attribute to get all assigned classes */ $tmp = split(" ",$this->FAIclass); - + $tmp2 = array(); foreach($tmp as $class){ if(!empty($class)){ - $this->FAIclasses[trim($class)] = trim($class); + $tmp2[trim($class)] = trim($class); } } - natcasesort($this->FAIclasses); - reset($this->FAIclasses) ; - - $categories = array("FAIscript","FAItemplate","FAIhook","FAIvariable","FAIpartitionTAble","FAIpackage"); - - $sort = array(); - - $base = $_SESSION['faifilter']['base']; + + if(isset($this->attrs['FAIstate'][0])){ + $this->FAIstate = $this->attrs['FAIstate'][0]; + } + + /* Sort assigned classes */ + if(is_array($tmp2)){ + foreach($tmp2 as $class){ + $this->FAIclasses[$class]=$class; + } + } + + /* Search only in fai tree */ + $ObjectTypes = array( + "FAIpartitionTable" => array("OU"=>"ou=disk," ), + "FAIpackageList" => array("OU"=>"ou=packages," ), + "FAIscript" => array("OU"=>"ou=scripts," ), + "FAIvariable" => array("OU"=>"ou=variables," ), + "FAIhook" => array("OU"=>"ou=hooks," ), +# "FAIprofile" => array("OU"=>"ou=profiles," ), + "FAItemplate" => array("OU"=>"ou=templates," )); + + $base= "ou=fai,ou=configs,ou=systems,".$_SESSION['CurrentMainBase']; + if($_SESSION['faifilter']['branch']!="main"){ + $base = $_SESSION['faifilter']['branch']; + } + + /* Get ldap connection */ + $ldap= $this->config->get_ldap_link(); $ldap->cd($base); - $ldap->search("(objectClass=*)",array("*")); - while($attrs = $ldap->fetch()){ - foreach($categories as $cat){ - if(in_array($cat,$attrs['objectClass'])){ - $this->FAIAllclasses[$attrs['cn'][0]][$cat]=$attrs; - $sort[strtolower($attrs['cn'][0])] = $attrs['cn'][0]; - } + $sort = array(); + /* Capture objects from given base */ + $result = array(); + foreach($ObjectTypes as $oc => $data){ + $ou = $data['OU'].$base; + + $ldap->ls("(objectClass=".$oc.")",$ou,array("cn","objectClass","dn")); + while($attrs = $ldap->fetch()){ + $this->FAIAllclasses[$attrs['cn'][0]][$oc]=$attrs; + $sort[strtolower($attrs['cn'][0])] = $attrs['cn'][0]; } - } - ksort($sort); + } + + /* Sort the sort array */ + //ksort($sort); + + /* Reorder the FAIclasses array */ foreach($sort as $name){ $tmp[$name] =$this->FAIAllclasses[$name]; } + + /* Assign sorted classes */ $this->FAIAllclasses = array(); $this->FAIAllclasses = $tmp; @@ -74,8 +119,92 @@ class faiProfile extends plugin $this->old_cn = $this->cn; } + + /* Combine new array, used for up down buttons */ + function combineArrays($ar0,$ar1,$ar2) + { + $ret = array(); + if(is_array($ar0)) + foreach($ar0 as $ar => $a){ + $ret[$ar]=$a; + } + if(is_array($ar1)) + foreach($ar1 as $ar => $a){ + $ret[$ar]=$a; + } + if(is_array($ar2)) + foreach($ar2 as $ar => $a){ + $ret[$ar]=$a; + } + return($ret); + } + + /* returns position in array */ + function getpos($atr,$attrs) + { + $i = 0; + foreach($attrs as $attr => $name) { + $i++; + if($attr == $atr){ + return($i); + } + } + return(-1); + } + + /* Transports the given Arraykey one position up*/ + function ArrayUp($atr,$attrs) + { + $ret = $attrs; + $pos = $this->getpos($atr,$attrs) ; + $cn = count($attrs); + if(!(($pos == -1)||($pos == 1))){ + $before = array_slice($attrs,0,($pos-2)); + $mitte = array_reverse(array_slice($attrs,($pos-2),2)); + $unten = array_slice($attrs,$pos); + $ret = array(); + $ret = $this->combineArrays($before,$mitte,$unten); + } + return($ret); + } + + + /* Transports the given Arraykey one position down*/ + function ArrayDown($atr,$attrs) + { + $ret = $attrs; + $pos = $this->getpos($atr,$attrs) ; + $cn = count($attrs); + if(!(($pos == -1)||($pos == $cn))){ + $before = array_slice($attrs,0,($pos-1)); + $mitte = array_reverse(array_slice($attrs,($pos-1),2)); + $unten = array_slice($attrs,($pos+1)); + $ret = array(); + $ret = $this->combineArrays($before,$mitte,$unten); + } + return($ret); + } + + /* class one position up */ + function catUp($id) + { + /* Get all cats depinding on current dir */ + $cats = $this->FAIclasses; + $this->FAIclasses =$this->ArrayUp($id,$cats); + } + + /* Class one position down */ + function catDown($id) + { + /* Get all cats depinding on current dir */ + $cats = $this->FAIclasses; + $this->FAIclasses =$this->ArrayDown($id,$cats); + } + function execute() { + /* Call parent execute */ + plugin::execute(); /* Fill templating stuff */ $smarty= get_smarty(); $display= ""; @@ -84,14 +213,39 @@ class faiProfile extends plugin $s_action = ""; /* Remove class name From list */ + $sort_once = false; foreach($_POST as $name => $post){ if(preg_match("/DEL_/i",$name)){ $s_action = "delete"; $s_entry = preg_replace("/DEL_/","",$name); - $s_entry = preg_replace("/_.*$/","",$s_entry); + $s_entry = base64_decode(preg_replace("/_.*$/","",$s_entry)); }elseif(preg_match("/Add_class/i",$name)){ $s_action = "add"; + }elseif(preg_match("/DelClass/i",$name)){ + $s_action = "delete"; + $s_entry = $_POST['FAIclass']; + }elseif(preg_match("/AddClass/i",$name)){ + $s_action = "add"; } + + /* Check if a list element should be pushed one position up */ + if((preg_match("/sortup_/",$name))&&(!$sort_once)){ + $sort_once = true; + $val = preg_replace("/sortup_/","",$name); + $val = preg_replace("/_.*$/","",$val); + $val = base64_decode($val); + $this->catUp($val); + } + + /* Check if a list element should be pushed one position down */ + if((preg_match("/sortdown_/",$name))&&(!$sort_once)){ + $sort_once = true; + $val = preg_replace("/sortdown_/","",$name); + $val = preg_replace("/_.*$/","",$val); + $val = base64_decode($val); + $this->catDown($val); + } + } if($s_action == "delete"){ @@ -102,7 +256,7 @@ class faiProfile extends plugin $this->dialog = new faiProfileEntry($this->config,$this->dn,$this->FAIclasses); $this->is_dialog =true; } - + /* Save Dialog */ if(isset($_POST['SaveSubObject'])){ $this->dialog->save_object(); @@ -117,6 +271,7 @@ class faiProfile extends plugin $this->is_dialog=false; unset($this->dialog); $this->dialog=NULL; + //ksort($this->FAIclasses); } } @@ -126,51 +281,56 @@ class faiProfile extends plugin unset($this->dialog); $this->dialog=NULL; } - + if(isset($this->dialog)){ $this->dialog->save_object(); return($this->dialog->execute()); } - $divlist =new divlist("Profile"); + $divlist =new divSelectBox("Profile"); $divlist->SetSummary(_("This list displays all assigned class names for this profile.")); - $divlist->SetEntriesPerPage(10); - - $divlist->SetHeader(array(array("string"=>"Class name"), - array("string"=>"Objects","attach"=>"style='width:120px;'"), - array("string"=>"Options","attach"=>"style='border-right:none;width:60px;'"))); - $listhead = - "
". - " ". - "
"; - $objTypes['FAIhook'] = ""; - $objTypes['FAItemplate'] = ""; - $objTypes['FAIscript'] = ""; - $objTypes['FAIvariable'] = ""; - $objTypes['FAIpackages'] = ""; - $objTypes['FAIpartitionTable'] = ""; + /* item images */ + $objTypes['FAIhook'] = ""; + $objTypes['FAItemplate'] = ""; + $objTypes['FAIscript'] = ""; + $objTypes['FAIvariable'] = ""; + $objTypes['FAIpackageList'] = ""; + $objTypes['FAIpartitionTable'] = ""; - $actions = ""; + /* Delete button */ + $actions = ""; + + /* Up down buttons */ + $linkupdown = " "; + $linkupdown.= ""; + /* Append fai classes to divlist */ foreach($this->FAIclasses as $usedClass){ - $str = ""; + $str = " "; + if(isset($this->FAIAllclasses[$usedClass])){ foreach($this->FAIAllclasses[$usedClass] as $class => $obj){ $str.= $objTypes[$class]; } } - + $field1 = array("string"=> $usedClass,"attach"=>""); $field2 = array("string"=> $str,"attach"=>""); - $field3 = array("string"=> preg_replace("/%KEY%/",$usedClass,$actions),"attach"=>"style='border-right:none;'"); + if($this->FAIstate != "freeze"){ + $field3 = array("string"=> preg_replace("/%KEY%/",base64_encode($usedClass),$actions). + preg_replace("/%s/",base64_encode($usedClass),$linkupdown), + "attach"=>"style='border-right:none;'"); + }else{ + $field3 = array("string"=>" ", "attach"=>"style='border-right:none;'"); + } $divlist->AddEntry(array($field1,$field2,$field3)); } - $smarty->assign("divlisthead" ,$listhead); + $smarty->assign("FAIclasses" ,$this->FAIclasses); $smarty->assign("divlist" ,$divlist->DrawList()); - /* 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){ @@ -181,16 +341,24 @@ class faiProfile extends plugin } } + foreach($this->attributes as $attr){ + if(($this->FAIstate == "freeze") || (chkacl($this->acl,$attr)!= "")){ + $smarty->assign($attr."ACL"," disabled "); + }else{ + $smarty->assign($attr."ACL"," "); + } + } $display.= $smarty->fetch(get_template_path('faiProfile.tpl', TRUE)); return($display); } - + function remove_from_parent() { $ldap = $this->config->get_ldap_link(); $ldap->cd ($this->dn); $ldap->rmdir_recursive($this->dn); + show_ldap_error($ldap->get_error(), _("Removing FAI profile failed")); $this->handle_post_events("remove"); } @@ -210,24 +378,48 @@ class faiProfile extends plugin /* Check supplied data */ function check() { - $message= array(); - - if((empty($this->cn))||(preg_match("/[^a-z0-9]/i",$this->cn))){ - $message[]=_("Please enter a valid name. Only 0-9 a-Z are allowed here."); - } + /* Call common method to give check the hook */ + $message= plugin::check(); - if(count($this->FAIclasses) == 0){ - $message[]=_("Please assign at least one class to this profile."); - } - - $ldap = $this->config->get_ldap_link(); - $ldap->cd($_SESSION['faifilter']['base']); - $ldap->search("(&(objectClass=FAIprofile)(cn=".$this->cn.")(!cn=".$this->old_cn."))",array("*")); - - if($ldap->count()){ - $message[]=_("There is already a profile with this class name defined."); - } + if($this->copy_paste_mode){ + + /* 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=profiles,".$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 script named '%s' in '%s' there is already a script with the given name."),$this->cn,$r); + } + } + }else{ + if(count($this->FAIclasses) == 0){ + $message[]=_("Please assign at least one class to this profile."); + } + + if(empty($this->cn)){ + $message[]=_("Please enter a valid name."); + } + + $ldap = $this->config->get_ldap_link(); + $release = "ou=profiles,ou=fai,ou=configs,ou=systems,".$_SESSION['CurrentMainBase']; + if($_SESSION['faifilter']['branch']!="main"){ + $release = "ou=profiles,".$_SESSION['faifilter']['branch']; + } + $ldap->cd($release); + if ($this->old_cn == ""){ + $ldap->search("(&(objectClass=FAIprofile)(cn=".$this->cn."))",array("*")); + } else { + $ldap->search("(&(objectClass=FAIprofile)(cn=".$this->cn.")(!cn=".$this->old_cn."))",array("*")); + } + if($ldap->count()){ + $message[]=_("There is already a profile with this class name defined."); + } + } return ($message); } @@ -236,7 +428,7 @@ class faiProfile extends plugin function save() { plugin::save(); - + $ldap = $this->config->get_ldap_link(); $this->FAIclass = ""; @@ -246,11 +438,17 @@ class faiProfile extends plugin $this->attrs['FAIclass']=trim($this->FAIclass); - $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']); @@ -258,8 +456,35 @@ class faiProfile extends plugin $ldap->cd($this->dn); $ldap->add($this->attrs); } + show_ldap_error($ldap->get_error(), _("Saving FAI profile failed")); + + /* Do object tagging */ + $this->handle_object_tagging(); show_ldap_error($ldap->get_error()); } + + + /* 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); + } + + /* Get posted cn */ + function saveCopyDialog() + { + if(isset($_POST['cn'])){ + $this->cn = $_POST['cn']; + } + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: