Code

Updated gosaSupportDaemon
[gosa.git] / gosa-core / include / class_ldap.inc
index 11e3fc88448ef0ce0e96febafa81c01d286ed073..93686b6e63476d594db051f1edf22eb8e005d9ac 100644 (file)
@@ -1,12 +1,26 @@
 <?php
-/*****************************************************************************
-  newldap.inc - version 1.0
-  Copyright (C) 2003 Alejandro Escanero Blanco <aescanero@chaosdimension.org>
-  Copyright (C) 2004-2006 Cajus Pollmeier <pollmeier@gonicus.de>
-
-  Based in code of ldap.inc of
-  Copyright (C) 1998  Eric Kilfoil <eric@ipass.net>
- *****************************************************************************/
+/*
+ * This code is part of GOsa (http://www.gosa-project.org)
+ * Copyright (C) 2003-2008 GONICUS GmbH
+ * Copyright (C) 2003 Alejandro Escanero Blanco <aescanero@chaosdimension.org>
+ * Copyright (C) 1998  Eric Kilfoil <eric@ipass.net>
+ *
+ * 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("ALREADY_EXISTING_ENTRY",-10001);
 define("UNKNOWN_TOKEN_IN_LDIF_FILE",-10002);
@@ -32,6 +46,8 @@ class LDAP{
   var $referrals= array();
   var $max_ldap_query_time = 0;   // 0, empty or negative values will disable this check 
 
+  var $re = NULL;  
+
   function LDAP($binddn,$bindpw, $hostname, $follow_referral= FALSE, $tls= FALSE)
   {
     global $config;
@@ -91,6 +107,14 @@ class LDAP{
   }
 
 
+  /* Function to fix problematic characters in DN's that are used for search
+     requests. I.e. member=....                                               */
+  static function prepare4filter($dn)
+  {
+       return normalizeLdap(preg_replace('/\\\\/', '\\\\\\', LDAP::fix($dn)));
+  }
+
+
   function connect()
   {
     $this->hascon=false;
@@ -176,13 +200,33 @@ class LDAP{
     return(ereg_replace("[^,]*[,]*[ ]*(.*)", "\\1", $basedn));
   }
 
+  
+# /* Checks if there is still unfetched data 
+#  */
+# function checkResult()
+# {
+#   /* Check if we have started a search before  */
+#   if($this->start != 0 && $this->re){
+#     
+#     /* Check if there are still unfetched elements */
+#     if(is_resource(@ldap_next_entry($this->cid, $this->re))){
+#       new log("debug","LDAP:: CAT/SEARCH/FETCH","A new search was initiated while an older search wasn't fetched completely.");
+#       msg_dialog::display(_("Debug"),"A new search was initiated while an older search wasn't fetched completely.",ERROR_DIALOG);
+#       trigger_error("A new search was initiated while an older search wasn't fetched completely.");
+#     }
+#   }
+# }
+#
   function search($filter, $attrs= array())
   {
     if($this->hascon){
       if ($this->reconnect) $this->connect();
 
+#      /* Check if there are still unfetched objects from last search 
+#       */
+#      $this->checkResult();
+
       $start = microtime();
-   
       $this->clearResult();
       $this->sr = @ldap_search($this->cid, LDAP::fix($this->basedn), $filter, $attrs);
       $this->error = @ldap_error($this->cid);
@@ -193,7 +237,7 @@ class LDAP{
       if($this->max_ldap_query_time){
         $diff = get_MicroTimeDiff($start,microtime());
         if($diff > $this->max_ldap_query_time){
-          print_red(sprintf(_("The LDAP server is slow (%.2fs for the last query). This may be responsible for performance breakdowns."),$diff)) ;
+          msg_dialog::display(_("Performance warning"), sprintf(_("LDAP performance is poor: last query took about %.2fs!"), $diff), WARNING_DIALOG);
         }
       }
 
@@ -209,6 +253,11 @@ class LDAP{
   {
     if($this->hascon){
       if ($this->reconnect) $this->connect();
+
+#      /* Check if there are still unfetched objects from last search 
+#       */
+#      $this->checkResult();
+
       $this->clearResult();
       if ($basedn == "")
         $basedn = $this->basedn;
@@ -225,7 +274,7 @@ class LDAP{
       if($this->max_ldap_query_time){
         $diff = get_MicroTimeDiff($start,microtime());
         if($diff > $this->max_ldap_query_time){
-          print_red(sprintf(_("The ldapserver is answering very slow (%.2f), this may be responsible for performance breakdowns."),$diff)) ;
+          msg_dialog::display(_("Performance warning"), sprintf(_("LDAP performance is poor: last query took about %.2fs!"), $diff), WARNING_DIALOG);
         }
       }
 
@@ -242,6 +291,11 @@ class LDAP{
   {
     if($this->hascon){
       if ($this->reconnect) $this->connect();
+
+#      /* Check if there are still unfetched objects from last search 
+#       */
+#      $this->checkResult();
+
       $this->clearResult();
       $filter = "(objectclass=*)";
       $this->sr = @ldap_read($this->cid, LDAP::fix($dn), $filter,$attrs);
@@ -444,175 +498,6 @@ class LDAP{
     }
   }
 
-  /* Copy given attributes and sub-dns with attributes to destination dn 
-  */
-  function copy_FAI_resource_recursive($sourcedn,$destinationdn,$destinationName,$type="branch",$is_first = true,$depth=0)
-  {
-    error_reporting(E_ALL | E_STRICT);
-    
-    if($is_first){
-      echo "<h2>".sprintf(_("Creating copy of %s"),"<i>".LDAP::fix($sourcedn)."</i>")."</h2>";
-    }else{
-      if(preg_match("/^ou=/",$sourcedn)){
-        echo "<h3>"._("Processing")." <i>".LDAP::fix($destinationdn)."</i></h3>";
-      }else{
-        $tmp = split(",",$sourcedn);
-        
-        echo "&nbsp;<b>"._("Object").":</b> ";
-
-        $deststr = LDAP::fix($destinationdn);
-        if(strlen($deststr) > 96){
-          $deststr = substr($deststr,0,96)."...";
-        }
-
-        echo $deststr."<br>";
-      }
-    }
-
-    flush();
-    
-    if($this->hascon){
-      if ($this->reconnect) $this->connect();
-
-      /* Save base dn */
-      $basedn= $this->basedn;
-      $delarray= array();
-     
-      /* Check if destination entry already exists */
-      $this->cat($destinationdn);
-
-      if($this->count()){
-        return;
-      }else{
-        
-        $this->clearResult();
-
-        /* Get source entry */
-        $this->cd($basedn);
-        $this->cat($sourcedn);
-        $attr = $this->fetch();
-
-        /* Error while fetching object / attribute abort*/
-        if((!$attr) || (count($attr)) ==0) {
-          echo _("Error while fetching source dn - aborted!");
-          return;
-        }
-  
-        /* check if this is a department */
-        if(in_array("organizationalUnit",$attr['objectClass'])){
-          $attr['dn'] = LDAP::convert($destinationdn);
-          $this->cd($basedn);
-          $this->create_missing_trees($destinationdn);
-          $this->cd($destinationdn);
-
-          /* If is first entry, append FAIbranch to department entry */
-          if($is_first){
-            $this->cat($destinationdn);
-            $attr= $this->fetch();
-
-            /* Filter unneeded informations */
-            foreach($attr as $key => $value){
-              if(is_numeric($key)) unset($attr[$key]);
-              if(isset($attr[$key]['count'])){
-                if(is_array($attr[$key])){
-                  unset($attr[$key]['count']);
-                }
-              }
-            }
-            
-            unset($attr['count']);
-            unset($attr['dn']);
-
-            /* Add marking attribute */
-            $attr['objectClass'][] = "FAIbranch";
-            
-            /* Add this entry */
-            $this->modify($attr);
-          }
-        }else{
-
-          /* If this is no department */
-          foreach($attr as $key => $value){
-            if(in_array($key ,array("FAItemplateFile","FAIscript", "gotoLogonScript", "gosaApplicationIcon","gotoMimeIcon"))){
-              $sr= ldap_read($this->cid, LDAP::fix($sourcedn), "$key=*", array($key));
-              $ei= ldap_first_entry($this->cid, $sr);
-              if ($tmp= @ldap_get_values_len($this->cid, $ei,$key)){
-                $attr[$key] = $tmp;
-              }
-            }
-
-            if(is_numeric($key)) unset($attr[$key]);
-            if(isset($attr[$key]['count'])){
-              if(is_array($attr[$key])){
-                unset($attr[$key]['count']);
-              }
-            }
-          }
-          unset($attr['count']);
-          unset($attr['dn']);
-
-          if((!in_array("gosaApplication" , $attr['objectClass'])) && (!in_array("gotoMimeType", $attr['objectClass']))){
-            $attr['FAIdebianRelease'] = $destinationName;
-            if($type=="branch"){
-              $attr['FAIstate'] ="branch";
-            }elseif($type=="freeze"){
-              $attr['FAIstate'] ="freeze";
-            }else{
-              print_red(_("Unknown FAIstate %s"),$type);
-            }
-          }
-
-          /* Replace FAIdebianRelease with new release name */
-          if(in_array("FAIpackageList" , $attr['objectClass'])){
-            $attr['FAIdebianRelease'] = $destinationName; 
-          }
-
-          /* Add entry */
-          $this->cd($destinationdn);
-          $this->cat($destinationdn);
-          $a = $this->fetch();
-          if(!count($a)){
-            $this->add($attr);
-          }
-
-          if($this->error != "Success"){
-            /* Some error occurred */
-            print "---------------------------------------------";
-            print $this->get_error()."<br>";
-            print $sourcedn."<br>";
-            print $destinationdn."<br>";
-            print_a( $attr);
-            exit();
-          }          
-        }
-      }
-
-      echo "<script language=\"javascript\" type=\"text/javascript\">scrollDown2();</script>" ;
-
-      $this->ls ("(objectClass=*)",$sourcedn);
-      while ($this->fetch()){
-        $deldn= $this->getDN();
-        $delarray[$deldn]= strlen($deldn);
-      }
-      asort ($delarray);
-      reset ($delarray);
-
-       $depth ++;
-      foreach($delarray as $dn => $bla){
-        if($dn != $destinationdn){
-          $this->cd($basedn);
-          $item = $this->fetch($this->cat($dn));
-          if(!in_array("FAIbranch",$item['objectClass'])){
-            $this->copy_FAI_resource_recursive($dn,str_replace($sourcedn,$destinationdn,$dn),$destinationName,$type,false,$depth);
-          } 
-        }
-      }
-    }
-    if($is_first){
-      echo "<p class='seperator'>&nbsp;</p>";
-    }
-
-  }
 
   function modify($attrs)
   {
@@ -719,8 +604,8 @@ class LDAP{
 
           /* Bail out, if we've nothing to do... */
           if ($ocname == ""){
-            print_red(sprintf(_("Autocreation of subtree failed. No objectClass found for attribute '%s'."), $type));
-            display_error_page();
+            msg_dialog::display(_("Internal error"), sprintf(_("Cannot automatically create subtrees with RDN '%s': no object class found"),$type), FATAL_ERROR_DIALOG);
+            exit();
           }
 
           /* Assemble_entry */
@@ -767,8 +652,8 @@ class LDAP{
               $na["dc"]= $param;
               break;
             default:
-              print_red(sprintf(_("Autocreation of type '%s' is currently not supported. Please report to the GOsa team."), $type));
-              display_error_page();
+              msg_dialog::display(_("Internal error"), sprintf(_("Cannot automatically create subtrees with RDN '%s': not supported"),$type), FATAL_ERROR_DIALOG);
+              exit();
           }
 
         }
@@ -1271,6 +1156,12 @@ class LDAP{
         return($objectclasses);
       } 
     }
+
+    /* Return the cached results. */
+    if(class_available('session') && session::is_set("LDAP_CACHE::get_objectclasses")){
+      $objectclasses = session::get("LDAP_CACHE::get_objectclasses");
+      return($objectclasses);
+    }
        
          # Get base to look for schema 
          $sr = @ldap_read ($this->cid, NULL, "objectClass=*", array("subschemaSubentry"));
@@ -1334,6 +1225,9 @@ class LDAP{
       }
 
          }
+    if(class_available("session")){
+      session::set("LDAP_CACHE::get_objectclasses",$objectclasses);
+    }
          return $objectclasses;
   }
 
@@ -1363,7 +1257,7 @@ class LDAP{
   function log($string)
   {
     if (session::is_set('config')){
-      $cfg= $_SESSION['config'];
+      $cfg = session::get('config');
       if (isset($cfg->current['LDAPSTATS']) && preg_match('/true/i', $cfg->current['LDAPSTATS'])){
         syslog (LOG_INFO, $string);
       }
@@ -1430,9 +1324,6 @@ class LDAP{
 
     return ($result);
   }
-
-
 }
-
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>