Compare commits

...

8 commits

4 changed files with 202 additions and 26 deletions

View file

@ -7,3 +7,13 @@ repos:
- id: php-stan
files: ^src\/.*\.(php)$
args: ['--configuration=.phpstan/config.neon']
- repo: local
hooks:
- id: xmlint
files: ^doc\/.*\.(docbook)$
name: xmlint
entry: xmllint --valid --noout doc/LdapSaisie.docbook
pass_filenames: false
language: system
types: [text]
pass_filenames: false

View file

@ -8,7 +8,7 @@
<itemizedlist>
<listitem>
<para>Via la configuration des attributs : La configuration des attributs
<para>Via la configuration des attributs : La configuration des attributs
détermine la présence ou non des attributs dans les formulaires. Elle permet
également de définir si on souhaite bloquer leur présence en lecture seulement.
</para>
@ -22,7 +22,7 @@ apparaîtra en lecture-écriture ou en lecture uniquement voir pas du tout.
</listitem>
<listitem>
<para>Via la configuration au niveau de chaque type d'&LSobject; : il y est
<para>Via la configuration au niveau de chaque type d'&LSobject; : il y est
possible de définir le comportement globale du formulaire comme la validation
via Ajax ou encore la disposition logique des attributs dans le formulaire.</para>
@ -68,8 +68,8 @@ via Ajax ou encore la disposition logique des attributs dans le formulaire.</par
<listitem>
<simpara>Tableau contenant la configuration des masques de saisie : il est
possible de définir des masques de saisie pour faire en sorte que lors de la
création d'un objet, seul un certain nombre d'élements soit demandé à
l'utilisateur. <link linkend='config-LSobject-LSform-dataEntryForm'>Voir la
création d'un objet, seul un certain nombre d'élements soit demandé à
l'utilisateur. <link linkend='config-LSobject-LSform-dataEntryForm'>Voir la
section concernée.</link></simpara>
</listitem>
</varlistentry>
@ -78,13 +78,13 @@ via Ajax ou encore la disposition logique des attributs dans le formulaire.</par
</listitem>
</itemizedlist>
</itemizedlist>
</para>
<sect3 id="config-LSobject-LSform-layout">
<title>Configuration de l'affichage</title>
<para>La configuration des <emphasis>layout</emphasis> se situe dans la
<para>La configuration des <emphasis>layout</emphasis> se situe dans la
configuration des &LSobjects;, dans la variable <varname>layout</varname>
(<emphasis>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform']['layout']</emphasis>).
Cette variable est un tableau associatif dont la clé est l'identifiant de l'onglet
@ -134,7 +134,7 @@ et dont la valeur associée est la configuration de l'onglet.
</variablelist>
</para>
<important><simpara>Lorsqu'un <emphasis>layout</emphasis> est défini, celui-ci
est <emphasis>"suivi à la lettre"</emphasis> pour l'affichage du &LSform;.
est <emphasis>"suivi à la lettre"</emphasis> pour l'affichage du &LSform;.
Ainsi, si un attribut est défini dans la configuration de l'objet comme présent
dans le &LSform; courant, mais que celui-ci n'est pas présent dans le <emphasis>
layout</emphasis>, il ne sera pas du tout affiché.</simpara></important>
@ -143,7 +143,7 @@ layout</emphasis>, il ne sera pas du tout affiché.</simpara></important>
<sect3 id="config-LSobject-LSform-dataEntryForm">
<title>Configuration des masques de saisie</title>
<para>La configuration des masques de saisie (<emphasis>dataEntryForm</emphasis>) se situe dans la
<para>La configuration des masques de saisie (<emphasis>dataEntryForm</emphasis>) se situe dans la
configuration des &LSobjects;, dans la variable <varname>dataEntryForm</varname>
(<emphasis>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform']['dataEntryForm']</emphasis>).
Cette variable est un tableau associatif dont la clé est l'identifiant du masque de saisie
@ -153,23 +153,28 @@ et dont la valeur associée est sa configuration.
<![CDATA[$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform']['dataEntryForm'] = array (
'masque1' => array(
'label' => '[label du masque de saisie]',
'disabledLayout' => [booleen],
'disabledLayout' => [booleen],
'displayedElements' => array (
'arg1',
'arg2',
'attr1',
'attr2',
...
),
'defaultValues' => array (
'arg3' => [value],
'arg4' => [value],
'attr3' => [value],
'attr4' => [value],
...
),
'requiredAllAttributes' => [booleen],
'requiredAttributes' => array (
'arg1',
'arg2',
'attr1',
'attr2',
...
)
),
'forceGeneration' => array (
'attr1',
'attr2',
...
),
),
...
);]]>
@ -208,7 +213,7 @@ et dont la valeur associée est sa configuration.
attributs. Les valeurs multiples sont possibles en utilisant des
tableaux.</simpara>
<important><simpara>Les valeurs seront vue comme des valeurs retournées par
le formulaire et non comme des valeurs des attribus LDAP eux-même. Ainsi
le formulaire et non comme des valeurs des attribus LDAP eux-même. Ainsi
et par exemple, un attribut traité comme un booléen dans un formulaire pourra
prendre comme valeur par défaut <emphasis>yes</emphasis> ou
<emphasis>no</emphasis>.</simpara></important>
@ -234,6 +239,14 @@ et dont la valeur associée est sa configuration.
</listitem>
</varlistentry>
<varlistentry>
<term>forceGeneration</term>
<listitem>
<simpara>Tableau contenant la liste des attributs dont la génération sera forcée lors de la
validation du formation.</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
</sect3>

