Gros commit avec principalement la suppression de HTML_QuickForm (qui s'est révélé...
authorBenjamin Renard <brenard@easter-eggs.com>
Thu, 15 Nov 2007 18:07:24 +0000 (18:07 +0000)
committerBenjamin Renard <brenard@easter-eggs.com>
Thu, 15 Nov 2007 18:07:24 +0000 (18:07 +0000)
souple) remplacé par la classes LSform qui réimplemente pas mal de fonctionnalités de
HTML_QuickForm en gérant nativement que tout les champs soit à valeurs multiples.

Dans l'état actuel, la modification et la création d'objet sont gérés.

B.Renard

45 files changed:
trunk/conf/config.LSeegroup.php
trunk/conf/config.LSeepeople.php
trunk/conf/config.php
trunk/conf/error_code.php
trunk/includes/addons/LSaddons.posix.php [new file with mode: 0644]
trunk/includes/addons/LSaddons.samba.php [new file with mode: 0644]
trunk/includes/class/class.LSattr_html.php
trunk/includes/class/class.LSattr_html_password.php [new file with mode: 0644]
trunk/includes/class/class.LSattr_html_select_list.php
trunk/includes/class/class.LSattr_html_text.php
trunk/includes/class/class.LSattr_html_textarea.php [new file with mode: 0644]
trunk/includes/class/class.LSattr_ldap.php
trunk/includes/class/class.LSattr_ldap_ascii.php
trunk/includes/class/class.LSattr_ldap_password.php [new file with mode: 0644]
trunk/includes/class/class.LSattribute.php
trunk/includes/class/class.LSeegroup.php
trunk/includes/class/class.LSeepeople.php
trunk/includes/class/class.LSerror.php
trunk/includes/class/class.LSform.php
trunk/includes/class/class.LSformElement.php [new file with mode: 0644]
trunk/includes/class/class.LSformElement_password.php [new file with mode: 0644]
trunk/includes/class/class.LSformElement_select.php [new file with mode: 0644]
trunk/includes/class/class.LSformElement_text.php [new file with mode: 0644]
trunk/includes/class/class.LSformElement_textarea.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_alphanumeric.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_compare.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_email.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_lettersonly.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_maxlength.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_minlength.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_nonzero.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_nopunctuation.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_numeric.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_rangelength.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_regex.php [new file with mode: 0644]
trunk/includes/class/class.LSformRule_required.php [new file with mode: 0644]
trunk/includes/class/class.LSldap.php
trunk/includes/class/class.LSldapObject.php
trunk/includes/functions.php
trunk/includes/libs/class.smbHash.php [new file with mode: 0644]
trunk/index.php
trunk/index_new.php [new file with mode: 0644]
trunk/test.php [new file with mode: 0644]
trunk/test_group.php [deleted file]

index d436e2b..d30733d 100644 (file)
@@ -25,10 +25,12 @@ $GLOBALS['LSobjects']['LSeegroup'] = array (
     'ostgroup',
     'posixGroup'
   ),
+  'rdn' => 'cn',
+  'container_dn' => 'ou=groups',
   'select_display_attrs' => '%{cn}',
   'attrs' => array (
     'cn' => array (
-      'label' => 'Nom',
+      'label' => _('Nom'),
       'ldap_type' => 'ascii',
       'html_type' => 'text',
       'required' => 1,
@@ -42,12 +44,16 @@ $GLOBALS['LSobjects']['LSeegroup'] = array (
           'result' => 0
         )
       ),
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
       'form' => array (
         'test' => 1
       )
     ),
     'gidNumber' => array (
-      'label' => 'Identifiant',
+      'label' => _('Identifiant'),
       'ldap_type' => 'numeric',
       'html_type' => 'text',
       'required' => 1,
@@ -58,7 +64,7 @@ $GLOBALS['LSobjects']['LSeegroup'] = array (
           'result' => 0
         )
       ),
-      'rights' => array(                      // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
         'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
         'users' => 'r'                    // définition des droits de tout les utilisateurs
       ),
@@ -67,7 +73,7 @@ $GLOBALS['LSobjects']['LSeegroup'] = array (
       )
     ),
     'uniqueMember' => array (
-      'label' => 'Membres',
+      'label' => _('Membres'),
       'ldap_type' => 'ascii',
       'html_type' => 'select_list',
       'required' => 0,
@@ -77,7 +83,7 @@ $GLOBALS['LSobjects']['LSeegroup'] = array (
           'result' => 1
         )
       ),
-      'rights' => array(                      // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
         'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
         'users' => 'r'                    // définition des droits de tout les utilisateurs
       ),
@@ -85,17 +91,17 @@ $GLOBALS['LSobjects']['LSeegroup'] = array (
         'test' => 1
       ),
       'possible_values' => array(
-        'aucun' => '-- Selectionner --',
+        'aucun' => _('-- Selectionner --'),
         'OTHER_OBJECT' => array(
-          'object_type' => 'LSeepeople',         // Nom de l'objet à lister
-          'display_attribute' => '%{cn} (%{uidNumber})',     // Spécifie le attributs à lister pour le choix,
-                                              // si non définie => utilisation du 'select_display_attrs'
-                                              // de la définition de l'objet
+          'object_type' => 'LSeepeople',                                                                       // Nom de l'objet à lister
+          'display_attribute' => '%{cn} (%{uidNumber})',                       // Spécifie le attributs à lister pour le choix,
+                                                                                                         // si non définie => utilisation du 'select_display_attrs'
+                                                                                                         // de la définition de l'objet
                                               
-          'value_attribute' => '%{dn}',    // Spécifie le attributs dont la valeur sera retournée par
+          'value_attribute' => '%{dn}',                       // Spécifie le attributs dont la valeur sera retournée par
         )
       )
     )
   )
 );
-?>
\ No newline at end of file
+?>
index 01d270f..91154ef 100644 (file)
 
 $GLOBALS['LSobjects']['LSeepeople'] = array (
   'objectclass' => array(
+    'top',
     'ostpeople',
-    'posixAccount'
+    'posixAccount',
+    'sambaSamAccount',
   ),
+  'rdn' => 'uid',
+  'container_dn' => 'ou=people',
   'before_save' => 'valid',
   'after_save' => 'valid',
   'select_display_attrs' => '%{cn]',
+       // Attributes
   'attrs' => array (
     'uid' => array (
-      'label' => 'Identifiant',
+      'label' => _('Identifiant'),
       'ldap_type' => 'ascii',
       'html_type' => 'text',
       'required' => 1,
       'check_data' => array (
         'alphanumeric' => array(
-          'msg' => "L'identifiant ne doit comporter que des lettres et des chiffres."
+          'msg' => _("L'identifiant ne doit comporter que des lettres et des chiffres.")
         ),
       ),
       'validation' => array (
@@ -44,10 +49,10 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
           'basedn' => 'o=ost',
           'filter' => 'uid=%{val}',
           'result' => 0,
-          //~ 'msg' => 'Cet identifiant est déjà utilisé.'
+          'msg' => _('Cet identifiant est déjà utilisé.')
         )
       ),
-      'rights' => array(                      // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
         'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
         'users' => 'r'                    // définition des droits de tout les utilisateurs
       ),
@@ -57,13 +62,14 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
       )
     ),
     'uidNumber' => array (
-      'label' => 'Identifiant (numérique)',
+      'label' => _('Identifiant (numérique)'),
       'ldap_type' => 'numeric',
       'html_type' => 'text',
       'required' => 1,
+      'generate_function' => 'generate_uidNumber',
       'check_data' => array (
         'numeric' => array(
-          'msg' => "L'identifiant unique doit être un entier."
+          'msg' => _("L'identifiant unique doit être un entier.")
         ),
       ),
       'validation' => array (
@@ -71,25 +77,25 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
           'basedn' => 'o=ost',
           'filter' => 'uidNumber=%{val}',
           'result' => 0,
-          //~ 'msg' => 'Cet identifiant est déjà utilisé.'
+          'msg' => _('Cet uid est déjà utilisé.')
         )
       ),
-      'rights' => array(                      // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
         'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
         'users' => 'r'                    // définition des droits de tout les utilisateurs
       ),
       'form' => array (
         'test' => 0,
-        'add' => 1
       )
     ),
     'cn' => array (
-      'label' => 'Nom complet',
+      'label' => _('Nom complet'),
       'ldap_type' => 'ascii',
       'html_type' => 'text',
       'required' => 1,
+      'default_value' => 'titi',
       'validation' => 'valid',
-      'rights' => array(                      // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
         'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
         'users' => 'r'                    // définition des droits de tout les utilisateurs
       ),
@@ -99,24 +105,17 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
       )
     ),
     'givenName' => array (
-      'label' => 'Prenom',
+      'label' => _('Prenom'),
       'ldap_type' => 'ascii',
       'html_type' => 'text',
       'required' => 1,
       'default_value' => 'toto',
       'check_data' => array (
         'alphanumeric' => array(
-          'msg' => 'Le prenom ne doit comporter que des lettres et des chiffres.'
+          'msg' => _('Le prenom ne doit comporter que des lettres et des chiffres.')
         ),
       ),
-      //~ 'validation' => array (
-        //~ array (
-          //~ 'basedn' => 'o=ost',
-          //~ 'filter' => 'uid=%{uid}',
-          //~ 'result' => 0
-        //~ )
-      //~ ),
-      'rights' => array(                      // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
         'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
         'users' => 'r'                    // définition des droits de tout les utilisateurs
       ),
@@ -127,23 +126,11 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
       'onDisplay' => 'return_data'
     ),
     'sn' => array (
-      'label' => 'Nom',
+      'label' => _('Nom'),
       'ldap_type' => 'ascii',
       'html_type' => 'text',
       'required' => 1,
-      'check_data' => array (
-        'alphanumeric' => array(
-          'msg' => 'Le nom ne doit comporter que des lettres et des chiffres.'
-        ),
-      ),
-      //~ 'validation' => array (
-        //~ array (
-          //~ 'basedn' => 'o=ost',
-          //~ 'filter' => 'uid=%{uid}',
-          //~ 'result' => 0
-        //~ )
-      //~ ),
-      'rights' => array(                      // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
         'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
         'users' => 'r'                    // définition des droits de tout les utilisateurs
       ),
@@ -153,19 +140,19 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
       )
     ),
     'gidNumber' => array (
-      'label' => 'Groupe principal',
+      'label' => _('Groupe principal'),
       'ldap_type' => 'numeric',
       'html_type' => 'select_list',
       'required' => 1,
       'validation' => array (
         array (
           'object_type' => 'LSeegroup',           // 'object_type' : Permet definir le type d'objet recherchés
-          'basedn' => 'o=ost',                    //  et d'utiliser les objectClass définis dans le fichier de configuration
-          'filter' => '(gidNumber=%{val})', // pour la recherche
+          'basedn' => 'o=ost',                    // et d'utiliser les objectClass définis dans le fichier de configuration
+          'filter' => '(gidNumber=%{val})',       // pour la recherche
           'result' => 1
         )
       ),
-      'rights' => array(                      // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
         'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
         'users' => 'r'                    // définition des droits de tout les utilisateurs
       ),
@@ -174,35 +161,249 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
         'add' => 1
       ),
       'possible_values' => array(
-        'aucun' => '-- Selectionner --',
+        '' => '-- Selectionner --',
         'OTHER_OBJECT' => array(
-          'object_type' => 'LSeegroup',         // Nom de l'objet à lister
+          'object_type' => 'LSeegroup',                      // Nom de l'objet à lister
           'display_attribute' => '%{cn} (%{gidNumber})',     // Spécifie le attributs à lister pour le choix,
-                                              // si non définie => utilisation du 'select_display_attrs'
-                                              // de la définition de l'objet
+                                                             // si non définie => utilisation du 'select_display_attrs'
+                                                             // de la définition de l'objet
                                               
-          'value_attribute' => 'gidNumber',    // Spécifie le attributs dont la valeur sera retournée par
+          'value_attribute' => 'gidNumber',   // Spécifie le attributs dont la valeur sera retournée par
           'filter' =>                         // le formulaire spécifie les filtres de recherche pour
             array (                           // l'établissement de la liste d'objets :
               array(                          // Premier filtre
                 'filter' => 'cn=*a*',
                 'basedn' => 'o=ost',
                 'scope' => 'sub',
-                //~ 'attr' => '[attribut]',      // Si 'attr' est définis, on effectura pour chacune des 
-                                             // valeurs de l'attribut correspants une recherche avec 
-                                             // le filtre suivant composé avec la valeur de cette attribut
               )
-              //~ array(
-                //~ 'filter' => '[format sprintf]',
-                //~ 'basedn' => '[basedn]',
-              //~ ),
-              //~ ...
             )
-          //~ 'basedn' =>
-            //~ '[basedn]'
         )
       )
+    ),
+    'loginShell' => array (
+      'label' => _('Interpreteur de commande'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'select_list',
+      'required' => 1,
+      'default_value' => '/bin/false',
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+        'add' => 1
+      ),
+      'possible_values' => array(
+        '/bin/false' => _('Aucun'),
+        '/bin/bash' => 'Bash',
+      )
+    ),
+    'sambaSID' => array (
+      'label' => _('Identifiant Samba'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'text',
+      'required' => 1,
+      'generate_function' => 'generate_sambaSID',
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'r',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+      )
+    ),
+    'homeDirectory' => array (
+      'label' => _('Répertoire personnel'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'text',
+      'required' => 1,
+      'default_value' => '/home/%{uid}',
+                       'generate_function' => 'generate_homeDirectory',
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'r',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+      )
+    ),
+    'mail' => array (
+      'label' => _('Adresse e-mail'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'text',
+      'required' => 1,
+      'check_data' => array (
+        'email' => array(
+          'msg' => _("L'adresse e-mail entrée n'est pas valide.")
+        ),
+      ),
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'r',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+        'add' => 1
+      )
+    ),
+    'personalTitle' => array (
+      'label' => _('Titre'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'select_list',
+      'required' => 1,
+      'default_value' => 'M.',
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+        'add' => 1
+      ),
+      'possible_values' => array(
+        'M.' => 'M.',
+        'Mme' => 'Mme',
+        'Mlle' => 'Mlle'
+      )
+    ),
+    'maildrop' => array (
+      'label' => _('Mail indésirable'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'text',
+      'check_data' => array (
+        'email' => array(
+          'msg' => _("L'adresse e-mail entrée n'est pas valide.")
+        ),
+      ),
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+      )
+    ),
+    'vacationActive' => array (
+      'label' => _('Réponce automatique'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'select_list',
+      'default_value' => '',
+      'check_data' => array (
+        'email' => array(
+          'msg' => _("L'adresse e-mail entrée n'est pas valide.")
+        ),
+      ),
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+      ),
+      'possible_values' => array(
+        '%{uid}@autoreponse.obs-ost.fr' => 'Oui',
+        '' => 'Non'
+      )
+    ),
+    'vacationInfo' => array (
+      'label' => _('Message en reponse'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'textarea',
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+      )
+    ),
+    'vacationForward' => array (
+      'label' => _('Transfert de mail'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'text',
+      'check_data' => array (
+        'email' => array(
+          'msg' => _("L'adresse e-mail entrée n'est pas valide.")
+        ),
+      ),
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+      )
+    ),
+    'mailQuota' => array (
+      'label' => _('Quota boite mail'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'text',
+      'check_data' => array (
+        'numeric' => array(
+          'msg' => _("Le quota de l'adresse mail entrée n'est pas valide.")
+        ),
+      ),
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'r',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+      )
+    ),
+    'description' => array (
+      'label' => _('Description'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'text',
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+      'form' => array (
+        'test' => 1,
+      )
+    ),
+    'userPassword' => array (
+      'label' => _('Mot de passe'),
+      'ldap_type' => 'password',
+      'html_type' => 'password',
+                       'required' => 1,
+      'rights' => array(                  // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                    // définition des droits de l'utilisateur sur lui même
+        'users' => 'r'                    // définition des droits de tout les utilisateurs
+      ),
+                       'dependAttrs' => array(
+                               'sambaLMPassword',
+                               'sambaNTPassword'
+                       ),
+      'form' => array (
+        'test' => 1,
+        'add' => 1
+      )
+    ),
+    'sambaLMPassword' => array (
+      'label' => _('Mot de passe Samba (LM)'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'password',
+                       'required' => 1,
+      'generate_function' => 'generate_sambaLMPassword',
+      'rights' => array(                 // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                   // définition des droits de l'utilisateur sur lui même
+        'users' => ''                    // définition des droits de tout les utilisateurs
+      )
+               ),
+    'sambaNTPassword' => array (
+      'label' => _('Mot de passe Samba (NT)'),
+      'ldap_type' => 'ascii',
+      'html_type' => 'password',
+                       'required' => 1,
+      'generate_function' => 'generate_sambaNTPassword',
+      'rights' => array(                 // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut)
+        'self' => 'w',                   // définition des droits de l'utilisateur sur lui même
+        'users' => ''                    // définition des droits de tout les utilisateurs
+      )
     )
-  )
+       )
 );
