- LSldapObject :

-> Ajout de la possibilité de changer le RDN d'un objet
    -> Mise à jour automatique des relations définis avec les autres types
    d'objet à partir du moment que le paramètre 'rename_function' est défini
    dans la configuration de la relation
    -> Ajout des méthodes suivantes :
      -> beforeRename() : Executer avant le changement de DN elle permet de
      préparer le renomage.
      -> afterRename() : Executer après le changement de DN elle finalise le
      renomage.
    -> Méthode submitData() : prise en charge du changement du RDN
- LSrelation :
  -> Correction d'une erreur dans index_ajax.php : le paramètre
  $relationConf['remove_function'] n'était pas utilisé
- LSeegroup :
  -> Création d'une propriété $userObjectType pour stocké le type des objets
  utilisateurs
  -> Création de la méthode renameOneMember() pour assurer les modifications
  nécéssaire lors du changement de DN d'un utilisateur
- LSformElement_date : Suppression du chargement du fichier js : calendar-setup
  inutile l'utilisation faite de jscalendar.
- LSattribute :
  -> Ajout d'une possibilité pour générer une valeur à partir d'un format de
  chaine et la méthode getFData() des objets LSldapObject. Cette méthode fait
  référence au paramètre 'generate_value_format' de la configuration d'un
  attribut pour générer la valeur
- LSldap :
  -> Ajout d'une méthode move() pour changer le DN d'un objet
- LSsession :
  -> Ajout de la méthode changeAuthUser() pour changer l'utilisateur connecté
  en cour de session. (Utile lors de la modification de l'utilisateur par lui
  même)
- functions.php : Correction d'un bug dans la fontion getFData().
- modify.php : Vérification des droits de l'utilisateur après chargement et
  eventuellement modification de celui-ci pour intégrer les eventuelles
  modifications faites par l'utilisateur.
This commit is contained in:
Benjamin Renard 2008-07-29 13:45:02 +00:00
parent eb64909db6
commit c78a95c1d5
12 changed files with 236 additions and 43 deletions

View file