View file

@ -203,6 +203,47 @@ function generate_eduPersonOrgUnitDN($ldapObject) {
return $retval;
}
/**
* Generation de la valeur de l'attribut supannEntiteAffectationPrincipale
* à partir de la valeur de l'attribut supannEntiteAffectation si elle est unique.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param LSldapObject $ldapObject L'objet ldap
*
* @return array|null|false La valeur de l'attribut supannEntiteAffectationPrincipale
* ou false si il y a un problème durant la génération
*/
function generate_supannEntiteAffectationPrincipale($ldapObject) {
if ( get_class($ldapObject -> attrs[ 'supannEntiteAffectation' ]) != 'LSattribute' ) {
LSerror :: addErrorCode(
'SUPANN_01',
array(
'dependency' => 'supannEntiteAffectation',
'attr' => 'supannEntiteAffectationPrincipale'
)
);
return false;
}
// Si des valeurs ont été fourni pour cet attribut par l'utilisateur, on les conserve
$affectations_principales = $ldapObject -> attrs[ 'supannEntiteAffectationPrincipale' ] -> getUpdateData();
if ($affectations_principales) return $affectations_principales;
// Sinon on prends la valeur de supannEntiteAffectation si elle est unique
$affectations = $ldapObject -> attrs[ 'supannEntiteAffectation' ] -> getUpdateData();
if (count($affectations) == 1)
return array($affectations[0]);
// Sinon on garde celle existante si elle est fait toujours partie de entites d'affecations de la personne
$affectations_principales = $ldapObject -> attrs[ 'supannEntiteAffectationPrincipale' ] -> getOldValue();
if ($affectations_principales && in_array($affectations_principales[0], $affectations))
return array($affectations_principales[0]);
// À défaut, l'attribut sera vide
return null;
}
/**
* Generation de la valeur de l'attribut eduPersonPrimaryOrgUnitDN
* à partir de la valeur de l'attribut supannEntiteAffectationPrincipale.
@ -266,6 +307,36 @@ function generate_eduPersonOrgDN($ldapObject) {
return $retval;
}
/**
* Generation de la valeur de l'attribut supannRessourceEtat
* à partir de la valeur de l'attribut supannRessourceEtatDate.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param LSldapObject $ldapObject L'objet ldap
*
* @return array|null|false La valeur de l'attribut supannRessourceEtat, null si aucune valeur peut
* être déterminée ou false si il y a un problème durant la génération.
*/
function generate_supannRessourceEtat($ldapObject) {
if ( get_class($ldapObject -> attrs[ 'supannRessourceEtatDate' ]) != 'LSattribute' ) {
LSerror :: addErrorCode(
'SUPANN_01',
array(
'dependency' => 'supannRessourceEtatDate',
'attr' => 'supannRessourceEtat'
)
);
return false;
}
$values = array();
foreach ($ldapObject -> attrs[ 'supannRessourceEtatDate' ] -> getValue() as $value) {
$values[] = explode(':', $value)[0];
}
return $values;
}
/***********************************************************************
* Fonction de parsing des valeurs spécifiques SUPANN
**********************************************************************/
@ -755,23 +826,46 @@ function supannGetRessourceSousEtatPossibleValues($options=null, $name=null, $ld
* @author Benjamin Dauvergne <bdauvergne@entrouvert.com>
*
* @param LSldapObject &$ldapObject Une référence à l'object LSldapObject
* @author Benjamin Dauvergne <bdauvergne@entrouvert.com>
*
* @return boolean True si les valeurs sont valides, False sinon
**/
global $_supannCheckEduPersonAffiliation_checked;
$_supannCheckEduPersonAffiliation_checked = false;
function supannCheckEduPersonAffiliation(&$ldapObject) {
global $_supannCheckEduPersonAffiliation_checked;
global $_validate_eduPersonAffiliation_checked;
$_validate_eduPersonAffiliation_checked = false;
function validate_eduPersonAffiliation(&$ldapObject) {
global $_validate_eduPersonAffiliation_checked;
$values = $ldapObject->getValue('eduPersonAffiliation');
if (!$_supannCheckEduPersonAffiliation_checked && in_array('affiliate', $values) && in_array('member', $values)) {
$_supannCheckEduPersonAffiliation_checked = true;
if (!$_validate_eduPersonAffiliation_checked && in_array('affiliate', $values) && in_array('member', $values)) {
$_validate_eduPersonAffiliation_checked = true;
return false;
}
return true;
}
/**
* Vérifie les valeurs de l'attribut eduPersonAffiliation
*
* Note: ancien nom de la fonction validate_eduPersonPrimaryAffiliation conservé pour
* rétro-compatibilié. Une erreur sera affichée lorsqu'on utilise cette fonction.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param LSldapObject &$ldapObject Une référence à l'object LSldapObject
*
* @return boolean True si les valeurs sont valides, False sinon
**/
function supannCheckEduPersonAffiliation(&$ldapObject) {
LSerror :: addErrorCode(
'LSsession_27',
array(
'old' => 'supannCheckEduPersonAffiliation()',
'new' => 'validate_eduPersonAffiliation()',
'context' => LSlog :: get_debug_backtrace_context(),
)
);
return validate_eduPersonAffiliation($ldapObject);
}
/**
* Vérifie la valeur de l'attribut eduPersonPrimaryAffiliation
*
@ -788,7 +882,7 @@ function supannCheckEduPersonAffiliation(&$ldapObject) {
*
* @return boolean True si la valeur est valide, False sinon
**/
function supannCheckEduPersonPrimaryAffiliation(&$ldapObject) {
function validate_eduPersonPrimaryAffiliation(&$ldapObject) {
$primary = $ldapObject->getValue('eduPersonPrimaryAffiliation');
$affiliations = $ldapObject->getValue('eduPersonAffiliation');
if (!array_intersect($primary, $affiliations))
@ -796,6 +890,54 @@ function supannCheckEduPersonPrimaryAffiliation(&$ldapObject) {
return true;
}
/**
* Vérifie la valeur de l'attribut eduPersonPrimaryAffiliation
*
* Note: ancien nom de la fonction validate_eduPersonPrimaryAffiliation conservé pour
* rétro-compatibilié. Une erreur sera affichée lorsqu'on utilise cette fonction.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param LSldapObject &$ldapObject Une référence à l'object LSldapObject
*
* @return boolean True si la valeur est valide, False sinon
**/
function supannCheckEduPersonPrimaryAffiliation(&$ldapObject) {
LSerror :: addErrorCode(
'LSsession_27',
array(
'old' => 'supannCheckEduPersonPrimaryAffiliation()',
'new' => 'validate_eduPersonPrimaryAffiliation()',
'context' => LSlog :: get_debug_backtrace_context(),
)
);
return validate_eduPersonPrimaryAffiliation($ldapObject);
}
/**
* Vérifie la valeur de l'attribut supannEntiteAffectationPrincipale
*
* Cette fonction est prévue pour pouvoir être utilisé comme paramètre
* function de la configuration de validation de l'intégrité des valeurs
* de l'attribut supannEntiteAffectationPrincipale (paramètre validation).
*
* Elle s'assure que la valeur de l'attribut supannEntiteAffectationPrincipale
* fait bien partie des valeurs de l'attribut supannEntiteAffectation.
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @param LSldapObject &$ldapObject Une référence à l'object LSldapObject
*
* @return boolean True si la valeur est valide, False sinon
**/
function validate_supannEntiteAffectationPrincipale(&$ldapObject) {
$primary = $ldapObject->getValue('supannEntiteAffectationPrincipale');
$affecations = $ldapObject->getValue('supannEntiteAffectation');
if (!array_intersect($primary, $affecations))
return false;
return true;
}
/**
* Retourne les valeurs possibles de l'attribut supannOIDCGenre.
*

View file

@ -492,6 +492,14 @@ class LSldapObject extends LSlog_staticLoggerClass {
else {
$LSform=false;
}
$forceGeneration = (
$LSform && $LSform -> dataEntryForm?
LSconfig::get(
'forceGeneration', array(), 'array', $LSform -> dataEntryFormConfig
):array()
);
foreach($this -> attrs as $attr_name => $attr) {
$attr_values = $attr -> getValue();
if (!$attr -> isValidate()) {
@ -500,7 +508,10 @@ class LSldapObject extends LSlog_staticLoggerClass {
$retval = false;
}
}
else if( (empty($attr_values)) && ($attr -> isRequired()) ) {
else if(
in_array($attr_name, $forceGeneration)
|| (empty($attr_values) && $attr -> isRequired())
) {
if ( $attr -> canBeGenerated()) {
if ($attr -> generateValue()) {
if (!$this -> validateAttrData($LSform, $attr, $justCheck)) {