-?>
\ No newline at end of file
+?>
index 5f4ae1f..440947d 100644 (file)
 // Configuration LDAP Saisie :
 $GLOBALS['LSconfig'] = array(
   'NetLDAP' => '/usr/share/php/Net/LDAP.php',
-  'QuickForm' => '/usr/share/php/QuickForm.php',
-  'check_data_place' => 'server',
   'ldap_config'=> array(
     'host'     => 'localhost',
     'port'     => 389,
     'version'  => 3,
     'starttls' => false,
-    'binddn'   => 'uid=eeggs,ou=people,o=com',
+    'binddn'   => 'uid=eeggs,ou=people,o=lsexample',
     'bindpw'   => 'toto',
-    'basedn'   => 'o=ost',
+    'basedn'   => 'o=lsexample',
     'options'  => array(),
     'filter'   => '(objectClass=*)',
     'scope'    => 'sub'
index 69a5ab9..a76d488 100644 (file)
 
 $GLOBALS['error_code'] = array (
   '-1' => array (
-    'msg' => 'Erreur inconnue!',
+    'msg' => _("Erreur inconnue!"),
     'level' => 'c'
   ),
   // LSldap
   1 => array (
-    'msg' => 'LSldap : Erreur durant la connexion au serveur LDAP (%{msg}).',
+    'msg' => _("LSldap : Erreur durant la connexion au serveur LDAP (%{msg})."),
     'level' => 'c'
   ),
   2 => array (
-    'msg' => 'LSldap : Erreur durant la recherche LDAP (%{msg}).',
+    'msg' => _("LSldap : Erreur durant la recherche LDAP (%{msg})."),
+    'level' => 'c'
+  ),
+  3 => array (
+    'msg' => _("LSldap : Type d'objet inconnu."),
+    'level' => 'c'
+  ),
+  4 => array (
+    'msg' => _("LSldap : Erreur durant la récupération de l'entrée Ldap."),
+    'level' => 'c'
+  ),
+  5 => array (
+    'msg' => _("LSldap : Erreur durant la mise à jour de l'entrée Ldap (DN : %{dn})."),
     'level' => 'c'
   ),
   
   // LSldapObject
   21 => array (
-    'msg' => "LSldapObject : Type d'objet inconnu.",
+    'msg' => _("LSldapObject : Type d'objet inconnu."),
     'level' => 'c'
   ),
   22 => array (
-    'msg' => "LSldapObject : Formulaire de mise jour inconnu par l'objet %{msg}.",
+    'msg' => _("LSldapObject : Formulaire de mise jour inconnu par l'objet %{msg}."),
     'level' => 'c'
   ),
   23 => array (
-    'msg' => "LSldapObject : Aucun formulaire n'existe dans l'objet %{msg}.",
+    'msg' => _("LSldapObject : Aucun formulaire n'existe dans l'objet %{msg}."),
     'level' => 'c'
   ),
   24 => array (
-    'msg' => "LSldapObject : La fonction %{func} pour valider l'attribut %{attr} de l'objet %{obj} est inconnue.",
+    'msg' => _("LSldapObject : La fonction %{func} pour valider l'attribut %{attr} de l'objet %{obj} est inconnue."),
     'level' => 'c'
   ),
   25 => array (
-    'msg' => "LSldapObject : Des données de configuration sont manquant pour la validation de l'attribut %{attr} de l'objet %{obj}.",
+    'msg' => _("LSldapObject : Des données de configuration sont manquant pour la validation de l'attribut %{attr} de l'objet %{obj}."),
     'level' => 'c'
   ),
   26 => array (
-    'msg' => "LSldapObject : Erreur de configuration : L'objet %{obj} ne possède pas d'attribut %{attr}.",
+    'msg' => _("LSldapObject : Erreur de configuration : L'objet %{obj} ne possède pas d'attribut %{attr}."),
     'level' => 'c'
   ),
   27 => array (
-    'msg' => "LSldapObject : La fonction %{func} devant être executée avant l'enregistrement n'existe pas.",
+    'msg' => _("LSldapObject : La fonction %{func} devant être executée avant l'enregistrement n'existe pas."),
     'level' => 'c'
   ),
   28 => array (
-    'msg' => "LSldapObject : L'execution de la fonction %{func} devant être executée avant l'enregistrement a échouée.",
+    'msg' => _("LSldapObject : L'execution de la fonction %{func} devant être executée avant l'enregistrement a échouée."),
     'level' => 'c'
   ),
   29 => array (
-    'msg' => "LSldapObject : La fonction %{func} devant être executée après l'enregistrement n'existe pas.",
+    'msg' => _("LSldapObject : La fonction %{func} devant être executée après l'enregistrement n'existe pas."),
     'level' => 'c'
   ),
   30 => array (
-    'msg' => "LSldapObject : L'execution de la fonction %{func} devant être executée après l'enregistrement a échouée.",
+    'msg' => _("LSldapObject : L'execution de la fonction %{func} devant être executée après l'enregistrement a échouée."),
+    'level' => 'c'
+  ),
+  31 => array (
+    'msg' => _("LSldapObject : Il manque des informations de configuration du type d'objet %{obj} pour la création du nouveau DN."),
+    'level' => 'c'
+  ),
+  32 => array (
+    'msg' => _("LSldapObject : L'attribut %{attr} de l'objet n'est pas encore définis. Il est impossible de generer un nouveau DN."),
+    'level' => 'c'
+  ),
+  33 => array (
+    'msg' => _("LSldapObject : Sans DN, l'objet n'a put être modifié."),
     'level' => 'c'
   ),
+       34 => array (
+               'msg' => _("LSldapObject : L'attribut %{attr_depend} dépendant de l'attribut %{attr} n'existe pas."),
+               'level' => 'w'
+       ),
   
   // LSldapObject
   41 => array (
-    'msg' => "LSattribute : Type d'attribut (ldap // html) inconnu (ldap = %{ldap} | html = %{html}).",
+    'msg' => _("LSattribute : Attribut %{attr} : Type d'attribut (ldap // html) inconnu (ldap = %{ldap} | html = %{html})."),
     'level' => 'c'
   ),
   42 => array (
-    'msg' => "LSattribute : La fonction %{func} pour afficher l'attribut %{attr} est inconnue.",
+    'msg' => _("LSattribute : La fonction %{func} pour afficher l'attribut %{attr} est inconnue."),
     'level' => 'c'
   ),
   43 => array (
-    'msg' => "LSattribute : La règle %{rule} pour valider l'attribut %{attr} est inconnue.",
+    'msg' => _("LSattribute : La règle %{rule} pour valider l'attribut %{attr} est inconnue."),
     'level' => 'c'
   ),
   44 => array (
-    'msg' => "LSattribute : Les données de configuration pour vérifié l'attribut %{attr} sont incorrects.",
+    'msg' => _("LSattribute : Les données de configuration pour vérifié l'attribut %{attr} sont incorrects."),
     'level' => 'c'
   ),
   45 => array (
-    'msg' => "LSattribute : La fonction %{func} pour sauver l'attribut %{attr} est inconnue.",
+    'msg' => _("LSattribute : La fonction %{func} pour sauver l'attribut %{attr} est inconnue."),
     'level' => 'c'
   ),
-  
+  46 => array (
+    'msg' => _("LSattribute : La valeur de l'attribut %{attr} ne peut pas être générée."),
+    'level' => 'c'
+  ),
+       47 => array (
+    'msg' => _("LSattribute : La valeur de l'attribut %{attr} n'a pas put être générée."),
+    'level' => 'c'
+  ),
+       48 => array (
+    'msg' => _("LSattribute : La génération de l'attribut %{attr} n'a pas retourné une valeur correcte."),
+    'level' => 'c'
+  ),
+
   // LSattr_html
   101 => array (
-    'msg' => "LSattr_html : La fonction addToForm() du type html de l'attribut %{attr} n'est pas définie.",
+    'msg' => _("LSattr_html : La fonction addToForm() du type html de l'attribut %{attr} n'est pas définie."),
     'level' => 'c'
   ),
   102 => array (
-    'msg' => "LSattr_html_select_list : Des données de configuration sont manquante pour la génération de la liste deroulante de l'attribut %{attr}.",
+    'msg' => _("LSattr_html_select_list : Des données de configuration sont manquante pour la génération de la liste deroulante de l'attribut %{attr}."),
+    'level' => 'c'
+  ),
+  103 => array (
+    'msg' => _("LSattr_html_%{type} : Les données multiples ne sont pas gérés pour ce type d'attribut."),
     'level' => 'c'
   ),
+
+       // LSform
+       201 => array(
+               'msg' => _("LSform : Erreur durant la recupération des valeurs du formulaire."),
+               'level' => 'c'
+       ),
+       202 => array(
+               'msg' => _("LSform : Erreur durant la récupération de la valeur du formulaire du champ '%{element}'."),
+               'level' => 'c'
+       ),
+       203 => array(
+               'msg' => _("LSform : Les données du champ %{element} ne sont pas valides."),
+               'level' => 'c'
+       ),
+       204 => array(
+               'msg' => _("LSform : Le champ %{element} n'existe pas."),
+               'level' => 'c'
+       ),
+       205 => array(
+               'msg' => _("LSfom : Type de champ inconnu (%{type})."),
+               'level' => 'c'
+       ),
+       206 => array(
+               'msg' => _("LSform : Erreur durant la création de l'élement '%{element}'."),
+               'level' => 'c'
+       ),
+       207 => array(
+               'msg' => _("LSform : Aucune valeur de rentrée pour le champs '%{element}'."),
+               'level' => 'c'
+       ),
+
+       301 => array(
+               'msg' => _("LSformRule : Aucune regex n'a été fournis pour la validation des données."),
+               'level' => 'w'
+       ),
   
   // functions
   901 => array (
-    'msg' => "Functions 'getFData' : La methode %{meth} de l'objet %{obj} n'existe pas.",
+    'msg' => _("Functions 'getFData' : La methode %{meth} de l'objet %{obj} n'existe pas."),
     'level' => 'c'
   ),
 );
-?>
\ No newline at end of file
+?>
diff --git a/trunk/includes/addons/LSaddons.posix.php b/trunk/includes/addons/LSaddons.posix.php
new file mode 100644 (file)
index 0000000..0193b62
--- /dev/null
@@ -0,0 +1,171 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+
+ /*
+       * Données de configuration pour le support POSIX
+       */
+
+                       // Nom de l'attribut LDAP uid
+                       define('LS_POSIX_UID_ATTR','uid');
+
+                       // Nom de l'attribut LDAP uidNumber
+                       define('LS_POSIX_UIDNUMBER_ATTR','uidNumber');
+
+                       // Valeur minimum d'un uidNumber
+                       define('LS_POSIX_UIDNUMBER_MIN_VAL','100000');
+
+                       // Nom de l'attribut LDAP gidNumber
+                       define('LS_POSIX_GIDNUMBER_ATTR','gidNumber');
+
+                       // Valeur minimum d'un gidNumber
+                       define('LS_POSIX_GIDNUMBER_MIN_VAL','100000');
+
+                       // Dossier contenant les homes des utilisateurs (defaut: /home/)
+                       define('LS_POSIX_HOMEDIRECTORY','/home/');
+
+
+
+                       // -- Message d'erreur --
+                       // Support
+                       $GLOBALS['error_code']['POSIX_SUPPORT_01']= array (
+                               'msg' => _("POSIX Support : La constante %{const} n'est pas définie."),
+                               'level' => 'c'
+                       );
+
+                       // Autres erreurs
+                       $GLOBALS['error_code']['POSIX_01']= array (
+                               'msg' => _("POSIX : L'attribut %{dependency} est introuvable. Impossible de générer l'attribut %{attr}."),
+                               'level' => 'c'
+                       );
+                       
+ /*
+       * Fin des données de configuration
+       */
+
+
+ /*
+  * Verification du support POSIX par ldapSaisie
+       * 
+       * @author Benjamin Renard <brenard@easter-eggs.com>
+       *
+       * @retval boolean true si Samba est pleinement supporté, false sinon
+       */
+       function LSaddon_posix_support() {
+               
+               $retval=true;
+
+               $MUST_DEFINE_CONST= array(
+                       'LS_POSIX_UID_ATTR',
+                       'LS_POSIX_UIDNUMBER_ATTR',
+                       'LS_POSIX_GIDNUMBER_ATTR',
+                       'LS_POSIX_UIDNUMBER_MIN_VAL',
+                       'LS_POSIX_GIDNUMBER_MIN_VAL',
+                       'LS_POSIX_HOMEDIRECTORY'
+               );
+
+               foreach($MUST_DEFINE_CONST as $const) {
+                       if ( constant($const) == '' ) {
+                               $GLOBALS['LSerror'] -> addErrorCode('POSIX_SUPPORT_O1',$const);
+                               $retval=false;
+                       }
+               }
+
+               return $retval;
+       }
+
+ /*
+       * Generation de uidNumber
+       * 
+       * @author Benjamin Renard <brenard@easter-eggs.com>
+       * 
+       * @param[in] $ldapObject L'objet ldap
+       *
+       * @retval integer uidNumber ou false si il y a un problème durant la génération
+       */
+       function generate_uidNumber($ldapObject) {
+
+               $objects = $GLOBALS['LSldap'] -> search (LS_POSIX_UIDNUMBER_ATTR.'=*');
+               $uidNumber = LS_POSIX_UIDNUMBER_MIN_VAL;
+
+               if (!is_array($objects))
+                       return;
+
+               foreach($objects as $object) {
+                       if($object['attrs'][LS_POSIX_UIDNUMBER_ATTR] > $uidNumber)
+                               $uidNumber = $object['attrs'][LS_POSIX_UIDNUMBER_ATTR];
+               }
+
+               $uidNumber++;
+               return $uidNumber;
+
+       }
+
+ /*
+       * Generation de gidNumber
+       * 
+       * @author Benjamin Renard <brenard@easter-eggs.com>
+       * 
+       * @param[in] $ldapObject L'objet ldap
+       *
+       * @retval integer gidNumber ou false si il y a un problème durant la génération
+       */
+       function generate_gidNumber($ldapObject) {
+
+               $objects = $GLOBALS['LSldap'] -> search (LS_POSIX_GIDNUMBER_ATTR.'=*');
+               $gidNumber = LS_POSIX_GIDNUMBER_MIN_VAL;
+
+               if (!is_array($objects))
+                       return;
+
+               foreach($objects as $object) {
+                       if($object['attrs'][LS_POSIX_GIDNUMBER_ATTR] > $gidNumber)
+                               $gidNumber = $object['attrs'][LS_POSIX_GIDNUMBER_ATTR];
+               }
+
+               $gidNumber++;
+               return $gidNumber;
+
+       }
+
+ /*
+       * Generation de homeDirectory
+       * 
+       * @author Benjamin Renard <brenard@easter-eggs.com>
+       * 
+       * @param[in] $ldapObject L'objet ldap
+       *
+       * @retval string homeDirectory ou false si il y a un problème durant la génération
+       */
+       function generate_homeDirectory($ldapObject) {
+    if ( get_class($ldapObject -> attrs[ LS_POSIX_UID_ATTR ]) != 'LSattribute' ) {
+                       $GLOBALS['LSerror'] -> addErrorCode('POSIX_01',array('dependency' => 'uid', 'attr' => 'homeDirectory'));
+                       return;
+    }
+               
+               $uid = $ldapObject -> attrs[ LS_POSIX_UID_ATTR ] -> getValue();
+               $home = LS_POSIX_HOMEDIRECTORY . $uid[0];
+               return $home;
+
+       }
+
+?>
diff --git a/trunk/includes/addons/LSaddons.samba.php b/trunk/includes/addons/LSaddons.samba.php
new file mode 100644 (file)
index 0000000..b5a8c9e
--- /dev/null
@@ -0,0 +1,221 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+
+ /*
+       * Données de configuration pour le support SAMBA
+       */
+
+                       // SID du domaine Samba géré
+                       define('LS_SAMBA_DOMAIN_SID','S-1-5-21-2421470416-3566881284-3047381809');
+
+                       // Nombre de base pour le calcul des sambaSID Utilisateur
+                       define('LS_SAMBA_SID_BASE_USER',1000);
+
+                       // Nombre de base pour le calcul des sambaSID Groupe
+                       define('LS_SAMBA_SID_BASE_GROUP',1001); 
+
+                /*
+      * NB : C'est deux nombres doivent être pour l'un paire et pour l'autre impaire
+                       * pour conserver l'unicité des SID
+                       */
+                       // Nom de l'attribut LDAP uidNumber
+                       define('LS_SAMBA_UIDNUMBER_ATTR','uidNumber');
+
+                       // Nom de l'attribut LDAP gidNumber
+                       define('LS_SAMBA_GIDNUMBER_ATTR','gidNumber');
+
+                       // Nom de l'attribut LDAP userPassword
+                       define('LS_SAMBA_USERPASSWORD_ATTR','userPassword');
+
+                       // Message d'erreur
+
+                       $GLOBALS['error_code']['SAMBA_SUPPORT_01']= array (
+                               'msg' => _("SAMBA Support : la classe smHash ne peut pas être chargée."),
+                               'level' => 'c'
+                       );
+                       $GLOBALS['error_code']['SAMBA_SUPPORT_02']= array (
+                               'msg' => _("SAMBA Support : La constante %{const} n'est pas définie."),
+                               'level' => 'c'
+                       );
+
+                       $GLOBALS['error_code']['SAMBA_SUPPORT_03']= array (
+                               'msg' => _("SAMBA Support : Les constantes LS_SAMBA_SID_BASE_USER et LS_SAMBA_SID_BASE_GROUP ne doivent pas avoir la même parité pour l'unicité des sambaSID."),
+                               'level' => 'c'
+                       );
+
+
+                       $GLOBALS['error_code']['SAMBA_01']= array (
+                               'msg' => _("SAMBA Support : L'attribut %{dependency} est introuvable. Impossible de générer l'attribut %{attr}."),
+                               'level' => 'c'
+                       );
+                       
+ /*
+       * Fin des données de configuration
+       */
+
+
+ /*
+  * Verification du support Samba par ldapSaisie
+       * 
+       * @author Benjamin Renard <brenard@easter-eggs.com>
+       *
+       * @retval boolean true si Samba est pleinement supporté, false sinon
+       */
+       function LSaddon_samba_support() {
+               
+               $retval=true;
+
+               // Dependance de librairie
+               if ( !class_exists('smbHash') ) {
+                       if ( ! @include_once(LS_LIB_DIR . 'class.smbHash.php') ) {
+                               $GLOBALS['LSerror'] -> addErrorCode('SAMBA_SUPPORT_O1');
+                               $retval=false;
+                       }
+               }
+
+
+               $MUST_DEFINE_CONST= array(
+                       'LS_SAMBA_DOMAIN_SID',
+                       'LS_SAMBA_SID_BASE_USER',
+                       'LS_SAMBA_SID_BASE_GROUP',
+                       'LS_SAMBA_UIDNUMBER_ATTR',
+                       'LS_SAMBA_GIDNUMBER_ATTR',
+                       'LS_SAMBA_USERPASSWORD_ATTR'
+               );
+
+               foreach($MUST_DEFINE_CONST as $const) {
+                       if ( constant($const) == '' ) {
+                               $GLOBALS['LSerror'] -> addErrorCode('SAMBA_SUPPORT_O2',$const);
+                               $retval=false;
+                       }
+               }
+
+               // Pour l'intégrité des SID
+               if ( (LS_SAMBA_SID_BASE_USER % 2) == (LS_SAMBA_SID_BASE_GROUP % 2) ) {
+                               $GLOBALS['LSerror'] -> addErrorCode('SAMBA_SUPPORT_O3');
+                               $retval=false;
+               }
+               
+               return $retval;
+       }
+
+ /*
+       * Generation de sambaSID
+       * 
+       * @author Benjamin Renard <brenard@easter-eggs.com>
+       * 
+       *   Number   = LS_SAMBA_UIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_USER
+       *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
+       *
+       * @param[in] $ldapObject L'objet ldap
+       *
+       * @retval string SambaSID ou false si il y a un problème durant la génération
+       */
+       function generate_sambaSID($ldapObject) {
+               if ( get_class($ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ]) != 'LSattribute' ) {
+                       $GLOBALS['LSerror'] -> addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_UIDNUMBER_ATTR, 'attr' => 'sambaSID'));
+                       return;
+               }
+
+               $uidNumber = $ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ] -> getValue() * 2 + LS_SAMBA_SID_BASE_USER;
+               $sambaSID = LS_SAMBA_DOMAIN_SID . '-' . $uidNumber;
+
+               return ($sambaSID);
+       }
+
+ /*
+       * Generation de sambaPrimaryGroupSID
+       * 
+       * @author Benjamin Renard <brenard@easter-eggs.com>
+       * 
+       *   Number   = LS_SAMBA_GIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_GROUP
+       *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
+       *
+       * @param[in] $ldapObject L'objet ldap
+       *
+       * @retval string sambaPrimaryGroupSID ou false si il y a un problème durant la génération
+       */
+       function generate_sambaPrimaryGroupSID($ldapObject) {
+               if ( get_class($ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ]) != 'LSattribute' ) {
+                       $GLOBALS['LSerror'] -> addErrorCode('SAMBA_02',array('dependency' => LS_SAMBA_GIDNUMBER_ATTR, 'attr' => 'sambaPrimaryGroupSID'));
+                       return;
+               }
+
+               $gidNumber = $ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ] -> getValue() * 2 + LS_SAMBA_SID_BASE_GROUP;
+               $sambaPrimaryGroupSID = LS_SAMBA_DOMAIN_SID . '-' . $gidNumber;
+
+               return ($sambaPrimaryGroupSID);
+       }
+
+ /*
+       * Generation de sambaNTPassword
+       * 
+       * @author Benjamin Renard <brenard@easter-eggs.com>
+       * 
+       * @param[in] $ldapObject L'objet ldap
+       *
+       * @retval string sambaNTPassword ou false si il y a un problème durant la génération
+       */
+       function generate_sambaNTPassword($ldapObject) {
+    if ( get_class($ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ]) != 'LSattribute' ) {
+      $GLOBALS['LSerror'] -> addErrorCode('SAMBA_03',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaNTPassword'));
+      return;
+    }
+
+               $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
+               $sambapassword = new smbHash;
+               $sambaNTPassword = $sambapassword -> nthash($password);
+
+               if($sambaNTPassword == '') {
+                       return;
+               }
+               return $sambaNTPassword;
+       }
+
+ /*
+       * Generation de sambaLMPassword
+       * 
+       * @author Benjamin Renard <brenard@easter-eggs.com>
+       * 
+       * @param[in] $ldapObject L'objet ldap
+       *
+       * @retval string sambaLMPassword ou false si il y a un problème durant la génération
+       */
+       function generate_sambaLMPassword($ldapObject) {
+    if ( get_class($ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ]) != 'LSattribute' ) {
+      $GLOBALS['LSerror'] -> addErrorCode('SAMBA_04',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaLMPassword'));
+      return;
+    }
+
+               $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
+               $sambapassword = new smbHash;
+               $sambaLMPassword = $sambapassword -> lmhash($password);
+
+               if($sambaLMPassword == '') {
+                       return;
+               }
+               return $sambaLMPassword;
+       }
+
+?>
index b847b02..d3872dd 100644 (file)
@@ -29,21 +29,58 @@ class LSattr_html {
   
   var $name;
   var $config;
-  
-  function LSattr_html ($name,$config) {
+  var $attribute;
+
+  /**         
+   * Constructeur
+   *
+   * Cette methode construit l'objet et définis la configuration.
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @param[in] $name string Nom de l'attribut ldap
+   * @param[in] $config array Configuration de l'objet
+        * @param[in] &$attribute LSattribute L'objet LSattribut parent
+   *
+   * @retval boolean Retourne true.
+   */   
+  function LSattr_html ($name,$config,&$attribute) {
     $this -> name = $name;
     $this -> config = $config;
+    $this -> attribute = $attribute;
     return true;
   }
   
+       /**
+        * Retourne le label de l'attribut
+        *
+        * Retourne le label de l'attribut ou son nom si aucun label n'est défini
+        * dans la configuration.
+        *
+        * @retval string Le label de l'attribut.
+        */
   function getLabel() {
-    return $this -> config['label'];
+               if ( $this -> config['label'] != '' ) {
+                       return $this -> config['label'];
+               }
+               else {
+                       return $this -> name;
+               }
   }
   
-  function addToForm (&$form,$idForm) {
+       /**
+        * Ajoute l'attribut au formualaire passer en paramètre
+        *
+        * @param[in] &$form LSform Le formulaire
+        * @param[in] $idForm L'identifiant du formulaire
+        * @param[in] $data Valeur du champs du formulaire
+        *
+        * @retval LSformElement L'element du formulaire ajouté
+        */
+  function addToForm (&$form,$idForm,$data=NULL) {
     $GLOBALS['LSerror'] -> addErrorCode(101,$this -> name);
   }
   
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/trunk/includes/class/class.LSattr_html_password.php b/trunk/includes/class/class.LSattr_html_password.php
new file mode 100644 (file)
index 0000000..6f9322b
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Type d'attribut HTML password
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSattr_html_password extends LSattr_html {
+
+       /**
+        * Ajoute l'attribut au formualaire passer en paramètre
+        *
+        * @param[in] &$form LSform Le formulaire
+        * @param[in] $idForm L'identifiant du formulaire
+        * @param[in] $data Valeur du champs du formulaire
+        *
+        * @retval LSformElement L'element du formulaire ajouté
+        */ 
+  function addToForm (&$form,$idForm,$data=NULL) {
+    $element=$form -> addElement('password', $this -> name, $this -> config['label'], $this -> config);
+               if(!$element) {
+                       $GLOBALS['LSerror'] -> addErrorCode(206,$this -> name);
+                       return;
+               }
+
+    if (is_array($data)) {
+      $GLOBALS['LSerror'] -> addErrorCode(103,'password');
+      return;
+    }
+               if ($data) {
+           $element -> setValue($data);
+               }
+    return $element;
+  }
+  
+}
+
+?>
index 114a48d..ea88b4f 100644 (file)
  * @author Benjamin Renard <brenard@easter-eggs.com>
  */
 class LSattr_html_select_list extends LSattr_html{
-  
-  function addToForm (&$form,$idForm) {
-    return $form -> addElement('select', $this -> name, $this -> config['label'],$this -> getPossibleValues());
+
+       /**
+        * Ajoute l'attribut au formualaire passer en paramètre
+        *
+        * @param[in] &$form LSform Le formulaire
+        * @param[in] $idForm L'identifiant du formulaire
+        * @param[in] $data Valeur du champs du formulaire
+        *
+        * @retval LSformElement L'element du formulaire ajouté
+        */
+  function addToForm (&$form,$idForm,$data=NULL) {
+    if (is_array($data)) {
+      $GLOBALS['LSerror'] -> addErrorCode(103,'select_list');
+      return;
+    }
+    $possible_values=$this -> getPossibleValues();
+               $this -> config['text_possible_values'] = $possible_values;
+    $element=$form -> addElement('select', $this -> name, $this -> config['label'],$this -> config);
+               if(!$element) {
+                       $GLOBALS['LSerror'] -> addErrorCode(206,$this -> name);
+                       return;
+               }
+               if ($data) {
+           $element -> setValue($data);
+               }
+   
+    // Mise en place de la regle de verification des donnees
+    $regex_check_data='/';
+    foreach ($possible_values as $val => $text) {
+         if($regex_check_data=='/')
+                 $regex_check_data.='^'.preg_quote($val,'/').'$';
+                       else
+                 $regex_check_data.='|^'.preg_quote($val,'/').'$';
+    }
+    $regex_check_data.='/';
+    debug($this -> name.' : < '.$regex_check_data." ><br/>",$GLOBALS['debug_stat']);
+    $form -> addRule($this -> name, 'regex', array('msg'=> 'Valeur incorrect','params' => array('regex' => $regex_check_data)) );
+    // On retourne un pointeur vers l'element ajouter
+    return $element;
   }
   
   /**
@@ -69,6 +105,8 @@ class LSattr_html_select_list extends LSattr_html{
           }
         }
         else {
+                                       $val_name=$this->attribute->ldapObject->getFData($val_name);
+                                       $val=$this->attribute->ldapObject->getFData($val);
           $retInfos[$val_name]=$val;
         }
       }
@@ -78,4 +116,4 @@ class LSattr_html_select_list extends LSattr_html{
   
 }
 
-?>
\ No newline at end of file
+?>
index 1f112bf..6f44de6 100644 (file)
  * @author Benjamin Renard <brenard@easter-eggs.com>
  */
 class LSattr_html_text extends LSattr_html {
-  
-  function addToForm (&$form,$idForm) {
-    return $form -> addElement('text', $this -> name, $this -> config['label']);
+
+       /**
+        * Ajoute l'attribut au formualaire passer en paramètre
+        *
+        * @param[in] &$form LSform Le formulaire
+        * @param[in] $idForm L'identifiant du formulaire
+        * @param[in] $data Valeur du champs du formulaire
+        *
+        * @retval LSformElement L'element du formulaire ajouté
+        */
+  function addToForm (&$form,$idForm,$data=NULL) {
+    $element=$form -> addElement('text', $this -> name, $this -> config['label'],$this -> config);
+               if(!$element) {
+                       $GLOBALS['LSerror'] -> addErrorCode(206,$this -> name);
+                       return;
+               }
+               if ($data) {
+                       $element -> setValue($data);
+               }
+               return $element; 
   }
   
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/trunk/includes/class/class.LSattr_html_textarea.php b/trunk/includes/class/class.LSattr_html_textarea.php
new file mode 100644 (file)
index 0000000..46314c9
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Type d'attribut HTML textarea
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSattr_html_textarea extends LSattr_html {
+
+       /**
+        * Ajoute l'attribut au formualaire passer en paramètre
+        *
+        * @param[in] &$form LSform Le formulaire
+        * @param[in] $idForm L'identifiant du formulaire
+        * @param[in] $data Valeur du champs du formulaire
+        *
+        * @retval LSformElement L'element du formulaire ajouté
+        */
+  function addToForm (&$form,$idForm,$data=NULL) {
+    $element=$form -> addElement('textarea', $this -> name, $this -> config['label'], $this -> config);
+               if(!$element) {
+                       $GLOBALS['LSerror'] -> addErrorCode(206,$this -> name);
+                       return;
+               }
+
+    if (is_array($data)) {
+      $GLOBALS['LSerror'] -> addErrorCode(103,'textarea');
+      return;
+    }
+               if ($data) {
+           $element -> setValue($data);
+               }
+    return $element;
+  }
+  
+}
+
+?>
index 4cd6cfd..9c1938d 100644 (file)
@@ -29,21 +29,50 @@ class LSattr_ldap {
   
   var $name;
   var $config;
-  
-  function LSattr_ldap ($name,$config) {
+  var $attribute;
+
+  /**         
+   * Constructeur
+   *
+   * Cette methode construit l'objet et définis la configuration.
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @param[in] $name string Nom de l'attribut ldap
+   * @param[in] $config array Configuration de l'objet
+        * @param[in] &$attribute LSattribute L'objet LSattribut parent
+   *
+   * @retval boolean Retourne true.
+   */
+  function LSattr_ldap ($name,$config,&$attribute) {
     $this -> name = $name;
     $this -> config = $config;
     return true;
   }
-  
+
+       /**
+        * Retourne la valeur de l'attribut après traitement lié à son type ldap
+        *
+        * @param[in] $data mixed La valeur de l'attribut
+        *
+        * @retval mixed La valeur traitée de l'attribut
+        */
   function getUpdateData($data) {
     return $data;
   }
-  
+       /**
+        * Retourne la valeur d'affichage de l'attribut après traitement lié à son type ldap
+        *
+        * @param[in] $data mixed La valeur de l'attribut
+        *
+        * @retval mixed La valeur d'affichage de l'attribut
+        */
+
   function getDisplayValue($data) {
     return $data;
   }
   
 }
 
-?>
\ No newline at end of file
+?>
index 297bca8..0ed1131 100644 (file)
 ******************************************************************************/
 
 /**
- * Type d'attribut Ldap numeric
+ * Type d'attribut Ldap ascii
  *
  * @author Benjamin Renard <brenard@easter-eggs.com>
  */
 class LSattr_ldap_ascii extends LSattr_ldap {
-  //\\
+  // \\
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/trunk/includes/class/class.LSattr_ldap_password.php b/trunk/includes/class/class.LSattr_ldap_password.php
new file mode 100644 (file)
index 0000000..385968f
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Type d'attribut Ldap password
+ *
+ */
+class LSattr_ldap_password extends LSattr_ldap {
+
+       var $clearPassword = NULL;
+
+       /**
+        * Retourne la valeur d'affichage de l'attribut après traitement lié à son type ldap
+        *
+        * @param[in] $data mixed La valeur de l'attribut
+        *
+        * @retval mixed La valeur d'affichage de l'attribut
+        */
+  function getDisplayValue($data) {
+    return '********';
+  }
+
+       /**
+        * Retourne la valeur de l'attribut après traitement lié à son type ldap
+        *
+        * @param[in] $data mixed La valeur de l'attribut
+        *
+        * @retval mixed La valeur traitée de l'attribut
+        */
+  function getUpdateData($data) {
+               $this -> clearPassord = $data[0];
+    return '{CRYPT}'.crypt($data[0],'$1$'.$this -> getSalt().'$');
+  }
+       /**
+        * Retourne une salt (chaine de caractère aléatoire) de la longueur passée en paramètre
+        *
+        * @param[in] integer La longueur de la salt (par defaut : 8)
+        *
+        * @retval string La salt
+        */
+  function getSalt($length=8) {
+    $pattern = "1234567890abcdefghijklmnopqrstuvwxyz";
+    $key  = $pattern{rand(0,35)};
+    for($i=1;$i<$length;$i++)
+    {
+        $key .= $pattern{rand(0,35)};
+    }
+    return $key;
+  }
+
+       /**
+        * Retourne le mot de passe en texte clair
+        *
+        * @retval string Le mot de passe en texte clair
+        */
+       function getClearPassword() {
+               return $this -> clearPassword;
+       }
+}
+
+?>
index 554ddc3..540b681 100644 (file)
@@ -31,11 +31,13 @@ class LSattribute {
   
   var $name;
   var $config;
+  var $ldapObject;
   var $ldap;
   var $html;
   var $data;
   var $updateData=false;
   var $is_validate=false;
+       var $_finalUpdateData=false;
   
   /**
    * Constructeur
@@ -48,20 +50,23 @@ class LSattribute {
    *
    * @param[in] $name string Nom de l'attribut ldap
    * @param[in] $config array Configuration de l'objet
+   * @param[in] &$ldapObject LSldapObject L'objet ldap parent
    *
    * @retval boolean Retourne true si la création a réussi, false sinon.
    */  
-  function LSattribute ($name,$config) {
+  function LSattribute ($name,$config,&$ldapObject) {
     $this -> name = $name;
     $this -> config = $config;
+               $this -> ldapObject = $ldapObject;
+    
     $html_type = "LSattr_html_".$config['html_type'];
     $ldap_type = "LSattr_ldap_".$config['ldap_type'];
     if((class_exists($html_type))&&(class_exists($ldap_type))) {
-      $this -> html = new $html_type($name,$config);
-      $this -> ldap = new $ldap_type($name,$config);
+      $this -> html = new $html_type($name,$config,$this);
+      $this -> ldap = new $ldap_type($name,$config,$this);
     }
     else {
-      $GLOBALS['LSerror'] -> addErrorCode(41,array('html'=>$config['html_type'],'ldap'=>$config['ldap_type']));
+      $GLOBALS['LSerror'] -> addErrorCode(41,array('attr' => $name,'html'=>$config['html_type'],'ldap'=>$config['ldap_type']));
       return;
     }
     return true;
@@ -95,25 +100,36 @@ class LSattribute {
   }
   
   /**
-   * DEBIG : affiche la valeur de l'attribut
+   * Redéfini la valeur de l'attribut
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
    *
-   * @retval void
+   * @retval boolean true
    */
-  function debug_printValue() {
-    print $this -> data;
+  function reloadData($attr_data) {
+    $this -> data = $attr_data;
+    $this -> updateData=false;
+    $this -> is_validate=false;
+    return true;
   }
   
   /**
    * Retourne la valeur de l'attribut
+        *
+        * Retourne la valeur nouvelle si elle existe, sinon la valeur passé.
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
    *
    * @retval mixed La valeur de l'attribut
    */
   function getValue() {
-    return $this -> data;
+               $updateData=$this -> getUpdateData();
+               if (empty($updateData)) {
+           return $this -> data;
+               }
+               else {
+                       return $updateData;
+               }
   }
   
   /**
@@ -160,23 +176,34 @@ class LSattribute {
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
    *
-   * @param[in] object LSform Le formulaire dans lequel doit être ajouté l'attribut
-   * @param[in] string L'identifiant du formulaire
+   * @param[in] object $form Le formulaire dans lequel doit être ajouté l'attribut
+   * @param[in] string $idForm L'identifiant du formulaire
+   * @param[in] objet  &$obj Objet utilisable pour la génération de la valeur de l'attribut
    *
    * @retval boolean true si l'ajout a fonctionner ou qu'il n'est pas nécessaire, false sinon
    */
-  function addToForm(&$form,$idForm) {
+  function addToForm(&$form,$idForm,&$obj=NULL) {
     if(isset($this -> config['form'][$idForm])) {
-      $element = $this -> html -> addToForm($form,$idForm);
-      if($this -> config['required']==1)
-        $form->addRule($this -> name, "Le champ '".$this -> config['label']."' est obligatoire.",'required', null, 'client');
-      /// !!!!! A CHANGER !!!!!!! \\\\ => utiliser une fonction de traitement de donnée
-      if($this -> data !='')
-        $element -> setValue($this -> getFormVal());
-      else if (isset($this -> config['default_value']))
-        $element -> setValue($this -> config['default_value']);
-      if($this -> config['form'][$idForm]==0)
+      if($this -> data !='') {
+        $data=$this -> getFormVal();
+      }
+      else if (isset($this -> config['default_value'])) {
+        $data=$obj -> getFData($this -> config['default_value']);
+      }
+      
+      $element = $this -> html -> addToForm($form,$idForm,$data);
+                       if(!$element) {
+                               $GLOBALS['LSerror'] -> addErrorCode(206,$this -> name);
+                       }
+
+      if($this -> config['required']==1) {
+        $form -> setRequired($this -> name);
+      }
+
+      if($this -> config['form'][$idForm]==0) {
         $element -> freeze();
+      }
+      
       if(isset($this -> config['check_data'])) {
         if(is_array($this -> config['check_data'])) {
           foreach ($this -> config['check_data'] as $rule => $rule_infos) {
@@ -185,10 +212,10 @@ class LSattribute {
               return;
             }
             if(!isset($rule_infos['msg']))
-              $rule_infos['msg']='La valeur du champs '.$this -> config['label'].' est invalide.';
+              $rule_infos['msg']=getFData(_('La valeur du champs %{label} est invalide.'),$this -> config['label']);
             if(!isset($rule_infos['param']))
               $rule_infos['param']=NULL;
-            $form -> addRule($this -> name,$rule_infos['msg'],$rule,$rule_infos['param'],$GLOBALS['LSconfig']['check_data_place']);
+            $form -> addRule($this -> name,$rule,array('msg' => $rule_infos['msg'], 'param' => $rule_infos['param']));
           }
         }
         else {
@@ -200,6 +227,30 @@ class LSattribute {
   }
   
   /**
+   * Rafraichis la valeur de l'attribut dans un formualaire
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @param[in] object &$form LSform Le formulaire dans lequel doit être ajouté l'attribut
+   * @param[in] string $idForm L'identifiant du formulaire
+   *
+   * @retval boolean true si la valeur a été rafraichie ou que ce n'est pas nécessaire, false sinon
+   */
+  function refreshForm(&$form,$idForm) {
+    if(isset($this -> config['form'][$idForm])) {
+      //~ echo 'Attr : '.$this -> name.'| Val : '.$this -> data."<br />\n";
+      $form_element = &$form -> getElement($this -> name);
+      if(!empty($this -> data)) {
+        return $form_element -> setValue($this -> getFormVal());
+      }
+      else if (isset($this -> config['default_value'])) {
+        return $form_element -> setValue($this -> config['default_value']);
+      }
+    }
+    return true;
+  }
+  
+  /**
    * Retourne la valeur a afficher dans le formulaire
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
@@ -210,6 +261,15 @@ class LSattribute {
     return $this -> getDisplayValue();
   }
   
+  /**
+   * Définis les données de mises à jour si un changement a eut lieu
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @param[in] string $data Les données de mise à jour.
+   *
+   * @retval void
+   */
   function setUpdateData($data) {
     if($this -> getFormVal() != $data)
       $this -> updateData=$data;
@@ -223,7 +283,7 @@ class LSattribute {
    * @retval boolean true si l'attribut a été validé, false sinon
    */
   function isValidate() {
-    return ((!isset($this -> config['validation'])) || ($this -> is_validate));
+    return $this -> is_validate;
   }
   
   /**
@@ -249,14 +309,63 @@ class LSattribute {
   }
   
   /**
+   * Vérifie si l'attribut est obligatoire
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @retval boolean true si l'attribut est obligatoire, false sinon
+   */
+  function isRequired() {
+    return $this -> config['required'];
+  }
+  
+  /**
+   * Vérifie si la valeur de l'attribut peut être générée
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @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']));
+  }
+
+       /**
+        * Génere la valeur de l'attribut à partir de la fonction de génération
+        *
+        * @author Benjamin Renard <brenard@easter-eggs.com>
+        *
+        * @retval boolean true si la valeur à put être générée, false sinon
+        */
+       function generateValue() {
+               if ( ! $this -> canBeGenerated() ) {
+                       return;
+               }
+               $value=call_user_func($this -> config['generate_function'],$this -> ldapObject);
+               if (!empty($value)) {
+                       //$this -> setValue($value); // pas nécéssaire ??
+                       $this -> updateData=$value;
+                       return true;
+               }
+               return;
+       }
+  
+  /**
    * Retourne la valeur de l'attribut pour son enregistrement dans l'annuaire
+        * si l'attribut à été modifié.
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
    *
    * @retval mixed La valeur de l'attribut pour son enregistrement dans l'annuaire
    */
   function getUpdateData() {
-    $data=($this ->isUpdate())?$this -> updateData:$this -> data;
+               if (!$this -> isUpdate()) {
+                       return;
+               }
+               if ( $this -> _finalUpdateData ) {
+                       return  $this -> _finalUpdateData;
+               }
+    $data=$this -> updateData;
     if ($this -> config['onSave']) {
       if (is_array($this -> config['onSave'])) {
         $result=$data;
@@ -269,11 +378,10 @@ class LSattribute {
             return;
           }
         }
-        return $result;
       }
       else {
         if (function_exists($this -> config['onSave'])) {
-          return $this -> config['onSave']($data);
+          $result = $this -> config['onSave']($data);
         }
         else {
           $GLOBALS['LSerror'] -> addErrorCode(45,array('attr' => $this->name,'func' => $this -> config['onSave']));
@@ -281,11 +389,15 @@ class LSattribute {
         }
       }
     }
-    return $this -> ldap -> getUpdateData($data);
+    else {
+      $result = $this -> ldap -> getUpdateData($data);
+    }
+               $this -> _finalUpdateData = $result;
+    return $result;
   }
-  
   /**
-   * Retourne la configuration de validation de l'annuaire
+   * Retourne la configuration de validation de l'attribut
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
    *
@@ -294,7 +406,17 @@ class LSattribute {
   function getValidateConfig() {
     return $this -> config['validation'];
   }
-  
+
+  /**
+   * Retourne les attributs dépendants de celui-ci
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @retval array les noms des attributs dépendants
+   */
+  function getDependsAttrs() {
+    return $this -> config['dependAttrs'];
+  } 
 }
 
-?>
\ No newline at end of file
+?>
index e912722..c5beb67 100644 (file)
@@ -37,10 +37,12 @@ class LSeegroup 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()
    */
   function LSeegroup ($config='auto') {
     $this -> LSldapObject('LSeegroup',$config);
   }
 }
 
-?>
\ No newline at end of file
+?>
index a0e008c..e24743b 100644 (file)
@@ -37,10 +37,12 @@ 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()
    */  
   function LSeepeople ($config='auto') {
     return $this -> LSldapObject('LSeepeople',$config);
   }
 }
 
-?>
\ No newline at end of file
+?>
index 40e5ce5..481c807 100644 (file)
@@ -79,7 +79,7 @@ class LSerror {
    */
   function display() {
     if(!empty($this -> errors)) {
-      print "<h3>Erreurs</h3>\n";
+      print "<h3>"._('Erreurs')."</h3>\n";
       foreach ($this -> errors as $error) {
         echo "(Code ".$error[0].") ".getFData($GLOBALS['error_code'][$error[0]]['msg'],$error[1])."<br />\n";
       }
@@ -87,4 +87,4 @@ class LSerror {
   }
 }
 
-?>
\ No newline at end of file
+?>
index 2fc5058..dc677fe 100644 (file)
 /**
  * Formulaire pour LdapSaisie
  *
- * Cette classe gère les formulaires en se basant sur PEAR::HTML_QuickForm
+ * Cette classe gère les formulaires
  *
  * @author Benjamin Renard <brenard@easter-eggs.com>
  */
 
 class LSform {
-  
-  var $quickform;
+  var $ldapObject;
   var $idForm;
-  var $can_validate=true;
-  
-  /**
+  var $can_validate = true;
+  var $elements = array();
+  var $_rules = array();
+
+       var $_postData = array();
+       var $_elementsErrors = array();
+       var $_isValidate = false;
+
+       var $_notUpdate = array();
+
+       /**
    * Constructeur
    *
    * Cette methode construit l'objet et définis la configuration.
-   * Elle lance la construction de l'objet HTML_QuickForm et définis les élements
-   * de base à communiquer de page en page par le formulaire.
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
    *
@@ -49,11 +55,10 @@ class LSform {
    *
    * @retval void
    */  
-  function LSform ($idForm,$submit="Envoyer"){
+  function LSform (&$ldapObject,$idForm,$submit="Envoyer"){
     $this -> idForm = $idForm;
     $this -> submit = $submit;
-    $this -> quickform = new HTML_QuickForm($idForm);
-    $this -> quickform -> addElement('hidden',"LSdata['idForm']",$idForm);
+               $this -> ldapObject = $ldapObject;
   }
   
   /**
@@ -64,10 +69,26 @@ class LSform {
    * @retval void
    */  
   function display(){
-    if($this -> can_validate) {
-      $this -> quickform -> addElement('submit', null, $this -> submit);
-    }
-    $this -> quickform -> display();
+               echo "<form method='post' action='".$_SERVER['PHP_SELF']."'>\n";
+               echo "\t<input type='hidden' name='validate' value='LSform'/>\n";
+               echo "\t<input type='hidden' name='idForm' value='".$this -> idForm."'/>\n";
+               echo "<table>\n";
+               foreach($this -> elements as $element) {
+                       $element -> display();
+                       if (isset($this -> _elementsErrors[$element -> name])) {
+                               foreach ($this -> _elementsErrors[$element -> name] as $error) {
+                                       echo "<tr><td></td><td>$error</td></tr>";
+                               }
+                       }
+               }
+               if($this -> can_validate) {
+                       echo "\t<tr>\n";
+                       echo "\t\t<td>&nbsp;</td>\n";
+                       echo "\t\t<td><input type='submit' value=\"".$this -> submit."\"/></td>\n";
+                       echo "\t</tr>\n";
+               }
+               echo "</table>\n";
+               echo "</form>\n";
   }
   
   /**
@@ -83,14 +104,13 @@ class LSform {
    * @retval void
    */  
   function setElementError($attr,$msg=NULL) {
-    //~ print 'erreur<br />';
     if($msg!='') {
       $msg_error=getFData($msg,$attr->getLabel());
     }
     else {
-      $msg_error="Les données pour l'attribut ".$attr->getLabel()." ne sont pas valides.";
+      $msg_error=getFData(_("Les données pour l'attribut %{label} ne sont pas valides."),$attr->getLabel());
     }
-    $this -> quickform -> setElementError($attr->name,$msg_error);
+    $this -> _elementsErrors[$attr->name][]=$msg_error;
   }
   
   /**
@@ -101,9 +121,241 @@ class LSform {
    * @retval boolean true si le formulaire a été validé et que les données ont été validées, false sinon
    */  
   function validate(){
-    return (($this -> can_validate)&&($this -> quickform -> validate()));
+    if(!$this -> can_validate)
+      return;
+    if ($this -> isSubmit()) {
+                       if (!$this -> getPostData()) {
+                               $GLOBALS['LSerror'] -> addErrorCode(201);
+                               return;
+                       }
+      //Validation des données ici !!! ///
+                       if (!$this -> checkData()) {
+                               $this -> setValuesFromPostData();
+                               return;
+                       }
+                       debug("les données sont checkées");
+                       $this -> _isValidate = true;
+                       return true;
+               }
+               return false;
   }
-  
+
+       /**
+        * Vérifier les données du formulaire à partir des régles définis sur les champs
+        *
+        * @author Benjamin Renard <brenard@easter-eggs.com>
+        *
+        * @retval boolean true si toutes la saisie est OK, false sinon
+        */
+       function checkData() {
+               $retval=true;
+               foreach ($this -> _postData as $element => $values) {
+                       if(!is_array($values)) {
+                               $values=array($values);
+                       }
+                       if ($this -> elements[$element] -> isRequired()) {
+                               if (!$this -> checkRequired($values)) {
+                                       $this -> setElementError($this -> elements[$element],_("Champ obligatoire"));
+                                       $retval=false;
+                               }
+                       }
+
+                       foreach($values as $value) {
+                               if (empty($value)) {
+                                       continue;
+                               }
+                               if (!is_array($this -> _rules[$element]))
+                                       continue;
+                               foreach($this -> _rules[$element] as $rule) {
+                                       if (! call_user_func(array( "LSformRule_".$rule['name'],'validate') , $value, $rule['options'])) {
+                                               $retval=false;
+                                               $this -> setElementError($this -> elements[$element],$rule['options']['msg']);
+                                       }
+                               }
+                       }
+               }
+               return $retval;
+       }
+
+       /**
+        * Vérifie si au moins une valeur est présente dans le tableau
+        *
+        * @author Benjamin Renard <brenard@easter-eggs.com>
+        *
+        * @param[in] $data array tableau de valeurs
+        *
+        * @retval boolean true si au moins une valeur est présente, false sinon
+        */
+       function checkRequired($data) {
+               foreach($data as $val) {
+                       if (!empty($val))
+                               return true;
+               }
+               return;
+       }
+
+  /**
+        * Verifie si la saisie du formulaire est présente en POST
+        *
+        * @author Benjamin Renard <brenard@easter-eggs.com>
+        *
+        * @retval boolean true si la saisie du formulaire est présente en POST, false sinon
+        */
+  function isSubmit() {
+    if( (isset($_POST['validate']) && ($_POST['validate']=='LSform')) && (isset($_POST['idForm']) && ($_POST['idForm'] == $this -> idForm)) )
+      return true;
+               return;
+  }
+
+       /**
+        * Récupère les valeurs postées dans le formulaire
+        *
+        * @author Benjamin Renard <brenard@easter-eggs.com>
+        *
+        * @retval boolean true si les valeurs ont bien été récupérées, false sinon.
+        */
+       function getPostData() {
+               foreach($this -> elements as $element_name => $element) {
+                       if( !($element -> getPostData($this -> _postData)) ) {
+                               $GLOBALS['LSerror'] -> addErrorCode(202,$element_name);
+                               return;
+                       }
+               }
+               return true;
+       }
+
+       /*
+        * Ajoute un élément au formulaire
+        * 
+        * Ajoute un élément au formulaire et définis les informations le concernant.
+        *
+        * @param[in] $type string Le type de l'élément
+        * @param[in] $name string Le nom de l'élément
+        * @param[in] $label string Le label de l'élément
+        * @param[in] $param mixed Paramètres supplémentaires
+        *
+        * @retval LSformElement
+        */
+       function addElement($type,$name,$label,$params=array()) {
+               $elementType='LSformElement_'.$type;
+               if (!class_exists($elementType)) {
+                       $GLOBALS['LSerror'] -> addErrorCode(205,array('type' => $type));        
+                       return;
+               }
+               $element=$this -> elements[$name] = new $elementType($this,$name,$label,$params);
+               if ($element) {
+                       return $element;
+               }
+               else {
+                       unset ($this -> elements[$name]);
+                       $GLOBALS['LSerror'] -> addErrorCode(206,array('element' => $name));
+                       return;
+               }
+       }
+
+       /*
+        * Ajoute une règle sur un élément du formulaire
+        *
+        * @author Benjamin Renard <brenard@easter-eggs.com>
+        *
+        * @param[in] $element string Le nom de l'élément conserné
+        * @param[in] $rule string Le nom de la règle à ajouter
+        * @param[in] $options array Options (facultative)
+        *
+        * @retval boolean
+        */
+       function addRule($element, $rule, $options=array()) {
+               if ( isset($this ->elements[$element]) ) {
+                       if ($this -> isRuleRegistered($rule)) {
+                               $this -> _rules[$element][]=array(
+                                                                       'name' => $rule,
+                                                                       'options' => $options
+                                                                       );
+                               return true;
+                       }
+                       else {
+                               $GLOBALS['LSerror'] -> addErrorCode(43,array('attr' => $element,'rule'=>$rule));                        
+                               return;
+                       }
+               }
+               else {  
+                       $GLOBALS['LSerror'] -> addErrorCode(204,array('element' => $element));
+                       return;
+               }
+       }
+
+
+
+
+       /*
+        * Définis comme requis un élément
+        *
+        * @author Benjamin Renard <brenard@easter-eggs.com>
+        *
+        * @param[in] $element string Le nom de l'élément conserné
+        *
+        * @retval boolean
+        */
+       function setRequired($element) {
+               if (isset( $this -> elements[$element] ) )
+                       return $this -> elements[$element] -> setRequired();
+               else
+                       return;
+       }
+
+       /*
+        * Détermine la valider de la règle
+        *
+        * Devra déterminer si la règle passez en paramètre est correcte
+        *
+        * @author Benjamin Renard <brenard@easter-eggs.com>
+        *
+        * @param[in] $element string Le nom de l'élément conserné
+        */
+       function isRuleRegistered($rule) {
+               return class_exists('LSformRule_'.$rule);
+       }
+
+       /**
+        * Retourne les valeurs validés du formulaire
+        *
+        * @retval mixed Les valeurs validés du formulaire, ou false si elles ne le sont pas
+        */
+       function exportValues() {
+               if ($this -> _isValidate) {
+                       return $this -> _postData;
+               }
+               else {
+                       return;
+               }
+       }
+
+       /**
+        * Retourn un élement du formulaire
+        *
+        * @param[in] string $element Nom de l'élement voulu
+        *
+        * @retval LSformElement L'élement du formulaire voulu
+        */
+       function getElement($element) {
+               return $this -> elements[$element];
+       }
+
+       /**
+        * Défini les valeurs des élements à partir des valeurs postées
+        *
+        * @retval boolean True si les valeurs ont été définies, false sinon.
+        */
+       function setValuesFromPostData() {
+               if (empty($this -> _postData)) {
+                       return;
+               }
+               foreach($this -> _postData as $element => $values) {
+                       $this -> elements[$element] -> setValue($values);
+               }
+               return true;
+       }
+
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/trunk/includes/class/class.LSformElement.php b/trunk/includes/class/class.LSformElement.php
new file mode 100644 (file)
index 0000000..1611ebb
--- /dev/null
@@ -0,0 +1,211 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+
+/**
+ * Element d'un formulaire pour LdapSaisie
+ *
+ * Cette classe gère les éléments des formulaires.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+
+class LSformElement {
+
+  var $name;
+  var $label;
+  var $params;
+  var $values = array();
+  var $_required = false;
+  var $_freeze = false;
+
+  /**
+   * Constructeur
+   *
+   * Cette methode construit l'objet et définis sa configuration de base.
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @param[in] &$form [<b>required</b>] LSform L'objet LSform parent
+   * @param[in] $name [<b>required</b>] string Le nom de référence de l'élément
+   * @param[in] $label [<b>required</b>] string Le label de l'élément
+   * @param[in] $params mixed Paramètres supplémentaires
+   *
+   * @retval true
+   */  
+       function LSformElement (&$form, $name, $label, $params){
+    $this -> name = $name;
+               $this -> label = $label;
+               $this -> params = $params;
+               $this -> form = $form;
+               return true;
+  }
+
+  /**
+   * Définis la valeur de l'élément
+   *
+   * Cette méthode définis la valeur de l'élément
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @param[in] [<b>required</b>] string or array La futur valeur de l'élément
+   *
+   * @retval boolean Retourne True
+   */
+  function setValue($data) {
+               if (!is_array($data)) {
+                       $data=array($data);
+               }
+
+               $this -> values = $data;
+               return true;
+  }
+
+       /**
+   * Ajoute une valeur à l'élément
+   *
+   * Cette méthode ajoute une valeur à l'élément
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @param[in] [<b>required</b>] string or array La futur valeur de l'élément
+   *
+   * @retval void
+   */
+  function addValue($data) {
+               if (is_array($data)) {
+                       $this -> values = array_merge($this -> values, $data);
+               }
+               else {
+                       $this -> values[] = $data;
+               }
+  }
+
+       /**
+        * Test si l'élément est éditable
+        * 
+        * Cette méthode test si l'élément est éditable
+        *
+        * @retval boolean
+        */
+       function isFreeze(){
+               return $this -> _freeze;
+       }
+  
+  /*
+   * Freeze l'élément
+   *
+   * Rend l'élément non-editable
+   *
+   * @retval void
+   */
+  function freeze() {
+               $this -> _freeze = true;
+  }
+
+  /*
+   * Défini la propriété required de l'élément.
+   *
+   * param[in] $isRequired boolean true si l'élément est requis, false sinon
+   *
+   * @retval void
+   */
+  function setRequired($isRequired=true) {
+               $this -> _required = $isRequired;
+  }
+
+       /*
+        * Test si l'élément est requis
+        * 
+        * Cette méthode test si l'élément est requis
+        *
+        * @retval boolean
+        */
+       function isRequired(){
+               return $this -> _required;
+       }
+
+       /**
+        * Affiche le label de l'élement
+        *
+        * @retval void
+        */
+       function displayLabel() {
+       if ($this -> isRequired()) {
+       $required=" <span class='required_elements'>*</span>";
+       }
+         else {
+             $required="";
+       }
+         echo "\t\t<td>".$this -> getLabel()."$required</td>\n";
+       }
+
+       /**
+        * Recupère la valeur de l'élement passée en POST
+        *
+        * Cette méthode vérifie la présence en POST de la valeur de l'élément et la récupère
+        * pour la mettre dans le tableau passer en paramètre avec en clef le nom de l'élément
+        *
+        * @param[] array Pointeur sur le tableau qui recupèrera la valeur.
+        *
+        * @retval boolean true si la valeur est présente en POST, false sinon
+        */
+       function getPostData(&$return) {
+               if($this -> params['form'][$this -> form -> idForm] != 1) {
+                       return true;
+               }
+               if (isset($_POST[$this -> name])) {
+                       if(!is_array($_POST[$this -> name])) {
+                               $_POST[$this -> name] = array($_POST[$this -> name]);
+                       }
+                       foreach($_POST[$this -> name] as $key => $val) {
+                               if (!empty($val)) {
+                                       $return[$this -> name][$key] = $val;
+                               }
+                       }
+                       return true;
+               }
+               return;
+       }
+
+       /**
+        * Retourne le label de l'élement
+        *
+        * Retourne $this -> label, ou $this -> params['label'], ou $this -> name
+        *
+        * @retval string Le label de l'élément
+        */
+       function getLabel() {
+               if ($this -> label != "") {
+                       return $this -> label;
+               }
+               else if ($this -> params['label']) {
+                       return $this -> params['label'];
+               }
+               else {
+                       return $this -> name;
+               }
+       }
+
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformElement_password.php b/trunk/includes/class/class.LSformElement_password.php
new file mode 100644 (file)
index 0000000..a1f95af
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+
+/**
+ * Element password d'un formulaire pour LdapSaisie
+ *
+ * Cette classe définis les éléments password des formulaires.
+ * Elle étant la classe basic LSformElement.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+
+class LSformElement_password extends LSformElement {
+
+       /**
+   * Recupère la valeur de l'élement passée en POST
+   *
+   * Cette méthode vérifie la présence en POST de la valeur de l'élément et la récupère
+   * pour la mettre dans le tableau passer en paramètre avec en clef le nom de l'élément
+   *
+   * @param[] array Pointeur sur le tableau qui recupèrera la valeur.
+   *
+   * @retval boolean true si la valeur est présente en POST, false sinon
+   */
+  function getPostData(&$return) {
+               // Récupère la valeur dans _POST, et les vérifie avec la fonction générale
+               $retval = parent :: getPostData($return);
+               // Si une valeur est recupérée
+    if ($retval) {
+                       $val = $this -> form -> ldapObject -> attrs[$this -> name] -> getValue();       
+       if( (empty($return[$this -> name][0]) ) && ( ! empty( $val ) ) ) {
+                               unset($return[$this -> name]);
+                               $this -> form -> _notUpdate[$this -> name] == true;
+                               return true;
+                       }
+               }
+    return $retval;
+  }
+
+ /*
+  * Affiche l'élément
+  * 
+  * Cette méthode affiche l'élement
+  *
+  * @retval void
+  */
+       function display(){
+               echo "\t<tr>\n";
+               $this -> displayLabel();
+               // value
+               if (!$this -> isFreeze()) {
+                       echo "\t\t<td>\n";
+                       echo "\t\t\t<ul>\n";
+
+                       if (empty($this -> values)) {
+                               echo "\t\t\t\t<li><input type='password' name='".$this -> name."[]' \"></li>\n";
+                       }
+                       else {
+                               foreach ($this -> values as $value) {
+                                       echo "\t\t\t\t<li><input type='password' name='".$this -> name."[]'/></li>\n";
+                               }
+                       }
+
+                       echo "\t\t\t</ul>\n";
+                       echo "\t\t\t* "._('Modification uniquement').".";
+                       echo "\t\t</td>\n";
+               }
+               else {
+                       echo "\t\t<td>\n";
+                       echo "\t\t\t<ul>\n";
+
+                       if (empty($this -> values)) {
+                               echo "\t\t\t\t<li>"._('Aucunes valeur definie')."</li>\n";
+                       }
+                       else {
+                               foreach ($this -> values as $value) {
+                                       echo "\t\t\t\t<li>".$value."</li>\n";
+                               }
+                       }
+
+                       echo "\t\t\t</ul>\n";
+                       echo "\t\t</td>\n";
+               }
+               echo "\t</tr>\n";
+       }
+           
+}
+       
+?>
diff --git a/trunk/includes/class/class.LSformElement_select.php b/trunk/includes/class/class.LSformElement_select.php
new file mode 100644 (file)
index 0000000..79aafd6
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+
+/**
+ * Element select d'un formulaire pour LdapSaisie
+ *
+ * Cette classe définis les éléments select des formulaires.
+ * Elle étant la classe basic LSformElement.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+
+class LSformElement_select extends LSformElement {
+
+ /*
+  * Affiche l'élément
+  * 
+  * Cette méthode affiche l'élement
+  *
+  * @retval void
+  */
+  function display(){
+               echo "\t<tr>\n";
+               $this -> displayLabel();
+               // value
+               if (!$this -> isFreeze()) {
+                       echo "\t\t<td>\n";
+                       echo "\t\t\t<select name='".$this -> name."' multiple>\n";
+                       foreach ($this -> params['text_possible_values'] as $choice_value => $choice_text) {
+                               if (in_array($choice_value, $this -> values)) {
+                                       $selected=' selected';
+                               }
+                               else {
+                                       $selected='';
+                               }
+                               echo "\t\t\t\t<option value=\"".$choice_value."\"$selected>$choice_text</option>\n";
+                       }
+                       echo "\t\t\t</select>\n";
+                       echo "\t\t</td>\n";
+               }
+               else {
+                       echo "\t\t<td>\n";
+                       echo "\t\t\t<ul>\n";
+                       foreach ($params['possible_values'] as $choice_value => $choice_text) {
+                               if (in_array($choice_value, $this -> value)) {
+                                       echo "<li><strong>$choice_text</strong></li>";
+                               }
+                               else {
+                                       echo "<li>$choice_text</li>";
+                               }
+                       }
+                       echo "\t\t\t</ul>\n";
+                       echo "\t\t</td>\n";
+               }
+               echo "\t</tr>\n";
+       }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformElement_text.php b/trunk/includes/class/class.LSformElement_text.php
new file mode 100644 (file)
index 0000000..c95be22
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+
+/**
+ * Element texte d'un formulaire pour LdapSaisie
+ *
+ * Cette classe définis les éléments textes des formulaires.
+ * Elle étant la classe basic LSformElement.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+
+class LSformElement_text extends LSformElement {
+
+ /*
+  * Affiche l'élément
+  * 
+  * Cette méthode affiche l'élement
+  *
+  * @retval void
+  */
+  function display(){
+               echo "\t<tr>\n";
+               $this -> displayLabel();
+               // value
+               if (!$this -> isFreeze()) {
+                       echo "\t\t<td>\n";
+                       echo "\t\t\t<ul>\n";
+                       if (empty($this -> values)) {
+                               echo "\t\t\t\t<li><input type='text' name='".$this -> name."[]' \"></li>\n";
+                       }
+                       else {
+                               foreach ($this -> values as $value) {
+                                       echo "\t\t\t\t<li><input type='text' name='".$this -> name."[]' value=\"".$value."\"></li>\n";
+                               }
+                       }
+                       echo "\t\t\t</ul>\n";
+                       echo "\t\t</td>\n";
+               }
+               else {
+                       echo "\t\t<td>\n";
+                       echo "\t\t\t<ul>\n";
+
+                       if (empty($this -> values)) {
+                               echo "\t\t\t\t<li>"._('Aucunes valeur definie')."</li>\n";
+                       }
+                       else {
+                               foreach ($this -> values as $value) {
+                                       echo "\t\t\t\t<li>".$value."</li>\n";
+                               }
+                       }
+
+                       echo "\t\t\t</ul>\n";
+                       echo "\t\t</td>\n";
+               }
+               echo "\t</tr>\n";
+  }
+    
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformElement_textarea.php b/trunk/includes/class/class.LSformElement_textarea.php
new file mode 100644 (file)
index 0000000..c55ea85
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+
+/**
+ * Element textarea d'un formulaire pour LdapSaisie
+ *
+ * Cette classe définis les éléments textarea des formulaires.
+ * Elle étant la classe basic LSformElement.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+
+class LSformElement_textarea extends LSformElement {
+
+ /*
+  * Affiche l'élément
+  * 
+  * Cette méthode affiche l'élement
+  *
+  * @retval void
+  */
+  function display(){
+               echo "\t<tr>\n";
+               $this -> displayLabel();
+               // value
+               if (!$this -> isFreeze()) {
+                       echo "\t\t<td>\n";
+
+                       if (empty($this -> values)) {
+                               echo "\t\t\t<textarea name='".$this -> name."[]'></textarea>\n";
+                       }
+                       else {
+                               foreach($this -> values as $value) {
+                                       echo "\t\t\t<textarea name='".$this -> name."[]'>".$value."</textarea>\n";
+                               }
+                       }
+
+                       echo "\t\t</td>\n";
+               }
+               else {
+                       echo "\t\t<td>\n";
+
+                       if (empty($this -> values)) {
+                               echo "\t\t\t\t<li>"._('Aucunes valeur definie')."</li>\n";
+                       }
+                       else {
+                               foreach ($this -> values as $value) {
+                                       echo "\t\t\t\t<li>".$value."</li>\n";
+                               }
+                       }
+
+                       echo "\t\t</td>\n";
+               }       
+               echo "\t</tr>\n";
+  }
+    
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule.php b/trunk/includes/class/class.LSformRule.php
new file mode 100644 (file)
index 0000000..dbcaff3
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Base d'une règle de validation de données
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule {
+  
+  /**
+   * Constructeur
+       *
+       * @author Benjamin Renard <brenard@easter-eggs.com>*
+       */
+  function LSformRule () {
+    return true;
+  }
+  
+  /**
+   * Validation de données
+       *
+       * @param        mixed $value Données à valider
+       * @param array $options Options de validation
+       *
+       * @return boolean True si les données sont valide, False sinon.
+       */
+  function validate($value,$options=NULL) {
+    return true;
+  }
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_alphanumeric.php b/trunk/includes/class/class.LSformRule_alphanumeric.php
new file mode 100644 (file)
index 0000000..f1801d6
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation d'une valeur alpha-numérique.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_alphanumeric extends LSformRule {
+  
+  /**
+   * Vérification de la valeur.
+        *
+        * @param string $value  Value à vérifier
+        * @param array $options Options de validation (inutile ici)
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */
+  function validate ($value,$options=array()) {
+    $regex = '/^[a-zA-Z0-9]+$/';
+    return LSformRule_regex :: validate($value,$regex);
+  }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_compare.php b/trunk/includes/class/class.LSformRule_compare.php
new file mode 100644 (file)
index 0000000..7b847e3
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation par comparaison de valeurs.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_compare extends LSformRule {
+  
+  /**
+   * Retourne l'operateur de comparaison.
+   *
+   * @access private
+   * @param  string  Nom de l'operateur
+   *
+   * @return string  Operateur à utiliser
+   */
+  function _findOperator($operator_name) {
+
+               $_operators = array(
+        'eq'  => '==',
+        'neq' => '!=',
+        'gt'  => '>',
+        'gte' => '>=',
+        'lt'  => '<',
+        'lte' => '<='
+    );
+
+    if (empty($operator_name)) {
+      return '==';
+    } elseif (isset($this->_operators[$operator_name])) {
+      return $this->_operators[$operator_name];
+    } elseif (in_array($operator_name, $this->_operators)) {
+      return $operator_name;
+    } else {
+      return '==';
+    }
+  }
+
+       /**
+   * Vérification des valeurs.
+        *
+        * @param string $values Valeurs à vérifier
+        * @param array $options Options de validation : 
+        *                                                                                                                      - Operateur : $options['params']['operator']
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */
+  function validate ($values,$options=array()) {
+               if (!isset($options['params']['operator'])) {
+                       $GLOBALS['LSerror'] -> addErrorCode(303);
+                       return;
+               }
+    $operator = LSformRule_compare :: _findOperator($options['params']['operator']);
+    if ('==' != $operator && '!=' != $operator) {
+      $compareFn = create_function('$a, $b', 'return floatval($a) ' . $operator . ' floatval($b);');
+    }
+    else {
+      $compareFn = create_function('$a, $b', 'return $a ' . $operator . ' $b;');
+    }
+    return $compareFn($values[0], $values[1]);
+  }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_email.php b/trunk/includes/class/class.LSformRule_email.php
new file mode 100644 (file)
index 0000000..1e581e6
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation d'un email.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_email extends LSformRule {
+ /**
+   * Vérification de la valeur.
+        *
+        * @param string $value Valeur à vérifier
+        * @param array $options Options de validation : 
+        *                                                                                                                                      - Check domain : $option['params']['checkDomain']
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */
+  function validate($value,$option=array()) {
+        $regex = '/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/';
+
+    if (!preg_match($regex, $value)) {
+      return false;
+               }
+
+    if ($option['params']['checkDomain'] && function_exists('checkdnsrr')) {
+      $tokens = explode('@', $email);
+      if (!(checkdnsrr($tokens[1], 'MX') || checkdnsrr($tokens[1], 'A'))) {
+                       return false;
+       }
+    }
+
+               return true;
+  }
+
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_lettersonly.php b/trunk/includes/class/class.LSformRule_lettersonly.php
new file mode 100644 (file)
index 0000000..7983106
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation d'une valeur ne contenant que des lettres.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_lettersonly extends LSformRule {
+  
+  /**
+   * Vérification de la valeur.
+        *
+        * @param string $value  Value à vérifier
+        * @param array $options Options de validation (inutile ici)
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */
+  function validate ($value,$options=array()) {
+    $regex = '/^[a-zA-Z]+$/';
+    return LSformRule_regex :: validate($value,$regex);
+  }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_maxlength.php b/trunk/includes/class/class.LSformRule_maxlength.php
new file mode 100644 (file)
index 0000000..ec52593
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation : longueur maximale de la valeur.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_maxlength extends LSformRule {
+
+       /**
+   * Vérification de la valeur.
+        *
+        * @param string $values Valeur à vérifier
+        * @param array $options Options de validation : 
+        *                                                                                                                      - Longueur max : $options['params']['limit']
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */
+  function validate ($value,$options) {
+               if(!isset($options['params']['limit'])) {
+                       $GLOBALS['LSerror'] -> addErrorCode(302);
+                       return;
+               }
+    return (strlen($value)<=$options['params']['limit']);
+  }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_minlength.php b/trunk/includes/class/class.LSformRule_minlength.php
new file mode 100644 (file)
index 0000000..a50be3c
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation : longueur minimale de la valeur.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_minlength extends LSformRule {
+
+       /**
+   * Vérification de la valeur.
+        *
+        * @param string $values Valeur à vérifier
+        * @param array $options Options de validation : 
+        *                                                                                                                      - Longueur min : $options['params']['limit']
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */ 
+       function validate ($value,$options) {
+               if(!isset($options['params']['limit'])) {
+                       $GLOBALS['LSerror'] -> addErrorCode(302);
+                       return;
+               }
+    return (strlen($value)>=$options['params']['limit']);
+  }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_nonzero.php b/trunk/includes/class/class.LSformRule_nonzero.php
new file mode 100644 (file)
index 0000000..fd9e5e0
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation d'une valeur non nulle.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_nonzero extends LSformRule {
+  
+       /**
+   * Vérification de la valeur.
+        *
+        * @param string $values Valeur à vérifier
+        * @param array $options Options de validation (inutile ici)
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */ 
+  function validate ($value,$options) {
+    $regex = '/^-?[1-9][0-9]*/';
+    return LSformRule_regex :: validate($value,$regex);
+  }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_nopunctuation.php b/trunk/includes/class/class.LSformRule_nopunctuation.php
new file mode 100644 (file)
index 0000000..3ab26d2
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation d'une chaine sans caractère de ponctuation.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_nopunctuation extends LSformRule {
+  
+       /**
+   * Vérification de la valeur.
+        *
+        * @param string $values Valeur à vérifier
+        * @param array $options Options de validation (inutile ici)
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */
+       function validate ($value,$options=array()) {
+    $regex = '/^[^().\/\*\^\?#!@$%+=,\"\'><~\[\]{}]+$/';
+    return LSformRule_regex :: validate($value,$regex);
+  }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_numeric.php b/trunk/includes/class/class.LSformRule_numeric.php
new file mode 100644 (file)
index 0000000..c55446e
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation d'une valeur numérique.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_numeric extends LSformRule{
+  
+       /**
+   * Vérification de la valeur.
+        *
+        * @param string $values Valeur à vérifier
+        * @param array $options Options de validation (inutile ici)
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */
+  function validate ($value,$options=array()) {
+    $regex = '/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/';
+    return LSformRule_regex :: validate($value,$regex);
+  }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_rangelength.php b/trunk/includes/class/class.LSformRule_rangelength.php
new file mode 100644 (file)
index 0000000..db71f53
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation : longueur maximale et minimale de la valeur.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_rangelength extends LSformRule {
+       /**
+   * Vérification de la valeur.
+        *
+        * @param string $values Valeur à vérifier
+        * @param array $options Options de validation : 
+        *                                                                                                                      - Longueur min : $options['params']['limits'][0]
+        *                                                                                                                      - Longueur max : $options['params']['limits'][1]
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */ 
+  function validate ($value,$options=array()) {
+               if(!isset($options['params']['limits'])) {
+                       $GLOBALS['LSerror'] -> addErrorCode(302);
+                       return;
+               }
+    $len=strlen($value);
+    return ($len >= $$options['params']['limits'][0] && $len <= $$options['params']['limits'][1]);
+  }
+  
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_regex.php b/trunk/includes/class/class.LSformRule_regex.php
new file mode 100644 (file)
index 0000000..e45aa49
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation d'expression régulière.
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_regex extends LSformRule {
+  
+       /**
+   * Vérification de la valeur.
+        *
+        * @param string $values Valeur à vérifier
+        * @param array $options Options de validation : 
+        *                                                                                                                      - Regex : $option['params']['regex'] ou $option
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */ 
+  function validate($value,$option) {
+               if (is_array($option)) {
+                       if (isset($option['params']['regex'])) {
+                               $regex=$option['params']['regex'];
+                       }
+                       else {
+                               $GLOBALS['LSerror'] -> addErrorCode(301);
+                               return;
+                       }
+               }
+               else {
+                       $regex=$option;
+               }
+                       debug("\n$value : $regex\n");
+    if (!preg_match($regex, $value)) {
+      return false;
+        }
+        return true;
+  }
+
+}
+
+?>
diff --git a/trunk/includes/class/class.LSformRule_required.php b/trunk/includes/class/class.LSformRule_required.php
new file mode 100644 (file)
index 0000000..61d5ab3
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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.
+
+******************************************************************************/
+
+/**
+ * Règle de validation de données requises
+ *
+ * @author Benjamin Renard <brenard@easter-eggs.com>
+ */
+class LSformRule_required extends LSformRule {
+
+       /**
+   * Vérification de la valeur.
+        *
+        * @param string $value  Value à vérifier
+        * @param array $options Options de validation (inutile ici)
+        *
+        * @return boolean true si la valeur est valide, false sinon
+        */ 
+  function validate ($value,$option=NULL) {
+    return ((string)$value != '');
+  }
+  
+}
+
+?>
index b547c52..d9f4b92 100644 (file)
@@ -64,6 +64,7 @@ class LSldap {
     $this -> cnx = Net_LDAP::connect($this -> config);
     if (Net_LDAP::isError($this -> cnx)) {
       $GLOBALS['LSerror'] -> addErrorCode(1,$this -> cnx -> getMessage());
+      $GLOBALS['LSerror'] -> stop();
       $this -> cnx = NULL;
       return;
     }
@@ -102,7 +103,7 @@ class LSldap {
    *               - ['attrs'] : tableau associatif contenant les attributs (clé)
    *                             et leur valeur (valeur).
    */
-  function search ($filter,$basedn=NULL,$params = array() ) {
+  function search ($filter,$basedn=NULL,$params = array()) {
     $ret = $this -> cnx -> search($basedn,$filter,$params);
     if (Net_LDAP::isError($ret)) {
       $GLOBALS['LSerror'] -> addErrorCode(2,$ret -> getMessage());
@@ -166,6 +167,69 @@ class LSldap {
     $return=$this -> search($infos[0],$basedn);
     return $return[0]['attrs'];
   }
+  
+  /**
+   * Retourne une entrée existante ou nouvelle
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @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_LDAP)
+   */
+  function getEntry($object_type,$dn) {
+    if(isset($GLOBALS['LSobjects'][$object_type])){
+      $obj_conf=$GLOBALS['LSobjects'][$object_type];
+      $entry = $this -> cnx -> getEntry($dn);
+      if (Net_Ldap::isError($entry)) {
+        $newentry = new Net_Ldap_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']));
+        }
+        return $newentry;
+      }
+      else {
+        return $entry;
+      }
+    }
+    else {
+      $GLOBALS['LSerror'] -> addErrorCode(3);
+      return;
+    }
+  }
+  
+  /**
+   * Met à jour une entrée dans l'annuaire
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @param[in] $object_type string Type de l'objet Ldap
+   * @param[in] $dn string DN de l'entré Ldap
+   * @param[in] $change array Tableau des modifications à apporter
+   *
+   * @retval boolean true si l'objet a bien été mis à jour, false sinon
+   */
+  function update($object_type,$dn,$change) {
+               debug($change);
+    if($entry=$this -> getEntry($object_type,$dn)) {
+      $entry -> replace($change);
+      $ret = $entry -> update();
+      if (Net_Ldap::isError($ret)) {
+        $GLOBALS['LSerror'] -> addErrorCode(5,$dn);
+      }
+      else {
+        return true;
+      }
+    }
+    else {
+      $GLOBALS['LSerror'] -> addErrorCode(4);
+      return;
+    }
+  }
+  
 }
 
-?>
\ No newline at end of file
+?>
index cf6c1e8..c3c53ad 100644 (file)
@@ -36,6 +36,7 @@ class LSldapObject {
   var $forms;
   var $dn=false;
   var $other_values=array();
+  var $submitError=true;
   
   /**
    * Constructeur
@@ -50,10 +51,10 @@ class LSldapObject {
    *
    * @retval boolean true si l'objet a été construit, false sinon.
    */  
-       function LSldapObject($type_name,$config='auto') {
-               $this -> type_name = $type_name;
-    $this -> config = $config;
-    if($config=='auto') {
+   function LSldapObject($type_name,$config='auto') {
+      $this -> type_name = $type_name;
+      $this -> config = $config;
+      if($config=='auto') {
       if(isset($GLOBALS['LSobjects'][$type_name]))
         $this -> config = $GLOBALS['LSobjects'][$type_name];
       else {
@@ -62,8 +63,9 @@ class LSldapObject {
       }
     }
                foreach($this -> config['attrs'] as $attr_name => $attr_config) {
-                       if(!$this -> attrs[$attr_name]=new LSattribute($attr_name,$attr_config))
+                       if(!$this -> attrs[$attr_name]=new LSattribute($attr_name,$attr_config,$this)) {
         return;
+      }
                }
     return true;
        }
@@ -91,6 +93,22 @@ class LSldapObject {
   }
   
   /**
+   * Recharge les données de l'objet
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @retval boolean true si la rechargement a réussi, false sinon.
+   */  
+  function reloadData() {
+    $data = $GLOBALS['LSldap'] -> getAttrs($this -> dn);
+    foreach($this -> attrs as $attr_name => $attr) {
+      if(!$this -> attrs[$attr_name] -> reloadData($data[$attr_name]))
+        return;
+    }
+    return true;
+  }
+  
+  /**
    * Retourne le format d'affichage de l'objet
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
@@ -138,37 +156,23 @@ class LSldapObject {
   }
   
   /**
-   * DEBUG : Affiche le nom et la valeur de chaque attribut
-   *
-   * @author Benjamin Renard <brenard@easter-eggs.com>
-   *
-   * @retval void
-   */  
-  function debug_printAttrsValues() {
-    foreach($this -> attrs as $attr_name => $attr) {
-      print $attr_name.' : ';
-      $attr -> debug_printValue();
-      print "\n";
-    }
-  }
-
-  /**
    * Construit un formulaire de l'objet
    * 
    * Cette méthode construit un formulaire LSform à partir de la configuration de l'objet
    * et de chaque attribut.
    *
    * @param[in] $idForm [<b>required</b>] Identifiant du formulaire a créer
+   * @param[in] $config Configuration spécifique pour le formulaire
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
    *
    * @retval LSform Le formulaire crée
    */  
   function getForm($idForm,$config=array()) {
-    $LSform = new LSform($idForm);
+    $LSform = new LSform($this,$idForm);
     $this -> forms[$idForm] = array($LSform,$config);
     foreach($this -> attrs as $attr_name => $attr) {
-      if(!$this -> attrs[$attr_name] -> addToForm($LSform -> quickform,$idForm)) {
+      if(!$this -> attrs[$attr_name] -> addToForm($LSform,$idForm,$this)) {
         $LSform -> can_validate = false;
       }
     }
@@ -176,6 +180,27 @@ class LSldapObject {
   }
   
   /**
+   * Rafraichis le formulaire de l'objet
+   * 
+   * Cette méthode recharge les données d'un formulaire LSform.
+   *
+   * @param[in] $idForm [<b>required</b>] Identifiant du formulaire a créer
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @retval boolean true sile formulaire a été rafraichis, false sinon
+   */  
+  function refreshForm($idForm) {
+    $LSform = $this -> forms[$idForm][0];
+    foreach($this -> attrs as $attr_name => $attr) {
+      if(!$this -> attrs[$attr_name] -> refreshForm($LSform,$idForm)) {
+        return;
+      }
+    }
+    return true;
+  }
+  
+  /**
    * Met à jour les données de l'objet et de l'entré de l'annuaire
    * 
    * Met à jour les données de l'objet à partir d'un retour d'un formulaire.
@@ -211,13 +236,14 @@ class LSldapObject {
         $GLOBALS['LSerror'] -> stop();
       }
     }
-    $new_data = $LSform -> quickform -> exportValues();
+    $new_data = $LSform -> exportValues();
     foreach($new_data as $attr_name => $attr_val) {
       if(isset($this -> attrs[$attr_name])) {
         $this -> attrs[$attr_name] -> setUpdateData($attr_val);
       }
     }
     if($this -> validateAttrsData($idForm)) {
+                       debug("les données sont validées");
       if(isset($this -> config['before_save'])) {
         if(function_exists($this -> config['before_save'])) {
           if(!$this -> config['before_save']($this)) {
@@ -230,8 +256,13 @@ class LSldapObject {
           $GLOBALS['LSerror'] -> stop();
         }
       }
-      $this -> submitChange($idForm);
-      if(isset($this -> config['after_save'])) {
+      if ($this -> submitChange($idForm)) {
+                               debug('Les modifications sont submitées');
+        $this -> submitError = false;
+        $this -> reloadData();
+        $this -> refreshForm($idForm);
+      }
+      if((isset($this -> config['after_save']))&&(!$this -> submitError)) {
         if(function_exists($this -> config['after_save'])) {
           if(!$this -> config['after_save']($this)) {
             $GLOBALS['LSerror'] -> addErrorCode(30,$this -> config['after_save']);
@@ -256,76 +287,145 @@ class LSldapObject {
   function validateAttrsData($idForm) {
     $LSform=$this -> forms[$idForm][0];
     foreach($this -> attrs as $attr) {
-      if(($attr -> isUpdate())&&(!$attr -> isValidate())) {
-        //~ echo 'NAME : '.$attr -> name.' Val : '.$attr -> getUpdateData();
-        $vconfig=$attr -> getValidateConfig();
-        if(is_array($vconfig)) {
-          foreach($vconfig as $test) {
-            $data=$attr -> getUpdateData();
-            if(!is_array($data))
-              $data=array($data);
-            foreach($data as $val) {
-              // validation par check LDAP
-              if((isset($test['filter'])||isset($test['basedn']))&&(isset($test['result']))) {
-                $sparams=(isset($test['scope']))?array('scope' => $test['scope']):array();
-                $this -> other_values['val']=$val;
-                $sfilter_user=(isset($test['basedn']))?getFData($test['filter'],$this,'getValue'):NULL;
-                //~ echo $sfilter_user;
-                if(isset($test['object_type'])) {
-                  $test_obj = new $test['object_type']('auto');
-                  $sfilter=$test_obj->getObjectFilter();
-                  $sfilter='(&'.$sfilter;
-                  if($sfilter_user[0]=='(')
-                    $sfilter=$sfilter.$sfilter_user.')';
-                  else
-                    $sfilter=$sfilter.'('.$sfilter_user.'))';
-                }
-                else {
-                  $sfilter=$sfilter_user;
-                }
-                $sbasedn=(isset($test['basedn']))?getFData($test['basedn'],$this,'getValue'):NULL;
-                $ret=$GLOBALS['LSldap'] -> getNumberResult ($sfilter,$sbasedn,$sparams);
-                //~ echo 'Basedn : "'.$sbasedn.'" Filter : "'.$sfilter.'" NAME : '.$attr -> name.' Nb : '.$ret."<br />\n";
-                if($test['result']==0) {
-                  if($ret!=0) {
-                    $LSform -> setElementError($attr,$test['msg']);
-                    return;
-                  }
-                }
-                else {
-                  if($ret<=0) {
-                    $LSform -> setElementError($attr,$msg_error);
-                    return;
-                  }
-                }
-              }
-              // Validation par fonction externe
-              else if(isset($test['function'])) {
-                if (function_exists($test['function'])) {
-                  if(!$test['function']($this)) {
-                    $LSform -> setElementError($attr,$msg_error);
-                    return;
-                  }
-                }
-                else {
-                  $GLOBALS['LSerror'] -> addErrorCode(24,array('attr' => $attr->name,'obj' => $this->type_name,'func' => $test['function']));
-                  return;
-                }
-              }
-              else {
-                $GLOBALS['LSerror'] -> addErrorCode(25,array('attr' => $attr->name,'obj' => $this->type_name));
-                return;
-              }
-            }
-          }
-        }
-        $attr -> validate();
-      }
-    }
-    unset($this -> other_values['val']);
+                       if (!$attr -> isValidate()) {
+                               if($attr -> isUpdate()) {
+                                       if (!$this -> validateAttrData($LSform, $attr)) {
+                                               return;
+                                       }
+                               }
+                               else if( ($attr -> getValue() == '') && ($attr -> isRequired()) ) {     
+                                       if ( $attr -> canBeGenerated()) {
+                                               if ($attr -> generateValue()) {
+                                                       if (!$this -> validateAttrData($LSform, $attr)) {
+                                                               $GLOBALS['LSerror'] -> addErrorCode(48,$attr -> getLabel());
+                                                               return;
+                                                       }
+                                               }
+                                               else {
+                                                       $GLOBALS['LSerror'] -> addErrorCode(47,$attr -> getLabel());
+                                                       return;
+                                               }
+                                       }
+                                       else {
+                                               $GLOBALS['LSerror'] -> addErrorCode(46,$attr -> getLabel());
+                                               return;
+                                       }
+
+                               }
+       }
+               }
     return true;
   }
-  
+
+   /**
+   * Valide les données d'un attribut
+   *
+   * @param[in] $LSForm Formulaire d'origine
+   * @param[in] &$attr Attribut à valider
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @retval boolean true si les données sont valides, false sinon
+   */
+       function validateAttrData(&$LSform,&$attr) {
+               $vconfig=$attr -> getValidateConfig();
+
+               $data=$attr -> getUpdateData();
+               if(!is_array($data)) {
+                       $data=array($data);
+               }
+
+               // Validation des valeurs de l'attribut
+    if(is_array($vconfig)) {
+                       foreach($vconfig as $test) {
+                               // Définition du message d'erreur
+                               if (!empty($test['msg'])) {
+                                       $msg_error=getFData($test['msg'],$this,'getValue');
+                               }
+                               else {
+                                       $msg_error=getFData(_("L'attribut %{attr} n'est pas valide."),$attr -> getLabel());
+                               }
+                               foreach($data as $val) {
+                                       // validation par check LDAP
+                                       if((isset($test['filter'])||isset($test['basedn']))&&(isset($test['result']))) {
+                                               $sparams=(isset($test['scope']))?array('scope' => $test['scope']):array();
+                                               $this -> other_values['val']=$val;
+                                               $sfilter_user=(isset($test['basedn']))?getFData($test['filter'],$this,'getValue'):NULL;
+                                               if(isset($test['object_type'])) {
+                                                       $test_obj = new $test['object_type']('auto');
+                                                       $sfilter=$test_obj->getObjectFilter();
+                                                       $sfilter='(&'.$sfilter;
+                                                       if($sfilter_user[0]=='(') {
+                                                               $sfilter=$sfilter.$sfilter_user.')';
+                                                       }
+                                                       else {
+                                                               $sfilter=$sfilter.'('.$sfilter_user.'))';
+                                                       }
+                                               }
+                                               else {
+                                                       $sfilter=$sfilter_user;
+                                               }
+                                               $sbasedn=(isset($test['basedn']))?getFData($test['basedn'],$this,'getValue'):NULL;
+                                               $ret=$GLOBALS['LSldap'] -> getNumberResult ($sfilter,$sbasedn,$sparams);
+                                               if($test['result']==0) {
+                                                       if($ret!=0) {
+                                                               $LSform -> setElementError($attr,$msg_error);
+                                                               return;
+                                                       }
+                                               }
+                                               else {
+                                                       if($ret<=0) {
+                                                               $LSform -> setElementError($attr,$msg_error);
+                                                               return;
+                                                       }
+                                               }
+                                       }
+                                       // Validation par fonction externe
+                                       else if(isset($test['function'])) {
+                                               if (function_exists($test['function'])) {
+                                                       if(!$test['function']($this)) {
+                                                               $LSform -> setElementError($attr,$msg_error);
+                                                       return;
+                                                       }
+                                               }
+                                               else {
+                                                       $GLOBALS['LSerror'] -> addErrorCode(24,array('attr' => $attr->name,'obj' => $this->type_name,'func' => $test['function']));
+                                                       return;
+                                               }
+                                       }
+                                       else {
+                                               $GLOBALS['LSerror'] -> addErrorCode(25,array('attr' => $attr->name,'obj' => $this->type_name));
+                                               return;
+                                       }
+                               }
+                       }
+               }
+               // Génération des valeurs des attributs dépendants
+               $dependsAttrs=$attr->getDependsAttrs();
+               if (!empty($dependsAttrs)) {
+                       foreach($dependsAttrs as $dependAttr) {
+                               if(!isset($this -> attrs[$dependAttr])){
+                                       $GLOBALS['LSerror'] -> addErrorCode(34,array('attr_depend' => $dependAttr, 'attr' => $attr -> getLabel()));
+                                       continue;
+                               }
+                               if($this -> attrs[$dependAttr] -> canBeGenerated()) {
+                                       if (!$this -> attrs[$dependAttr] -> generateValue()) {
+                                               $GLOBALS['LSerror'] -> addErrorCode(47,$this -> attrs[$dependAttr] -> getLabel());
+                                               return;
+                                       }
+                               }
+                               else {
+                                       $GLOBALS['LSerror'] -> addErrorCode(46,$this -> attrs[$dependAttr] -> getLabel());
+                                       return;
+                               }
+                       }
+               }
+
+               $attr -> validate();
+    unset($this -> other_values['val']);
+               return true;
+       }
+
   /**
    * Met à jour les données modifiés dans l'annuaire
    *
@@ -336,13 +436,22 @@ class LSldapObject {
    * @retval boolean true si la mise à jour a réussi, false sinon
    */  
   function submitChange($idForm) {
-    $submit_data=array();
+    $submitData=array();
     foreach($this -> attrs as $attr) {
       if(($attr -> isUpdate())&&($attr -> isValidate())) {
-        $submit_data[$attr -> name] = $attr -> getUpdateData();
+        $submitData[$attr -> name] = $attr -> getUpdateData();
+      }
+    }
+    if(!empty($submitData)) {
+      $dn=$this -> getDn();
+      if($dn) {
+        return $GLOBALS['LSldap'] -> update($this -> type_name,$dn, $submitData);
+      }
+      else {
+        $GLOBALS['LSerror'] -> addErrorCode(33);
+                               return;
       }
     }
-    print_r($submit_data);
   }
   
   /**
@@ -555,22 +664,15 @@ class LSldapObject {
           }
         
           // Vérification de la compatibilité du basedn de la recherche et du basedn générale
-          //~ if ($this -> isCompatibleDNs($filter[$i]['basedn'],$basedn)) {
-            //~ $sbasedn=$this -> sumDn($filter[$i]['basedn'],$basedn);
-          //~ }
           // Finalisation du filtre
           $sfilter_for.=$sfilter_end;
         
-          //~ print 'filter1 : '.$sfilter_for." | basedn : ".$sbasedn."\n";
         
           // Execution de la recherche
           $ret=$GLOBALS['LSldap'] -> search ($sfilter_for,$sbasedn,$sparams);
           
-          //~ print('Nb resultat : '.count($ret));
-          
           // Si il y un retour
           if(isset($ret[0])) {
-            //~ print_r($ret);
             // si il ya une suite (recherche intermédiaire)
             if($filter[$i]['attr']){
               for($iii=0;$iii<count($ret);$iii++) {
@@ -628,14 +730,9 @@ class LSldapObject {
         // fermeture du filtre
         $sfilter.=$sfilter_end;
         
-        //~ print 'filter2 : '.$sfilter."\n";
-        //~ print_r($sparams);
-        
         // Lancement de la recherche
         $ret=$GLOBALS['LSldap'] -> search ($sfilter,$sbasedn,$sparams);
         
-        //~ print('Nb resultat : '.count($ret));
-        
         //Si filtre multiple => on recupère une liste d'attributs
         if(isset($filter[$i]['attr'])) {
           for($ii=0;$ii<count($ret);$ii++) {
@@ -670,18 +767,15 @@ class LSldapObject {
           break;
         }
       }
-      //~ print_r($attrs);
     }
     
     // Création d'un tableau d'objet correspondant au valeur retourné
     for($i=0;$i<count($ret);$i++) {
       $retInfos[$i] = new $this -> type_name($this -> config);
       $retInfos[$i] -> loadData($ret[$i]);
-      //~ echo $ret[$i]['dn']."\n";
     }
     
     return $retInfos;
-    
   }
   
   /**
@@ -697,7 +791,7 @@ class LSldapObject {
    *
    * @author Benjamin Renard <brenard@easter-eggs.com>
    *
-   * @param[in] $val string nom de la valeur demandée
+   * @param[in] $val string Le nom de la valeur demandée
    *
    * @retval mixed la valeur demandé ou ' ' si celle-ci est inconnue.
    */  
@@ -719,6 +813,40 @@ class LSldapObject {
     }
   }
   
+  /**
+   * Retourne le DN de l'objet
+   *
+   * Cette methode retourne le DN de l'objet. Si celui-ci n'existe pas, il le construit à partir de la 
+   * configuration de l'objet et la valeur de son attribut rdn.
+   *
+   * @author Benjamin Renard <brenard@easter-eggs.com>
+   *
+   * @retval string Le DN de l'objet
+   */    
+  function getDn() {
+    if($this -> dn) {
+      return $this -> dn;
+    }
+    else {
+      $rdn_attr=$this -> config['rdn'];
+      if( (isset($this -> config['rdn'])) && (isset($this -> attrs[$rdn_attr])) && (isset($this -> config['container_dn'])) && (isset($GLOBALS['LSsession']['topDn'])) ) {
+                               debug('RDN : '.$rdn_attr);
+        $rdn_val=$this -> attrs[$rdn_attr] -> getUpdateData();
+        if (!empty($rdn_val)) {
+          return $rdn_attr.'='.$rdn_val[0].','.$this -> config['container_dn'].','.$GLOBALS['LSsession']['topDn'];
+        }
+        else {
+          $GLOBALS['LSerror'] -> addErrorCode(32,$this -> config['rdn']);
+          return;
+        }
+      }
+      else {
+        $GLOBALS['LSerror'] -> addErrorCode(31,$this -> type_name);
+        return;
+      }
+    }
+  }
+  
 }
 
-?>
\ No newline at end of file
+?>
index 087ffca..1ebf3ed 100644 (file)
  * @retval string La chaine formatée
  */
 function getFData($format,$data,$meth=NULL) {
-  if(is_array($data)) {
-    if ($meth==NULL) {
-      while (ereg("%{([A-Za-z0-9]+)}",$format,$ch)) {
-        $format=ereg_replace($ch[0],$data[$ch[1]],$format);
-      }
-    }
-    else {
-      while (ereg("%{([A-Za-z0-9]+)}",$format,$ch)) {
-        if (method_exists($data[$ch[1]],$meth)) {
-          $format=ereg_replace($ch[0],$data[$ch[1]] -> $meth(),$format);
+  $unique=false;
+  if(!is_array($format)) {
+    $format=array($format);
+    $unique=true;
+  }
+  for($i=0;$i<count($format);$i++) {
+    if(is_array($data)) {
+      if ($meth==NULL) {
+        while (ereg("%{([A-Za-z0-9]+)}",$format[$i],$ch)) {
+          $format[$i]=ereg_replace($ch[0],$data[$ch[1]],$format[$i]);
         }
-        else {
-          $GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => $ch[1]));
-          break;
+      }
+      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]);
+          }
+          else {
+            $GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => $ch[1]));
+            break;
+          }
         }
       }
     }
-  }
-  else {
-    if ($meth==NULL) {
-      while (ereg("%{([A-Za-z0-9]+)}",$format,$ch))
-        $format=ereg_replace($ch[0],$data,$format);
-    }
     else {
-      while (ereg("%{([A-Za-z0-9]+)}",$format,$ch)) {
-        if (method_exists($data,$meth)) {
-          $format=ereg_replace($ch[0],$data -> $meth($ch[1]),$format);
-        }
-        else {
-          $GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => get_class($data)));
-          break;
+      if ($meth==NULL) {
+        while (ereg("%{([A-Za-z0-9]+)}",$format[$i],$ch))
+          $format[$i]=ereg_replace($ch[0],$data,$format[$i]);
+      }
+      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]);
+          }
+          else {
+            $GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => get_class($data)));
+            break;
+          }
         }
       }
     }
   }
+  if($unique) {
+    return $format[0];
+  }
   return $format;
 }
 
@@ -85,4 +95,22 @@ function return_data($data) {
   return $data;
 }
 
-?>
\ No newline at end of file
+function debug($data,$get=true) {
+       if ($get) {
+               if (is_array($data)) {
+                       $GLOBALS['LSdebug'][]=$data;
+               }
+               else {
+                       $GLOBALS['LSdebug'][]="[$data]";
+               }
+       }
+       return true;
+}
+
+function debug_print() {
+       echo "<fieldset><legend>Debug</legend><pre>";
+       print_r( $GLOBALS['LSdebug']);
+       echo "</pre></fieldset>";
+}
+
+?>
diff --git a/trunk/includes/libs/class.smbHash.php b/trunk/includes/libs/class.smbHash.php
new file mode 100644 (file)
index 0000000..154b5eb
--- /dev/null
@@ -0,0 +1,541 @@
+<?php
+/*
+
+  This code is part of LDAP Account Manager (http://www.sourceforge.net/projects/lam)
+  Copyright (C) 2004 Roland Gruber
+
+  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
+
+*/
+
+/**
+* This class provides functions to calculate Samba NT and LM hashes.
+*
+* The code is a conversion from createntlm.pl (Benjamin Kuit) and smbdes.c/md4.c (Andrew Tridgell).
+*
+* @author Roland Gruber
+*
+* @package modules
+*/
+
+/**
+* Calculates NT and LM hashes.
+*
+* The important functions are lmhash($password) and nthash($password).
+*
+* @package modules
+*/
+class smbHash {
+
+# Contants used in lanlam hash calculations
+# Ported from SAMBA/source/libsmb/smbdes.c:perm1[56]
+var $perm1 = array(57, 49, 41, 33, 25, 17,  9,
+       1, 58, 50, 42, 34, 26, 18,
+       10,  2, 59, 51, 43, 35, 27,
+       19, 11,  3, 60, 52, 44, 36,
+       63, 55, 47, 39, 31, 23, 15,
+       7, 62, 54, 46, 38, 30, 22,
+       14,  6, 61, 53, 45, 37, 29,
+       21, 13,  5, 28, 20, 12,  4);
+# Ported from SAMBA/source/libsmb/smbdes.c:perm2[48]
+var $perm2 = array(14, 17, 11, 24,  1,  5,
+       3, 28, 15,  6, 21, 10,
+       23, 19, 12,  4, 26,  8,
+       16,  7, 27, 20, 13,  2,
+       41, 52, 31, 37, 47, 55,
+       30, 40, 51, 45, 33, 48,
+       44, 49, 39, 56, 34, 53,
+       46, 42, 50, 36, 29, 32);
+# Ported from SAMBA/source/libsmb/smbdes.c:perm3[64]
+var $perm3 = array(58, 50, 42, 34, 26, 18, 10,  2,
+       60, 52, 44, 36, 28, 20, 12,  4,
+       62, 54, 46, 38, 30, 22, 14,  6,
+       64, 56, 48, 40, 32, 24, 16,  8,
+       57, 49, 41, 33, 25, 17,  9,  1,
+       59, 51, 43, 35, 27, 19, 11,  3,
+       61, 53, 45, 37, 29, 21, 13,  5,
+       63, 55, 47, 39, 31, 23, 15,  7);
+# Ported from SAMBA/source/libsmb/smbdes.c:perm4[48]
+var $perm4 = array(32,  1,  2,  3,  4,  5,
+       4,  5,  6,  7,  8,  9,
+       8,  9, 10, 11, 12, 13,
+       12, 13, 14, 15, 16, 17,
+       16, 17, 18, 19, 20, 21,
+       20, 21, 22, 23, 24, 25,
+       24, 25, 26, 27, 28, 29,
+       28, 29, 30, 31, 32,  1);
+# Ported from SAMBA/source/libsmb/smbdes.c:perm5[32]
+var $perm5 = array(16,  7, 20, 21,
+       29, 12, 28, 17,
+       1, 15, 23, 26,
+       5, 18, 31, 10,
+       2,  8, 24, 14,
+       32, 27,  3,  9,
+       19, 13, 30,  6,
+       22, 11,  4, 25);
+# Ported from SAMBA/source/libsmb/smbdes.c:perm6[64]
+var $perm6 = array(40,  8, 48, 16, 56, 24, 64, 32,
+       39,  7, 47, 15, 55, 23, 63, 31,
+       38,  6, 46, 14, 54, 22, 62, 30,
+       37,  5, 45, 13, 53, 21, 61, 29,
+       36,  4, 44, 12, 52, 20, 60, 28,
+       35,  3, 43, 11, 51, 19, 59, 27,
+       34,  2, 42, 10, 50, 18, 58, 26,
+       33,  1, 41,  9, 49, 17, 57, 25);
+# Ported from SAMBA/source/libsmb/smbdes.c:sc[16]
+var $sc = array(1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1);
+# Ported from SAMBA/source/libsmb/smbdes.c:sbox[8][4][16]
+# Side note, I used cut and paste for all these numbers, I did NOT
+# type them all in =)
+var $sbox = array(array(array(14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7),
+               array( 0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8),
+               array( 4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0),
+               array(15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13)),
+       array(array(15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10),
+               array( 3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5),
+               array( 0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15),
+               array(13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9)),
+       array(array(10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8),
+               array(13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1),
+               array(13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7),
+               array( 1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12)),
+       array(array( 7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15),
+               array(13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9),
+               array(10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4),
+               array( 3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14)),
+       array(array( 2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9),
+               array(14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6),
+               array( 4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14),
+               array(11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3)),
+       array(array(12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11),
+               array(10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8),
+               array( 9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6),
+               array( 4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13)),
+       array(array( 4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1),
+               array(13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6),
+               array( 1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2),
+               array( 6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12)),
+       array(array(13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7),
+               array( 1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2),
+               array( 7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8),
+               array( 2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11)));
+
+       /**
+       * Fixes too large numbers
+       */
+       function x($i) {
+               if ($i < 0) return 4294967296 - $i;
+               else return $i;
+       }
+
+       /**
+       * @param integer count
+       * @param array $data
+       * @return array
+       */
+       function lshift($count, $data) {
+               $ret = array();
+               for ($i = 0; $i < sizeof($data); $i++) {
+                       $ret[$i] = $data[($i + $count)%sizeof($data)];
+               }
+               return $ret;
+       }
+
+       /**
+       * @param array in input data
+       * @param array p permutation
+       * @return array
+       */
+       function permute($in, $p, $n) {
+               $ret = array();
+               for ($i = 0; $i < $n; $i++) {
+                       $ret[$i] = $in[$p[$i] - 1]?1:0;
+               }
+               return $ret;
+       }
+
+       /**
+       * @param array $in1
+       * @param array $in2
+       * @return array
+       */
+       function mxor($in1, $in2) {
+               $ret = array();
+               for ($i = 0; $i < sizeof($in1); $i++) {
+                       $ret[$i] = $in1[$i] ^ $in2[$i];
+               }
+               return $ret;
+       }
+
+       /**
+       * @param array $in
+       * @param array $key
+       * @param boolean $forw
+       * @return array
+       */
+       function doHash($in, $key, $forw) {
+               $ki = array();
+       
+               $pk1 = $this->permute($key, $this->perm1, 56);
+               
+               $c = array();
+               $d = array();
+               for ($i = 0; $i < 28; $i++) {
+                       $c[$i] = $pk1[$i];
+                       $d[$i] = $pk1[28 + $i];
+               }
+               
+               for ($i = 0; $i < 16; $i++) {
+                       $c = $this->lshift($this->sc[$i], $c);
+                       $d = $this->lshift($this->sc[$i], $d);
+                       
+                       $cd = $c;
+                       for ($k = 0; $k < sizeof($d); $k++) $cd[] = $d[$k];
+                       $ki[$i] = $this->permute($cd, $this->perm2, 48);
+               }
+               
+               $pd1 = $this->permute($in, $this->perm3, 64);
+               
+               $l = array();
+               $r = array();
+               for ($i = 0; $i < 32; $i++) {
+                       $l[$i] = $pd1[$i];
+                       $r[$i] = $pd1[32 + $i];
+               }
+               
+               for ($i = 0; $i < 16; $i++) {
+                       $er = $this->permute($r, $this->perm4, 48);
+                       if ($forw) $erk = $this->mxor($er, $ki[$i]);
+                       else $erk = $this->mxor($er, $ki[15 - $i]);
+                       
+                       for ($j = 0; $j < 8; $j++) {
+                               for ($k = 0; $k < 6; $k++) {
+                                       $b[$j][$k] = $erk[($j * 6) + $k];
+                               }
+                       }
+                       for ($j = 0; $j < 8; $j++) {
+                               $m = array();
+                               $n = array();
+                               $m = ($b[$j][0] << 1) | $b[$j][5];
+                               $n = ($b[$j][1] << 3) | ($b[$j][2] << 2) | ($b[$j][3] << 1) | $b[$j][4];
+                               
+                               for ($k = 0; $k < 4; $k++) {
+                                       $b[$j][$k]=($this->sbox[$j][$m][$n] & (1 << (3-$k)))?1:0;
+                               }
+                       }
+                       
+                       for ($j = 0; $j < 8; $j++) {
+                               for ($k = 0; $k < 4; $k++) {
+                                       $cb[($j * 4) + $k] = $b[$j][$k];
+                               }
+                       }
+                       $pcb = $this->permute($cb, $this->perm5, 32);
+                       $r2 = $this->mxor($l, $pcb);
+                       for ($k = 0; $k < 32; $k++) $l[$k] = $r[$k];
+                       for ($k = 0; $k < 32; $k++) $r[$k] = $r2[$k];
+               }
+               $rl = $r;
+               for ($i = 0; $i < sizeof($l); $i++) $rl[] = $l[$i];
+               return $this->permute($rl, $this->perm6, 64);
+       }
+
+       function str_to_key($str) {
+               $key[0] = $this->unsigned_shift_r($str[0], 1);
+               $key[1] = (($str[0]&0x01)<<6) | $this->unsigned_shift_r($str[1], 2);
+               $key[2] = (($str[1]&0x03)<<5) | $this->unsigned_shift_r($str[2], 3);
+               $key[3] = (($str[2]&0x07)<<4) | $this->unsigned_shift_r($str[3], 4);
+               $key[4] = (($str[3]&0x0F)<<3) | $this->unsigned_shift_r($str[4], 5);
+               $key[5] = (($str[4]&0x1F)<<2) | $this->unsigned_shift_r($str[5], 6);
+               $key[6] = (($str[5]&0x3F)<<1) | $this->unsigned_shift_r($str[6], 7);
+               $key[7] = $str[6]&0x7F;
+               for ($i = 0; $i < 8; $i++) {
+                       $key[$i] = ($key[$i] << 1);
+               }
+               return $key;
+       }
+
+       function smb_hash($in, $key, $forw){
+               $key2 = $this->str_to_key($key);
+       
+               for ($i = 0; $i < 64; $i++) {
+                       $inb[$i] = ($in[$i/8] & (1<<(7-($i%8)))) ? 1:0;
+                       $keyb[$i] = ($key2[$i/8] & (1<<(7-($i%8)))) ? 1:0;
+                       $outb[$i] = 0;
+               }
+               $outb = $this->dohash($inb, $keyb, $forw);
+               for ($i = 0; $i < 8; $i++) {
+                       $out[$i] = 0;
+               }
+               for ($i = 0; $i < 65; $i++) {
+                       if ( isset($outb[$i]) && $outb[$i] )  {
+                               $out[$i/8] |= (1<<(7-($i%8)));
+                       }
+               }
+               return $out;
+       }
+
+       function E_P16($in) {
+               $p14 = array_values(unpack("C*",$in));
+               $sp8 = array(0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25);
+               $p14_1 = array();
+               $p14_2 = array();
+               for ($i = 0; $i < 7; $i++) {
+                       $p14_1[$i] = $p14[$i];
+                       $p14_2[$i] = $p14[$i + 7];
+               }
+               $p16_1 = $this->smb_hash($sp8, $p14_1, true);
+               $p16_2 = $this->smb_hash($sp8, $p14_2, true);
+               $p16 = $p16_1;
+               for ($i = 0; $i < sizeof($p16_2); $i++) {
+                       $p16[] = $p16_2[$i];
+               }
+               return $p16;
+       }
+
+       /**
+       * Calculates the LM hash of a given password.
+       *
+       * @param string $password password
+       * @return string hash value
+       */
+       function lmhash($password = "") {
+               $password = strtoupper($password);
+               $password = substr($password,0,14);
+               $password = str_pad($password, 14, chr(0));
+               $p16 = $this->E_P16($password);
+               for ($i = 0; $i < sizeof($p16); $i++) {
+                       $p16[$i] = sprintf("%02X", $p16[$i]);
+               }
+               return join("", $p16);
+       }
+
+       /**
+       * Calculates the NT hash of a given password.
+       *
+       * @param string $password password
+       * @return string hash value
+       */
+       function nthash($password = "") {
+               $password = substr($password,0,128);
+               $password2 = "";
+               for ($i = 0; $i < strlen($password); $i++) $password2 .= $password[$i] . chr(0);
+               $password = $password2;
+               $hex = $this->mdfour($password);
+               for ($i = 0; $i < sizeof($hex); $i++) {
+                       $hex[$i] = sprintf("%02X", $hex[$i]);
+               }
+               return join("", $hex);
+       }
+
+       # Support functions
+       # Ported from SAMBA/source/lib/md4.c:F,G and H respectfully
+       function F($X, $Y, $Z) {
+               $ret = (($X&$Y) | ((~((int)$X))&$Z));
+               if ($this->x($ret) > 4294967296) {
+                       $ret = (2*4294967296) - $this->x($ret);
+               }
+               return $ret;
+       }
+
+       function G($X, $Y, $Z) {
+               return ($X&$Y) | ($X&$Z) | ($Y&$Z);
+       }
+       
+       function H($X, $Y, $Z) {
+               return $X^$Y^$Z;
+       }
+
+       # Ported from SAMBA/source/lib/md4.c:mdfour
+       function mdfour($in) {
+               $in = unpack("C*",$in);
+               $in = array_values($in);
+               $b = sizeof($in) * 8;
+               $A = array(0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476);
+               while (sizeof($in) > 64 ) {
+                       $M = $this->copy64($in);
+                       $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M);
+                       $new_in = array();
+                       for ($i = 64; $i < sizeof($in); $i++) $new_in[] = $in[$i];
+                       $in = $new_in;
+               }
+               $buf = $in;
+               $buf[] = 0x80;
+               for ($i = sizeof($buf) - 1; $i < 127; $i++) $buf[] = 0;
+               if ( sizeof($in) <= 55 ) {
+                       $temp = $this->copy4($b);
+                       $buf[56] = $temp[0];
+                       $buf[57] = $temp[1];
+                       $buf[58] = $temp[2];
+                       $buf[59] = $temp[3];
+                       $M = $this->copy64($buf);
+                       $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M);
+               }
+               else {
+                       $temp = $this->copy4($b);
+                       $buf[120] = $temp[0];
+                       $buf[121] = $temp[1];
+                       $buf[122] = $temp[2];
+                       $buf[123] = $temp[3];
+                       $M = $this->copy64($buf);
+                       $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M);
+                       $temp = array();
+                       for ($i = 64; $i < sizeof($buf); $i++) $temp[] = $buf[$i];
+                       $M = $this->copy64($temp);
+                       $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M);
+               }
+               $out = array();
+               $temp = $this->copy4($A[0]);
+               for ($i = 0; $i < 4; $i++) $out[] = $temp[$i];
+               $temp = $this->copy4($A[1]);
+               for ($i = 0; $i < 4; $i++) $out[] = $temp[$i];
+               $temp = $this->copy4($A[2]);
+               for ($i = 0; $i < 4; $i++) $out[] = $temp[$i];
+               $temp = $this->copy4($A[3]);
+               for ($i = 0; $i < 4; $i++) $out[] = $temp[$i];
+               return $out;
+       }
+
+       # Ported from SAMBA/source/lib/md4.c:copy4
+       function copy4($x) {
+               $out = array();
+               $out[0] = $x&0xFF;
+               $out[1] = $this->unsigned_shift_r($x, 8)&0xFF;
+               $out[2] = $this->unsigned_shift_r($x, 16)&0xFF;
+               $out[3] = $this->unsigned_shift_r($x, 24)&0xFF;
+               return $out;
+       }
+
+       # Ported from SAMBA/source/lib/md4.c:copy64
+       function copy64($in) {
+               for ($i = 0; $i < 16; $i++) {
+                       $M[$i] = ($in[$i*4+3]<<24) | ($in[$i*4+2]<<16) | ($in[$i*4+1]<<8) | ($in[$i*4+0]<<0);
+               }
+               return $M;
+       }
+
+       # Ported from SAMBA/source/lib/md4.c:mdfour64
+       function mdfour64(&$A, &$B, &$C, &$D, $M) {
+               $X = array();
+               for ($i = 0; $i < 16; $i++) $X[] = $M[$i];
+               $AA=$A;
+               $BB=$B;
+               $CC=$C;
+               $DD=$D;
+               $this->ROUND1($A,$B,$C,$D,  0,  3, $X);
+               $this->ROUND1($D,$A,$B,$C,  1,  7, $X);
+               $this->ROUND1($C,$D,$A,$B,  2, 11, $X);
+               $this->ROUND1($B,$C,$D,$A,  3, 19, $X);
+               $this->ROUND1($A,$B,$C,$D,  4,  3, $X);  $this->ROUND1($D,$A,$B,$C,  5,  7, $X);
+               $this->ROUND1($C,$D,$A,$B,  6, 11, $X);  $this->ROUND1($B,$C,$D,$A,  7, 19, $X);
+               $this->ROUND1($A,$B,$C,$D,  8,  3, $X);  $this->ROUND1($D,$A,$B,$C,  9,  7, $X);
+               $this->ROUND1($C,$D,$A,$B, 10, 11, $X);  $this->ROUND1($B,$C,$D,$A, 11, 19, $X);
+               $this->ROUND1($A,$B,$C,$D, 12,  3, $X);  $this->ROUND1($D,$A,$B,$C, 13,  7, $X);
+               $this->ROUND1($C,$D,$A,$B, 14, 11, $X);  $this->ROUND1($B,$C,$D,$A, 15, 19, $X);
+               $this->ROUND2($A,$B,$C,$D,  0,  3, $X);  $this->ROUND2($D,$A,$B,$C,  4,  5, $X);
+               $this->ROUND2($C,$D,$A,$B,  8,  9, $X);  $this->ROUND2($B,$C,$D,$A, 12, 13, $X);
+               $this->ROUND2($A,$B,$C,$D,  1,  3, $X);  $this->ROUND2($D,$A,$B,$C,  5,  5, $X);
+               $this->ROUND2($C,$D,$A,$B,  9,  9, $X);  $this->ROUND2($B,$C,$D,$A, 13, 13, $X);
+               $this->ROUND2($A,$B,$C,$D,  2,  3, $X);  $this->ROUND2($D,$A,$B,$C,  6,  5, $X);
+               $this->ROUND2($C,$D,$A,$B, 10,  9, $X);  $this->ROUND2($B,$C,$D,$A, 14, 13, $X);
+               $this->ROUND2($A,$B,$C,$D,  3,  3, $X);  $this->ROUND2($D,$A,$B,$C,  7,  5, $X);
+               $this->ROUND2($C,$D,$A,$B, 11,  9, $X);  $this->ROUND2($B,$C,$D,$A, 15, 13, $X);
+               $this->ROUND3($A,$B,$C,$D,  0,  3, $X);  $this->ROUND3($D,$A,$B,$C,  8,  9, $X);
+               $this->ROUND3($C,$D,$A,$B,  4, 11, $X);  $this->ROUND3($B,$C,$D,$A, 12, 15, $X);
+               $this->ROUND3($A,$B,$C,$D,  2,  3, $X);  $this->ROUND3($D,$A,$B,$C, 10,  9, $X);
+               $this->ROUND3($C,$D,$A,$B,  6, 11, $X);  $this->ROUND3($B,$C,$D,$A, 14, 15, $X);
+               $this->ROUND3($A,$B,$C,$D,  1,  3, $X);  $this->ROUND3($D,$A,$B,$C,  9,  9, $X);
+               $this->ROUND3($C,$D,$A,$B,  5, 11, $X);  $this->ROUND3($B,$C,$D,$A, 13, 15, $X);
+               $this->ROUND3($A,$B,$C,$D,  3,  3, $X);  $this->ROUND3($D,$A,$B,$C, 11,  9, $X);
+               $this->ROUND3($C,$D,$A,$B,  7, 11, $X);  $this->ROUND3($B,$C,$D,$A, 15, 15, $X);
+               
+               $A = $this->add32(array($A, $AA)); $B = $this->add32(array($B, $BB));
+               $C = $this->add32(array($C, $CC)); $D = $this->add32(array($D, $DD));
+       }
+
+       # Needed? because perl seems to choke on overflowing when doing bitwise
+       # operations on numbers larger than 32 bits. Well, it did on my machine =)
+       function add32($v) {
+               $sum = array();
+               for ($i = 0; $i < sizeof($v); $i++) {
+                       $v[$i] = array($this->unsigned_shift_r(($v[$i]&0xffff0000), 16), ($v[$i]&0xffff));
+               }
+               for ($i = 0; $i < sizeof($v); $i++) {
+                       @$sum[0] += $v[$i][0];
+                       @$sum[1] += $v[$i][1];
+               }
+               $sum[0] += ($sum[1]&0xffff0000)>>16;
+               $sum[1] &= 0xffff;
+               $sum[0] &= 0xffff;
+               $ret = ($sum[0]<<16) | $sum[1];
+               if ($this->x($ret) > 4294967296) {
+                       $ret = (2*4294967296) - $this->x($ret);
+               }
+               return $ret;
+       }
+
+       # Ported from SAMBA/source/lib/md4.c:ROUND1
+       function ROUND1(&$a,$b,$c,$d,$k,$s,$X) {
+               $a = $this->md4lshift($this->add32(array($a, $this->F($b,$c,$d), $X[$k])), $s);
+               return $a;
+       }
+
+       # Ported from SAMBA/source/lib/md4.c:ROUND2
+       function ROUND2(&$a,$b,$c,$d,$k,$s,$X) {
+               $a = $this->md4lshift($this->add32(array($a, $this->G($b,$c,$d), $X[$k] + 0x5A827999)), $s);
+               return $a;
+       }
+
+       # Ported from SAMBA/source/lib/md4.c:ROUND3
+       function ROUND3(&$a,$b,$c,$d,$k,$s,$X) {
+               $a = $this->md4lshift($this->add32(array($a + $this->H($b,$c,$d) + $X[$k] + 0x6ED9EBA1)), $s);
+               return $a;
+       }
+
+       # Ported from SAMBA/source/lib/md4.c:lshift
+       # Renamed to prevent clash with SAMBA/source/libsmb/smbdes.c:lshift
+       function md4lshift($x, $s) {
+               $x &= 0xFFFFFFFF;
+               if ($this->x($x) > 4294967296) {
+                       $x = (2*4294967296) - $this->x($x);
+               }
+               $ret = ((($x<<$s)&0xFFFFFFFF) | $this->unsigned_shift_r($x, (32-$s)));
+               if ($this->x($ret) > 4294967296) {
+                       $ret = (2*4294967296) - $this->x($ret);
+               }
+               return $ret;
+       }
+
+       /**
+       * Unsigned shift operation for 32bit values.
+       *
+       * PHP 4 only supports signed shifts by default.
+       */
+       function unsigned_shift_r($a, $b) { 
+               $z = 0x80000000; 
+               if ($z & $a) { 
+                       $a = ($a >> 1); 
+                       $a &= (~$z); 
+                       $a |= 0x40000000; 
+                       $a = ($a >> ($b - 1)); 
+               } 
+               else { 
+                       $a = ($a >> $b); 
+               } 
+               return $a; 
+       } 
+
+}
+
+?>
index 5101e4c..eb3aaab 100644 (file)
@@ -1,3 +1,4 @@
+<pre>
 <?php
 /*******************************************************************************
  * Copyright (C) 2007 Easter-eggs
 
 ******************************************************************************/
 
-$conf_dir='conf/';
-require_once $conf_dir.'config.php';
-require_once $conf_dir.'error_code.php';
-require_once $conf_dir.'config.LSeepeople.php';
-require_once $conf_dir.'config.LSeegroup.php';
+define('LS_CONF_DIR','conf/');
+define('LS_INCLUDE_DIR','includes/');
+define('LS_CLASS_DIR', LS_INCLUDE_DIR .'class/');
+define('LS_LIB_DIR', LS_INCLUDE_DIR .'libs/');
+define('LS_ADDONS_DIR', LS_INCLUDE_DIR .'addons/');
+
+require_once  LS_CONF_DIR .'config.php';
+require_once  LS_CONF_DIR .'error_code.php';
+require_once  LS_CONF_DIR .'config.LSeepeople.php';
+require_once  LS_CONF_DIR .'config.LSeegroup.php';
 require_once $GLOBALS['LSconfig']['NetLDAP'];
-require_once $GLOBALS['LSconfig']['QuickForm'];
-
-$include_dir='includes/';
-require_once $include_dir.'functions.php';
-$class_dir=$include_dir.'class/';
-require_once $class_dir.'class.LSerror.php';
-require_once $class_dir.'class.LSldap.php';
-require_once $class_dir.'class.LSldapObject.php';
-require_once $class_dir.'class.LSattribute.php';
-require_once $class_dir.'class.LSattr_ldap.php';
-require_once $class_dir.'class.LSattr_ldap_ascii.php';
-require_once $class_dir.'class.LSattr_ldap_numeric.php';
-require_once $class_dir.'class.LSattr_html.php';
-require_once $class_dir.'class.LSattr_html_text.php';
-require_once $class_dir.'class.LSattr_html_select_list.php';
-
-require_once $class_dir.'class.LSeepeople.php';
-require_once $class_dir.'class.LSeegroup.php';
-
-require_once $class_dir.'class.LSform.php';
-echo "<pre>";
+
+require_once  LS_INCLUDE_DIR .'functions.php';
+
+require_once  LS_CLASS_DIR .'class.LSerror.php';
+require_once  LS_CLASS_DIR .'class.LSldap.php';
+require_once  LS_CLASS_DIR .'class.LSldapObject.php';
+require_once  LS_CLASS_DIR .'class.LSattribute.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap_ascii.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap_password.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap_numeric.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_text.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_textarea.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_password.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_select_list.php';
+
+require_once  LS_CLASS_DIR .'class.LSeepeople.php';
+require_once  LS_CLASS_DIR .'class.LSeegroup.php';
+
+require_once  LS_CLASS_DIR .'class.LSform.php';
+require_once  LS_CLASS_DIR .'class.LSformElement.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_text.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_textarea.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_select.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_password.php';
+
+require_once  LS_CLASS_DIR .'class.LSformRule.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_regex.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_alphanumeric.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_compare.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_email.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_lettersonly.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_maxlength.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_minlength.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_nonzero.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_nopunctuation.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_numeric.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_rangelength.php';
+
+require_once  LS_ADDONS_DIR .'LSaddons.samba.php';
+LSaddon_samba_support();
+require_once  LS_ADDONS_DIR .'LSaddons.posix.php';
+LSaddon_posix_support();
+
+// Simulation d'une LSsession
+$GLOBALS['LSsession']['topDn']='o=lsexample';
+
 
 // "Activation" de la gestion des erreurs
 $LSerror = new LSerror();
@@ -57,10 +90,9 @@ $LSldap = new LSldap($GLOBALS['LSconfig']['ldap_config']);
 // ---- les objets LDAP
 // Création d'un LSeepeople
 $eepeople = new LSeepeople($GLOBALS['LSobjects']['LSeepeople']);
-$eegroup = new LSeegroup($GLOBALS['LSobjects']['LSeegroup']);
+
 // Chargement des données de l'objet depuis l'annuaire et à partir de son DN
-$eepeople-> loadData('uid=eeggs,ou=people,o=ost');
-$eegroup-> loadData('cn=adminldap,ou=groups,o=ost');
+$eepeople-> loadData('uid=eeggs,ou=people,o=lsexample');
 
 // Création d'un formulaire à partir pour notre objet LDAP
 $form=$eepeople -> getForm('test');
@@ -76,5 +108,6 @@ $form -> display();
 
 // Affichage des retours d'erreurs
 $LSerror -> display();
-echo "</pre>";
-?>
\ No newline at end of file
+?>
+</pre>
+<?php debug_print(); ?>
diff --git a/trunk/index_new.php b/trunk/index_new.php
new file mode 100644 (file)
index 0000000..5a98d11
--- /dev/null
@@ -0,0 +1,111 @@
+<pre>
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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('LS_CONF_DIR','conf/');
+define('LS_INCLUDE_DIR','includes/');
+define('LS_CLASS_DIR', LS_INCLUDE_DIR .'class/');
+define('LS_LIB_DIR', LS_INCLUDE_DIR .'libs/');
+define('LS_ADDONS_DIR', LS_INCLUDE_DIR .'addons/');
+
+require_once  LS_CONF_DIR .'config.php';
+require_once  LS_CONF_DIR .'error_code.php';
+require_once  LS_CONF_DIR .'config.LSeepeople.php';
+require_once  LS_CONF_DIR .'config.LSeegroup.php';
+require_once $GLOBALS['LSconfig']['NetLDAP'];
+
+require_once  LS_INCLUDE_DIR .'functions.php';
+
+require_once  LS_CLASS_DIR .'class.LSerror.php';
+require_once  LS_CLASS_DIR .'class.LSldap.php';
+require_once  LS_CLASS_DIR .'class.LSldapObject.php';
+require_once  LS_CLASS_DIR .'class.LSattribute.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap_ascii.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap_password.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap_numeric.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_text.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_textarea.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_password.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_select_list.php';
+
+require_once  LS_CLASS_DIR .'class.LSeepeople.php';
+require_once  LS_CLASS_DIR .'class.LSeegroup.php';
+
+require_once  LS_CLASS_DIR .'class.LSform.php';
+require_once  LS_CLASS_DIR .'class.LSformElement.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_text.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_textarea.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_select.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_password.php';
+
+require_once  LS_CLASS_DIR .'class.LSformRule.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_regex.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_alphanumeric.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_compare.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_email.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_lettersonly.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_maxlength.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_minlength.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_nonzero.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_nopunctuation.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_numeric.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_rangelength.php';
+
+require_once  LS_ADDONS_DIR .'LSaddons.samba.php';
+LSaddon_samba_support();
+require_once  LS_ADDONS_DIR .'LSaddons.posix.php';
+LSaddon_posix_support();
+
+// Simulation d'une LSsession
+$GLOBALS['LSsession']['topDn']='o=lsexample';
+
+
+// "Activation" de la gestion des erreurs
+$LSerror = new LSerror();
+
+// Connexion à l'annuaire
+$LSldap = new LSldap($GLOBALS['LSconfig']['ldap_config']);
+
+
+// ---- les objets LDAP
+// Création d'un LSeepeople
+$eepeople = new LSeepeople($GLOBALS['LSobjects']['LSeepeople']);
+
+// Création d'un formulaire à partir pour notre objet LDAP
+$form=$eepeople -> getForm('add');
+
+// Gestion de sa validation
+if ($form->validate()) {
+  // MàJ des données de l'objet LDAP
+  $eepeople -> updateData();
+}
+// Affichage du formulaire
+$form -> display();
+
+
+// Affichage des retours d'erreurs
+$LSerror -> display();
+?>
+</pre>
+<?php debug_print(); ?>
diff --git a/trunk/test.php b/trunk/test.php
new file mode 100644 (file)
index 0000000..df5e091
--- /dev/null
@@ -0,0 +1,116 @@
+<pre>
+<?php
+/*******************************************************************************
+ * Copyright (C) 2007 Easter-eggs
+ * http://ldapsaisie.labs.libre-entreprise.org
+ *
+ * Author: See AUTHORS file in top-level directory.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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('LS_CONF_DIR','conf/');
+define('LS_INCLUDE_DIR','includes/');
+define('LS_CLASS_DIR', LS_INCLUDE_DIR .'class/');
+define('LS_LIB_DIR', LS_INCLUDE_DIR .'libs/');
+define('LS_ADDONS_DIR', LS_INCLUDE_DIR .'addons/');
+
+require_once  LS_CONF_DIR .'config.php';
+require_once  LS_CONF_DIR .'error_code.php';
+require_once  LS_CONF_DIR .'config.LSeepeople.php';
+require_once  LS_CONF_DIR .'config.LSeegroup.php';
+require_once $GLOBALS['LSconfig']['NetLDAP'];
+
+require_once  LS_INCLUDE_DIR .'functions.php';
+
+require_once  LS_CLASS_DIR .'class.LSerror.php';
+require_once  LS_CLASS_DIR .'class.LSldap.php';
+require_once  LS_CLASS_DIR .'class.LSldapObject.php';
+require_once  LS_CLASS_DIR .'class.LSattribute.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap_ascii.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap_password.php';
+require_once  LS_CLASS_DIR .'class.LSattr_ldap_numeric.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_text.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_textarea.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_password.php';
+require_once  LS_CLASS_DIR .'class.LSattr_html_select_list.php';
+
+require_once  LS_CLASS_DIR .'class.LSeepeople.php';
+require_once  LS_CLASS_DIR .'class.LSeegroup.php';
+
+require_once  LS_CLASS_DIR .'class.LSform.php';
+require_once  LS_CLASS_DIR .'class.LSformElement.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_text.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_textarea.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_select.php';
+require_once  LS_CLASS_DIR .'class.LSformElement_password.php';
+
+require_once  LS_CLASS_DIR .'class.LSformRule.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_regex.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_alphanumeric.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_compare.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_email.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_lettersonly.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_maxlength.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_minlength.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_nonzero.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_nopunctuation.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_numeric.php';
+require_once  LS_CLASS_DIR .'class.LSformRule_rangelength.php';
+
+require_once  LS_ADDONS_DIR .'LSaddons.samba.php';
+
+
+// Simulation d'une LSsession
+$GLOBALS['LSsession']['topDn']='o=lsexample';
+
+
+// "Activation" de la gestion des erreurs
+$LSerror = new LSerror();
+
+// Connexion à l'annuaire
+$LSldap = new LSldap($GLOBALS['LSconfig']['ldap_config']);
+
+
+
+
+// =========================================================
+
+// ---- les objets LDAP
+// Création d'un LSeepeople
+$eepeople = new LSeepeople($GLOBALS['LSobjects']['LSeepeople']);
+// Chargement des données de l'objet depuis l'annuaire et à partir de son DN
+$eepeople-> loadData('uid=eeggs,ou=people,o=lsexemple');
+
+if (LSaddon_samba_support()) {
+       echo "SambaSID : ".generate_sambaSID($eepeople)."<br/>";
+       echo "SambaPrimaryGroupSID : ".generate_sambaPrimaryGroupSID($eepeople)."<br/>";
+       echo "sambaNTPassword : ".generate_sambaNTPassword($eepeople)."<br/>";
+       echo "sambaLMPassword : ".generate_sambaLMPassword($eepeople)."<br/>";
+}
+else {
+       echo "Bug !!!";
+}
+
+
+// =========================================================
+
+// Affichage des retours d'erreurs
+$LSerror -> display();
+?>
+</pre>
+<?php debug_print(); ?>
diff --git a/trunk/test_group.php b/trunk/test_group.php
deleted file mode 100644 (file)
index 2471bb4..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-// filtre unique
-$filter['unique']=array(
-  array(
-    'filter' => 'uid=a*',
-    'object_type' => 'LSeepeople',
-  )
-);
-
-// UniqueMember group
-$filter['uniqueMember']=array(
-  array(
-    'filter' => 'cn=admin*',
-    'object_type' => 'LSeegroup',
-    'attr' => 'uniqueMember',
-    'basedn' => 'o=ost'
-  ),
-  array(
-    'basedn' => '%{dn}'
-  )
-);
-
-// memberUid
-$filter['memberUid']=array(
-  array(
-    'filter' => 'objectClass=posixGroup',
-    'attr' => 'memberUid',
-    'basedn' => 'o=ost'
-  ),
-  array(
-    'filter' => 'uid=%{dn}',
-  )
-);
-
-
-/*
-- On liste les memberUid
-- on forme avec des DN et on recupère leur Groupe Principale
-- on recupère tout les membres de ces groupes
-- on ne garde que les ostpeople
-*/
-$filter['complexe']=array(
-  array(
-    'filter' => 'objectClass=posixGroup',
-    'attr' => 'memberUid',
-    'basedn' => 'o=ost'
-  ),
-  array(
-    'filter' => 'uid=%{dn}',
-    'basedn' => 'uid=%{dn},ou=people,o=ost',
-    'attr' => 'gidNumber',
-  ),
-  array(
-    'filter' => 'gidNumber=%{dn}',
-    'object_type' => 'LSeegroup',
-    'attr' => 'uniqueMember'
-  ),
-  array(
-    'basedn' => "%{dn}",
-  )
-);
-
-
-
-foreach($eepeople -> listObjects($filter['complexe'],'o=ost') as $obj){
-  echo "DN : ".$obj -> dn."\n<br />";
-  $obj -> debug_printAttrsValues();
-}
-
-?>
\ No newline at end of file