"Eins ist toll", "zwei" => "Zwei ist noch besser"); /* Appgroup attributes */ var $gosaMemberApplication= array(); /* Helpers */ var $departments = ""; // All departments within $this->curbase; var $apps = array(); // All available applications var $used_apps = array(); // Specifies which applications are currently assigned var $option_name = array(); var $option_value = array(); var $appoption = array(); var $table = ""; var $curbase = ""; var $curCatDir ; var $curCatDepth =0; // /* attribute list for save action */ var $attributes = array("gosaMemberApplication","gosaApplicationParameter"); var $objectclasses = array("gosaApplicationGroup"); var $FAIrelease = "/"; var $InitialFAIrelease = "/"; var $Releases = array(); var $enableReleaseManagement = false; var $AllAppsForRelease = array(); var $AllAppsForReleaseParameter = array(); var $CopyPasteVars = array("Categories"); var $gosaApplicationParameter ; var $ui ; function appgroup ($config, $dn= NULL, $parent= NULL) { $this->ui = get_userinfo(); /* prepare group app for release management */ $tmp = search_config($config->data,"faiManagement","CLASS"); if(!empty($tmp)){ $this->enableReleaseManagement = true; $this->objectclasses [] = "FAIreleaseTag"; $this->attributes[] = "FAIrelease"; } plugin::plugin ($config, $dn, $parent); /* In some case of old applikations with old release tag saving, we must reassign is_account state. (Or if release management wasn't activated before creating this app) */ if($this->enableReleaseManagement){ /* Release management is activated && this is a valid group app account, but no release class was found, so activate is_account flag */ if($dn != "new" && ( in_array("gosaApplicationGroup",$this->attrs['objectClass'])) && (!in_array("FAIreleaseTag",$this->attrs['objectClass']))){ $this->is_account =true; } } /* Load member applications */ if (isset ($this->attrs["gosaMemberApplication"][0])){ $this->gosaMemberApplication = array(); for ($i= 0; $i<$this->attrs["gosaMemberApplication"]["count"]; $i++){ $this->gosaMemberApplication[]= $this->attrs["gosaMemberApplication"][$i]; } } /* Load application options */ if (isset($this->attrs['gosaApplicationParameter'])){ for ($i= 0; $i<$this->attrs['gosaApplicationParameter']['count']; $i++){ $option= preg_replace('/^[^:]+:/', '', $this->attrs['gosaApplicationParameter'][$i]); $name= preg_replace('/:.*$/', '', $this->attrs['gosaApplicationParameter'][$i]); $this->appoption[$name]= $option; } } /* Parse MemberApplication*/ $tmp = array(); $tmp2 = array(); $prios = array(); $cats = array(); foreach($this->gosaMemberApplication as $memberApp){ if(preg_match("/\|/i",$memberApp)){ $tmp = split("\|",$memberApp); if(!empty($tmp[0])){ $tmp2[$tmp[1]][$tmp[2]] = array("App"=>$tmp[0]); } if(!empty($tmp[1])){ $n = split("/",$tmp[1]); $c = count($n); $cats [$tmp[1]] = $n[$c-1]; } $prios[$tmp[1]][$tmp[2]] = $tmp[2]; }else{ $tmp2[]['App'] = $memberApp; } } $this->Categories = $cats; $this->gosaMemberApplication = $tmp2; $cats[""]=""; foreach($cats as $cat ){ if((isset($prios[$cat]))&&(count($prios[$cat]))){ $max = max($prios[$cat]); $min = 1;//min($prios[$cat]); $last = false; for($i = $min ; $i < $max ; $i++){ if(!isset($prios[$cat][$i])){ if($last == false){ $this->gosaMemberApplication[$cat][$i]['App'] = "__SEPARATOR__".$i; $last = true; } }else{ $last = false; } } } } $tmp = array(); foreach($this->gosaMemberApplication as $key => $entries){ ksort ($entries); foreach($entries as $entry){ $tmp[$key][]= $entry; } } $this->gosaMemberApplication = $tmp; $this->curbase = $this->config->current['BASE']; /* Get required release informations */ if($this->enableReleaseManagement){ $this->InitialFAIrelease = $this->FAIrelease; $this->Releases = $this->getReleases(); } } /* Combine new array */ 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); } function getpos($atr,$attrs) { $i = 0; foreach($attrs as $attr => $name) { $i++; if($attr == $atr){ return($i); } } return(-1); } function diffAppsInReleases() { /* Only diff if it is required */ $ret =array(); /* If current release has changed */ if($this->FAIrelease != $this->InitialFAIrelease){ /* Walk through all apps which are currently displayed */ if(isset($this->gosaMemberApplication[$this->curCatDir])){ foreach($this->gosaMemberApplication[$this->curCatDir] as $entry){ /* If application is also available in new release, check if parameter differs */ if(in_array($entry['App'],$this->AllAppsForRelease)){ $old = array(); // Old application parameter $new = array(); // New parameters /* There are possibly no parameters specified */ if(isset($this->AllAppsForReleaseParameter[$this->InitialFAIrelease][$entry['App']])){ $old = $this->AllAppsForReleaseParameter[$this->InitialFAIrelease][$entry['App']]; } if(isset($this->AllAppsForReleaseParameter[$this->FAIrelease][$entry['App']])){ $new = $this->AllAppsForReleaseParameter[$this->FAIrelease][$entry['App']]; } /* Both (old & new) have no gosaApplicationParameter */ if((!isset($old['gosaApplicationParameter'])) && (!isset($new['gosaApplicationParameter']))){ $ret[$entry['App']] = false; /* Both got gosaApplicationParameter */ }elseif((isset($old['gosaApplicationParameter'])) && (isset($new['gosaApplicationParameter']))){ if(array_differs($old['gosaApplicationParameter'],$new['gosaApplicationParameter'])){ $ret[$entry['App']] = true; }else{ $ret[$entry['App']] = false; } } /* Initialy had gosaApplicationParameter bot in new release not */ }elseif((isset($old['gosaApplicationParameter'])) && (!isset($new['gosaApplicationParameter']))){ $ret[$entry['App']] = true; /* Old release had no gosaApplicationParameter but new got some */ }elseif((!isset($old['gosaApplicationParameter'])) && (isset($new['gosaApplicationParameter']))){ $ret[$entry['App']] = true; } } } } return($ret); } /* TRansports the geiven 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 geiven Arraykey one position up*/ 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); } function catUp($id) { /* Get all cats depinding on current dir */ $cats = $this->GetSubdirs($this->curCatDir); $newcats =$this->ArrayUp($id,$cats); foreach($newcats as $cat => $name){ unset($this->Categories[$cat]); } foreach($newcats as $cat => $name){ $this->Categories[$cat]=$name; } } function catDown($id) { /* Get all cats depinding on current dir */ $cats = $this->GetSubdirs($this->curCatDir); $newcats =$this->ArrayDown($id,$cats); foreach($newcats as $cat => $name){ unset($this->Categories[$cat]); } foreach($newcats as $cat => $name){ $this->Categories[$cat]=$name; } } function getOneUp($appl) { $cat = $this->curCatDir; $apps = $this->gosaMemberApplication[$cat]; $appsA = array(); foreach ($apps as $appkey => $name){ $appsA[$name['App']] =$name['App']; } $result = $this->ArrayUp($appl,$appsA); $ret = array(); foreach($result as $app){ $ret[]=array("App"=>$app); } $this->gosaMemberApplication[$cat] = $ret; } function getOneDown($appl) { $cat = $this->curCatDir; $apps = $this->gosaMemberApplication[$cat]; $appsA = array(); foreach ($apps as $appkey => $name){ $appsA[$name['App']] =$name['App']; } $result = $this->ArrayDown($appl,$appsA); $ret = array(); foreach($result as $app){ $ret[]=array("App"=>$app); } $this->gosaMemberApplication[$cat] = $ret; } function AddSeperator($id) { $found = false; $cat = ""; $tmp = array(); foreach($this->gosaMemberApplication[$this->curCatDir] as $appID => $app){ $tmp[] = $app; if(($app['App'] == $id)&&(!$found)){ $cnt = count($this->gosaMemberApplication[$this->curCatDir]); $tmp[] = array("App" => "__SEPARATOR__".($cnt+1)); $found = true; } } if($found){ $this->gosaMemberApplication[$this->curCatDir]=$tmp; } } function execute() { /* Call parent execute */ plugin::execute(); if((isset($_GET['act']))&&($_GET['act']=="depopen")){ $dep = base64_decode($_GET['depid']); if(isset($this->config->idepartments[$dep])){ $this->curbase =$dep; } } if((isset($_GET['act']))&&($_GET['act']=="open")){ $this->curCatDir = base64_decode($_GET['id']); } /* Do we need to flip is_account state? */ if (isset($_POST['modify_state'])){ $this->is_account= !$this->is_account; } /* Do we represent a valid group? */ if (!$this->is_account && $this->parent == NULL){ $display= " ". _("This 'dn' is no appgroup.").""; return ($display); } /* Show tab dialog headers */ $display= ""; if ($this->parent != NULL){ if ($this->is_account){ $display= $this->show_header(_("Remove applications"), _("This group has application features enabled. You can disable them by clicking below.")); } else { $display.= $this->show_header(_("Create applications"), _("This group has application features disabled. You can enable them by clicking below.")); return ($display); } } /* Add Categorie */ if((isset($_POST['AddCat']))&&(isset($_POST['CatName']))&&(!empty($_POST['CatName']))){ if(preg_match("/[\\\\\/]/i",$_POST['CatName'])){ print_red(_("Invalid character in category name.")); }elseif(!in_array($_POST['CatName'],$this->Categories)){ if(empty($this->curCatDir)){ $this->Categories[$_POST['CatName']]=$_POST['CatName']; }else{ $this->Categories[$this->curCatDir."/".$_POST['CatName']]=$_POST['CatName']; } }else{ print_red(_("The specified category already exists.")); } } $this->reload(); $this->diffAppsInReleases(); $only_once = false; foreach($_POST as $name => $value){ if((preg_match("/AddSep_/",$name))&&(!$only_once)){ $only_once = true; $n = preg_replace("/AddSep_/","",$name); $val= preg_replace("/_.*$/","",$n); $this->AddSeperator($val); } if((preg_match("/DelApp_/",$name))&&(!$only_once)){ $only_once = true; if(preg_match("/DelApp___SEPARATOR__/",$name)) { $n= preg_replace("/DelApp___SEPARATOR__/","",$name); $val= "__SEPARATOR__".preg_replace("/_.*$/","",$n); }else{ $n = preg_replace("/DelApp_/","",$name); $val= preg_replace("/_.*$/","",$n); } foreach($this->gosaMemberApplication as $key => $cat){ foreach($cat as $key2 => $app){ if($app['App'] == $val){ unset($this->gosaMemberApplication[$key][$key2]); if(isset($this->used_apps[$val])){ foreach($this->getParameters($val) as $para){ if(isset($this->appoption[$para])){ unset($this->appoption[$para]); } } unset($this->used_apps[$val]); } } } } } if(preg_match("/DelCat_/",$name)){ $n = preg_replace("/DelCat_/","",$name); $app = base64_decode( preg_replace("/_.*$/","",$n)); foreach($this->Categories as $key => $cat){ if($cat == $app){ foreach($this->Categories as $p => $n){ if(preg_match("/^".$key."\/.*/",$p)){ unset($this->Categories[$p]); } } unset($this->Categories[$key]); } } } if((preg_match("/EdiApp_/",$name))&&(!$only_once)){ $only_once = true; $appname = $value; $appname = preg_replace("/EdiApp_/","",$name); $appname = preg_replace("/_.*$/","",$appname); /* We've got the appname, get parameters from ldap */ $ldap= $this->config->get_ldap_link(); $tmp = search_config($this->config->data,"faiManagement","CLASS"); if(!empty($tmp)){ $tmp = array_flip($this->Releases); $base = $tmp[$this->FAIrelease]; $ldap->cd($this->config->current['BASE']); $ldap->search("(&(objectClass=gosaApplication)(cn=$appname))",array("gosaApplicationParameter")); $found = ""; while($attrs = $ldap->fetch()) { if(preg_match("/cn=".$appname.",".$base."/",$attrs['dn'])){ $found = $attrs['dn']; } } $ldap->cat($found, array("gosaApplicationParameter")); }else{ $ldap->cd($this->config->current['BASE']); $ldap->search("(&(objectClass=gosaApplication)(cn=$appname))",array("gosaApplicationParameter")); } if ($ldap->count() != 1){ print_red (_("The selected application name is not uniq. Please check your LDAP.")); } else { $attrs= $ldap->fetch(); if(isset($attrs['gosaApplicationParameter'])){ $this->dialog= TRUE; /* Fill name and value arrays */ for ($i= 0; $i<$attrs['gosaApplicationParameter']['count']; $i++){ $option= preg_replace('/^[^:]+:/', '', $attrs['gosaApplicationParameter'][$i]); $name= preg_replace('/:.*$/', '', $attrs['gosaApplicationParameter'][$i]); $this->option_name[$i]= $name; /* Fill with values from application, default should be loaded by the external scripts */ if (isset($this->appoption[$name])){ $this->option_value[$i]= $this->appoption[$name]; } } /* Create edit field */ $table= "
".$this->option_name[$i]." | ".
" |