- LSldap : Ajout de debug
[ldapsaisie.git] / trunk / includes / class / class.LSldap.php
index 655c073..6e43d42 100644 (file)
@@ -175,20 +175,37 @@ class LSldap {
    * @param[in] $object_type string Type de l'objet Ldap
    * @param[in] $dn string DN de l'entré Ldap
    *
-   * @retval ldapentry Un objet ldapentry (PEAR::Net_LDAP2)
+   * @retval ldapentry|array Un objet ldapentry (PEAR::Net_LDAP2)
+   *                         ou un tableau (si c'est une nouvelle entrée):
+   *                          Array (
+   *                            'entry' => ldapentry,
+   *                            'new' => true
+   *                          )
    */
   function getEntry($object_type,$dn) {
     if(isset($GLOBALS['LSobjects'][$object_type])){
       $obj_conf=$GLOBALS['LSobjects'][$object_type];
       $entry = $this -> cnx -> getEntry($dn);
       if (Net_LDAP2::isError($entry)) {
-        $newentry = new Net_LDAP2_Entry(&$this -> cnx);
-        $newentry -> dn($dn);
-        $newentry -> add(array('objectclass' => $obj_conf['objectclass']));
+        //$newentry = new Net_LDAP2_Entry(&$this -> cnx);
+        //$newentry -> dn($dn);
+        //$newentry -> add(array('objectclass' => $obj_conf['objectclass']));
+        //foreach($obj_conf['attrs'] as $attr_name => $attr_conf) {
+        //  $newentry->add(array($attr_name => $attr_conf['default_value']));
+        //}
+        $attributes = array();
         foreach($obj_conf['attrs'] as $attr_name => $attr_conf) {
-          $newentry->add(array($attr_name => $attr_conf['default_value']));
+          if( isset($attr_conf['default_value']) ) {
+            $attributes[$attr_name]=$attr_conf['default_value'];
+          }
+        }
+        
+        $newentry = $this -> getNewEntry($dn,$obj_conf['objectclass'],$attributes);
+        
+        if (!$newentry) {
+          return;
         }
-        return $newentry;
+        return array('entry' => $newentry,'new' => true);
       }
       else {
         return $entry;
@@ -200,6 +217,28 @@ class LSldap {
     }
   }
   
+ /**
+  * Retourne une nouvelle entrée
+  * 
+  * @param[in] $dn string Le DN de l'objet
+  * @param[in] $objectClass array Un tableau contenant les objectClass de l'objet
+  * @param[in] $attrs array Un tabeau du type array('attr_name' => attr_value, ...)
+  * 
+  * @retval mixed Le nouvelle objet en cas de succès, false sinon
+  */
+  function getNewEntry($dn,$objectClass,$attrs,$add=false) {
+    $newentry = Net_LDAP2_Entry::createFresh($dn,array_merge(array('objectclass' =>$objectClass),(array)$attrs));
+    if(Net_LDAP2::isError($newentry)) {
+      return false;
+    }
+    if($add) {
+      if(!$this -> cnx -> add($newentry)) {
+        return;
+      }
+    }
+    return $newentry;
+  }
+  
   /**
    * Met à jour une entrée dans l'annuaire
    * 
@@ -214,9 +253,18 @@ class LSldap {
    * @retval boolean true si l'objet a bien été mis à jour, false sinon
    */
   function update($object_type,$dn,$change) {
-    debug($change);
+    LSdebug($change);
     $dropAttr=array();
-    if($entry=$this -> getEntry($object_type,$dn)) {
+    $entry=$this -> getEntry($object_type,$dn);
+    if (is_array($entry)) {
+      $new = $entry['new'];
+      $entry = $entry['entry'];
+    }
+    else {
+      $new = false;
+    }
+
+    if($entry) {
       foreach($change as $attrName => $attrVal) {
         $drop = true;
         if (is_array($attrVal)) {
@@ -238,20 +286,36 @@ class LSldap {
         }
       }
       $entry -> replace($changeData);
-      debug('change : '.print_r($changeData,true));
-      debug('drop : '.print_r($dropAttr,true));
+      LSdebug('change : <pre>'.print_r($changeData,true).'</pre>');
+      LSdebug('drop : <pre>'.print_r($dropAttr,true).'</pre>');
 
-      $ret = $entry -> update();
-      if (!empty($dropAttr)) {
-        foreach($dropAttr as $attr) {
-          $entry -> delete($attr);
-        }
+      if ($new) {
+        LSdebug('LSldap :: add()');
+        $ret = $this -> cnx -> add($entry);
       }
+      else {
+        LSdebug('LSldap :: update()');
+        $ret = $entry -> update();
+      }
+      
       if (Net_LDAP2::isError($ret)) {
         $GLOBALS['LSerror'] -> addErrorCode(5,$dn);
-        debug('NetLdap-Error : '.$ret->getMessage());
+        $GLOBALS['LSerror'] -> addErrorCode(0,'NetLdap-Error : '.$ret->getMessage());
       }
       else {
+        if (!empty($dropAttr)) {
+          foreach($dropAttr as $attr) {
+            // Méthode buggé : suppression impossible de certain attribut
+            // exemple : jpegPhoto
+            // $entry -> delete($attr);
+            $entry -> replace(array($attr =>array()));
+          }
+          $ret = $entry -> update();
+          if (Net_LDAP2::isError($ret)) {
+            $GLOBALS['LSerror'] -> addErrorCode(6);
+            $GLOBALS['LSerror'] -> addErrorCode(0,'NetLdap-Error : '.$ret->getMessage());
+          }
+        }
         return true;
       }
     }
@@ -299,9 +363,31 @@ class LSldap {
    * @retval boolean True si l'objet à été supprimé, false sinon
    */
   function remove($dn) {
-    return $this -> cnx -> delete($dn);
+    $ret = $this -> cnx -> delete($dn,array('recursive' => true));
+    if (Net_LDAP2::isError($ret)) {
+      $GLOBALS['LSerror'] -> addErrorCode(0,'NetLdap-Error : '.$ret->getMessage());
+      return;
+    }
+    return true;
   }
 
+  /**
+   * Déplace un objet LDAP dans l'annuaire
+   * 
+   * @param[in] $old string Le DN actuel
+   * @param[in] $new string Le futur DN
+   * 
+   * @retval boolean True si l'objet a été déplacé, false sinon
+   */
+  function move($old,$new) {
+    $ret = $this -> cnx -> move($old,$new);
+    if (Net_LDAP2::isError($ret)) {
+      $GLOBALS['LSerror'] -> addErrorCode(7);
+      $GLOBALS['LSerror'] -> addErrorCode(0,'NetLdap-Error : '.$ret->getMessage());
+      return;
+    }
+    return true;
+  }
 }
 
 ?>