X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_plugin.inc;h=e613f4db9753c1a1498842c3e22943ac32f766fe;hb=2846dab0f472cf39bd2326720ba753d6580e6603;hp=2a34d2c55d6e8a378b26c547a600233d61cd378d;hpb=b130a469e86d937a382fac5864219c190f2a6e36;p=gosa.git diff --git a/include/class_plugin.inc b/include/class_plugin.inc index 2a34d2c55..e613f4db9 100644 --- a/include/class_plugin.inc +++ b/include/class_plugin.inc @@ -100,13 +100,21 @@ 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 $is_new= TRUE; var $saved_attributes= array(); + var $acl_base= ""; + var $acl_category= ""; + + /* Plugin identifier */ + var $plHeadline= ""; + var $plDescription= ""; + /*! \brief plugin constructor If 'dn' is set, the node loads the given 'dn' from LDAP @@ -114,7 +122,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; @@ -125,13 +133,20 @@ class plugin return; } + /* Save current dn as acl_base */ + $this->acl_base= $dn; + /* Get LDAP descriptor */ $ldap= $this->config->get_ldap_link(); 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){ @@ -207,10 +222,11 @@ class plugin */ function execute() { - # This one is empty currently. Fabian - please fill in the docu code + /* 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(); + $_SESSION['LOCK_VARS_TO_USE'] = $_SESSION['LOCK_VARS_USED'] =array(); } /*! \brief execute plugin @@ -262,7 +278,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"]); @@ -284,6 +300,9 @@ class plugin $data = ""; } $this->$val= $data; + //echo "".$val."
"; + }else{ + //echo "".$val."
"; } } } @@ -305,10 +324,10 @@ class plugin if (isset($tmp['objectClass'])){ $oc= $tmp["objectClass"]; - $this->new= FALSE; + $this->is_new= FALSE; } else { $oc= array("count" => 0); - $this->new= TRUE; + $this->is_new= TRUE; } /* Load (minimum) attributes, add missing ones */ @@ -323,7 +342,7 @@ class plugin foreach ($this->attributes as $val){ if ($this->$val != ""){ $this->attrs["$val"]= $this->$val; - } elseif (!$this->new) { + } elseif (!$this->is_new) { $this->attrs["$val"]= array(); } } @@ -499,9 +518,43 @@ class plugin return FALSE; } + + /* Show header message for tab dialogs */ + function show_enable_header($button_text, $text, $disabled= FALSE) + { + if (($disabled == TRUE) || (!$this->acl_is_createable())){ + $state= "disabled"; + } else { + $state= ""; + } + $display= "\n

$text

\n"; + $display.= "

 

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

$text

\n"; + $display.= "

 

"; + + 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 { @@ -509,12 +562,13 @@ class plugin } $display= "\n

$text

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

 

"; return($display); } + function postcreate($add_attrs= array()) { /* Find postcreate entries for this class */ @@ -666,7 +720,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()); @@ -678,7 +732,7 @@ 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); } @@ -686,7 +740,7 @@ class plugin $ldap->cat($src_dn); $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); } @@ -700,7 +754,7 @@ class plugin $r=ldap_bind($ds,$this->config->current['ADMIN'], $this->config->current['PASSWORD']); error_reporting (0); - $sr=ldap_read($ds, $ldap->fix($src_dn), "objectClass=*"); + $sr=ldap_read($ds, @LDAP::fix($src_dn), "objectClass=*"); /* Fill data from LDAP */ $new= array(); @@ -728,14 +782,14 @@ 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("/\\\\2C/",$new['ou']))){ - $new['ou'] = preg_replace("/\\\\2C/",",",$new['ou']); + if((isset($new['ou'])) &&( preg_match("/\\,/",$new['ou']))){ + $new['ou'] = preg_replace("/\\\\,/",",",$new['ou']); } /* Save copy */ @@ -853,14 +907,42 @@ class plugin } - function PrepareForCopyPaste($source){ + function PrepareForCopyPaste($source) + { $todo = $this->attributes; if(isset($this->CopyPasteVars)){ $todo = array_merge($todo,$this->CopyPasteVars); } - $todo[] = "is_account"; + + if(count($this->objectclasses)){ + $this->is_account = TRUE; + foreach($this->objectclasses as $class){ + if(!in_array($class,$source['objectClass'])){ + $this->is_account = FALSE; + } + } + } + foreach($todo as $var){ - $this->$var = $source->$var; + if (isset($source[$var])){ + if(isset($source[$var]['count'])){ + if($source[$var]['count'] > 1){ + $this->$var = array(); + $tmp = array(); + for($i = 0 ; $i < $source[$var]['count']; $i++){ + $tmp = $source[$var][$i]; + } + $this->$var = $tmp; +# echo $var."=".$tmp."
"; + }else{ + $this->$var = $source[$var][0]; +# echo $var."=".$source[$var][0]."
"; + } + }else{ + $this->$var= $source[$var]; +# echo $var."=".$source[$var]."
"; + } + } } } @@ -870,11 +952,11 @@ class plugin //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); @@ -907,7 +989,7 @@ class plugin } } } - + /* Set tag? */ if ($tag != ""){ @@ -927,7 +1009,7 @@ class plugin echo sprintf(_("Adding tag (%s) to object '%s'"), $tag, @LDAP::fix($dn))."
"; flush(); } - $nattrs= array("gosaUnitTag" => $this->gosaUnitTag); + $nattrs= array("gosaUnitTag" => $tag); $nattrs['objectClass']= array(); for ($i= 0; $i<$attrs['objectClass']['count']; $i++){ $oc= $attrs['objectClass'][$i]; @@ -938,11 +1020,11 @@ class plugin $nattrs['objectClass'][]= "gosaAdministrativeUnitTag"; $ldap->cd($dn); $ldap->modify($nattrs); - show_ldap_error($ldap->get_error(), _("Handle object tagging failed")); + 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(); @@ -967,12 +1049,12 @@ class plugin } $ldap->cd($dn); $ldap->modify($nattrs); - show_ldap_error($ldap->get_error(), _("Handle object tagging failed")); + 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"); } } - + } @@ -987,28 +1069,37 @@ class plugin /* Create a snapshot of the current object */ function create_snapshot($type= "snapshot", $description= array()) { - if(!$this->snapshotEnabled()) return; - /* Create 2 ldap connections - one connection points to the snapshot server and - one to our basic ldap server */ + /* 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']); - $tmp = $this->config->data['MAIN']; - + /* check if there are special server configurations for snapshots */ - if(isset($tmp['SNAPSHOT_SERVER'])){ + 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']; + $snapldapbase = $tmp['SNAPSHOT_BASE']; + $ldap_to = new LDAP($user,$password, $server); $ldap_to -> cd($snapldapbase); - show_ldap_error($ldap_to->get_error(), _("Snapshot failed.")); - }else{ - $ldap_to = $ldap; + 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)){ @@ -1022,7 +1113,8 @@ class plugin $new_base = preg_replace("/".normalizePreg($base)."$/","",$base_of_object).$snap_base; /* Create object */ - $data = preg_replace('/^dn:.*\n/', '', $ldap->gen_one_entry($this->dn)); +#$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"); @@ -1033,9 +1125,9 @@ class plugin $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. */ + 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()){ @@ -1045,56 +1137,84 @@ class plugin $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_to->get_error(), _("Create snapshot failed.")); - show_ldap_error($ldap->get_error(), _("Create snapshot failed.")); + + 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)); } } - - /* returns true if snapshots are enabled */ + function remove_snapshot($dn) + { + $ui = get_userinfo(); + $old_dn = $this->dn; + $this->dn = $dn; + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->rmdir_recursive($dn); + $this->dn = $old_dn; + } + + + /* 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->data['MAIN']; + $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_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(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 */ + points to our ldap snapshot server */ $ldap= $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - $tmp = $this->config->data['MAIN']; - - if(!isset($tmp['SNAPSHOT_BASE'])){ - print_red(_("Please specify the attribute SNAPSHOT_BASE in your gosa.conf.")); - return(array()); - } + $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']; + $snapldapbase = $tmp['SNAPSHOT_BASE']; $ldap_to = new LDAP($user,$password, $server); $ldap_to -> cd ($snapldapbase); - show_ldap_error($ldap_to->get_error(), _("Snapshot failed.")); + show_ldap_error($ldap->get_error(), sprintf(_("Method get available snapshots with dn '%s' failed."),$this->dn)); }else{ $ldap_to = $ldap; } @@ -1109,8 +1229,8 @@ class plugin /* 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")); - + 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])){ @@ -1135,22 +1255,22 @@ class plugin function getAllDeletedSnapshots($base_of_object,$raw = false) { if(!$this->snapshotEnabled()) return(array()); - + /* Create an additional ldap object which - points to our ldap snapshot server */ + points to our ldap snapshot server */ $ldap= $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - $tmp = $this->config->data['MAIN']; + $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']; + $snapldapbase = $tmp['SNAPSHOT_BASE']; $ldap_to = new LDAP($user,$password, $server); $ldap_to->cd ($snapldapbase); - show_ldap_error($ldap_to->get_error(), _("Snapshot failed.")); + show_ldap_error($ldap->get_error(), sprintf(_("Method get deleted snapshots with dn '%s' failed."),$this->dn)); }else{ $ldap_to = $ldap; } @@ -1164,8 +1284,12 @@ class plugin $ui = get_userinfo(); $tmp = array(); $ldap_to->cd($new_base); - $ldap_to->search("(&(objectClass=gosaSnapshotObject))",array("gosaSnapshotType","gosaSnapshotTimestamp","gosaSnapshotDN","description")); + $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] = ""; } @@ -1200,34 +1324,315 @@ class plugin $ldap= $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - $tmp = $this->config->data['MAIN']; + $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']; + $snapldapbase = $tmp['SNAPSHOT_BASE']; $ldap_to = new LDAP($user,$password, $server); $ldap_to->cd ($snapldapbase); - show_ldap_error($ldap_to->get_error(), _("Snapshot failed.")); + 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')); - $data = "dn: ".$restoreObject['gosaSnapshotDN'][0]."\n".$data; - + /* Import the given data */ - $ldap->import_complete_ldif($data,$err,true,true); - show_ldap_error($ldap_to->get_error().$err, _("Restore snapshot failed.")); + $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,"",$this); + $this->snapDialog->set_snapshot_bases($baseSuffixe); + $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 set_acl_base($base) + { + $this->acl_base= $base; + } + + + function set_acl_category($category) + { + $this->acl_category= "$category/"; + } + + + function acl_is_writeable($attribute,$skip_write = FALSE) + { + $ui= get_userinfo(); + return preg_match('/w/', $ui->get_permissions($this->acl_base, $this->acl_category.get_class($this), $attribute, $skip_write)); + } + + + function acl_is_readable($attribute) + { + $ui= get_userinfo(); + return preg_match('/r/', $ui->get_permissions($this->acl_base, $this->acl_category.get_class($this), $attribute)); + } + + + function acl_is_createable() + { + $ui= get_userinfo(); + return preg_match('/c/', $ui->get_permissions($this->acl_base, $this->acl_category.get_class($this), '0')); + } + + + function acl_is_removeable() + { + $ui= get_userinfo(); + return preg_match('/d/', $ui->get_permissions($this->acl_base, $this->acl_category.get_class($this), '0')); + } + + + function acl_is_moveable() + { + $ui= get_userinfo(); + return preg_match('/m/', $ui->get_permissions($this->acl_base, $this->acl_category.get_class($this), '0')); + } + + + function acl_have_any_permissions() + { + } + + + function getacl($attribute,$skip_write= FALSE) + { + $ui= get_userinfo(); + return $ui->get_permissions($this->acl_base, $this->acl_category.get_class($this), $attribute,$skip_write); + } + + /* Get all allowed bases to move an object to or to create a new object. + Idepartments also contains all base departments which lead to the allowed bases */ + function get_allowed_bases($category = "") + { + $ui = get_userinfo(); + $deps = array(); + + /* Set category */ + if(empty($category)){ + $category = $this->acl_category.get_class($this); + } + + /* Is this a new object ? Or just an edited existing object */ + if(!$this->initially_was_account && $this->is_account){ + $new = true; + }else{ + $new = false; + } + + $cat_bases = $ui->get_module_departments(preg_replace("/\/.*$/","",$category)); + foreach($this->config->idepartments as $dn => $name){ + + if(!in_array_ics($dn,$cat_bases)){ + continue; + } + + $acl = $ui->get_permissions($dn,$category); + if($new && preg_match("/c/",$acl)){ + $deps[$dn] = $name; + }elseif(!$new && preg_match("/m/",$acl)){ + $deps[$dn] = $name; + } + } + + /* Add current base */ + if(isset($this->base) && isset($this->config->idepartments[$this->base])){ + $deps[$this->base] = $this->config->idepartments[$this->base]; + }else{ + echo "No default base found. ".$this->base."
"; + } + + return($deps); + } + + /* This function modifies object acls too, if an object is moved. + * $old_dn specifies the actually used dn + * $new_dn specifies the destiantion dn + */ + function update_acls($old_dn,$new_dn,$output_changes = FALSE) + { + global $config; + + /* Check if old_dn is empty. This should never happen */ + if(empty($old_dn) || empty($new_dn)){ + trigger_error("Failed to check acl dependencies, wrong dn given."); + return; + } + + /* Update userinfo if necessary */ + if($_SESSION['ui']->dn == $old_dn){ + $_SESSION['ui']->dn = $new_dn; + new log("view","acl/".get_class($this),$this->dn,array(),"Updated current user dn from '".$old_dn."' to '".$new_dn."'"); + } + + /* Object was moved, ensure that all acls will be moved too */ + if($new_dn != $old_dn && $old_dn != "new"){ + + /* get_ldap configuration */ + $update = array(); + $ldap = $config->get_ldap_link(); + $ldap->cd ($config->current['BASE']); + $ldap->search("(&(objectClass=gosaAcl)(gosaAclEntry=*))",array("cn","gosaAclEntry")); + while($attrs = $ldap->fetch()){ + + $acls = array(); + + /* Walk through acls */ + for($i = 0 ; $i < $attrs['gosaAclEntry']['count'] ; $i ++ ){ + + /* Reset vars */ + $found = false; + + /* Get Acl parts */ + $acl_parts = split(":",$attrs['gosaAclEntry'][$i]); + + /* Get every single member for this acl */ + $members = array(); + if(preg_match("/,/",$acl_parts[2])){ + $members = split(",",$acl_parts[2]); + }else{ + $members = array($acl_parts[2]); + } + + /* Check if member match current dn */ + foreach($members as $key => $member){ + $member = base64_decode($member); + if($member == $old_dn){ + $found = true; + $members[$key] = base64_encode($new_dn); + } + } + + /* Create new member string */ + $new_members = ""; + foreach($members as $member){ + $new_members .= $member.","; + } + $new_members = preg_replace("/,$/","",$new_members); + $acl_parts[2] = $new_members; + + /* Reconstruckt acl entry */ + $acl_str =""; + foreach($acl_parts as $t){ + $acl_str .= $t.":"; + } + $acl_str = preg_replace("/:$/","",$acl_str); + } + + /* Acls for this object must be adjusted */ + if($found){ + + if($output_changes){ + echo "". + _("Changing ACL dn")." : 
 -"._("from")."  ". + $old_dn. + "
 -"._("to")." ". + $new_dn. + "

"; + } + $update[$attrs['dn']] =array(); + foreach($acls as $acl){ + $update[$attrs['dn']]['gosaAclEntry'][] = $acl; + } + } + } + + /* Write updated acls */ + foreach($update as $dn => $attrs){ + $ldap->cd($dn); + $ldap->modify($attrs); + } + } + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>