ldapsaisie/trunk/includes/class/class.LSattribute.php
Benjamin Renard ed5b3d97a0 - LdapSaisie : J'ai commencé à écrire la docummentation de LdapSaisie que
j'espère pour voir bientôt ajouté au SVN. Cela me fait mettre le doit sur
quelques problèmes de nommages, d'organisation que j'ai corrigé sur le fait :
	- Concepte de level était enfaite celui de subDn : seule le nom subDn doit
		rester.
	- Le concept de LSrights dans LSsession et config.inc.php était mal nommé.
		Il correspond plus à la définition de LSprofile en réalité. Je l'ai renommé
		ainsi.
	- Les paramètres authobject et authobject_pwdattr n'étaient pas très représentatif.
		Je les ai renommé en authObjectType et authObjectTypeAttrPwd.
- Templates : 
	-> Correction du template default dans le but de changer la couleur bleu dominante juger trop
		 flashy :). Au passage j'ai dégagé l'image de fond de #main utilisé pour colorer le menu :
		 cette méthode est moche et quitte a à faire du moche je préfère utiliser un vulgaire tableau
		 que des bidouille de ce genre.
	-> Création d'un logo pour LdapSaisie qui vient remplacer le logo Easter-Eggs utilisé jusqu'alors.
	-> Ajout d'un favicon.
