X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Fgroups%2Fclass_groupGeneric.inc;h=dba7c496a53745fb9410f59249b686eb368ce143;hb=bfaaf679dd6eaabbc8e0b581b465179dbe7d9319;hp=1cfe9913e2bbc251bdc1f211c9516a7320991df4;hpb=15f8901ad04f57483aa081b0a6b1950a6d3cae5e;p=gosa.git diff --git a/plugins/admin/groups/class_groupGeneric.inc b/plugins/admin/groups/class_groupGeneric.inc index 1cfe9913e..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); $this->orig_dn= $dn; + $this->orig_cn= $this->cn; /* Get member list */ if (isset($this->attrs['memberUid'][0])){ @@ -75,6 +86,11 @@ class group extends plugin } else { $this->fon_group= TRUE; } + if (array_search ('nagiosContactGroup', $this->attrs['objectClass']) == NULL ){ + $this->nagios_group= FALSE; + } else { + $this->nagios_group= TRUE; + } } /* Set mail flag */ @@ -87,7 +103,7 @@ class group extends plugin $this->SID= preg_replace ("/-[^-]+$/", "", $this->sambaSID); $ldap= $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - $ldap->search ("(&(objectClass=sambaDomain)(sambaSID=$this->SID))"); + $ldap->search ("(&(objectClass=sambaDomain)(sambaSID=$this->SID))",array("sambaAlgorithmicRidBase")); if ($ldap->count() != 0){ $attrs= $ldap->fetch(); $this->ridBase= $attrs['sambaAlgorithmicRidBase'][0]; @@ -128,6 +144,24 @@ class group extends plugin } $gufilter= get_global('gufilter'); + $gufilter['SubSearchGroup'] = false; + $gufilter['dselect'] = $_SESSION['gufilter']['dselect']; + + register_global('gufilter',$gufilter); + + if ($this->dn == "new"){ + if(isset($_SESSION['CurrentMainBase'])){ + $this->base= $_SESSION['CurrentMainBase']; + }else{ + $ui= get_userinfo(); + $this->base= dn2base($ui->dn); + } + } else { + + /* Get object base */ + $this->base =preg_replace ("/^[^,]+,".normalizePreg(get_groups_ou())."/","",$this->dn); + } + /* This is always an account */ $this->is_account= TRUE; $this->reload(); @@ -135,9 +169,15 @@ class group extends plugin function execute() { - /* Do we represent a valid group? */ + /* Call parent execute */ + plugin::execute(); + + $ui= get_userinfo(); + $acla= get_permissions ($ui->dn, $ui->subtreeACL); + $this->acl= get_module_permission($acla, "group", $ui->dn); + /* Do we represent a valid group? */ if (!$this->is_account && $this->parent == NULL){ - $display= " ". + $display= "\"\" ". _("This 'dn' is no group.").""; return ($display); } @@ -173,7 +213,32 @@ class group extends plugin $this->reload(); } - /* Assign templating stuff */ + /* Base select dialog */ + $once = true; + foreach($_POST as $name => $value){ + if(preg_match("/^chooseBase/",$name) && $once){ + $once = false; + $this->dialog = new baseSelectDialog($this->config); + $this->dialog->setCurrentBase($this->base); + } + } + + /* Dialog handling */ + if(is_object($this->dialog)){ + /* Must be called before save_object */ + $this->dialog->save_object(); + + if($this->dialog->isClosed()){ + $this->dialog = false; + }elseif($this->dialog->isSelected()){ + $this->base = $this->dialog->isSelected(); + $this->dialog= false; + }else{ + return($this->dialog->execute()); + } + } + + /* Assign templating stuff */ $smarty= get_smarty(); if ($this->samba3){ $smarty->assign("samba3", "true"); @@ -181,6 +246,18 @@ class group extends plugin $smarty->assign("samba3", ""); } + if(search_config($this->config->data['MENU'], "nagiosaccount", "CLASS")){ + $smarty->assign("nagios",true); + }else{ + $smarty->assign("nagios",false); + } + + if(search_config($this->config->data['MENU'], "phoneAccount", "CLASS")){ + $smarty->assign("pickupGroup",true); + }else{ + $smarty->assign("pickupGroup",false); + } + /* Manage object add dialog */ if ($this->group_dialog){ @@ -191,6 +268,14 @@ class group extends plugin $gufilter[$type]= $_POST[$type]; } } + if(isset($_POST['regex'])){ + if(isset($_POST['SubSearchGroup'])){ + $gufilter['SubSearchGroup'] = true; + }else{ + $gufilter['SubSearchGroup'] = false; + } + } + if (isset($_GET['search'])){ $s= mb_substr($_GET['search'], 0, 1, "UTF8")."*"; if ($s == "**"){ @@ -198,7 +283,6 @@ class group extends plugin } $gufilter['regex']= $s; } - $regex= preg_replace('/[*]/', ".*", $gufilter['regex']); register_global("gufilter", $gufilter); $this->reload(); @@ -208,20 +292,11 @@ class group extends plugin $smarty->assign("tree_image", get_template_path('images/tree.png')); $smarty->assign("deplist", $this->config->idepartments); $smarty->assign("alphabet", generate_alphabet()); - foreach( array("dselect", "regex") as $type){ + foreach( array("dselect", "regex","SubSearchGroup") as $type){ $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); @@ -230,13 +305,6 @@ class group extends plugin /* Bases / Departments */ if (isset($_POST['base'])){ $this->base= $_POST['base']; - } else { - if ($this->dn == "new"){ - $ui= get_userinfo(); - $this->base= dn2base($ui->dn); - } else { - $this->base= preg_replace ("/^[^,]+,[^,]+,/", "", $this->dn); - } } $smarty->assign("bases", $this->config->idepartments); @@ -276,6 +344,8 @@ class group extends plugin } if ($this->force_gid != "1"){ $smarty->assign("forceMode", "disabled"); + }else{ + $smarty->assign("forceMode", ""); } $smarty->assign("force_gidACL", chkacl($this->acl, "gidNumber")); $smarty->assign("sambaDomainNameACL", chkacl($this->acl, "sambaDomainName")); @@ -286,6 +356,13 @@ class group extends plugin } $smarty->assign("fon_groupACL", chkacl($this->acl, "fon_group")); + if ($this->nagios_group){ + $smarty->assign("nagios_group", "checked"); + } else { + $smarty->assign("nagios_group", ""); + } + $smarty->assign("nagios_groupACL", chkacl($this->acl, "nagios_group")); + /* Fields */ foreach (array("cn", "description", "gidNumber") as $val){ $smarty->assign("$val", $this->$val); @@ -327,45 +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(); - $gufilter= get_global("gufilter"); - $ldap->cd ($gufilter['dselect']); - $ldap->search ("(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate))(!(uid=*$)))"); - natcasesort ($this->users); - reset ($this->users); + $ldap->cd($gufilter['dselect']); - $ldap->cd ($this->config->current['BASE']); - $ldap->search ("(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate))(!(uid=*$)))"); - $this->allusers= array(); - while ($attrs= $ldap->fetch()){ - 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]; + + /* 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).")"; } } - natcasesort ($this->allusers); - reset ($this->allusers); - - /* Fill memberlist */ - $this->members= array(); + 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->allusers[$value])){ - $this->members[$value]= $this->allusers[$value]; - } else { - $this->members[$value]= "[$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->search($filter, array("uid", "sn","givenName")); + }else{ + $ldap->ls ($filter, get_people_ou().$gufilter['dselect'],array("uid", "sn", "givenName")); + } + $i = 0; + + /* Fetch all users and skip already used users */ + while($attrs = $ldap->fetch()){ + if(in_array($attrs['uid'][0], $this->memberUid)) { + continue; + } + $i ++; + if($i > $MaxUser) { + break; + } + $this->allusers[$attrs['uid'][0]] = $this->createResultName($attrs); + $this->displayUsers[$attrs['uid'][0]] = $this->createResultName($attrs); } - asort($this->members); + + /* 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)); + } + + /* 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() { @@ -373,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']); @@ -394,6 +527,7 @@ class group extends plugin { /* Save additional values for possible next step */ if (isset($_POST['groupedit'])){ + plugin::save_object(); $this->force_gid= 0; @@ -420,7 +554,13 @@ class group extends plugin $this->fon_group= FALSE; } } - + if (chkacl ($this->acl, "nagios_group") == ""){ + if (isset ($_POST['nagios_group'])){ + $this->nagios_group= TRUE; + } else { + $this->nagios_group= FALSE; + } + } } } @@ -428,6 +568,7 @@ class group extends plugin /* Save to LDAP */ function save() { + /* ID handling */ if ($this->force_gid == 0){ if ($this->saved_gidNumber != ""){ @@ -447,7 +588,7 @@ class group extends plugin $this->gidNumber= $this->get_next_id("gidNumber"); } } - + plugin::save(); /* Remove objectClass for samba/phone support */ @@ -455,7 +596,8 @@ class group extends plugin for ($i= 0; $iattrs["objectClass"]); $i++){ if ($this->attrs['objectClass'][$i] != 'sambaGroupMapping' && $this->attrs['objectClass'][$i] != 'sambaIdmapEntry' && - $this->attrs['objectClass'][$i] != 'goFonPickupGroup'){ + $this->attrs['objectClass'][$i] != 'goFonPickupGroup' && + $this->attrs['objectClass'][$i] != 'nagiosContactGroup'){ $tmp[]= $this->attrs['objectClass'][$i]; } } @@ -464,8 +606,20 @@ class group extends plugin /* Add samba group functionality */ if ($this->samba3 && $this->smbgroup){ - $this->SID= $this->config->data['SERVERS']['SAMBA'][$this->sambaDomainName]['SID']; - $this->ridBase= $this->config->data['SERVERS']['SAMBA'][$this->sambaDomainName]['RIDBASE']; + + /* Fixed undefined index ... + */ + $this->SID = $this->ridBase = ""; + if(isset($this->config->data['SERVERS']['SAMBA'][$this->sambaDomainName]['SID'])){ + $this->SID = $this->config->data['SERVERS']['SAMBA'][$this->sambaDomainName]['SID']; + }else{ + print_red(sprintf(_("No configured SID found for '%s'."),$this->sambaDomainName)); + } + if(isset($this->config->data['SERVERS']['SAMBA'][$this->sambaDomainName]['RIDBASE'])){ + $this->ridBase= $this->config->data['SERVERS']['SAMBA'][$this->sambaDomainName]['RIDBASE']; + }else{ + print_red(sprintf(_("No configured RIDBASE found for '%s'."),$this->sambaDomainName)); + } $this->attrs['objectClass'][]= 'sambaGroupMapping'; $this->attrs['sambaGroupType']= "2"; @@ -478,7 +632,7 @@ class group extends plugin while(TRUE){ $sid= $this->SID."-".($gidNumber*2 + $this->ridBase+1); $ldap->cd($this->config->current['BASE']); - $ldap->search("(sambaSID=$sid)"); + $ldap->search("(sambaSID=$sid)",array("sambaSID")); if ($ldap->count() == 0){ break; } @@ -507,6 +661,11 @@ class group extends plugin $this->attrs['objectClass'][]= "goFonPickupGroup"; } + /* Add nagios functionality */ + if ($this->nagios_group){ + $this->attrs['objectClass'][]= "nagiosContactGroup"; + } + /* Take members array */ if (count ($this->memberUid)){ $this->attrs['memberUid']= array_unique($this->memberUid); @@ -519,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)){ @@ -540,10 +699,11 @@ class group extends plugin /* Write back to ldap */ $ldap->cd($this->dn); + $this->cleanup(); $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; } @@ -558,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 != ""){ @@ -568,9 +729,9 @@ class group extends plugin } $ui= get_userinfo(); - $acl= get_permissions ($new_dn, $ui->subtreeACL); - $acl= get_module_permission($acl, "group", $new_dn); - if (chkacl($acl, "create") != ""){ + $acl= get_permissions ($ui->dn, $ui->subtreeACL); + $acl= get_module_permission($acl, "group", $ui->dn); + if (chkacl($this->acl, "create") != ""){ $message[]= _("You have no permissions to create a group on this 'Base'."); } @@ -584,26 +745,42 @@ class group extends plugin $message[]= _("The field 'Name' contains invalid characters. Lowercase, numbers and dashes are allowed."); } - /* Check for used 'cn' */ - $ldap= $this->config->get_ldap_link(); - $ldap->cd($this->config->current['BASE']); - $ldap->search("(&(|(objectClass=gosaGroupOfNames)(objectClass=posixGroup))(cn=$this->cn))"); - if ($ldap->count() != 0){ - - /* New entry? */ - if ($this->dn == 'new'){ - $message[]= _("Value specified as 'Name' is already used."); - } - - /* Moved? */ - elseif ($new_dn != $this->orig_dn){ - $ldap->fetch(); - if ($ldap->getDN() != $this->orig_dn){ + + if($this->allowGroupsWithSameNameInOtherSubtrees == true){ + + /* Check for used 'cn' */ + $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))",get_groups_ou().$this->base,array("cn")); + if ($ldap->count() != 0){ $message[]= _("Value specified as 'Name' is already used."); } } - } + }else{ + + /* Check for used 'cn' */ + $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->search("(&(|(objectClass=gosaGroupOfNames)(objectClass=posixGroup))(cn=$this->cn))",array("cn")); + if ($ldap->count() != 0){ + + /* New entry? */ + if ($this->dn == 'new'){ + $message[]= _("Value specified as 'Name' is already used."); + } + + /* Moved? */ + elseif ($new_dn != $this->orig_dn){ + $ldap->fetch(); + if ($ldap->getDN() != $this->orig_dn){ + $message[]= _("Value specified as 'Name' is already used."); + } + } + } + } + /* Check ID */ if ($this->force_gid == "1"){ if (!is_id($this->gidNumber)){ @@ -625,7 +802,12 @@ class group extends plugin $ldap= $this->config->get_ldap_link(); $ldap->cd ($this->config->current['BASE']); - $ldap->search ("($attrib=*)"); + if (preg_match('/gidNumber/i', $attrib)){ + $oc= "posixGroup"; + } else { + $oc= "posixAccount"; + } + $ldap->search ("(&(objectClass=$oc)($attrib=*))", array("$attrib")); /* Get list of ids */ while ($attrs= $ldap->fetch()){ @@ -633,19 +815,56 @@ 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; } } + function getCopyDialog() + { + $vars = array("cn"); + + if($this ->force_gid){ + $used = " checked "; + $dis = ""; + }else{ + $used = ""; + $dis = " disabled "; + } + + $smarty = get_smarty(); + $smarty->assign("used",$used); + $smarty->assign("dis" ,$dis); + $smarty->assign("cn" ,$this->cn); + $smarty->assign("gidNumber",$this->gidNumber); + $str = $smarty->fetch(get_template_path("paste_generic.tpl",TRUE)); + $ret = array(); + $ret['string'] = $str; + $ret['status'] = ""; + return($ret); + } + + function saveCopyDialog() + { + if(isset($_POST['cn'])){ + $this->cn = $_POST['cn']; + } + if(isset($_POST['force_gid'])){ + $this->force_gid = 1; + $this->gidNumber= $_POST['gidNumber']; + }else{ + $this->force_gid = 0; + $this->gidNumber = false; + } + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: