X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fadmin%2Fogroups%2Fclass_ogroup.inc;h=7b79378f378894218e6a5fdc23e9752f1204781d;hb=1e220f70c31a04aa91e49ec9b6d16db1aec3b729;hp=f7312d2345017003c6d3040f9a38aabc876dc79a;hpb=08f024d57211beef5886f6ddf6bf4afb2772cb4c;p=gosa.git diff --git a/plugins/admin/ogroups/class_ogroup.inc b/plugins/admin/ogroups/class_ogroup.inc index f7312d234..7b79378f3 100644 --- a/plugins/admin/ogroups/class_ogroup.inc +++ b/plugins/admin/ogroups/class_ogroup.inc @@ -25,14 +25,14 @@ class ogroup extends plugin var $gosaGroupObjects= ""; var $department= ""; var $objects= array(); - var $allobjects= array(); + var $objcache= array(); var $memberList= array(); var $member= array(); var $orig_dn= ""; var $group_dialog= FALSE; /* attribute list for save action */ - var $attributes= array("cn", "description", "gosaGroupObjects"); + var $attributes= array("cn", "description", "gosaGroupObjects","member"); var $objectclasses= array("top", "gosaGroupOfNames"); function ogroup ($config, $dn= NULL) @@ -40,10 +40,13 @@ class ogroup extends plugin plugin::plugin ($config, $dn); $this->orig_dn= $dn; + $this->member = array(); + /* Load member objects */ if (isset($this->attrs['member'])){ foreach ($this->attrs['member'] as $key => $value){ if ("$key" != "count"){ + $value= @LDAP::convert($value); $this->member["$value"]= "$value"; } } @@ -69,6 +72,7 @@ class ogroup extends plugin "W" => "workstations", "T" => "terminals", "F" => "phones", + "_" => "subtrees", "P" => "printers") as $key => $val){ if (preg_match("/$key/", $this->gosaGroupObjects)){ @@ -78,45 +82,66 @@ class ogroup extends plugin } } register_global("ogfilter", $ogfilter); - - if(isset($_SESSION['ogroupfilter']['depselect'])){ - $this->base = $_SESSION['ogroupfilter']['depselect']; + + /* Set base */ + if ($this->dn == "new"){ + $this->base= $_SESSION['CurrentMainBase']; + } else { + $this->base= preg_replace("/^[^,]+,".get_groups_ou()."/","",$this->dn); } + /* set permissions */ + $ui= get_userinfo(); + $acl= get_permissions ($ui->dn, $ui->subtreeACL); + $this->acl= get_module_permission($acl, "ogroup", $ui->dn); + /* Load member data */ $this->reload(); } - function AddDelMembership(){ - /* Delete objects from group */ - if (isset($_POST['delete_membership']) && isset($_POST['members'])){ - foreach ($_POST['members'] as $value){ - $this->objects["$value"]= $this->memberList[$value]; - unset ($this->memberList["$value"]); - unset ($this->member["$value"]); - uasort ($this->objects, 'sort_list'); - reset ($this->objects); - } + function AddDelMembership($NewMember = false) + { + if($NewMember){ + $this->importMember($NewMember); + $this->memberList[$NewMember]= $this->objcache[$NewMember]; + $this->member[$NewMember]= $NewMember; + unset ($this->objects[$NewMember]); + uasort ($this->memberList, 'sort_list'); + reset ($this->memberList); $this->reload(); - } + }else{ + /* Delete objects from group */ + if (isset($_POST['delete_membership']) && isset($_POST['members']) && chkacl($this->acl,"gosaGroupObjects") == ""){ + foreach ($_POST['members'] as $value){ + $this->objects["$value"]= $this->memberList[$value]; + unset ($this->memberList["$value"]); + unset ($this->member["$value"]); + uasort ($this->objects, 'sort_list'); + reset ($this->objects); + } + $this->reload(); + } - /* Add objects to group */ - if (isset($_POST['add_object_finish']) && isset($_POST['objects'])){ - foreach ($_POST['objects'] as $value){ - $this->memberList["$value"]= $this->objects[$value]; - $this->member["$value"]= $value; - unset ($this->objects[$value]); - uasort ($this->memberList, 'sort_list'); - reset ($this->memberList); + /* Add objects to group */ + if (isset($_POST['add_object_finish']) && isset($_POST['objects']) && chkacl($this->acl,"gosaGroupObjects") == ""){ + foreach ($_POST['objects'] as $value){ + $this->memberList["$value"]= $this->objects[$value]; + $this->member["$value"]= $value; + unset ($this->objects[$value]); + uasort ($this->memberList, 'sort_list'); + reset ($this->memberList); + } + $this->reload(); } - $this->reload(); } } function execute() { - - $this->reload(); + /* Call parent execute */ + plugin::execute(); + +// $this->reload(); /* Do we represent a valid group? */ if (!$this->is_account){ @@ -126,7 +151,7 @@ class ogroup extends plugin } /* Delete objects from group */ - if (isset($_POST['delete_membership']) && isset($_POST['members'])){ + if (isset($_POST['delete_membership']) && isset($_POST['members']) && chkacl($this->acl,"gosaGroupObjects") == ""){ foreach ($_POST['members'] as $value){ if(isset($this->memberList[$value])){ $this->objects["$value"]= $this->memberList[$value]; @@ -156,8 +181,33 @@ class ogroup extends plugin /* Load templating engine */ $smarty= get_smarty(); + /* Base select dialog */ + $once = true; + foreach($_POST as $name => $value){ + if(preg_match("/^chooseBase/",$name) && $once && chkacl($this->acl,"base") == ""){ + $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()); + } + } + /* Add objects? */ - if (isset($_POST["edit_membership"])){ + if (isset($_POST["edit_membership"]) && chkacl($this->acl,"gosaGroupObjects") == ""){ $this->group_dialog= TRUE; $this->dialog= TRUE; } @@ -180,7 +230,7 @@ class ogroup extends plugin } if (isset($_POST['dselect'])){ foreach( array("accounts", "groups", "applications", "departments", - "servers", "workstations", "terminals", "printers", + "servers", "workstations", "terminals", "printers","subtrees", "phones") as $type){ if (isset($_POST[$type])) { @@ -210,7 +260,7 @@ class ogroup extends plugin $smarty->assign("deplist", $this->config->idepartments); $smarty->assign("alphabet", generate_alphabet()); foreach( array("dselect", "regex", "accounts", "groups", "applications", - "departments", "servers", "workstations", "terminals", + "departments", "servers", "workstations", "terminals","subtrees", "printers", "phones") as $type){ $smarty->assign("$type", $ogfilter[$type]); } @@ -222,10 +272,9 @@ class ogroup extends plugin } /* Bases / Departments */ - - if (isset($_POST['base'])){ - $this->base= $_POST['base']; - } + if (isset($_POST['base']) && chkacl($this->acl,"base") == ""){ + $this->base= $_POST['base']; + } /* Assemble combine string */ if ($this->gosaGroupObjects == "[]"){ @@ -289,7 +338,6 @@ class ogroup extends plugin if (chkacl ($this->acl, "base") == "" && isset($_POST["base"])){ $this->base= $_POST["base"]; } - } } @@ -297,125 +345,112 @@ class ogroup extends plugin /* (Re-)Load objects */ function reload() { - /* Generate object list */ - $this->objects= array(); - $this->allobjects= array(); + /*########### + Variable initialisation + ###########*/ + + $this->objects = array(); + $this->ui = get_userinfo(); + $filter = ""; + $objectClasses = array(); + + $ogfilter = get_global("ogfilter"); + $regex = $ogfilter['regex']; + + /* Get ldap connection */ $ldap= $this->config->get_ldap_link(); + $ldap->cd ($ogfilter['dselect']); - /* Assemble filter */ - $ogfilter= get_global("ogfilter"); - $ldap->cd ($ogfilter['dselect']); + /*########### + Generate Filter + ###########*/ - $filter= ""; + /* Assemble filter */ if ($ogfilter['accounts'] == "checked"){ $filter.= "(objectClass=gosaAccount)"; + $objectClasses["gosaAccount"] = get_people_ou(); } if ($ogfilter['groups'] == "checked"){ $filter.= "(objectClass=posixGroup)"; + $objectClasses["posixGroup"] = get_groups_ou(); } if ($ogfilter['applications'] == "checked"){ $filter.= "(objectClass=gosaApplication)"; + $objectClasses["gosaApplication"] = "ou=apps,"; } if ($ogfilter['departments'] == "checked"){ $filter.= "(objectClass=gosaDepartment)"; + $objectClasses["gosaDepartment"] = ""; } if ($ogfilter['servers'] == "checked"){ $filter.= "(objectClass=goServer)"; + $objectClasses["goServer"] = "ou=servers,ou=systems,"; } if ($ogfilter['workstations'] == "checked"){ $filter.= "(objectClass=gotoWorkstation)"; + $objectClasses["gotoWorkstation"] = "ou=workstations,ou=systems,"; } if ($ogfilter['terminals'] == "checked"){ $filter.= "(objectClass=gotoTerminal)"; + $objectClasses["gotoTerminal"] = "ou=terminals,ou=systems,"; } if ($ogfilter['printers'] == "checked"){ $filter.= "(objectClass=gotoPrinter)"; + + $objectClasses["gotoPrinter"] = "ou=printers,ou=systems,"; } if ($ogfilter['phones'] == "checked"){ $filter.= "(objectClass=goFonHardware)"; + $objectClasses["goFonHardware"] = "ou=phones,ou=systems,"; } - $regex= $ogfilter['regex']; - $ldap->search ("(&(|$filter)(|(uid=$regex)(cn=$regex)(ou=$regex)))", array("dn", "cn", "ou", "description", "objectClass", "sn", "givenName", "uid")); - while ($attrs= $ldap->fetch()){ - /* Get type */ - $type= $this->getObjectType($attrs); - $name= $this->getObjectName($attrs); + /*########### + Perform search for selected objectClasses & regex to fill list with objects + ###########*/ - /* Fill array */ - if (isset($attrs["description"][0])){ - $this->objects[$attrs["dn"]]= array("text" => "$name [".$attrs["description"][0]."]", "type" => "$type"); - } elseif (isset($attrs["uid"][0])) { - $this->objects[$attrs["dn"]]= array("text" => "$name [".$attrs["uid"][0]."]", "type" => "$type"); - } else { - $this->objects[$attrs["dn"]]= array("text" => "$name", "type" => "$type"); + /* Perform search for selected objectClasses */ + foreach($objectClasses as $class=> $basedn){ + + if($ogfilter['subtrees'] == "checked"){ + $ldap->cd($ogfilter['dselect']); + $ldap->search("(&(objectClass=".$class.")(|(uid=$regex)(cn=$regex)(ou=$regex)))", + array("dn", "cn", "description", "objectClass", "sn", "givenName", "uid","ou")); + }else{ + $ldap->ls("(&(objectClass=".$class.")(|(uid=$regex)(cn=$regex)(ou=$regex)))",$basedn.$ogfilter['dselect'] , + array("dn", "cn", "description", "objectClass", "sn", "givenName", "uid","ou")); + } + + /* fetch results and append them to the list */ + while($attrs = $ldap->fetch()){ + + $type= $this->getObjectType($attrs); + $name= $this->getObjectName($attrs); + + /* Fill array */ + if (isset($attrs["description"][0])){ + $this->objects[$attrs["dn"]]= array("text" => "$name [".$attrs["description"][0]."]", "type" => "$type"); + } elseif (isset($attrs["uid"][0])) { + $this->objects[$attrs["dn"]]= array("text" => "$name [".$attrs["uid"][0]."]", "type" => "$type"); + } else { + $this->objects[$attrs["dn"]]= array("text" => "$name", "type" => "$type"); + } } } uasort ($this->objects, 'sort_list'); reset ($this->objects); - $ldap->cd ($this->config->current['BASE']); - $filter= "(objectClass=gosaAccount)(objectClass=posixGroup)(objectClass=gosaApplication)(objectClass=gosaDepartment)(objectClass=goServer)(objectClass=gotoWorkstation)(objectClass=gotoTerminal)(objectClass=gotoPrinter)(objectClass=goFonHardware)"; - $regex= "*"; - - $ldap->search ("(&(|$filter)(|(uid=$regex)(cn=$regex)(ou=$regex)))", array("dn", "cn", "ou", "description", "objectClass", "sn", "givenName", "uid")); - while ($attrs= $ldap->fetch()){ - - /* Get type */ - $type= $this->getObjectType($attrs); - $name= $this->getObjectName($attrs); - - /* Fill array */ - if (isset($attrs["description"][0])){ - $this->allobjects[$attrs["dn"]]= array("text" => "$name [".$attrs["description"][0]."]", "type" => "$type"); - } elseif (isset($attrs["uid"][0])) { - $this->allobjects[$attrs["dn"]]= array("text" => "$name [".$attrs["uid"][0]."]", "type" => "$type"); - } else { - $this->allobjects[$attrs["dn"]]= array("text" => "$name", "type" => "$type"); - } - $this->allobjects[$attrs["dn"]]['objectClass'] = $attrs['objectClass']; - if(isset($attrs['uid'])){ - $this->allobjects[$attrs["dn"]]['uid'] = $attrs['uid']; - } - } - uasort ($this->allobjects, 'sort_list'); - reset ($this->allobjects); + + /*########### + Build member list and try to detect obsolete entries + ###########*/ - /* Build member list */ - $this->memberList= array(); + $this->memberList = array(); + + /* Walk through all single member entry */ foreach($this->member as $dn){ - - /* Object in object list? */ - if (isset($this->allobjects[$dn])){ - $this->memberList[$dn]= $this->allobjects[$dn]; - if (isset ($this->objects[$dn])){ - unset ($this->objects[$dn]); - } - - } else { - - /* No, try to ge informations from LDAP */ - $ldap->cat($dn, array("cn", "sn", "givenName", "ou", "description", "objectClass")); - if ($ldap->error != "success"){ - $this->memberList[$dn]= array('text' => _("Non existing dn: ")."$dn", - "type" => "I"); - } else { - $ldap->cat($dn); - $attrs= $ldap->fetch(); - $type= $this->getObjectType($attrs); - $name= $this->getObjectName($attrs); - - /* Fill array */ - if (isset($attrs["description"][0])){ - $this->objects[$attrs["dn"]]= array("text" => "$name [".$attrs["description"][0]."]", "type" => "$type"); - } else { - $this->objects[$attrs["dn"]]= array("text" => "$name", "type" => "$type"); - } - - } - } + $this->importMember($dn); } uasort ($this->memberList, 'sort_list'); reset ($this->memberList); @@ -438,6 +473,48 @@ class ogroup extends plugin } + function importMember($dn) + { + $ldap= $this->config->get_ldap_link(); + + /* Try to resolv the entry again, if it still fails, display error msg */ + $ldap->cat($dn, array("cn", "sn", "givenName", "ou", "uid", "description", "objectClass")); + + /* It has failed, add entry with type flag I (Invalid)*/ + if ($ldap->error != "Success"){ + $this->memberList[$dn]= array('text' => _("Non existing dn:")." ".@LDAP::fix($dn),"type" => "I"); + } else { + /* Append this entry to our all object list */ + + /* Fetch object */ + $attrs= $ldap->fetch(); + + $type= $this->getObjectType($attrs); + $name= $this->getObjectName($attrs); + + if (isset($attrs["description"][0])){ + $this->objcache[$attrs["dn"]]= array("text" => "$name [".$attrs["description"][0]."]", "type" => "$type"); + } elseif (isset($attrs["uid"][0])) { + $this->objcache[$attrs["dn"]]= array("text" => "$name [".$attrs["uid"][0]."]", "type" => "$type"); + } else { + $this->objcache[$attrs["dn"]]= array("text" => "$name", "type" => "$type"); + } + $this->objcache[$attrs["dn"]]['objectClass'] = $attrs['objectClass']; + if(isset($attrs['uid'])){ + $this->objcache[$attrs["dn"]]['uid'] = $attrs['uid']; + } + + /* Fill array */ + if (isset($attrs["description"][0])){ + $this->objects[$attrs["dn"]]= array("text" => "$name [".$attrs["description"][0]."]", "type" => "$type"); + } else { + $this->objects[$attrs["dn"]]= array("text" => "$name", "type" => "$type"); + } + + $this->memberList[$dn]= $this->objects[$attrs["dn"]]; + } + } + function convert_list($input) { $temp= ""; @@ -454,7 +531,7 @@ class ogroup extends plugin foreach ($input as $key => $value){ /* Generate output */ - $temp.= "\n"; + $temp.= "\n"; } return ($temp); @@ -487,6 +564,7 @@ class ogroup extends plugin function getObjectName($attrs) { /* Person? */ + $name =""; if (in_array('gosaAccount', $attrs['objectClass'])){ if(isset($attrs['sn']) && isset($attrs['givenName'])){ $name= $attrs['sn'][0].", ".$attrs['givenName'][0]; @@ -507,7 +585,8 @@ class ogroup extends plugin function check() { - $message= array(); + /* Call common method to give check the hook */ + $message= plugin::check(); /* Permissions for that base? */ if ($this->base != ""){ @@ -516,10 +595,20 @@ class ogroup extends plugin $new_dn= $this->dn; } + + $ldap = $this->config->get_ldap_link(); + if($this->dn != $new_dn){ + $ldap->cat ($new_dn, array('dn')); + } + + if($ldap->count() !=0){ + $message[]= _("There is already an object with this cn."); + } + $ui= get_userinfo(); $acl= get_permissions ($new_dn, $ui->subtreeACL); $acl= get_module_permission($acl, "group", $new_dn); - if (chkacl($acl, "create") != ""){ + if (chkacl($acl, "create") != "" && $this->dn=="new"){ $message[]= _("You have no permissions to create a group on this 'Base'."); } @@ -543,8 +632,9 @@ class ogroup extends plugin plugin::save(); /* Move members to target array */ + $this->attrs['member'] =array(); foreach ($this->member as $key => $desc){ - $this->attrs['member'][]= $key; + $this->attrs['member'][]= @LDAP::fix($key); } $ldap= $this->config->get_ldap_link(); @@ -556,7 +646,7 @@ class ogroup 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->member)){ @@ -571,13 +661,14 @@ class ogroup extends plugin /* Write back to ldap */ $ldap->cd($this->dn); + $this->cleanup(); $ldap->$mode($this->attrs); /* Trigger post signal */ $this->handle_post_events($mode); $ret= 0; - if (show_ldap_error($ldap->get_error())){ + if (show_ldap_error($ldap->get_error(), _("Saving object group failed"))){ $ret= 1; } @@ -590,12 +681,31 @@ class ogroup 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 object group failed")); /* Trigger remove signal */ $this->handle_post_events("remove"); } + function getCopyDialog() + { + $str = ""; + + $smarty = get_smarty(); + $smarty->assign("cn", $this->cn); + $str = $smarty->fetch(get_template_path("paste_generic.tpl",TRUE,dirname(__FILE__))); + $ret = array(); + $ret['string'] = $str; + $ret['status'] = ""; + return($ret); + } + + function saveCopyDialog() + { + if(isset($_POST['cn'])){ + $this->cn = $_POST['cn']; + } + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: