X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_plugin.inc;h=97130eaf36da69dd6d5531a106f042e6c1903e33;hb=4ea9cc15e45b3194cd91eddf1d5c62ecb616f855;hp=5fd4220f0fd30a9cf9febfd88b86d44981174fec;hpb=c2c6a6e54355a1b67c25bb4d761d847513810d02;p=gosa.git diff --git a/include/class_plugin.inc b/include/class_plugin.inc index 5fd4220f0..97130eaf3 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 @@ -95,11 +100,17 @@ class plugin var $givenName= ""; var $acl= "*none*"; var $dialog= FALSE; + var $snapDialog = NULL; /* attribute list for save action */ var $attributes= array(); var $objectclasses= array(); var $new= TRUE; + var $saved_attributes= array(); + + /* Plugin identifier */ + var $plHeadline= ""; + var $plDescription= ""; /*! \brief plugin constructor @@ -129,11 +140,17 @@ class plugin /* 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'])){ @@ -151,7 +168,7 @@ class plugin if (preg_match('/top/i', $obj)){ continue; } - if (!in_array_ics ($obj, $this->attrs['objectClass'])){ + if (!isset($this->attrs['objectClass']) || !in_array_ics ($obj, $this->attrs['objectClass'])){ $found= FALSE; break; } @@ -162,6 +179,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 +212,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 */ @@ -232,8 +267,7 @@ class plugin { /* Save values to object */ foreach ($this->attributes as $val){ - if (chkacl ($this->acl, "$val") == "" && isset ($_POST["$val"])){ - + if ($this->acl_is_writeable($val) && isset ($_POST["$val"])){ /* Check for modifications */ if (get_magic_quotes_gpc()) { $data= stripcslashes($_POST["$val"]); @@ -243,7 +277,21 @@ 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; + echo "".$val."
"; + }else{ + echo "".$val."
"; } } } @@ -290,10 +338,122 @@ 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; + } + } + } + } + /* 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); } @@ -347,36 +507,81 @@ class plugin return FALSE; } + + /* Show header message for tab dialogs */ + function show_enable_header($button_text, $text, $disabled= FALSE) + { + if ($disabled == TRUE){ + $state= "disabled"; + } else { + $state= ""; + } + $display= "\n

$text

\n"; + $display.= "acl_is_createable()?'':'disabled')." ".$state. + ">

 

"; + + return($display); + } + + + /* Show header message for tab dialogs */ + function show_disable_header($button_text, $text, $disabled= FALSE) + { + if ($disabled == TRUE){ + $state= "disabled"; + } else { + $state= ""; + } + $display= "\n

$text

\n"; + $display.= "acl_is_removeable()?'':'disabled')." ".$state. + ">

 

"; + + return($display); + } + + /* Show header message for tab dialogs */ function show_header($button_text, $text, $disabled= FALSE) { + echo "FIXME: show_header should be replaced by show_disable_header and show_enable_header
"; if ($disabled == TRUE){ $state= "disabled"; } else { $state= ""; } - $display= "\n

$text

\n"; + $display= "\n

$text

\n"; $display.= "acl, "all")." ".$state. + ($this->acl_is_createable()?'':'disabled')." ".$state. ">

 

"; return($display); } - function postcreate() + + function postcreate($add_attrs= array()) { /* Find postcreate entries for this class */ - $command= $this->search($this->config->data['MENU'], get_class($this), "POSTCREATE"); - if ($command == ""){ - $command= $this->search($this->config->data['SERVICE'], get_class($this), "POSTCREATE"); + $command= search_config($this->config->data['MENU'], get_class($this), "POSTCREATE"); + if ($command == "" && isset($this->config->data['TABS'])){ + $command= search_config($this->config->data['TABS'], get_class($this), "POSTCREATE"); } if ($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"); @@ -389,20 +594,28 @@ class plugin } } - function postmodify() + function postmodify($add_attrs= array()) { /* Find postcreate entries for this class */ - $command= $this->search($this->config->data['MENU'], get_class($this), "POSTMODIFY"); - if ($command == ""){ - $command= $this->search($this->config->data['SERVICE'], get_class($this), "POSTMODIFY"); + $command= search_config($this->config->data['MENU'], get_class($this), "POSTMODIFY"); + if ($command == "" && isset($this->config->data['TABS'])){ + $command= search_config($this->config->data['TABS'], get_class($this), "POSTMODIFY"); } if ($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"); @@ -415,20 +628,28 @@ class plugin } } - function postremove() + function postremove($add_attrs= array()) { /* Find postremove entries for this class */ - $command= $this->search($this->config->data['MENU'], get_class($this), "POSTREMOVE"); - if ($command == ""){ - $command= $this->search($this->config->data['SERVICE'], get_class($this), "POSTREMOVE"); + $command= search_config($this->config->data['MENU'], get_class($this), "POSTREMOVE"); + if ($command == "" && isset($this->config->data['TABS'])){ + $command= search_config($this->config->data['TABS'], get_class($this), "POSTREMOVE"); } if ($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"); @@ -441,29 +662,6 @@ class plugin } } - function search($arr, $name, $return) - { - if (is_array($arr)){ - foreach ($arr as $a){ - if (isset($a['CLASS']) && - strtolower($a['CLASS']) == strtolower($name)){ - - if (isset($a[$return])){ - return ($a[$return]); - } else { - return (""); - } - } else { - $res= $this->search ($a, $name, $return); - if ($res != ""){ - return $res; - } - } - } - } - return (""); - } - /* Create unique DN */ function create_unique_dn($attribute, $base) { @@ -472,7 +670,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); } @@ -484,7 +682,7 @@ class plugin } $dn= "$attribute=".$this->$attribute."+$attr=".$this->$attr.",$base"; - $ldap->cat ($dn); + $ldap->cat ($dn, array('dn')); if (!$ldap->fetch()){ return ($dn); } @@ -503,7 +701,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; } } @@ -513,7 +711,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()); @@ -525,16 +723,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); } @@ -548,7 +745,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(); @@ -576,12 +773,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); @@ -622,7 +835,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); @@ -658,25 +871,574 @@ 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" => $tag); + $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(), sprintf(_("Handle object tagging with dn '%s' failed."),$dn)); + } 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(), sprintf(_("Handle object tagging with dn '%s' failed."),$dn)); + } else { + @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "Not removing tag ($tag) $dn - seems to have moved away", "Tagging"); + } + } + + } + + + /* Add possibility to stop remove process */ + function allow_remove() + { + $reason= ""; + return $reason; + } + + + /* Create a snapshot of the current object */ + function create_snapshot($type= "snapshot", $description= array()) + { + + /* Check if snapshot functionality is enabled */ + if(!$this->snapshotEnabled()){ + return; + } + + /* Get configuration from gosa.conf */ + $tmp = $this->config->current; + + /* Create lokal ldap connection */ + $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + + /* check if there are special server configurations for snapshots */ + if(!isset($tmp['SNAPSHOT_SERVER'])){ + + /* Source and destination server are both the same, just copy source to dest obj */ + $ldap_to = $ldap; + $snapldapbase = $this->config->current['BASE']; + + }else{ + $server = $tmp['SNAPSHOT_SERVER']; + $user = $tmp['SNAPSHOT_USER']; + $password = $tmp['SNAPSHOT_PASSWORD']; + $snapldapbase = $tmp['SNAPSHOT_LDAP_BASE']; + + $ldap_to = new LDAP($user,$password, $server); + $ldap_to -> cd($snapldapbase); + show_ldap_error($ldap->get_error(), sprintf(_("Saving object snapshot with dn '%s' failed."),$snapldapbase)); + } + + /* check if the dn exists */ + if ($ldap->dn_exists($this->dn)){ + + /* Extract seconds & mysecs, they are used as entry index */ + list($usec, $sec)= explode(" ", microtime()); + + /* Collect some infos */ + $base = $this->config->current['BASE']; + $snap_base = $tmp['SNAPSHOT_BASE']; + $base_of_object = preg_replace ('/^[^,]+,/i', '', $this->dn); + $new_base = preg_replace("/".normalizePreg($base)."$/","",$base_of_object).$snap_base; + + /* Create object */ +#$data = preg_replace('/^dn:.*\n/', '', $ldap->gen_ldif($this->dn,"(!(objectClass=gosaDepartment))")); + $data = $ldap->gen_ldif($this->dn,"(&(!(objectClass=gosaDepartment))(!(objectClass=FAIclass)))"); + $newName = preg_replace("/\./", "", $sec."-".$usec); + $target= array(); + $target['objectClass'] = array("top", "gosaSnapshotObject"); + $target['gosaSnapshotData'] = gzcompress($data, 6); + $target['gosaSnapshotType'] = $type; + $target['gosaSnapshotDN'] = $this->dn; + $target['description'] = $description; + $target['gosaSnapshotTimestamp'] = $newName; + + /* Insert the new snapshot + But we have to check first, if the given gosaSnapshotTimestamp + is already used, in this case we should increment this value till there is + an unused value. */ + $new_dn = "gosaSnapshotTimestamp=".$newName.",".$new_base; + $ldap_to->cat($new_dn); + while($ldap_to->count()){ + $ldap_to->cat($new_dn); + $newName = preg_replace("/\./", "", $sec."-".($usec++)); + $new_dn = "gosaSnapshotTimestamp=".$newName.",".$new_base; + $target['gosaSnapshotTimestamp'] = $newName; + } + + /* Inset this new snapshot */ + $ldap_to->cd($snapldapbase); + $ldap_to->create_missing_trees($new_base); + $ldap_to->cd($new_dn); + $ldap_to->add($target); + + show_ldap_error($ldap->get_error(), sprintf(_("Saving object snapshot with dn '%s' failed."),$new_base)); + show_ldap_error($ldap_to->get_error(), sprintf(_("Saving object snapshot with dn '%s' failed."),$new_base)); + } + } + + function remove_snapshot($dn) + { +echo "FIXME: remove_snapshot uses old acl's
"; + $ui = get_userinfo(); + $acl = get_permissions ($dn, $ui->subtreeACL); + $acl = get_module_permission($acl, "snapshot", $dn); + + if (chkacl($this->acl, "delete") == ""){ + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->rmdir_recursive($dn); + }else{ + print_red (_("You are not allowed to delete this snapshot!")); + } + } + + + /* returns true if snapshots are enabled, and false if it is disalbed + There will also be some errors psoted, if the configuration failed */ + function snapshotEnabled() + { + $tmp = $this->config->current; + if(isset($tmp['ENABLE_SNAPSHOT'])){ + if (preg_match("/^true$/i", $tmp['ENABLE_SNAPSHOT']) || preg_match("/yes/i", $tmp['ENABLE_SNAPSHOT'])){ + + /* Check if the snapshot_base is defined */ + if(!isset($tmp['SNAPSHOT_BASE'])){ + print_red(sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not configured in your gosa.conf."),$missing)); + return(FALSE); + } + + /* check if there are special server configurations for snapshots */ + if(isset($tmp['SNAPSHOT_SERVER'])){ + + /* check if all required vars are available to create a new ldap connection */ + $missing = ""; + foreach(array("SNAPSHOT_SERVER","SNAPSHOT_USER","SNAPSHOT_PASSWORD","SNAPSHOT_LDAP_BASE") as $var){ + if(!isset($tmp[$var])){ + $missing .= $var." "; + print_red(sprintf(_("The snapshot functionality is enabled, but the required variable(s) '%s' is not configured in your gosa.conf."),$missing)); + return(FALSE); + } + } + } + return(TRUE); + } + } + return(FALSE); + } + + + /* Return available snapshots for the given base + */ + function Available_SnapsShots($dn,$raw = false) + { + if(!$this->snapshotEnabled()) return(array()); + + /* Create an additional ldap object which + points to our ldap snapshot server */ + $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $tmp = $this->config->current; + + /* check if there are special server configurations for snapshots */ + if(isset($tmp['SNAPSHOT_SERVER'])){ + $server = $tmp['SNAPSHOT_SERVER']; + $user = $tmp['SNAPSHOT_USER']; + $password = $tmp['SNAPSHOT_PASSWORD']; + $snapldapbase = $tmp['SNAPSHOT_LDAP_BASE']; + $ldap_to = new LDAP($user,$password, $server); + $ldap_to -> cd ($snapldapbase); + show_ldap_error($ldap->get_error(), sprintf(_("Method get available snapshots with dn '%s' failed."),$this->dn)); + }else{ + $ldap_to = $ldap; + } + /* Prepare bases and some other infos */ + $base = $this->config->current['BASE']; + $snap_base = $tmp['SNAPSHOT_BASE']; + $base_of_object = preg_replace ('/^[^,]+,/i', '', $dn); + $new_base = preg_replace("/".normalizePreg($base)."$/","",$base_of_object).$snap_base; + $tmp = array(); + + /* Fetch all objects with gosaSnapshotDN=$dn */ + $ldap_to->cd($new_base); + $ldap_to->ls("(&(objectClass=gosaSnapshotObject)(gosaSnapshotDN=".$dn."))",$new_base, + array("gosaSnapshotType","gosaSnapshotTimestamp","gosaSnapshotDN","description")); + + /* Put results into a list and add description if missing */ + while($entry = $ldap_to->fetch()){ + if(!isset($entry['description'][0])){ + $entry['description'][0] = ""; + } + $tmp[] = $entry; + } + + /* Return the raw array, or format the result */ + if($raw){ + return($tmp); + }else{ + $tmp2 = array(); + foreach($tmp as $entry){ + $tmp2[base64_encode($entry['dn'])] = $entry['description'][0]; + } + } + return($tmp2); + } + + + function getAllDeletedSnapshots($base_of_object,$raw = false) + { + if(!$this->snapshotEnabled()) return(array()); + + /* Create an additional ldap object which + points to our ldap snapshot server */ + $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $tmp = $this->config->current; + + /* check if there are special server configurations for snapshots */ + if(isset($tmp['SNAPSHOT_SERVER'])){ + $server = $tmp['SNAPSHOT_SERVER']; + $user = $tmp['SNAPSHOT_USER']; + $password = $tmp['SNAPSHOT_PASSWORD']; + $snapldapbase = $tmp['SNAPSHOT_LDAP_BASE']; + $ldap_to = new LDAP($user,$password, $server); + $ldap_to->cd ($snapldapbase); + show_ldap_error($ldap->get_error(), sprintf(_("Method get deleted snapshots with dn '%s' failed."),$this->dn)); + }else{ + $ldap_to = $ldap; + } + + /* Prepare bases */ + $base = $this->config->current['BASE']; + $snap_base = $tmp['SNAPSHOT_BASE']; + $new_base = preg_replace("/".normalizePreg($base)."$/","",$base_of_object).$snap_base; + + /* Fetch all objects and check if they do not exist anymore */ + $ui = get_userinfo(); + $tmp = array(); + $ldap_to->cd($new_base); + $ldap_to->ls("(objectClass=gosaSnapshotObject)",$new_base,array("gosaSnapshotType","gosaSnapshotTimestamp","gosaSnapshotDN","description")); + while($entry = $ldap_to->fetch()){ + + $chk = str_replace($new_base,"",$entry['dn']); + if(preg_match("/,ou=/",$chk)) continue; + + if(!isset($entry['description'][0])){ + $entry['description'][0] = ""; + } + $tmp[] = $entry; + } + + /* Check if entry still exists */ + foreach($tmp as $key => $entry){ + $ldap->cat($entry['gosaSnapshotDN'][0]); + if($ldap->count()){ + unset($tmp[$key]); + } + } + + /* Format result as requested */ + if($raw) { + return($tmp); + }else{ + $tmp2 = array(); + foreach($tmp as $key => $entry){ + $tmp2[base64_encode($entry['dn'])] = $entry['description'][0]; + } + } + return($tmp2); + } + + + /* Restore selected snapshot */ + function restore_snapshot($dn) + { + if(!$this->snapshotEnabled()) return(array()); + + $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $tmp = $this->config->current; + + /* check if there are special server configurations for snapshots */ + if(isset($tmp['SNAPSHOT_SERVER'])){ + $server = $tmp['SNAPSHOT_SERVER']; + $user = $tmp['SNAPSHOT_USER']; + $password = $tmp['SNAPSHOT_PASSWORD']; + $snapldapbase = $tmp['SNAPSHOT_LDAP_BASE']; + $ldap_to = new LDAP($user,$password, $server); + $ldap_to->cd ($snapldapbase); + show_ldap_error($ldap->get_error(), sprintf(_("Restore snapshot with dn '%s' failed."),$snapldapbase)); + }else{ + $ldap_to = $ldap; + } + + /* Get the snapshot */ + $ldap_to->cat($dn); + $restoreObject = $ldap_to->fetch(); + + /* Prepare import string */ + $data = gzuncompress($ldap_to->get_attribute($dn,'gosaSnapshotData')); + + /* Import the given data */ + $ldap->import_complete_ldif($data,$err,false,false); + show_ldap_error($ldap->get_error(), sprintf(_("Restore snapshot with dn '%s' failed."),$dn)); + } + + + function showSnapshotDialog($base,$baseSuffixe) + { + $once = true; + foreach($_POST as $name => $value){ + + /* Create a new snapshot, display a dialog */ + if(preg_match("/^CreateSnapShotDialog_/",$name) && $once){ + $once = false; + $entry = preg_replace("/^CreateSnapShotDialog_/","",$name); + $entry = base64_decode(preg_replace("/_[xy]$/","",$entry)); + $this->snapDialog = new SnapShotDialog($this->config,$entry,$this); + } + + /* Restore a snapshot, display a dialog with all snapshots of the current object */ + if(preg_match("/^RestoreSnapShotDialog_/",$name) && $once){ + $once = false; + $entry = preg_replace("/^RestoreSnapShotDialog_/","",$name); + $entry = base64_decode(preg_replace("/_[xy]$/","",$entry)); + $this->snapDialog = new SnapShotDialog($this->config,$entry,$this); + $this->snapDialog->display_restore_dialog = true; + } + + /* Restore one of the already deleted objects */ + if(preg_match("/^RestoreDeletedSnapShot_/",$name) && $once){ + $once = false; + $this->snapDialog = new SnapShotDialog($this->config,$baseSuffixe,$this); + $this->snapDialog->display_restore_dialog = true; + $this->snapDialog->display_all_removed_objects = true; + } + + /* Restore selected snapshot */ + if(preg_match("/^RestoreSnapShot_/",$name) && $once){ + $once = false; + $entry = preg_replace("/^RestoreSnapShot_/","",$name); + $entry = base64_decode(trim(preg_replace("/_[xy]$/","",$entry))); + if(!empty($entry)){ + $this->restore_snapshot($entry); + $this->snapDialog = NULL; + } + } + } + + /* Create a new snapshot requested, check + the given attributes and create the snapshot*/ + if(isset($_POST['CreateSnapshot'])){ + $this->snapDialog->save_object(); + $msgs = $this->snapDialog->check(); + if(count($msgs)){ + foreach($msgs as $msg){ + print_red($msg); + } + }else{ + $this->dn = $this->snapDialog->dn; + $this->create_snapshot("snapshot",$this->snapDialog->CurrentDescription); + $this->snapDialog = NULL; + } + } + + /* Restore is requested, restore the object with the posted dn .*/ + if((isset($_POST['RestoreSnapshot'])) && (isset($_POST['SnapShot']))){ + } + + if(isset($_POST['CancelSnapshot'])){ + $this->snapDialog = NULL; + } + + if($this->snapDialog){ + $this->snapDialog->save_object(); + return($this->snapDialog->execute()); + } + } + + + function plInfo() + { + return array(); + } + + + function acl_is_writeable($attribute) + { + $ui= get_userinfo(); + return preg_match('/w/', $ui->get_permissions($this->dn, get_class($this), $attribute)); + } + + + function acl_is_readable($attribute) + { + $ui= get_userinfo(); + return preg_match('/r/', $ui->get_permissions($this->dn, get_class($this), $attribute)); + } + + + function acl_is_createable() + { + $ui= get_userinfo(); + return preg_match('/c/', $ui->get_permissions($this->dn, get_class($this), '0')); + } + + + function acl_is_removeable() + { + $ui= get_userinfo(); + return preg_match('/d/', $ui->get_permissions($this->dn, get_class($this), '0')); + } + + + function acl_is_moveable() + { + $ui= get_userinfo(); + return preg_match('/m/', $ui->get_permissions($this->dn, get_class($this), '0')); + } + + + function getacl($attribute) + { + $ui= get_userinfo(); + return $ui->get_permissions($this->dn, get_class($this), $attribute); + } +} // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>