- LSldapObject :
authorBenjamin Renard <brenard@easter-eggs.com>
Tue, 29 Jul 2008 13:45:02 +0000 (13:45 +0000)
committerBenjamin Renard <brenard@easter-eggs.com>
Tue, 29 Jul 2008 13:45:02 +0000 (13:45 +0000)
  -> Ajout de la possibilité de changer le RDN d'un objet
    -> Mise à jour automatique des relations définis avec les autres types
    d'objet à partir du moment que le paramètre 'rename_function' est défini
    dans la configuration de la relation
    -> Ajout des méthodes suivantes :
      -> beforeRename() : Executer avant le changement de DN elle permet de
      préparer le renomage.
      -> afterRename() : Executer après le changement de DN elle finalise le
      renomage.
    -> Méthode submitData() : prise en charge du changement du RDN
- LSrelation :
  -> Correction d'une erreur dans index_ajax.php : le paramètre
  $relationConf['remove_function'] n'était pas utilisé
- LSeegroup :
  -> Création d'une propriété $userObjectType pour stocké le type des objets
  utilisateurs
  -> Création de la méthode renameOneMember() pour assurer les modifications
  nécéssaire lors du changement de DN d'un utilisateur
- LSformElement_date : Suppression du chargement du fichier js : calendar-setup
  inutile l'utilisation faite de jscalendar.
- LSattribute :
  -> Ajout d'une possibilité pour générer une valeur à partir d'un format de
  chaine et la méthode getFData() des objets LSldapObject. Cette méthode fait
  référence au paramètre 'generate_value_format' de la configuration d'un
  attribut pour générer la valeur
- LSldap :
  -> Ajout d'une méthode move() pour changer le DN d'un objet
- LSsession :
  -> Ajout de la méthode changeAuthUser() pour changer l'utilisateur connecté
  en cour de session. (Utile lors de la modification de l'utilisateur par lui
  même)
- functions.php : Correction d'un bug dans la fontion getFData().
- modify.php : Vérification des droits de l'utilisateur après chargement et
  eventuellement modification de celui-ci pour intégrer les eventuelles
  modifications faites par l'utilisateur.

12 files changed:
trunk/conf/LSobjects/config.LSobjects.LSeepeople.php
trunk/conf/config.error_code.php
trunk/includes/class/class.LSattribute.php
trunk/includes/class/class.LSformElement_date.php
trunk/includes/class/class.LSldap.php
trunk/includes/class/class.LSldapObject.php
trunk/includes/class/class.LSobjects.LSeegroup.php
trunk/includes/class/class.LSobjects.LSeepeople.php
trunk/includes/class/class.LSsession.php
trunk/includes/functions.php
trunk/index_ajax.php
trunk/modify.php

index f28cce6..a5f7ba7 100644 (file)
@@ -39,7 +39,8 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
       'LSobject' => 'LSeegroup',
       'list_function' => 'listUserGroups',
       'update_function' => 'updateUserGroups',
