From 1c2991bc5b85d975e14ea8aa8ed78d91cd7aa7e0 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Thu, 5 Jun 2008 13:21:18 +0000 Subject: [PATCH] =?UTF-8?q?-=20Ajout=20d'un=20module=20de=20r=C3=A9cup?= =?UTF-8?q?=C3=A9ration=20de=20mot=20de=20passe=20(Feature=20Requests=20#1?= =?UTF-8?q?662)=20-=20Externalisation=20de=20la=20fonction=20generatePassw?= =?UTF-8?q?ord()=20-=20LSform=20:=20ajout=20de=20la=20m=C3=A9thode=20setPo?= =?UTF-8?q?stData()=20-=20LSsession=5Flogin.js=20:=20externalisation=20du?= =?UTF-8?q?=20code=20pour=20masque=20la=20s=C3=A9lection=20du=20niveau=20-?= =?UTF-8?q?=20LSformRule=20:=20externalisation=20de=20la=20fonction=20chec?= =?UTF-8?q?kMail()=20-=20debug=20:=20gestion=20de=20l'affichage=20de=20dum?= =?UTF-8?q?p=20d'objet=20-=20Mise=20=C3=A0=20jour=20de=20LSexample?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LSobjects/config.LSobjects.LSeepeople.php | 113 +--- trunk/conf/config.error_code.php | 76 +-- trunk/conf/config.inc.php | 17 +- trunk/includes/class/class.LSform.php | 29 + .../class/class.LSformElement_password.php | 22 +- .../class/class.LSformElement_text.php | 2 +- .../class/class.LSformElement_textarea.php | 2 +- .../includes/class/class.LSformRule_email.php | 15 +- trunk/includes/class/class.LSsession.php | 376 ++++++++++--- trunk/includes/functions.php | 47 +- trunk/includes/js/LSsession_login.js | 17 +- trunk/index.php | 3 - trunk/lsexample/ls.schema | 179 +----- trunk/lsexample/lsexample.ldif | 515 ++++-------------- trunk/lsexample/permissions-ls.conf | 232 ++------ trunk/lsexample/slapd.conf | 4 +- trunk/templates/css/login.css | 8 + trunk/templates/css/recoverpassword.css | 60 ++ trunk/templates/login.tpl | 2 + trunk/templates/recoverpassword.tpl | 41 ++ 20 files changed, 750 insertions(+), 1010 deletions(-) create mode 100644 trunk/templates/css/recoverpassword.css create mode 100644 trunk/templates/recoverpassword.tpl diff --git a/trunk/conf/LSobjects/config.LSobjects.LSeepeople.php b/trunk/conf/LSobjects/config.LSobjects.LSeepeople.php index c3c72aeb..f5f6dc8f 100644 --- a/trunk/conf/LSobjects/config.LSobjects.LSeepeople.php +++ b/trunk/conf/LSobjects/config.LSobjects.LSeepeople.php @@ -257,7 +257,8 @@ $GLOBALS['LSobjects']['LSeepeople'] = array ( 'required' => 1, 'check_data' => array ( 'email' => array( - 'msg' => _("L'adresse e-mail entrée n'est pas valide.") + 'msg' => _("L'adresse e-mail entrée n'est pas valide."), + 'param' => array('checkDomain' => false) ), ), 'rights' => array( @@ -293,100 +294,6 @@ $GLOBALS['LSobjects']['LSeepeople'] = array ( '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( - 'self' => 'w', - 'admin' => 'w' - ), - 'view' => 1, - 'form' => array ( - 'modify' => 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( - 'self' => 'w', - 'admin' => 'w', - 'user' => 'r' - ), - 'view' => 1, - 'form' => array ( - 'modify' => 1, - ), - 'possible_values' => array( - '' => 'Non', - '%{uid}@autoreponse.example.fr' => 'Oui' - ) - ), - 'vacationInfo' => array ( - 'label' => _('Message en reponse'), - 'ldap_type' => 'ascii', - 'html_type' => 'textarea', - 'multiple' => true, - 'rights' => array( - 'self' => 'w', - 'admin' => 'w' - ), - 'view' => 1, - 'form' => array ( - 'modify' => 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( - 'self' => 'w', - 'user' => 'r', - 'admin' => 'w' - ), - 'view' => 1, - 'form' => array ( - 'modify' => 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( - 'self' => 'r', - 'admin' => 'w' - ), - 'view' => 1, - 'form' => array ( - 'modify' => 1, - ) - ), 'description' => array ( 'label' => _('Description'), 'ldap_type' => 'ascii', @@ -423,7 +330,21 @@ $GLOBALS['LSobjects']['LSeepeople'] = array ( ), 'form' => array ( 'modify' => 1, - 'create' => 1 + 'create' => 1, + 'lostPassword' => 1 + ) + ), + 'lsRecoveryHash' => array ( + 'label' => _('Hash de recouvrement du mot de passe'), + 'ldap_type' => 'ascii', + 'html_type' => 'text', + 'required' => 0, + 'form' => array ( + 'lostPassword' => 1 + ), + 'rights' => array( + 'self' => 'w', + 'admin' => 'w' ) ), 'sambaLMPassword' => array ( diff --git a/trunk/conf/config.error_code.php b/trunk/conf/config.error_code.php index eb37f6f2..968a84f6 100644 --- a/trunk/conf/config.error_code.php +++ b/trunk/conf/config.error_code.php @@ -43,11 +43,11 @@ $GLOBALS['LSerror_code'] = array ( 'level' => 'c' ), 4 => array ( - 'msg' => _("LSldap : Erreur durant la récupération de l'entrée Ldap."), + '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})."), + 'msg' => _("LSldap : Erreur durant la mise à jour de l'entrée Ldap (DN : %{dn})."), 'level' => 'c' ), 6 => array ( @@ -73,43 +73,43 @@ $GLOBALS['LSerror_code'] = array ( '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."), + '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."), + '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é."), + '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."), + 'msg' => _("LSldapObject : L'attribut %{attr_depend} dépendant de l'attribut %{attr} n'existe pas."), 'level' => 'w' ), 35 => array ( @@ -127,11 +127,11 @@ $GLOBALS['LSerror_code'] = array ( '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 ( @@ -139,43 +139,43 @@ $GLOBALS['LSerror_code'] = array ( 'level' => 'c' ), 46 => array ( - 'msg' => _("LSattribute : La valeur de l'attribut %{attr} ne peut pas être générée."), + '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."), + '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."), + '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."), + '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."), + '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}'."), + '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."), + 'msg' => _("LSform : Les données du champ %{element} ne sont pas valides."), 'level' => 'c' ), 204 => array( @@ -187,16 +187,16 @@ $GLOBALS['LSerror_code'] = array ( 'level' => 'c' ), 206 => array( - 'msg' => _("LSform : Erreur durant la création de l'élement '%{element}'."), + '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}'."), + '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."), + 'msg' => _("LSformRule : Aucune regex n'a été fournis pour la validation des données."), 'level' => 'w' ), @@ -208,15 +208,15 @@ $GLOBALS['LSerror_code'] = array ( // LSsession 1001 => array ( - 'msg' => _("LSsession : La constante %{const} n'est pas définie."), + '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"), + '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."), + 'msg' => _("LSsession : Données de configuration du serveur LDAP invalide. Impossible d'établir une connexion."), 'level' => 'c' ), 1004 => array ( @@ -232,7 +232,7 @@ $GLOBALS['LSerror_code'] = array ( 'level' => 'c' ), 1007 => array ( - 'msg' => _("LSsession : Impossible de vous identifier : Duplication d'authentité."), + 'msg' => _("LSsession : Impossible de vous identifier : Duplication d'authentité."), 'level' => 'c' ), 1008 => array ( @@ -248,7 +248,7 @@ $GLOBALS['LSerror_code'] = array ( 'level' => 'c' ), 1011 => array ( - 'msg' => _("LSsession : Vous n'êtes pas authorisé à effectuer cette action."), + 'msg' => _("LSsession : Vous n'êtes pas authorisé à effectuer cette action."), 'level' => 'c' ), 1012 => array ( @@ -260,7 +260,7 @@ $GLOBALS['LSerror_code'] = array ( 'level' => 'c' ), 1014 => array ( - 'msg' => _("LSrelations : La fonction de mise à jour pour la relation %{relation} est inconnu."), + 'msg' => _("LSrelations : La fonction de mise à jour pour la relation %{relation} est inconnu."), 'level' => 'c' ), 1015 => array ( @@ -274,6 +274,18 @@ $GLOBALS['LSerror_code'] = array ( 1017 => array ( 'msg' => _("LSsession : Impossible de créer correctement la liste des niveaux. Vérifier la configuration."), 'level' => 'c' + ), + 1018 => array ( + 'msg' => _("LSsession : La récupération de mot de passe est désactivée pour ce serveur LDAP."), + 'level' => 'c' + ), + 1019 => array ( + 'msg' => _("LSsession : Des informations sont manquantes pour la récupération de votre mot de passe. Contactez l'administrateur du système."), + 'level' => 'c' + ), + 1020 => array ( + 'msg' => _("LSsession : Erreur durant la récupération de votre mot de passe. Contactez l'administrateur du système."), + 'level' => 'c' ) ); ?> diff --git a/trunk/conf/config.inc.php b/trunk/conf/config.inc.php index 546b8340..db231479 100644 --- a/trunk/conf/config.inc.php +++ b/trunk/conf/config.inc.php @@ -34,7 +34,7 @@ $GLOBALS['LSconfig'] = array( 'port' => 389, 'version' => 3, 'starttls' => false, - 'binddn' => 'uid=eeggs,ou=people,o=ls', + 'binddn' => 'uid=ldapsaisie,ou=sysaccounts,o=ls', 'bindpw' => 'toto', 'basedn' => 'o=ls', 'options' => array(), @@ -55,6 +55,21 @@ $GLOBALS['LSconfig'] = array( 'cacheLSrights' => false, 'authobject' => 'LSeepeople', 'authobject_pwdattr' => 'userPassword', + 'recoverPassword' => array( + 'mailAttr' => 'mail', + 'passwordAttr' => 'userPassword', + 'recoveryHashAttr' => 'lsRecoveryHash', + 'recoveryEmailSender' => 'noreply-recover@lsexample.net', + 'recoveryHashMail' => array( + 'subject' => 'LSexample : Récupération de votre mot de passe.', + 'msg' => "Pour poursuivre le processus de récupération de votre mot de passe,\nmerci de cliquer de vous rendre à l'adresse suivante :\n%{url}" + ), + 'newPasswordMail' => array( + 'subject' => 'LSexample : Votre nouveau mot de passe.', + 'msg' => "Votre nouveau mot de passe : %{mdp}" + ) + ), + 'emailSender' => 'noreply@lsexample.net', 'LSobjects' => array ( 'LSeepeople', 'LSeegroup', diff --git a/trunk/includes/class/class.LSform.php b/trunk/includes/class/class.LSform.php index ab5d91aa..ec2fac2b 100644 --- a/trunk/includes/class/class.LSform.php +++ b/trunk/includes/class/class.LSform.php @@ -266,6 +266,35 @@ class LSform { return; } + /** + * Défini arbitrairement des données en POST + * + * @author Benjamin Renard + * + * @param[in] $data array('attr' => array(values)) Tableau des données du formulaire + * @param[in] $consideredAsSubmit Définie si on force le formualaire comme envoyer + * + * @retval boolean true si les données ont été définies, false sinon + */ + function setPostData($data,$consideredAsSubmit=false) { + if (is_array($data)) { + foreach($data as $key => $values) { + if (!is_array($values)) { + $values = array($values); + } + $_POST[$key] = $values; + } + + if ($consideredAsSubmit) { + $_POST['validate']='LSform'; + $_POST['idForm']=$this -> idForm; + } + + return true; + } + return; + } + /** * Récupère les valeurs postées dans le formulaire * diff --git a/trunk/includes/class/class.LSformElement_password.php b/trunk/includes/class/class.LSformElement_password.php index 971611bb..b6661af8 100644 --- a/trunk/includes/class/class.LSformElement_password.php +++ b/trunk/includes/class/class.LSformElement_password.php @@ -96,7 +96,7 @@ class LSformElement_password extends LSformElement { } else { if (empty($this -> values)) { - $return['html'] = _('Aucunes valeur definie'); + $return['html'] = _('Aucune valeur definie'); } else { $return['html'] = "********"; @@ -107,25 +107,7 @@ class LSformElement_password extends LSformElement { } function generatePassword() { - if (isset($this -> params['html_options']['chars'])) { - $chars=$this -> params['html_options']['chars']; - } - else { - $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-'; - } - $nbChars=strlen($chars); - - if (isset($this -> params['html_options']['lenght'])) { - $lenght=$this -> params['html_options']['lenght']; - } - else { - $lenght=8; - } - $retVal=''; - for($i=0;$i<$lenght;$i++){ - $retVal.=$chars[rand(0,$nbChars-1)]; - } - return $retVal; + return generatePassword($this -> params['html_options']['chars'],$this -> params['html_options']['lenght']); } } diff --git a/trunk/includes/class/class.LSformElement_text.php b/trunk/includes/class/class.LSformElement_text.php index 0032e7fb..ca362ddb 100644 --- a/trunk/includes/class/class.LSformElement_text.php +++ b/trunk/includes/class/class.LSformElement_text.php @@ -59,7 +59,7 @@ class LSformElement_text extends LSformElement { else { $return['html'] = "