@ -39,7 +39,8 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
'LSobject' => 'LSeegroup',
'list_function' => 'listUserGroups',
'update_function' => 'updateUserGroups',
'remove_function' => 'removeMember',
'remove_function' => 'deleteOneMember',
'rename_function' => 'renameOneMember',
'rights' => array(
'self' => 'r',
'admin' => 'w'
@ -72,8 +73,11 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
),
'view' => 1,
'form' => array (
'modify' => 0,
'modify' => 1,
'create' => 1
),
'dependAttrs' => array(
'homeDirectory'
)
),
'uidNumber' => array (
@ -243,15 +247,11 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
'ldap_type' => 'ascii',
'html_type' => 'text',
'required' => 1,
'default_value' => '/home/%{uid}',
'generate_function' => 'generate_homeDirectory',
'rights' => array(
'self' => 'r'
),
'view' => 1,
'form' => array (
'modify' => 1,
)
'view' => 1
),
'mail' => array (
'label' => _('Adresse e-mail'),

View file

@ -116,8 +116,16 @@ $GLOBALS['LSerror_code'] = array (
'msg' => _("LSldapObject : Erreur durant la suppression de %{objectname}."),
'level' => 'c'
),
36 => array (
'msg' => _("LSldapObject : Erreur durant les actions avant renomage."),
'level' => 'c'
),
37 => array (
'msg' => _("LSldapObject : Erreur durant les actions après renomage."),
'level' => 'c'
),
// LSldapObject
// LSattribute
41 => array (
'msg' => _("LSattribute : Attribut %{attr} : Type d'attribut (ldap // html) inconnu (ldap = %{ldap} | html = %{html})."),
'level' => 'c'

View file

@ -404,7 +404,15 @@ class LSattribute {
* @retval boolean true si la valeur de l'attribut peut être générée, false sinon
*/
function canBeGenerated() {
return (function_exists($this -> config['generate_function']));
if (function_exists($this -> config['generate_function'])) {
return true;
}
else if (isset($this -> config['generate_value_format'])) {
return true;
}
else {
return ;
}
}
/**
@ -415,10 +423,12 @@ class LSattribute {
* @retval boolean true si la valeur à put être générée, false sinon
*/
function generateValue() {
if ( ! $this -> canBeGenerated() ) {
return;
}
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);

View file

@ -149,7 +149,7 @@ class LSformElement_date extends LSformElement {
$GLOBALS['LSsession'] -> addJSscript('calendar-en.js',LS_LIB_DIR.'jscalendar/lang/');
$codeLang = strtolower($GLOBALS['LSconfig']['lang'][0].$GLOBALS['LSconfig']['lang'][1]);
$GLOBALS['LSsession'] -> addJSscript('calendar-'.$codeLang.'.js',LS_LIB_DIR.'jscalendar/lang/');
$GLOBALS['LSsession'] -> addJSscript('calendar-setup.js',LS_LIB_DIR.'jscalendar/');
//$GLOBALS['LSsession'] -> addJSscript('calendar-setup.js',LS_LIB_DIR.'jscalendar/');
$GLOBALS['LSsession'] -> addJSscript('LSformElement_date_field.js');
$GLOBALS['LSsession'] -> addJSscript('LSformElement_date.js');
}

View file

@ -337,6 +337,17 @@ class LSldap {
return $this -> cnx -> delete($dn,array('recursive' => true));
}
/**
* Déplace un objet LDAP dans l'annuaire
*
* @param[in] $old string Le DN actuel
* @param[in] $new string Le futur DN
*
* @retval boolean True si l'objet a été déplacé, false sinon
*/
function move($old,$new) {
return (!Net_LDAP2::isError($this -> cnx -> move($old,$new)));
}
}
?>

View file

@ -41,6 +41,7 @@ class LSldapObject {
var $submitError=true;
var $_whoami=NULL;
var $_subDn_value=NULL;
var $_relationsCache=array();
/**
* Constructeur
@ -447,7 +448,7 @@ class LSldapObject {
}
}
else {
if($ret<=0) {
if($ret<0) {
$LSform -> setElementError($attr,$msg_error);
return;
}
@ -512,9 +513,33 @@ class LSldapObject {
$submitData=array();
foreach($this -> attrs as $attr) {
if(($attr -> isUpdate())&&($attr -> isValidate())) {
if($attr -> name == $this -> config['rdn']) {
debug('Rename');
if (!$this -> beforeRename()) {
$GLOBALS['LSerror'] -> addErrorCode(36);
return;
}
$oldDn = $this -> getDn();
$this -> dn = false;
$newDn = $this -> getDn();
if ($newDn) {
if (!$GLOBALS['LSldap'] -> move($oldDn,$newDn)) {
return;
}
if (!$this -> afterRename($oldDn,$newDn)) {
$GLOBALS['LSerror'] -> addErrorCode(37);
return;
}
}
else {
return;
}
}
else {
$submitData[$attr -> name] = $attr -> getUpdateData();
}
}
}
if(!empty($submitData)) {
$dn=$this -> getDn();
if($dn) {
@ -977,6 +1002,77 @@ class LSldapObject {
$subDnLdapServer = $GLOBALS['LSsession'] -> getSortSubDnLdapServer();
return $subDnLdapServer[$this -> getSubDnValue()];
}
/**
* Methode executant les actions nécéssaires avant le changement du DN de
* l'objet.
*
* Cette méthode n'est qu'un exemple et elle doit être certainement réécrite
* pour les objets plus complexe.
*
* @retval True en cas de cas ce succès, False sinon.
*/
function beforeRename() {
if (is_array($this->config['relations'])) {
foreach($this->config['relations'] as $relation_name => $relation_conf) {
if ( isset($relation_conf['list_function']) && isset($relation_conf['rename_function']) ) {
if ($GLOBALS['LSsession'] -> loadLSobject($relation_conf['LSobject'])) {
$obj = new $relation_conf['LSobject']();
if (method_exists($obj,$relation_conf['list_function'])) {
$list = $obj -> $relation_conf['list_function']($this);
if (is_array($list)) {
$this -> _relationsCache[$relation_name] = $list;
}
else {
return;
}
}
else {
return;
}
}
else {
return;
}
}
}
}
return true;
}
/**
* Methode executant les actions nécéssaires après le changement du DN de
* l'objet.
*
* Cette méthode n'est qu'un exemple et elle doit être certainement réécrite
* pour les objets plus complexe.
*
* @param[in] $oldDn string L'ancien DN de l'objet
* @param[in] $newDn string Le nouveau DN de l'objet
*
* @retval True en cas de cas ce succès, False sinon.
*/
function afterRename($oldDn,$newDn) {
$error = 0;
if($GLOBALS['LSsession'] -> dn == $oldDn) {
$GLOBALS['LSsession'] -> changeAuthUser($this);
}
foreach($this -> _relationsCache as $relation_name => $objList) {
foreach($objList as $obj) {
$meth = $this->config['relations'][$relation_name]['rename_function'];
if (method_exists($obj,$meth)) {
if (!($obj -> $meth($this,$oldDn))) {
$error=1;
}
}
else {
$error=1;
}
}
}
return !$error;
}
}
?>

View file

@ -27,6 +27,8 @@
*/
class LSeegroup extends LSldapObject {
var $userObjectType = 'LSeepeople';
/**
* Constructeur
*
@ -50,7 +52,7 @@ class LSeegroup extends LSldapObject {
* Retourne un tableau de LSeegroup correspondant aux groupes
* auxquels appartient un utilisateur
*
* @param[in] $userObject Un object LSeepeople
* @param[in] $userObject Un object user (type : $this -> userObjectType)
*
* @retval Array of LSeegroup Les groupes de l'utilisateur
**/
@ -64,12 +66,12 @@ class LSeegroup extends LSldapObject {
/**
* Ajoute un utilisateur au groupe
*
* @param[in] $object Un object LSeepeople : l'utilisateur à ajouter
* @param[in] $object Un object user ($this -> userObjectType) : l'utilisateur à ajouter
*
* @retval boolean true si l'utilisateur à été ajouté, False sinon
**/
function addOneMember($object) {
if ($object instanceof LSeepeople) {
if ($object instanceof $this -> userObjectType) {
if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
$dn = $object -> getDn();
$values = $this -> attrs['uniqueMember'] -> getValue();
@ -92,12 +94,12 @@ class LSeegroup extends LSldapObject {
/**
* Supprime un utilisateur du groupe
*
* @param[in] $object Un object LSeepeople : l'utilisateur à supprimer
* @param[in] $object Un object (type : $this -> userObjectType) : l'utilisateur à supprimer
*
* @retval boolean true si l'utilisateur à été supprimé, False sinon
**/
function deleteOneMember($object) {
if ($object instanceof LSeepeople) {
if ($object instanceof $this -> userObjectType) {
if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
$dn = $object -> getDn();
$values = $this -> attrs['uniqueMember'] -> getValue();
@ -113,8 +115,39 @@ class LSeegroup extends LSldapObject {
}
return $GLOBALS['LSldap'] -> update($this -> getType(),$this -> getDn(), array('uniqueMember' => $updateData));
}
}
}
return;
}
/**
* Renome un utilisateur
*
* @param[in] $object Un object (type : $this -> userObjectType) : l'utilisateur à renomer
* @param[in] $oldDn string L'ancien DN de l'utilisateur
*
* @retval boolean True en cas de succès, False sinon
*/
function renameOneMember($object,$oldDn) {
if ($object instanceof $this -> userObjectType) {
if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
$values = $this -> attrs['uniqueMember'] -> getValue();
if ((!is_array($values)) && (!empty($values))) {
$values = array($values);
}
if (is_array($values)) {
$updateData=array();
foreach($values as $value) {
if ($value!=$oldDn) {
$updateData[] = $value;
}
else {
$updateData[] = $object-> getDn();
}
}
return $GLOBALS['LSldap'] -> update($this -> getType(),$this -> getDn(), array('uniqueMember' => $updateData));
}
}
}
return;
}
@ -122,7 +155,7 @@ class LSeegroup extends LSldapObject {
/**
* Met à jour les groupes d'un utilisateur
*
* @param[in] $userObject LSeepeople Un object LSeepeople : l'utilisateur
* @param[in] $userObject Mixed Un object (type : $this -> userObjectType) : l'utilisateur
* @param[in] $listDns Array(string) Un tableau des DNs des groupes de l'utilisateur
*
* @retval boolean true si tout c'est bien passé, False sinon

View file

@ -486,6 +486,34 @@ class LSsession {
}
}
/**
* Modifie l'utilisateur connecté à la volé
*
* @param[in] $object Mixed L'objet Ldap du nouvel utilisateur
* le type doit correspondre à
* $this -> ldapServer['authobject']
*
* @retval boolean True en cas de succès, false sinon
*/
function changeAuthUser($object) {
if ($object instanceof $this -> ldapServer['authobject']) {
$this -> dn = $object -> getDn();
$rdn = $object -> getValue('rdn');
if(is_array($rdn)) {
$rdn = $rdn[0];
}
$this -> rdn = $rdn;
$this -> LSuserObject = $object;
if($this -> loadLSrights()) {
$this -> loadLSaccess();
$_SESSION['LSsession']=get_object_vars($this);
return true;
}
}
return;
}
/**
* Définition du serveur Ldap de la session
*

View file

@ -53,7 +53,11 @@ function getFData($format,$data,$meth=NULL) {
else {
while (ereg("%{([A-Za-z0-9]+)}",$format[$i],$ch)) {
if (method_exists($data[$ch[1]],$meth)) {
$format[$i]=ereg_replace($ch[0],$data[$ch[1]] -> $meth(),$format[$i]);
$value = $data[$ch[1]] -> $meth();
if (is_array($value)) {
$value = $value[0];
}
$format[$i]=ereg_replace($ch[0],$value,$format[$i]);
}
else {
$GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => $ch[1]));
@ -70,7 +74,11 @@ function getFData($format,$data,$meth=NULL) {
else {
while (ereg("%{([A-Za-z0-9]+)}",$format[$i],$ch)) {
if (method_exists($data,$meth)) {
$format[$i]=ereg_replace($ch[0],$data -> $meth($ch[1]),$format[$i]);
$value = $data -> $meth($ch[1]);
if (is_array($value)) {
$value = $value[0];
}
$format[$i]=ereg_replace($ch[0],$value,$format[$i]);
}
else {
$GLOBALS['LSerror'] -> addErrorCode(901,array('meth' => $meth,'obj' => get_class($data)));

View file

@ -241,7 +241,7 @@ if (!isset($_ERRORS)) {
$ok=false;
foreach($list as $o) {
if($o -> getDn() == $_REQUEST['dn']) {
if (!$o -> deleteOneMember($object)) {
if (!$o -> $relationConf['remove_function']($object)) {
$GLOBALS['LSerror'] -> addErrorCode(1015,$conf['relationName']);
}
else {

View file

@ -45,20 +45,6 @@ if($LSsession -> startLSsession()) {
// Création d'un LSobject
if ($GLOBALS['LSsession'] -> loadLSobject($LSobject)) {
if ( $GLOBALS['LSsession'] -> canEdit($LSobject,$dn) ) {
$LSview_actions[] = array(
'label' => _('Voir'),
'url' =>'view.php?LSobject='.$LSobject.'&amp;dn='.$dn,
'action' => 'view'
);
if ($GLOBALS['LSsession'] -> canRemove($LSobject,$dn)) {
$LSview_actions[] = array(
'label' => _('Supprimer'),
'url' => 'remove.php?LSobject='.$LSobject.'&amp;dn='.$dn,
'action' => 'delete'
);
}
$object = new $LSobject();
if ($object -> loadData($dn)) {
// Définition du Titre de la page
@ -68,10 +54,23 @@ if($LSsession -> startLSsession()) {
// MàJ des données de l'objet LDAP
if ($object -> updateData('modify')) {
debug('ok');
//header('Location: view.php?LSobject='.$LSobject.'&dn='.$object -> getDn());
}
}
$LSview_actions[] = array(
'label' => _('Voir'),
'url' =>'view.php?LSobject='.$LSobject.'&amp;dn='.$object -> getDn(),
'action' => 'view'
);
if ($GLOBALS['LSsession'] -> canRemove($LSobject,$object -> getDn())) {
$LSview_actions[] = array(
'label' => _('Supprimer'),
'url' => 'remove.php?LSobject='.$LSobject.'&amp;dn='.$object -> getDn(),
'action' => 'delete'
);
}
$GLOBALS['LSsession'] -> addJSscript('LSsmoothbox.js');