- Ajout d'un module de récupération de mot de passe (Feature Requests #1662)

- Externalisation de la fonction generatePassword()
- LSform : ajout de la méthode setPostData()
- LSsession_login.js : externalisation du code pour masque la sélection du niveau
- LSformRule : externalisation de la fonction checkMail()
- debug : gestion de l'affichage de dump d'objet
- Mise à jour de LSexample
This commit is contained in:
Benjamin Renard 2008-06-05 13:21:18 +00:00
parent 7d9399bffe
commit 1c2991bc5b
20 changed files with 750 additions and 1010 deletions

View file

@ -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 (

View file

@ -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'
)
);
?>

View file

@ -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',

View file

@ -266,6 +266,35 @@ class LSform {
return;
}
/**
* Défini arbitrairement des données en POST
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @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
*

View file

@ -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']);
}
}

View file

@ -59,7 +59,7 @@ class LSformElement_text extends LSformElement {
else {
$return['html'] = "<ul class='LSform'>\n";
if (empty($this -> values)) {
$return['html'] .= "<li>"._('Aucunes valeur definie')."</li>\n";
$return['html'] .= "<li>"._('Aucune valeur definie')."</li>\n";
}
else {
foreach ($this -> values as $value) {

View file

@ -57,7 +57,7 @@ class LSformElement_textarea extends LSformElement {
}
else {
if (empty($this -> values)) {
$return['html'].="<li class='LSform'>"._('Aucunes valeur definie')."</li>\n";
$return['html'].="<li class='LSform'>"._('Aucune valeur definie')."</li>\n";
}
else {
foreach ($this -> values as $value) {

View file

@ -38,20 +38,7 @@ class LSformRule_email extends LSformRule {
* @return boolean true si la valeur est valide, false sinon
*/
function validate($value,$option=array(),$formElement) {
$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;
return checkEmail($value,$option['param']['checkDomain']);
}
}

View file

