From c943289169ae9ba4a8559e854a4270b7f60859cd Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Tue, 5 Feb 2008 16:11:21 +0000 Subject: [PATCH] =?UTF-8?q?-=20Ecriture=20du=20LSsession=20-=20Mise=20en?= =?UTF-8?q?=20place=20des=20templates=20Smarty=20-=20Adaptation=20du=20cod?= =?UTF-8?q?e=20au=20templates=20Smarty=20-=20index=5Fajax.php=20->=20Code?= =?UTF-8?q?=20php=20des=20r=C3=A9ponses=20Ajax=20de=20l'interface=20-=20in?= =?UTF-8?q?cludes/js=20->=20Partie=20JavaScript=20(Mootools)=20de=20l'inte?= =?UTF-8?q?rface?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config.LSobjects.LSeecompany.php | 62 + .../LSobjects/config.LSobjects.LSeegroup.php | 105 + .../LSobjects/config.LSobjects.LSeepeople.php | 409 + trunk/conf/config.LSaddons.php | 27 + trunk/conf/config.LSobjects.php | 29 + trunk/conf/config.error_code.php | 239 + trunk/conf/config.inc.php | 91 + .../class/class.LSattr_html_password.php | 2 +- .../class/class.LSattr_html_select_list.php | 3 +- .../class/class.LSattr_html_textarea.php | 2 +- trunk/includes/class/class.LSattribute.php | 23 +- trunk/includes/class/class.LSerror.php | 27 +- trunk/includes/class/class.LSform.php | 51 +- trunk/includes/class/class.LSformElement.php | 33 +- .../class/class.LSformElement_password.php | 42 +- .../class/class.LSformElement_select.php | 40 +- .../class/class.LSformElement_text.php | 48 +- .../class/class.LSformElement_textarea.php | 47 +- .../class/class.LSformRule_alphanumeric.php | 1 + .../class/class.LSformRule_lettersonly.php | 1 + .../class/class.LSformRule_nonzero.php | 1 + .../class/class.LSformRule_nopunctuation.php | 1 + .../class/class.LSformRule_numeric.php | 1 + .../includes/class/class.LSformRule_regex.php | 1 - trunk/includes/class/class.LSldap.php | 34 +- trunk/includes/class/class.LSldapObject.php | 94 +- .../class/class.LSobjects.LSeecompany.php | 48 + .../class/class.LSobjects.LSeegroup.php | 48 + .../class/class.LSobjects.LSeepeople.php | 48 + trunk/includes/class/class.LSsession.php | 511 ++ trunk/includes/functions.php | 32 +- trunk/includes/js/Debugger.js | 395 + trunk/includes/js/LSdefault.js | 60 + trunk/includes/js/LSform.js | 70 + trunk/includes/js/LSsession_login.js | 47 + trunk/includes/js/mootools.js | 7102 +++++++++++++++++ trunk/index.php | 111 +- trunk/index_ajax.php | 69 + .../l10n/en_US.UTF8/LC_MESSAGES/ldapsaisie.mo | Bin 0 -> 1739 bytes trunk/templates/base.tpl | 49 + trunk/templates/css/LSdefault.css | 28 + trunk/templates/css/LSform.css | 51 + trunk/templates/css/base.css | 80 + trunk/templates/css/login.css | 51 + trunk/templates/images/add.png | Bin 0 -> 323 bytes trunk/templates/images/ajax-loader.gif | Bin 0 -> 673 bytes trunk/templates/images/fd_menu.png | Bin 0 -> 150 bytes trunk/templates/images/login_fd.png | Bin 0 -> 11546 bytes trunk/templates/images/logo.png | Bin 0 -> 13941 bytes trunk/templates/images/logout.png | Bin 0 -> 805 bytes trunk/templates/images/puce.png | Bin 0 -> 300 bytes trunk/templates/images/remove.png | Bin 0 -> 247 bytes trunk/templates/login.tpl | 37 + 53 files changed, 10013 insertions(+), 238 deletions(-) create mode 100644 trunk/conf/LSobjects/config.LSobjects.LSeecompany.php create mode 100644 trunk/conf/LSobjects/config.LSobjects.LSeegroup.php create mode 100644 trunk/conf/LSobjects/config.LSobjects.LSeepeople.php create mode 100644 trunk/conf/config.LSaddons.php create mode 100644 trunk/conf/config.LSobjects.php create mode 100644 trunk/conf/config.error_code.php create mode 100644 trunk/conf/config.inc.php create mode 100644 trunk/includes/class/class.LSobjects.LSeecompany.php create mode 100644 trunk/includes/class/class.LSobjects.LSeegroup.php create mode 100644 trunk/includes/class/class.LSobjects.LSeepeople.php create mode 100644 trunk/includes/class/class.LSsession.php create mode 100644 trunk/includes/js/Debugger.js create mode 100644 trunk/includes/js/LSdefault.js create mode 100644 trunk/includes/js/LSform.js create mode 100644 trunk/includes/js/LSsession_login.js create mode 100644 trunk/includes/js/mootools.js create mode 100644 trunk/index_ajax.php create mode 100644 trunk/l10n/en_US.UTF8/LC_MESSAGES/ldapsaisie.mo create mode 100644 trunk/templates/base.tpl create mode 100644 trunk/templates/css/LSdefault.css create mode 100644 trunk/templates/css/LSform.css create mode 100644 trunk/templates/css/base.css create mode 100644 trunk/templates/css/login.css create mode 100644 trunk/templates/images/add.png create mode 100644 trunk/templates/images/ajax-loader.gif create mode 100644 trunk/templates/images/fd_menu.png create mode 100644 trunk/templates/images/login_fd.png create mode 100644 trunk/templates/images/logo.png create mode 100644 trunk/templates/images/logout.png create mode 100644 trunk/templates/images/puce.png create mode 100644 trunk/templates/images/remove.png create mode 100644 trunk/templates/login.tpl diff --git a/trunk/conf/LSobjects/config.LSobjects.LSeecompany.php b/trunk/conf/LSobjects/config.LSobjects.LSeecompany.php new file mode 100644 index 00000000..d0b5f02d --- /dev/null +++ b/trunk/conf/LSobjects/config.LSobjects.LSeecompany.php @@ -0,0 +1,62 @@ + array( + 'lscompany', + ), + 'rdn' => 'o', + 'container_dn' => 'ou=companies', + 'select_display_attrs' => '%{dc}', + 'attrs' => array ( + 'o' => array ( + 'label' => _('Nom'), + 'ldap_type' => 'ascii', + 'html_type' => 'text', + 'required' => 1, + 'check_data' => array ( + 'alphanumeric' + ), + '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 + ) + ), + 'dc' => array ( + 'label' => _('Domaine'), + 'ldap_type' => 'ascii', + 'html_type' => 'text', + '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 + ), + 'form' => array ( + 'test' => 1 + ) + ) + ) +); +?> diff --git a/trunk/conf/LSobjects/config.LSobjects.LSeegroup.php b/trunk/conf/LSobjects/config.LSobjects.LSeegroup.php new file mode 100644 index 00000000..668dd269 --- /dev/null +++ b/trunk/conf/LSobjects/config.LSobjects.LSeegroup.php @@ -0,0 +1,105 @@ + array( + 'lsgroup', + 'posixGroup' + ), + 'rdn' => 'cn', + 'container_dn' => 'ou=groups', + 'select_display_attrs' => '%{cn}', + 'attrs' => array ( + 'cn' => array ( + 'label' => _('Nom'), + 'ldap_type' => 'ascii', + 'html_type' => 'text', + 'required' => 1, + 'check_data' => array ( + 'alphanumeric' + ), + 'validation' => array ( + array ( + 'filter' => 'cn=%{val}', + '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'), + 'ldap_type' => 'numeric', + 'html_type' => 'text', + 'required' => 1, + 'validation' => array ( + array ( + 'filter' => 'gidNumber=%{val}', + '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 + ) + ), + 'uniqueMember' => array ( + 'label' => _('Membres'), + 'ldap_type' => 'ascii', + 'html_type' => 'select_list', + 'required' => 0, + 'validation' => array ( + array ( + 'basedn' => '%{val}', + 'result' => 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 + ), + 'form' => array ( + 'test' => 1 + ), + 'possible_values' => array( + '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 + + 'value_attribute' => '%{dn}', // Spécifie le attributs dont la valeur sera retournée par + ) + ) + ) + ) +); +?> diff --git a/trunk/conf/LSobjects/config.LSobjects.LSeepeople.php b/trunk/conf/LSobjects/config.LSobjects.LSeepeople.php new file mode 100644 index 00000000..3511743a --- /dev/null +++ b/trunk/conf/LSobjects/config.LSobjects.LSeepeople.php @@ -0,0 +1,409 @@ + array( + 'top', + 'lspeople', + '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'), + '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.") + ), + ), + 'validation' => array ( + array ( + 'filter' => 'uid=%{val}', + 'result' => 0, + 'msg' => _('Cet identifiant est déjà utilisé.') + ) + ), + '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 + ) + ), + 'uidNumber' => array ( + '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.") + ), + ), + 'validation' => array ( + array ( + 'filter' => 'uidNumber=%{val}', + 'result' => 0, + 'msg' => _('Cet uid est déjà utilisé.') + ) + ), + '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, + ) + ), + 'cn' => array ( + '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) + '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 + ) + ), + 'givenName' => array ( + '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.') + ), + ), + '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 + ), + 'onDisplay' => 'return_data' + ), + 'sn' => array ( + 'label' => _('Nom'), + 'ldap_type' => 'ascii', + 'html_type' => 'text', + '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 + ), + 'form' => array ( + 'test' => 1, + 'add' => 1 + ) + ), + 'gidNumber' => array ( + 'label' => _('Groupe principal'), + 'ldap_type' => 'numeric', + 'html_type' => 'select_list', + 'multiple' => true, + 'required' => 1, + 'validation' => array ( + array ( + 'object_type' => 'LSeegroup', // 'object_type' : Permet definir le type d'objet recherchés + //'basedn' => 'o=company', // 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) + '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( + 'OTHER_OBJECT' => array( + '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 + + '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=company', + 'scope' => 'sub', + ) + ) + ) + ) + ), + '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' => 0, + ) + ), + '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', + 'multiple' => true, + '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éponse 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.example.fr' => 'Oui', + '' => 'Non' + ) + ), + 'vacationInfo' => array ( + 'label' => _('Message en reponse'), + 'ldap_type' => 'ascii', + 'html_type' => 'textarea', + 'multiple' => true, + '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 + ) + ) + ) +); +?> diff --git a/trunk/conf/config.LSaddons.php b/trunk/conf/config.LSaddons.php new file mode 100644 index 00000000..f01df4a4 --- /dev/null +++ b/trunk/conf/config.LSaddons.php @@ -0,0 +1,27 @@ + diff --git a/trunk/conf/config.LSobjects.php b/trunk/conf/config.LSobjects.php new file mode 100644 index 00000000..63b79375 --- /dev/null +++ b/trunk/conf/config.LSobjects.php @@ -0,0 +1,29 @@ + diff --git a/trunk/conf/config.error_code.php b/trunk/conf/config.error_code.php new file mode 100644 index 00000000..eea47204 --- /dev/null +++ b/trunk/conf/config.error_code.php @@ -0,0 +1,239 @@ + array ( + 'msg' => _("Erreur inconnue!"), + 'level' => 'c' + ), + // LSldap + 1 => array ( + 'msg' => _("LSldap : Erreur durant la connexion au serveur LDAP (%{msg})."), + 'level' => 'c' + ), + 2 => array ( + '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."), + 'level' => 'c' + ), + 22 => array ( + '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}."), + 'level' => 'c' + ), + 24 => array ( + '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}."), + 'level' => 'c' + ), + 26 => array ( + '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."), + 'level' => 'c' + ), + 28 => array ( + '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."), + 'level' => 'c' + ), + 30 => array ( + '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 : 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."), + 'level' => 'c' + ), + 43 => array ( + '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."), + 'level' => 'c' + ), + 45 => array ( + '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."), + '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}."), + '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."), + 'level' => 'c' + ), + + // LSsession + 1001 => array ( + 'msg' => _("LSsession : La constante %{const} n'est pas définie."), + 'level' => 'c' + ), + 1002 => array ( + 'msg' => _("LSsession : Le support %{addon} n'est pas assuré. Vérifier la compatibilité du système et la configuration de l'addon"), + 'level' => 'c' + ), + 1003 => array ( + 'msg' => _("LSsession : Données de configuration du serveur LDAP invalide. Impossible d'établir une connexion."), + 'level' => 'c' + ), + 1004 => array ( + 'msg' => _("LSsession : Impossible de charger l'objets de type %{type} : type inconnu."), + 'level' => 'c' + ), + 1005 => array ( + 'msg' => _("LSsession : Impossible d'effecture l'authentification : Type d'objet d'authentification inconnu (%{type})."), + 'level' => 'c' + ), + 1006 => array ( + 'msg' => _("LSsession : Identifiant ou mot de passe incorrect."), + 'level' => 'c' + ), + 1007 => array ( + 'msg' => _("LSsession : Impossible de vous identifier : Duplication d'authentité."), + 'level' => 'c' + ), + 1008 => array ( + 'msg' => _("LSsession : Impossible d'inclure le moteur de rendu Smarty."), + 'level' => 'c' + ), + 1009 => array ( + 'msg' => _("LSsession : Impossible de se connecter au Serveur LDAP."), + 'level' => 'c' + ), + 1010 => array ( + 'msg' => _("LSsession : Impossible de charger la classe des objets d'authentification."), + 'level' => 'c' + ) +); +?> diff --git a/trunk/conf/config.inc.php b/trunk/conf/config.inc.php new file mode 100644 index 00000000..29b36827 --- /dev/null +++ b/trunk/conf/config.inc.php @@ -0,0 +1,91 @@ + '/usr/share/php/Net/LDAP.php', + 'Smarty' => '/var/www/tmp/Smarty-2.6.18/libs/Smarty.class.php', + 'lang' => 'fr_FR.UTF8', + 'ldap_servers' => array ( + array ( + 'name' => 'Ldap 1', + 'ldap_config'=> array( + 'host' => '127.0.0.1', + 'port' => 389, + 'version' => 3, + 'starttls' => false, + 'binddn' => 'uid=toto,ou=people,o=ls', + 'bindpw' => 'toto', + 'basedn' => 'o=ls', + 'options' => array(), + 'filter' => '(objectClass=*)', + 'scope' => 'sub' + ), + 'authobject' => 'LSeepeople', + 'authobject_pwdattr' => 'userPassword' + ), + array ( + 'name' => 'Ldap 2', + 'ldap_config'=> array( + 'host' => '127.0.0.1', + 'port' => 389, + 'version' => 3, + 'starttls' => false, + 'binddn' => 'uid=toto,ou=people,o=com', + 'bindpw' => 'toto', + 'basedn' => 'o=com', + 'options' => array(), + 'filter' => '(objectClass=*)', + 'scope' => 'sub' + ), + 'subdnobject' => 'LSeecompany', + 'authobject' => 'LSeepeople', + 'authobject_pwdattr' => 'userPassword' + ) + ) +); + +//Debug +$GLOBALS['LSdebug']['active'] = true; + +// Définitions des locales +$textdomain = 'ldapsaisie'; +bindtextdomain($textdomain, '/var/www/ldapsaisie/trunk/l10n'); +textdomain($textdomain); +setlocale(LC_ALL, $GLOBALS['LSconfig']['lang']); + +// Définitions des dossiers d'inclusions +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/'); +define('LS_JS_DIR', LS_INCLUDE_DIR .'js/'); + +// Javascript +$GLOBALS['defaultJSscipts']=array( + 'mootools.js', + 'LSdefault.js', + 'Debugger.js' +); + +?> diff --git a/trunk/includes/class/class.LSattr_html_password.php b/trunk/includes/class/class.LSattr_html_password.php index 6f9322b3..94acac2d 100644 --- a/trunk/includes/class/class.LSattr_html_password.php +++ b/trunk/includes/class/class.LSattr_html_password.php @@ -43,7 +43,7 @@ class LSattr_html_password extends LSattr_html { return; } - if (is_array($data)) { + if (count($data)>1) { $GLOBALS['LSerror'] -> addErrorCode(103,'password'); return; } diff --git a/trunk/includes/class/class.LSattr_html_select_list.php b/trunk/includes/class/class.LSattr_html_select_list.php index ea88b4ff..1c21248c 100644 --- a/trunk/includes/class/class.LSattr_html_select_list.php +++ b/trunk/includes/class/class.LSattr_html_select_list.php @@ -37,7 +37,7 @@ class LSattr_html_select_list extends LSattr_html{ * @retval LSformElement L'element du formulaire ajouté */ function addToForm (&$form,$idForm,$data=NULL) { - if (is_array($data)) { + if (count($data)>1) { $GLOBALS['LSerror'] -> addErrorCode(103,'select_list'); return; } @@ -80,7 +80,6 @@ class LSattr_html_select_list extends LSattr_html{ if (isset($this -> config['possible_values'])) { foreach($this -> config['possible_values'] as $val_name => $val) { if($val_name=='OTHER_OBJECT') { - //~ print_r($val); if ((!isset($val['object_type'])) || (!isset($val['value_attribute']))) { $GLOBALS['LSerror'] -> addErrorCode(102,$this -> name); break; diff --git a/trunk/includes/class/class.LSattr_html_textarea.php b/trunk/includes/class/class.LSattr_html_textarea.php index 46314c94..c06816ab 100644 --- a/trunk/includes/class/class.LSattr_html_textarea.php +++ b/trunk/includes/class/class.LSattr_html_textarea.php @@ -43,7 +43,7 @@ class LSattr_html_textarea extends LSattr_html { return; } - if (is_array($data)) { + if (count($data)>1) { $GLOBALS['LSerror'] -> addErrorCode(103,'textarea'); return; } diff --git a/trunk/includes/class/class.LSattribute.php b/trunk/includes/class/class.LSattribute.php index 540b6817..d9b61551 100644 --- a/trunk/includes/class/class.LSattribute.php +++ b/trunk/includes/class/class.LSattribute.php @@ -20,6 +20,9 @@ ******************************************************************************/ +$GLOBALS['LSsession'] -> loadLSclass('LSattr_ldap'); +$GLOBALS['LSsession'] -> loadLSclass('LSattr_html'); + /** * Attribut Ldap * @@ -58,9 +61,10 @@ class LSattribute { $this -> name = $name; $this -> config = $config; $this -> ldapObject = $ldapObject; - $html_type = "LSattr_html_".$config['html_type']; $ldap_type = "LSattr_ldap_".$config['ldap_type']; + $GLOBALS['LSsession'] -> loadLSclass($html_type); + $GLOBALS['LSsession'] -> loadLSclass($ldap_type); if((class_exists($html_type))&&(class_exists($ldap_type))) { $this -> html = new $html_type($name,$config,$this); $this -> ldap = new $ldap_type($name,$config,$this); @@ -238,14 +242,8 @@ class LSattribute { */ function refreshForm(&$form,$idForm) { if(isset($this -> config['form'][$idForm])) { - //~ echo 'Attr : '.$this -> name.'| Val : '.$this -> data."
\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 $form_element -> setValue($this -> getFormVal()); } return true; } @@ -258,7 +256,10 @@ class LSattribute { * @retval string La valeur a afficher dans le formulaire. */ function getFormVal() { - return $this -> getDisplayValue(); + $data=$this -> getDisplayValue(); + if(!is_array($data)) + $data=array($data); + return $data; } /** @@ -271,8 +272,10 @@ class LSattribute { * @retval void */ function setUpdateData($data) { - if($this -> getFormVal() != $data) + if($this -> getFormVal() != $data) { $this -> updateData=$data; + debug($this -> name.' is updated (o = '.$this -> getFormVal().' | n = '.$data.')'); + } } /** diff --git a/trunk/includes/class/class.LSerror.php b/trunk/includes/class/class.LSerror.php index 481c8079..be5f063b 100644 --- a/trunk/includes/class/class.LSerror.php +++ b/trunk/includes/class/class.LSerror.php @@ -78,13 +78,34 @@ class LSerror { * @retval void */ function display() { - if(!empty($this -> errors)) { + $errors = $this -> getErrors(); + if ($errors) { + $GLOBALS['Smarty'] -> assign('LSerrors',$errors); + } + /*if(!empty($this -> errors)) { print "

"._('Erreurs')."

\n"; foreach ($this -> errors as $error) { - echo "(Code ".$error[0].") ".getFData($GLOBALS['error_code'][$error[0]]['msg'],$error[1])."
\n"; + echo "(Code ".$error[0].") ".getFData($GLOBALS['LSerror_code'][$error[0]]['msg'],$error[1])."
\n"; } - } + }*/ } + + /** + * Retourne le texte des erreurs + * + * @author Benjamin Renard + * + * @retvat string Le texte des erreurs + */ + function getErrors() { + if(!empty($this -> errors)) { + foreach ($this -> errors as $error) { + $txt.="(Code ".$error[0].") ".getFData($GLOBALS['LSerror_code'][$error[0]]['msg'],$error[1])."
\n"; + } + return $txt; + } + return; + } } ?> diff --git a/trunk/includes/class/class.LSform.php b/trunk/includes/class/class.LSform.php index dc677fe6..586a7ffa 100644 --- a/trunk/includes/class/class.LSform.php +++ b/trunk/includes/class/class.LSform.php @@ -59,6 +59,7 @@ class LSform { $this -> idForm = $idForm; $this -> submit = $submit; $this -> ldapObject = $ldapObject; + $GLOBALS['LSsession'] -> loadLSclass('LSformElement'); } /** @@ -69,26 +70,24 @@ class LSform { * @retval void */ function display(){ - echo "
\n"; - echo "\t\n"; - echo "\t\n"; - echo "\n"; + $GLOBALS['LSsession'] -> addJSscript('LSform.js'); + $GLOBALS['LSsession'] -> addCssFile('LSform.css'); + $GLOBALS['Smarty'] -> assign('LSform_action',$_SERVER['PHP_SELF']); + $LSform_header = "\t\n\t\n\t\n"; + $GLOBALS['Smarty'] -> assign('LSform_header',$LSform_header); + $fields = array(); foreach($this -> elements as $element) { - $element -> display(); + $field = array(); + $field = $element -> getDisplay(); if (isset($this -> _elementsErrors[$element -> name])) { - foreach ($this -> _elementsErrors[$element -> name] as $error) { - echo ""; - } + $field['errors']= $this -> _elementsErrors[$element -> name]; } + $fields[] = $field; } + $GLOBALS['Smarty'] -> assign('LSform_fields',$fields); if($this -> can_validate) { - echo "\t\n"; - echo "\t\t\n"; - echo "\t\t\n"; - echo "\t\n"; + $GLOBALS['Smarty'] -> assign('LSform_submittxt',$this -> submit); } - echo "
$error
  submit."\"/>
\n"; - echo "
\n"; } /** @@ -166,8 +165,11 @@ class LSform { } if (!is_array($this -> _rules[$element])) continue; + $GLOBALS['LSsession'] -> loadLSclass('LSformRule'); foreach($this -> _rules[$element] as $rule) { - if (! call_user_func(array( "LSformRule_".$rule['name'],'validate') , $value, $rule['options'])) { + $ruleType="LSformRule_".$rule['name']; + $GLOBALS['LSsession'] -> loadLSclass($ruleType); + if (! call_user_func(array( $ruleType,'validate') , $value, $rule['options'])) { $retval=false; $this -> setElementError($this -> elements[$element],$rule['options']['msg']); } @@ -238,6 +240,7 @@ class LSform { */ function addElement($type,$name,$label,$params=array()) { $elementType='LSformElement_'.$type; + $GLOBALS['LSsession'] -> loadLSclass($elementType); if (!class_exists($elementType)) { $GLOBALS['LSerror'] -> addErrorCode(205,array('type' => $type)); return; @@ -313,6 +316,8 @@ class LSform { * @param[in] $element string Le nom de l'élément conserné */ function isRuleRegistered($rule) { + $GLOBALS['LSsession'] -> loadLSclass('LSformRule'); + $GLOBALS['LSsession'] -> loadLSclass('LSformRule_'.$rule); return class_exists('LSformRule_'.$rule); } @@ -356,6 +361,22 @@ class LSform { return true; } + /** + * Retourne le code HTML d'un champ vide. + * + * @param[in] string Le nom du champ du formulaire + * + * @retval string Le code HTML du champ vide. + */ + function getEmptyField($element) { + $element = $this -> getElement($element); + if ($element) { + return $element -> getEmptyField(); + } + else + return; + } + } ?> diff --git a/trunk/includes/class/class.LSformElement.php b/trunk/includes/class/class.LSformElement.php index 1611ebba..c15343fc 100644 --- a/trunk/includes/class/class.LSformElement.php +++ b/trunk/includes/class/class.LSformElement.php @@ -159,6 +159,19 @@ class LSformElement { echo "\t\t".$this -> getLabel()."$required\n"; } + /** + * Retourne le label de l'élement + * + * @retval void + */ + function getLabelInfos() { + if ($this -> isRequired()) { + $return['required']=true; + } + $return['label'] = $this -> getLabel(); + return $return; + } + /** * Recupère la valeur de l'élement passée en POST * @@ -178,13 +191,14 @@ class LSformElement { $_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; + else { + $return[$this -> name] = array(); + return true; + } } /** @@ -206,6 +220,19 @@ class LSformElement { } } + /** + * Retourne l'HTML pour les boutons d'ajout et de suppression de champs du formulaire LSform + * + * @retval string Le code HTML des boutons + */ + function getMultipleData() { + if ($this -> params['multiple'] == true ) { + return ""._("._("; + } + else { + return ''; + } + } } ?> diff --git a/trunk/includes/class/class.LSformElement_password.php b/trunk/includes/class/class.LSformElement_password.php index a1f95af0..51b1b126 100644 --- a/trunk/includes/class/class.LSformElement_password.php +++ b/trunk/includes/class/class.LSformElement_password.php @@ -58,52 +58,28 @@ class LSformElement_password extends LSformElement { } /* - * Affiche l'élément + * Retourne les infos d'affichage de l'élément * - * Cette méthode affiche l'élement + * Cette méthode retourne les informations d'affichage de l'élement * - * @retval void + * @retval array */ - function display(){ - echo "\t\n"; - $this -> displayLabel(); - // value + function getDisplay(){ + $return = $this -> getLabelInfos(); if (!$this -> isFreeze()) { - echo "\t\t\n"; - echo "\t\t\t\n"; - echo "\t\t\t* "._('Modification uniquement')."."; - echo "\t\t\n"; + $return['html'] = "\n* "._('Modification uniquement')."."; } else { - echo "\t\t\n"; - echo "\t\t\t\n"; - echo "\t\t\n"; } - echo "\t\n"; + return $return; } - } ?> diff --git a/trunk/includes/class/class.LSformElement_select.php b/trunk/includes/class/class.LSformElement_select.php index 79aafd6e..6b3a965c 100644 --- a/trunk/includes/class/class.LSformElement_select.php +++ b/trunk/includes/class/class.LSformElement_select.php @@ -33,19 +33,24 @@ class LSformElement_select extends LSformElement { /* - * Affiche l'élément + * Retourn les infos d'affichage de l'élément * - * Cette méthode affiche l'élement + * Cette méthode retourne les informations d'affichage de l'élement * - * @retval void + * @retval array */ - function display(){ - echo "\t\n"; - $this -> displayLabel(); + function getDisplay(){ + $return = $this -> getLabelInfos(); // value if (!$this -> isFreeze()) { - echo "\t\t\n"; - echo "\t\t\t\n"; foreach ($this -> params['text_possible_values'] as $choice_value => $choice_text) { if (in_array($choice_value, $this -> values)) { $selected=' selected'; @@ -53,28 +58,25 @@ class LSformElement_select extends LSformElement { else { $selected=''; } - echo "\t\t\t\t\n"; + $return['html'].="\n"; } - echo "\t\t\t\n"; - echo "\t\t\n"; + $return['html'].="\n"; } else { - echo "\t\t\n"; - echo "\t\t\t\n"; } - echo "\t\n"; + return $return; } - + } ?> diff --git a/trunk/includes/class/class.LSformElement_text.php b/trunk/includes/class/class.LSformElement_text.php index c95be22d..3460022d 100644 --- a/trunk/includes/class/class.LSformElement_text.php +++ b/trunk/includes/class/class.LSformElement_text.php @@ -33,49 +33,53 @@ class LSformElement_text extends LSformElement { /* - * Affiche l'élément + * Retourne les infos d'affichage de l'élément * - * Cette méthode affiche l'élement + * Cette méthode retourne les informations d'affichage de l'élement * - * @retval void + * @retval array */ - function display(){ - echo "\t\n"; - $this -> displayLabel(); + function getDisplay(){ + $return = $this -> getLabelInfos(); // value if (!$this -> isFreeze()) { - echo "\t\t\n"; - echo "\t\t\t\n"; } else { - echo "\t\t\n"; - echo "\t\t\t\n"; } - echo "\t\n"; + return $return; } - + + /* + * Retourne le code HTML d'un champ vide + * + * @retval string Code HTML d'un champ vide. + */ + function getEmptyField() { + $multiple = $this -> getMultipleData(); + return "".$multiple; + } } ?> diff --git a/trunk/includes/class/class.LSformElement_textarea.php b/trunk/includes/class/class.LSformElement_textarea.php index c55ea85e..fc0d0e64 100644 --- a/trunk/includes/class/class.LSformElement_textarea.php +++ b/trunk/includes/class/class.LSformElement_textarea.php @@ -33,47 +33,54 @@ class LSformElement_textarea extends LSformElement { /* - * Affiche l'élément + * Retourne les infos d'affichage de l'élément * - * Cette méthode affiche l'élement + * Cette méthode retourne les informations d'affichage de l'élement * - * @retval void + * @retval array */ - function display(){ - echo "\t\n"; - $this -> displayLabel(); + function getDisplay(){ + $return = $this -> getLabelInfos(); // value if (!$this -> isFreeze()) { - echo "\t\t\n"; - + $return['html'] = "\n"; } else { - echo "\t\t\n"; - + $return['html'] = "\n"; } - echo "\t\n"; + return $return; } - + + /* + * Retourne le code HTML d'un champ vide + * + * @retval string Code HTML d'un champ vide. + */ + function getEmptyField() { + $multiple = $this -> getMultipleData(); + return "\n".$multiple; + } + } ?> diff --git a/trunk/includes/class/class.LSformRule_alphanumeric.php b/trunk/includes/class/class.LSformRule_alphanumeric.php index f1801d6d..7ec64f50 100644 --- a/trunk/includes/class/class.LSformRule_alphanumeric.php +++ b/trunk/includes/class/class.LSformRule_alphanumeric.php @@ -37,6 +37,7 @@ class LSformRule_alphanumeric extends LSformRule { */ function validate ($value,$options=array()) { $regex = '/^[a-zA-Z0-9]+$/'; + $GLOBALS['LSsession'] -> loadLSclass('LSformRule_regex'); return LSformRule_regex :: validate($value,$regex); } diff --git a/trunk/includes/class/class.LSformRule_lettersonly.php b/trunk/includes/class/class.LSformRule_lettersonly.php index 79831067..17b3826b 100644 --- a/trunk/includes/class/class.LSformRule_lettersonly.php +++ b/trunk/includes/class/class.LSformRule_lettersonly.php @@ -37,6 +37,7 @@ class LSformRule_lettersonly extends LSformRule { */ function validate ($value,$options=array()) { $regex = '/^[a-zA-Z]+$/'; + $GLOBALS['LSsession'] -> loadLSclass('LSformRule_regex'); return LSformRule_regex :: validate($value,$regex); } diff --git a/trunk/includes/class/class.LSformRule_nonzero.php b/trunk/includes/class/class.LSformRule_nonzero.php index fd9e5e0d..53cb07e3 100644 --- a/trunk/includes/class/class.LSformRule_nonzero.php +++ b/trunk/includes/class/class.LSformRule_nonzero.php @@ -37,6 +37,7 @@ class LSformRule_nonzero extends LSformRule { */ function validate ($value,$options) { $regex = '/^-?[1-9][0-9]*/'; + $GLOBALS['LSsession'] -> loadLSclass('LSformRule_regex'); return LSformRule_regex :: validate($value,$regex); } diff --git a/trunk/includes/class/class.LSformRule_nopunctuation.php b/trunk/includes/class/class.LSformRule_nopunctuation.php index 3ab26d22..94d50a5c 100644 --- a/trunk/includes/class/class.LSformRule_nopunctuation.php +++ b/trunk/includes/class/class.LSformRule_nopunctuation.php @@ -37,6 +37,7 @@ class LSformRule_nopunctuation extends LSformRule { */ function validate ($value,$options=array()) { $regex = '/^[^().\/\*\^\?#!@$%+=,\"\'><~\[\]{}]+$/'; + $GLOBALS['LSsession'] -> loadLSclass('LSformRule_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 index c55446ee..13618c2d 100644 --- a/trunk/includes/class/class.LSformRule_numeric.php +++ b/trunk/includes/class/class.LSformRule_numeric.php @@ -37,6 +37,7 @@ class LSformRule_numeric extends LSformRule{ */ function validate ($value,$options=array()) { $regex = '/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/'; + $GLOBALS['LSsession'] -> loadLSclass('LSformRule_regex'); return LSformRule_regex :: validate($value,$regex); } diff --git a/trunk/includes/class/class.LSformRule_regex.php b/trunk/includes/class/class.LSformRule_regex.php index e45aa49d..cd88466c 100644 --- a/trunk/includes/class/class.LSformRule_regex.php +++ b/trunk/includes/class/class.LSformRule_regex.php @@ -49,7 +49,6 @@ class LSformRule_regex extends LSformRule { else { $regex=$option; } - debug("\n$value : $regex\n"); if (!preg_match($regex, $value)) { return false; } diff --git a/trunk/includes/class/class.LSldap.php b/trunk/includes/class/class.LSldap.php index d9f4b92a..66618e5c 100644 --- a/trunk/includes/class/class.LSldap.php +++ b/trunk/includes/class/class.LSldap.php @@ -64,7 +64,6 @@ 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; } @@ -219,6 +218,7 @@ class LSldap { $ret = $entry -> update(); if (Net_Ldap::isError($ret)) { $GLOBALS['LSerror'] -> addErrorCode(5,$dn); + debug('NetLdap-Error : '.$ret->getMessage()); } else { return true; @@ -229,7 +229,37 @@ class LSldap { return; } } - + + /** + * Test de bind + * + * Cette methode établie une connexion à l'annuaire Ldap et test un bind + * avec un login et un mot de passe passé en paramètre + * + * @author Benjamin Renard + * + * @retval boolean true si la connection à réussi, false sinon + */ + function checkBind($dn,$pwd) { + $config = $this -> config; + $config['binddn'] = $dn; + $config['bindpw'] = $pwd; + $cnx = Net_LDAP::connect($config); + if (Net_LDAP::isError($cnx)) { + return; + } + return true; + } + + /** + * Retourne l'état de la connexion Ldap + * + * @retval boolean True si le serveur est connecté, false sinon. + */ + function isConnected() { + return ($this -> cnx == NULL)?false:true; + } + } ?> diff --git a/trunk/includes/class/class.LSldapObject.php b/trunk/includes/class/class.LSldapObject.php index c3c53ad5..2a94a80f 100644 --- a/trunk/includes/class/class.LSldapObject.php +++ b/trunk/includes/class/class.LSldapObject.php @@ -20,6 +20,7 @@ ******************************************************************************/ +$GLOBALS['LSsession'] -> loadLSclass('LSattribute'); /** * Base d'un objet ldap @@ -51,16 +52,17 @@ 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') { - if(isset($GLOBALS['LSobjects'][$type_name])) - $this -> config = $GLOBALS['LSobjects'][$type_name]; - else { - $GLOBALS['LSerror'] -> addErrorCode(21); - return; - } + 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 { + $GLOBALS['LSerror'] -> addErrorCode(21); + return; + } } foreach($this -> config['attrs'] as $attr_name => $attr_config) { if(!$this -> attrs[$attr_name]=new LSattribute($attr_name,$attr_config,$this)) { @@ -131,7 +133,7 @@ class LSldapObject { * * @retval string Valeur descriptive d'affichage de l'objet */ - function getDisplayValue($spe) { + function getDisplayValue($spe='') { if ($spe=='') { $spe = $this -> getDisplayAttributes(); } @@ -169,6 +171,7 @@ class LSldapObject { * @retval LSform Le formulaire crée */ function getForm($idForm,$config=array()) { + $GLOBALS['LSsession'] -> loadLSclass('LSform'); $LSform = new LSform($this,$idForm); $this -> forms[$idForm] = array($LSform,$config); foreach($this -> attrs as $attr_name => $attr) { @@ -338,6 +341,11 @@ class LSldapObject { // Validation des valeurs de l'attribut if(is_array($vconfig)) { foreach($vconfig as $test) { + // Définition du basedn par défaut + if (!isset($test['basedn'])) { + $test['basedn']=$GLOBALS['LSsession']->topDn; + } + // Définition du message d'erreur if (!empty($test['msg'])) { $msg_error=getFData($test['msg'],$this,'getValue'); @@ -352,7 +360,7 @@ class LSldapObject { $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'); + $test_obj = new $test['object_type'](); $sfilter=$test_obj->getObjectFilter(); $sfilter='(&'.$sfilter; if($sfilter_user[0]=='(') { @@ -445,6 +453,7 @@ class LSldapObject { if(!empty($submitData)) { $dn=$this -> getDn(); if($dn) { + debug($submitData); return $GLOBALS['LSldap'] -> update($this -> type_name,$dn, $submitData); } else { @@ -777,7 +786,12 @@ class LSldapObject { return $retInfos; } - + + function searchObject($name,$basedn=NULL) { + $filter = $this -> config['rdn'].'='.$name; + return $this -> listObjects($filter,$basedn); + } + /** * Retourne une valeur de l'objet * @@ -799,6 +813,9 @@ class LSldapObject { if(($val=='dn')||($val=='%{dn}')) { return $this -> dn; } + else if(($val=='rdn')||($val=='%{rdn}')) { + return $this -> attrs[ $this -> config['rdn'] ] -> getValue(); + } else if(isset($this -> attrs[$val])){ if (method_exists($this -> attrs[$val],'getValue')) return $this -> attrs[$val] -> getValue(); @@ -812,7 +829,40 @@ class LSldapObject { return ' '; } } - + + /** + * Retourn une liste d'option pour un select d'un objet du même type + * + * @author Benjamin Renard + * + * @retval string HTML code + */ + function getSelectOptions() { + $list = $this -> listObjects(); + $display=''; + foreach($list as $object) { + $display.="\n"; + } + return $display; + } + + /** + * Retourn un tableau pour un select d'un objet du même type + * + * @author Benjamin Renard + * + * @retval array['dn','display'] + */ + function getSelectArray() { + $list = $this -> listObjects(); + $return=array(); + foreach($list as $object) { + $return['dn'][] = $object -> getDn(); + $return['display'][] = $object -> getDisplayValue(); + } + return $return; + } + /** * Retourne le DN de l'objet * @@ -829,11 +879,10 @@ class LSldapObject { } 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); + if( (isset($this -> config['rdn'])) && (isset($this -> attrs[$rdn_attr])) && (isset($this -> config['container_dn'])) && (isset($GLOBALS['LSsession']->topDn)) ) { $rdn_val=$this -> attrs[$rdn_attr] -> getUpdateData(); if (!empty($rdn_val)) { - return $rdn_attr.'='.$rdn_val[0].','.$this -> config['container_dn'].','.$GLOBALS['LSsession']['topDn']; + return $rdn_attr.'='.$rdn_val[0].','.$this -> config['container_dn'].','.$GLOBALS['LSsession']->topDn; } else { $GLOBALS['LSerror'] -> addErrorCode(32,$this -> config['rdn']); @@ -846,7 +895,16 @@ class LSldapObject { } } } - + + /** + * Retourne le type de l'objet + * + * @retval string Le type de l'objet ($this -> type_name) + */ + function getType() { + return $this -> type_name; + } + } ?> diff --git a/trunk/includes/class/class.LSobjects.LSeecompany.php b/trunk/includes/class/class.LSobjects.LSeecompany.php new file mode 100644 index 00000000..856fef54 --- /dev/null +++ b/trunk/includes/class/class.LSobjects.LSeecompany.php @@ -0,0 +1,48 @@ + + */ +class LSeecompany extends LSldapObject { + + /** + * Constructeur + * + * Cette methode construit l'objet et définis la configuration. + * + * @author Benjamin Renard + * + * @param[in] $config array La configuration de l'objet + * + * @retval boolean true si l'objet a été construit, false sinon. + * + * @see LSldapObject::LSldapObject() + */ + function LSeecompany ($config='auto') { + $this -> LSldapObject('LSeecompany',$config); + } +} + +?> diff --git a/trunk/includes/class/class.LSobjects.LSeegroup.php b/trunk/includes/class/class.LSobjects.LSeegroup.php new file mode 100644 index 00000000..c5beb67c --- /dev/null +++ b/trunk/includes/class/class.LSobjects.LSeegroup.php @@ -0,0 +1,48 @@ + + */ +class LSeegroup extends LSldapObject { + + /** + * Constructeur + * + * Cette methode construit l'objet et définis la configuration. + * + * @author Benjamin Renard + * + * @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); + } +} + +?> diff --git a/trunk/includes/class/class.LSobjects.LSeepeople.php b/trunk/includes/class/class.LSobjects.LSeepeople.php new file mode 100644 index 00000000..e24743b7 --- /dev/null +++ b/trunk/includes/class/class.LSobjects.LSeepeople.php @@ -0,0 +1,48 @@ + + */ +class LSeepeople extends LSldapObject { + + /** + * Constructeur + * + * Cette methode construit l'objet et définis la configuration. + * + * @author Benjamin Renard + * + * @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); + } +} + +?> diff --git a/trunk/includes/class/class.LSsession.php b/trunk/includes/class/class.LSsession.php new file mode 100644 index 00000000..0138f305 --- /dev/null +++ b/trunk/includes/class/class.LSsession.php @@ -0,0 +1,511 @@ + + */ +class LSsession { + + var $confDir = NULL; + var $ldapServer = NULL; + var $topDn = NULL; + var $LSuserObject = NULL; + var $dn = NULL; + var $rdn = NULL; + var $JSscripts = array(); + var $CssFiles = array(); + var $template = NULL; + + /** + * Constructeur + * + * @author Benjamin Renard + * + * @retval void + */ + function LSsession ($configDir=LS_DEFAULT_CONF_DIR) { + $this -> confDir = $configDir; + if ($this -> loadConfig()) { + $this -> startLSerror(); + } + else { + return; + } + } + + /* + * Chargement de la configuration + * + * Chargement des fichiers de configuration et création de l'objet Smarty. + * + * @author Benjamin Renard + * + * @retval true si tout c'est bien passé, false sinon + */ + function loadConfig() { + if (loadDir($this -> confDir, '^config\..*\.php$')) { + if ( @include_once $GLOBALS['LSconfig']['Smarty'] ) { + $GLOBALS['Smarty'] = new Smarty(); + return true; + } + else { + $GLOBALS['LSerror'] -> addErrorCode(1008); + return; + } + return true; + } + else { + return; + } + } + + /* + * Initialisation de la gestion des erreurs + * + * Création de l'objet LSerror + * + * @author Benjamin Renard loadLSclass('LSerror')) + return; + $GLOBALS['LSerror'] = new LSerror(); + return true; + } + + /* + * Chargement d'une classe d'LdapSaisie + * + * @param[in] $class Nom de la classe à charger (Exemple : LSeepeople) + * @param[in] $type (Optionnel) Type de classe à charger (Exemple : LSobjects) + * + * @author Benjamin Renard loadLSclass($object,'LSobjects')) + return; + if (!require_once( LS_OBJECTS_DIR . 'config.LSobjects.'.$object.'.php' )) + return; + return true; + } + + /* + * Chargement des objects LdapSaisie + * + * Chargement des LSobjects contenue dans la variable + * $GLOBALS['LSobjects']['loads'] + * + * @retval boolean true si le chargement a réussi, false sinon. + */ + function loadLSobjects() { + + $this -> loadLSclass('LSldapObject'); + + if(!is_array($GLOBALS['LSobjects']['loads'])) { + $GLOBALS['LSerror'] -> addErrorCode(1001,"LSobjects['loads']"); + return; + } + + foreach ($GLOBALS['LSobjects']['loads'] as $object) { + if ( !$this -> loadLSobject($object) ) + return; + } + return true; + } + + /* + * Chargement d'un addons d'LdapSaisie + * + * @param[in] $addon Nom de l'addon à charger (Exemple : samba) + * + * @author Benjamin Renard addErrorCode(1001,"LSaddons['loads']"); + return; + } + + foreach ($GLOBALS['LSaddons']['loads'] as $addon) { + $this -> loadLSaddon($addon); + if (!call_user_func('LSaddon_'. $addon .'_support')) { + $GLOBALS['LSerror'] -> addErrorCode(1002,$addon); + } + } + return true; + } + + /* + * Initialisation de la session LdapSaisie + * + * Initialisation d'une LSsession : + * - Authentification et activation du mécanisme de session de LdapSaisie + * - ou Chargement des paramètres de la session à partir de la variable + * $_SESSION['LSsession']. + * - ou Destruction de la session en cas de $_GET['LSsession_logout']. + * + * @retval boolean True si l'initialisation à réussi (utilisateur authentifié), false sinon. + */ + function startLSsession() { + $this -> loadLSobjects(); + $this -> loadLSaddons(); + session_start(); + + // Déconnexion + if (isset($_GET['LSsession_logout'])) { + session_destroy(); + unset($_SESSION['LSsession']); + } + + if(isset($_SESSION['LSsession'])) { + // Session existante + $this -> confDir = $_SESSION['LSsession'] -> confDir; + $this -> ldapServer = $_SESSION['LSsession'] -> ldapServer; + $this -> topDn = $_SESSION['LSsession'] -> topDn; + $this -> LSuserObject = $_SESSION['LSsession'] -> LSuserObject; + $this -> dn = $_SESSION['LSsession'] -> dn; + $this -> rdn = $_SESSION['LSsession'] -> rdn; + $GLOBALS['Smarty'] -> assign('LSsession_username',$this -> LSuserObject -> getDisplayValue()); + return $this -> LSldapConnect(); + } + else { + // Session inexistante + + if (isset($_POST['LSsession_user'])) { + if (isset($_POST['LSsession_ldapserver'])) { + $this -> setLdapServer($_POST['LSsession_ldapserver']); + } + else { + $this -> setLdapServer(0); + } + + // Connexion au serveur LDAP + if ($this -> LSldapConnect()) { + // topDn + if ( $_POST['LSsession_topDn'] != '' ){ + $this -> topDn = $_POST['LSsession_topDn']; + } + else { + $this -> topDn = $this -> ldapServer['ldap_config']['basedn']; + } + + if ( $this -> loadLSobject($this -> ldapServer['authobject']) ) { + $authobject = new $this -> ldapServer['authobject'](); + $result = $authobject -> searchObject($_POST['LSsession_user'],$_POST['LSsession_topDn']); + $nbresult=count($result); + if ($nbresult==0) { + // identifiant incorrect + debug('identifiant incorrect'); + $GLOBALS['LSerror'] -> addErrorCode(1006); + } + else if ($nbresult>1) { + // duplication d'authentité + $GLOBALS['LSerror'] -> addErrorCode(1007); + } + else { + if ( $this -> checkUserPwd($result[0],$_POST['LSsession_pwd']) ) { + // Authentification réussi + $this -> LSuserObject = $result[0]; + $this -> dn = $result[0]->getValue('dn'); + $this -> rdn = $_POST['LSsession_user']; + $this -> topDn = $_POST['LSsession_topDn']; + $GLOBALS['Smarty'] -> assign('LSsession_username',$this -> LSuserObject -> getDisplayValue()); + $_SESSION['LSsession']=$this; + return true; + } + else { + $GLOBALS['LSerror'] -> addErrorCode(1006); + debug('mdp incorrect'); + } + } + } + else { + $GLOBALS['LSerror'] -> addErrorCode(1010); + } + } + else { + $GLOBALS['LSerror'] -> addErrorCode(1009); + } + } + $this -> displayLoginForm(); + return; + } + } + + /* + * Définition du serveur Ldap de la session + * + * Définition du serveur Ldap de la session à partir de son ID dans + * le tableau $GLOBALS['LSconfig']['ldap_servers']. + * + * @param[in] integer Index du serveur Ldap + * + * @retval boolean True sinon false. + */ + function setLdapServer($id) { + if ( isset($GLOBALS['LSconfig']['ldap_servers'][$id]) ) { + $this -> ldapServer=$GLOBALS['LSconfig']['ldap_servers'][$id]; + return true; + } + else { + return; + } + } + + /* + * Connexion au serveur Ldap + * + * @retval boolean True sinon false. + */ + function LSldapConnect() { + if ($this -> ldapServer) { + include_once($GLOBALS['LSconfig']['NetLDAP']); + if (!$this -> loadLSclass('LSldap')) + return; + $GLOBALS['LSldap'] = new LSldap($this -> ldapServer['ldap_config']); + if ($GLOBALS['LSldap'] -> isConnected()) + return true; + else + return; + return $GLOBALS['LSldap'] = new LSldap($this -> ldapServer['ldap_config']); + } + else { + $GLOBALS['LSerror'] -> addErrorCode(1003); + return; + } + } + + + function getSubDnLdapServer() { + if ( isset($this ->ldapServer['subdnobject']) ) { + if( $this -> loadLSobject($this ->ldapServer['subdnobject']) ) { + if ($subdnobject = new $this ->ldapServer['subdnobject']()) { + return $subdnobject -> getSelectArray(); + } + else { + return; + } + } + else { + $GLOBALS['LSerror'] -> addErrorCode(1004,$this ->ldapServer['subdnobject']); + return; + } + } + else { + return; + } + } + + /* + * Retourne les options d'une liste déroulante pour le choix du topDn + * de connexion au serveur Ldap + * + * Liste les subdnobject ($this ->ldapServer['subdnobject']) + * + * @retval string Les options (