Code

Updated plugin class
[gosa.git] / gosa-core / include / class_plugin.inc
index 9d4434090c60940007e89458bc600473da931d7f..e33b2ec613feebaad84cdcd40bb6e3b1060ac42f 100644 (file)
@@ -111,10 +111,6 @@ class plugin
   var $acl_base= "";
   var $acl_category= "";
 
-  /* Plugin identifier */
-  var $plHeadline= "";
-  var $plDescription= "";
-
   /* This can be set to render the tabulators in another stylesheet */
   var $pl_notify= FALSE;
 
@@ -216,7 +212,7 @@ class plugin
           unset($this->saved_attributes[$index]);
           continue;
         }
-        if ($this->saved_attributes[$index]["count"] == 1){
+        if (isset($this->saved_attributes[$index][0]) || $this->saved_attributes[$index]["count"] == 1){
           $tmp= $this->saved_attributes[$index][0];
           unset($this->saved_attributes[$index]);
           $this->saved_attributes[$index]= $tmp;
@@ -239,10 +235,11 @@ class plugin
   function execute()
   {
     /* This one is empty currently. Fabian - please fill in the docu code */
-    $_SESSION['current_class_for_help'] = get_class($this);
+    session::set('current_class_for_help',get_class($this));
 
     /* Reset Lock message POST/GET check array, to prevent perg_match errors*/
-    $_SESSION['LOCK_VARS_TO_USE'] = $_SESSION['LOCK_VARS_USED'] =array();
+    session::set('LOCK_VARS_TO_USE',array());
+    session::set('LOCK_VARS_USED',array());
   }
 
   /*! \brief execute plugin
@@ -317,9 +314,6 @@ class plugin
           $data = "";  
         }
         $this->$val= $data;
-        //echo "<font color='blue'>".$val."</font><br>";
-      }else{
-        //echo "<font color='red'>".$val."</font><br>";
       }
     }
   }
@@ -363,6 +357,8 @@ class plugin
       }
     }
 
+    /* Handle tagging */
+    $this->tag_attrs(&$this->attrs);
   }
 
 
@@ -622,7 +618,7 @@ class plugin
         exec($command);
       } else {
         $message= sprintf(_("Command '%s', specified as POSTCREATE for plugin '%s' doesn't seem to exist."), $command, get_class($this));
-        print_red ($message);
+        msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
       }
     }
   }
@@ -654,7 +650,7 @@ class plugin
         exec($command);
       } else {
         $message= sprintf(_("Command '%s', specified as POSTMODIFY for plugin '%s' doesn't seem to exist."), $command, get_class($this));
-        print_red ($message);
+        msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
       }
     }
   }
@@ -690,7 +686,7 @@ class plugin
         exec($command);
       } else {
         $message= sprintf(_("Command '%s', specified as POSTREMOVE for plugin '%s' doesn't seem to exist."), $command, get_class($this));
-        print_red ($message);
+        msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
       }
     }
   }
@@ -821,7 +817,7 @@ class plugin
   {
     /* Rename dn in possible object groups */
     $ldap= $this->config->get_ldap_link();
-    $ldap->search('(&(objectClass=gosaGroupOfNames)(member='.@LDAP::fix($src_dn).'))',
+    $ldap->search('(&(objectClass=gosaGroupOfNames)(member='.@LDAP::prepare4filter($src_dn).'))',
         array('cn'));
     while ($attrs= $ldap->fetch()){
       $og= new ogroup($this->config, $ldap->getDN());
@@ -859,6 +855,11 @@ class plugin
 
   function move($src_dn, $dst_dn)
   {
+    /* Do not copy if only upper- lowercase has changed */
+    if(strtolower($src_dn) == strtolower($dst_dn)){
+      return(TRUE);
+    }
+
     /* Copy source to destination */
     if (!$this->copy($src_dn, $dst_dn)){
       return (FALSE);
@@ -973,26 +974,18 @@ class plugin
               $tmp = $source[$var][$i];
             }
             $this->$var = $tmp;
-#            echo $var."=".$tmp."<br>";
           }else{
             $this->$var = $source[$var][0];
-#            echo $var."=".$source[$var][0]."<br>";
           }
         }else{
           $this->$var= $source[$var];
-#          echo $var."=".$source[$var]."<br>";
         }
       }
     }
   }
 
-
-  function handle_object_tagging($dn= "", $tag= "", $show= false)
+  function tag_attrs($at, $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;
@@ -1030,71 +1023,17 @@ class plugin
       }
     }
 
