X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Fgroups%2Fclass_groupGeneric.inc;h=dba7c496a53745fb9410f59249b686eb368ce143;hb=335428f1501ac307511e688ea19958e274b4bcc6;hp=d009a6f1e49e965a11491ddb5c3b0821c9013e6b;hpb=b7479d8f6c50ebfe3f10a9a3df6137b94082f43e;p=gosa.git diff --git a/plugins/admin/groups/class_groupGeneric.inc b/plugins/admin/groups/class_groupGeneric.inc index d009a6f1e..dba7c496a 100644 --- a/plugins/admin/groups/class_groupGeneric.inc +++ b/plugins/admin/groups/class_groupGeneric.inc @@ -1,4 +1,5 @@ samba3= ($config->current['SAMBAVERSION'] == 3); @@ -142,23 +145,22 @@ class group extends plugin $gufilter= get_global('gufilter'); $gufilter['SubSearchGroup'] = false; - $gufilter['dselect'] = $_SESSION['groupfilter']['depselect']; + $gufilter['dselect'] = $_SESSION['gufilter']['dselect']; register_global('gufilter',$gufilter); - /* Bases / Departments */ - - if(isset($_SESSION['groupfilter']['depselect'])){ - $this->base = $_SESSION['groupfilter']['depselect']; - }else{ - if ($this->dn == "new"){ + if ($this->dn == "new"){ + if(isset($_SESSION['CurrentMainBase'])){ + $this->base= $_SESSION['CurrentMainBase']; + }else{ $ui= get_userinfo(); $this->base= dn2base($ui->dn); - } else { - $this->base= preg_replace ("/^[^,]+,[^,]+,/", "", $this->dn); } + } else { + + /* Get object base */ + $this->base =preg_replace ("/^[^,]+,".normalizePreg(get_groups_ou())."/","",$this->dn); } - /* This is always an account */ $this->is_account= TRUE; @@ -281,7 +283,6 @@ class group extends plugin } $gufilter['regex']= $s; } - $regex= preg_replace('/[*]/', ".*", $gufilter['regex']); register_global("gufilter", $gufilter); $this->reload(); @@ -295,16 +296,7 @@ class group extends plugin $smarty->assign("$type", $gufilter[$type]); } $smarty->assign("hint", print_sizelimit_warning()); - - $users= array(); - foreach ($this->allusers as $key => $value){ - if (!array_key_exists($key, $this->members)){ - if (preg_match("/^$regex/i", $key)){ - $users[$key]= $value; - } - } - } - $smarty->assign("users", $users); + $smarty->assign("users", $this->displayUsers); $smarty->assign("apply", apply_filter()); $display= $smarty->fetch (get_template_path('group_objects.tpl', TRUE, dirname(__FILE__))); return ($display); @@ -412,75 +404,101 @@ class group extends plugin /* Reload data */ function reload() { - /* Generate userlists */ - $this->last_sorting= "invalid"; - $this->users= array(); + /* Fix regex string */ + $gufilter = get_global("gufilter"); + $regex = normalizeLdap($gufilter['regex']); + $MaxUser = $this->OnlyShowFirstEntries; + + /* Prepare ldap link */ $ldap= $this->config->get_ldap_link(); + $ldap->cd($gufilter['dselect']); - $MaxUser = $this->OnlyShowFirstEntries; - $gufilter= get_global("gufilter"); - $ldap->cd ($this->config->current['BASE']); + /* Resolve still unresolved memberuids to fill the list with sn/giveName attributes + (Store gathered sn/givenName informations in $this->allusers too, + to be prepared when adding/deleting users) + */ + $filter = ""; + foreach ($this->memberUid as $value){ + if(!isset($this->members[$value])){ + $filter .= "(uid=".normalizeLdap($value).")"; + } + } + if(!empty($filter)){ + $ldap->cd($this->config->current['BASE']); + $ldap->search("(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate))(|".$filter."))",array("uid","sn","givenName")); + while($attrs = $ldap->fetch()){ + $this->members[$attrs['uid'][0]] = $this->createResultName($attrs); + $this->allusers[$attrs['uid'][0]]= $this->createResultName($attrs); + } + } + + /* check if all uids are resolved */ + foreach ($this->memberUid as $value){ + if(!isset($this->members[$value])){ + $this->members[$value] = _("! unknown id")." [".$value."]"; + } + } + + /* Create display list of users matching regex & filter + */ + $this->displayUsers = array(); + + /* Set tag attribute if we've tagging activated */ + $tag= ""; + $ui= get_userinfo(); + if ($ui->gosaUnitTag != "" && isset($this->config->current['STRICT_UNITS']) && + preg_match('/TRUE/i', $this->config->current['STRICT_UNITS'])){ + $tag= "(gosaUnitTag=".$ui->gosaUnitTag.")"; + } + + $filter = "(&(objectClass=gosaAccount)$tag(!(objectClass=gosaUserTemplate))(!(uid=*$))(|(uid=".$regex.")(sn=".$regex.")(givenName=".$regex.")))"; + + /* Search in current tree or within subtrees depending on the checkbox from filter section */ if($gufilter['SubSearchGroup']){ - $ldap->cd ($gufilter['dselect']); - $ldap->search("(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate))(!(uid=*$)))",array("uid", "sn","givenName")); + $ldap->search($filter, array("uid", "sn","givenName")); }else{ - $ldap->cd (get_people_ou().$gufilter['dselect']); - $ldap->ls ("(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate))(!(uid=*$)))",get_people_ou().$gufilter['dselect'],array("uid", "sn", "givenName")); + $ldap->ls ($filter, get_people_ou().$gufilter['dselect'],array("uid", "sn", "givenName")); } - $this->allusers= array(); + $i = 0; - $i = 0 ; - while (($attrs= $ldap->fetch()) && ($i < $MaxUser)){ + /* Fetch all users and skip already used users */ + while($attrs = $ldap->fetch()){ + if(in_array($attrs['uid'][0], $this->memberUid)) { + continue; + } $i ++; - if (isset($attrs["givenName"][0]) && isset($attrs["sn"][0])){ - $this->allusers[$attrs["uid"][0]]= $attrs["sn"][0].", ". - $attrs["givenName"][0]." [".$attrs["uid"][0]."]"; - } else { - $this->allusers[$attrs["uid"][0]]= $attrs['uid'][0]; + if($i > $MaxUser) { + break; } + $this->allusers[$attrs['uid'][0]] = $this->createResultName($attrs); + $this->displayUsers[$attrs['uid'][0]] = $this->createResultName($attrs); } + /* If more than max users are found, display a message to warn the user */ if(($i == $MaxUser)){ print_red(sprintf(_("Your search method returned more than '%s' users, only '%s' users are shown.") , $MaxUser,$MaxUser)); } - natcasesort ($this->allusers); - reset ($this->allusers); - - /* Fill memberlist */ - $this->members= array(); - foreach ($this->memberUid as $value){ - if (isset($this->allusers[$value])){ - $this->members[$value]= $this->allusers[$value]; - } else { - $ldap->cd($this->config->current['BASE']); - $ldap->search("(&(objectClass=gosaAccount)(uid=".$value."))",array("uid", "sn","givenName")); - $attrs = $ldap->fetch(); - - if(!$attrs){ - $this->members[$value] = _("! unknown id")." [".$value."]"; - }else{ - - if (isset($attrs["givenName"][0]) && isset($attrs["sn"][0])){ - $this->allusers[$attrs["uid"][0]]= $attrs["sn"][0].", ". - $attrs["givenName"][0]." [".$attrs["uid"][0]."]"; - } else { - $this->allusers[$attrs["uid"][0]]= $attrs['uid'][0]; - } - if (isset($this->allusers[$value])){ - $this->members[$value]= $this->allusers[$value]; - } else { - $this->members[$value] = "[".$value."]"; - } - } - } - } - asort($this->members); + /* Sort lists */ + natcasesort($this->members); reset($this->members); + natcasesort ($this->displayUsers); + reset ($this->displayUsers); } + /* Create display name, this was used so often that it is excluded into a seperate function */ + function createResultName($attrs) + { + if (isset($attrs["givenName"][0]) && isset($attrs["sn"][0])){ + $ret = $attrs["sn"][0].", ".$attrs["givenName"][0]." [".$attrs["uid"][0]."]"; + } else { + $ret= $attrs['uid'][0]; + } + return($ret); + } + function remove_from_parent() { @@ -488,7 +506,7 @@ class group extends plugin $ldap= $this->config->get_ldap_link(); $ldap->rmdir($this->dn); - show_ldap_error($ldap->get_error()); + show_ldap_error($ldap->get_error(), _("Removing group failed")); /* Delete references to object groups */ $ldap->cd ($this->config->current['BASE']); @@ -510,7 +528,6 @@ class group extends plugin /* Save additional values for possible next step */ if (isset($_POST['groupedit'])){ - plugin::save_object(); $this->force_gid= 0; @@ -551,6 +568,7 @@ class group extends plugin /* Save to LDAP */ function save() { + /* ID handling */ if ($this->force_gid == 0){ if ($this->saved_gidNumber != ""){ @@ -570,7 +588,7 @@ class group extends plugin $this->gidNumber= $this->get_next_id("gidNumber"); } } - + plugin::save(); /* Remove objectClass for samba/phone support */ @@ -660,7 +678,7 @@ class group extends plugin /* Save data. Using 'modify' implies that the entry is already present, use 'add' for new entries. So do a check first... */ - $ldap->cat ($this->dn); + $ldap->cat ($this->dn, array('dn')); if ($ldap->fetch()){ /* Modify needs array() to remove values :-( */ if (!count ($this->memberUid)){ @@ -685,7 +703,7 @@ class group extends plugin $ldap->$mode($this->attrs); $ret= 0; - if (show_ldap_error($ldap->get_error())){ + if (show_ldap_error($ldap->get_error(), _("Saving group failed"))){ $ret= 1; } @@ -700,7 +718,8 @@ class group extends plugin function check() { - $message= array(); + /* Call common method to give check the hook */ + $message= plugin::check(); /* Permissions for that base? */ if ($this->base != ""){ @@ -733,7 +752,7 @@ class group extends plugin $ldap= $this->config->get_ldap_link(); if(($this->cn != $this->orig_cn) || ($this->orig_dn == "new")){ $ldap->cd("ou=groups,".$this->base); - $ldap->ls("(&(|(objectClass=gosaGroupOfNames)(objectClass=posixGroup))(cn=$this->cn))","ou=groups,".$this->base,array("cn")); + $ldap->ls("(&(|(objectClass=gosaGroupOfNames)(objectClass=posixGroup))(cn=$this->cn))",get_groups_ou().$this->base,array("cn")); if ($ldap->count() != 0){ $message[]= _("Value specified as 'Name' is already used."); } @@ -796,15 +815,15 @@ class group extends plugin } /* Find out next free id near to UID_BASE */ - for ($id= $this->config->current['UIDBASE']; $id++; $id<65000){ + for ($id= $this->config->current['UIDBASE']; $id++; $id < pow(2,32)){ if (!in_array($id, $ids)){ return ($id); } } - /* Should not happen */ - if ($id == 65000){ - print_red(_("Too many users, can't allocate a free ID!")); + /* check if id reached maximum of 32 bit*/ + if ($id >= pow(2,32)){ + echo _("Too many users, can't allocate a free ID!"); exit; } } @@ -821,32 +840,16 @@ class group extends plugin $dis = " disabled "; } - $str ="
". - _("Group name"). - " | -- - | -
- "._("Force GID")." - - - | -