- LSerror :
	-> J'ai déplacé les definitions de code d'erreur dans le contexte concerné (càd dans
		 les fichiers de définition des classes) (Feature Request #1757)
	-> J'en ai profité pour renommer les codes d'erreur avec un prefixe pour eviter les doublons
		-> J'ai donc modifié une grande partie des fichiers pour changer les codes erreurs utilisés
	-> Ajout d'une méthode getError() utilisé par getErrors()
	-> Modification de la méthode stop()
- LSformElement_password : 
 - Correction d'un bug dans la génération des mots de passe dans un	formulaire de création d'objet.
 - Ajout d'une possiblité de choisir le type de hashage du mot de passe stocké dans l'annuaire
		(Feature Request #1756)
 - Traduction des commentaires
- LSattribute : Ajout des vérifications dans les méthodes de la classe lors de l'utilisation des objets
	html et ldap.
- LSsession : 
	-> Renforcement des méthodes faisant des inclusions d'autres fichiers php.
2009-01-02 16:00:25 +00:00

718 lines
21 KiB
PHP

<?php
/*******************************************************************************
* Copyright (C) 2007 Easter-eggs
* http://ldapsaisie.labs.libre-entreprise.org
*
* Author: See AUTHORS file in top-level directory.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
$GLOBALS['LSsession'] -> loadLSclass('LSattr_ldap');
$GLOBALS['LSsession'] -> loadLSclass('LSattr_html');
/**
* Attribut Ldap
*
* Cette classe modélise un attribut Ldap
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*/
class LSattribute {
var $name;
var $config;
var $ldapObject;
var $ldap;
var $html;
var $data;
var $updateData=false;
var $is_validate=false;
var $_finalUpdateData=false;
var $_myRights=NULL;
var $_events=array();
var $_objectEvents=array();
/**
* 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 <brenard@easter-eggs.com>
*
* @param[in] $name string Nom de l'attribut ldap
* @param[in] $config array Configuration de l'objet
* @param[in] &$ldapObject LSldapObject L'objet ldap parent
*
* @retval boolean Retourne true si la création a réussi, false sinon.
*/
function LSattribute ($name,$config,&$ldapObject) {
$this -> name = $name;
$this -> config = $config;
$this -> ldapObject = $ldapObject;
$html_type = "LSattr_html_".$config['html_type'];
$ldap_type = "LSattr_ldap_".$config['ldap_type'];
$GLOBALS['LSsession'] -> loadLSclass($html_type);
$GLOBALS['LSsession'] -> loadLSclass($ldap_type);
if((class_exists($html_type))&&(class_exists($ldap_type))) {
$this -> html = new $html_type($name,$config,$this);
$this -> ldap = new $ldap_type($name,$config,$this);
}
else {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_01',array('attr' => $name,'html'=>$config['html_type'],'ldap'=>$config['ldap_type']));
return;
}
return true;
}
/**
* Retourne la valeur du label de l'attribut
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval string Le label de l'attribut
*
* @see LSattr_html::getLabel()
*/
function getLabel() {
if (!$this -> html) {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_09',array('type' => 'html','name' => $this -> name));
return;
}
return $this -> html -> getLabel();
}
/**
* Défini la valeur de l'attribut
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval boolean true
*/
function loadData($attr_data) {
if ((!is_array($attr_data))&&(!empty($attr_data))) {
$attr_data = array($attr_data);
}
$this -> data = $attr_data;
return true;
}
/**
* Redéfini la valeur de l'attribut
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval boolean true
*/
function reloadData($attr_data) {
if ((!is_array($attr_data))&&(!empty($attr_data))) {
$attr_data = array($attr_data);
}
$this -> data = $attr_data;
$this -> updateData=false;
$this -> is_validate=false;
return true;
}
/**
* Retourne la valeur de l'attribut
*
* Retourne la valeur nouvelle si elle existe, sinon la valeur passé.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval mixed La valeur de l'attribut
*/
function getValue() {
$updateData=$this -> getUpdateData();
if (empty($updateData)) {
return $this -> data;
}
else {
return $updateData;
}
}
/**
* Retourne la valeur d'affichage de l'attribut
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval string La valeur d'affichage de l'attribut
*/
function getDisplayValue() {
if (!$this -> ldap) {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_09',array('type' => 'ldap','name' => $this -> name));
return;
}
$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('LSattribute_02',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('LSattribute_02',array('attr' => $this->name,'func' => $this -> config['onDisplay']));
return;
}
}
}
return $data;
}
/**
* Ajoute l'attribut au formulaire
*
* 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 <brenard@easter-eggs.com>
*
* @param[in] object $form Le formulaire dans lequel doit être ajouté l'attribut
* @param[in] string $idForm L'identifiant du formulaire
* @param[in] objet &$obj Objet utilisable pour la génération de la valeur de l'attribut
* @param[in] array $value valeur de l'élement
*
* @retval boolean true si l'ajout a fonctionner ou qu'il n'est pas nécessaire, false sinon
*/
function addToForm(&$form,$idForm,&$obj=NULL,$value=NULL) {
if(isset($this -> config['form'][$idForm])) {
if (!$this -> html) {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_09',array('type' => 'html','name' => $this -> name));
return;
}
if($this -> myRights() == 'n') {
return true;
}
if ($value) {
$data = $value;
}
else if($this -> data !='') {
$data=$this -> getFormVal();
}
else if (isset($this -> config['default_value'])) {
$data=$obj -> getFData($this -> config['default_value']);
}
$element = $this -> html -> addToForm($form,$idForm,$data);
if(!$element) {
$GLOBALS['LSerror'] -> addErrorCode('LSform_06',$this -> name);
}
if($this -> config['required']==1) {
$form -> setRequired($this -> name);
}
if (($this -> config['form'][$idForm]==0) || ($this -> myRights() == 'r')) {
$element -> freeze();
}
else {
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('LSattribute_03',array('attr' => $this->name,'rule' => $rule));
return;
}
if(!isset($rule_infos['msg']))
$rule_infos['msg']=getFData(_('La valeur du champs %{label} est invalide.'),$this -> config['label']);
if(!isset($rule_infos['params']))
$rule_infos['params']=NULL;
$form -> addRule($this -> name,$rule,array('msg' => $rule_infos['msg'], 'params' => $rule_infos['params']));
}
}
else {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_04',$this->name);
}
}
}
}
return true;
}
/**
* Récupération des droits de l'utilisateur sur l'attribut
*
* @retval string 'r'/'w'/'n' pour 'read'/'write'/'none'
**/
function myRights() {
// cache
if ($this -> _myRights != NULL) {
return $this -> _myRights;
}
$return='n';
$whoami = $this -> ldapObject -> whoami();
foreach($whoami as $who) {
switch ($who) {
case 'admin':
if($this -> config['rights']['admin']=='w') {
$return='w';
break;
}
else {
$return='r';
}
break;
default:
if ($this -> config['rights'][$who] == 'w') {
$return='w';
break;
}
else if($this -> config['rights'][$who] == 'r') {
$return='r';
}
break;
}
if ($return=='w') {
break;
}
}
$this -> _myRights = $return;
return $return;
}
/**
* Ajoute l'attribut au formualaire de vue
*
* Cette méthode ajoute l'attribut au formulaire $form de vue si il doit l'être
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param[in] object $form Le formulaire dans lequel doit être ajouté l'attribut
*
* @retval boolean true si l'ajout a fonctionner ou qu'il n'est pas nécessaire, false sinon
*/
function addToView(&$form) {
if((isset($this -> config['view'])) && ($this -> myRights() != 'n') ) {
if (!$this -> html) {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_09',array('type' => 'html','name' => $this -> name));
return;
}
if($this -> data !='') {
$data=$this -> getFormVal();
}
else {
$data='';
}
$element = $this -> html -> addToForm($form,'view',$data);
if(!$element instanceof LSformElement) {
$GLOBALS['LSerror'] -> addErrorCode('LSform_06',$this -> name);
return;
}
$element -> freeze();
return true;
}
return true;
}
/**
* Rafraichis la valeur de l'attribut dans un formualaire
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param[in] object &$form LSform Le formulaire dans lequel doit être ajouté l'attribut
* @param[in] string $idForm L'identifiant du formulaire
*
* @retval boolean true si la valeur a été rafraichie ou que ce n'est pas nécessaire, false sinon
*/
function refreshForm(&$form,$idForm) {
if(isset($this -> config['form'][$idForm])&&($this -> myRights()!='n')) {
if (!$this -> html) {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_09',array('type' => 'html','name' => $this -> name));
return;
}
$form_element = $form -> getElement($this -> name);
if ($form_element) {
$values = $this -> html -> refreshForm($this -> getFormVal());
return $form_element -> setValue($values);
}
else {
LSdebug('LSformElement "'.$this -> name.'" n\'existe pas');
}
}
return true;
}
/**
* Retourne la valeur a afficher dans le formulaire
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval string La valeur a afficher dans le formulaire.
*/
function getFormVal() {
$data=$this -> getDisplayValue();
if ($data==NULL) {
$data=array();
}
if(!is_array($data)) {
$data=array($data);
}
return $data;
}
/**
* Définis les données de mises à jour si un changement a eut lieu
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param[in] string $data Les données de mise à jour.
*
* @retval void
*/
function setUpdateData($data) {
if($this -> getFormVal() != $data) {
$this -> updateData=$data;
}
}
/**
* Vérifie si l'attribut a été validé
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval boolean true si l'attribut a été validé, false sinon
*/
function isValidate() {
return $this -> is_validate;
}
/**
* Valide le champs
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval void
*/
function validate() {
$this -> is_validate=true;
}
/**
* Vérifie si l'attribut a été mise à jour
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval boolean true si l'attribut a été mis à jour, false sinon
*/
function isUpdate() {
return ($this -> updateData===false)?false:true;
}
/**
* Vérifie si l'attribut est obligatoire
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval boolean true si l'attribut est obligatoire, false sinon
*/
function isRequired() {
return $this -> config['required'];
}
/**
* Vérifie si la valeur de l'attribut peut être générée
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval boolean true si la valeur de l'attribut peut être générée, false sinon
*/
function canBeGenerated() {
if (function_exists($this -> config['generate_function'])) {
return true;
}
else if (isset($this -> config['generate_value_format'])) {
return true;
}
else {
return ;
}
}
/**
* Génere la valeur de l'attribut à partir de la fonction de génération
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval boolean true si la valeur à put être générée, false sinon
*/
function generateValue() {
if (function_exists($this -> config['generate_function'])) {
$value=call_user_func($this -> config['generate_function'],$this -> ldapObject);
}
else if (isset($this -> config['generate_value_format'])) {
$value = $this -> ldapObject -> getFData($this -> config['generate_value_format']);
}
if (!empty($value)) {
//$this -> setValue($value); // pas nécéssaire ??
$this -> updateData=array($value);
return true;
}
return;
}
/**
* Retourne la valeur de l'attribut pour son enregistrement dans l'annuaire
* si l'attribut à été modifié.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval mixed La valeur de l'attribut pour son enregistrement dans l'annuaire
*/
function getUpdateData() {
if (!$this -> isUpdate()) {
return;
}
if ( $this -> _finalUpdateData ) {
return $this -> _finalUpdateData;
}
$data=$this -> updateData;
if ($this -> config['onSave']) {
if (is_array($this -> config['onSave'])) {
$result=$data;
foreach($this -> config['onSave'] as $func) {
if (function_exists($func)) {
$result=$func($result);
}
else {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_05',array('attr' => $this->name,'func' => $func));
return;
}
}
}
else {
if (function_exists($this -> config['onSave'])) {
$result = $this -> config['onSave']($data);
}
else {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_05',array('attr' => $this->name,'func' => $this -> config['onSave']));
return;
}
}
}
else {
if (!$this -> ldap) {
$GLOBALS['LSerror'] -> addErrorCode('LSattribute_09',array('type' => 'ldap','name' => $this -> name));
return;
}
else {
$result = $this -> ldap -> getUpdateData($data);
}
}
$this -> _finalUpdateData = $result;
return $result;
}
/**
* Retourne la configuration de validation de l'attribut
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval mixed La configuration de validation de l'attribut
*/
function getValidateConfig() {
return $this -> config['validation'];
}
/**
* Retourne les attributs dépendants de celui-ci
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval array les noms des attributs dépendants
*/
function getDependsAttrs() {
return $this -> config['dependAttrs'];
}
/**
* Ajouter une action lors d'un événement
*
* @param[in] $event string Le nom de l'événement
* @param[in] $fct string Le nom de la fonction à exectuer
* @param[in] $params mixed Paramètres pour le lancement de la fonction
* @param[in] $class Nom de la classe possèdant la méthode $fct à executer
*
* @retval void
*/
function addEvent($event,$fct,$params,$class=NULL) {
$this -> _events[$event][] = array(
'function' => $fct,
'params' => $params,
'class' => $class
);
}
/**
* Ajouter une action sur un objet lors d'un événement
*
* @param[in] $event string Le nom de l'événement
* @param[in] $obj object L'objet dont la méthode doit être executé
* @param[in] $meth string Le nom de la méthode
* @param[in] $params mixed Paramètres d'execution de la méthode
*
* @retval void
*/
function addObjectEvent($event,&$obj,$meth,$params=NULL) {
$this -> _objectEvents[$event][] = array(
'obj' => $obj,
'meth' => $meth,
'params' => $params
);
}
/**
* Lance les actions à executer lors d'un événement
*
* @param[in] $event string Le nom de l'événement
*
* @retval boolean True si tout c'est bien passé, false sinon
*/
function fireEvent($event) {
$return = true;
if(isset($this -> config[$event])) {
if (!is_array($this -> config[$event])) {
$funcs = array($this -> config[$event]);
}
else {
$funcs = $this -> config[$event];
}
foreach($funcs as $func) {
if(function_exists($func)) {
if(!$func($this -> ldapObject)) {
$return = false;
}
}
else {
$return = false;
}
}
}
if (is_array($this -> _events[$event])) {
foreach ($this -> _events[$event] as $e) {
if ($e['class']) {
if (class_exists($e['class'])) {
$obj = new $e['class']();
if (method_exists($obj,$e['fct'])) {
try {
$obj -> $e['fct']($e['params']);
}
catch(Exception $er) {
$return = false;
LSdebug("Event ".$event." : Erreur durant l'execution de la méthode ".$e['fct']." de la classe ".$e['class']);
}
}
else {
LSdebug("Event ".$event." : La méthode ".$e['fct']." de la classe ".$e['class']." n'existe pas.");
$return = false;
}
}
else {
$return = false;
LSdebug("Event ".$event." : La classe ".$e['class']." n'existe pas");
}
}
else {
if (function_exists($e['fct'])) {
try {
$e['fct']($e['params']);
}
catch(Exception $er) {
LSdebug("Event ".$event." : Erreur durant l'execution de la function ".$e['fct']);
$return = false;
}
}
else {
LSdebug("Event ".$event." : la function ".$e['fct']." n'existe pas");
$return = false;
}
}
}
}
if (is_array($this -> _objectEvents[$event])) {
foreach ($this -> _objectEvents[$event] as $e) {
if (method_exists($e['obj'],$e['meth'])) {
try {
$e['obj'] -> $e['meth']($e['params']);
}
catch(Exception $er) {
$return = false;
LSdebug("Event ".$event." : Erreur durant l'execution de la méthode ".$e['meth']." sur l'objet.");
}
}
else {
LSdebug("Event ".$event." : La méthode ".$e['meth']." de l'objet n'existe pas.");
$return = false;
}
}
}
return $return;
}
}
/**
* Error Codes
**/
$GLOBALS['LSerror_code']['LSattribute_01'] = array (
'msg' => _("LSattribute : Attribute %{attr} : LDAP or HTML types unknow (LDAP = %{ldap} & HTML = %{html}).")
);
$GLOBALS['LSerror_code']['LSattribute_02'] = array (
'msg' => _("LSattribute : The function %{func} to display the attribute %{attr} is unknow.")
);
$GLOBALS['LSerror_code']['LSattribute_03'] = array (
'msg' => _("LSattribute : The rule %{rule} to validate the attribute %{attr} is unknow.")
);
$GLOBALS['LSerror_code']['LSattribute_04'] = array (
'msg' => _("LSattribute : Configuration data to verify the attribute %{attr} are incorrect.")
);
$GLOBALS['LSerror_code']['LSattribute_05'] = array (
'msg' => _("LSattribute : The function %{func} to save the attribute %{attr} is unknow.")
);
$GLOBALS['LSerror_code']['LSattribute_06'] = array (
'msg' => _("LSattribute : The value of the attribute %{attr} can't be generated.")
);
$GLOBALS['LSerror_code']['LSattribute_07'] = array (
'msg' => _("LSattribute : Generation of the attribute %{attr} failed.")
);
$GLOBALS['LSerror_code']['LSattribute_08'] = array (
'msg' => _("LSattribute : Generation of the attribute %{attr} did not return a correct value.")
);
$GLOBALS['LSerror_code']['LSattribute_09'] = array (
'msg' => _("LSattribute : The attr_%{type} of the attribute %{name} is not yet defined.")
);
?>