diff --git a/trunk/AUTHORS b/trunk/AUTHORS new file mode 100644 index 00000000..a5c82e4b --- /dev/null +++ b/trunk/AUTHORS @@ -0,0 +1,7 @@ +* Conception : + - Benjamin Renard - brenard@easter-eggs.com + - Emmanuel Lacour - elacour@easter-eggs.com + - Michaël Parienti - mparienti@easter-eggs.com + +* Développement : + - Benjamin Renard - brenard@easter-eggs.com \ No newline at end of file diff --git a/trunk/conf/config.LSeegroup.php b/trunk/conf/config.LSeegroup.php new file mode 100644 index 00000000..d436e2b7 --- /dev/null +++ b/trunk/conf/config.LSeegroup.php @@ -0,0 +1,101 @@ + array( + 'ostgroup', + 'posixGroup' + ), + 'select_display_attrs' => '%{cn}', + 'attrs' => array ( + 'cn' => array ( + 'label' => 'Nom', + 'ldap_type' => 'ascii', + 'html_type' => 'text', + 'required' => 1, + 'check_data' => array ( + 'alphanumeric' + ), + 'validation' => array ( + array ( + 'basedn' => 'o=ost', + 'filter' => 'cn=%{val}', + 'result' => 0 + ) + ), + 'form' => array ( + 'test' => 1 + ) + ), + 'gidNumber' => array ( + 'label' => 'Identifiant', + 'ldap_type' => 'numeric', + 'html_type' => 'text', + 'required' => 1, + 'validation' => array ( + array ( + 'basedn' => 'o=ost', + 'filter' => 'gidNumber=%{val}', + 'result' => 0 + ) + ), + 'rights' => array( // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut) + 'self' => 'w', // définition des droits de l'utilisateur sur lui même + 'users' => 'r' // définition des droits de tout les utilisateurs + ), + 'form' => array ( + 'test' => 1 + ) + ), + 'uniqueMember' => array ( + 'label' => 'Membres', + 'ldap_type' => 'ascii', + 'html_type' => 'select_list', + 'required' => 0, + 'validation' => array ( + array ( + 'basedn' => '%{val}', + 'result' => 1 + ) + ), + 'rights' => array( // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut) + 'self' => 'w', // définition des droits de l'utilisateur sur lui même + 'users' => 'r' // définition des droits de tout les utilisateurs + ), + 'form' => array ( + 'test' => 1 + ), + 'possible_values' => array( + 'aucun' => '-- Selectionner --', + 'OTHER_OBJECT' => array( + 'object_type' => 'LSeepeople', // Nom de l'objet à lister + 'display_attribute' => '%{cn} (%{uidNumber})', // Spécifie le attributs à lister pour le choix, + // si non définie => utilisation du 'select_display_attrs' + // de la définition de l'objet + + 'value_attribute' => '%{dn}', // Spécifie le attributs dont la valeur sera retournée par + ) + ) + ) + ) +); +?> \ No newline at end of file diff --git a/trunk/conf/config.LSeepeople.php b/trunk/conf/config.LSeepeople.php new file mode 100644 index 00000000..01d270f1 --- /dev/null +++ b/trunk/conf/config.LSeepeople.php @@ -0,0 +1,208 @@ + array( + 'ostpeople', + 'posixAccount' + ), + 'before_save' => 'valid', + 'after_save' => 'valid', + 'select_display_attrs' => '%{cn]', + 'attrs' => array ( + 'uid' => array ( + 'label' => 'Identifiant', + 'ldap_type' => 'ascii', + 'html_type' => 'text', + 'required' => 1, + 'check_data' => array ( + 'alphanumeric' => array( + 'msg' => "L'identifiant ne doit comporter que des lettres et des chiffres." + ), + ), + 'validation' => array ( + array ( + 'basedn' => 'o=ost', + 'filter' => 'uid=%{val}', + 'result' => 0, + //~ 'msg' => 'Cet identifiant est déjà utilisé.' + ) + ), + 'rights' => array( // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut) + 'self' => 'w', // définition des droits de l'utilisateur sur lui même + 'users' => 'r' // définition des droits de tout les utilisateurs + ), + 'form' => array ( + 'test' => 0, + 'add' => 1 + ) + ), + 'uidNumber' => array ( + 'label' => 'Identifiant (numérique)', + 'ldap_type' => 'numeric', + 'html_type' => 'text', + 'required' => 1, + 'check_data' => array ( + 'numeric' => array( + 'msg' => "L'identifiant unique doit être un entier." + ), + ), + 'validation' => array ( + array ( + 'basedn' => 'o=ost', + 'filter' => 'uidNumber=%{val}', + 'result' => 0, + //~ 'msg' => 'Cet identifiant est déjà utilisé.' + ) + ), + 'rights' => array( // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut) + 'self' => 'w', // définition des droits de l'utilisateur sur lui même + 'users' => 'r' // définition des droits de tout les utilisateurs + ), + 'form' => array ( + 'test' => 0, + 'add' => 1 + ) + ), + 'cn' => array ( + 'label' => 'Nom complet', + 'ldap_type' => 'ascii', + 'html_type' => 'text', + 'required' => 1, + 'validation' => 'valid', + 'rights' => array( // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut) + 'self' => 'w', // définition des droits de l'utilisateur sur lui même + 'users' => 'r' // définition des droits de tout les utilisateurs + ), + 'form' => array ( + 'test' => 1, + 'add' => 1 + ) + ), + 'givenName' => array ( + 'label' => 'Prenom', + 'ldap_type' => 'ascii', + 'html_type' => 'text', + 'required' => 1, + 'default_value' => 'toto', + 'check_data' => array ( + 'alphanumeric' => array( + 'msg' => 'Le prenom ne doit comporter que des lettres et des chiffres.' + ), + ), + //~ 'validation' => array ( + //~ array ( + //~ 'basedn' => 'o=ost', + //~ 'filter' => 'uid=%{uid}', + //~ 'result' => 0 + //~ ) + //~ ), + 'rights' => array( // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut) + 'self' => 'w', // définition des droits de l'utilisateur sur lui même + 'users' => 'r' // définition des droits de tout les utilisateurs + ), + 'form' => array ( + 'test' => 1, + 'add' => 1 + ), + 'onDisplay' => 'return_data' + ), + 'sn' => array ( + 'label' => 'Nom', + 'ldap_type' => 'ascii', + 'html_type' => 'text', + 'required' => 1, + 'check_data' => array ( + 'alphanumeric' => array( + 'msg' => 'Le nom ne doit comporter que des lettres et des chiffres.' + ), + ), + //~ 'validation' => array ( + //~ array ( + //~ 'basedn' => 'o=ost', + //~ 'filter' => 'uid=%{uid}', + //~ 'result' => 0 + //~ ) + //~ ), + 'rights' => array( // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut) + 'self' => 'w', // définition des droits de l'utilisateur sur lui même + 'users' => 'r' // définition des droits de tout les utilisateurs + ), + 'form' => array ( + 'test' => 1, + 'add' => 1 + ) + ), + 'gidNumber' => array ( + 'label' => 'Groupe principal', + 'ldap_type' => 'numeric', + 'html_type' => 'select_list', + 'required' => 1, + 'validation' => array ( + array ( + 'object_type' => 'LSeegroup', // 'object_type' : Permet definir le type d'objet recherchés + 'basedn' => 'o=ost', // et d'utiliser les objectClass définis dans le fichier de configuration + 'filter' => '(gidNumber=%{val})', // pour la recherche + 'result' => 1 + ) + ), + 'rights' => array( // Définition de droits : 'r' => lecture / 'w' => modification / '' => aucun (par defaut) + 'self' => 'w', // définition des droits de l'utilisateur sur lui même + 'users' => 'r' // définition des droits de tout les utilisateurs + ), + 'form' => array ( + 'test' => 1, + 'add' => 1 + ), + 'possible_values' => array( + 'aucun' => '-- Selectionner --', + 'OTHER_OBJECT' => array( + 'object_type' => 'LSeegroup', // Nom de l'objet à lister + 'display_attribute' => '%{cn} (%{gidNumber})', // Spécifie le attributs à lister pour le choix, + // si non définie => utilisation du 'select_display_attrs' + // de la définition de l'objet + + 'value_attribute' => 'gidNumber', // Spécifie le attributs dont la valeur sera retournée par + 'filter' => // le formulaire spécifie les filtres de recherche pour + array ( // l'établissement de la liste d'objets : + array( // Premier filtre + 'filter' => 'cn=*a*', + 'basedn' => 'o=ost', + 'scope' => 'sub', + //~ 'attr' => '[attribut]', // Si 'attr' est définis, on effectura pour chacune des + // valeurs de l'attribut correspants une recherche avec + // le filtre suivant composé avec la valeur de cette attribut + ) + //~ array( + //~ 'filter' => '[format sprintf]', + //~ 'basedn' => '[basedn]', + //~ ), + //~ ... + ) + //~ 'basedn' => + //~ '[basedn]' + ) + ) + ) + ) +); +?> \ No newline at end of file diff --git a/trunk/conf/config.php b/trunk/conf/config.php new file mode 100644 index 00000000..5f4ae1f7 --- /dev/null +++ b/trunk/conf/config.php @@ -0,0 +1,42 @@ + '/usr/share/php/Net/LDAP.php', + 'QuickForm' => '/usr/share/php/QuickForm.php', + 'check_data_place' => 'server', + 'ldap_config'=> array( + 'host' => 'localhost', + 'port' => 389, + 'version' => 3, + 'starttls' => false, + 'binddn' => 'uid=eeggs,ou=people,o=com', + 'bindpw' => 'toto', + 'basedn' => 'o=ost', + 'options' => array(), + 'filter' => '(objectClass=*)', + 'scope' => 'sub' + ) +); + +?> diff --git a/trunk/conf/error_code.php b/trunk/conf/error_code.php new file mode 100644 index 00000000..69a5ab9a --- /dev/null +++ b/trunk/conf/error_code.php @@ -0,0 +1,118 @@ + array ( + 'msg' => 'Erreur inconnue!', + 'level' => 'c' + ), + // LSldap + 1 => array ( + 'msg' => 'LSldap : Erreur durant la connexion au serveur LDAP (%{msg}).', + 'level' => 'c' + ), + 2 => array ( + 'msg' => 'LSldap : Erreur durant la recherche LDAP (%{msg}).', + 'level' => 'c' + ), + + // LSldapObject + 21 => array ( + 'msg' => "LSldapObject : Type d'objet inconnu.", + 'level' => 'c' + ), + 22 => array ( + 'msg' => "LSldapObject : Formulaire de mise jour inconnu par l'objet %{msg}.", + 'level' => 'c' + ), + 23 => array ( + 'msg' => "LSldapObject : Aucun formulaire n'existe dans l'objet %{msg}.", + 'level' => 'c' + ), + 24 => array ( + 'msg' => "LSldapObject : La fonction %{func} pour valider l'attribut %{attr} de l'objet %{obj} est inconnue.", + 'level' => 'c' + ), + 25 => array ( + 'msg' => "LSldapObject : Des données de configuration sont manquant pour la validation de l'attribut %{attr} de l'objet %{obj}.", + 'level' => 'c' + ), + 26 => array ( + 'msg' => "LSldapObject : Erreur de configuration : L'objet %{obj} ne possède pas d'attribut %{attr}.", + 'level' => 'c' + ), + 27 => array ( + 'msg' => "LSldapObject : La fonction %{func} devant être executée avant l'enregistrement n'existe pas.", + 'level' => 'c' + ), + 28 => array ( + 'msg' => "LSldapObject : L'execution de la fonction %{func} devant être executée avant l'enregistrement a échouée.", + 'level' => 'c' + ), + 29 => array ( + 'msg' => "LSldapObject : La fonction %{func} devant être executée après l'enregistrement n'existe pas.", + 'level' => 'c' + ), + 30 => array ( + 'msg' => "LSldapObject : L'execution de la fonction %{func} devant être executée après l'enregistrement a échouée.", + 'level' => 'c' + ), + + // LSldapObject + 41 => array ( + 'msg' => "LSattribute : Type d'attribut (ldap // html) inconnu (ldap = %{ldap} | html = %{html}).", + 'level' => 'c' + ), + 42 => array ( + 'msg' => "LSattribute : La fonction %{func} pour afficher l'attribut %{attr} est inconnue.", + 'level' => 'c' + ), + 43 => array ( + 'msg' => "LSattribute : La règle %{rule} pour valider l'attribut %{attr} est inconnue.", + 'level' => 'c' + ), + 44 => array ( + 'msg' => "LSattribute : Les données de configuration pour vérifié l'attribut %{attr} sont incorrects.", + 'level' => 'c' + ), + 45 => array ( + 'msg' => "LSattribute : La fonction %{func} pour sauver l'attribut %{attr} est inconnue.", + 'level' => 'c' + ), + + // LSattr_html + 101 => array ( + 'msg' => "LSattr_html : La fonction addToForm() du type html de l'attribut %{attr} n'est pas définie.", + 'level' => 'c' + ), + 102 => array ( + 'msg' => "LSattr_html_select_list : Des données de configuration sont manquante pour la génération de la liste deroulante de l'attribut %{attr}.", + 'level' => 'c' + ), + + // functions + 901 => array ( + 'msg' => "Functions 'getFData' : La methode %{meth} de l'objet %{obj} n'existe pas.", + 'level' => 'c' + ), +); +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSattr_html.php b/trunk/includes/class/class.LSattr_html.php new file mode 100644 index 00000000..b847b027 --- /dev/null +++ b/trunk/includes/class/class.LSattr_html.php @@ -0,0 +1,49 @@ + + */ +class LSattr_html { + + var $name; + var $config; + + function LSattr_html ($name,$config) { + $this -> name = $name; + $this -> config = $config; + return true; + } + + function getLabel() { + return $this -> config['label']; + } + + function addToForm (&$form,$idForm) { + $GLOBALS['LSerror'] -> addErrorCode(101,$this -> name); + } + +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSattr_html_select_list.php b/trunk/includes/class/class.LSattr_html_select_list.php new file mode 100644 index 00000000..114a48dd --- /dev/null +++ b/trunk/includes/class/class.LSattr_html_select_list.php @@ -0,0 +1,81 @@ + + */ +class LSattr_html_select_list extends LSattr_html{ + + function addToForm (&$form,$idForm) { + return $form -> addElement('select', $this -> name, $this -> config['label'],$this -> getPossibleValues()); + } + + /** + * Retourne un tableau des valeurs possibles de la liste + * + * @author Benjamin Renard + * + * @retval array Tableau associatif des valeurs possible de la liste avec en clé + * la valeur des balises option et en valeur ce qui sera affiché. + */ + function getPossibleValues() { + $retInfos = array(); + if (isset($this -> config['possible_values'])) { + foreach($this -> config['possible_values'] as $val_name => $val) { + if($val_name=='OTHER_OBJECT') { + //~ print_r($val); + if ((!isset($val['object_type'])) || (!isset($val['value_attribute']))) { + $GLOBALS['LSerror'] -> addErrorCode(102,$this -> name); + break; + } + $obj = new $val['object_type'](); + if($val['scope']) { + $param=array('scope' => $this -> config['possible_values']['scope']); + } + else { + $param=array(); + } + $list = $obj -> listObjects($val['filter'],$this -> config['possible_values']['basedn'],$param); + if(($val['value_attribute']=='dn')||($val['value_attribute']=='%{dn}')) { + for($i=0;$i dn]=$list[$i] -> getDisplayValue($val['display_attribute']); + } + } + else { + for($i=0;$i attrs[$val['value_attribute']] -> getValue()]=$list[$i] -> getDisplayValue($val['display_attribute']); + } + } + } + else { + $retInfos[$val_name]=$val; + } + } + } + return $retInfos; + } + +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSattr_html_text.php b/trunk/includes/class/class.LSattr_html_text.php new file mode 100644 index 00000000..1f112bf4 --- /dev/null +++ b/trunk/includes/class/class.LSattr_html_text.php @@ -0,0 +1,36 @@ + + */ +class LSattr_html_text extends LSattr_html { + + function addToForm (&$form,$idForm) { + return $form -> addElement('text', $this -> name, $this -> config['label']); + } + +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSattr_ldap.php b/trunk/includes/class/class.LSattr_ldap.php new file mode 100644 index 00000000..4cd6cfd0 --- /dev/null +++ b/trunk/includes/class/class.LSattr_ldap.php @@ -0,0 +1,49 @@ + + */ +class LSattr_ldap { + + var $name; + var $config; + + function LSattr_ldap ($name,$config) { + $this -> name = $name; + $this -> config = $config; + return true; + } + + function getUpdateData($data) { + return $data; + } + + function getDisplayValue($data) { + return $data; + } + +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSattr_ldap_ascii.php b/trunk/includes/class/class.LSattr_ldap_ascii.php new file mode 100644 index 00000000..297bca85 --- /dev/null +++ b/trunk/includes/class/class.LSattr_ldap_ascii.php @@ -0,0 +1,32 @@ + + */ +class LSattr_ldap_ascii extends LSattr_ldap { + //\\ +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSattr_ldap_numeric.php b/trunk/includes/class/class.LSattr_ldap_numeric.php new file mode 100644 index 00000000..d74548f8 --- /dev/null +++ b/trunk/includes/class/class.LSattr_ldap_numeric.php @@ -0,0 +1,32 @@ + + */ +class LSattr_ldap_numeric extends LSattr_ldap { + // \\ +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSattribute.php b/trunk/includes/class/class.LSattribute.php new file mode 100644 index 00000000..554ddc35 --- /dev/null +++ b/trunk/includes/class/class.LSattribute.php @@ -0,0 +1,300 @@ + + */ +class LSattribute { + + var $name; + var $config; + var $ldap; + var $html; + var $data; + var $updateData=false; + var $is_validate=false; + + /** + * Constructeur + * + * Cette methode construit l'objet et définis la configuration. + * Elle lance la construction des objets LSattr_html et LSattr_ldap correspondant + * à ses types définis définis dans sa configuration + * + * @author Benjamin Renard + * + * @param[in] $name string Nom de l'attribut ldap + * @param[in] $config array Configuration de l'objet + * + * @retval boolean Retourne true si la création a réussi, false sinon. + */ + function LSattribute ($name,$config) { + $this -> name = $name; + $this -> config = $config; + $html_type = "LSattr_html_".$config['html_type']; + $ldap_type = "LSattr_ldap_".$config['ldap_type']; + if((class_exists($html_type))&&(class_exists($ldap_type))) { + $this -> html = new $html_type($name,$config); + $this -> ldap = new $ldap_type($name,$config); + } + else { + $GLOBALS['LSerror'] -> addErrorCode(41,array('html'=>$config['html_type'],'ldap'=>$config['ldap_type'])); + return; + } + return true; + } + + + /** + * Retourne la valeur du label de l'attribut + * + * @author Benjamin Renard + * + * @retval string Le label de l'attribut + * + * @see LSattr_html::getLabel() + */ + + function getLabel() { + return $this -> html -> getLabel(); + } + + /** + * Défini la valeur de l'attribut + * + * @author Benjamin Renard + * + * @retval boolean true + */ + function loadData($attr_data) { + $this -> data = $attr_data; + return true; + } + + /** + * DEBIG : affiche la valeur de l'attribut + * + * @author Benjamin Renard + * + * @retval void + */ + function debug_printValue() { + print $this -> data; + } + + /** + * Retourne la valeur de l'attribut + * + * @author Benjamin Renard + * + * @retval mixed La valeur de l'attribut + */ + function getValue() { + return $this -> data; + } + + /** + * Retourne la valeur d'affichage de l'attribut + * + * @author Benjamin Renard + * + * @retval string La valeur d'affichage de l'attribut + */ + function getDisplayValue() { + $data = $this -> ldap -> getDisplayValue($this -> data); + if ($this -> config['onDisplay']) { + if (is_array($this -> config['onDisplay'])) { + $result=$data; + foreach($this -> config['onDisplay'] as $func) { + if (function_exists($func)) { + $result=$func($result); + } + else { + $GLOBALS['LSerror'] -> addErrorCode(42,array('attr' => $this->name,'func' => $func)); + return; + } + } + return $result; + } + else { + if (function_exists($this -> config['onDisplay'])) { + return $this -> config['onDisplay']($data); + } + else { + $GLOBALS['LSerror'] -> addErrorCode(42,array('attr' => $this->name,'func' => $this -> config['onDisplay'])); + return; + } + } + } + return $data; + } + + /** + * Ajoute l'attribut au formualaire + * + * Cette méthode ajoute l'attribut au formulaire $form si l'identifiant de celui-ci + * ($idForm) est connu dans la configuration de l'objet. + * + * @author Benjamin Renard + * + * @param[in] object LSform Le formulaire dans lequel doit être ajouté l'attribut + * @param[in] string L'identifiant du formulaire + * + * @retval boolean true si l'ajout a fonctionner ou qu'il n'est pas nécessaire, false sinon + */ + function addToForm(&$form,$idForm) { + if(isset($this -> config['form'][$idForm])) { + $element = $this -> html -> addToForm($form,$idForm); + if($this -> config['required']==1) + $form->addRule($this -> name, "Le champ '".$this -> config['label']."' est obligatoire.",'required', null, 'client'); + /// !!!!! A CHANGER !!!!!!! \\\\ => utiliser une fonction de traitement de donnée + if($this -> data !='') + $element -> setValue($this -> getFormVal()); + else if (isset($this -> config['default_value'])) + $element -> setValue($this -> config['default_value']); + if($this -> config['form'][$idForm]==0) + $element -> freeze(); + if(isset($this -> config['check_data'])) { + if(is_array($this -> config['check_data'])) { + foreach ($this -> config['check_data'] as $rule => $rule_infos) { + if((!$form -> isRuleRegistered($rule))&&($rule!='')) { + $GLOBALS['LSerror'] -> addErrorCode(43,array('attr' => $this->name,'rule' => $rule)); + return; + } + if(!isset($rule_infos['msg'])) + $rule_infos['msg']='La valeur du champs '.$this -> config['label'].' est invalide.'; + if(!isset($rule_infos['param'])) + $rule_infos['param']=NULL; + $form -> addRule($this -> name,$rule_infos['msg'],$rule,$rule_infos['param'],$GLOBALS['LSconfig']['check_data_place']); + } + } + else { + $GLOBALS['LSerror'] -> addErrorCode(44,$this->name); + } + } + } + return true; + } + + /** + * Retourne la valeur a afficher dans le formulaire + * + * @author Benjamin Renard + * + * @retval string La valeur a afficher dans le formulaire. + */ + function getFormVal() { + return $this -> getDisplayValue(); + } + + function setUpdateData($data) { + if($this -> getFormVal() != $data) + $this -> updateData=$data; + } + + /** + * Vérifie si l'attribut a été validé + * + * @author Benjamin Renard + * + * @retval boolean true si l'attribut a été validé, false sinon + */ + function isValidate() { + return ((!isset($this -> config['validation'])) || ($this -> is_validate)); + } + + /** + * Valide le champs + * + * @author Benjamin Renard + * + * @retval void + */ + function validate() { + $this -> is_validate=true; + } + + /** + * Vérifie si l'attribut a été mise à jour + * + * @author Benjamin Renard + * + * @retval boolean true si l'attribut a été mis à jour, false sinon + */ + function isUpdate() { + return ($this -> updateData)?true:false; + } + + /** + * Retourne la valeur de l'attribut pour son enregistrement dans l'annuaire + * + * @author Benjamin Renard + * + * @retval mixed La valeur de l'attribut pour son enregistrement dans l'annuaire + */ + function getUpdateData() { + $data=($this ->isUpdate())?$this -> updateData:$this -> data; + if ($this -> config['onSave']) { + if (is_array($this -> config['onSave'])) { + $result=$data; + foreach($this -> config['onSave'] as $func) { + if (function_exists($func)) { + $result=$func($result); + } + else { + $GLOBALS['LSerror'] -> addErrorCode(45,array('attr' => $this->name,'func' => $func)); + return; + } + } + return $result; + } + else { + if (function_exists($this -> config['onSave'])) { + return $this -> config['onSave']($data); + } + else { + $GLOBALS['LSerror'] -> addErrorCode(45,array('attr' => $this->name,'func' => $this -> config['onSave'])); + return; + } + } + } + return $this -> ldap -> getUpdateData($data); + } + + /** + * Retourne la configuration de validation de l'annuaire + * + * @author Benjamin Renard + * + * @retval mixed La configuration de validation de l'attribut + */ + function getValidateConfig() { + return $this -> config['validation']; + } + +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSeegroup.php b/trunk/includes/class/class.LSeegroup.php new file mode 100644 index 00000000..e9127227 --- /dev/null +++ b/trunk/includes/class/class.LSeegroup.php @@ -0,0 +1,46 @@ + + */ +class LSeegroup extends LSldapObject { + + /** + * Constructeur + * + * Cette methode construit l'objet et définis la configuration. + * + * @author Benjamin Renard + * + * @param[in] $config array La configuration de l'objet + * + * @retval boolean true si l'objet a été construit, false sinon. + */ + function LSeegroup ($config='auto') { + $this -> LSldapObject('LSeegroup',$config); + } +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSeepeople.php b/trunk/includes/class/class.LSeepeople.php new file mode 100644 index 00000000..a0e008c2 --- /dev/null +++ b/trunk/includes/class/class.LSeepeople.php @@ -0,0 +1,46 @@ + + */ +class LSeepeople extends LSldapObject { + + /** + * Constructeur + * + * Cette methode construit l'objet et définis la configuration. + * + * @author Benjamin Renard + * + * @param[in] $config array La configuration de l'objet + * + * @retval boolean true si l'objet a été construit, false sinon. + */ + function LSeepeople ($config='auto') { + return $this -> LSldapObject('LSeepeople',$config); + } +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSerror.php b/trunk/includes/class/class.LSerror.php new file mode 100644 index 00000000..40e5ce5b --- /dev/null +++ b/trunk/includes/class/class.LSerror.php @@ -0,0 +1,90 @@ + + */ +class LSerror { + + var $errors; + /** + * Constructeur + * + * @author Benjamin Renard + * + * @retval void + */ + function LSerror() { + $errors = array(); + } + + /** + * Ajoute une erreur + * + * @author Benjamin Renard + * + * @param[in] $code numeric Le code de l'erreur + * @param[in] $msg mixed Un tableau ou une chaine pour la construction du message d'erreur + * Tableau : '[clef]' => 'valeur' + * La clef sera utilisé dans le format de message d'erreur + * dans le fichier 'error_code.php'. + * + * @retval void + */ + function addErrorCode($code=-1,$msg='') { + $this -> errors[]=array($code,$msg); + } + + /** + * Affiche les erreurs et arrête l'execution du code + * + * @author Benjamin Renard + * + * @retval void + */ + function stop(){ + $this -> display(); + exit(1); + } + + /** + * Affiche les erreurs + * + * @author Benjamin Renard + * + * @retval void + */ + function display() { + if(!empty($this -> errors)) { + print "

Erreurs

\n"; + foreach ($this -> errors as $error) { + echo "(Code ".$error[0].") ".getFData($GLOBALS['error_code'][$error[0]]['msg'],$error[1])."
\n"; + } + } + } +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSform.php b/trunk/includes/class/class.LSform.php new file mode 100644 index 00000000..2fc50583 --- /dev/null +++ b/trunk/includes/class/class.LSform.php @@ -0,0 +1,109 @@ + + */ + +class LSform { + + var $quickform; + var $idForm; + var $can_validate=true; + + /** + * Constructeur + * + * Cette methode construit l'objet et définis la configuration. + * Elle lance la construction de l'objet HTML_QuickForm et définis les élements + * de base à communiquer de page en page par le formulaire. + * + * @author Benjamin Renard + * + * @param[in] $idForm [required] string L'identifiant du formulaire + * @param[in] $submit string La valeur du bouton submit + * + * @retval void + */ + function LSform ($idForm,$submit="Envoyer"){ + $this -> idForm = $idForm; + $this -> submit = $submit; + $this -> quickform = new HTML_QuickForm($idForm); + $this -> quickform -> addElement('hidden',"LSdata['idForm']",$idForm); + } + + /** + * Affiche le formualaire + * + * @author Benjamin Renard + * + * @retval void + */ + function display(){ + if($this -> can_validate) { + $this -> quickform -> addElement('submit', null, $this -> submit); + } + $this -> quickform -> display(); + } + + /** + * Défini l'erreur sur un champ + * + * @author Benjamin Renard + * + * @param[in] $attr [required] string Le nom du champ + * @param[in] $msg Le format du message d'erreur à afficher (pouvant comporter + * des valeurs %{[n'importe quoi]} qui seront remplacé par le label + * du champs concerné. + * + * @retval void + */ + function setElementError($attr,$msg=NULL) { + //~ print 'erreur
'; + if($msg!='') { + $msg_error=getFData($msg,$attr->getLabel()); + } + else { + $msg_error="Les données pour l'attribut ".$attr->getLabel()." ne sont pas valides."; + } + $this -> quickform -> setElementError($attr->name,$msg_error); + } + + /** + * Verifie si le formulaire a été validé et que les données sont valides. + * + * @author Benjamin Renard + * + * @retval boolean true si le formulaire a été validé et que les données ont été validées, false sinon + */ + function validate(){ + return (($this -> can_validate)&&($this -> quickform -> validate())); + } + +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSldap.php b/trunk/includes/class/class.LSldap.php new file mode 100644 index 00000000..b547c524 --- /dev/null +++ b/trunk/includes/class/class.LSldap.php @@ -0,0 +1,171 @@ + + */ +class LSldap { + + var $config; + var $cnx = NULL; + + /** + * Constructeur + * + * Cette methode définis la configuration de l'accès à l'annuaire + * et établie la connexion. + * + * @author Benjamin Renard + * + * @param[in] $config array Tableau de configuration au formar Net_LDAP + * + * @retval void + * + * @see Net_LDAP::connect() + */ + function LSldap ($config) { + $this -> config = $config; + $this -> connect(); + } + + /** + * Connection + * + * Cette methode établie la connexion à l'annuaire Ldap + * + * @author Benjamin Renard + * + * @retval boolean true si la connection est établie, false sinon + */ + function connect() { + $this -> cnx = Net_LDAP::connect($this -> config); + if (Net_LDAP::isError($this -> cnx)) { + $GLOBALS['LSerror'] -> addErrorCode(1,$this -> cnx -> getMessage()); + $this -> cnx = NULL; + return; + } + return true; + } + + /** + * Déconnection + * + * Cette methode clos la connexion à l'annuaire Ldap + * + * @author Benjamin Renard + * + * @retval void + */ + function close() { + $this -> cnx -> done(); + } + + /** + * Recherche dans l'annuaire + * + * Cette methode effectue une recherche dans l'annuaire et retourne le resultat + * de celle-ci sous la forme d'un tableau. + * + * @author Benjamin Renard + * + * @param[in] $filter [required] string Filtre de recherche Ldap + * @param[in] $basedn string DN de base pour la recherche + * @param[in] $params array Paramètres de recherche au format Net_LDAP::search() + * + * @see Net_LDAP::search() + * + * @retval array Retourne un tableau associatif contenant : + * - ['dn'] : le DN de l'entré + * - ['attrs'] : tableau associatif contenant les attributs (clé) + * et leur valeur (valeur). + */ + function search ($filter,$basedn=NULL,$params = array() ) { + $ret = $this -> cnx -> search($basedn,$filter,$params); + if (Net_LDAP::isError($ret)) { + $GLOBALS['LSerror'] -> addErrorCode(2,$ret -> getMessage()); + return; + } + $retInfos=array(); + foreach($ret -> entries() as $entry) { + $retInfos[]=array('dn' => $entry -> dn(), 'attrs' => $entry -> getValues()); + } + return $retInfos; + } + + /** + * Compte le nombre de retour d'une recherche dans l'annuaire + * + * Cette methode effectue une recherche dans l'annuaire et retourne le nombre + * d'entrés trouvées. + * + * @author Benjamin Renard + * + * @param[in] $filter [required] string Filtre de recherche Ldap + * @param[in] $basedn string DN de base pour la recherche + * @param[in] $params array Paramètres de recherche au format Net_LDAP::search() + * + * @see Net_LDAP::search() + * + * @retval numeric Le nombre d'entré trouvées + */ + function getNumberResult ($filter,$basedn=NULL,$params = array() ) { + if (empty($filter)) + $filter=NULL; + $ret = $this -> cnx -> search($basedn,$filter,$params); + if (Net_LDAP::isError($ret)) { + $GLOBALS['LSerror'] -> addErrorCode(2,$ret -> getMessage()); + return; + } + return $ret -> count(); + } + + /** + * Charge les valeurs des attributs d'une entré de l'annuaire + * + * Cette methode recupère les valeurs des attributs d'une entrée de l'annaire + * et les retournes sous la forme d'un tableau. + * + * @author Benjamin Renard + * + * @param[in] $dn string DN de l'entré Ldap + * + * @retval array Tableau associatif des valeurs des attributs avec en clef, le nom de l'attribut. + */ + function getAttrs($dn) { + $infos = ldap_explode_dn($dn,0); + if((!$infos)||($infos['count']==0)) + return; + $basedn=''; + for ($i=1;$i<$infos['count'];$i++) { + $sep=($basedn=='')?'':','; + $basedn.=$sep.$infos[$i]; + } + $return=$this -> search($infos[0],$basedn); + return $return[0]['attrs']; + } +} + +?> \ No newline at end of file diff --git a/trunk/includes/class/class.LSldapObject.php b/trunk/includes/class/class.LSldapObject.php new file mode 100644 index 00000000..cf6c1e84 --- /dev/null +++ b/trunk/includes/class/class.LSldapObject.php @@ -0,0 +1,724 @@ + + */ +class LSldapObject { + + var $config; + var $type_name; + var $attrs; + var $forms; + var $dn=false; + var $other_values=array(); + + /** + * Constructeur + * + * Cette methode construit l'objet et définis la configuration. + * Elle lance la construction du tableau d'attributs représentés par un objet LSattribute. + * + * @author Benjamin Renard + * + * @param[in] $type_name [required] string Le nom du type de l'objet + * @param[in] $config array La configuration de l'objet + * + * @retval boolean true si l'objet a été construit, false sinon. + */ + function LSldapObject($type_name,$config='auto') { + $this -> type_name = $type_name; + $this -> config = $config; + if($config=='auto') { + if(isset($GLOBALS['LSobjects'][$type_name])) + $this -> config = $GLOBALS['LSobjects'][$type_name]; + else { + $GLOBALS['LSerror'] -> addErrorCode(21); + return; + } + } + foreach($this -> config['attrs'] as $attr_name => $attr_config) { + if(!$this -> attrs[$attr_name]=new LSattribute($attr_name,$attr_config)) + return; + } + return true; + } + + /** + * Charge les données de l'objet + * + * Cette methode définis le DN de l'objet et charge les valeurs de attributs de l'objet + * à partir de l'annuaire. + * + * @author Benjamin Renard + * + * @param[in] $dn string Le DN de l'objet. + * + * @retval boolean true si la chargement a réussi, false sinon. + */ + function loadData($dn) { + $this -> dn = $dn; + $data = $GLOBALS['LSldap'] -> getAttrs($dn); + foreach($this -> attrs as $attr_name => $attr) { + if(!$this -> attrs[$attr_name] -> loadData($data[$attr_name])) + return; + } + return true; + } + + /** + * Retourne le format d'affichage de l'objet + * + * @author Benjamin Renard + * + * @retval string Format d'affichage de l'objet. + */ + function getDisplayAttributes() { + return $this -> config['select_display_attrs']; + } + + /** + * Retourne la valeur descriptive d'affichage de l'objet + * + * Cette fonction retourne la valeur descriptive d'affichage de l'objet en fonction + * du format défini dans la configuration de l'objet ou spécifié en paramètre. + * + * @author Benjamin Renard + * + * @param[in] $spe [optionnel] string Format d'affichage de l'objet + * + * @retval string Valeur descriptive d'affichage de l'objet + */ + function getDisplayValue($spe) { + if ($spe=='') { + $spe = $this -> getDisplayAttributes(); + } + return $this -> getFData($spe,&$this -> attrs,'getDisplayValue'); + } + + /** + * Chaine formatée + * + * Cette fonction retourne la valeur d'une chaine formatée en prennant les valeurs + * de l'objet. + * + * @author Benjamin Renard + * + * @param[in] $format string Format de la chaine + * + * @retval string Valeur d'une chaine formatée + */ + function getFData($format) { + $format=getFData($format,$this,'getValue'); + return $format; + } + + /** + * DEBUG : Affiche le nom et la valeur de chaque attribut + * + * @author Benjamin Renard + * + * @retval void + */ + function debug_printAttrsValues() { + foreach($this -> attrs as $attr_name => $attr) { + print $attr_name.' : '; + $attr -> debug_printValue(); + print "\n"; + } + } + + /** + * Construit un formulaire de l'objet + * + * Cette méthode construit un formulaire LSform à partir de la configuration de l'objet + * et de chaque attribut. + * + * @param[in] $idForm [required] Identifiant du formulaire a créer + * + * @author Benjamin Renard + * + * @retval LSform Le formulaire crée + */ + function getForm($idForm,$config=array()) { + $LSform = new LSform($idForm); + $this -> forms[$idForm] = array($LSform,$config); + foreach($this -> attrs as $attr_name => $attr) { + if(!$this -> attrs[$attr_name] -> addToForm($LSform -> quickform,$idForm)) { + $LSform -> can_validate = false; + } + } + return $LSform; + } + + /** + * Met à jour les données de l'objet et de l'entré de l'annuaire + * + * Met à jour les données de l'objet à partir d'un retour d'un formulaire. + * + * @param[in] $idForm Identifiant du formulaire d'origine + * + * @author Benjamin Renard + * + * @retval boolean true si la mise à jour a réussi, false sinon + * + * @see validateAttrsData() + * @see submitChange() + */ + function updateData($idForm=NULL) { + if($idForm!=NULL) { + if(isset($this -> forms[$idForm])) + $LSform = $this -> forms[$idForm][0]; + else { + $GLOBALS['LSerror'] -> addErrorCode(22,$this -> type_name); + return; + } + } + else { + if(count($this -> forms) > 0) { + reset($this -> forms); + $idForm = key($this -> forms); + $LSform = current($this -> forms); + $config = $LSform[1]; + $LSform = $LSform[0]; + } + else { + $GLOBALS['LSerror'] -> addErrorCode(23,$this -> type_name); + $GLOBALS['LSerror'] -> stop(); + } + } + $new_data = $LSform -> quickform -> exportValues(); + foreach($new_data as $attr_name => $attr_val) { + if(isset($this -> attrs[$attr_name])) { + $this -> attrs[$attr_name] -> setUpdateData($attr_val); + } + } + if($this -> validateAttrsData($idForm)) { + if(isset($this -> config['before_save'])) { + if(function_exists($this -> config['before_save'])) { + if(!$this -> config['before_save']($this)) { + $GLOBALS['LSerror'] -> addErrorCode(28,$this -> config['before_save']); + $GLOBALS['LSerror'] -> stop(); + } + } + else { + $GLOBALS['LSerror'] -> addErrorCode(27,$this -> config['before_save']); + $GLOBALS['LSerror'] -> stop(); + } + } + $this -> submitChange($idForm); + if(isset($this -> config['after_save'])) { + if(function_exists($this -> config['after_save'])) { + if(!$this -> config['after_save']($this)) { + $GLOBALS['LSerror'] -> addErrorCode(30,$this -> config['after_save']); + } + } + else { + $GLOBALS['LSerror'] -> addErrorCode(29,$this -> config['after_save']); + } + } + } + } + + /** + * Valide les données retournées par un formulaire + * + * @param[in] $idForm Identifiant du formulaire d'origine + * + * @author Benjamin Renard + * + * @retval boolean true si les données sont valides, false sinon + */ + function validateAttrsData($idForm) { + $LSform=$this -> forms[$idForm][0]; + foreach($this -> attrs as $attr) { + if(($attr -> isUpdate())&&(!$attr -> isValidate())) { + //~ echo 'NAME : '.$attr -> name.' Val : '.$attr -> getUpdateData(); + $vconfig=$attr -> getValidateConfig(); + if(is_array($vconfig)) { + foreach($vconfig as $test) { + $data=$attr -> getUpdateData(); + if(!is_array($data)) + $data=array($data); + foreach($data as $val) { + // validation par check LDAP + if((isset($test['filter'])||isset($test['basedn']))&&(isset($test['result']))) { + $sparams=(isset($test['scope']))?array('scope' => $test['scope']):array(); + $this -> other_values['val']=$val; + $sfilter_user=(isset($test['basedn']))?getFData($test['filter'],$this,'getValue'):NULL; + //~ echo $sfilter_user; + if(isset($test['object_type'])) { + $test_obj = new $test['object_type']('auto'); + $sfilter=$test_obj->getObjectFilter(); + $sfilter='(&'.$sfilter; + if($sfilter_user[0]=='(') + $sfilter=$sfilter.$sfilter_user.')'; + else + $sfilter=$sfilter.'('.$sfilter_user.'))'; + } + else { + $sfilter=$sfilter_user; + } + $sbasedn=(isset($test['basedn']))?getFData($test['basedn'],$this,'getValue'):NULL; + $ret=$GLOBALS['LSldap'] -> getNumberResult ($sfilter,$sbasedn,$sparams); + //~ echo 'Basedn : "'.$sbasedn.'" Filter : "'.$sfilter.'" NAME : '.$attr -> name.' Nb : '.$ret."
\n"; + if($test['result']==0) { + if($ret!=0) { + $LSform -> setElementError($attr,$test['msg']); + return; + } + } + else { + if($ret<=0) { + $LSform -> setElementError($attr,$msg_error); + return; + } + } + } + // Validation par fonction externe + else if(isset($test['function'])) { + if (function_exists($test['function'])) { + if(!$test['function']($this)) { + $LSform -> setElementError($attr,$msg_error); + return; + } + } + else { + $GLOBALS['LSerror'] -> addErrorCode(24,array('attr' => $attr->name,'obj' => $this->type_name,'func' => $test['function'])); + return; + } + } + else { + $GLOBALS['LSerror'] -> addErrorCode(25,array('attr' => $attr->name,'obj' => $this->type_name)); + return; + } + } + } + } + $attr -> validate(); + } + } + unset($this -> other_values['val']); + return true; + } + + /** + * Met à jour les données modifiés dans l'annuaire + * + * @param[in] $idForm Identifiant du formulaire d'origine + * + * @author Benjamin Renard + * + * @retval boolean true si la mise à jour a réussi, false sinon + */ + function submitChange($idForm) { + $submit_data=array(); + foreach($this -> attrs as $attr) { + if(($attr -> isUpdate())&&($attr -> isValidate())) { + $submit_data[$attr -> name] = $attr -> getUpdateData(); + } + } + print_r($submit_data); + } + + /** + * Retourne les informations issus d'un DN + * + * @param[in] $dn Un DN. + * + * @author Benjamin Renard + * + * @retval array Tableau : + * - [0] : le premier paramètre + * - [1] : les paramètres suivants + */ + function getDnInfos($dn) { + $infos=ldap_explode_dn($dn,0); + if(!$infos) + return; + $first=true; + for($i=1;$i<$infos['count'];$i++) + if($first) { + $basedn.=$infos[$i]; + $first=false; + } + else + $basedn.=','.$infos[$i]; + return array($infos[0],$basedn); + } + + /** + * Fait la somme de DN + * + * Retourne un DN qui correspond au point de séparation des DN si les DN + * ne sont pas dans la meme dans la meme branche ou le dn le plus long sinon. + * + * @param[in] $dn Un premier DN. + * @param[in] $dn Un deuxième DN. + * + * @author Benjamin Renard + * + * @retval string Un DN (ou false si les DN ne sont pas valide) + */ + function sumDn($dn1,$dn2) { + $infos1=ldap_explode_dn($dn1,0); + if(!$infos1) + return; + $infos2=ldap_explode_dn($dn2,0); + if(!$infos2) + return; + if($infos2['count']>$infos1['count']) { + $tmp=$infos1; + $infos1=$infos2; + $infos2=$tmp; + } + $infos1=array_reverse($infos1); + $infos2=array_reverse($infos2); + + $first=true; + $basedn=''; + for($i=0;$i<$infos1['count'];$i++) { + if(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i]))) { + if($first) { + $basedn=$infos1[$i]; + $first=false; + } + else + $basedn=$infos1[$i].','.$basedn; + } + else { + return $basedn; + } + } + return $basedn; + } + + /** + * Vérifie la compatibilite des DN + * + * Vérifie que les DNs sont dans la même branche de l'annuaire. + * + * @param[in] $dn Un premier DN. + * @param[in] $dn Un deuxième DN. + * + * @author Benjamin Renard + * + * @retval boolean true si les DN sont compatibles, false sinon. + */ + function isCompatibleDNs($dn1,$dn2) { + $infos1=ldap_explode_dn($dn1,0); + if(!$infos1) + return; + $infos2=ldap_explode_dn($dn2,0); + if(!$infos2) + return; + if($infos2['count']>$infos1['count']) { + $tmp=$infos1; + $infos1=$infos2; + $infos2=$tmp; + } + $infos1=array_reverse($infos1); + $infos2=array_reverse($infos2); + + for($i=0;$i<$infos1['count'];$i++) { + if(($infos1[$i]==$infos2[$i])||(!isset($infos2[$i]))) + continue; + else + return false; + } + return true; + } + + /** + * Retourne le filtre correpondants aux objetcClass de l'objet + * + * @author Benjamin Renard + * + * @retval string le filtre ldap correspondant au type de l'objet + */ + function getObjectFilter() { + if(!isset($this -> config['objectclass'])) return; + foreach ($this -> config['objectclass'] as $class) + $filter.='(objectClass='.$class.')'; + return $filter; + } + + /** + * Retourne une liste d'objet du même type. + * + * Effectue une recherche en fonction des paramètres passé et retourne un + * tableau d'objet correspond au resultat de la recherche. + * + * @author Benjamin Renard + * + * @param[in] $filter array (ou string) Filtre de recherche Ldap / Tableau de filtres de recherche + * @param[in] $basedn string DN de base pour la recherche + * @param[in] $params array Paramètres de recherche au format Net_LDAP::search() + * + * @retval array Tableau d'objet correspondant au resultat de la recherche + */ + function listObjects($filter='',$basedn=NULL,$params=array()) { + $retInfos=array(); + $attrs=false; + $check_final_dn=false; + + if(!is_array($filter)) + $filter=array(array('filter' => $filter)); + + $nbFilter=count($filter); + + for($i=0;$i<$nbFilter;$i++) { + $new_attrs=array(); + // Défintion des paramètres de base pour la recherche + $sbasedn=$basedn; + $sparams=$params; + $ret=array(); + if (isset($filter[$i]['scope'])) + $sparams["scope"]=$filter[$i]['scope']; + + // Definition des critères de recherche correspondant au type d'objet à lister + if(($nbFilter==1)||(!isset($filter[$i]['attr']))) { + // Filtre sur l'objet souhaité + $sfilter='(&'; + $sfilter.=$this -> getObjectFilter(); + $sfilter_end=')'; + $check_final_dn=true; + } + // Initialisation des critères d'une recherche intermédiaire + else { + if(isset($filter[$i]['object_type'])) { + $obj_tmp=new $filter[$i]['object_type'](); + $obj_filter=$obj_tmp->getObjectFilter(); + $sfilter='(&'.$obj_filter; + $sfilter_end=')'; + } + else { + $sfilter=''; + $sfilter_end=''; + } + if(isset($filter[$i]['scope'])) { + $sparams['scope']=$filter[$i]['scope']; + } + if(isset($filter[$i]['basedn'])) { + $sbasedn=$filter[$i]['basedn']; + } + } + // Dans le cas d'une recherche intermédiaire ou finale + if($attrs!=false) { + // Initialisation des variables + $ret_gen=array(); + $new_attrs=array(); + + // Pour tout les attributs retournés + for($ii=0;$ii isCompatibleDNs($sbasedn,$basedn))&&($check_final_dn)) continue; + } + + // Vérification de la compatibilité du basedn de la recherche et du basedn générale + //~ if ($this -> isCompatibleDNs($filter[$i]['basedn'],$basedn)) { + //~ $sbasedn=$this -> sumDn($filter[$i]['basedn'],$basedn); + //~ } + // Finalisation du filtre + $sfilter_for.=$sfilter_end; + + //~ print 'filter1 : '.$sfilter_for." | basedn : ".$sbasedn."\n"; + + // Execution de la recherche + $ret=$GLOBALS['LSldap'] -> search ($sfilter_for,$sbasedn,$sparams); + + //~ print('Nb resultat : '.count($ret)); + + // Si il y un retour + if(isset($ret[0])) { + //~ print_r($ret); + // si il ya une suite (recherche intermédiaire) + if($filter[$i]['attr']){ + for($iii=0;$iii isCompatibleDNs($ret[0]['dn'],$basedn)) + continue; + // ajout du DN au resultat finale + $ret_gen[]=$ret[0]['dn']; + } + } + } + // cas du dernier filtre + if(!empty($ret_gen)) { + // on quitte la boucle des filtres de la conf + $ret=$ret_gen; + break; + } + // dans le cas d'une suite prévu mais d'un retour nul de la précédente recherche + else if(empty($new_attrs)) { + // retour vide et arrêt de la recherche + $ret=array(); + break; + } + else { + $attrs=$new_attrs; + } + } + // Dans le cas de la recherche initiale + else { + // Déclaration du filtre de recherche + if((isset($filter[$i]['filter']))&&(!empty($filter[$i]['filter']))) { + if($filter[$i]['filter'][0]=='(') { + $sfilter.=$filter[$i]['filter']; + } + else { + $sfilter.='('.$filter[$i]['filter'].')'; + } + } + // fermeture du filtre + $sfilter.=$sfilter_end; + + //~ print 'filter2 : '.$sfilter."\n"; + //~ print_r($sparams); + + // Lancement de la recherche + $ret=$GLOBALS['LSldap'] -> search ($sfilter,$sbasedn,$sparams); + + //~ print('Nb resultat : '.count($ret)); + + //Si filtre multiple => on recupère une liste d'attributs + if(isset($filter[$i]['attr'])) { + for($ii=0;$ii type_name($this -> config); + $retInfos[$i] -> loadData($ret[$i]); + //~ echo $ret[$i]['dn']."\n"; + } + + return $retInfos; + + } + + /** + * Retourne une valeur de l'objet + * + * Retourne une valeur en fonction du paramètre. Si la valeur est inconnue, la valeur retourné est ' '. + * tableau d'objet correspond au resultat de la recherche. + * + * Valeurs possibles : + * - 'dn' ou '%{dn} : DN de l'objet + * - [nom d'un attribut] : valeur de l'attribut + * - [clef de $this -> other_values] : valeur de $this -> other_values + * + * @author Benjamin Renard + * + * @param[in] $val string nom de la valeur demandée + * + * @retval mixed la valeur demandé ou ' ' si celle-ci est inconnue. + */ + function getValue($val) { + if(($val=='dn')||($val=='%{dn}')) { + return $this -> dn; + } + else if(isset($this -> attrs[$val])){ + if (method_exists($this -> attrs[$val],'getValue')) + return $this -> attrs[$val] -> getValue(); + else + return ' '; + } + else if(isset($this -> other_values[$val])){ + return $this -> other_values[$val]; + } + else { + return ' '; + } + } + +} + +?> \ No newline at end of file diff --git a/trunk/includes/functions.php b/trunk/includes/functions.php new file mode 100644 index 00000000..087ffca4 --- /dev/null +++ b/trunk/includes/functions.php @@ -0,0 +1,88 @@ + + * + * @param[in] $format string Format de la chaine + * @param[in] $data mixed Les données pour composés la chaine + * Ce paramètre peut être un tableau de string, une string, + * une tableau d'objet ou un objet. + * @param[in] $meth string Le nom de la methode de/des objet(s) à appeler pour + * obtenir la valeur de remplacement dans la chaine formatée. + * + * @retval string La chaine formatée + */ +function getFData($format,$data,$meth=NULL) { + if(is_array($data)) { + if ($meth==NULL) { + while (ereg("%{([A-Za-z0-9]+)}",$format,$ch)) { + $format=ereg_replace($ch[0],$data[$ch[1]],$format); + } + } + else { + while (ereg("%{([A-Za-z0-9]+)}",$format,$ch)) { + if (method_exists($data[$ch[1]],$meth)) { + $format=ereg_replace($ch[0],$data[$ch[1]] -> $meth(),$format); + } + else { + $GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => $ch[1])); + break; + } + } + } + } + else { + if ($meth==NULL) { + while (ereg("%{([A-Za-z0-9]+)}",$format,$ch)) + $format=ereg_replace($ch[0],$data,$format); + } + else { + while (ereg("%{([A-Za-z0-9]+)}",$format,$ch)) { + if (method_exists($data,$meth)) { + $format=ereg_replace($ch[0],$data -> $meth($ch[1]),$format); + } + else { + $GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => get_class($data))); + break; + } + } + } + } + return $format; +} + +function valid($obj) { + echo 'ok'; + return true; +} + +function return_data($data) { + return $data; +} + +?> \ No newline at end of file diff --git a/trunk/index.php b/trunk/index.php new file mode 100644 index 00000000..5101e4c9 --- /dev/null +++ b/trunk/index.php @@ -0,0 +1,80 @@ +"; + +// "Activation" de la gestion des erreurs +$LSerror = new LSerror(); + +// Connexion à l'annuaire +$LSldap = new LSldap($GLOBALS['LSconfig']['ldap_config']); + +// ---- les objets LDAP +// Création d'un LSeepeople +$eepeople = new LSeepeople($GLOBALS['LSobjects']['LSeepeople']); +$eegroup = new LSeegroup($GLOBALS['LSobjects']['LSeegroup']); +// Chargement des données de l'objet depuis l'annuaire et à partir de son DN +$eepeople-> loadData('uid=eeggs,ou=people,o=ost'); +$eegroup-> loadData('cn=adminldap,ou=groups,o=ost'); + +// Création d'un formulaire à partir pour notre objet LDAP +$form=$eepeople -> getForm('test'); + +// Gestion de sa validation +if ($form->validate()) { + // MàJ des données de l'objet LDAP + $eepeople -> updateData('test'); +} +// Affichage du formulaire +$form -> display(); + + +// Affichage des retours d'erreurs +$LSerror -> display(); +echo ""; +?> \ No newline at end of file diff --git a/trunk/test_group.php b/trunk/test_group.php new file mode 100644 index 00000000..2471bb4d --- /dev/null +++ b/trunk/test_group.php @@ -0,0 +1,71 @@ + 'uid=a*', + 'object_type' => 'LSeepeople', + ) +); + +// UniqueMember group +$filter['uniqueMember']=array( + array( + 'filter' => 'cn=admin*', + 'object_type' => 'LSeegroup', + 'attr' => 'uniqueMember', + 'basedn' => 'o=ost' + ), + array( + 'basedn' => '%{dn}' + ) +); + +// memberUid +$filter['memberUid']=array( + array( + 'filter' => 'objectClass=posixGroup', + 'attr' => 'memberUid', + 'basedn' => 'o=ost' + ), + array( + 'filter' => 'uid=%{dn}', + ) +); + + +/* +- On liste les memberUid +- on forme avec des DN et on recupère leur Groupe Principale +- on recupère tout les membres de ces groupes +- on ne garde que les ostpeople +*/ +$filter['complexe']=array( + array( + 'filter' => 'objectClass=posixGroup', + 'attr' => 'memberUid', + 'basedn' => 'o=ost' + ), + array( + 'filter' => 'uid=%{dn}', + 'basedn' => 'uid=%{dn},ou=people,o=ost', + 'attr' => 'gidNumber', + ), + array( + 'filter' => 'gidNumber=%{dn}', + 'object_type' => 'LSeegroup', + 'attr' => 'uniqueMember' + ), + array( + 'basedn' => "%{dn}", + ) +); + + + +foreach($eepeople -> listObjects($filter['complexe'],'o=ost') as $obj){ + echo "DN : ".$obj -> dn."\n
"; + $obj -> debug_printAttrsValues(); +} + +?> \ No newline at end of file