+    /* Remove tags that may already be here... */
+    remove_objectClass("gosaAdministrativeUnitTag", &$at);
+    if (isset($at['gosaUnitTag'])){
+        unset($at['gosaUnitTag']);
+    }
 
     /* 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))."<br>";
-          flush();
-        }
-        return;
-      }
-      if (count($attrs)){
-        if ($show){
-          echo sprintf(_("Adding tag (%s) to object '%s'"), $tag, @LDAP::fix($dn))."<br>";
-          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))."<br>";
-          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_objectClass("gosaAdministrativeUnitTag", &$at);
+      $at['gosaUnitTag']= $tag;
     }
-
   }
 
 
@@ -1211,7 +1150,7 @@ class plugin
 
         /* 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."),"SNAPSHOT_BASE"));
+          msg_dialog::display(_("Configuration error"), sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not set."),"SNAPSHOT_BASE"), ERROR_DIALOG);
           return(FALSE);
         }
 
@@ -1223,7 +1162,7 @@ class plugin
           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));
+              msg_dialog::display(_("Configuration error"), sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not set."), $missing), ERROR_DIALOG);
               return(FALSE);
             }
           }
@@ -1448,7 +1387,7 @@ class plugin
       $msgs = $this->snapDialog->check();
       if(count($msgs)){
         foreach($msgs as $msg){
-          print_red($msg);
+          msg_dialog::display(_("Error"), $msg, ERROR_DIALOG);
         }
       }else{
         $this->dn =  $this->snapDialog->dn;
@@ -1574,12 +1513,12 @@ class plugin
     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."<br> ";
+      trigger_error("No default base found in class ".get_class($this).". ".$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
@@ -1593,8 +1532,10 @@ class plugin
     }
 
     /* Update userinfo if necessary */
-    if($_SESSION['ui']->dn == $old_dn){
-      $_SESSION['ui']->dn = $new_dn;
+    $ui = session::get('ui');
+    if($ui->dn == $old_dn){
+      $ui->dn = $new_dn;
+      session::set('ui',$ui);
       new log("view","acl/".get_class($this),$this->dn,array(),"Updated current user dn from '".$old_dn."' to '".$new_dn."'");
     }
 
@@ -1655,14 +1596,10 @@ class plugin
        /* Acls for this object must be adjusted */
        if($found){
 
-          if($output_changes){
-            echo "<font color='green'>".
-                  _("Changing ACL dn")."&nbsp;:&nbsp;<br>&nbsp;-"._("from")."&nbsp;<b>&nbsp;".
-                  $old_dn.
-                  "</b><br>&nbsp;-"._("to")."&nbsp;<b>".
-                  $new_dn.
-                  "</b></font><br>";
-          }
+          $debug_info=  _("Changing ACL dn")."&nbsp;:&nbsp;<br>&nbsp;-"._("from")."&nbsp;<b>&nbsp;".
+                  $old_dn."</b><br>&nbsp;-"._("to")."&nbsp;<b>".$new_dn."</b><br>";
+          @DEBUG (DEBUG_ACL, __LINE__, __FUNCTION__, __FILE__,$debug_info,"ACL");
+
           $update[$attrs['dn']] =array();
           foreach($acls as $acl){
             $update[$attrs['dn']]['gosaAclEntry'][] = $acl;
@@ -1706,11 +1643,22 @@ class plugin
     foreach ($this->attributes as $val){
       $found= array_key_ics($val, $this->multi_attrs);
       if ($found != ""){
-        $this->$val= $this->multi_attrs["$found"][0];
+        if(isset($this->multi_attrs["$found"][0])){
+          $this->$val= $this->multi_attrs["$found"][0];
+        }
       }
     }
   }
 
+  /*! \brief  Enables multiple support for this plugin
+   */
+  function enable_multiple_support()
+  {
+    $this->ignore_account = TRUE;
+    $this->multiple_support_active = TRUE;
+  }
+
 
   /*! \brief  Returns all values that have been modfied in multiple edit mode.
       @return array Cotaining all mdofied values. 
@@ -1744,10 +1692,11 @@ class plugin
   function multiple_execute()
   {
     /* This one is empty currently. Fabian - please fill in the docu code */
-    $_SESSION['current_class_for_help'] = get_class($this);
+    session::set('current_class_for_help',get_class($this));
 
     /* Reset Lock message POST/GET check array, to prevent perg_match errors*/
-    $_SESSION['LOCK_VARS_TO_USE'] = $_SESSION['LOCK_VARS_USED'] =array();
+    session::set('LOCK_VARS_TO_USE',array());
+    session::set('LOCK_VARS_USED',array());
     
     return("Multiple edit is currently not implemented for this plugin.");
   }
@@ -1764,11 +1713,13 @@ class plugin
     /* Save values to object */
     $this->multi_boxes = array();
     foreach ($this->attributes as $val){
-      if ($this->acl_is_writeable($val) && isset ($_POST["$val"])){
+  
+      /* Get selected checkboxes from multiple edit */
+      if(isset($_POST["use_".$val])){
+        $this->multi_boxes[] = $val;
+      }
 
-        if(isset($_POST["use_".$val])){
-          $this->multi_boxes[] = $val;
-        }
+      if ($this->acl_is_writeable($val) && isset ($_POST["$val"])){
 
         /* Check for modifications */
         if (get_magic_quotes_gpc()) {
@@ -1790,6 +1741,18 @@ class plugin
   }
 
 
+  /*! \brief  Returns all attributes of this plugin, 
+               to be able to detect multiple used attributes 
+               in multi_plugg::detect_multiple_used_attributes().
+      @return array Attributes required for intialization of multi_plug
+   */
+  public function get_multi_init_values()
+  {
+    $attrs = $this->attrs;
+    return($attrs);
+  }
+
+
   /*! \brief  Check given values in multiple edit
       @return array Error messages
    */