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

View file

@ -116,8 +116,16 @@ $GLOBALS['LSerror_code'] = array (
'msg' => _("LSldapObject : Erreur durant la suppression de %{objectname}."), 'msg' => _("LSldapObject : Erreur durant la suppression de %{objectname}."),
'level' => 'c' '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 ( 41 => array (
'msg' => _("LSattribute : Attribut %{attr} : Type d'attribut (ldap // html) inconnu (ldap = %{ldap} | html = %{html})."), 'msg' => _("LSattribute : Attribut %{attr} : Type d'attribut (ldap // html) inconnu (ldap = %{ldap} | html = %{html})."),
'level' => 'c' '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 * @retval boolean true si la valeur de l'attribut peut être générée, false sinon
*/ */
function canBeGenerated() { 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 * @retval boolean true si la valeur à put être générée, false sinon
*/ */
function generateValue() { function generateValue() {
if ( ! $this -> canBeGenerated() ) { if (function_exists($this -> config['generate_function'])) {
return;
}
$value=call_user_func($this -> config['generate_function'],$this -> ldapObject); $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)) { if (!empty($value)) {
//$this -> setValue($value); // pas nécéssaire ?? //$this -> setValue($value); // pas nécéssaire ??
$this -> updateData=array($value); $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/'); $GLOBALS['LSsession'] -> addJSscript('calendar-en.js',LS_LIB_DIR.'jscalendar/lang/');
$codeLang = strtolower($GLOBALS['LSconfig']['lang'][0].$GLOBALS['LSconfig']['lang'][1]); $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-'.$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_field.js');
$GLOBALS['LSsession'] -> addJSscript('LSformElement_date.js'); $GLOBALS['LSsession'] -> addJSscript('LSformElement_date.js');
} }

View file

@ -337,6 +337,17 @@ class LSldap {
return $this -> cnx -> delete($dn,array('recursive' => true)); 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 $submitError=true;
var $_whoami=NULL; var $_whoami=NULL;
var $_subDn_value=NULL; var $_subDn_value=NULL;
var $_relationsCache=array();
/** /**
* Constructeur * Constructeur
@ -447,7 +448,7 @@ class LSldapObject {
} }
} }
else { else {
if($ret<=0) { if($ret<0) {
$LSform -> setElementError($attr,$msg_error); $LSform -> setElementError($attr,$msg_error);
return; return;
} }
@ -512,9 +513,33 @@ class LSldapObject {
$submitData=array(); $submitData=array();
foreach($this -> attrs as $attr) { foreach($this -> attrs as $attr) {
if(($attr -> isUpdate())&&($attr -> isValidate())) { 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(); $submitData[$attr -> name] = $attr -> getUpdateData();
} }
} }
}
if(!empty($submitData)) { if(!empty($submitData)) {
$dn=$this -> getDn(); $dn=$this -> getDn();
if($dn) { if($dn) {
@ -977,6 +1002,77 @@ class LSldapObject {
$subDnLdapServer = $GLOBALS['LSsession'] -> getSortSubDnLdapServer(); $subDnLdapServer = $GLOBALS['LSsession'] -> getSortSubDnLdapServer();
return $subDnLdapServer[$this -> getSubDnValue()]; 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 { class LSeegroup extends LSldapObject {
var $userObjectType = 'LSeepeople';
/** /**
* Constructeur * Constructeur
* *
@ -50,7 +52,7 @@ class LSeegroup extends LSldapObject {
* Retourne un tableau de LSeegroup correspondant aux groupes * Retourne un tableau de LSeegroup correspondant aux groupes
* auxquels appartient un utilisateur * 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 * @retval Array of LSeegroup Les groupes de l'utilisateur
**/ **/
@ -64,12 +66,12 @@ class LSeegroup extends LSldapObject {
/** /**
* Ajoute un utilisateur au groupe * 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 * @retval boolean true si l'utilisateur à été ajouté, False sinon
**/ **/
function addOneMember($object) { function addOneMember($object) {
if ($object instanceof LSeepeople) { if ($object instanceof $this -> userObjectType) {
if ($this -> attrs['uniqueMember'] instanceof LSattribute) { if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
$dn = $object -> getDn(); $dn = $object -> getDn();
$values = $this -> attrs['uniqueMember'] -> getValue(); $values = $this -> attrs['uniqueMember'] -> getValue();
@ -92,12 +94,12 @@ class LSeegroup extends LSldapObject {
/** /**
* Supprime un utilisateur du groupe * 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 * @retval boolean true si l'utilisateur à été supprimé, False sinon
**/ **/
function deleteOneMember($object) { function deleteOneMember($object) {
if ($object instanceof LSeepeople) { if ($object instanceof $this -> userObjectType) {
if ($this -> attrs['uniqueMember'] instanceof LSattribute) { if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
$dn = $object -> getDn(); $dn = $object -> getDn();
$values = $this -> attrs['uniqueMember'] -> getValue(); $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 $GLOBALS['LSldap'] -> update($this -> getType(),$this -> getDn(), array('uniqueMember' => $updateData));
} }
}
}
return; 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; return;
} }
@ -122,7 +155,7 @@ class LSeegroup extends LSldapObject {
/** /**
* Met à jour les groupes d'un utilisateur * 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 * @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 * @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 * Définition du serveur Ldap de la session
* *

View file

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

View file

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

View file

@ -45,20 +45,6 @@ if($LSsession -> startLSsession()) {
// Création d'un LSobject // Création d'un LSobject
if ($GLOBALS['LSsession'] -> loadLSobject($LSobject)) { if ($GLOBALS['LSsession'] -> loadLSobject($LSobject)) {
if ( $GLOBALS['LSsession'] -> canEdit($LSobject,$dn) ) { 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(); $object = new $LSobject();
if ($object -> loadData($dn)) { if ($object -> loadData($dn)) {
// Définition du Titre de la page // Définition du Titre de la page
@ -68,10 +54,23 @@ if($LSsession -> startLSsession()) {
// MàJ des données de l'objet LDAP // MàJ des données de l'objet LDAP
if ($object -> updateData('modify')) { if ($object -> updateData('modify')) {
debug('ok'); 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'); $GLOBALS['LSsession'] -> addJSscript('LSsmoothbox.js');