Code

Udpated copy & paste handling.
[gosa.git] / gosa-core / include / class_CopyPasteHandler.inc
index b780517f5c791fa2f74c67668e62c67a50ddfb8a..4d6fb1ddb04928d4e27061661fa2e7dfc6607ba6 100644 (file)
@@ -1,6 +1,26 @@
 <?php
-
-define("LDAP_DUMP_PATH","/tmp/gosa");
+/*
+ * This code is part of GOsa (http://www.gosa-project.org)
+ * Copyright (C) 2003-2008 GONICUS GmbH
+ *
+ * ID: $$Id$$
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+define("LDAP_DUMP_PATH","/var/cache/gosa/tmp");
 
 class CopyPasteHandler {
 
@@ -41,9 +61,9 @@ class CopyPasteHandler {
    *  array['tab_class']  - Tab object that should be used to initialize the new object
    *  array['tab_object'] - Tab object name used to initialize correct object Type like USERTABS
    */
-  function add_to_queue($dn,$action,$tab_class,$tab_object,$tab_acl_category)
+  function add_to_queue($dn,$action,$tab_class,$tab_object,$tab_acl_category,&$parent = NULL)
   {
-    if(!class_exists($tab_class)){
+    if(!class_available($tab_class)){
       trigger_error(sprintf("Specified class object '%s' does not exists.",$tab_class));
       return(FALSE);
     }
@@ -66,6 +86,7 @@ class CopyPasteHandler {
       $tmp['tab_class'] = $tab_class;
       $tmp['tab_object']= $tab_object;
       $tmp['tab_acl_category']= $tab_acl_category;
+      $tmp['parent']    = $parent;
       $this->queue[]    = $tmp; 
       $this->require_update = TRUE;
     }
@@ -91,19 +112,19 @@ class CopyPasteHandler {
     /* Create patch if it doesn't exists */
     if(!is_dir(LDAP_DUMP_PATH)){
       @mkdir(LDAP_DUMP_PATH);
+
+      /* Update folder permissions */
+      if(!@chmod(LDAP_DUMP_PATH,0700)){
+        $msg= sprintf(_("Copy and paste failed!")."<br><br>"._("Error").": <i>"._("Cannot set permission for '%s'")."</i>" ,LDAP_DUMP_PATH);
+        msg_dialog::display(_("Configuration error"), $msg, ERROR_DIALOG);
+        new log("copy","all/all","copy & paste, event queue.",array(), $msg);
+        return(FALSE);
+      }
     }    
-  
-    /* Update folder permissions */
-    if(!@chmod(LDAP_DUMP_PATH,0700)){
-      $msg= sprintf(_("Cannot cleanup copy & paste queue: setting permissions for '%s' failed!"),LDAP_DUMP_PATH);
-      msg_dialog::display(_("Configuration error"), $msg, ERROR_DIALOG);
-      new log("copy","all/all","copy & paste, event queue.",array(), $msg);
-      return(FALSE);
-    }
     
     /* check if we are able to create a new file the given directory */
     if(!is_writeable(LDAP_DUMP_PATH)){
-      $msg= sprintf(_("Cannot cleanup copy & paste queue: no write permission inside '%s'!"),LDAP_DUMP_PATH);
+      $msg= _("Copy and paste failed!")."<br><br>"._("Error").": <i>".msgPool::cannotWriteFile(LDAP_DUMP_PATH)."</i>";
       msg_dialog::display(_("Configuration error"), $msg, ERROR_DIALOG);
       new log("copy","all/all","copy & paste, event queue.",array(), $msg);
       return(FALSE);
@@ -135,7 +156,7 @@ class CopyPasteHandler {
 
     /* Check if given dn is valid and ldap search was succesfull */ 
     if(!$res){
-      $msg= sprintf(_("Copy and paste failed: object '%s' is not a valid ldap object!"), LDAP::fix($dn));
+      $msg= sprintf(_("Copy and paste failed!")."<br><br>"._("Error").": <i>"._("'%s' is no vaild LDAP object"), LDAP::fix($dn));
       msg_dialog::display(_("Internal error"), $msg, ERROR_DIALOG);
       new log("copy","all/all",$dn,array(), $msg);
       return(FALSE);
@@ -152,29 +173,29 @@ class CopyPasteHandler {
 
     /* check if we are able to create a new file the given directory */
     if(!is_writeable($path)){
-      $msg= sprintf(_("Cannot save LDAP dump: no write permission inside '%s'!"),LDAP_DUMP_PATH);
+      $msg= sprintf(_("Copy and paste failed!")."<br><br>"._("Error").": <i>"._("No write permission in '%s'"),LDAP_DUMP_PATH);
       msg_dialog::display(_("Configuration error"), $msg, ERROR_DIALOG);
       new log("copy","all/all",$dn,array(), $msg);
       return(FALSE);
     }  
 
-    /* Update folder permissions */
-    if(!@chmod(LDAP_DUMP_PATH,0700)){
-      $msg= sprintf(_("Cannot save LDAP dump: setting permissions for '%s' failed!"),LDAP_DUMP_PATH);
-      msg_dialog::display(_("Configuration error"), $msg, ERROR_DIALOG);
-      new log("copy","all/all","copy & paste, event queue.",array(), $msg);
-      return(FALSE);
-    }
-
     /* Create file handle */
     $fp = @fopen($path."/".$filename,"w+");
     if(!$fp){
-      $msg= sprintf(_("Cannot save LDAP dump: no write permission to '%s/%s'!"),$path,$filename);
+      $msg= _("Copy and paste failed!")."<br><br>"._("Error").": <i>".msgPool::cannotWriteFile("$path/$filename")."</i>";
       msg_dialog::display(_("Configuration error"), $msg, ERROR_DIALOG);
       new log("copy","all/all",$dn,array(), $msg);
       return(FALSE);
     }    
 
+    /* Update folder permissions */
+    if(!@chmod($path."/".$filename,0700)){
+      $msg= sprintf(_("Copy and paste failed!")."<br><br>"._("Error").": <i>"._("Cannot set permission for '%s'"),LDAP_DUMP_PATH);
+      msg_dialog::display(_("Configuration error"), $msg, ERROR_DIALOG);
+      new log("copy","all/all","copy & paste, event queue.",array(), $msg);
+      return(FALSE);
+    }
+
     $data = serialize($ldap->fetch());
     fwrite($fp,$data,strlen($data));
     fclose($fp);
@@ -203,6 +224,7 @@ class CopyPasteHandler {
     $tab_c = $entry['tab_class'];
     $tab_o = $entry['tab_object'];
     $tab_a = $entry['tab_acl_category'];
+    $parent = $entry['parent'];
 
     if($entry['method'] == "copy"){
       $entry['object']      = new $tab_c($this->config,$this->config->data['TABS'][$tab_o],"new",$tab_a);
@@ -210,6 +232,9 @@ class CopyPasteHandler {
       $entry['object']      = new $tab_c($this->config,$this->config->data['TABS'][$tab_o],$entry['dn'],$tab_a);
     }
 
+    if($parent ){
+      $entry['object']->parent = $parent;
+    }
     $entry['source_data'] = $this->load_attributes_from_hdd($entry['file_name']);
 
     if($entry['method'] == "copy"){
@@ -245,7 +270,7 @@ class CopyPasteHandler {
       }
       return(unserialize($data));
     }else{
-      $msg= sprintf(_("Cannot load dumped file '%s'!"),$filename);
+      $msg= sprintf(_("Copy and paste failed!")."<br><br>"._("Error").": <i>".msgPool::cannotReadFile($filename)."</i>");
       msg_dialog::display(_("Internal error"), $msg, ERROR_DIALOG);
       new log("copy","all/all",$dn,array(), $msg);
       return(FALSE);
@@ -271,18 +296,29 @@ class CopyPasteHandler {
       /* Put each queued object in one of the above arrays 
        */
       foreach($this->queue as $key => $entry){
-  
+
         /* Update entries on demand 
          */
         if(!isset($entry['object'])){
           $entry = $this->load_entry_from_queue($entry);
           $this->queue[$key] = $entry;
         }
+        $entry= $this->_update_vars($entry);
         $msgs = $entry['object']->check();
-        $acl = $ui->get_category_permissions($entry['dn'], $entry['tab_acl_category']);
+
+        /* To copy an object we require full read access to the object category 
+         */
+        $copy_acl = preg_match("/r/",$ui->has_complete_category_acls($entry['dn'], $entry['tab_acl_category']));
+
+        /* In order to copy an object we require read an delete acls 
+         */
+        $cut_acl  = preg_match("/d/",$ui->has_complete_category_acls($entry['dn'], $entry['tab_acl_category']));
+        $cut_acl &= preg_match("/r/",$ui->has_complete_category_acls($entry['dn'], $entry['tab_acl_category']));
 
         /* Check permissions */
-        if(!preg_match("/((c|w)|(w|c))/",$acl)){
+        if($entry['method'] == "copy" && !$copy_acl){
+          $this->disallowed_objects[$key] = $entry;
+        }elseif($entry['method'] == "cut" && !$cut_acl){
           $this->disallowed_objects[$key] = $entry;
         }elseif(!count($msgs)){
           $this->clean_objects[$key]  = $entry;
@@ -290,6 +326,13 @@ class CopyPasteHandler {
           $this->objects_to_fix[$key] = $entry;
         }
       }
+      if(count($this->disallowed_objects)){
+        $dns = array();
+        foreach($this->disallowed_objects as $entry){
+          $dns[] = $entry['dn'];
+        }
+#        msg_dialog::display(_("Permission"),msgPool::permCreate($dns),INFO_DIALOG);
+      }
       $this->require_update = FALSE;
     }
 
@@ -315,15 +358,17 @@ class CopyPasteHandler {
 
     /* Save edited entry and force loading new one 
      */
-    if(isset($_POST['PerformCopyPaste']) && $this->current){
+    if(isset($this->current['object']) && method_exists($this->current['object'],"saveCopyDialog")) {
       $this->current['object']->saveCopyDialog();
+    }
+
+    if(isset($_POST['PerformCopyPaste']) && $this->current){
       $msgs = $this->check();
 
       /* Load next queue entry */
       if(!count($msgs)){
-        $this->lastdn = $this->current['object']->dn;
-        $this->current= $this->_update_vars($this->current);
         $this->current['object']->save();
+        $this->lastdn = $this->current['object']->dn;
         $this->current = FALSE;
       }else{
         foreach( $msgs as $msg){
@@ -335,17 +380,18 @@ class CopyPasteHandler {
     /* Display a list of all pastable entries 
      */
     if(count($this->clean_objects)){
-      $dns = "";
-      foreach($this->clean_objects as $entry){
-        $dns .= $entry['dn']."\n";
+      
+      $dns = array();
+      foreach($this->clean_objects as $object){
+        $dns[] = $object['dn'];
       }
+
       $smarty = get_smarty();
-      $smarty->assign("type","cut");
+      $smarty->assign("type","directly");
       $smarty->assign("Complete",false);
       $smarty->assign("AttributesToFix","&nbsp;");
       $smarty->assign("SubDialog","");
-      $smarty->assign("objectDN" ,$dns);
-      $smarty->assign("message"  , sprintf(_("You are going to paste the cutted entry '%s'."), "<pre>".$dns."</pre>"));
+      $smarty->assign("message"  , sprintf(_("These objects will be pasted: %s"), "<br>".msgPool::buildList($dns)));
       return($smarty->fetch(get_template_path("copyPasteDialog.tpl",FALSE)));
     }
 
@@ -357,18 +403,19 @@ class CopyPasteHandler {
         $key = key($this->objects_to_fix);
         if(isset($this->objects_to_fix[$key])){
           $this->current = $this->objects_to_fix[$key];
+          $this->current= $this->_update_vars($this->current);
           unset($this->objects_to_fix[$key]);
           unset($this->queue[$key]); 
         }
       }
       if($this->current){
         $smarty = get_smarty();
-        $smarty->assign("type","copy");
+        $smarty->assign("type","modified");
         $smarty->assign("Complete",false);
         $smarty->assign("AttributesToFix",$this->generateAttributesToFix());
         $smarty->assign("SubDialog",$this->current['object']->SubDialog);
         $smarty->assign("objectDN",$this->current['source_data']['dn']);
-        $smarty->assign("message", sprintf(_("You are going to paste the copied entry '%s'."), $this->current['source_data']['dn']));
+        $smarty->assign("message", sprintf(_("This object will be pasted: %s"), "<br><br>".$this->current['source_data']['dn']));
         return($smarty->fetch(get_template_path("copyPasteDialog.tpl",FALSE)));
       }
     }
@@ -431,6 +478,10 @@ class CopyPasteHandler {
 
       /* Update all attributes specified with SetVar */
       foreach($this->setvar_array as $name => $value){
+
+        /* Do not update parent for plugins, this may break things */
+        if($name == "parent") continue;
+
         if(isset($entry['object']->by_object[$key]->$name)){
           $entry['object']->by_object[$key]->$name = $value;
         }
@@ -456,13 +507,13 @@ class CopyPasteHandler {
   /* returns the paste icon for headpages */ 
   function generatePasteIcon()
   {
-    $Copy_Paste= "&nbsp;<img class='center' src='images/list_seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;";
+    $Copy_Paste= "&nbsp;<img class='center' src='images/lists/seperator.png' align='middle' alt='' height='16' width='1'>&nbsp;";
     if($this->entries_queued()){
-      $img= "images/copypaste.png";
+      $img= "images/lists/paste.png";
       $Copy_Paste.= "<input type='image' name='editPaste' class='center'
         src='".$img."' alt='"._("Paste")."'>&nbsp;";
     }else{
-      $Copy_Paste.= "<img class='center' src='images/cant_editpaste.png' alt=\""._("Can't paste")."\">&nbsp;";
+      $Copy_Paste.= "<img class='center' src='images/lists/paste-grey.png' alt=\""._("Cannot paste")."\">&nbsp;";
     }
     return ($Copy_Paste);
   }