-      'remove_function' => 'removeMember',
+      'remove_function' => 'deleteOneMember',
+      'rename_function' => 'renameOneMember',
       'rights' => array(
         'self' => 'r',
         'admin' => 'w'
@@ -72,8 +73,11 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
       ),
       'view' => 1,
       'form' => array (
-        'modify' => 0,
+        'modify' => 1,
         'create' => 1
+      ),
+      'dependAttrs' => array(
+        'homeDirectory'
       )
     ),
     'uidNumber' => array (
@@ -243,15 +247,11 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
       'ldap_type' => 'ascii',
       'html_type' => 'text',
       'required' => 1,
-      'default_value' => '/home/%{uid}',
       'generate_function' => 'generate_homeDirectory',
       'rights' => array(
         'self' => 'r'
       ),
-      'view' => 1,
-      'form' => array (
-        'modify' => 1,
-      )
+      'view' => 1
     ),
     'mail' => array (
       'label' => _('Adresse e-mail'),
index beb7b12..729f084 100644 (file)
@@ -116,8 +116,16 @@ $GLOBALS['LSerror_code'] = array (
     'msg' => _("LSldapObject : Erreur durant la suppression de %{objectname}."),
     'level' => 'c'
   ),
+  36 => array (
+    'msg' => _("LSldapObject : Erreur durant les actions avant renomage."),
+    'level' => 'c'
+  ),
+  37 => array (
+    'msg' => _("LSldapObject : Erreur durant les actions après renomage."),
+    'level' => 'c'
+  ),
   
-  // LSldapObject
+  // LSattribute
   41 => array (
     'msg' => _("LSattribute : Attribut %{attr} : Type d'attribut (ldap // html) inconnu (ldap = %{ldap} | html = %{html})."),
     'level' => 'c'
index d51533b..903eefc 100644 (file)
@@ -404,7 +404,15 @@ class LSattribute {
    * @retval boolean true si la valeur de l'attribut peut être générée, false sinon
    */
   function canBeGenerated() {
-    return (function_exists($this -> config['generate_function']));
+    if (function_exists($this -> config['generate_function'])) {
+      return true;
+    }
+    else if (isset($this -> config['generate_value_format'])) {
+      return true;
+    }
+    else {
+      return ;
+    }
   }
 
   /**
@@ -415,10 +423,12 @@ class LSattribute {
    * @retval boolean true si la valeur à put être générée, false sinon
    */
   function generateValue() {
-    if ( ! $this -> canBeGenerated() ) {
-      return;
+    if (function_exists($this -> config['generate_function'])) {
+      $value=call_user_func($this -> config['generate_function'],$this -> ldapObject);
+    }
+    else if (isset($this -> config['generate_value_format'])) {
+      $value = $this -> ldapObject -> getFData($this -> config['generate_value_format']);
     }
-    $value=call_user_func($this -> config['generate_function'],$this -> ldapObject);
     if (!empty($value)) {
       //$this -> setValue($value); // pas nécéssaire ??
       $this -> updateData=array($value);
index 8c8970e..8f78e66 100644 (file)
@@ -149,7 +149,7 @@ class LSformElement_date extends LSformElement {
       $GLOBALS['LSsession'] -> addJSscript('calendar-en.js',LS_LIB_DIR.'jscalendar/lang/');
       $codeLang = strtolower($GLOBALS['LSconfig']['lang'][0].$GLOBALS['LSconfig']['lang'][1]);
       $GLOBALS['LSsession'] -> addJSscript('calendar-'.$codeLang.'.js',LS_LIB_DIR.'jscalendar/lang/');
-      $GLOBALS['LSsession'] -> addJSscript('calendar-setup.js',LS_LIB_DIR.'jscalendar/');
+      //$GLOBALS['LSsession'] -> addJSscript('calendar-setup.js',LS_LIB_DIR.'jscalendar/');
       $GLOBALS['LSsession'] -> addJSscript('LSformElement_date_field.js');
       $GLOBALS['LSsession'] -> addJSscript('LSformElement_date.js');
     }
index 9eedc00..4aa94a9 100644 (file)
@@ -337,6 +337,17 @@ class LSldap {
     return $this -> cnx -> delete($dn,array('recursive' => 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) {
+    return (!Net_LDAP2::isError($this -> cnx -> move($old,$new)));
+  }
 }
 
 ?>
index 6534a8c..06b44f0 100644 (file)
@@ -41,6 +41,7 @@ class LSldapObject {
   var $submitError=true;
   var $_whoami=NULL;
   var $_subDn_value=NULL;
+  var $_relationsCache=array();
   
   /**
    * Constructeur
@@ -447,7 +448,7 @@ class LSldapObject {
               }
             }
             else {
-              if($ret<=0) {
+              if($ret<0) {
                 $LSform -> setElementError($attr,$msg_error);
                 return;
               }
@@ -512,7 +513,31 @@ class LSldapObject {
     $submitData=array();
     foreach($this -> attrs as $attr) {
       if(($attr -> isUpdate())&&($attr -> isValidate())) {
-        $submitData[$attr -> name] = $attr -> getUpdateData();
+        if($attr -> name == $this -> config['rdn']) {
+          debug('Rename');
+          if (!$this -> beforeRename()) {
+            $GLOBALS['LSerror'] -> addErrorCode(36);
+            return;
+          }
+          $oldDn = $this -> getDn();
+          $this -> dn = false;
+          $newDn = $this -> getDn();
+          if ($newDn) {
+            if (!$GLOBALS['LSldap'] -> move($oldDn,$newDn)) {
+              return;
+            }
+            if (!$this -> afterRename($oldDn,$newDn)) {
+              $GLOBALS['LSerror'] -> addErrorCode(37);
+              return;
+            }
+          }
+          else {
+            return;
+          }
+        }
+        else {
+          $submitData[$attr -> name] = $attr -> getUpdateData();
+        }
       }
     }
     if(!empty($submitData)) {
@@ -977,6 +1002,77 @@ class LSldapObject {
     $subDnLdapServer = $GLOBALS['LSsession'] -> getSortSubDnLdapServer();
     return $subDnLdapServer[$this -> getSubDnValue()];
   }
+  
+  /**
+   * Methode executant les actions nécéssaires avant le changement du DN de
+   * l'objet.
+   * 
+   * Cette méthode n'est qu'un exemple et elle doit être certainement réécrite
+   * pour les objets plus complexe.
+   * 
+   * @retval True en cas de cas ce succès, False sinon.
+   */
+  function beforeRename() {
+    if (is_array($this->config['relations'])) {
+      foreach($this->config['relations'] as $relation_name => $relation_conf) {
+        if ( isset($relation_conf['list_function']) && isset($relation_conf['rename_function']) ) {
+          if ($GLOBALS['LSsession'] -> loadLSobject($relation_conf['LSobject'])) {
+            $obj = new $relation_conf['LSobject']();
+            if (method_exists($obj,$relation_conf['list_function'])) {
+              $list = $obj -> $relation_conf['list_function']($this);
+              if (is_array($list)) {
+                $this -> _relationsCache[$relation_name] = $list; 
+              }
+              else {
+                return;
+              }
+            }
+            else {
+              return;
+            }
+          }
+          else {
+            return;
+          }
+        }
+      }
+    }
+    return true;
+  }
+  
+  /**
+   * Methode executant les actions nécéssaires après le changement du DN de
+   * l'objet.
+   * 
+   * Cette méthode n'est qu'un exemple et elle doit être certainement réécrite
+   * pour les objets plus complexe.
+   * 
+   * @param[in] $oldDn string L'ancien DN de l'objet
+   * @param[in] $newDn string Le nouveau DN de l'objet
+   * 
+   * @retval True en cas de cas ce succès, False sinon.
+   */
+  function afterRename($oldDn,$newDn) {
+    $error = 0;
+    if($GLOBALS['LSsession'] -> dn == $oldDn) {
+      $GLOBALS['LSsession'] -> changeAuthUser($this);
+    }
+    
+    foreach($this -> _relationsCache as $relation_name => $objList) {
+      foreach($objList as $obj) {
+        $meth = $this->config['relations'][$relation_name]['rename_function'];
+        if (method_exists($obj,$meth)) {
+          if (!($obj -> $meth($this,$oldDn))) {
+            $error=1;
+          }
+        }
+        else {
+          $error=1;
+        }
+      }
+    }
+    return !$error;
+  }
 }
 
 ?>
index 2eaa6f6..1e58db2 100644 (file)
@@ -27,6 +27,8 @@
  */
 class LSeegroup extends LSldapObject {
 
+  var $userObjectType = 'LSeepeople';
+
   /**
    * Constructeur
    *
@@ -50,7 +52,7 @@ class LSeegroup extends LSldapObject {
    * Retourne un tableau de LSeegroup correspondant aux groupes
    * auxquels appartient un utilisateur
    * 
-   * @param[in] $userObject Un object LSeepeople
+   * @param[in] $userObject Un object user (type : $this -> userObjectType)
    * 
    * @retval Array of LSeegroup Les groupes de l'utilisateur
    **/
@@ -64,12 +66,12 @@ class LSeegroup extends LSldapObject {
   /**
    * Ajoute un utilisateur au groupe
    * 
-   * @param[in] $object Un object LSeepeople : l'utilisateur à ajouter
+   * @param[in] $object Un object user ($this -> userObjectType) : l'utilisateur à ajouter
    * 
    * @retval boolean true si l'utilisateur à été ajouté, False sinon
    **/  
   function addOneMember($object) {
-    if ($object instanceof LSeepeople) {
+    if ($object instanceof $this -> userObjectType) {
       if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
         $dn = $object -> getDn();
         $values = $this -> attrs['uniqueMember'] -> getValue();
@@ -92,12 +94,12 @@ class LSeegroup extends LSldapObject {
   /**
    * Supprime un utilisateur du groupe
    * 
-   * @param[in] $object Un object LSeepeople : l'utilisateur à supprimer
+   * @param[in] $object Un object (type : $this -> userObjectType) : l'utilisateur à supprimer
    * 
    * @retval boolean true si l'utilisateur à été supprimé, False sinon
    **/  
   function deleteOneMember($object) {
-    if ($object instanceof LSeepeople) {
+    if ($object instanceof $this -> userObjectType) {
       if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
         $dn = $object -> getDn();
         $values = $this -> attrs['uniqueMember'] -> getValue();
@@ -113,7 +115,38 @@ class LSeegroup extends LSldapObject {
           }
           return $GLOBALS['LSldap'] -> update($this -> getType(),$this -> getDn(), array('uniqueMember' => $updateData));
         }
-        return;
+      }
+    }
+    return;
+  }
+  
+ /**
+  * Renome un utilisateur
+  * 
+  * @param[in] $object Un object (type : $this -> userObjectType) : l'utilisateur à renomer
+  * @param[in] $oldDn string L'ancien DN de l'utilisateur
+  * 
+  * @retval boolean True en cas de succès, False sinon
+  */
+  function renameOneMember($object,$oldDn) {
+    if ($object instanceof $this -> userObjectType) {
+      if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
+        $values = $this -> attrs['uniqueMember'] -> getValue();
+        if ((!is_array($values)) && (!empty($values))) {
+          $values = array($values);
+        }
+        if (is_array($values)) {
+          $updateData=array();
+          foreach($values as $value) {
+            if ($value!=$oldDn) {
+              $updateData[] = $value;
+            }
+            else {
+              $updateData[] = $object-> getDn();
+            }
+          }
+          return $GLOBALS['LSldap'] -> update($this -> getType(),$this -> getDn(), array('uniqueMember' => $updateData));
+        }
       }
     }
     return;
@@ -122,7 +155,7 @@ class LSeegroup extends LSldapObject {
   /**
    * Met à jour les groupes d'un utilisateur
    * 
-   * @param[in] $userObject LSeepeople Un object LSeepeople : l'utilisateur
+   * @param[in] $userObject Mixed Un object (type : $this -> userObjectType) : l'utilisateur
    * @param[in] $listDns Array(string) Un tableau des DNs des groupes de l'utilisateur
    * 
    * @retval boolean true si tout c'est bien passé, False sinon
index d650535..f5209dd 100644 (file)
@@ -37,9 +37,9 @@ class LSeepeople extends LSldapObject {
    * @param[in] $config array La configuration de l'objet
    *
    * @retval boolean true si l'objet a été construit, false sinon.
-        *
-        * @see LSldapObject::LSldapObject()
-   */  
+   *
+   * @see LSldapObject::LSldapObject()
+   */ 
   function LSeepeople ($config='auto') {
     return $this -> LSldapObject('LSeepeople',$config);
   }
index 07dd6ed..1abfd78 100644 (file)
@@ -487,6 +487,34 @@ class LSsession {
   }
 
  /**
+  * Modifie l'utilisateur connecté à la volé
+  * 
+  * @param[in] $object Mixed  L'objet Ldap du nouvel utilisateur
+  *                           le type doit correspondre à
+  *                           $this -> ldapServer['authobject']
+  * 
+  * @retval boolean True en cas de succès, false sinon
+  */
+ function changeAuthUser($object) {
+  if ($object instanceof $this -> ldapServer['authobject']) {
+    $this -> dn = $object -> getDn();
+    $rdn = $object -> getValue('rdn');
+    if(is_array($rdn)) {
+      $rdn = $rdn[0];
+    }
+    $this -> rdn = $rdn;
+    $this -> LSuserObject = $object;
+    
+    if($this -> loadLSrights()) {
+      $this -> loadLSaccess();
+      $_SESSION['LSsession']=get_object_vars($this);
+      return true;
+    }
+  }
+  return;
+ }
+
+ /**
   * Définition du serveur Ldap de la session
   *
   * Définition du serveur Ldap de la session Ã  partir de son ID dans 
index f78707a..56a1704 100644 (file)
@@ -53,7 +53,11 @@ function getFData($format,$data,$meth=NULL) {
       else {
         while (ereg("%{([A-Za-z0-9]+)}",$format[$i],$ch)) {
           if (method_exists($data[$ch[1]],$meth)) {
-            $format[$i]=ereg_replace($ch[0],$data[$ch[1]] -> $meth(),$format[$i]);
+            $value = $data[$ch[1]] -> $meth();
+            if (is_array($value)) {
+              $value = $value[0];
+            }
+            $format[$i]=ereg_replace($ch[0],$value,$format[$i]);
           }
           else {
             $GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => $ch[1]));
@@ -70,7 +74,11 @@ function getFData($format,$data,$meth=NULL) {
       else {
         while (ereg("%{([A-Za-z0-9]+)}",$format[$i],$ch)) {
           if (method_exists($data,$meth)) {
-            $format[$i]=ereg_replace($ch[0],$data -> $meth($ch[1]),$format[$i]);
+            $value = $data -> $meth($ch[1]);
+            if (is_array($value)) {
+              $value = $value[0];
+            }
+            $format[$i]=ereg_replace($ch[0],$value,$format[$i]);
           }
           else {
             $GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => get_class($data)));
index 899ef8d..dfc60f0 100644 (file)
@@ -241,7 +241,7 @@ if (!isset($_ERRORS)) {
                           $ok=false;
                           foreach($list as $o) {
                             if($o -> getDn() == $_REQUEST['dn']) {
-                              if (!$o -> deleteOneMember($object)) {
+                              if (!$o -> $relationConf['remove_function']($object)) {
                                 $GLOBALS['LSerror'] -> addErrorCode(1015,$conf['relationName']);
                               }
                               else {
index 1d36856..fc64f78 100644 (file)
@@ -45,20 +45,6 @@ if($LSsession -> startLSsession()) {
     // Création d'un LSobject
     if ($GLOBALS['LSsession'] -> loadLSobject($LSobject)) {
       if ( $GLOBALS['LSsession'] -> canEdit($LSobject,$dn) ) {
-        $LSview_actions[] = array(
-          'label' => _('Voir'),
-          'url' =>'view.php?LSobject='.$LSobject.'&amp;dn='.$dn,
-          'action' => 'view'
-        );
-        
-        if ($GLOBALS['LSsession'] -> canRemove($LSobject,$dn)) {
-          $LSview_actions[] = array(
-            'label' => _('Supprimer'),
-            'url' => 'remove.php?LSobject='.$LSobject.'&amp;dn='.$dn,
-            'action' => 'delete'
-          );
-        }
-        
         $object = new $LSobject();
         if ($object -> loadData($dn)) {
           // Définition du Titre de la page
@@ -68,10 +54,23 @@ if($LSsession -> startLSsession()) {
             // MàJ des données de l'objet LDAP
             if ($object -> updateData('modify')) {
               debug('ok');
-              //header('Location: view.php?LSobject='.$LSobject.'&dn='.$object -> getDn());
             }
           }
           
+          $LSview_actions[] = array(
+            'label' => _('Voir'),
+            'url' =>'view.php?LSobject='.$LSobject.'&amp;dn='.$object -> getDn(),
+            'action' => 'view'
+          );
+        
+          if ($GLOBALS['LSsession'] -> canRemove($LSobject,$object -> getDn())) {
+            $LSview_actions[] = array(
+              'label' => _('Supprimer'),
+              'url' => 'remove.php?LSobject='.$LSobject.'&amp;dn='.$object -> getDn(),
+              'action' => 'delete'
+            );
+          }
+          
 
           
           $GLOBALS['LSsession'] -> addJSscript('LSsmoothbox.js');