- config.inc.php :

-> Ajout d'une configuration Multi-niveau utilisant LSeecompany
- LSeecompany :
  -> Refonte
  -> Définition dans le schéma LSexample
- LSldapOject :
  -> container_auto_create : auto création des containers de LSobject dans les
  LSobjects définissant les subDn
  -> Ajout de trigger :
    -> Avant suppression beforeDelete() et après afterDelete()
      -> Gestion des LSrelations définies et ayant une méthode remove_function
      définie
    -> Après la création : afterCreate()
      -> auto création des containers de LSobject dans les LSobjects
      définissant les subDn
- LSldap :
  -> Nouvelle méthode getNewEntry()
  -> méthode getEntry() : utilisation de getNewEntry() en cas de nouvelle entrée
- create.php :
  -> Plus de redirection vers la fiche de l'objet après création si des erreurs
  sont définies.
- LSexample :
  -> Ajout de l'objectClass LSeecompany
  -> Adaptation du fichier ldif
This commit is contained in:
Benjamin Renard 2008-08-06 17:04:03 +00:00
parent 2e67cd7361
commit 5b7570fe12
10 changed files with 620 additions and 81 deletions

View file

@ -22,20 +22,21 @@
$GLOBALS['LSobjects']['LSeecompany'] = array (
'objectclass' => array(
'top',
'lscompany'
),
'rdn' => 'o',
'rdn' => 'ou',
'container_dn' => 'ou=companies',
'select_display_attrs' => '%{dc}',
'select_display_attrs' => '%{ou}',
'label' => _('Sociétés'),
'attrs' => array (
'o' => array (
'ou' => array (
'label' => _('Nom'),
'ldap_type' => 'ascii',
'html_type' => 'text',
'required' => 1,
'check_data' => array (
'alphanumeric'
'alphanumeric' => NULL
),
'view' => 1,
'rights' => array(
@ -43,15 +44,15 @@ $GLOBALS['LSobjects']['LSeecompany'] = array (
'admin' => 'w'
),
'form' => array (
'modify' => 1,
'modify' => 0,
'create' => 1
)
),
'dc' => array (
'label' => _('Domaine'),
'description' => array (
'label' => _('Description'),
'ldap_type' => 'ascii',
'html_type' => 'text',
'required' => 1,
'html_type' => 'textarea',
'required' => 0,
'rights' => array(
'user' => 'r',
'admin' => 'w'

View file

@ -27,6 +27,15 @@ $GLOBALS['LSobjects']['LSeegroup'] = array (
),
'rdn' => 'cn',
'container_dn' => 'ou=groups',
'container_auto_create' => array(
'objectclass' => array(
'top',
'organizationalUnit'
),
'attrs' => array(
'ou' => 'groups'
)
),
'select_display_attrs' => '%{cn}',
'label' => _('Groupes'),
'attrs' => array (

View file

@ -29,6 +29,15 @@ $GLOBALS['LSobjects']['LSeepeople'] = array (
),
'rdn' => 'uid',
'container_dn' => 'ou=people',
'container_auto_create' => array(
'objectclass' => array(
'top',
'organizationalUnit'
),
'attrs' => array(
'ou' => 'people'
)
),
'before_save' => 'valid',
'after_save' => 'valid',
'select_display_attrs' => '%{cn}',

View file

@ -128,6 +128,18 @@ $GLOBALS['LSerror_code'] = array (
'msg' => _("LSldapObject : Erreur durant les actions après renomage."),
'level' => 'c'
),
38 => array (
'msg' => _("LSldapObject : Erreur durant les actions avant suppression."),
'level' => 'c'
),
39 => array (
'msg' => _("LSldapObject : Erreur durant les actions après suppresion."),
'level' => 'c'
),
40 => array (
'msg' => _("LSldapObject : Erreur durant les actions après la création. L'objet est pour autant créé."),
'level' => 'c'
),
// LSattribute
41 => array (

View file

@ -36,32 +36,31 @@ $GLOBALS['LSconfig'] = array(
'port' => 389,
'version' => 3,
'starttls' => false,
'binddn' => 'uid=ldapsaisie,ou=sysaccounts,o=ls',
'bindpw' => 'toto',
'basedn' => 'o=ls',
'options' => array(),
'filter' => '(objectClass=*)',
'scope' => 'sub'
'binddn' => 'uid=ldapsaisie,ou=sysaccounts,o=ls',
'bindpw' => 'toto',
'basedn' => 'o=ls',
'options' => array(),
'filter' => '(objectClass=*)',
'scope' => 'sub'
),
'LSadmins' => array (
'o=ls' => array (
'uid=eeggs,ou=people,o=ls' => NULL
),
'LSadmins' => array (
'o=ls' => array (
'uid=eeggs,ou=people,o=ls' => NULL
),
'ou=people,o=ls' => array (
'cn=adminldap,ou=groups,o=ls' => array (
'attr' => 'uniqueMember',
'LSobject' => 'LSeegroup'
)
'ou=people,o=ls' => array (
'cn=adminldap,ou=groups,o=ls' => array (
'attr' => 'uniqueMember',
'LSobject' => 'LSeegroup'
)
),
'cacheLSrights' => true,
'cacheSearch' => true,
)
),
'cacheLSrights' => true,
'cacheSearch' => true,
'authobject' => 'LSeepeople',
'authobject_pwdattr' => 'userPassword',
'LSaccess' => array(
'LSeepeople',
'LSeegroup',
'LSeecompany'
'LSeegroup'
),
'recoverPassword' => array(
'mailAttr' => 'mail',
@ -76,7 +75,78 @@ $GLOBALS['LSconfig'] = array(
'msg' => "Votre nouveau mot de passe : %{mdp}"
)
),
'emailSender' => 'noreply@lsexample.net'
'emailSender' => 'noreply@lsexample.net',
'LSobjects' => array (
'LSeepeople',
'LSeegroup'
)
),
array (
'name' => 'LSexample - multi-sociétés',
'ldap_config'=> array(
'host' => '127.0.0.1',
'port' => 389,
'version' => 3,
'starttls' => false,
'binddn' => 'uid=ldapsaisie,ou=sysaccounts,o=ls',
'bindpw' => 'toto',
'basedn' => 'o=ls',
'options' => array(),
'filter' => '(objectClass=*)',
'scope' => 'sub'
),
'LSadmins' => array (
'o=ls' => array (
'uid=eeggs,ou=people,o=ls' => NULL,
'cn=adminldap,ou=groups,o=ls' => array (
'attr' => 'uniqueMember',
'LSobject' => 'LSeegroup'
)
)
),
'authobject' => 'LSeepeople',
'levelLabel' => _('Société'),
'subDn' => array(
'== Toutes ==' => array(
'dn' => 'o=ls',
'LSobjects' => array(
'LSeepeople',
'LSeegroup',
'LSeecompany'
)
),
'LSobject' => array(
'LSeecompany' => array(
'LSobjects' => array(
'LSeepeople',
'LSeegroup'
)
)
)
),
'cacheLSrights' => true,
'cacheSearch' => true,
'authobject_pwdattr' => 'userPassword',
'recoverPassword' => array(
'mailAttr' => 'mail',
'passwordAttr' => 'userPassword',
'recoveryHashAttr' => 'lsRecoveryHash',
'recoveryEmailSender' => 'noreply-recover@lsexample.net',
'recoveryHashMail' => array(
'subject' => 'LSexample : Récupération de votre mot de passe.',
'msg' => "Pour poursuivre le processus de récupération de votre mot de passe,\nmerci de cliquer de vous rendre à l'adresse suivante :\n%{url}"
),
'newPasswordMail' => array(
'subject' => 'LSexample : Votre nouveau mot de passe.',
'msg' => "Votre nouveau mot de passe : %{mdp}"
)
),
'emailSender' => 'noreply@lsexample.net',
'LSobjects' => array (
'LSeepeople',
'LSeegroup',
'LSeecompany'
)
)
)
);

View file

@ -48,7 +48,7 @@ if($LSsession -> startLSsession()) {
}
if ($form->validate()) {
// MàJ des données de l'objet LDAP
if ($object -> updateData('create')) {
if (($object -> updateData('create'))&&(!$GLOBALS['LSerror']->errorsDefined())) {
header('Location: view.php?LSobject='.$LSobject.'&dn='.$object -> getDn());
}
}

View file

@ -193,16 +193,18 @@ class LSldap {
//foreach($obj_conf['attrs'] as $attr_name => $attr_conf) {
// $newentry->add(array($attr_name => $attr_conf['default_value']));
//}
$attributes = array(
'objectclass' => $obj_conf['objectclass']
);
$attributes = array();
foreach($obj_conf['attrs'] as $attr_name => $attr_conf) {
if( isset($attr_conf['default_value']) ) {
$attributes[$attr_name]=$attr_conf['default_value'];
}
}
$newentry = Net_LDAP2_Entry::createFresh($dn,$attributes);
$newentry = $this -> getNewEntry($dn,$obj_conf['objectclass'],$attributes);
if (!$newentry) {
return;
}
return array('entry' => $newentry,'new' => true);
}
else {
@ -215,6 +217,28 @@ class LSldap {
}
}
/**
* Retourne une nouvelle entrée
*
* @param[in] $dn string Le DN de l'objet
* @param[in] $objectClass array Un tableau contenant les objectClass de l'objet
* @param[in] $attrs array Un tabeau du type array('attr_name' => attr_value, ...)
*
* @retval mixed Le nouvelle objet en cas de succès, false sinon
*/
function getNewEntry($dn,$objectClass,$attrs,$add=false) {
$newentry = Net_LDAP2_Entry::createFresh($dn,array_merge(array('objectclass' =>$objectClass),(array)$attrs));
if(Net_LDAP2::isError($newentry)) {
return false;
}
if($add) {
if(!$this -> cnx -> add($newentry)) {
return;
}
}
return $newentry;
}
/**
* Met à jour une entrée dans l'annuaire
*

View file

@ -512,9 +512,11 @@ class LSldapObject {
*/
function submitChange($idForm) {
$submitData=array();
$new = $this -> isNew();
foreach($this -> attrs as $attr) {
if(($attr -> isUpdate())&&($attr -> isValidate())) {
if(($attr -> name == $this -> config['rdn'])&&(!$this -> isNew())) {
if(($attr -> name == $this -> config['rdn'])&&(!$new)) {
$new = true;
debug('Rename');
if (!$this -> beforeRename()) {
$GLOBALS['LSerror'] -> addErrorCode(36);
@ -546,7 +548,16 @@ class LSldapObject {
if($dn) {
$this -> dn=$dn;
debug($submitData);
return $GLOBALS['LSldap'] -> update($this -> getType(),$dn, $submitData);
if (!$GLOBALS['LSldap'] -> update($this -> getType(),$dn, $submitData)) {
return;
}
if ($new) {
if (!$this -> afterCreate()) {
$GLOBALS['LSerror'] -> addErrorCode(40);
return;
}
}
return true;
}
else {
$GLOBALS['LSerror'] -> addErrorCode(33);
@ -958,7 +969,18 @@ class LSldapObject {
* @retval boolean True si l'objet à été supprimé, false sinon
*/
function remove() {
return $GLOBALS['LSldap'] -> remove($this -> getDn());
if ($this -> beforeDelete()) {
if ($GLOBALS['LSldap'] -> remove($this -> getDn())) {
if ($this -> afterDelete()) {
return true;
}
$GLOBALS['LSerror'] -> addErrorCode(39);
}
}
else {
$GLOBALS['LSerror'] -> addErrorCode(38);
}
return;
}
/**
@ -1005,18 +1027,16 @@ class LSldapObject {
}
/**
* 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.
* Methode créant la liste des objets en relations avec l'objet courant et qui
* la met en cache ($this -> _relationsCache)
*
* @retval True en cas de cas ce succès, False sinon.
*/
function beforeRename() {
function updateRelationsCache() {
$this -> _relationsCache=array();
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 ( isset($relation_conf['list_function']) ) {
if ($GLOBALS['LSsession'] -> loadLSobject($relation_conf['LSobject'])) {
$obj = new $relation_conf['LSobject']();
if (method_exists($obj,$relation_conf['list_function'])) {
@ -1041,6 +1061,19 @@ class LSldapObject {
return true;
}
/**
* 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() {
return $this -> updateRelationsCache();
}
/**
* Methode executant les actions nécéssaires après le changement du DN de
* l'objet.
@ -1060,20 +1093,105 @@ class LSldapObject {
}
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))) {
if (isset($this->config['relations'][$relation_name]['rename_function'])) {
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;
}
}
else {
$error=1;
}
}
}
return !$error;
}
/**
* Methode executant les actions nécéssaires avant la suppression 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 beforeDelete() {
return $this -> updateRelationsCache();
}
/**
* Methode executant les actions nécéssaires après la suppression 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 afterDelete() {
$error = 0;
foreach($this -> _relationsCache as $relation_name => $objList) {
if (isset($this->config['relations'][$relation_name]['remove_function'])) {
foreach($objList as $obj) {
$meth = $this->config['relations'][$relation_name]['remove_function'];
if (method_exists($obj,$meth)) {
if (!($obj -> $meth($this))) {
$error=1;
}
}
else {
$error=1;
}
}
}
}
return !$error;
}
/**
* Methode executant les actions nécéssaires après la création 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 afterCreate() {
debug('after');
$error = 0;
if ($GLOBALS['LSsession'] -> isSubDnLSobject($this -> getType())) {
if (is_array($GLOBALS['LSsession'] -> ldapServer['subDn']['LSobject'][$this -> getType()]['LSobjects'])) {
foreach($GLOBALS['LSsession'] -> ldapServer['subDn']['LSobject'][$this -> getType()]['LSobjects'] as $type) {
if ($GLOBALS['LSsession'] -> loadLSobject($type)) {
if (isset($GLOBALS['LSobjects'][$type]['container_auto_create'])&&isset($GLOBALS['LSobjects'][$type]['container_dn'])) {
$dn = $GLOBALS['LSobjects'][$type]['container_dn'].','.$this -> getDn();
if(!$GLOBALS['LSldap'] -> getNewEntry($dn,$GLOBALS['LSobjects'][$type]['container_auto_create']['objectclass'],$GLOBALS['LSobjects'][$type]['container_auto_create']['attrs'],true)) {
debug("Impossible de créer l'entrée fille : ".print_r(
array(
'dn' => $dn,
'objectClass' => $GLOBALS['LSobjects'][$type]['container_auto_create']['objectclass'],
'attrs' => $GLOBALS['LSobjects'][$type]['container_auto_create']['attrs']
)
,true));
$error=1;
}
}
}
else {
$GLOBALS['LSerror'] -> addErrorCode(1004,$type);
$error=1;
}
}
}
}
return !$error;
}
}
?>

View file

@ -43,6 +43,14 @@ objectclass (LsLDAPObjectClass:4
DESC 'LS system account Objectclass'
STRUCTURAL
MUST ( uid )
MAY (userPassword $ description))
MAY (userpassword $ description))
objectclass ( LsLDAPObjectClass:5
NAME 'lscompany'
SUP organizationalUnit
STRUCTURAL
MUST ( ou )
MAY ( description ))
# </Ls Objectclass>

View file

@ -70,7 +70,9 @@ gidNumber: 102001
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205003
sambaGroupType: 2
structuralObjectClass: lsgroup
uniqueMember: uid=secretariat,ou=people,o=ls
uniqueMember: uid=hmartin,ou=people,o=ls
uniqueMember: uid=ls,ou=people,o=ls
uniqueMember: uid=eeggs,ou=people,o=ls
dn: cn=informatique,ou=groups,o=ls
objectClass: top
@ -82,7 +84,6 @@ sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205019
sambaGroupType: 2
structuralObjectClass: lsgroup
cn: informatique
uniqueMember: uid=eeggs,ou=people,o=ls
dn: cn=direction,ou=groups,o=ls
objectClass: top
@ -94,6 +95,7 @@ gidNumber: 102007
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-205015
sambaGroupType: 2
structuralObjectClass: lsgroup
uniqueMember: uid=eeggs,ou=people,o=ls
dn: cn=administratif,ou=groups,o=ls
objectClass: top
@ -128,26 +130,148 @@ objectClass: top
objectClass: lspeople
objectClass: posixAccount
objectClass: sambaSamAccount
uid: eeggs
uidNumber: 100000
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-201000
structuralObjectClass: lspeople
gidNumber: 102009
mail: eeggs@ldapsaisie.biz
facsimileTelephoneNumber: 030000000
lsallowedservices: MAIL
lsallowedservices: FTP
lsAllowedServices: MAIL
lsAllowedServices: FTP
description: Utilisateur test Easter-eggs
cn: Easter Eggs
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-205019
personalTitle: M.
userPassword: toto
sambaLMPassword: AAD3B435B51404EEAAD3B435B51404EE
sambaNTPassword: 31D6CFE0D16AE931B73C59D7E0C089C0
homeDirectory: /home/eeggs
loginShell: /bin/false
givenName: Easter
sn: Eggs
givenName: Easter
jpegPhoto:: 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
uid: eeggs
homeDirectory: /home/eeggs
gidNumber: 102009
userPassword: toto
sambaLMPassword: BAC14D04669EE1D1AAD3B435B51404EE
sambaNTPassword: FBBF55D0EF0E34D39593F55C5F2CA5F2
mail: eeggs@ls.com
dn: uid=invite,ou=people,o=ls
objectClass: top
@ -166,9 +290,9 @@ userPassword: toto
sambaAcctFlags: [U ]
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-203019
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-203024
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
lsAllowedServices: MAIL
lsAllowedServices: SAMBA
lsAllowedServices: FTP
mail: invite@ldapsaisie.biz
structuralObjectClass: lspeople
sambaNTPassword: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@ -190,9 +314,9 @@ givenName: Henri
sn: MARTIN
gidNumber: 102001
mail: henri.martin@ldapsaisie.biz
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
lsAllowedServices: MAIL
lsAllowedServices: SAMBA
lsAllowedServices: FTP
cn: Henri MARTIN
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-205003
personalTitle: M.
@ -219,9 +343,9 @@ givenName: Secretariat
sn: Secretariat
gidNumber: 70513
mail: secretariat@ldapsaisie.biz
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
lsAllowedServices: MAIL
lsAllowedServices: SAMBA
lsAllowedServices: FTP
cn: Secretariat Secretariat
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-513
@ -244,9 +368,9 @@ givenName: _
sn: LdapSaisie
gidNumber: 102001
mail: ls@ldapsaisie.biz
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
lsAllowedServices: MAIL
lsAllowedServices: SAMBA
lsAllowedServices: FTP
cn: LS
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-205003
@ -265,9 +389,9 @@ structuralObjectClass: lspeople
sn: PAGEARD
gidNumber: 102009
mail: erwan.page@ldapsaisie.biz
lsallowedservices: MAIL
lsallowedservices: SAMBA
lsallowedservices: FTP
lsAllowedServices: MAIL
lsAllowedServices: SAMBA
lsAllowedServices: FTP
cn: Erwan PAGE
sambaPrimaryGroupSID: S-1-5-21-2421470416-3566881284-3047381809-205019
personalTitle: M.
@ -275,3 +399,167 @@ givenName: Erwan
userPassword: toto
sambaLMPassword: BAC14D04669EE1D1AAD3B435B51404EE
sambaNTPassword: FBBF55D0EF0E34D39593F55C5F2CA5F2
dn: uid=eeggs2,ou=people,o=ls
objectClass: top
objectClass: lspeople
objectClass: posixAccount
uid: eeggs2
uidNumber: 1000000
gidNumber: 102009
facsimileTelephoneNumber: 030000000
lsAllowedServices: MAIL
lsAllowedServices: FTP
description: Utilisateur test Easter-eggs 2
cn: Easter Eggs 2
personalTitle: M.
homeDirectory: /home/eeggs
loginShell: /bin/false
sn: Eggs
givenName: Easter
mail: bn8@zionetrix.net
userPassword: toto
structuralObjectClass: lspeople
dn: uid=eeggs3,ou=people,o=ls
objectClass: top
objectClass: lspeople
objectClass: posixAccount
uid: eeggs3
uidNumber: 10000000
gidNumber: 102009
facsimileTelephoneNumber: 030000000
lsAllowedServices: MAIL
lsAllowedServices: FTP
description: Utilisateur test Easter-eggs 2
cn: Easter Eggs 2
personalTitle: M.
homeDirectory: /home/eeggs
loginShell: /bin/false
sn: Eggs
givenName: Easter
mail: bn8@zionetrix.net
userPassword: toto
structuralObjectClass: lspeople
dn: ou=companies,o=ls
objectClass: organizationalUnit
objectClass: top
ou: companies
structuralObjectClass: organizationalUnit
dn: ou=company2,ou=companies,o=ls
objectClass: top
objectClass: lscompany
ou: company2
description:: dGVzdCAyIA==
structuralObjectClass: lscompany
dn: ou=people,ou=company2,ou=companies,o=ls
objectClass: top
objectClass: organizationalUnit
ou: people
structuralObjectClass: organizationalUnit
dn: ou=groups,ou=company2,ou=companies,o=ls
objectClass: top
objectClass: organizationalUnit
ou: groups
structuralObjectClass: organizationalUnit
dn: ou=company1,ou=companies,o=ls
objectClass: top
objectClass: lscompany
ou: company1
description: Test company 1
structuralObjectClass: lscompany
dn: ou=people,ou=company1,ou=companies,o=ls
objectClass: top
objectClass: organizationalUnit
ou: people
structuralObjectClass: organizationalUnit
dn: ou=groups,ou=company1,ou=companies,o=ls
objectClass: top
objectClass: organizationalUnit
ou: groups
structuralObjectClass: organizationalUnit
dn: ou=company3,ou=companies,o=ls
objectClass: top
objectClass: lscompany
ou: company3
description: test 3
structuralObjectClass: lscompany
dn: ou=people,ou=company3,ou=companies,o=ls
objectClass: top
objectClass: organizationalUnit
ou: people
structuralObjectClass: organizationalUnit
dn: ou=groups,ou=company3,ou=companies,o=ls
objectClass: top
objectClass: organizationalUnit
ou: groups
structuralObjectClass: organizationalUnit
dn: cn=test,ou=groups,ou=company2,ou=companies,o=ls
objectClass: lsgroup
objectClass: posixGroup
cn: test
gidNumber: 102010
structuralObjectClass: lsgroup
dn: cn=group1,ou=groups,ou=company1,ou=companies,o=ls
objectClass: lsgroup
objectClass: posixGroup
cn: group1
gidNumber: 102011
structuralObjectClass: lsgroup
uniqueMember: uid=user1,ou=people,ou=company1,ou=companies,o=ls
dn: uid=user1,ou=people,ou=company1,ou=companies,o=ls
objectClass: top
objectClass: lspeople
objectClass: posixAccount
objectClass: sambaSamAccount
givenName: prenom1
loginShell: /bin/false
personalTitle: M.
uid: user1
uidNumber: 10000001
sn: nom1
cn: prenom1 nom1
gidNumber: 101009
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-20001002
homeDirectory: /home/user1
mail: user1@ls.com
description: user1
userPassword: toto
sambaLMPassword: FC26CDB2863917C1AAD3B435B51404EE
sambaNTPassword: 00B2C85DDFBD8CC81602D6FC7340EB0B
structuralObjectClass: lspeople
dn: uid=user2,ou=people,ou=company1,ou=companies,o=ls
objectClass: top
objectClass: lspeople
objectClass: posixAccount
objectClass: sambaSamAccount
givenName: prenom2
loginShell: /bin/false
personalTitle: M.
uid: user2
uidNumber: 10000002
sn: nom2
cn: prenom2 nom2
gidNumber: 102001
sambaSID: S-1-5-21-2421470416-3566881284-3047381809-20001004
homeDirectory: /home/user2
mail: user2@ls.com
userPassword: toto
sambaLMPassword: C53D7C8685D27214AAD3B435B51404EE
sambaNTPassword: C549EE84021E5E8372E10CEDEAFD02A8
structuralObjectClass: lspeople