X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_plugin.inc;h=15180d73cbd1719b2805435b63ce8ae03a597d83;hb=fe46c790be7e8ab8fba2dc6c12ac923fafba4dbf;hp=be887cf55e9d4ca66520c6f92f0640d14cc17e5d;hpb=9878a4c1308c13cebf09b08a0187cf1760304875;p=gosa.git diff --git a/include/class_plugin.inc b/include/class_plugin.inc index be887cf55..15180d73c 100644 --- a/include/class_plugin.inc +++ b/include/class_plugin.inc @@ -83,6 +83,8 @@ class plugin */ var $attrs= array(); + /* Save unit tags */ + var $gosaUnitTag= ""; /*! \brief Used standard values @@ -130,13 +132,17 @@ class plugin /* Copy needed attributes */ foreach ($this->attributes as $val){ - #if (isset($this->attrs["$val"][0])){ $found= array_key_ics($val, $this->attrs); if ($found != ""){ $this->$val= $this->attrs["$found"][0]; } } + /* gosaUnitTag loading... */ + if (isset($this->attrs['gosaUnitTag'][0])){ + $this->gosaUnitTag= $this->attrs['gosaUnitTag'][0]; + } + /* Set the template flag according to the existence of objectClass gosaUserTemplate */ if (isset($this->attrs['objectClass'])){ @@ -204,7 +210,9 @@ class plugin $_SESSION['LOCK_VARS_TO_USE'] =array(); } - /* remove object from parent */ + /*! \brief execute plugin + Removes object from parent + */ function remove_from_parent() { /* include global link_info */ @@ -371,6 +379,70 @@ class plugin function check() { $message= array(); + + /* Skip if we've no config object */ + if (!isset($this->config)){ + return $message; + } + + /* Find hooks entries for this class */ + $command= search_config($this->config->data['MENU'], get_class($this), "CHECK"); + if ($command == "" && isset($this->config->data['TABS'])){ + $command= search_config($this->config->data['TABS'], get_class($this), "CHECK"); + } + + if ($command != ""){ + + if (!check_command($command)){ + $message[]= sprintf(_("Command '%s', specified as CHECK hook for plugin '%s' doesn't seem to exist."), $command, + get_class($this)); + } else { + + /* Generate "ldif" for check hook */ + $ldif= "dn: $this->dn\n"; + + /* ... objectClasses */ + foreach ($this->objectclasses as $oc){ + $ldif.= "objectClass: $oc\n"; + } + + /* ... attributes */ + foreach ($this->attributes as $attr){ + if ($this->$attr == ""){ + continue; + } + if (is_array($this->$attr)){ + foreach ($this->$attr as $val){ + $ldif.= "$attr: $val\n"; + } + } else { + $ldif.= "$attr: ".$this->$attr."\n"; + } + } + + /* Append empty line */ + $ldif.= "\n"; + + /* Feed "ldif" into hook and retrieve result*/ + $descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w")); + $fh= proc_open($command, $descriptorspec, $pipes); + if (is_resource($fh)) { + fwrite ($pipes[0], $ldif); + fclose($pipes[0]); + + $result= stream_get_contents($pipes[1]); + if ($result != ""){ + $message[]= $result; + } + + fclose($pipes[1]); + fclose($pipes[2]); + proc_close($fh); + } + } + + } + return ($message); } @@ -440,7 +512,7 @@ class plugin return($display); } - function postcreate() + function postcreate($add_attrs= array()) { /* Find postcreate entries for this class */ $command= search_config($this->config->data['MENU'], get_class($this), "POSTCREATE"); @@ -456,6 +528,12 @@ class plugin } } $command= preg_replace("/%dn/", $this->dn, $command); + + /* Additional attributes */ + foreach ($add_attrs as $name => $value){ + $command= preg_replace("/%$name/", $value, $command); + } + if (check_command($command)){ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute"); @@ -468,7 +546,7 @@ class plugin } } - function postmodify() + function postmodify($add_attrs= array()) { /* Find postcreate entries for this class */ $command= search_config($this->config->data['MENU'], get_class($this), "POSTMODIFY"); @@ -484,6 +562,12 @@ class plugin } } $command= preg_replace("/%dn/", $this->dn, $command); + + /* Additional attributes */ + foreach ($add_attrs as $name => $value){ + $command= preg_replace("/%$name/", $value, $command); + } + if (check_command($command)){ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute"); @@ -496,7 +580,7 @@ class plugin } } - function postremove() + function postremove($add_attrs= array()) { /* Find postremove entries for this class */ $command= search_config($this->config->data['MENU'], get_class($this), "POSTREMOVE"); @@ -512,6 +596,12 @@ class plugin } } $command= preg_replace("/%dn/", $this->dn, $command); + + /* Additional attributes */ + foreach ($add_attrs as $name => $value){ + $command= preg_replace("/%$name/", $value, $command); + } + if (check_command($command)){ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute"); @@ -532,7 +622,7 @@ class plugin /* Try to use plain entry first */ $dn= "$attribute=".$this->$attribute.",$base"; - $ldap->cat ($dn); + $ldap->cat ($dn, array('dn')); if (!$ldap->fetch()){ return ($dn); } @@ -544,7 +634,7 @@ class plugin } $dn= "$attribute=".$this->$attribute."+$attr=".$this->$attr.",$base"; - $ldap->cat ($dn); + $ldap->cat ($dn, array('dn')); if (!$ldap->fetch()){ return ($dn); } @@ -591,7 +681,6 @@ class plugin } $ldap->cat($src_dn); - $attrs= array(); $attrs= $ldap->fetch(); if (!count($attrs)){ trigger_error("Trying to move $src_dn, which does not seem to exist.", @@ -638,10 +727,26 @@ class plugin $dst_val = preg_replace("/^[^=]+=([^,+]+).*,.*$/", "\\1", $dst_dn); $new[$dst_name]= $dst_val; + /* Check if this is a department. + * If it is a dep. && there is a , override in his ou + * change \2C to , again, else this entry can't be saved ... + */ + if((isset($new['ou'])) &&( preg_match("/\\\\2C/",$new['ou']))){ + $new['ou'] = preg_replace("/\\\\2C/",",",$new['ou']); + } + /* Save copy */ $ldap->connect(); $ldap->cd($this->config->current['BASE']); + $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $dst_dn)); + + /* FAIvariable=.../..., cn=.. + could not be saved, because the attribute FAIvariable was different to + the dn FAIvariable=..., cn=... */ + if(in_array_ics("FAIdebconfInfo",$new['objectClass'])){ + $new['FAIvariable'] = $ldap->fix($new['FAIvariable']); + } $ldap->cd($dst_dn); $ldap->add($new); @@ -682,7 +787,7 @@ class plugin $ldap= $this->config->get_ldap_link(); /* Check if destination exists - abort */ - $ldap->cat($dst_dn); + $ldap->cat($dst_dn, array('dn')); if ($ldap->fetch()){ trigger_error("recursive_move $dst_dn already exists.", E_USER_WARNING); @@ -718,24 +823,155 @@ class plugin } - function handle_post_events($mode) + function handle_post_events($mode, $add_attrs= array()) { switch ($mode){ case "add": - $this->postcreate(); + $this->postcreate($add_attrs); break; case "modify": - $this->postmodify(); + $this->postmodify($add_attrs); break; case "remove": - $this->postremove(); + $this->postremove($add_attrs); break; } } -} + function saveCopyDialog(){ + } + + + function getCopyDialog(){ + return(array("string"=>"","status"=>"")); + } + + + function PrepareForCopyPaste($source){ + $todo = $this->attributes; + if(isset($this->CopyPasteVars)){ + $todo = array_merge($todo,$this->CopyPasteVars); + } + $todo[] = "is_account"; + foreach($todo as $var){ + $this->$var = $source->$var; + } + } + + + function handle_object_tagging($dn= "", $tag= "", $show= false) + { + //FIXME: How to optimize this? We have at least two + // LDAP accesses per object. It would be a good + // idea to have it integrated. + + /* 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('/(^|,)'.normalizePreg($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))."
"; + flush(); + } + return; + } + if (count($attrs)){ + if ($show){ + echo sprintf(_("Adding tag (%s) to object '%s'"), $tag, @LDAP::fix($dn))."
"; + flush(); + } + $nattrs= array("gosaUnitTag" => $this->gosaUnitTag); + $nattrs['objectClass']= array(); + for ($i= 0; $i<$attrs['objectClass']['count']; $i++){ + $oc= $attrs['objectClass'][$i]; + if ($oc != "gosaAdministrativeUnitTag"){ + $nattrs['objectClass'][]= $oc; + } + } + $nattrs['objectClass'][]= "gosaAdministrativeUnitTag"; + $ldap->cd($dn); + $ldap->modify($nattrs); + show_ldap_error($ldap->get_error(), _("Handle object tagging failed")); + } else { + @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "Not tagging ($tag) $dn - seems to have moved away", "Tagging"); + } + + } else { + /* Remove objectclass and attribute */ + $ldap= $this->config->get_ldap_link(); + $ldap->cat($dn, array('gosaUnitTag', 'objectClass')); + $attrs= $ldap->fetch(); + if (isset($attrs['objectClass']) && !in_array_ics("gosaAdministrativeUnitTag", $attrs['objectClass'])){ + @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "$dn is not tagged", "Tagging"); + return; + } + if (count($attrs)){ + if ($show){ + echo sprintf(_("Removing tag from object '%s'"), @LDAP::fix($dn))."
"; + flush(); + } + $nattrs= array("gosaUnitTag" => array()); + $nattrs['objectClass']= array(); + for ($i= 0; $i<$attrs['objectClass']['count']; $i++){ + $oc= $attrs['objectClass'][$i]; + if ($oc != "gosaAdministrativeUnitTag"){ + $nattrs['objectClass'][]= $oc; + } + } + $ldap->cd($dn); + $ldap->modify($nattrs); + show_ldap_error($ldap->get_error(), _("Handle object tagging failed")); + } else { + @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "Not removing tag ($tag) $dn - seems to have moved away", "Tagging"); + } + } + + } + +} // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>