X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_plugin.inc;h=8e992dccc33c03b894848d7fe53767a16b168040;hb=0abef43214a476951d60c468195b33f477a310c8;hp=55cb82162a41a1a91e4981a99507fdb9af0f4571;hpb=fcc078a3131b821697c17c5a3e912e210f75d715;p=gosa.git
diff --git a/include/class_plugin.inc b/include/class_plugin.inc
index 55cb82162..8e992dccc 100644
--- a/include/class_plugin.inc
+++ b/include/class_plugin.inc
@@ -83,6 +83,11 @@ class plugin
*/
var $attrs= array();
+ /* Keep set of conflicting plugins */
+ var $conflicts= array();
+
+ /* Save unit tags */
+ var $gosaUnitTag= "";
/*!
\brief Used standard values
@@ -100,6 +105,10 @@ class plugin
var $attributes= array();
var $objectclasses= array();
var $new= TRUE;
+ var $saved_attributes= array();
+
+ /* This can be set to render the tabulators in another stylesheet */
+ var $pl_notify= FALSE;
/*! \brief plugin constructor
@@ -108,7 +117,7 @@ class plugin
\param dn Distinguished name to initialize plugin from
\sa plugin()
*/
- function plugin ($config, $dn= NULL)
+ function plugin ($config, $dn= NULL, $parent= NULL)
{
/* Configuration is fine, allways */
$this->config= $config;
@@ -124,16 +133,26 @@ class plugin
if ($dn != NULL){
/* Load data to 'attrs' and save 'dn' */
- $ldap->cat ($dn);
- $this->attrs= $ldap->fetch();
+ if ($parent != NULL){
+ $this->attrs= $parent->attrs;
+ } else {
+ $ldap->cat ($dn);
+ $this->attrs= $ldap->fetch();
+ }
/* Copy needed attributes */
foreach ($this->attributes as $val){
- if (isset($this->attrs["$val"][0])){
- $this->$val= $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'])){
@@ -162,6 +181,27 @@ class plugin
@DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
"found", "Object check");
}
+
+ /* Prepare saved attributes */
+ $this->saved_attributes= $this->attrs;
+ foreach ($this->saved_attributes as $index => $value){
+ if (preg_match('/^[0-9]+$/', $index)){
+ unset($this->saved_attributes[$index]);
+ continue;
+ }
+ if (!in_array($index, $this->attributes) && $index != "objectClass"){
+ unset($this->saved_attributes[$index]);
+ continue;
+ }
+ if ($this->saved_attributes[$index]["count"] == 1){
+ $tmp= $this->saved_attributes[$index][0];
+ unset($this->saved_attributes[$index]);
+ $this->saved_attributes[$index]= $tmp;
+ continue;
+ }
+
+ unset($this->saved_attributes["$index"]["count"]);
+ }
}
/* Save initial account state */
@@ -174,18 +214,15 @@ class plugin
*/
function execute()
{
- /* Do we represent a valid account? */
- if (!$this->is_account){
- echo " ".
- _("This 'dn' has no account extensions.")."";
- return;
- }
-
- /* Show dummy message */
- echo _("This is an empty plugin.");
+ # This one is empty currently. Fabian - please fill in the docu code
+ $_SESSION['current_class_for_help'] = get_class($this);
+ /* Reset Lock message POST/GET check array, to prevent perg_match errors*/
+ $_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 */
@@ -233,9 +270,8 @@ class plugin
/* Save values to object */
foreach ($this->attributes as $val){
if (chkacl ($this->acl, "$val") == "" && isset ($_POST["$val"])){
-
/* Check for modifications */
- if (get_magic_quotes_gpc()) {
+ if ((get_magic_quotes_gpc()) && !is_array($_POST["$val"])) {
$data= stripcslashes($_POST["$val"]);
} else {
$data= $this->$val = $_POST["$val"];
@@ -243,6 +279,17 @@ class plugin
if ($this->$val != $data){
$this->is_modified= TRUE;
}
+
+ /* Okay, how can I explain this fix ...
+ * In firefox, disabled option fields aren't selectable ... but in IE you can select these fileds.
+ * So IE posts these 'unselectable' option, with value = chr(194)
+ * chr(194) seems to be the in between the ...option> $val= $data;
}
}
@@ -290,10 +337,127 @@ class plugin
}
+
+ function cleanup()
+ {
+ foreach ($this->attrs as $index => $value){
+
+ /* Convert arrays with one element to non arrays, if the saved
+ attributes are no array, too */
+ if (is_array($this->attrs[$index]) &&
+ count ($this->attrs[$index]) == 1 &&
+ isset($this->saved_attributes[$index]) &&
+ !is_array($this->saved_attributes[$index])){
+
+ $tmp= $this->attrs[$index][0];
+ $this->attrs[$index]= $tmp;
+ }
+
+ /* Remove emtpy arrays if they do not differ */
+ if (is_array($this->attrs[$index]) &&
+ count($this->attrs[$index]) == 0 &&
+ !isset($this->saved_attributes[$index])){
+
+ unset ($this->attrs[$index]);
+ continue;
+ }
+
+ /* Remove single attributes that do not differ */
+ if (!is_array($this->attrs[$index]) &&
+ isset($this->saved_attributes[$index]) &&
+ !is_array($this->saved_attributes[$index]) &&
+ $this->attrs[$index] == $this->saved_attributes[$index]){
+
+ unset ($this->attrs[$index]);
+ continue;
+ }
+
+ /* Remove arrays that do not differ */
+ if (is_array($this->attrs[$index]) &&
+ isset($this->saved_attributes[$index]) &&
+ is_array($this->saved_attributes[$index])){
+
+ if (!array_differs($this->attrs[$index],$this->saved_attributes[$index])){
+ unset ($this->attrs[$index]);
+ continue;
+ }
+ }
+ }
+
+ /* Update saved attributes and ensure that next cleanups will be successful too */
+ foreach($this->attrs as $name => $value){
+ $this->saved_attributes[$name] = $value;
+ }
+ }
+
/* Check formular input */
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);
}
@@ -350,33 +514,47 @@ class plugin
/* Show header message for tab dialogs */
function show_header($button_text, $text, $disabled= FALSE)
{
+ $state = "disabled";
+ if($this->is_account && $this->acl == "#all#"){
+ $state= "";
+ }elseif(!$this->is_account && chkacl($this->acl,"create") == ""){
+ $state= "";
+ }
+
if ($disabled == TRUE){
$state= "disabled";
- } else {
- $state= "";
}
+
$display= "
$text \n"; - $display.= "acl, "all")." ".$state. - ">
|
"; 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"); - if ($command == "" && isset($this->config->data['TAB'])){ - $command= search_config($this->config->data['TAB'], get_class($this), "POSTCREATE"); + if ($command == "" && isset($this->config->data['TABS'])){ + $command= search_config($this->config->data['TABS'], get_class($this), "POSTCREATE"); } if ($command != ""){ + + /* Additional attributes */ + foreach ($add_attrs as $name => $value){ + $command= preg_replace("/%$name/", $value, $command); + } + /* Walk through attribute list */ foreach ($this->attributes as $attr){ - $command= preg_replace("/%$attr/", $this->$attr, $command); + if (!is_array($this->$attr)){ + $command= preg_replace("/%$attr/", $this->$attr, $command); + } } $command= preg_replace("/%dn/", $this->dn, $command); + if (check_command($command)){ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute"); @@ -389,20 +567,29 @@ 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"); - if ($command == "" && isset($this->config->data['TAB'])){ - $command= search_config($this->config->data['TAB'], get_class($this), "POSTMODIFY"); + if ($command == "" && isset($this->config->data['TABS'])){ + $command= search_config($this->config->data['TABS'], get_class($this), "POSTMODIFY"); } if ($command != ""){ + + /* Additional attributes */ + foreach ($add_attrs as $name => $value){ + $command= preg_replace("/%$name/", $value, $command); + } + /* Walk through attribute list */ foreach ($this->attributes as $attr){ - $command= preg_replace("/%$attr/", $this->$attr, $command); + if (!is_array($this->$attr)){ + $command= preg_replace("/%$attr/", $this->$attr, $command); + } } $command= preg_replace("/%dn/", $this->dn, $command); + if (check_command($command)){ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute"); @@ -415,20 +602,34 @@ 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"); - if ($command == "" && isset($this->config->data['TAB'])){ - $command= search_config($this->config->data['TAB'], get_class($this), "POSTREMOVE"); + if ($command == "" && isset($this->config->data['TABS'])){ + $command= search_config($this->config->data['TABS'], get_class($this), "POSTREMOVE"); } if ($command != ""){ + + /* Additional attributes */ + foreach ($add_attrs as $name => $value){ + $command= preg_replace("/%$name/", $value, $command); + } + /* Walk through attribute list */ foreach ($this->attributes as $attr){ - $command= preg_replace("/%$attr/", $this->$attr, $command); + if (!is_array($this->$attr)){ + $command= preg_replace("/%$attr/", $this->$attr, $command); + } } $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"); @@ -449,7 +650,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); } @@ -461,7 +662,7 @@ class plugin } $dn= "$attribute=".$this->$attribute."+$attr=".$this->$attr.",$base"; - $ldap->cat ($dn); + $ldap->cat ($dn, array('dn')); if (!$ldap->fetch()){ return ($dn); } @@ -480,7 +681,7 @@ class plugin $this->reconnect= true; return (0); } else { - $this->error = "Could not bind to " . $binddn; + $this->error = "Could not bind to " . $credentials['ADMIN']; return NULL; } } @@ -490,7 +691,7 @@ class plugin { /* Rename dn in possible object groups */ $ldap= $this->config->get_ldap_link(); - $ldap->search('(&(objectClass=gosaGroupOfNames)(member='.$src_dn.'))', + $ldap->search('(&(objectClass=gosaGroupOfNames)(member='.@LDAP::fix($src_dn).'))', array('cn')); while ($attrs= $ldap->fetch()){ $og= new ogroup($this->config, $ldap->getDN()); @@ -502,16 +703,15 @@ class plugin $ldap->cat($dst_dn); $attrs= $ldap->fetch(); if (count($attrs)){ - trigger_error("Trying to overwrite $dst_dn, which already exists.", + trigger_error("Trying to overwrite ".@LDAP::fix($dst_dn).", which already exists.", E_USER_WARNING); return (FALSE); } $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.", + trigger_error("Trying to move ".@LDAP::fix($src_dn).", which does not seem to exist.", E_USER_WARNING); return (FALSE); } @@ -525,7 +725,7 @@ class plugin $r=ldap_bind($ds,$this->config->current['ADMIN'], $this->config->current['PASSWORD']); error_reporting (0); - $sr=ldap_read($ds, $src_dn, "objectClass=*"); + $sr=ldap_read($ds, @LDAP::fix($src_dn), "objectClass=*"); /* Fill data from LDAP */ $new= array(); @@ -553,12 +753,28 @@ class plugin /* Adapt naming attribute */ $dst_name= preg_replace("/^([^=]+)=.*$/", "\\1", $dst_dn); $dst_val = preg_replace("/^[^=]+=([^,+]+).*,.*$/", "\\1", $dst_dn); - $new[$dst_name]= $dst_val; + $new[$dst_name]= @LDAP::fix($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("/\\,/",$new['ou']))){ + $new['ou'] = preg_replace("/\\\\,/",",",$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); @@ -599,7 +815,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); @@ -635,25 +851,165 @@ 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){ + if (isset($source->$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))."