Code

Removed jpgraph | qpl license doesn't match our needs
[gosa.git] / gosa-core / include / class_plugin.inc
index 2e12cab6ccc742a8878dd9963fd11ba02da39322..ba5c715c72d8504c21f5a1e96a026576399a1f80 100644 (file)
@@ -145,6 +145,9 @@ class plugin
    */
   function plugin (&$config, $dn= NULL, $object= NULL)
   {
+
+    $this->initTime = microtime(TRUE);
+
     /* Configuration is fine, allways */
     $this->config= &$config;   
     $this->dn= $dn;
@@ -161,6 +164,10 @@ class plugin
       }
     }
 
+    // Create statistic table entry 
+    stats::log('plugin', $class = get_class($this), $category = array($this->acl_category),  $action = 'open', 
+        $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+
     /* Handle new accounts, don't read information from LDAP */
     if ($dn == "new"){
       return;
@@ -282,6 +289,10 @@ class plugin
     session::set('LOCK_VARS_USED_REQUEST',array());
 
     pathNavigator::registerPlugin($this);
+
+    // Create statistic table entry 
+    stats::log('plugin', $class = get_class($this), $category = array($this->acl_category),  $action = 'view', 
+        $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
   }
 
   /*! \brief Removes object from parent
@@ -319,6 +330,13 @@ class plugin
     /*
        $ldap->modify($this->attrs);
      */
+    if($this->initially_was_account){
+        $this->handle_pre_events('remove');
+
+        // Create statistic table entry 
+        stats::log('plugin', $class = get_class($this), $category = array($this->acl_category),  $action = 'remove', 
+                $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+    }
   }
 
 
@@ -334,15 +352,13 @@ class plugin
     /* Save values to object */
     foreach ($this->attributes as $val){
       if (isset ($_POST["$val"]) && $this->acl_is_writeable($val)){
+  
         /* Check for modifications */
-        if (get_magic_quotes_gpc()) {
-          $data= stripcslashes($_POST["$val"]);
-        } else {
-          $data= $this->$val = $_POST["$val"];
-        }
+        $data= get_post($val);
         if ($this->$val != $data){
           $this->is_modified= TRUE;
         }
+        $this->$val = $data;
     
         /* Okay, how can I explain this fix ... 
          * In firefox, disabled option fields aren't selectable ... but in IE you can select these fileds. 
@@ -400,6 +416,45 @@ class plugin
 
     /* Handle tagging */
     $this->tag_attrs($this->attrs);
+
+    if($this->is_new){
+        $this->handle_pre_events('add');
+
+        // Create statistic table entry 
+        stats::log('plugin', $class = get_class($this), $category = array($this->acl_category),  $action = 'create', 
+                $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+    }else{
+        $this->handle_pre_events('modify');
+
+        // Create statistic table entry 
+        stats::log('plugin', $class = get_class($this), $category = array($this->acl_category),  $action = 'modify', 
+                $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+    }
+  }
+
+
+  /*! \brief    Forward command execution requests
+   *             to the hook execution method.
+   */
+  function handle_pre_events($mode, $addAttrs= array())
+  {
+    if(!in_array($mode, array('add','remove','modify'))){
+      trigger_error(sprintf("Invalid pre event type given %s! Valid types are [add,modify,remove].", $mode));
+      return;
+    }
+    switch ($mode){
+      case "add":
+        plugin::callHook($this,"PRECREATE", $addAttrs);
+      break;
+
+      case "modify":
+        plugin::callHook($this,"PREMODIFY", $addAttrs);
+      break;
+
+      case "remove":
+        plugin::callHook($this,"PREREMOVE", $addAttrs);
+      break;
+    }
   }
 
 
@@ -466,8 +521,7 @@ class plugin
     }
 
     /* Find hooks entries for this class */
-    $command= $this->config->search(get_class($this), "CHECK", array('menu', 'tabs'));
-
+    $command = $this->config->configRegistry->getPropertyValue(get_class($this),"check");
     if ($command != ""){
 
       if (!check_command($command)){
@@ -861,7 +915,7 @@ class plugin
 
     // Migrate objectgroups if needed
     $ogroups = get_sub_list("(&(objectClass=gosaGroupOfNames)(member=".LDAP::prepare4filter(LDAP::fix($src_dn))."))",
-      "ogroups", array(get_ou("ogroupRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
+      "ogroups", array(get_ou("group", "ogroupRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
 
     // Walk through all objectGroups
     foreach($ogroups as $ogroup){
@@ -877,7 +931,7 @@ class plugin
     }
 
     // Migrate rfc groups if needed
-    $groups = get_sub_list("(&(objectClass=posixGroup)(member=".LDAP::prepare4filter(LDAP::fix($src_dn))."))","groups", array(get_ou("groupRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
+    $groups = get_sub_list("(&(objectClass=posixGroup)(member=".LDAP::prepare4filter(LDAP::fix($src_dn))."))","groups", array(get_ou("core", "groupRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
 
     // Walk through all POSIX groups
     foreach($groups as $group){
@@ -888,7 +942,7 @@ class plugin
     }
 
     /* Update roles to use the new entry dn */
-    $roles = get_sub_list("(&(objectClass=organizationalRole)(roleOccupant=".LDAP::prepare4filter(LDAP::fix($src_dn))."))","roles", array(get_ou("roleRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
+    $roles = get_sub_list("(&(objectClass=organizationalRole)(roleOccupant=".LDAP::prepare4filter(LDAP::fix($src_dn))."))","roles", array(get_ou("roleGeneric", "roleRDN")),$this->config->current['BASE'],array("dn"), GL_SUBSEARCH | GL_NO_ACL_CHECK);
 
     // Walk through all roles
     foreach($roles as $role){
@@ -916,6 +970,11 @@ class plugin
         trigger_error(sprintf("Failed to update manager for %s: %s", bold($entry['dn']), $ldap->get_error()));
       }
     }
+
+    // Migrate 'dyn-groups' here. labeledURIObject
+    if(class_available('DynamicLdapGroup')) {
+        DynamicLdapGroup::moveDynGroup($this->config,$src_dn,$dst_dn);
+    }
  
     /* Check if there are gosa departments moved. 
        If there were deps moved, the force reload of config->deps.
@@ -943,7 +1002,10 @@ class plugin
       return(TRUE);
     }
 
-    
+    // Create statistic table entry 
+    stats::log('plugin', $class = get_class($this), $category = array($this->acl_category),  $action = 'move', 
+            $amount = 1, $duration = (microtime(TRUE) - $this->initTime));
+
     /* Try to move the entry instead of copy & delete
      */
     if(TRUE){
@@ -1138,65 +1200,9 @@ class plugin
   }
 
 
- /* \brief 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']);
-   $cfg= &$this->config->current;
-
-   /* check if there are special server configurations for snapshots */
-   if($this->config->get_cfg_value("snapshotURI") == ""){
-     $ldap_to      = $ldap;
-   }else{
-     $server         = $this->config->get_cfg_value("snapshotURI");
-     $user           = $this->config->get_cfg_value("snapshotAdminDn");
-     $password       = $this->config->get_credentials($this->config->get_cfg_value("snapshotAdminPassword"));
-     $snapldapbase   = $this->config->get_cfg_value("snapshotBase");
-     $ldap_to        = new ldapMultiplexer(new LDAP($user,$password, $server));
-     $ldap_to -> cd($snapldapbase);
-     if (!$ldap_to->success()){
-       msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $snapldapbase, "", get_class()));
-     }
-   }
-
-   /* Prepare bases and some other infos */
-   $base           = $this->config->current['BASE'];
-   $snap_base      = $this->config->get_cfg_value("snapshotBase");
-   $base_of_object = preg_replace ('/^[^,]+,/i', '', $dn);
-   $new_base       = preg_replace("/".preg_quote($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);
- }
-
-  /*! \brief Return plugin informations for acl handling */
+  /*! \brief Return plugin informations for acl handling 
+   *         See class_core.inc for examples.
+   */
   static function plInfo()
   {
     return array();
@@ -1501,12 +1507,7 @@ class plugin
 
       if (isset ($_POST["$val"]) && $this->acl_is_writeable($val)){
 
-        /* Check for modifications */
-        if (get_magic_quotes_gpc()) {
-          $data= stripcslashes($_POST["$val"]);
-        } else {
-          $data= $this->$val = $_POST["$val"];
-        }
+        $data= $this->$val = get_post($val);
         if ($this->$val != $data){
           $this->is_modified= TRUE;
         }
@@ -1542,131 +1543,6 @@ class plugin
     return($message);
   }
 
-
-  /*! \brief  Returns the snapshot header part for "Actions" menu in management dialogs 
-      \param  $layer_menu  
-   */   
-  function get_snapshot_header($base,$category)
-  {
-    $str = "";
-    $ui = get_userinfo();
-    if($this->snapshotEnabled() && $ui->allow_snapshot_restore($base,$category)){
-
-      $ok = false;
-      foreach($this->get_used_snapshot_bases() as $base){
-        $ok |= count($this->getAllDeletedSnapshots($base)) >= 1 ;
-      }
-
-      if($ok){
-        $str = "..|<img class='center' src='images/lists/restore.png' ".
-          "alt='"._("Restore")."'>&nbsp;"._("Restore").                       "|RestoreDeletedSnapShot|\n";
-      }else{
-        $str = "..|<img class='center' src='images/lists/restore_grey.png' alt=''>&nbsp;"._("Restore")."||\n";
-      }
-    }
-    return($str);
-  }
-
-
-  function get_snapshot_action($base,$category)
-  {
-    $str= ""; 
-    $ui = get_userinfo();
-    if($this->snapshotEnabled()){
-      if ($ui->allow_snapshot_restore($base,$category)){
-
-        if(count($this->Available_SnapsShots($base))){
-          $str.= "<input class='center' type='image' src='images/lists/restore.png'
-            alt='"._("Restore snapshot")."' name='RestoreSnapShotDialog_".base64_encode($base)."' title='"._("Restore snapshot")."'>&nbsp;";
-        } else {
-          $str = "<img class='center' src='images/lists/restore_grey.png' alt=''>&nbsp;";
-        }
-      }
-      if($ui->allow_snapshot_create($base,$category)){
-        $str.= "<input class='center' type='image' src='images/snapshot.png'
-          alt='"._("Create snapshot")."' name='CreateSnapShotDialog_".base64_encode($base)."' 
-          title='"._("Create new snapshot for this object")."'>&nbsp;";
-      }else{
-        $str = "<img class='center' src='images/empty.png' alt=' '>&nbsp;";
-      }
-    }
-
-    return($str);
-  }
-
-
-  function get_copypaste_action($base,$category,$class,$copy = TRUE, $cut = TRUE)
-  {
-    $ui = get_userinfo();
-    $action = "";
-    if($this->CopyPasteHandler){
-      if($cut){
-        if($ui->is_cutable($base,$category,$class)){
-          $action .= "<input class='center' type='image'
-            src='images/lists/cut.png' alt='"._("Cut")."' name='cut_%KEY%' title='"._("Cut this entry")."'>&nbsp;";
-        }else{
-          $action.="<img src='images/empty.png' alt=' ' class='center'>&nbsp;";
-        }
-      }
-      if($copy){
-        if($ui->is_copyable($base,$category,$class)){
-          $action.= "<input class='center' type='image'
-            src='images/lists/copy.png' alt='"._("Copy")."' name='copy_%KEY%' title='"._("Copy this entry")."'>&nbsp;";
-        }else{
-          $action.="<img src='images/empty.png' alt=' ' class='center'>&nbsp;";
-        }
-      }
-    }
-
-    return($action); 
-  }
-
-
-  function get_copypaste_header($base,$category,$copy = TRUE, $cut = TRUE)
-  {
-    $s = "";
-    $ui =get_userinfo();
-
-    if(!is_array($category)){
-      $category = array($category);
-    }
-
-    /* Check permissions for each category, if there is at least one category which 
-        support read or paste permissions for the given base, then display the specific actions.
-     */
-    $readable = $pasteable = false;
-    foreach($category as $cat){
-      $readable= $readable || preg_match('/r/', $ui->get_category_permissions($base, $cat));
-      $pasteable= $pasteable || $ui->is_pasteable($base, $cat) == 1;
-    }
-  
-    if(($cut || $copy) && isset($this->CopyPasteHandler) && is_object($this->CopyPasteHandler)){
-      if($readable){
-        $s.= "..|---|\n";
-        if($copy){
-          $s.= "..|<img src='images/lists/copy.png' alt='' border='0' class='center'>".
-            "&nbsp;"._("Copy")."|"."multiple_copy_systems|\n";
-        }
-        if($cut){
-          $s.= "..|<img src='images/lists/cut.png' alt='' border='0' class='center'>".
-            "&nbsp;"._("Cut")."|"."multiple_cut_systems|\n";
-        }
-      }
-
-      if($pasteable){
-        if($this->CopyPasteHandler->entries_queued()){
-          $img = "<img border='0' class='center' src='images/lists/paste.png' alt=''>";
-          $s.="..|".$img."&nbsp;"._("Paste")."|editPaste|\n";
-        }else{
-          $img = "<img border='0' class='center' src='images/lists/paste-grey.png' alt=''>";
-          $s.="..|".$img."&nbsp;"._("Paste")."\n";
-        }
-      }
-    }
-    return($s);
-  }
-
-
   function get_used_snapshot_bases()
   {
      return(array());
@@ -1707,10 +1583,11 @@ class plugin
    *            Replaces placeholder by class values of this plugin instance.
    *  @param    Allows to a add special replacements.
    */
-  static function callHook($plugin, $cmd, $addAttrs= array())
+  static function callHook($plugin, $cmd, $addAttrs= array(), &$returnOutput = array(), &$returnCode = NULL)
   {
     global $config;
-    $command= $config->search(get_class($plugin), $cmd,array('menu','tabs'));
+    $command = $config->configRegistry->getPropertyValue(get_class($plugin),$cmd);
+   
     if ($command != ""){
 
       // Walk trough attributes list and add the plugins attributes. 
@@ -1722,6 +1599,7 @@ class plugin
       $ui = get_userinfo();
       $addAttrs['callerDN']=$ui->dn;
       $addAttrs['dn']=$plugin->dn;
+      $addAttrs['location']=$config->current['NAME'];
 
       // Sort attributes by length, ensures correct replacement
       $tmp = array();
@@ -1757,14 +1635,22 @@ class plugin
       }
 
       if (check_command($command)){
+
         @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,$command,"Execute");
-        exec($command,$arr);
-        if(is_array($arr)){
+        exec($command, $arr, $returnCode);
+        $returnOutput = $arr;
+
+        if($returnCode != 0){
+          $str = implode("\n",$arr);
+          @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execution failed code: ".$returnCode);
+          $message= msgPool::cmdexecfailed($cmd,$command, get_class($plugin));
+          msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
+        }elseif(is_array($arr)){
           $str = implode("\n",$arr);
           @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Result: ".$str);
         }
       } else {
-        $message= msgPool::cmdnotfound("POSTCREATE", get_class($plugin));
+        $message= msgPool::cmdinvalid($cmd,$command, get_class($plugin));
         msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
       }
     }