@ -25,7 +25,7 @@ define('LS_DEFAULT_CONF_DIR','conf');
/**
* Gestion des sessions
*
* Cette classe gère les sessions d'utilisateurs.
* Cette classe gère les sessions d'utilisateurs.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*/
@ -67,11 +67,11 @@ class LSsession {
/**
* Chargement de la configuration
*
* Chargement des fichiers de configuration et création de l'objet Smarty.
* Chargement des fichiers de configuration et création de l'objet Smarty.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval true si tout c'est bien passé, false sinon
* @retval true si tout c'est bien passé, false sinon
*/
function loadConfig() {
if (loadDir($this -> confDir, '^config\..*\.php$')) {
@ -93,11 +93,11 @@ class LSsession {
/**
* Initialisation de la gestion des erreurs
*
* Création de l'objet LSerror
* Création de l'objet LSerror
*
* @author Benjamin Renard <brenard@easter-eggs.com
*
* @retval boolean true si l'initialisation a réussi, false sinon.
* @retval boolean true si l'initialisation a réussi, false sinon.
*/
function startLSerror() {
if(!$this -> loadLSclass('LSerror'))
@ -109,12 +109,12 @@ class LSsession {
/**
* 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)
* @param[in] $class Nom de la classe à charger (Exemple : LSeepeople)
* @param[in] $type (Optionnel) Type de classe à charger (Exemple : LSobjects)
*
* @author Benjamin Renard <brenard@easter-eggs.com
*
* @retval boolean true si le chargement a réussi, false sinon.
* @retval boolean true si le chargement a réussi, false sinon.
*/
function loadLSclass($class,$type='') {
if (class_exists($class))
@ -127,9 +127,9 @@ class LSsession {
/**
* Chargement d'un object LdapSaisie
*
* @param[in] $object Nom de l'objet à charger
* @param[in] $object Nom de l'objet à charger
*
* @retval boolean true si le chargement a réussi, false sinon.
* @retval boolean true si le chargement a réussi, false sinon.
*/
function loadLSobject($object) {
$this -> loadLSclass('LSldapObject');
@ -148,7 +148,7 @@ class LSsession {
* Chargement des LSobjects contenue dans la variable
* $this -> ldapServer['LSobjects']
*
* @retval boolean true si le chargement a réussi, false sinon.
* @retval boolean true si le chargement a réussi, false sinon.
*/
function loadLSobjects() {
@ -170,11 +170,11 @@ class LSsession {
/**
* Chargement d'un addons d'LdapSaisie
*
* @param[in] $addon Nom de l'addon à charger (Exemple : samba)
* @param[in] $addon Nom de l'addon à charger (Exemple : samba)
*
* @author Benjamin Renard <brenard@easter-eggs.com
*
* @retval boolean true si le chargement a réussi, false sinon.
* @retval boolean true si le chargement a réussi, false sinon.
*/
function loadLSaddon($addon) {
return require_once LS_ADDONS_DIR .'LSaddons.'.$addon.'.php';
@ -186,7 +186,7 @@ class LSsession {
* Chargement des LSaddons contenue dans la variable
* $GLOBALS['LSaddons']['loads']
*
* @retval boolean true si le chargement a réussi, false sinon.
* @retval boolean true si le chargement a réussi, false sinon.
*/
function loadLSaddons() {
if(!is_array($GLOBALS['LSaddons']['loads'])) {
@ -207,19 +207,19 @@ class LSsession {
* 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
* - 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.
* @retval boolean True si l'initialisation à réussi (utilisateur authentifié), false sinon.
*/
function startLSsession() {
$this -> loadLSaddons();
session_start();
// Déconnexion
if (isset($_GET['LSsession_logout'])) {
// Déconnexion
if (isset($_GET['LSsession_logout'])||isset($_GET['LSsession_recoverPassword'])) {
session_destroy();
if (is_array($_SESSION['LSsession']['tmp_file'])) {
@ -229,6 +229,10 @@ class LSsession {
unset($_SESSION['LSsession']);
}
// Récupération de mot de passe
if (isset($_GET['recoveryHash'])) {
$_POST['LSsession_user'] = 'a determiner plus tard';
}
if(isset($_SESSION['LSsession'])) {
// Session existante
@ -272,6 +276,7 @@ class LSsession {
}
else {
// Session inexistante
$recoveryPasswordInfos=array();
if (isset($_POST['LSsession_user'])) {
if (isset($_POST['LSsession_ldapserver'])) {
@ -297,32 +302,178 @@ class LSsession {
if ( $this -> loadLSobject($this -> ldapServer['authobject']) ) {
$authobject = new $this -> ldapServer['authobject']();
$result = $authobject -> searchObject($_POST['LSsession_user'],$this -> topDn);
$nbresult=count($result);
$find=true;
if (isset($_GET['recoveryHash'])) {
$filter=$this -> ldapServer['recoverPassword']['recoveryHashAttr']."=".$_GET['recoveryHash'];
$result = $authobject -> listObjects($filter,$this -> topDn);
$nbresult=count($result);
if ($nbresult==1) {
$_POST['LSsession_user'] = $result[0] -> getValue('rdn');
$find=false;
}
}
if ($find) {
$result = $authobject -> searchObject($_POST['LSsession_user'],$this -> topDn);
$nbresult=count($result);
}
if ($nbresult==0) {
// identifiant incorrect
debug('identifiant incorrect');
$GLOBALS['LSerror'] -> addErrorCode(1006);
}
else if ($nbresult>1) {
// duplication d'authentité
// 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 -> loadLSrights();
$this -> loadLSaccess();
$GLOBALS['Smarty'] -> assign('LSsession_username',$this -> LSuserObject -> getDisplayValue());
$_SESSION['LSsession']=get_object_vars($this);
return true;
if (isset($_GET['LSsession_recoverPassword'])) {
debug('Recover : Id trouvé');
if ($this -> ldapServer['recoverPassword']) {
debug('Récupération active');
$user=$result[0];
$emailAddress = $user -> getValue($this -> ldapServer['recoverPassword']['mailAttr']);
// Header des mails
$headers="Content-Type: text/plain; charset=UTF-8; format=flowed";
if ($this -> ldapServer['recoverPassword']['recoveryEmailSender']) {
$headers.="\nFrom: ".$this -> ldapServer['recoverPassword']['recoveryEmailSender'];
}
else if($this -> ldapServer['emailSender']) {
$headers.="\nFrom: ".$this -> ldapServer['emailSender'];
}
if (checkEmail($emailAddress)) {
debug('Email : '.$emailAddress);
$this -> dn = $user -> getDn();
// 1ère étape : envoie du recoveryHash
if (!isset($_GET['recoveryHash'])) {
// Generer un hash
$recovery_hash = md5($user -> getValue('rdn') . strval(time()) . strval(rand()));
$lostPasswdForm = $user -> getForm('lostPassword');
$lostPasswdForm -> setPostData(
array(
$this -> ldapServer['recoverPassword']['recoveryHashAttr'] => $recovery_hash
)
,true
);
if($lostPasswdForm -> validate()) {
if ($user -> updateData('lostPassword')) {
// recoveryHash de l'utilisateur mis à jour
if ($_SERVER['HTTPS']=='on') {
$recovery_url='https://';
}
else {
$recovery_url='http://';
}
$recovery_url .= $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'&recoveryHash='.$recovery_hash;
if (
mail(
$emailAddress,
$this -> ldapServer['recoverPassword']['recoveryHashMail']['subject'],
getFData($this -> ldapServer['recoverPassword']['recoveryHashMail']['msg'],$recovery_url),
$headers
)
){
// Mail a bien été envoyé
$recoveryPasswordInfos['recoveryHashMail']=$emailAddress;
}
else {
// Problème durant l'envoie du mail
debug("Problème durant l'envoie du mail");
$GLOBALS['LSerror'] -> addErrorCode(1020);
}
}
else {
// Erreur durant la mise à jour de l'objet
debug("Erreur durant la mise à jour de l'objet");
$GLOBALS['LSerror'] -> addErrorCode(1020);
}
}
else {
// Erreur durant la validation du formulaire de modification de perte de password
debug("Erreur durant la validation du formulaire de modification de perte de password");
$GLOBALS['LSerror'] -> addErrorCode(1020);
}
}
// 2nd étape : génération du mot de passe + envoie par mail
else {
$attr=$user -> attrs[$this -> ldapServer['recoverPassword']['passwordAttr']];
if ($attr instanceof LSattribute) {
$mdp = generatePassword($attr -> config['html_options']['chars'],$attr -> config['html_options']['lenght']);
debug('Nvx mpd : '.$mdp);
$lostPasswdForm = $user -> getForm('lostPassword');
$lostPasswdForm -> setPostData(
array(
$this -> ldapServer['recoverPassword']['recoveryHashAttr'] => array(''),
$this -> ldapServer['recoverPassword']['passwordAttr'] => array($mdp)
)
,true
);
if($lostPasswdForm -> validate()) {
if ($user -> updateData('lostPassword')) {
if (
mail(
$emailAddress,
$this -> ldapServer['recoverPassword']['newPasswordMail']['subject'],
getFData($this -> ldapServer['recoverPassword']['newPasswordMail']['msg'],$mdp),
$headers
)
){
// Mail a bien été envoyé
$recoveryPasswordInfos['newPasswordMail']=$emailAddress;
}
else {
// Problème durant l'envoie du mail
debug("Problème durant l'envoie du mail");
$GLOBALS['LSerror'] -> addErrorCode(1020);
}
}
else {
// Erreur durant la mise à jour de l'objet
debug("Erreur durant la mise à jour de l'objet");
$GLOBALS['LSerror'] -> addErrorCode(1020);
}
}
else {
// Erreur durant la validation du formulaire de modification de perte de password
debug("Erreur durant la validation du formulaire de modification de perte de password");
$GLOBALS['LSerror'] -> addErrorCode(1020);
}
}
else {
// l'attribut password n'existe pas
debug("L'attribut password n'existe pas");
$GLOBALS['LSerror'] -> addErrorCode(1020);
}
}
}
else {
$GLOBALS['LSerror'] -> addErrorCode(1019);
}
}
else {
$GLOBALS['LSerror'] -> addErrorCode(1018);
}
}
else {
$GLOBALS['LSerror'] -> addErrorCode(1006);
debug('mdp incorrect');
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 -> loadLSrights();
$this -> loadLSaccess();
$GLOBALS['Smarty'] -> assign('LSsession_username',$this -> LSuserObject -> getDisplayValue());
$_SESSION['LSsession']=get_object_vars($this);
return true;
}
else {
$GLOBALS['LSerror'] -> addErrorCode(1006);
debug('mdp incorrect');
}
}
}
}
@ -338,15 +489,20 @@ class LSsession {
$GLOBALS['Smarty'] -> assign('ldapServerId',$this -> ldapServerId);
}
$GLOBALS['Smarty'] -> assign('topDn',$this -> topDn);
$this -> displayLoginForm();
if (isset($_GET['LSsession_recoverPassword'])) {
$this -> displayRecoverPasswordForm($recoveryPasswordInfos);
}
else {
$this -> displayLoginForm();
}
return;
}
}
/**
* Définition du serveur Ldap de la session
* Définition du serveur Ldap de la session
*
* Définition du serveur Ldap de la session à partir de son ID dans
* 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
@ -440,12 +596,12 @@ class LSsession {
}
/**
* Retourne les options d'une liste déroulante pour le choix du topDn
* Retourne les options d'une liste déroulante pour le choix du topDn
* de connexion au serveur Ldap
*
* Liste les subdn ($this ->ldapServer['subDn'])
*
* @retval string Les options (<option>) pour la sélection du topDn.
* @retval string Les options (<option>) pour la sélection du topDn.
*/
function getSubDnLdapServerOptions($selected=NULL) {
$list = $this -> getSubDnLdapServer();
@ -483,9 +639,9 @@ class LSsession {
* Test un bind sur le serveur avec le dn de l'objet et le mot de passe fourni.
*
* @param[in] LSobject L'object "user" pour l'authentification
* @param[in] string Le mot de passe à tester
* @param[in] string Le mot de passe à tester
*
* @retval boolean True si l'authentification à ussi, false sinon.
* @retval boolean True si l'authentification à réussi, false sinon.
*/
function checkUserPwd($object,$pwd) {
return $GLOBALS['LSldap'] -> checkBind($object -> getValue('dn'),$pwd);
@ -494,7 +650,7 @@ class LSsession {
/**
* Affiche le formulaire de login
*
* Défini les informations pour le template Smarty du formulaire de login.
* Défini les informations pour le template Smarty du formulaire de login.
*
* @retval void
*/
@ -523,12 +679,72 @@ class LSsession {
$GLOBALS['Smarty'] -> assign('loginform_label_user',_('Identifiant'));
$GLOBALS['Smarty'] -> assign('loginform_label_pwd',_('Mot de passe'));
$GLOBALS['Smarty'] -> assign('loginform_label_submit',_('Connexion'));
$GLOBALS['Smarty'] -> assign('loginform_label_lostpassword',_('Mot de passe oublié ?'));
$this -> setTemplate('login.tpl');
$this -> addJSscript('LSsession_login.js');
}
/**
* Défini le template Smarty à utiliser
* Affiche le formulaire de récupération de mot de passe
*
* Défini les informations pour le template Smarty du formulaire de
* récupération de mot de passe
*
* @param[in] $infos array() Information sur le status du processus de
* recouvrement de mot de passe
*
* @retval void
*/
function displayRecoverPasswordForm($recoveryPasswordInfos) {
$GLOBALS['Smarty'] -> assign('pagetitle',_('Récupération de votre mot de passe'));
$GLOBALS['Smarty'] -> assign('recoverpasswordform_action','index.php?LSsession_recoverPassword');
if (count($GLOBALS['LSconfig']['ldap_servers'])==1) {
$GLOBALS['Smarty'] -> assign('recoverpasswordform_ldapserver_style','style="display: none"');
}
$GLOBALS['Smarty'] -> assign('recoverpasswordform_label_ldapserver',_('Serveur LDAP'));
$ldapservers_name=array();
$ldapservers_index=array();
foreach($GLOBALS['LSconfig']['ldap_servers'] as $id => $infos) {
$ldapservers_index[]=$id;
$ldapservers_name[]=$infos['name'];
}
$GLOBALS['Smarty'] -> assign('recoverpasswordform_ldapservers_name',$ldapservers_name);
$GLOBALS['Smarty'] -> assign('recoverpasswordform_ldapservers_index',$ldapservers_index);
$GLOBALS['Smarty'] -> assign('recoverpasswordform_label_user',_('Identifiant'));
$GLOBALS['Smarty'] -> assign('recoverpasswordform_label_submit',_('Valider'));
$GLOBALS['Smarty'] -> assign('recoverpasswordform_label_back',_('Retour'));
if (isset($recoveryPasswordInfos['recoveryHashMail'])) {
$GLOBALS['Smarty'] -> assign(
'recoverpassword_msg',
getFData(
_("Un mail vient de vous être envoyé à l'adresse %{mail}. " .
"Merci de suivre les indications contenus dans ce mail."),
$recoveryPasswordInfos['recoveryHashMail']
)
);
}
if (isset($recoveryPasswordInfos['newPasswordMail'])) {
$GLOBALS['Smarty'] -> assign(
'recoverpassword_msg',
getFData(
_("Votre nouveau mot de passe vient de vous être envoyé à l'adresse %{mail}. "),
$recoveryPasswordInfos['newPasswordMail']
)
);
}
$this -> setTemplate('recoverpassword.tpl');
$this -> addJSscript('LSsession_recoverpassword.js');
}
/**
* Défini le template Smarty à utiliser
*
* Remarque : les fichiers de templates doivent se trouver dans le dossier
* templates/.
@ -544,9 +760,9 @@ class LSsession {
/**
* Ajoute un script JS au chargement de la page
*
* Remarque : les scripts doivents être dans le dossier LS_JS_DIR.
* Remarque : les scripts doivents être dans le dossier LS_JS_DIR.
*
* @param[in] $script Le nom du fichier de script à charger.
* @param[in] $script Le nom du fichier de script à charger.
*
* @retval void
*/
@ -559,9 +775,9 @@ class LSsession {
/**
* Ajoute une feuille de style au chargement de la page
*
* Remarque : les scripts doivents être dans le dossiers templates/css/.
* Remarque : les scripts doivents être dans le dossiers templates/css/.
*
* @param[in] $script Le nom du fichier css à charger.
* @param[in] $script Le nom du fichier css à charger.
*
* @retval void
*/
@ -572,7 +788,7 @@ class LSsession {
/**
* Affiche le template Smarty
*
* Charge les dépendances et affiche le template Smarty
* Charge les dépendances et affiche le template Smarty
*
* @retval void
*/
@ -631,7 +847,7 @@ class LSsession {
/**
* Charge les droits LS de l'utilisateur
*
* @retval boolean True si le chargement à ussi, false sinon.
* @retval boolean True si le chargement à réussi, false sinon.
**/
function loadLSrights() {
if (is_array($this -> ldapServer['LSadmins'])) {
@ -650,11 +866,11 @@ class LSsession {
}
}
else {
debug('Impossible de chargé le dn : '.$dn);
debug('Impossible de chargé le dn : '.$dn);
}
}
else {
debug('Impossible de créer l\'objet de type : '.$conf['LSobject']);
debug('Impossible de créer l\'objet de type : '.$conf['LSobject']);
}
}
else {
@ -682,7 +898,7 @@ class LSsession {
}
/**
* Charge les droits d'accès de l'utilisateur pour construire le menu de l'interface
* Charge les droits d'accès de l'utilisateur pour construire le menu de l'interface
*
* @retval void
*/
@ -710,7 +926,7 @@ class LSsession {
}
/**
* Dit si l'utilisateur est admin de le DN spécifié
* Dit si l'utilisateur est admin de le DN spécifié
*
* @param[in] string DN de l'objet
*
@ -729,11 +945,11 @@ class LSsession {
}
/**
* Retourne qui est l'utilisateur par rapport à l'object
* Retourne qui est l'utilisateur par rapport à l'object
*
* @param[in] string Le DN de l'objet
*
* @retval string 'admin'/'self'/'user' pour Admin , l'utilisateur lui même ou un simple utilisateur
* @retval string 'admin'/'self'/'user' pour Admin , l'utilisateur lui même ou un simple utilisateur
*/
function whoami($dn) {
if ($this -> isAdmin($dn)) {
@ -748,14 +964,14 @@ class LSsession {
}
/**
* Retourne le droit de l'utilisateur à accèder à un objet
* Retourne le droit de l'utilisateur à accèder à un objet
*
* @param[in] string $LSobject Le type de l'objet
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
* @param[in] string $right Le type de droit d'accès à tester ('r'/'w')
* @param[in] string $attr Le nom de l'attribut auquel on test l'accès
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
* @param[in] string $right Le type de droit d'accès à tester ('r'/'w')
* @param[in] string $attr Le nom de l'attribut auquel on test l'accès
*
* @retval boolean True si l'utilisateur a accès, false sinon
* @retval boolean True si l'utilisateur a accès, false sinon
*/
function canAccess($LSobject,$dn=NULL,$right=NULL,$attr=NULL) {
if (!$this -> loadLSobject($LSobject))
@ -812,49 +1028,49 @@ class LSsession {
}
/**
* Retourne le droit de l'utilisateur à editer à un objet
* Retourne le droit de l'utilisateur à editer à un objet
*
* @param[in] string $LSobject Le type de l'objet
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
* @param[in] string $attr Le nom de l'attribut auquel on test l'accès
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
* @param[in] string $attr Le nom de l'attribut auquel on test l'accès
*
* @retval boolean True si l'utilisateur a accès, false sinon
* @retval boolean True si l'utilisateur a accès, false sinon
*/
function canEdit($LSobject,$dn=NULL,$attr=NULL) {
return $this -> canAccess($LSobject,$dn,'w',$attr);
}
/**
* Retourne le droit de l'utilisateur à supprimer un objet
* Retourne le droit de l'utilisateur à supprimer un objet
*
* @param[in] string $LSobject Le type de l'objet
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
*
* @retval boolean True si l'utilisateur a accès, false sinon
* @retval boolean True si l'utilisateur a accès, false sinon
*/
function canRemove($LSobject,$dn) {
return $this -> canAccess($LSobject,$dn,'w','rdn');
}
/**
* Retourne le droit de l'utilisateur à créer un objet
* Retourne le droit de l'utilisateur à créer un objet
*
* @param[in] string $LSobject Le type de l'objet
*
* @retval boolean True si l'utilisateur a accès, false sinon
* @retval boolean True si l'utilisateur a accès, false sinon
*/
function canCreate($LSobject) {
return $this -> canAccess($LSobject,NULL,'w','rdn');
}
/**
* Retourne le droit de l'utilisateur à gérer la relation d'objet
* Retourne le droit de l'utilisateur à gérer la relation d'objet
*
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
* @param[in] string $relationName Le nom de la relation avec l'objet
* @param[in] string $right Le type de droit a vérifier ('r' ou 'w')
* @param[in] string $right Le type de droit a vérifier ('r' ou 'w')
*
* @retval boolean True si l'utilisateur a accès, false sinon
* @retval boolean True si l'utilisateur a accès, false sinon
*/
function relationCanAccess($dn,$relationName,$right=NULL) {
$LSobject=$this -> LSuserObject -> getType();
@ -876,12 +1092,12 @@ class LSsession {
}
/**
* Retourne le droit de l'utilisateur à modifier la relation d'objet
* Retourne le droit de l'utilisateur à modifier la relation d'objet
*
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
* @param[in] string $dn Le DN de l'objet (le container_dn du type de l'objet par défaut)
* @param[in] string $relationName Le nom de la relation avec l'objet
*
* @retval boolean True si l'utilisateur a accès, false sinon
* @retval boolean True si l'utilisateur a accès, false sinon
*/
function relationCanEdit($dn,$relationName) {
return $this -> relationCanAccess($dn,$relationName,'w');
@ -922,8 +1138,8 @@ class LSsession {
/**
* Retourne le chemin du fichier temporaire
*
* Retourne le chemin du fichier temporaire qu'il créera à partir de la valeur
* s'il n'existe pas déjà.
* Retourne le chemin du fichier temporaire qu'il créera à partir de la valeur
* s'il n'existe pas déjà.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*

View file

@ -112,7 +112,7 @@ function return_data($data) {
function debug($data,$get=true) {
if ($get) {
if (is_array($data)) {
if (is_array($data)||is_object($data)) {
$GLOBALS['LSdebug']['fields'][]=$data;
}
else {
@ -126,7 +126,7 @@ function debug_print($return=false) {
if (( $GLOBALS['LSdebug']['fields'] ) && ( $GLOBALS['LSdebug']['active'] )) {
$txt='<ul>';
foreach($GLOBALS['LSdebug']['fields'] as $debug) {
if (is_array($debug)) {
if (is_array($debug)||is_object($debug)) {
$txt.='<li><pre>'.print_r($debug,true).'</pre></li>';
}
else {
@ -135,11 +135,11 @@ function debug_print($return=false) {
}
$txt.='</ul>';
$GLOBALS['Smarty'] -> assign('LSdebug',$txt);
if ($return) {
return $txt;
}
if ($return) {
return $txt;
}
}
return;
return;
}
/**
@ -224,4 +224,39 @@ function debug_print($return=false) {
return $basedn;
}
function checkEmail($value,$checkDns=true) {
$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)) {
debug('checkEmail : regex fail');
return false;
}
if ($checkDns && function_exists('checkdnsrr')) {
$tokens = explode('@', $value);
if (!(checkdnsrr($tokens[1], 'MX') || checkdnsrr($tokens[1], 'A'))) {
debug('checkEmail : DNS fail');
return false;
}
}
return true;
}
function generatePassword($chars=NULL,$lenght=NULL) {
if (!$chars) {
$chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';
}
$nbChars=strlen($chars);
if (!$lenght) {
$lenght=8;
}
$retVal='';
for($i=0;$i<$lenght;$i++){
$retVal.=$chars[rand(0,$nbChars-1)];
}
return $retVal;
}
?>

View file

@ -43,6 +43,7 @@ var LSsession_login = new Class({
}
if (data.LSerror) {
varLSdefault.displayError(data.LSerror);
this.loginformLevelHide();
return;
}
if (data.list_topDn) {
@ -53,18 +54,20 @@ var LSsession_login = new Class({
});
}
else {
$$('.loginform-level').each(function(el) {
el.setStyle('display','none');
});
this.loginformLevelHide();
}
}
else {
$$('.loginform-level').each(function(el) {
el.setStyle('display','none');
});
$('LSsession_topDn').empty();
this.loginformLevelHide();
}
this.enableInput();
},
loginformLevelHide: function(){
$$('.loginform-level').each(function(el) {
el.setStyle('display','none');
});
$('LSsession_topDn').empty();
}
});
window.addEvent(window.ie ? 'load' : 'domready', function() {

View file

@ -33,9 +33,6 @@ if($LSsession -> startLSsession()) {
// Template
$GLOBALS['LSsession'] -> setTemplate('accueil.tpl');
}
else {
$GLOBALS['LSsession'] -> setTemplate('login.tpl');
}
// Affichage des retours d'erreurs
$GLOBALS['LSsession'] -> displayTemplate();

View file

@ -1,175 +1,48 @@
# Easter-eggs OID: 1.3.6.1.4.1.10650
# 1.3.6.1.4.1.10650.2 LDAP OID
# 1.3.6.1.4.1.10650.3 Customers OID
#
# 1.3.6.1.4.1.10650.2.1 Ldap Attributes
# 1.3.6.1.4.1.10650.2.1.1 Admin sys Ldap Attributes
# 1.3.6.1.4.1.10650.2.1.2 Dev Ldap Attributes
# 1.3.6.1.4.1.10650.2.1.3 Global Attributes
# 1.3.6.1.4.1.10650.2.2 Ldap Objectclass
# 1.3.6.1.4.1.10650.2.2.1 Admin sys Ldap Objectclass
# 1.3.6.1.4.1.10650.2.2.2 Dev Ldap Objectclass
# 1.3.6.1.4.1.10650.2.2.3 Global OC
# LdapSaisie - LDAP Schema - Example
# Web Site : http://ldapsaisie.labs.libre-entreprise.org
objectIdentifier EeRoot 1.3.6.1.4.1.10650
objectIdentifier LeRoot EeRoot:4
objectIdentifier LsRoot LeRoot:10000
objectIdentifier LsLDAP LsRoot:2
objectIdentifier LsLDAPAttribute LsLDAP:1
objectIdentifier LsLDAPObjectClass LsLDAP:2
# Ost
# 1.3.6.1.4.1.10650.3.1127.2.1 Ldap attributes
# 1.3.6.1.4.1.10650.3.1127.2.2 Ldap OC
# <Ee attributes>
attributetype (1.3.6.1.4.1.10650.2.1.1.1
NAME 'eeallowedservices'
# <Ls attributes>
attributetype (LsLDAPAttribute:1
NAME 'lsAllowedServices'
DESC 'List of allowed services'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
# </Ee attributes>
attributetype ( LsLDAPAttribute:2 NAME 'lsRecoveryHash'
DESC 'Password Recover Hash'
EQUALITY caseIgnoreMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15)
# </Ls attributes>
# <From qmail schema>
attributetype ( 1.3.6.1.4.1.7914.1.2.1.4 NAME 'mailAlternateAddress'
SUBSTR caseIgnoreSubstringsMatch
DESC 'Secondary (alias) mailaddresses for the same user'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
attributetype ( 1.3.6.1.4.1.7914.1.2.1.7 NAME 'mailForwardingAddress'
DESC 'Address(es) to forward all incoming messages to.'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
# </From qmail schema>
# <From courier.schema>
attributetype ( 1.3.6.1.4.1.10018.1.1.1 NAME 'mailbox'
DESC 'The absolute path to the mailbox for a mail account in a non-default location'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
attributetype ( 1.3.6.1.4.1.10018.1.1.4 NAME 'maildrop'
DESC 'RFC822 Mailbox - mail alias'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
# </From courier.schema>
# <From postfix>
attributetype ( 1.3.6.1.4.1.7914.1.2.1.5 NAME 'mailQuota'
DESC 'The amount of space the user can use until all further messages get bounced.'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.44
SINGLE-VALUE )
# </From postfix>
# <From gnarwl>
# Original
#attributetype ( 1.3.6.1.4.1.11048.1.1.1.1
# NAME 'vacationActive'
# SINGLE-VALUE
# EQUALITY booleanMatch
# DESC 'A flag, for marking the user as being away'
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )
# Ee
attributetype ( 1.3.6.1.4.1.11048.1.1.1.1
NAME 'vacationActive'
SINGLE-VALUE
DESC 'Equal to uid@autoreponse.foo.bar, for marking the user as being away'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
attributetype ( 1.3.6.1.4.1.11048.1.1.1.3
NAME 'vacationInfo'
SINGLE-VALUE
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
DESC 'Absentee note to leave behind, while on vacation'
EQUALITY octetStringMatch )
attributetype ( 1.3.6.1.4.1.11048.1.1.1.4
NAME 'vacationStart'
SINGLE-VALUE
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
DESC 'Beginning of vacation'
EQUALITY octetStringMatch )
# Original
#attributetype ( 1.3.6.1.4.1.11048.1.1.1.5
# NAME 'vacationEnd'
# SINGLE-VALUE
# SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
# DESC 'End of vacation'
# EQUALITY octetStringMatch )
# Ee
attributetype ( 1.3.6.1.4.1.11048.1.1.1.5
NAME 'vacationEnd'
SINGLE-VALUE
SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
DESC 'End of vacation'
ORDERING generalizedTimeOrderingMatch
EQUALITY generalizedTimeMatch )
attributetype (1.3.6.1.4.1.11048.1.1.1.10
NAME 'vacationForward'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}
DESC 'Where to forward mails to, while on vacation' )
# </From gnarwl>
## Objectclasses
# LS people
objectclass (1.3.6.1.4.1.10650.3.1127.2.2.1
# <Ls Objectclass>
objectclass (LsLDAPObjectClass:1
NAME 'lspeople'
DESC 'LS people Objectclass'
STRUCTURAL
MUST ( uid $ cn )
MAY ( jpegPhoto $ sn $ givenName $ postalAddress $ postalCode $ l $ st $ c $ telephoneNumber $ mobile $ fax $ mail $ mailalternateaddress $ personalTitle $ description $ userPassword $ eeallowedservices $ mailforwardingaddress $ maildrop $ mailquota $ mailbox $ vacationActive $ vacationInfo $ vacationEnd $ vacationForward ))
MAY ( jpegPhoto $ sn $ givenName $ postalAddress $ postalCode $ l $ st $ c $
telephoneNumber $ mobile $ fax $ mail $ personalTitle $ description $
userPassword $ lsallowedservices $ lsRecoveryHash ))
# LS Alias
objectclass (1.3.6.1.4.1.10650.3.1127.2.2.2
NAME 'lsalias'
DESC 'LS alias Objectclass'
STRUCTURAL
MUST ( mail $ maildrop )
MAY ( mailalternateaddress $ description ))
# LS group
objectclass (1.3.6.1.4.1.10650.3.1127.2.2.3
objectclass (LsLDAPObjectClass:3
NAME 'lsgroup'
DESC 'LS group Objectclass'
STRUCTURAL
MUST ( cn )
MAY ( uniquemember $ description ))
# LS system account
objectclass (1.3.6.1.4.1.10650.3.1127.2.2.4
objectclass (LsLDAPObjectClass:4
NAME 'lssysaccount'
DESC 'LS system account Objectclass'
STRUCTURAL
MUST ( uid )
MAY (userpassword $ description))
# Ost mailbox
objectclass (1.3.6.1.4.1.10650.3.1127.2.2.5
NAME 'lsmailbox'
DESC 'LS custom mailbox Objectclass'
STRUCTURAL
MUST ( uid )
MAY ( userPassword $ description $ eeallowedservices $ maildrop $ mailbox $ mail $ mailalternateaddress $ mailforwardingaddress $ mailquota ))
# Ost computer
objectclass (1.3.6.1.4.1.10650.3.1127.2.2.6
NAME 'lscomputer'
DESC 'LS computer Objectclass'
STRUCTURAL
MUST ( uid ))
# Ost samba domains
objectclass (1.3.6.1.4.1.10650.3.1127.2.2.8
NAME 'lssambadomain'
DESC 'LS samba domain Objectclass'
STRUCTURAL)
MAY (userPassword $ description))
# </Ls Objectclass>

View file

@ -3,110 +3,39 @@ objectClass: top
objectClass: organization
o: ls
structuralObjectClass: organization
entryUUID: 2229e388-825b-1029-838c-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111624Z
modifyTimestamp: 20050706111624Z
entryCSN: 20050706111624.000000Z#000001#000#000000
dn: ou=sysaccounts,o=ls
objectClass: top
objectClass: organizationalUnit
ou: sysaccounts
structuralObjectClass: organizationalUnit
entryUUID: 2238a738-825b-1029-838d-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111624Z
modifyTimestamp: 20050706111624Z
entryCSN: 20050706111624.000000Z#000002#000#000000
dn: ou=people,o=ls
dn: uid=mail,ou=sysaccounts,o=ls
objectClass: top
objectClass: organizationalUnit
ou: people
structuralObjectClass: organizationalUnit
entryUUID: 223b67e8-825b-1029-838e-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111624Z
modifyTimestamp: 20050706111624Z
entryCSN: 20050706111624.000000Z#000003#000#000000
objectClass: lssysaccount
uid: mail
structuralObjectClass: lssysaccount
userPassword: toto
dn: ou=mailboxes,o=ls
dn: uid=samba,ou=sysaccounts,o=ls
objectClass: top
objectClass: organizationalUnit
ou: mailboxes
structuralObjectClass: organizationalUnit
entryUUID: 2240f622-825b-1029-8390-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111624Z
modifyTimestamp: 20050706111624Z
entryCSN: 20050706111624.000000Z#000005#000#000000
objectClass: lssysaccount
uid: samba
structuralObjectClass: lssysaccount
userPassword: toto
dn: ou=aliases,o=ls
dn: uid=ldapsaisie,ou=sysaccounts,o=ls
objectClass: top
objectClass: organizationalUnit
ou: aliases
structuralObjectClass: organizationalUnit
entryUUID: 2243b88a-825b-1029-8391-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111624Z
modifyTimestamp: 20050706111624Z
entryCSN: 20050706111624.000000Z#000006#000#000000
dn: ou=computers,o=ls
objectClass: top
objectClass: organizationalUnit
ou: computers
structuralObjectClass: organizationalUnit
entryUUID: 22468588-825b-1029-8392-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111624Z
modifyTimestamp: 20050706111624Z
entryCSN: 20050706111624.000000Z#000007#000#000000
dn: ou=sambadomains,o=ls
objectClass: top
objectClass: organizationalUnit
ou: sambadomains
structuralObjectClass: organizationalUnit
entryUUID: 224cf30a-825b-1029-8394-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111624Z
modifyTimestamp: 20050706111624Z
entryCSN: 20050706111624.000000Z#000009#000#000000
dn: sambaDomainName=LS_NT,ou=sambadomains,o=ls
objectClass: top
objectClass: lssambadomain
objectClass: sambaDomain
sambaDomainName: LS_NT
sambaSID: S-1-5-21-2421470416-3566881284-3047381809
structuralObjectClass: lssambadomain
entryUUID: 2250d4ac-825b-1029-8395-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111624Z
modifyTimestamp: 20050706111624Z
entryCSN: 20050706111624.000000Z#00000a#000#000000
objectClass: lssysaccount
uid: ldapsaisie
structuralObjectClass: lssysaccount
userPassword: toto
dn: ou=groups,o=ls
objectClass: top
objectClass: organizationalUnit
ou: groups
structuralObjectClass: organizationalUnit
entryUUID: 224947d2-825b-1029-8393-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111624Z
modifyTimestamp: 20050706111624Z
entryCSN: 20050706111624.000000Z#000008#000#000000
dn: cn=adminldap,ou=groups,o=ls
objectClass: top
@ -118,91 +47,81 @@ gidNumber: 70000
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-70000
sambaGroupType: 2
structuralObjectClass: lsgroup
entryUUID: 226bb240-825b-1029-8396-b10e837060e0
creatorsName: cn=anonymous
createTimestamp: 20050706111625Z
uniqueMember: uid=eeggs,ou=people,o=ls
entryCSN: 20080211142717.746402Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20080211142717Z
dn: uid=mail,ou=sysaccounts,o=ls
dn: cn=invite,ou=groups,o=ls
objectClass: top
objectClass: lssysaccount
uid: mail
structuralObjectClass: lssysaccount
userPassword: toto
entryUUID: 22958d72-825b-1029-839c-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111625Z
modifyTimestamp: 20050706111625Z
entryCSN: 20050706111625.000000Z#000007#000#000000
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: invite
gidNumber: 101009
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-203019
sambaGroupType: 2
structuralObjectClass: lsgroup
dn: uid=ftp,ou=sysaccounts,o=ls
dn: cn=ls,ou=groups,o=ls
objectClass: top
objectClass: lssysaccount
uid: ftp
structuralObjectClass: lssysaccount
userPassword: toto
entryUUID: 22a46608-825b-1029-839d-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111625Z
modifyTimestamp: 20050706111625Z
entryCSN: 20050706111625.000000Z#000008#000#000000
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: ls
gidNumber: 102001
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205003
sambaGroupType: 2
structuralObjectClass: lsgroup
uniqueMember: uid=secretariat,ou=people,o=ls
dn: uid=http,ou=sysaccounts,o=ls
dn: cn=informatique,ou=groups,o=ls
objectClass: top
objectClass: lssysaccount
uid: http
structuralObjectClass: lssysaccount
userPassword: toto
entryUUID: 22a7274e-825b-1029-839e-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111625Z
modifyTimestamp: 20050706111625Z
entryCSN: 20050706111625.000000Z#000009#000#000000
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
gidNumber: 102009
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205019
sambaGroupType: 2
structuralObjectClass: lsgroup
cn: informatique
uniqueMember: uid=eeggs,ou=people,o=ls
dn: uid=samba,ou=sysaccounts,o=ls
dn: cn=direction,ou=groups,o=ls
objectClass: top
objectClass: lssysaccount
uid: samba
structuralObjectClass: lssysaccount
entryUUID: 22a9f44c-825b-1029-839f-b10e837060e0
creatorsName: cn=anonymous
createTimestamp: 20050706111625Z
userPassword: toto
entryCSN: 20050706115506.000000Z#000001#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20050706115506Z
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: direction
gidNumber: 102007
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205015
sambaGroupType: 2
structuralObjectClass: lsgroup
dn: uid=ldapsaisie,ou=sysaccounts,o=ls
dn: cn=administratif,ou=groups,o=ls
objectClass: top
objectClass: lssysaccount
uid: ldapsaisie
structuralObjectClass: lssysaccount
userPassword: toto
entryUUID: 22acb6aa-825b-1029-83a0-b10e837060e0
creatorsName: cn=anonymous
modifiersName: cn=anonymous
createTimestamp: 20050706111625Z
modifyTimestamp: 20050706111625Z
entryCSN: 20050706111625.000000Z#00000b#000#000000
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: administratif
gidNumber: 102005
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205011
sambaGroupType: 2
structuralObjectClass: lsgroup
dn: uid=nss,ou=sysaccounts,o=ls
dn: cn=communication,ou=groups,o=ls
objectClass: top
objectClass: lssysaccount
uid: nss
structuralObjectClass: lssysaccount
entryUUID: 22b06d40-825b-1029-83a1-b10e837060e0
creatorsName: cn=anonymous
createTimestamp: 20050706111625Z
userPassword: toto
entryCSN: 20050706115152.000000Z#000001#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20050706115152Z
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: communication
gidNumber: 102003
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205007
sambaGroupType: 2
structuralObjectClass: lsgroup
dn: ou=people,o=ls
objectClass: top
objectClass: organizationalUnit
ou: people
structuralObjectClass: organizationalUnit
dn: uid=eeggs,ou=people,o=ls
objectClass: top
@ -213,35 +132,22 @@ uid: eeggs
uidNumber: 100000
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-201000
structuralObjectClass: lspeople
entryUUID: 22b70a42-825b-1029-83a3-b10e837060e0
creatorsName: cn=anonymous
createTimestamp: 20050706111625Z
gidNumber: 102009
mail: eeggs@ldapsaisie.biz
facsimileTelephoneNumber: 030000000
vacationInfo: Je suis absent pour le moment
vacationEnd: 20070101000000Z
vacationForward: brenard@easter-eggs.com
eeallowedservices: MAIL
eeallowedservices: FTP
lsallowedservices: MAIL
lsallowedservices: FTP
description: Utilisateur test Easter-eggs
cn: Easter Eggs
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-205019
mailbox: eeggs/
personalTitle: M.
userPassword: toto
sambaLMPassword: AAD3B435B51404EEAAD3B435B51404EE
sambaNTPassword: 31D6CFE0D16AE931B73C59D7E0C089C0
mailQuota: 5
homeDirectory: /home/eeggs
loginShell: /bin/false
givenName: Easter
maildrop: eeggs@ldapsaisie.biz
vacationActive:
sn: Eggs
entryCSN: 20080211134602.394624Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20080211134602Z
dn: uid=invite,ou=people,o=ls
objectClass: top
@ -260,22 +166,13 @@ userPassword: toto
sambaAcctFlags: [U ]
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-203019
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-203024
mailbox: invite/
mailQuota: 52428800
eeallowedservices: MAIL
eeallowedservices: SAMBA
eeallowedservices: FTP
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
mail: invite@ldapsaisie.biz
maildrop: invite@ldapsaisie.biz
structuralObjectClass: lspeople
entryUUID: 233dd144-825b-1029-9a9d-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111626Z
sambaNTPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
sambaLMPassword: NO PASSWORDXXXXXXXXXXXXXXXXXXXXX
entryCSN: 20050706133832.000000Z#000008#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20050706133832Z
dn: uid=hmartin,ou=people,o=ls
objectClass: top
@ -289,30 +186,19 @@ uidNumber: 101022
sambaAcctFlags: [U ]
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-203044
structuralObjectClass: lspeople
entryUUID: 234393a4-825b-1029-9a9f-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111626Z
givenName: Henri
sn: MARTIN
gidNumber: 102001
mail: henri.martin@ldapsaisie.biz
maildrop: henri.martin@ldapsaisie.biz
mailAlternateAddress: hmartin@ldapsaisie.biz
vacationEnd: 20060101000000Z
mailQuota: 52428800
eeallowedservices: MAIL
eeallowedservices: SAMBA
eeallowedservices: FTP
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
cn: Henri MARTIN
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-205003
mailbox: hmartin/
personalTitle: M.
userPassword: toto
sambaLMPassword: AAD3B435B51404EEAAD3B435B51404EE
sambaNTPassword: 31D6CFE0D16AE931B73C59D7E0C089C0
entryCSN: 20080211164417.161923Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20080211164417Z
dn: uid=secretariat,ou=people,o=ls
objectClass: top
@ -327,27 +213,17 @@ userPassword: toto
sambaAcctFlags: [U ]
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-203072
structuralObjectClass: lspeople
entryUUID: 239920bc-825b-1029-9abb-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111627Z
sambaNTPassword: 8DB716B655D71DF6BD056A41B22B9EA9
sambaLMPassword: 6CE56DC112C920EF0F5E44C88BF9DC39
givenName: Secretariat
sn: Secretariat
gidNumber: 70513
mail: secretariat@ldapsaisie.biz
maildrop: secretariat@ldapsaisie.biz
vacationEnd: 20050101000000Z
mailQuota: 52428800
eeallowedservices: MAIL
eeallowedservices: SAMBA
eeallowedservices: FTP
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
cn: Secretariat Secretariat
mailbox: secretariat/
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-513
entryCSN: 20050706144306.000000Z#000001#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20050706144306Z
dn: uid=ls,ou=people,o=ls
objectClass: top
@ -364,192 +240,15 @@ sambaLMPassword: 6E72264E11F708C0AAD3B435B51404EE
sambaNTPassword: 8D9B9B87EE8C0423691F4F0E00C5BDE1
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-203136
structuralObjectClass: lspeople
entryUUID: 23afa346-825b-1029-9ac3-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111627Z
givenName: _
sn: LdapSaisie
gidNumber: 102001
mail: ls@ldapsaisie.biz
maildrop: ls@ldapsaisie.biz
vacationEnd: 20060101000000Z
mailQuota: 52428800
eeallowedservices: MAIL
eeallowedservices: SAMBA
eeallowedservices: FTP
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
cn: LS
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-205003
mailbox: ls/
entryCSN: 20061212145541.000000Z#000001#000#000000
modifiersName: uid=catbo,ou=people,o=ls
modifyTimestamp: 20061212145541Z
dn: cn=invite,ou=groups,o=ls
objectClass: top
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: invite
gidNumber: 101009
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-203019
sambaGroupType: 2
structuralObjectClass: lsgroup
entryUUID: 2425636a-825b-1029-9ae1-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111628Z
entryCSN: 20070308165544.000000Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20070308165544Z
dn: cn=ls,ou=groups,o=ls
objectClass: top
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: ls
gidNumber: 102001
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205003
sambaGroupType: 2
structuralObjectClass: lsgroup
entryUUID: 242bef1e-825b-1029-9ae3-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111628Z
uniqueMember: uid=secretariat,ou=people,o=ls
entryCSN: 20080211142555.171664Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20080211142555Z
dn: cn=informatique,ou=groups,o=ls
objectClass: top
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
gidNumber: 102009
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205019
sambaGroupType: 2
structuralObjectClass: lsgroup
entryUUID: 2438d9d6-825b-1029-9ae7-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111628Z
cn: informatique
uniqueMember: uid=eeggs,ou=people,o=ls
entryCSN: 20070309093000.000000Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20070309093000Z
dn: cn=direction,ou=groups,o=ls
objectClass: top
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: direction
gidNumber: 102007
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205015
sambaGroupType: 2
structuralObjectClass: lsgroup
entryUUID: 243f7a34-825b-1029-9ae9-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111628Z
entryCSN: 20070309093009.000000Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20070309093009Z
dn: cn=administratif,ou=groups,o=ls
objectClass: top
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: administratif
gidNumber: 102005
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205011
sambaGroupType: 2
structuralObjectClass: lsgroup
entryUUID: 245e0cb0-825b-1029-9af4-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111628Z
entryCSN: 20070308180424.000000Z#000001#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20070308180424Z
dn: cn=communication,ou=groups,o=ls
objectClass: top
objectClass: lsgroup
objectClass: posixGroup
objectClass: sambaGroupMapping
cn: communication
gidNumber: 102003
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205007
sambaGroupType: 2
structuralObjectClass: lsgroup
entryUUID: 2460db34-825b-1029-9af5-8f6e2b792dd2
creatorsName: cn=anonymous
createTimestamp: 20050706111628Z
entryCSN: 20070308180413.000000Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20070308180413Z
dn: uid=spam,ou=mailboxes,o=ls
uid: spam
userPassword: toto
mailQuota: 104857600
eeallowedservices: MAIL
mail: spam@ldapsaisie.biz
maildrop: spam@ldapsaisie.biz
mailbox: spam/
objectClass: top
objectClass: lsmailbox
structuralObjectClass: lsmailbox
entryUUID: c88b9eb4-8301-1029-9567-dda2c03231d0
creatorsName: uid=eeggs,ou=people,o=ls
createTimestamp: 20050707070920Z
entryCSN: 20050707070920.000000Z#000001#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20050707070920Z
dn: uid=virus,ou=mailboxes,o=ls
uid: virus
userPassword: toto
mailbox: virus/
objectClass: top
objectClass: lsmailbox
structuralObjectClass: lsmailbox
entryUUID: 974dac8c-8303-1029-9569-dda2c03231d0
creatorsName: uid=eeggs,ou=people,o=ls
createTimestamp: 20050707072216Z
mailQuota: 104857600
eeallowedservices: MAIL
mail: virus@ldapsaisie.biz
maildrop: virus@ldapsaisie.biz
entryCSN: 20050707072249.000000Z#000001#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20050707072249Z
dn: uid=gnarwl,ou=sysaccounts,o=ls
objectClass: top
objectClass: lssysaccount
uid: gnarwl
structuralObjectClass: lssysaccount
entryUUID: f55954e0-fdcc-1029-9d72-de06c303d7ef
creatorsName: uid=eeggs,ou=people,o=ls
createTimestamp: 20051210133105Z
userPassword: toto
entryCSN: 20051210133237.000000Z#000001#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20051210133237Z
dn: mail=informatique@ldapsaisie.biz,ou=aliases,o=ls
objectClass: top
objectClass: lsalias
structuralObjectClass: lsalias
entryUUID: 081e6612-fdd0-1029-9d73-de06c303d7ef
creatorsName: uid=eeggs,ou=people,o=ls
createTimestamp: 20051210135305Z
mail: informatique@ldapsaisie.biz
description: Service Informatique
maildrop: eeggs@ldapsaisie.biz
entryCSN: 20051210141428.000000Z#000001#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20051210141428Z
dn: uid=erwpa,ou=people,o=ls
uid: erwpa
@ -563,42 +262,16 @@ homeDirectory: /home/erwpa
loginShell: /bin/false
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-203164
structuralObjectClass: lspeople
entryUUID: aa7fcb30-b1a3-102a-875e-dcce935f6f2c
sn: PAGEARD
gidNumber: 102009
mail: erwan.page@ldapsaisie.biz
maildrop: erwan.page@ldapsaisie.biz
vacationEnd: 20060101000000Z
eeallowedservices: MAIL
eeallowedservices: SAMBA
eeallowedservices: FTP
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
cn: Erwan PAGE
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-205019
mailbox: erwpa/
personalTitle: M.
givenName: Erwan
userPassword: toto
sambaLMPassword: BAC14D04669EE1D1AAD3B435B51404EE
sambaNTPassword: FBBF55D0EF0E34D39593F55C5F2CA5F2
entryCSN: 20080211170049.821887Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20080211170049Z
dn: cn=test,ou=groups,o=ls
cn: test
description: test BR
objectClass: top
objectClass: lsgroup
objectClass: sambaGroupMapping
objectClass: posixGroup
sambaGroupType: 2
gidNumber: 102012
sambaSID: 42
structuralObjectClass: lsgroup
entryUUID: 91b290d2-6117-102b-9c6f-91889acd20dc
creatorsName: uid=eeggs,ou=people,o=ls
createTimestamp: 20070307164933Z
entryCSN: 20070308165811.000000Z#000000#000#000000
modifiersName: uid=eeggs,ou=people,o=ls
modifyTimestamp: 20070308165811Z

View file

@ -1,208 +1,94 @@
## Racine
access to dn.regex="^o=ls$" attrs="entry,children,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * read
## Sysaccounts
### Ajout d'entrees par les admins
access to dn.regex="^ou=sysaccounts,o=ls$" attrs="children"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * none
access to dn.regex="^uid=[^,]+,ou=sysaccounts,o=ls$" attrs="entry,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * none
### Les admins peuvent modifier le mot de passe, les autres peuvent s'en servir pour l'authentification
access to dn.regex="^uid=[^,]+,ou=sysaccounts,o=ls$" attrs="userPassword"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by anonymous auth
by * none
### Les admins peuvent modifier tous les attributs, les autres ne voient rien
access to dn.regex="^uid=[^,]+,ou=sysaccounts,o=ls$"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by * none
## Aliases
### Ajout d'entrees par les admins
access to dn.regex="^ou=aliases,o=ls$" attrs="children,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by * read
access to dn.regex="^mail=[^,]+,ou=aliases,o=ls$" attrs="entry,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by * read
### Les admins peuvent modifier tous les attributs, tout le monde peut voir
access to dn.regex="^mail=[^,]+,ou=aliases,o=ls$"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by * read
## Mailboxes
### Ajout d'entrees par les admins
access to dn.regex="^ou=mailboxes,o=ls$" attrs="children,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by * read
access to dn.regex="^uid=[^,]+,ou=mailboxes,o=ls$" attrs="entry,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by * read
### Les admins peuvent modifier le mot de passe, les autres peuvent s'en servir pour l'authentification
access to dn.regex="^uid=[^,]+,ou=mailboxes,o=ls$" attrs="userPassword"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by anonymous auth
by * none
### Les admins peuvent modifier ces attributs, l'appli mail le voir, les autres aucun droits
access to dn.regex="^uid=[^,]+,ou=mailboxes,o=ls$" attrs="mailbox,mailforwardingaddress"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=mail,ou=sysaccounts,o=ls" read
by * none
### Les admins peuvent modifier ces attributs, les authentifies peuvent les voir
access to dn.regex="^uid=[^,]+,ou=mailboxes,o=ls$" attrs="uid,description,mail,mailalternateaddress,mailquota,eeallowedservices"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by * read
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by users read
by * read
## Groups
### Ajout d'entrees par les admins
access to dn.regex="^ou=groups,o=ls$" attrs="children,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * none
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by users read
by * none
access to dn.regex="^cn=[^,]+,ou=groups,o=ls$" attrs="entry,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * none
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by users read
by * none
### Les admins peuvent tout modifier, les authentifies peuvent tout voir
access to dn.regex="^cn=[^,]+,ou=groups,o=ls$"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * none
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by users read
by * none
## Peoples
### Ajout d'entrees par les admins
access to dn.regex="^ou=people,o=ls$" attrs="children,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * read
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by users read
by * read
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="entry,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * read
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by users read
by * read
### Les admins peuvent modifier le mot de passe, samba le mettre à jour, les autres peuvent s'en servir pour l'authentification
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="userPassword"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=samba,ou=sysaccounts,o=ls" write
by self write
by anonymous auth
by * none
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=samba,ou=sysaccounts,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by self write
by anonymous auth
by * none
### Les admins peuvent modifier ces attributs, l'appli mail les voir, les autres aucun droits
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="mailbox"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=mail,ou=sysaccounts,o=ls" read
by * none
access to dn.regex="^uid=[^,]+,ou=sysaccounts,o=ls$" attrs="userPassword"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by anonymous auth
by * none
### Les admins peuvent modifier ces attributs, les authentifies peuvent les voir
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="uid,mailquota,eeallowedservices,uidNumber,gidNumber,homeDirectory,loginShell,sambaSID,sambaAcctFlags,sambaPrimaryGroupSID"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * none
### Les admins peuvent modifier ces attributs, le proprio aussi, gnarwl peut les modifier et mail les voir
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="mailforwardingaddress"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=gnarwl,ou=sysaccounts,o=ls" write
by self write
by dn="uid=mail,ou=sysaccounts,o=ls" read
by * none
### Les admins peuvent modifier ces attributs, le proprio aussi, les authentifies peuvent les voir, gnarwl peut les modifier
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="vacationActive"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=gnarwl,ou=sysaccounts,o=ls" write
by self write
by users read
by * none
### Les admins peuvent modifier ces attributs, le proprio aussi, mail et gnarwl peuvent les voir
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="vacationForward"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by self write
by dn="uid=mail,ou=sysaccounts,o=ls" read
by dn="uid=gnarwl,ou=sysaccounts,o=ls" read
by * none
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="uid,lsallowedservices,uidNumber,gidNumber,homeDirectory,loginShell,sambaSID,sambaAcctFlags,sambaPrimaryGroupSID"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by users read
by * none
### Les admins peuvent modifier ces attributs, le proprio aussi, samba aussi
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="sambaLMPassword,sambaNTPassword"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=samba,ou=sysaccounts,o=ls" write
by self write
by * none
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by dn="uid=samba,ou=sysaccounts,o=ls" write
by self write
by * none
### Les admins peuvent modifier ces attributs, le proprio aussi, les authentifies peuvent les voir
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="c,cn,jpegPhoto,personalTitle,sn,givenName,postalAddress,postalCode,l,st,telephoneNumber,mobile,fax,mail,mailalternateaddress,maildrop,description,vacationInfo,vacationEnd"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by self write
by users read
by * read
## Computers
### Ajout d'entrees par les admins
access to dn.regex="^ou=computers,o=ls$" attrs="children,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=samba,ou=sysaccounts,o=ls" write
by users read
by * none
access to dn.regex="^uid=[^,]+,ou=computers,o=ls$" attrs="entry,objectclass"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=samba,ou=sysaccounts,o=ls" write
by users read
by * none
### Les admins peuvent modifier ces attributs, samba peut les voir
access to dn.regex="^uid=[^,]+,ou=computers,o=ls$" attrs="sambaLMPassword,sambaNTPassword"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=samba,ou=sysaccounts,o=ls" write
by * none
### Les admins peuvent modifier ces attributs, les authentifiés peuvent les voir
access to dn.regex="^uid=[^,]+,ou=computers,o=ls$" attrs="cn,uid,uidNumber,gidNumber,homeDirectory,sambaSID,sambaPrimaryGroupSID,sambaAcctFlags,sambaPwdCanChange,sambaPwdMustChange,sambaPwdLastSet"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=samba,ou=sysaccounts,o=ls" write
by users read
by * none
access to dn.regex="^uid=[^,]+,ou=people,o=ls$" attrs="c,cn,jpegPhoto,personalTitle,sn,givenName,postalAddress,postalCode,l,st,telephoneNumber,mobile,fax,mail,description"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by self write
by users read
by * read
## Les authentifies peuvent voir les noeuds et les admins peuvent en ajouter
access to * attrs="entry"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by users read
by * none
## SambaDomains
### Ajout d'entrees par les admins
access to dn.regex="^ou=sambadomains,o=ls$"
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=samba,ou=sysaccounts,o=ls" read
by users read
by * none
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by users read
by * none
## Le reste
access to *
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by * none
by group/lsgroup/uniqueMember="cn=adminldap,ou=groups,o=ls" write
by dn="uid=ldapsaisie,ou=sysaccounts,o=ls" write
by * none

View file

@ -1,3 +1,4 @@
# LSexample - Config
include /etc/ldap/schema/ls.schema
@ -14,10 +15,9 @@ index objectClass eq
index uid pres,eq
index uidNumber eq
index gidNumber eq
index eeallowedservices eq
index lsallowedservices eq
index cn pres,eq
index mail pres,eq
index mailalternateaddress pres,eq
index sambasid eq
index sambaDomainName eq
index memberUid eq

View file

@ -53,3 +53,11 @@ dl.loginform {
float: right;
margin-left: 1em;
}
#LSsession_lostPassword {
float: right;
font-size: 0.8em;
text-decoration: none;
color: #69c;
font-weight: bold;
}

View file

@ -0,0 +1,60 @@
#recoverpasswordform-logo {
float: left;
}
div.recoverpasswordform {
margin: auto;
margin-top: 10%;
border: 1px solid #69c;
padding: 1em;
width: 30em;
background: transparent url(../images/login_fd.png) no-repeat scroll 98% 98%;
}
dl.recoverpasswordform {
margin: 0;
padding: 0;
}
.recoverpasswordform dt {
position: relative;
left: 0;
top: 1.1em;
width: 8em;
font-weight: bold;
font-size: 0.9em;
}
.recoverpasswordform dd {
margin: 0 0 0 9em;
padding: 0 0 0em 0em;
}
.recoverpasswordform input, .recoverpasswordform select {
border: 1px inset #ccc;
width: 13em;
}
.recoverpasswordform input[type='submit'] {
border: 1px outset #ccc;
width: 11em;
margin: 1em;
}
#loading_zone {
float: right;
margin-left: 1em;
}
#recoverpassword_msg {
text-align: center;
font-weight: bold;
}
#recoverpassword_back {
float: right;
font-size: 0.8em;
text-decoration: none;
color: #69c;
font-weight: bold;
}

View file

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>LdapSaisie{if $pagetitle != ''} - {$pagetitle}{/if}</title>
<link rel="stylesheet" type="text/css" href="templates/css/login.css" media="screen" title="Normal" />
{$LSsession_css}
@ -33,6 +34,7 @@
<dd><input type='submit' value='{$loginform_label_submit}' /></dd>
</dl>
</form>
<a href='index.php?LSsession_recoverPassword' id='LSsession_lostPassword'>{$loginform_label_lostpassword}</a>
</div>
</body>
</html>

View file

@ -0,0 +1,41 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>LdapSaisie{if $pagetitle != ''} - {$pagetitle}{/if}</title>
<link rel="stylesheet" type="text/css" href="templates/css/recoverpassword.css" media="screen" title="Normal" />
{$LSsession_css}
{$LSsession_js}
</head>
<body>
<div id='LSerror'>
{$LSerrors}
</div>
<div id='LSdebug'>
<a href='#' id='LSdebug_hidden'>X</a>
<div id='LSdebug_infos'>{if $LSdebug != ''}{$LSdebug}{/if}</div>
</div>
<div class='recoverpasswordform'>
<img src='templates/images/logo.png' alt='Logo' id='recoverpasswordform_logo' />
<div id='loading_zone'></div>
<form action='{$recoverpasswordform_action}' method='post'>
<dl class='recoverpasswordform'>
<dt {$recoverpasswordform_ldapserver_style}>{$recoverpasswordform_label_ldapserver}</dt>
<dd {$recoverpasswordform_ldapserver_style}>
<select name='LSsession_ldapserver' id='LSsession_ldapserver'>{html_options values=$recoverpasswordform_ldapservers_index output=$recoverpasswordform_ldapservers_name selected=$ldapServerId}</select>
</dd>
<dt>{$recoverpasswordform_label_user}</dt>
<dd><input type='text' name='LSsession_user' /></dd>
<dd><input type='submit' value='{$recoverpasswordform_label_submit}' /></dd>
</dl>
</form>
{if recoverpassword_msg!=''}
<p id='recoverpassword_msg'>{$recoverpassword_msg}</p>
{/if}
<a href='index.php' id='recoverpassword_back'>{$recoverpasswordform_label_back}</a>
</div>
</body>
</html>