Commit d8deca10 authored by David Surville's avatar David Surville
Browse files

[Evolution] Développement UnicaenLdap WIP

parent fdd3d01d
......@@ -14,14 +14,14 @@ use UnicaenLdap\Service\Group as LdapGroupService;
use UnicaenLdap\Service\GroupFactory as GroupServiceFactory;
use UnicaenLdap\Service\People as LdapPeopleService;
use UnicaenLdap\Service\PeopleFactory as PeopleServiceFactory;
use UnicaenLdap\Service\Root as LdapRootService;
use UnicaenLdap\Service\RootFactory as RootServiceFactory;
use UnicaenLdap\Service\Structure as LdapStructureService;
use UnicaenLdap\Service\StructureFactory as StructureServiceFactory;
use UnicaenLdap\Service\System as LdapSystemService;
use UnicaenLdap\Service\SystemFactory as SystemServiceFactory;
use Zend\ServiceManager\Proxy\LazyServiceFactory;
;;
return array(
'unicaen-ldap' => [
......@@ -33,6 +33,7 @@ return array(
'LdapServiceGeneric' => GenericServiceFactory::class,
'LdapServiceGroup' => GroupServiceFactory::class,
'LdapServicePeople' => PeopleServiceFactory::class,
'LdapServiceRoot' => RootServiceFactory::class,
'LdapServiceStructure' => StructureServiceFactory::class,
'LdapServiceSystem' => SystemServiceFactory::class,
],
......@@ -42,11 +43,13 @@ return array(
'ldapServiceGeneric' => 'LdapServiceGeneric',
'ldapServiceGroup' => 'LdapServiceGroup',
'ldapServicePeople' => 'LdapServicePeople',
'ldapServiceRoot' => 'LdapServiceRoot',
'ldapServiceStructure' => 'LdapServiceStructure',
'ldapServiceSystem' => 'LdapServiceSystem',
LdapGenericService::class => 'LdapServiceGeneric',
LdapPeopleService::class => 'LdapServicePeople',
LdapGroupService ::class => 'LdapServiceGroup',
LdapPeopleService::class => 'LdapServicePeople',
LdapRootService::class => 'LdapServiceRoot',
LdapStructureService::class => 'LdapServiceStructure',
LdapSystemService::class => 'LdapServiceSystem',
],
......@@ -56,6 +59,7 @@ return array(
'LdapServicePeople' => LdapPeopleService::class,
'LdapServiceGeneric' => LdapGenericService::class,
'LdapServiceGroup' => LdapGroupService::class,
'LdapServiceRoot' => LdapRootService::class,
'LdapServiceStructure' => LdapStructureService::class,
'LdapServiceSystem' => LdapSystemService::class,
],
......@@ -70,6 +74,9 @@ return array(
'LdapServiceGroup' => [
LazyServiceFactory::class,
],
'LdapServiceRoot' => [
LazyServiceFactory::class,
],
'LdapServiceStructure' => [
LazyServiceFactory::class,
],
......
......@@ -730,12 +730,12 @@ class People extends Entity
: sprintf('%s%s', $supannLabel, $matches[$part]);
}
$prefixe = $this->getService()->getCodeStructurePrefixe();
$prefixe = $this->getService()->getLdapStructureService()->getCodeStructurePrefixe();
$affect = (0 !== strpos($matches['affect'], $prefixe))
? sprintf('%s%s', $structure_prefixe, $matches['affect'])
: $matches['affect'];
$prefixe = $this->getService()->getCodeModuleEnseignementPrefixe();
$prefixe = $this->getService()->getLdapStructureService()->getCodeModuleEnseignementPrefixe();
preg_match('/^(?<etiquette>\{[\w\-:]+\})(?<identifiant>.+)$/', $matches['etape'], $parts);
$val = (0 !== strpos($parts['identifiant'], $prefixe))
? $prefixe . $parts['identifiant']
......@@ -852,7 +852,7 @@ class People extends Entity
if (is_string($val)) {
return preg_match(self::$structure_pattern, $val) ? $val : null;
} elseif ($val instanceof StructureEntity) {
$val = sprintf('%s;%s', strtr($val->get('supannCodeEntite'), $this->getService()->getCodeStructurePrefixe(), ''), $val->get('description'));
$val = sprintf('%s;%s', strtr($val->get('supannCodeEntite'), $this->getService()->getLdapStructureService()->getCodeStructurePrefixe(), ''), $val->get('description'));
return preg_match(self::$structure_pattern, $val) ? $val : null;
} else {
return null;
......@@ -878,8 +878,8 @@ class People extends Entity
$value = $this->preFormat($value);
$value = array_map(function ($val) {
if (is_string($val)) {
if (0 !== strpos($val, $this->getService()->getCodeStructurePrefixe())) {
$val = $this->getService()->getCodeStructurePrefixe() . $val;
if (0 !== strpos($val, $this->getService()->getLdapStructureService()->getCodeStructurePrefixe())) {
$val = $this->getService()->getLdapStructureService()->getCodeStructurePrefixe() . $val;
}
return $val;
} elseif ($val instanceof StructureEntity) {
......@@ -908,8 +908,8 @@ class People extends Entity
$value = $this->preFormat($value);
$value = array_map(function ($val) {
if (is_string($val)) {
if (0 !== strpos($val, $this->getService()->getCodeStructurePrefixe())) {
$val = $this->getService()->getCodeStructurePrefixe() . $val;
if (0 !== strpos($val, $this->getService()->getLdapStructureService()->getCodeStructurePrefixe())) {
$val = $this->getService()->getLdapStructureService()->getCodeStructurePrefixe() . $val;
}
return $val;
} elseif ($val instanceof StructureEntity) {
......@@ -990,7 +990,7 @@ class People extends Entity
if (is_string($val)) {
return preg_match(self::$structure_pattern, $val) ? $val : null;
} elseif ($val instanceof StructureEntity) {
$val = sprintf('%s;%s', strtr($val->get('supannCodeEntite'), $this->getService()->getCodeStructurePrefixe(), ''), $val->get('description'));
$val = sprintf('%s;%s', strtr($val->get('supannCodeEntite'), $this->getService()->getLdapStructureService()->getCodeStructurePrefixe(), ''), $val->get('description'));
return preg_match(self::$structure_pattern, $val) ? $val : null;
} else {
return null;
......@@ -1018,7 +1018,7 @@ class People extends Entity
if (is_string($val)) {
return preg_match(self::$structure_pattern, $val) ? $val : null;
} elseif ($val instanceof StructureEntity) {
$val = sprintf('%s;%s', strtr($val->get('supannCodeEntite'), $this->getService()->getCodeStructurePrefixe(), ''), $val->get('description'));
$val = sprintf('%s;%s', strtr($val->get('supannCodeEntite'), $this->getService()->getLdapStructureService()->getCodeStructurePrefixe(), ''), $val->get('description'));
return preg_match(self::$structure_pattern, $val) ? $val : null;
} else {
return null;
......@@ -1041,16 +1041,17 @@ class People extends Entity
*/
public function setEduPersonPrincipalName($value = null, $append = false)
{
$universiteDomaine = $this->getService()->getLdapRootService()->getEtablissementDomain();
$value = $this->preFormat($value);
$value = array_map(function ($v) {
list($identifiant, $domaine) = array_pad(explode('@', strtolower($v)), 2, null);
if ($domaine != self::$etablissement_domaine) {
$v = sprintf('%s@%s', $v, self::$etablissement_domaine);
if ($domaine != $universiteDomaine) {
$v = sprintf('%s@%s', $v, $universiteDomaine);
}
return $v;
}, $value);
$value = array_filter($value, function ($v) {
return preg_match('/^[0-9a-z\-]+@' . self::$etablissement_domaine . '$/', $v);
return preg_match('/^[0-9a-z\-]+@' . $universiteDomaine . '$/', $v);
});
$this->appendOrNot('eduPersonPrincipalName', $value, $append);
......@@ -1201,7 +1202,7 @@ class People extends Entity
: sprintf('%s%s', $supannLabel, $matches[$part]);
}
$prefixe = $this->getService()->getCodeStructurePrefixe();
$prefixe = $this->getService()->getLdapStructureService()->getCodeStructurePrefixe();
$code = (0 !== strpos($matches['code'], $prefixe))
? sprintf('%s%s', $prefixe, $matches['code'])
: $matches['code'];
......@@ -1280,7 +1281,7 @@ class People extends Entity
* @var string $etape
* @var string $adistance
*/
$prefixe = $this->getService()->getCodeModuleEnseignementPrefixe();
$prefixe = $this->getService()->getLdapStructureService()->getCodeModuleEnseignementPrefixe();
preg_match('/^(?<etiquette>\{[\w\-:]+\})(?<identifiant>.+)$/', $matches['etape'], $parts);
$val = (0 !== strpos($parts['identifiant'], $prefixe))
? $prefixe . $parts['identifiant']
......@@ -1652,7 +1653,7 @@ class People extends Entity
$value = array_map(function ($val) {
if (is_string($val)) {
if (preg_match(self::$attribute_with_label_pattern, $val, $matches)) {
$prefixe = $this->getService()->getCodeModuleEnseignementPrefixe();
$prefixe = $this->getService()->getLdapStructureService()->getCodeModuleEnseignementPrefixe();
$val = (0 !== strpos($matches['identifiant'], $prefixe))
? $prefixe . $matches['identifiant']
: $matches['identifiant'];
......@@ -1683,7 +1684,7 @@ class People extends Entity
$value = array_map(function ($val) {
if (is_string($val)) {
if (preg_match(self::$attribute_with_label_pattern, $val, $matches)) {
$prefixe = $this->getService()->getCodeModuleEnseignementPrefixe();
$prefixe = $this->getService()->getLdapStructureService()->getCodeModuleEnseignementPrefixe();
$val = (0 !== strpos($matches['identifiant'], $prefixe))
? $prefixe . $matches['identifiant']
: $matches['identifiant'];
......
<?php
namespace UnicaenLdap\Entity\Base;
use UnicaenLdap\Entity\Entity;
use UnicaenLdap\Entity\Structure as StructureEntity;
use UnicaenLdap\Exception;
use Zend\Ldap\Exception\LdapException;
/**
* Classe mère de l'entité racine de l'annuaire LDAP.
*
* @author David Surville <david.surville@unicaen.fr>
*/
class Root extends Entity
{
protected $type = 'Root';
/**
* Liste des classes d'objet nécessaires à la création d'une structure
*
* @var string[]
*/
protected $objectClass = [
'top',
'dcObject',
'organization',
'eduOrg',
'supannOrg',
];
/**
* Liste des attributs autorisés pour l'entité "Root"
*
* @var array
*/
protected $authorizedAttributes = [
// Attributes classes
'objectClass',
// Attributes
'description',
'eduOrgHomePageURI',
'eduOrgLegalName',
'eduOrgSuperiorURI',
'eduOrgWhitePagesURI',
'facsimileTelephoneNumber',
'l',
'o',
'postalAddress',
'supannEtablissement',
'telephoneNumber',
];
/**
* Liste des attributs contenant des dates
*
* @var array
*/
protected $dateTimeAttributes = [];
/**
* Liste des attributs monovalués
*
* @var array
*/
protected $monoValuedAttributes = [
'eduOrgLegalName',
];
/**
* Attribut Ldap "description"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setDescription($value = null, $append = false)
{
$value = $this->preFormat($value);
$this->appendOrNot('description', $value, $append);
return $this;
}
/**
* Attribut Ldap "eduOrgHomePageURI"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setEduOrgHomePageURI($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = filter_var_array($value, FILTER_VALIDATE_URL);
$this->appendOrNot('eduOrgHomePageURI', $value, $append);
return $this;
}
/**
* Attribut Ldap "eduOrgLegalName"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setEduOrgLegalName($value = null, $append = false)
{
$value = $this->preFormat($value);
$this->appendOrNot('eduOrgLegalName', $value, $append);
return $this;
}
/**
* Attribut Ldap "eduOrgSuperiorURI"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setEduOrgSuperiorURI($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = filter_var_array($value, FILTER_VALIDATE_URL);
$this->appendOrNot('eduOrgSuperiorURI', $value, $append);
return $this;
}
/**
* Attribut Ldap "eduOrgWhitePagesURI"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setEduOrgWhitePagesURI($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = filter_var_array($value, FILTER_VALIDATE_URL);
$this->appendOrNot('eduOrgWhitePagesURI', $value, $append);
return $this;
}
/**
* Attribut Ldap "facsimileTelephoneNumber"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setFacsimileTelephoneNumber($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_map([$this, 'formatTel'], $value);
$this->appendOrNot('facsimileTelephoneNumber', $value, $append);
return $this;
}
/**
* Attribut Ldap "l"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setL($value = null, $append = false)
{
$value = $this->preFormat($value);
$this->appendOrNot('l', $value, $append);
return $this;
}
/**
* Attribut Ldap "o"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setO($value = null, $append = false)
{
$value = $this->preFormat($value);
$this->appendOrNot('o', $value, $append);
return $this;
}
/**
* Attribut Ldap "postalAddress"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setPostalAddress($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_filter($value, function ($v) {
return preg_match(self::$postal_address_pattern, $v);
});
$this->appendOrNot('postalAddress', $value, $append);
return $this;
}
/**
* Attribut Ldap "supannEtablissement"
*
* @param array|string|null $value
* @param bool $append
* @return $this
* @throws Exception
* @throws LdapException
*/
public function setSupannEtablissement($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_filter($value, function ($v) {
return preg_match(self::$attribute_with_label_pattern, $v);
});
$this->appendOrNot('supannEtablissement', $value, $append);
return $this;
}
/**
* Attribut Ldap "telephoneNumber"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setTelephoneNumber($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_map([$this, 'formatTel'], $value);
$this->appendOrNot('telephoneNumber', $value, $append);
return $this;
}
}
\ No newline at end of file
......@@ -16,8 +16,6 @@ use Zend\Ldap\Exception\LdapException;
*/
abstract class Entity
{
static protected $etablissement_domaine = 'unicaen.fr';
/**
* Type d'entité
*
......@@ -95,6 +93,7 @@ abstract class Entity
'Generic' => ['uid', 'UnicaenLdap\\Entity\\Generic'],
'Group' => ['cn', 'UnicaenLdap\\Entity\\Group'],
'People' => ['uid', 'UnicaenLdap\\Entity\\People'],
'Root' => ['dc', 'UnicaenLdap\\Entity\\Root'],
'Structure' => ['supannCodeEntite', 'UnicaenLdap\\Entity\\Structure'],
'System' => ['uid', 'UnicaenLdap\\Entity\\System'],
];
......
......@@ -115,6 +115,8 @@ class People extends BasePeople
}
/**
* Test si une valeur est renseignée pour le champ "eduPersonAffiliation"
*
* @param string $status
* @return bool
*/
......@@ -242,6 +244,15 @@ class People extends BasePeople
return $this->whichStatus(parent::STATUS_TEACHER);
}
public function getEduPersonOrg()
{
$structureService = $this->getService()->getLdapStructureService();
$dn = $this->eduPersonOrgDN;
if (empty($dn)) return null;
return $structureService->getAllBy($dn, 'dn');
}
/**
* Retourne l'identifiant Octopus de l'individu
*
......
<?php
namespace UnicaenLdap\Entity;
use UnicaenLdap\Entity\Base\Root as BaseRoot;
use UnicaenLdap\Filter\Filter;
use Zend\Ldap\Exception\LdapException;
/**
* Classe de gestion de l'entité racine de l'annuaire LDAP.
*
* @author David SURVILLE <david.surville@unicaen.fr>
*/
class Root extends BaseRoot
{}
\ No newline at end of file
......@@ -18,17 +18,19 @@ use Zend\Stdlib\ErrorHandler;
* @author Laurent Lécluse <laurent.lecluse at unicaen.fr>
*/
abstract class AbstractService implements
LdapGenericServiceAwareInterface,
LdapGroupServiceAwareInterface,
LdapPeopleServiceAwareInterface,
LdapRootServiceAwareInterface,
LdapStructureServiceAwareInterface,
LdapGroupServiceAwareInterface,
LdapSystemServiceAwareInterface,
LdapGenericServiceAwareInterface
LdapSystemServiceAwareInterface
{
use LdapGenericServiceAwareTrait;
use LdapGroupServiceAwareTrait;
use LdapPeopleServiceAwareTrait;
use LdapRootServiceAwareTrait;
use LdapStructureServiceAwareTrait;
use LdapGroupServiceAwareTrait;
use LdapSystemServiceAwareTrait;
use LdapGenericServiceAwareTrait;
/**
* Limite de recherche par défaut
......@@ -59,21 +61,6 @@ abstract class AbstractService implements
*/
protected $ou = [];
/**
* Préfixe utilisé pour le code des structures
*
* @var string
*/
protected $code_structure_prefixe = 'HS_';
/**
* Préfixe utilisé pour le code des modules d'enseignement
*
* @var string
*/
protected $code_module_enseignement_prefixe = 'AE_';
/**
* Compteur utilisé dans la recherche
*
......@@ -96,11 +83,12 @@ abstract class AbstractService implements
* Spécifie l'objet d'accès à l'annuaire LDAP.
*
* @param Ldap $ldap
* @return AbstractService
* @return self
*/
public function setLdap(Ldap $ldap = null)
{
$this->ldap = $ldap;
return $this;
}
......@@ -136,26 +124,6 @@ abstract class AbstractService implements
}, $this->ou);
}
/**
* Retourne le préfixe utilisé pour les codes des structures
*
* @return string
*/
public function getCodeStructurePrefixe()
{
return $this->code_structure_prefixe;
}
/**
* Retourne le préfixe utilisé pour les codes des modules d'enseignement
*
* @return string
*/
public function getCodeModuleEnseignementPrefixe()
{
return $this->code_module_enseignement_prefixe;
}
/**
* Retourne la liste de toutes les entités correspondantes
*
......@@ -316,7 +284,10 @@ abstract class AbstractService implements
if (is_string($ou)) $ou = array($ou);
elseif (null === $ou) $ou = $this->ou;
if (1 == count($ou)) {
if (0 === count($ou)) {
$basedn = $this->getLdap()->getBaseDn();
}
elseif (1 === count($ou)) {
$basedn = "ou=" . $ou[0] . "," . $this->getLdap()->getBaseDn();
} else {
$basedn = $this->getLdap()->getBaseDn();
......
......@@ -9,7 +9,19 @@ namespace UnicaenLdap\Service;
*/
class Generic extends AbstractService
{
/**
* Type de l'entité
*