X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=gosa-core%2Fplugins%2Fadmin%2Fdepartments%2Fclass_departmentGeneric.inc;h=78e514f1e2af041e3b302cd4d85cb3c5cc4e9713;hb=10100c5c8d92e45a0719bc321a3767f65966d9d7;hp=e1d637d15b48c5c38f7e6e63a7a6d88a63351f80;hpb=0c5f131e68d9de99c8011ca2b6d66830af5749fc;p=gosa.git diff --git a/gosa-core/plugins/admin/departments/class_departmentGeneric.inc b/gosa-core/plugins/admin/departments/class_departmentGeneric.inc index e1d637d15..78e514f1e 100644 --- a/gosa-core/plugins/admin/departments/class_departmentGeneric.inc +++ b/gosa-core/plugins/admin/departments/class_departmentGeneric.inc @@ -1,21 +1,23 @@ get_ldap_link(); + $ldap->cd($config->current['BASE']); + if($dn == "" || $dn == "new" || !$ldap->dn_exists($dn)){ + $this->objectclasses = array_merge($this->structuralOC,$this->objectclasses); + }else{ + $ldap->cat($dn, array("structuralObjectClass")); + $attrs= $ldap->fetch(); + if(isset($attrs['structuralObjectClass']['count'])){ + for($i = 0 ; $i < $attrs['structuralObjectClass']['count'] ; $i++){ + $this->objectclasses[] = $attrs['structuralObjectClass'][$i]; + } + }else{ + + /* Could not detect structural object class for this object, fall back to the default 'locality' + */ + $this->objectclasses = array_merge($this->structuralOC,$this->objectclasses); + } + } + $this->objectclasses = array_unique($this->objectclasses); plugin::plugin($config, $dn); $this->is_account= TRUE; $this->ui= get_userinfo(); $this->dn= $dn; $this->orig_dn= $dn; - $this->orig_ou= $this->ou; + + /* Save current naming attribuet + */ + $nA = $this->namingAttr; + $orig_nA = "orig_".$nA; + $this->$orig_nA = $this->$nA; + $this->config= $config; /* Set base */ @@ -113,6 +136,15 @@ class department extends plugin $smarty->assign($name."ACL",$this->getacl($name)); } + /* Hide base selector, if this object represents the base itself + */ + $smarty->assign("is_root_dse", FALSE); + if($this->dn == $this->config->current['BASE']){ + $smarty->assign("is_root_dse", TRUE); + $nA = $this->namingAttr."ACL"; + $smarty->assign($nA,$this->getacl($this->namingAttr,TRUE)); + } + /* Base select dialog */ $once = true; foreach($_POST as $name => $value){ @@ -151,9 +183,8 @@ class department extends plugin }else{ $tmp = array(); foreach($bases as $dn=>$base){ - $fixed = str_replace("/","\\",$this->dn); /* Only attach departments which are not a subtree of this one */ - if(!preg_match("/".$fixed."/",$dn)){ + if(!preg_match("/".preg_quote($this->dn)."/",$dn)){ $tmp[$dn]=$base; } } @@ -166,16 +197,28 @@ class department extends plugin $smarty->assign("base_select", $this->base); /* Set admin unit flag */ - $smarty->assign("UnitTagDiabled",$this->UnitTagDiabled); - if(!$this->UnitTagDiabled){ - if ($this->is_administrational_unit) { - $smarty->assign("unitTag", "checked"); - } else { - $smarty->assign("unitTag", ""); - } + if ($this->is_administrational_unit) { + $smarty->assign("gosaUnitTag", "checked"); + } else { + $smarty->assign("gosaUnitTag", ""); } - return($smarty->fetch (get_template_path('generic.tpl', TRUE))); + $smarty->assign("dep_type",$this->type); + + + $dep_types = departmentManagement::get_support_departments(); + $tpl =""; + foreach($dep_types as $key => $data){ + if($data['OC'] == $this->type){ + $tpl = $data['TPL']; + break; + } + } + if($tpl == "") { + trigger_error("No template specified for container type '".$this->type."', please update epartmentManagement::get_support_departments()."); + $tpl = "generic.tpl"; + } + return($smarty->fetch (get_template_path($tpl, TRUE))); } function clear_fields() @@ -192,9 +235,11 @@ class department extends plugin { $ldap= $this->config->get_ldap_link(); $ldap->cd ($this->dn); - $ldap->recursive_remove(); + $ldap->rmdir_recursive($this->dn); new log("remove","department/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); - show_ldap_error($ldap->get_error(), sprintf(_("Removing of department with dn '%s' failed."),$this->dn)); + if (!$ldap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_DEL, get_class())); + } /* Optionally execute a command after we're done */ $this->handle_post_events('remove'); @@ -205,16 +250,15 @@ class department extends plugin return $this->must_be_tagged; } - function am_i_moved() - { - return $this->rec_cpy; - } - - /* Save data to object */ function save_object() { - if (isset($_POST['dep_generic_posted'])){ + if (isset($_POST['dep_generic_posted'])){ + + $nA = $this->namingAttr; + $old_nA = $this->$nA; + + /* Create a base backup and reset the base directly after calling plugin::save_object(); @@ -232,15 +276,20 @@ class department extends plugin } /* Save tagging flag */ - if(!$this->UnitTagDiabled){ - if ($this->acl_is_writeable("unitTag")){ - if (isset($_POST['unitTag'])){ - $this->is_administrational_unit= true; - } else { - $this->is_administrational_unit= false; - } + if ($this->acl_is_writeable("gosaUnitTag")){ + if (isset($_POST['is_administrational_unit'])){ + $this->is_administrational_unit= true; + } else { + $this->is_administrational_unit= false; } } + + /* If this is the root directory service entry then avoid + changing the naming attribute of this entry. + */ + if($this->dn == $this->config->current['BASE']){ + $this->$nA = $old_nA; + } } } @@ -255,34 +304,42 @@ class department extends plugin $ldap= $this->config->get_ldap_link(); $ldap->ls ("(&(ou=".$this->ou.")(objectClass=organizationalUnit))", $this->base, array('dn')); if ($this->orig_dn == "new" && $ldap->count()){ - $message[]= _("Department with that 'Name' already exists."); - } elseif ($this->orig_dn != $this->dn && !($attrs === FALSE)){ - $message[]= _("Department with that 'Name' already exists."); + $message[]= msgPool::duplicated(_("Name")); + } elseif ($this->orig_dn != $this->dn && $ldap->count()){ + $message[]= msgPool::duplicated(_("Name")); } /* All required fields are set? */ if ($this->ou == ""){ - $message[]= _("Required field 'Name' is not set."); + $message[]= msgPool::required(_("Name")); } if ($this->description == ""){ - $message[]= _("Required field 'Description' is not set."); + $message[]= msgPool::required(_("Description")); } if(tests::is_department_name_reserved($this->ou,$this->base)){ - $message[]= sprintf(_("The field 'Name' contains the reserved word '%s'. Please choose another name."),$this->ou); + $message[]= msgPool::reserved(_("Name")); } if (preg_match ('/[#+:=>\\\\\/]/', $this->ou)){ - $message[]= _("The field 'Name' contains invalid characters."); + $message[]= msgPool::invalid(_("Name"), $this->ou, "/[^#+:=>\\\\\/]/"); } if (!tests::is_phone_nr($this->telephoneNumber)){ - $message[]= _("The field 'Phone' contains an invalid phone number."); + $message[]= msgPool::invalid(_("Phone"), $this->telephoneNumber, "/[\/0-9 ()+*-]/"); } if (!tests::is_phone_nr($this->facsimileTelephoneNumber)){ - $message[]= _("The field 'Fax' contains an invalid phone number."); + $message[]= msgPool::invalid(_("Fax"), $this->facsimileTelephoneNumber, "/[\/0-9 ()+*-]/"); } - return $message; + /* Check if we are allowed to create or move this object + */ + if($this->orig_dn == "new" && !$this->acl_is_createable($this->base)){ + $message[] = msgPool::permCreate(); + }elseif($this->orig_dn != "new" && $this->base != $this->orig_base && !$this->acl_is_moveable($this->base)){ + $message[] = msgPool::permMove(); + } + + return $message; } @@ -291,79 +348,74 @@ class department extends plugin { $ldap= $this->config->get_ldap_link(); - if(!$this->UnitTagDiabled){ + /* Ensure that ou is saved too, it is required by objectClass gosaDepartment + */ + $nA = $this->namingAttr; + $this->ou = $this->$nA; - /* Add tag objects if needed */ - if ($this->is_administrational_unit){ + /* Add tag objects if needed */ + if ($this->is_administrational_unit){ - /* If this wasn't tagged before add oc an reset unit tag */ - if(!$this->initially_was_tagged){ - $this->objectclasses[]= "gosaAdministrativeUnit"; - $this->gosaUnitTag= ""; + /* If this wasn't tagged before add oc an reset unit tag */ + if(!$this->initially_was_tagged){ + $this->objectclasses[]= "gosaAdministrativeUnit"; + $this->gosaUnitTag= ""; - /* It seams that this method is called twice, - set this to true. to avoid adding this oc twice */ - $this->initially_was_tagged = true; - } + /* It seams that this method is called twice, + set this to true. to avoid adding this oc twice */ + $this->initially_was_tagged = true; + } - if ($this->gosaUnitTag == ""){ + if ($this->gosaUnitTag == ""){ - /* It's unlikely, but check if already used... */ - $try= 5; - $ldap->cd($this->config->current['BASE']); - while ($try--){ + /* It's unlikely, but check if already used... */ + $try= 5; + $ldap->cd($this->config->current['BASE']); + while ($try--){ - /* Generate microtime stamp as tag */ - list($usec, $sec)= explode(" ", microtime()); - $time_stamp= preg_replace("/\./", "", $sec.$usec); + /* Generate microtime stamp as tag */ + list($usec, $sec)= explode(" ", microtime()); + $time_stamp= preg_replace("/\./", "", $sec.$usec); - $ldap->search("(&(objectClass=gosaAdministrativeUnit)(gosaUnitTag=$time_stamp))",array("gosaUnitTag")); - if ($ldap->count() == 0){ - break; - } - } - if($try == 0) { - print_red(_("Fatal error: Can't find an unused tag to mark the administrative unit!")); - return; + $ldap->search("(&(objectClass=gosaAdministrativeUnit)(gosaUnitTag=$time_stamp))",array("gosaUnitTag")); + if ($ldap->count() == 0){ + break; } - $this->gosaUnitTag= preg_replace("/\./", "", $sec.$usec); } + if($try == 0) { + msg_dialog::display(_("Fatal error"), _("Cannot find an unused tag for this administrative unit!"), WARNING_DIALOG); + return; + } + $this->gosaUnitTag= preg_replace("/\./", "", $sec.$usec); } } - plugin::save(); + $this->skipTagging = TRUE; + plugin::save(); - if(!$this->UnitTagDiabled){ + /* Remove tag information if needed */ + if (!$this->is_administrational_unit && $this->initially_was_tagged){ + $tmp= array(); - /* Remove tag information if needed */ - if (!$this->is_administrational_unit){ - $tmp= array(); - - /* Remove gosaAdministrativeUnit from this plugin */ - $has_unit_tag= false; - foreach($this->attrs['objectClass'] as $oc){ - if (!preg_match("/^gosaAdministrativeUnit$/i", $oc)){ - $tmp[]= $oc; - } - if (preg_match("/^gosaAdministrativeUnitTag$/i", $oc)){ - $has_unit_tag= true; - } + /* Remove gosaAdministrativeUnit from this plugin */ + foreach($this->attrs['objectClass'] as $oc){ + if (preg_match("/^gosaAdministrativeUnitTag$/i", $oc)){ + continue; } - $this->attrs['objectClass']= $tmp; - - if(!$has_unit_tag && isset($this->attrs['gosaUnitTag'])){ - $this->attrs['gosaUnitTag']= array(); + if (!preg_match("/^gosaAdministrativeUnit$/i", $oc)){ + $tmp[]= $oc; } - $this->gosaUnitTag = ""; } + $this->attrs['objectClass']= $tmp; + $this->attrs['gosaUnitTag']= array(); + $this->gosaUnitTag = ""; } + /* Write back to ldap */ - $ldap= $this->config->get_ldap_link(); $ldap->cat($this->dn, array('dn')); - $a= $ldap->fetch(); $ldap->cd($this->dn); - if (count($a)){ + if ($ldap->count()){ $this->cleanup(); $ldap->modify ($this->attrs); new log("modify","department/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); @@ -373,19 +425,13 @@ class department extends plugin $this->handle_post_events('add'); new log("create","department/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error()); } - show_ldap_error($ldap->get_error(), sprintf(_("Saving of department with dn '%s' failed."),$this->dn)); - - - if(!$this->UnitTagDiabled){ - /* The parameter forces only to set must_be_tagged, and don't touch any objects - This will be done later */ - $this->tag_objects(true); - - /* Fix tagging if needed */ - if (!$this->is_administrational_unit){ - $this->handle_object_tagging(); - } + if (!$ldap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, 0, get_class())); } + + /* The parameter forces only to set must_be_tagged, and don't touch any objects + This will be done later */ + $this->tag_objects(true); /* Optionally execute a command after we're done */ $this->postcreate(); @@ -393,24 +439,6 @@ class department extends plugin } - function ShowMoveFrame() - { - $smarty = get_smarty(); - $smarty->assign("src","?plug=".$_GET['plug']."&PerformRecMove"); - $smarty->assign("message","As soon as the move operation has finished, you can scroll down to end of the page and press the 'Continue' button to continue with the department management dialog."); - $display= $smarty->fetch(get_template_path("dep_iframe.tpl",TRUE)); - return($display); - } - - function ShowTagFrame() - { - $smarty = get_smarty(); - $smarty->assign("src","?plug=".$_GET['plug']."&TagDepartment"); - $smarty->assign("message","As soon as the tag operation has finished, you can scroll down to end of the page and press the 'Continue' button to continue with the department management dialog."); - $display= $smarty->fetch(get_template_path("dep_iframe.tpl",TRUE)); - return($display); - } - /* Tag objects to have the gosaAdministrativeUnitTag */ function tag_objects($OnlySetTagFlag = false) { @@ -426,56 +454,68 @@ class department extends plugin
'; - echo "'; - echo ""; + $this->must_be_tagged = FALSE; + echo '
'; + echo "
'; + echo '
'; - echo ""; + echo ""; - echo "" ; - echo ""; + echo "" ; + echo ""; - return (TRUE); - } - } + return (TRUE); + } /* Return plugin informations for acl handling */ @@ -588,23 +611,134 @@ class department extends plugin "plSelfModify" => FALSE, "plPriority" => 0, "plDepends" => array(), - "plSection" => array("admin"), + "plSection" => array("administration"), "plCategory" => array("department" => array("objectClass" => "gosaDepartment", "description" => _("Departments"))), "plProvidedAcls" => array( - "description" => _("Description"), - "c" => _("Country"), - "base" => _("Base"), - "l" => _("Location"), - "telephoneNumber" => _("Telephone"), "ou" => _("Department name"), + "description" => _("Description"), "businessCategory" => _("Category"), + "base" => _("Base"), + "st" => _("State"), + "l" => _("Location"), "postalAddress" => _("Address"), - "gosaUnitTag" => _("Administrative settings"), - "facsimileTelephoneNumber" => _("Fax")) + "telephoneNumber" => _("Telephone"), + "facsimileTelephoneNumber" => _("Fax"), + + "gosaUnitTag" => _("Administrative settings")) )); } + + function handle_object_tagging($dn= "", $tag= "", $show= false) + { + /* No dn? Self-operation... */ + if ($dn == ""){ + $dn= $this->dn; + + /* No tag? Find it yourself... */ + if ($tag == ""){ + $len= strlen($dn); + + @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "No tag for $dn - looking for one...", "Tagging"); + $relevant= array(); + foreach ($this->config->adepartments as $key => $ntag){ + + /* This one is bigger than our dn, its not relevant... */ + if ($len <= strlen($key)){ + continue; + } + + /* This one matches with the latter part. Break and don't fix this entry */ + if (preg_match('/(^|,)'.preg_quote($key, '/').'$/', $dn)){ + @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "DEBUG: Possibly relevant: $key", "Tagging"); + $relevant[strlen($key)]= $ntag; + continue; + } + + } + + /* If we've some relevant tags to set, just get the longest one */ + if (count($relevant)){ + ksort($relevant); + $tmp= array_keys($relevant); + $idx= end($tmp); + $tag= $relevant[$idx]; + $this->gosaUnitTag= $tag; + } + } + } + + /* Set tag? */ + if ($tag != ""){ + /* Set objectclass and attribute */ + $ldap= $this->config->get_ldap_link(); + $ldap->cat($dn, array('gosaUnitTag', 'objectClass')); + $attrs= $ldap->fetch(); + if(isset($attrs['gosaUnitTag'][0]) && $attrs['gosaUnitTag'][0] == $tag){ + if ($show) { + echo sprintf(_("Object '%s' is already tagged"), LDAP::fix($dn))."