Commit 012539b2 authored by David Surville's avatar David Surville
Browse files

Ajout de fonctions pour des nouveaux attributs Ldap + ajout d'un trait pour le...

Ajout de fonctions pour des nouveaux attributs Ldap + ajout d'un trait pour le service lié aux structures Ldap
parent f6fd12e5
......@@ -19,7 +19,7 @@ class People extends Entity
protected $type = 'People';
/**
* Liste des classes d'objet nécessaires à la création d'une personne
* Liste des classes d'objet nécessaires à la création d'une entité "People"
* Il est nécessaire d'ajouter la classe 'ucbnEtu' ou 'ucbnEmp' selon le
* statut de la personne.
*
......@@ -39,12 +39,102 @@ class People extends Entity
"schacEntryMetadata"
];
/**
* Liste des attributs autorisés pour une entité "People"
*
* @var array
*/
protected $authorizedAttributes = [
// Attributes classes
'objectClass',
// Attributes
'cn',
'displayName',
'dateDeNaissance',
'eduPersonPrincipalName',
'eduPersonNickname', // no getter and setter
'eduPersonAffiliation',
'eduPersonPrimaryAffiliation',
'eduPersonOrgDN',
'eduPersonOrgUnitDN',
'eduPersonPrimaryOrgUnitDN',
'dateFinInscription',
'facsimileTelephoneNumber', // no getter and setter
'gidNumber',
'givenName',
'homeDirectory',
'labeledURI', // no getter and setter
'leoCode',
'loginShell',
'mail',
'mobile',
'pager',
'postalAddress',
'preferredLanguage',
'rid',
'sambaSID',
'schacDateOfBirth',
'schacExpiryDate',
'sexe',
'sn',
'supannActivite',
'supannAffectation',
'supannAliasLogin',
'supannAutreTelephone',
'supannCivilite',
'supannCodeINE',
'supannEmpCorps',
'supannEmpId',
'supannEntiteAffectation',
'supannEntiteAffectationPrincipale',
'supannEtablissement',
'supannEtuAnneeInscription',
'supannEtuCursusAnnee',
'supannEtuDiplome',
'supannEtuElementPedagogique',
'supannEtuEtape',
'supannEtuId',
'supannEtuInscription',
'supannEtuRegimeInscription',
'supannEtuSecteurDisciplinaire',
'supannEtuTypeDiplome',
'supannListeRouge',
'supannMailPerso',
'supannParrainDN',
'supannRoleGenerique',
'supannRoleEntite',
'supannRefId',
'supannTypeEntiteAffectation',
'telephoneNumber',
'title', // no getter and setter
'ucbnAnneePostBac',
'ucbnCodeEtape',
'ucbnEtuComplementInscription',
'ucbnFonctionStructurelle',
'ucbnOrganisme',
'ucbnPrivateAddress',
'ucbnPrivateAddressBis',
'ucbnSecteurDisciplinaire',
'ucbnServiceADE',
'ucbnServicePapercut',
'ucbnSiteLocalisation',
'ucbnSousStructure',
'ucbnStatus',
'ucbnStructureRecherche',
'unicaenMonEtupass',
'unicaenTermsOfUse',
'userCertificate',
'uidNumber',
];
/**
* Liste des attributs contenant des dates
*
* @var array
*/
protected $dateTimeAttributes = [];
protected $dateTimeAttributes = [
'schacExpiryDate',
];
/**
* Liste des attributs monovalués
......@@ -54,14 +144,17 @@ class People extends Entity
protected $monoValuedAttributes = [
'cn',
'dateDeNaissance',
'dateFinInscription',
'displayName',
'eduPersonOrgDN',
'eduPersonPrimaryAffiliation',
'eduPersonPrimaryOrgUnitDN',
'eduPersonPrincipalName',
'givenName',
'leoCode',
'preferredLanguage',
'schacDateOfBirth',
'schacExpiryDate',
'sexe',
'supannAliasLogin',
'supannCivilite',
......@@ -73,9 +166,68 @@ class People extends Entity
'telephoneNumber',
];
static protected $postal_address_pattern = '/(.*)\$(.*)\$(.*)\$(.*)\$(.*)\$(.*)/';
static protected $role_pattern = '/^\[role=(?<role>.+)\]\[type=(?<type>.+)\]\[code=(?<code>.+)\]\[libelle=(?<libelle>.+)\]$/';
static protected $role_src_pattern = '/^(?<code>[\d]{4});(?<libelle>.+)/';
/**
* Liste des valeurs autorisées pour les attributs "eduPersonAffiliation" et "eduPersonPrimaryAffiliation"
*
* - affiliate : personne qui ne dépend pas de l'établissement (exemple : un partenaire extérieur). La valeur
* "member" est exclue pour ces personnes.
* - alum : ancien étudiant conservant des relations avec l'établissement.
* - emeritus : professeur ayant obtenu l'éméritat dans l'établissement.
* - employee : tout personnel rémunéré par l'établissement, quelque soit son activité.
* - faculty : personnel dont l'activité principale (dans l'établissement) est pédagogique, d'enseignement ou/et de
* recherche. La valeur “member” est positionnée si ce personnel est géré par l'établissement.
* - member : personne inscrite dans la (les) base(s) de gestion des étudiants ou celle(s) des personnels.
* - registered-reader : lecteur de bibliothèque autorisé.
* - researcher : personne assurant une activité de recherche. La valeur “member” est positionnée si ce personnel
* est géré par l'établissement.
* - retired : personne à la retraite conservant des relations avec l'établissement.
* - staff : personnel dont l'activité principale (dans l'établissement) est autre qu'enseignant ou chercheur
* (typiquement BIATOS).
* - student : personne suivant une formation quelconque dans l'établissement. Si la valeur “member” est positionnée,
* la personne est enregistrée dans la base des étudiants.
* - teacher : personnel assurant une activité d'enseignement.
*
* @var array
*/
protected $eduPersonAffiliationAuthorizedValues = [
'affiliate',
'alum',
'emeritus',
'employee',
'faculty',
'member',
'registered-reader',
'researcher',
'retired',
'staff',
'student',
'teacher',
];
/**
* Liste des valeurs autorisées pour l'attribut "ucbnStatus"
*
* @var array
*/
protected $ucbnStatusAuthorizedValues = [
'ALUMNI',
'APPRENANT',
'AUDITEUR_LIBRE',
'CONTRACTUEL',
'ETUDIANT',
'INVITE',
'LECTEUR_SCD',
'TITULAIRE',
];
/**
* Liste des patterns utilisés pour différents attributs
*/
static protected $structure_pattern = '/^(?<code>[\w-]+);(?<libelle>.+)$/';
static protected $postal_address_pattern = '/^(.*)\$(.*)\$(.*)\$(.*)\$(.*)\$(.*)$/';
static protected $role_pattern = '/^\[role=(?<role>[\w-]+)\]\[type=(?<type>[\w-]+)\]\[code=(?<code>[\w-]+)\]\[libelle=(?<libelle>.+)\]$/';
static protected $role_src_pattern = '/^(?<code>[\d]{4});(?<libelle>.+)$/';
static protected $refid_pattern = '/^\{(?<etiquette>[\w-:]+)\}(?<identifiant>.+)$/';
/**
......@@ -102,7 +254,9 @@ class People extends Entity
*/
private function preFormat($value)
{
if (is_scalar($value) || is_null($value)) {
if (is_scalar($value)
|| is_null($value)
|| is_a($value, 'DateTime')) {
$value = [$value];
}
......@@ -191,7 +345,9 @@ class People extends Entity
/**
* Attribut Ldap "dateDeNaissance"
*
* @param array|string|null $value
* @deprecated Deprecated, use {@link self::setSchacDateOfBirth}
*
* @param array|string|DateTime|null $value
* @param bool $append
* @return self
* @throws Exception
......@@ -215,7 +371,7 @@ class People extends Entity
/**
* Attribut Ldap "schacDateOfBirth"
*
* @param array|string|null $value
* @param array|string|DateTime|null $value
* @param bool $append
* @return self
* @throws Exception
......@@ -236,6 +392,56 @@ class People extends Entity
return $this;
}
/**
* Attribut Ldap "dateFinInscription"
*
* @deprecated Deprecated, use {@link self::setSchacExpiryDate}
*
* @param array|string|DateTime|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setDateFinInscription($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_map(function ($val) {
if (is_string($val)) {
$val = new DateTime($val);
}
return $val->format('Ymd');
}, $value);
$this->appendOrNot('dateFinInscription', $value, $append);
return $this;
}
/**
* Attribut Ldap "schacDateOfBirth"
*
* @param array|string|DateTime|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setSchacExpiryDate($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_map(function ($val) {
if (is_string($val)) {
$val = new DateTime($val, new \DateTimeZone('+0000')); // définition du timezone à +0h
}
return (int)$val->format('U');
}, $value);
$this->appendOrNot('schacExpiryDate', $value, $append);
return $this;
}
/**
* Attribut Ldap "sexe"
*
......@@ -257,6 +463,48 @@ class People extends Entity
return $this;
}
/**
* Attribut Ldap "eduPersonAffiliation"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setEduPersonAffiliation($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_filter($value, function ($v) {
return in_array($v, $this->eduPersonAffiliationAuthorizedValues);
});
$this->appendOrNot('eduPersonAffiliation', $value, $append);
return $this;
}
/**
* Attribut Ldap "eduPersonPrimaryAffiliation"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setEduPersonPrimaryAffiliation($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_filter($value, function ($v) {
return in_array($v, $this->eduPersonAffiliationAuthorizedValues);
});
$this->appendOrNot('eduPersonPrimaryAffiliation', $value, $append);
return $this;
}
/**
* Attribut Ldap "postalAddress"
*
......@@ -621,6 +869,50 @@ class People extends Entity
return $this;
}
/**
* Attribut Ldap "ucbnSousStructure"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setUcbnSousStructure($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_filter($value, function ($v) {
return preg_match(self::$structure_pattern, $v);
});
$this->appendOrNot('ucbnSousStructure', $value, $append);
return $this;
}
/**
* Attribut Ldap "ucbnStructureRecherche"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setUcbnStructureRecherche($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_filter($value, function ($v) {
return preg_match(self::$structure_pattern, $v);
});
$this->appendOrNot('ucbnStructureRecherche', $value, $append);
return $this;
}
/**
* Attribut Ldap "eduPersonPrincipalName"
*
......@@ -777,13 +1069,13 @@ class People extends Entity
$supannLabel = $this->getLabel('SUPANN');
$value = array_map(function ($v) use ($supannLabel) {
if(preg_match(self::$role_pattern, $v, $matches)) {
if (preg_match(self::$role_pattern, $v, $matches)) {
/**
* @var string $role
* @var string $type
* @var string $code
*/
foreach(['role', 'type'] as $part) {
foreach (['role', 'type'] as $part) {
$$part = preg_match("/^$supannLabel.*$/", $matches[$part])
? $matches[$part]
: sprintf('%s%s', $supannLabel, $matches[$part]);
......@@ -794,8 +1086,7 @@ class People extends Entity
? sprintf('%s%s', $prefixe, $matches['code'])
: $matches['code'];
return preg_replace(self::$role_pattern, "[role=$role][type=$type][code=$code][libelle=\\4]", $v, 1);
}
else {
} else {
return false;
}
......@@ -807,7 +1098,7 @@ class People extends Entity
}
/**
* Attribut Ldap "supannRoleEntite"
* Attribut Ldap "ucbnFonctionStructurelle"
*
* @param array|string|null $value
* @param bool $append
......@@ -828,6 +1119,95 @@ class People extends Entity
return $this;
}
/**
* Attribut Ldap "supannParrainDN"
*
* @param array|string|Dn|Structure|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setSupannParrainDN($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_map(function ($val) {
if (is_string($val)) {
return Dn::checkDn($val) ? $val : null;
} elseif ($val instanceof Dn) {
return $val->toString();
} elseif ($val instanceof \UnicaenLdap\Entity\People) {
return $val->getDn();
} else {
return null;
}
}, $value);
$this->appendOrNot('supannParrainDN', $value, $append);
return $this;
}
/**
* Attribut Ldap "supannRefId"
*
* @param array|string|null $value
* @param bool $append
* @return self
* @throws Exception
* @throws LdapException
*/
public function setSupannRefId($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_filter($value, function ($v) {
return preg_match(self::$refid_pattern, $v);
});
$this->appendOrNot('supannRefId', $value, $append);
return $this;
}
/**
* Attribut Ldap "ucbnStatus"
*
* @param array|string|null $value
* @param bool $append
* @return $this
* @throws Exception
* @throws LdapException
*/
public function setUcbnStatus($value = null, $append = false)
{
$value = $this->preFormat($value);
$value = array_filter($value, function ($v) {
return in_array($v, $this->ucbnStatusAuthorizedValues);
});
$this->appendOrNot('ucbnStatus', $value, $append);
return $this;
}
/**
* Attribut Ldap "unicaenTermsOfUse"
*
* @param array|string|null $value
* @param bool $append
* @return $this
* @throws Exception
* @throws LdapException
*/
public function setUnicaenTermsOfUse($value = null, $append = false)
{
$value = $this->preFormat($value);
$this->appendOrNot('unicaenTermsOfUse', $value, $append);
return $this;
}
/**
* Retourne les structures auxquelles appartiennent la personne
*
......
......@@ -44,6 +44,13 @@ abstract class Entity
*/
protected $objectClass = [];
/**
* Liste des attributs autorisés pour une entité
*
* @var array
*/
protected $authorizedAttributes = [];
/**
* Liste des attributs contenant des dates
*
......@@ -262,6 +269,10 @@ abstract class Entity
*/
public function set($attrName, $value)
{
if(!in_array($attrName, $this->authorizedAttributes)) {
throw new Exception(sprintf("L'attribut Ldap '%s' n'est pas autorisé pour une entité '%s'.", $attrName, get_class($this)));
}
if(is_array($value)
&& count($value) > 1
&& in_array($attrName, $this->monoValuedAttributes)) {
......@@ -301,6 +312,10 @@ abstract class Entity
*/
public function add($attrName, $value)
{
if(!in_array($attrName, $this->authorizedAttributes)) {
throw new Exception(sprintf("L'attribut Ldap '%s' n'est pas autorisé pour une entité '%s'.", $attrName, get_class($this)));
}
if(in_array($attrName, $this->monoValuedAttributes)) {
$this->set($attrName, $value);
}
......
......@@ -6,5 +6,14 @@ use UnicaenLdap\Service\People as LdapPeopleService;
interface LdapPeopleServiceAwareInterface
{
/**
* @param LdapPeopleService $ldapPeopleService
* @return mixed
*/
public function setLdapPeopleService(LdapPeopleService $ldapPeopleService);
/**
* @return LdapPeopleService
*/
public function getLdapPeopleService();
}
\ No newline at end of file
......@@ -18,4 +18,12 @@ trait LdapPeopleServiceAwareTrait
{
$this->ldapPeopleService = $ldapPeopleService;
}
/**
* @return LdapPeopleService
*/
public function getLdapPeopleService()
{
return $this->ldapPeopleService;
}
}
\ No newline at end of file
<?php
namespace UnicaenLdap\Service;
use UnicaenLdap\Service\Structure as LdapStructureService;
interface LdapStructureServiceAwareInterface
{
/**
* @param LdapStructureService $ldapStructureService
* @return mixed
*/
public function setLdapStructureService(LdapStructureService $ldapStructureService);
/**
* @return LdapStructureService
*/
public function getLdapStructureService();
}
\ No newline at end of file
<?php
namespace UnicaenLdap\Service;
use UnicaenLdap\Service\Structure as LdapStructureService;
trait LdapStructureServiceAwareTrait
{
/**
* @var LdapStructureService
*/
protected $ldapStructureService;
/**
* @param LdapStructureService $ldapStructureService
*/
public function setLdapStructureService(LdapStructureService $ldapStructureService)
{