mirror of
https://gitlab.easter-eggs.com/ee/ldapsaisie.git
synced 2024-12-28 03:13:48 +01:00
1 line
No EOL
334 KiB
JSON
1 line
No EOL
334 KiB
JSON
{"config":{"lang":["fr"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Introduction","text":"<p>LdapSaisie est une application web d'administration d'annuaire LDAP d\u00e9velopp\u00e9e en PHP/Javascript. Cette application a pour but d'abstraire la complexit\u00e9 d'un annuaire par l'interm\u00e9diraire d'une interface d'administration simple et intuitive. L'application a \u00e9t\u00e9 concue avec pour objectif premier une modularit\u00e9 maximum, ce qui permet l'extention ou l'adaptation facile de l'application par l'interm\u00e9diaire de modules, d'extentions et de greffons. Cette application peut \u00eatre utilis\u00e9e pour administrer le syst\u00e8me d'information bas\u00e9 sur l'annuaire LDAP et \u00e9galement en paral\u00e8lle pour permettre aux utilisateurs d'avoir acc\u00e8s aux donn\u00e9es les concernants et \u00e9ventuellement de les modifier.</p>"},{"location":"#fonctionnalites","title":"Fonctionnalit\u00e9s","text":"<p>De part sa modularit\u00e9, LdapSaisie est facilement extensible. Cependant, voici une liste non-exhaustive de ses fonctionnalit\u00e9s :</p> <ul> <li>Gestion d'annuaire simple et multi-branches</li> <li>Gestion d'un nombre illimit\u00e9 de types d'objets</li> <li>Gestion d'un nombre illimit\u00e9 de populations se connectant \u00e0 l'interface</li> <li>Gestion fine des droits des utilisateurs, permettant la maitrise des droits d'acc\u00e8s sur les objets de l'annuaire et leurs atributs, tout en permettant la d\u00e9l\u00e9gation de droits.</li> <li> <p>Gestion d'un grand nombre de types d'attributs :</p> <ul> <li>Texte (court ou long)</li> <li>Date (format param\u00e9trable)</li> <li>Bool\u00e9en (valeurs param\u00e9trables)</li> <li>Image/Photo</li> <li>Mot de passe (g\u00e9n\u00e9ration de mot passe avec gestion d'une politique fine)</li> <li>Adresse mail</li> <li>Flux RSS</li> <li>Lien web (URL)</li> <li>Adresse XMPP</li> <li>Maildir</li> <li>Quota de mails</li> <li>Clef publique SSH</li> <li>Liste d\u00e9roulante \u00e0 choix simple ou multiple</li> <li> <p>Relation \u00e0 d'autres objets de l'annuaire/ Exemple : membres d'un groupe, parrain d'un utilisateur, ... (valeur cl\u00e9 param\u00e9trable)</p> <p>Note</p> <p>Chaque type d'attribut \u00e0 des fonctionnalit\u00e9s qui lui sont propres et qui rendent plus facile et agr\u00e9able l'utilisation de l'interface (g\u00e9n\u00e9ration automatique de mot de passe, g\u00e9n\u00e9ration des valeurs d'un champ \u00e0 partir d'autres, ...).</p> </li> </ul> </li> </ul> <ul> <li>Gestion d'un grand nombre de r\u00e8gles de v\u00e9rification des valeurs des attributs :<ul> <li>Alpha-num\u00e9rique</li> <li>Lettres uniquement</li> <li>Longeur maximale/minimale d'une chaine de caract\u00e8res</li> <li>Valeur diff\u00e9rente de z\u00e9ro</li> <li>Pas de signe de ponctuation</li> <li>Valeur num\u00e9rique</li> <li>Comparaison de valeur</li> <li>Date</li> <li>Adresse mail</li> <li>Poids d'une image</li> <li>Taille d'une image</li> <li>Type de fichiers images</li> <li>Politique de mot de passe (longueur/caract\u00e8res autoris\u00e9s/caract\u00e8res obligatoires)</li> </ul> </li> </ul> <ul> <li>Gestion simplifi\u00e9e des relations entre les objets de l'annuaire</li> <li>Interface facilement personnalisable gr\u00e2ce \u00e0 l'utilisation d'un syst\u00e8me de template.</li> <li>Possibilit\u00e9 de postionner des d\u00e9clencheurs permettant d'ex\u00e9cuter vos propres scripts, fonctions ou m\u00e9thodes au moments pr\u00e9cis ou l'utilisateur cr\u00e9\u00e9, modifie ou supprime un objet ou un de ses attributs. Ces d\u00e9clencheurs, en fonction de leur positionnement, peuvent influencer le comportement de l'application en emp\u00eachant par exemple, la validation des donn\u00e9es d'un formulaire.</li> <li>Gestion fine de l'affichage des attributs en fonction de l'\u00e9cran (=vue) sur lequel se trouve l'utilisateur.</li> <li>Gestion des d\u00e9pendances entre attributs, permettant par exemple de reg\u00e9n\u00e9rer automatiquement la valeur d'un attribut cach\u00e9 lors de la modification d'un autre.</li> <li>Possibilit\u00e9 de g\u00e9rer des attributs enti\u00e8rement cach\u00e9s, dont les valeurs seront modifi\u00e9es lors de la modification d'attribut en d\u00e9pendance.</li> </ul>"},{"location":"api/","title":"API","text":"<p>Depuis la version 4.0, LdapSaisie offre une API visant \u00e0 permettre de faire les m\u00eames choses que ce qu'il est possible d'accomplir via l'interface web. L'id\u00e9e n'est bien entendue pas de se substituer syst\u00e9matiquement \u00e0 la possibilit\u00e9 de se connecter directement \u00e0 l'annuaire, mais plut\u00f4t d'offrir une API web pour l'int\u00e9gration d'outil pr\u00e9f\u00e9rant ce mode d'interaction, ou encore, pour exposer des m\u00e9thodes acc\u00e8s aux donn\u00e9es de l'annuaire tout en profitant des logiques m\u00e9tiers impl\u00e9ment\u00e9es/configur\u00e9es dans LdapSaisie : validation syntaxique et d'unicit\u00e9, r\u00e8gle de g\u00e9n\u00e9ration et d'interd\u00e9pendances des attributs, d\u00e9clencheurs, ...</p> <p>Note</p> <p>Cette API est actuellement dans une phase de test et n'offre pas encore toutes les fonctionnalit\u00e9s propos\u00e9es dans l'interface web. Elle est vou\u00e9e \u00e0 \u00e9voluer pour int\u00e9grer petit \u00e0 petit un maximum de fonctionnalit\u00e9s. Des contributions \u00e0 ce sujet seront plus qu'appr\u00e9ci\u00e9e !</p>"},{"location":"api/#authentification","title":"Authentification","text":"<p>L'authentification \u00e0 l'API utilise le m\u00eame composant <code>LSauth</code> que lors d'une authentification \u00e0 l'interface web, cependant, ce composant s'adapte pour prendre en compte de mode de connexion. Par d\u00e9faut, la m\u00e9thode d'authentification utilis\u00e9e sera LSauthMethod_HTTP et permettra de se connecter en sp\u00e9cifiant le nom d'utilisateur et le mot de l'utilisateur cherchant \u00e0 se connecter via une authentification basique HTTP.</p> <p>Warning</p> <p>Il est \u00e0 noter que tous les types d'utilisateur ne peuvent pas forc\u00e9ment utiliser l'API : le param\u00e8tre <code>api_access</code> doit \u00eatre explicitement positionn\u00e9 \u00e0 <code>True</code> dans la configuration du serveur LDAP.</p> <p>Une fois connect\u00e9, l'utilisateur endossera les droits associ\u00e9s \u00e0 ses LSprofiles, tout comme un utilisateur connect\u00e9 \u00e0 l'interface web.</p>"},{"location":"api/#methodes-exposees","title":"M\u00e9thodes expos\u00e9es","text":"<p>Les URLs des m\u00e9thodes de l'API ont \u00e9t\u00e9 construites par mim\u00e9tisme sur celle de l'interface web et sous la racine web <code>api/</code>. Par ailleurs, un num\u00e9ro de version d'API a \u00e9t\u00e9 ins\u00e9r\u00e9e dans chacune d'elles afin d'anticiper toutes \u00e9volutions futures majeures n\u00e9c\u00e9ssitants de conserver une r\u00e9trocompatibilit\u00e9 avec les anciennes versions de l'API.</p> <p>Toutes les m\u00e9thodes retournent des informations au format JSON et accepte le param\u00e8tre <code>pretty</code> permettant d'obtenir un retour plus facilement lisible. Les chaines de caract\u00e8res \u00e9chang\u00e9es doivent par ailleurs \u00eatre encod\u00e9es en UTF-8. On trouvera par ailleurs dans le retour JSON :</p> <ul> <li> <p><code>success</code></p> <p>Bool\u00e9en pr\u00e9cisant si l'action demand\u00e9e a correctement \u00e9t\u00e9 ex\u00e9cut\u00e9e.</p> </li> </ul> <ul> <li> <p><code>messages</code></p> <p>Ce tableau pourra \u00eatre pr\u00e9sent et lister les messages d'informations g\u00e9n\u00e9r\u00e9es par l'action demand\u00e9e. Il s'agira des m\u00eames messages que ceux affich\u00e9s dans l'interface web lorsque les actions \u00e9quivalentes y sont faites.</p> </li> </ul> <ul> <li><code>errors</code> Ce tableau pourra \u00eatre pr\u00e9sent et lister les messages d'erreurs g\u00e9n\u00e9r\u00e9es par l'action demand\u00e9e.</li> </ul> <p>Note</p> <p>Les messages d'informations et d'erreurs g\u00e9n\u00e9r\u00e9es par l'application sont traduites dans la langue courante qui peut \u00eatre sp\u00e9cifi\u00e9e via le param\u00e8tre <code>lang</code> accept\u00e9 par toutes les m\u00e9thodes (exemple : <code>fr_FR</code> ou <code>en_US</code>).</p> <p>Lorsqu'une m\u00e9thode cible un type d'objets, voir un objet en particulier, ces informations seront transmises dans l'URL appel\u00e9e. Si le type d'objet ou l'objet demand\u00e9 est introuvable, une erreur HTTP 404 sera g\u00e9n\u00e9r\u00e9e.</p> <p>Important</p> <p>Sauf pr\u00e9cision contraire, toutes les m\u00e9thodes expos\u00e9es sont accessibles uniquement via les m\u00e9thodes HTTP <code>GET</code> ou <code>POST</code>. L'acc\u00e8s via une autre m\u00e9thode retournera une erreur 404.</p> <ul> <li> <p><code>/api/1.0/object/[object type]</code></p> <p>Cette m\u00e9thode permet de rechercher/lister les informations d'un type d'objets de l'annuaire en particulier. Le type de l'objet est pr\u00e9cis\u00e9 dans l'URL et doit \u00eatre encod\u00e9 en cons\u00e9quence. Par mim\u00e9tisme du comportement de l'interface web, la recherche est pagin\u00e9e et accepte des param\u00e8tres similaires en plus de param\u00e8tre plus appropri\u00e9s \u00e0 un fonctionnement programmatique :</p> <ul> <li> <p><code>filter</code></p> <p>Permet de sp\u00e9cifier un filtre de recherche LDAP personnalis\u00e9. Celui-ci sera combin\u00e9 avec les param\u00e8tres propres au type d'objets recherch\u00e9s et aux autres param\u00e8tres sp\u00e9cifi\u00e9s (<code>pattern</code> par exemple).</p> <p>Warning</p> <p>Du fait d'une limitation de la classe <code>Net_LDAP2_Filter</code> utilis\u00e9e pour analyser le filtre pass\u00e9 en param\u00e8tre, seuls les filtres simples du type <code>(attribut=valeur)</code> sont accept\u00e9s ici. Pour les m\u00eames raisons, il est important que le filtre sp\u00e9cifi\u00e9 soit toujours entourn\u00e9 de paranth\u00e8ses.</p> </li> </ul> <ul> <li> <p><code>predefinedFilter</code></p> <p>Permet de sp\u00e9cifier un des filtres de recherche LDAP pr\u00e9d\u00e9finis dans la configuration du type d'objet.</p> </li> </ul> <ul> <li> <p><code>pattern</code></p> <p>Permet de sp\u00e9cifier un mot cl\u00e9 de recherche, comme propos\u00e9 dans l'interface web.</p> </li> </ul> <ul> <li> <p><code>approx</code></p> <p>Bool\u00e9en permettant d'activer/d\u00e9sactiver la recherche approximative sur le mot cl\u00e9. Les valeurs accept\u00e9es sont <code>1</code> ou <code>0</code>.</p> </li> </ul> <ul> <li> <p><code>basedn</code></p> <p>Permet de sp\u00e9cifier une base de recherche personnalis\u00e9 pour la recherche.</p> </li> </ul> <ul> <li> <p><code>subDn</code></p> <p>Dans le cas d'un serveur LDAP configur\u00e9 avec des sous-niveaux de connexion, permet de sp\u00e9cifier le sous-niveau pour la recherche.</p> </li> </ul> <ul> <li> <p><code>scope</code></p> <p>Permet de sp\u00e9cifier l'\u00e9tendue de la recherche dans l'annuaire. Valeurs accept\u00e9es: <code>sub</code>, <code>one</code> et <code>base</code>.</p> </li> </ul> <ul> <li> <p><code>recursive</code></p> <p>Bool\u00e9en permettant d'activer/d\u00e9sactiver la recherche recursive, c'est \u00e0 dire une recherche \u00e0 la racine de l'annuaire (ou du sous-niveau de connexion) avec une \u00e9tendue de recherche maximale. Les valeurs accept\u00e9es sont <code>1</code> ou <code>0</code>.</p> </li> </ul> <ul> <li> <p><code>displayFormat</code></p> <p>Permet de sp\u00e9cifier un LSformat personnalis\u00e9 pour le nom des objets dans le r\u00e9sultat de recherche.</p> </li> </ul> <ul> <li> <p><code>extraDisplayedColumns</code></p> <p>Bool\u00e9en permettant d'activer le retour des colonnes personnalis\u00e9es dans le r\u00e9sultat de recherche. Les valeurs accept\u00e9es sont <code>1</code> ou <code>0</code>.</p> </li> </ul> <ul> <li> <p><code>attributes</code></p> <p>Liste des attributs suppl\u00e9mentaires que devra retourner la recherche.</p> </li> </ul> <ul> <li> <p><code>attributesDetails</code></p> <p>Permet d'obtenir les d\u00e9tails sur les valeurs des attributs (au lieu des valeurs au format attendu en cas de cr\u00e9ation/modification de l'objet). Seul la pr\u00e9sence de ce param\u00e8tre suffit \u00e0 activer ce comportement, sa valeur n'a pas d'importance.</p> </li> </ul> <ul> <li> <p><code>sortBy</code></p> <p>Permet de pr\u00e9ciser sur quelle information le r\u00e9sultat de recherche doit \u00eatre tri\u00e9. Valeurs accept\u00e9es : <code>displayName</code>, <code>subDn</code> ou un des noms des colonnes personnalis\u00e9es.</p> </li> </ul> <ul> <li> <p><code>sortDirection</code></p> <p>Permet de pr\u00e9ciser l'ordre de tri du r\u00e9sultat de recherche. Valeurs accept\u00e9es : <code>ASC</code> (A-Z) ou <code>DESC</code> (Z-A).</p> </li> </ul> <ul> <li> <p><code>page</code></p> <p>Permet de pr\u00e9ciser la page du r\u00e9sultat de recherche.</p> </li> </ul> <ul> <li> <p><code>nbObjectsByPage</code></p> <p>Permet de pr\u00e9ciser le nombre maximum d'objets retourn\u00e9s par page du r\u00e9sultat de recherche.</p> </li> </ul> <ul> <li> <p><code>all</code></p> <p>Permet de r\u00e9clamer le r\u00e9sultat complet de la recherche (d\u00e9sactivation de la pagination). Seul la pr\u00e9sence de ce param\u00e8tre suffit \u00e0 activer ce comportement, sa valeur n'a pas d'importance.</p> </li> </ul> <ul> <li> <p><code>as_list</code></p> <p>Permet de r\u00e9clamer un r\u00e9sultat de recherche dans lequel, la cl\u00e9 <code>objects</code> sera une liste et non un dictionnaire. Dans ce cas, le DN de l'objet est fourni dans la cl\u00e9 <code>dn</code> des d\u00e9tails des objets.</p> </li> </ul> <ul> <li> <p><code>withoutCache</code></p> <p>Bool\u00e9en permettant de d\u00e9sactiver l'utilisation du cache. Les valeurs accept\u00e9es sont <code>1</code> ou <code>0</code>.</p> </li> </ul> <ul> <li> <p><code>keepParamsBetweenSearches</code></p> <p>Bool\u00e9en permettant d'activer/d\u00e9sactiver le stockage en session des param\u00e8tres de recherche (optionnel, par d\u00e9faut : <code>False</code>). Les valeurs accept\u00e9es sont <code>1</code> ou <code>0</code>.</p> </li> </ul> <p>Exemple :</p> <pre><code># curl -u username:secret 'https://ldapsaisie/api/1.0/object/LSpeople?extraDisplayedColumns=1&pretty'\n{\n \"success\": true,\n \"objects\": {\n \"uid=hmartin,ou=people,o=ls\": {\n \"name\": \"Henri MARTIN\",\n \"Mail\": \"henri.martin@ls.com\"\n },\n \"uid=s.ldapsaisie,ou=people,o=ls\": {\n \"name\": \"Secretariat LdapSaisie\",\n \"Mail\": \"secretariat@ldapsaisie.biz\"\n },\n \"uid=ls,ou=people,o=ls\": {\n \"name\": \"LdapSaisie\",\n \"Mail\": \"ldap.saisie@ls.com\"\n },\n \"uid=erwpa,ou=people,o=ls\": {\n \"name\": \"Erwan PAGE\",\n \"Mail\": \"erwan.page@ldapsaisie.biz\"\n },\n \"uid=user2,ou=people,ou=company1,ou=companies,o=ls\": {\n \"name\": \"prenom2 nom2\",\n \"Mail\": \"user2@ls.com\"\n }\n },\n \"total\": 14,\n \"params\": {\n \"keepParamsBetweenSearches\": false,\n \"filter\": null,\n \"pattern\": null,\n \"predefinedFilter\": false,\n \"basedn\": null,\n \"scope\": null,\n \"sizelimit\": 0,\n \"attronly\": false,\n \"approx\": false,\n \"recursive\": true,\n \"attributes\": [],\n \"onlyAccessible\": true,\n \"sortDirection\": null,\n \"sortBy\": null,\n \"sortlimit\": 0,\n \"displayFormat\": \"%{cn}\",\n \"nbObjectsByPage\": 25,\n \"withoutCache\": false,\n \"extraDisplayedColumns\": true\n },\n \"page\": 1,\n \"nbPages\": 3\n}\n</code></pre> </li> </ul> <ul> <li> <p><code>/api/1.0/object/[object type]/[dn]</code></p> <p>Cette m\u00e9thode permet de r\u00e9cup\u00e9rer les informations d'un objet de l'annuaire au format JSON. Le type de l'objet et son DN sont pr\u00e9cis\u00e9s dans l'URL et doivent \u00eatre encod\u00e9s en cons\u00e9quence. Par d\u00e9faut, les valeurs des attributs retourn\u00e9es sont au format tel qu'attendu en cas de cr\u00e9ation/modification de l'objet. Il est cependant possible d'ajouter le param\u00e8tre <code>details</code> afin d'obtenir des informations compl\u00e9mentaires sur les valeurs des attributs.</p> <p>Exemple :</p> <pre><code># curl -u username:secret 'https://ldapsaisie/api/1.0/object/LSpeople/uid=hmartin,ou=people,o=ls?pretty'\n{\n \"success\": true,\n \"dn\": \"uid=hmartin,ou=people,o=ls\",\n \"type\": \"LSpeople\",\n \"name\": \"Henri MARTIN\",\n \"details\": false,\n \"attributes\": {\n \"uid\": \"hmartin\",\n \"givenName\": \"Henri\",\n \"sn\": \"MARTIN\",\n \"cn\": \"Henri MARTIN\",\n \"mail\": \"henri.martin@ls.com\",\n \"personalTitle\": \"M.\",\n \"description\": [],\n \"jpegPhoto\": null,\n \"lsGodfatherDn\": [\n \"uid=eeggs,ou=people,o=ls\"\n ],\n \"uidNumber\": \"101022\",\n \"gidNumber\": \"102001\",\n \"loginShell\": \"no\",\n \"homeDirectory\": \"\\/home\\/com\",\n \"gecos\": null,\n \"shadowExpire\": null,\n \"shadowMax\": null,\n \"shadowInactive\": null,\n \"shadowLastChange\": null,\n \"sambaSID\": \"S-1-5-21-2421470416-3566881284-3047381809-203044\",\n \"sambaPrimaryGroupSID\": \"S-1-5-21-2421470416-3566881284-3047381809-205003\",\n \"sambaAcctFlags\": [\n \"U\"\n ],\n \"sambaHomeDrive\": null,\n \"sambaHomePath\": null,\n \"sambaProfilePath\": null,\n \"sambaLogonScript\": null,\n \"sambaLogonTime\": null,\n \"sambaLogoffTime\": null,\n \"sambaKickoffTime\": null,\n \"sambaPwdLastSet\": null,\n \"sambaPwdMustChange\": null,\n \"sambaPwdCanChange\": null\n },\n \"relations\": {\n \"groups\": {\n \"cn=direction,ou=groups,o=ls\": \"direction\",\n \"cn=secretariat,ou=groups,o=ls\": \"secretariat\"\n },\n \"godfather\": []\n }\n}\n</code></pre> </li> </ul> <ul> <li> <p><code>/api/1.0/object/[object type]/create</code></p> <p>Cette m\u00e9thode permet de cr\u00e9er un objet dans l'annuaire. Le type de l'objet qui sera cr\u00e9\u00e9 est pr\u00e9cis\u00e9 dans l'URL et doit \u00eatre encod\u00e9 en cons\u00e9quence. Les informations de l'objet doivent est transmises au format <code>x-www-form-urlencoded</code>. Elles peuvent \u00e9galement \u00eatre au format <code>multipart/form-data</code>, en particulier si votre requ\u00eate contient une image. Par mim\u00e9tisme avec l'interface web, seuls les attributs pr\u00e9vus dans le formulaire de cr\u00e9ation du type d'objet peuvent \u00eatre pass\u00e9es ici. De la m\u00eame mani\u00e8re, les attributs non-sp\u00e9cifi\u00e9s ici, pouront \u00eatre auto-g\u00e9n\u00e9r\u00e9s en accord avec leur configuration et la requ\u00eate sera accept\u00e9e uniquement si tous les attributs obligatoires y sont sp\u00e9cifi\u00e9s ou s'ils peuvent \u00eatre auto-g\u00e9n\u00e9r\u00e9s.</p> <p>Le format et la syntaxe des valeurs des attributs d\u00e9pends de leur type HTML. Ainsi, par exemple, un attribut de type HTML <code>boolean</code> acceptera comme valeurs possibles <code>yes</code> ou <code>no</code>. Pour plus de d\u00e9tails sur le type de valeur accept\u00e9e par un type d'attribut HTML en particulier, consultez sa documentation. Vous pouvez \u00e9galement analyser le code de la m\u00e9thode <code>getPostData()</code> de la classe PHP correspondante.</p> <p>Si l'application d\u00e9tecte un souci avec les informations transmises pour les attributs, un tableau <code>fields_errors</code> sera pr\u00e9sent dans la r\u00e9ponse JSON et contiendra pour chacun des attributs probl\u00e9matique, un tableau des messages d'erreurs g\u00e9n\u00e9r\u00e9es par l'application.</p> <p>Si le type d'objet en pr\u00e9voit, vous pouvez \u00e9galement utiliser un masque de saisie via le param\u00e8tre <code>dataEntryForm</code>.</p> <p>Exemple :</p> <pre><code># curl -u username:secret 'https://ldapsaisie/api/1.0/object/LSpeople/create?pretty' -d \"uid=foo.bar&personalTitle=M.&givenName=foo&sn=bar&cn=Foo Bar&mail=foo.bar@example.com&userPassword=Y0urS3cr3t&lsGodfatherDn[]=uid=admin,ou=people,o=ls&gidNumber=70000\"\n{\n \"success\": true,\n \"type\": \"LSpeople\",\n \"dn\": \"uid=foo.bar,ou=people,o=ls\",\n \"name\": \"Foo Bar\",\n \"messages\": [\n \"Le mail de notification a \\u00e9t\\u00e9 envoy\\u00e9.\",\n \"L'objet a \\u00e9t\\u00e9 ajout\\u00e9.\"\n ]\n}\n</code></pre> </li> </ul> <ul> <li> <p><code>/api/1.0/object/[object type]/[dn]/modify</code></p> <p>Cette m\u00e9thode permet de modifier un objet dans l'annuaire. Le type de l'objet et son DN sont pr\u00e9cis\u00e9s dans l'URL et doivent \u00eatre encod\u00e9s en cons\u00e9quence. Les informations de l'objet \u00e0 modifier doivent \u00eatre transmises au m\u00eame format que pour la m\u00e9thode <code>create</code> (voir ci-dessus). Comme pour cette derni\u00e8re, seuls les attributs pr\u00e9vus dans le formulaire de modification du type d'objet peuvent \u00eatre pass\u00e9es ici et la r\u00e9ponse JSON pourra contenir un tableau <code>fields_errors</code> contenant les erreurs g\u00e9n\u00e9r\u00e9es par l'application au sujet des valeurs transmises pour les attributs.</p> <p>Exemple :</p> <pre><code># curl -u username:secret 'https://ldapsaisie/api/1.0/object/LSpeople/uid=foo.bar,ou=people,o=ls/modify?pretty' -d \"givenName=foo&sn=bar&cn=Foo Bar\"\n{\n \"dn\": \"uid=foo.bar,ou=people,o=ls\",\n \"type\": \"LSpeople\",\n \"name\": \"Foo Bar\",\n \"success\": true,\n \"messages\": [\n \"L'objet a bien \\u00e9t\\u00e9 modifi\\u00e9.\"\n ]\n}\n</code></pre> </li> </ul> <ul> <li> <p><code>/api/1.0/object/[object type]/[dn]/remove</code></p> <p>Cette m\u00e9thode permet de supprimer un objet dans l'annuaire. Le type de l'objet et son DN sont pr\u00e9cis\u00e9s dans l'URL et doivent \u00eatre encod\u00e9s en cons\u00e9quence.</p> <p>Exemple :</p> <pre><code># curl -u username:secret 'https://ldapsaisie/api/1.0/object/LSpeople/uid=foo.bar,ou=people,o=ls/remove?pretty'\n{\n \"dn\": \"uid=foo.bar,ou=people,o=ls\",\n \"type\": \"LSpeople\",\n \"name\": \"Foo Bar\",\n \"success\": true,\n \"messages\": [\n \"Foo Bar a bien \\u00e9t\\u00e9 supprim\\u00e9.\"\n ]\n}\n</code></pre> </li> </ul> <ul> <li> <p><code>/api/1.0/object/[object type]/import</code></p> <p>Cette m\u00e9thode permet d'importer des objets d'un type en particulier \u00e0 partir de donn\u00e9es d'import format\u00e9es selon un ioFormat configur\u00e9 pour ce type d'objets. Le type de l'objet est pr\u00e9cis\u00e9 dans l'URL et doit \u00eatre encod\u00e9 en cons\u00e9quence. Par mim\u00e9tisme du comportement de l'interface web, cette m\u00e9thode accepte des param\u00e8tres similaires et s'attend \u00e0 r\u00e9cup\u00e9rer les donn\u00e9es d'import dans le corps de la requ\u00eate.</p> <ul> <li> <p><code>ioFormat</code></p> <p>Le nom de l'ioFormatdes donn\u00e9es d'import.</p> </li> </ul> <ul> <li> <p><code>updateIfExists</code></p> <p>Bool\u00e9en permettant d'activer/d\u00e9sactiver la mise \u00e0 jour des donn\u00e9es des objets s'ils existent d\u00e9j\u00e0. Si ce mode est inactif et qu'un objet des donn\u00e9es d'import existe d\u00e9j\u00e0, une erreur sera remont\u00e9e. Les valeurs accept\u00e9es sont <code>1</code> ou <code>0</code>.</p> </li> </ul> <ul> <li> <p><code>justTry</code></p> <p>Bool\u00e9en permettant d'activer/d\u00e9sactiver le mode de v\u00e9rification des donn\u00e9es d'import uniquement. Si ce mode est actif, les donn\u00e9es d'import seront analys\u00e9es pour v\u00e9rifier qu'elles sont correctes, mais l'import en lui-m\u00eame ne sera pas effectu\u00e9. Les valeurs accept\u00e9es sont <code>1</code> ou <code>0</code>.</p> <p>Note</p> <p>Le retour de cette m\u00e9thode en mode <code>justTry</code> est identique \u00e0 une ex\u00e9cution en mode normal. Ce mode permet donc d'anticiper le r\u00e9sultat d'un import \u00e0 partir d'un jeu de donn\u00e9es sources.</p> <p>Warning</p> <p>En mode <code>justTry</code>, seul la v\u00e9rification syntaxique des donn\u00e9es est fiable, car les informations doublonn\u00e9es au sein des donn\u00e9es d'import ne pourront \u00eatre d\u00e9tect\u00e9es.</p> </li> </ul> <p>En cas d'erreurs d\u00e9tect\u00e9es dans les informations des objets des donn\u00e9es d'import, le tableau <code>errors</code> du retour de la m\u00e9thode contiendra une entr\u00e9e pour chaque objet en erreur sous le format d'un dictionnaire dont la cl\u00e9 <code>data</code> reprendra les informations de l'objet telle que charg\u00e9 (ou g\u00e9n\u00e9r\u00e9e) depuis les donn\u00e9es sources, ainsi qu'un dictionnaire sous la cl\u00e9 <code>errors</code> qui contiendra les erreurs globales concernant l'objet sous la cl\u00e9 <code>globals</code> et les erreurs propres \u00e0 ses attributs dans un dictionnaire sous la cl\u00e9 <code>attrs</code>.</p> <p>Note</p> <p>Les erreurs d'importation sur un objet sont non-bloquantes : l'importation des autres objets ne sera pas interrompue.</p> <p>Exemple :</p> <pre><code># curl -u username:secret --data-binary @/path/to/input.file 'https://ldapsaisie/api/1.0/object/LSpeople/import?ioFormat=mycsv&pretty'\n{\n \"success\": false,\n \"LSobject\": \"LSpeople\",\n \"ioFormat\": \"mycsv\",\n \"updateIfExists\": false,\n \"justTry\": false,\n \"imported\": {\n \"uid=rturin,ou=people,o=ls\": \"M. Roger TURIN\"\n },\n \"updated\": [],\n \"errors\": [\n {\n \"data\": {\n \"uid\": [\n \"lmartin\"\n ],\n \"personalTitle\": [\n \"Mme\"\n ],\n \"givenName\": [\n \"Ludivine\"\n ],\n \"sn\": [\n \"MARTIN\"\n ],\n \"mail\": [\n \"lmartin@gmail.com\"\n ],\n \"userPassword\": [\n \"123Yh%uT\"\n ],\n \"gidNumber\": [\n \"102009\"\n ],\n \"loginShell\": [\n \"no\"\n ],\n \"cn\": [\n \"Mme Ludivine MARTIN\"\n ]\n },\n \"errors\": {\n \"globals\": [\n \"Un objet existe d\\u00e9j\\u00e0 dans l'annuaire LDAP avec le DN uid=lmartin,ou=people,o=ls.\"\n ],\n \"attrs\": []\n }\n }\n ],\n \"messages\": [\n \"Le mail de notification a \\u00e9t\\u00e9 envoy\\u00e9.\"\n ]\n}\n</code></pre> </li> </ul> <ul> <li> <p><code>/api/1.0/object/[object type]/export</code></p> <p>Cette m\u00e9thode permet d'exporter les objets d'un type en particulier dans un ioFormat configur\u00e9 pour ce type d'objets. Le type de l'objet est pr\u00e9cis\u00e9 dans l'URL et doit \u00eatre encod\u00e9 en cons\u00e9quence.</p> <ul> <li> <p><code>ioFormat</code></p> <p>Le nom de l'ioFormat .</p> </li> </ul> <p>En tant normal, le retour de cette m\u00e9thode sera directement le fichier d'export demand\u00e9. Cependant, si une erreur survient, les param\u00e8tres d'export seront repris dans le retour <code>JSON</code> de la m\u00e9thode qui contiendra \u00e9galement les erreurs survenues.</p> <p>Exemple :</p> <pre><code># curl -u username:secret --data-binary @/path/to/input.file 'https://ldapsaisie/api/1.0/object/LSpeople/export?ioFormat=mycsv&pretty'\nlogin;civility;firstname;name;mail;password;gid;shell\nhmartin;M.;Henri;MARTIN;henri.martin@ls.com;********;102001;no\ns.ldapsaisie;M.;Secretariat;LdapSaisie;secretariat@ldapsaisie.biz;********;70000;no\nls;M.;Ldap;Saisie;ldap.saisie@ls.com;********;102001;no\nerwpa;M.;Erwan;PAGEARD;erwan.page@ldapsaisie.biz;********;102009;no\n[...]\n</code></pre> </li> </ul> <ul> <li> <p><code>/api/1.0/object/[object type]/[dn]/relation/[relation]</code></p> <p>Cette m\u00e9thode permet de g\u00e9rer les objets en relation avec un objet en particulier de l'annuaire. Le type de l'objet, son DN et le nom de la relation sont pr\u00e9cis\u00e9s dans l'URL et doivent \u00eatre encod\u00e9s en cons\u00e9quence. Cette m\u00e9thode accepte les param\u00e8tres <code>add</code> et <code>remove</code> permettant de lister le ou les DN d'objet(s) \u00e0 respectivement ajouter ou supprimer parmis les objets actuellement en relation avec l'objet sp\u00e9cifi\u00e9. Si aucun DN n'est sp\u00e9cifi\u00e9 comme devant \u00eatre ajout\u00e9 ou supprim\u00e9, la m\u00e9thode retournera simplement les DN des objets en relation. En cas de modification demand\u00e9e, la m\u00e9thode retournera la nouvelle liste des DNs des objets en relation, quel que soit le r\u00e9sultat de l'op\u00e9ration de mise \u00e0 jour.</p> <p>Exemple :</p> <pre><code># curl -u username:secret 'https://ldapsaisie/api/1.0/object/LSpeople/uid=foo.bar,ou=people,o=ls/relation/groups?pretty&add[]=cn=ls,ou=groups,o=ls&add[]=cn=invite,ou=groups,o=ls'\n{\n \"dn\": \"uid=foo.bar,ou=people,o=ls\",\n \"type\": \"LSpeople\",\n \"name\": \"Foo Bar\",\n \"relation\": \"groups\",\n \"success\": true,\n \"relatedObjects\": [\n \"cn=ls,ou=groups,o=ls\",\n \"cn=invite,ou=groups,o=ls\"\n ],\n \"messages\": [\n \"Objects in relation updated.\"\n ]\n}\n</code></pre> </li> </ul>"},{"location":"conf/","title":"Configuration","text":"<p>La configuration du projet est situ\u00e9e principalement dans le dossier <code>conf/</code>. Les exceptions seront d\u00e9taill\u00e9es par la suite.</p> <p>Warning</p> <p>Toute la configuration du projet se fait par l'interm\u00e9diaire de fichiers d\u00e9finissant des variables PHP dont les valeurs sont utilis\u00e9es par le programme. Ceci signifie que la syntaxe de ces fichiers doit \u00eatre valide avec l'interpr\u00e9teur PHP utilis\u00e9.</p>"},{"location":"conf/LSaddon/","title":"Configuration des LSaddons","text":"<p>Cette partie d\u00e9crit la mani\u00e8re de configurer les diff\u00e9rents LSaddons actuellement support\u00e9s par LdapSaisie. Ces addons peuvent avoir un fichier de configuration et il sera alors stock\u00e9 dans le dossier <code>conf/LSaddons/</code> et potera le nom <code>config.LSaddons.[addon name].php</code>.</p>"},{"location":"conf/LSaddon/LSaddon_LSaccessRightsMatrixView/","title":"LSaddon_LSaccessRightsMatrixView","text":"<p>Cet LSaddon offre une interface de visualisation des droits d'acc\u00e8s des diff\u00e9rents LSprofiles configur\u00e9s. Pour chaque type d'objet, la matrice des droits d'acc\u00e8s par attribut et par profil est affich\u00e9 sous la forme d'un tableau.</p> <p>Le fichier de configuration permet de d\u00e9finir au travers la variable <code>$GLOBALS['LSaccessRightsMatrixView_allowed_LSprofiles']</code> la liste des LSprofiles autoris\u00e9s \u00e0 acc\u00e9der \u00e0 cette interface.</p>"},{"location":"conf/LSaddon/LSaddon_accesslog/","title":"LSaddon_accesslog","text":"<p>Cet LSaddon fournit la fonction <code>showObjectAccessLogs()</code> pouvant \u00eatre utilis\u00e9e comme customActions et permettant d'afficher les logs d'acc\u00e8s produits par l'overlay OpenLDAP accesslog sur un objet de l'annuaire.</p> <p>La constante <code>LS_ACCESSLOG_BASEDN</code> du fichier de configuration de l'addon (<code>conf/LSaddons/config.LSaddons.accesslog.php</code>) permet d'indiquer le base DN de la base stockant les logs :</p> <pre><code>// Accesslog base DN\ndefine('LS_ACCESSLOG_BASEDN', 'cn=ldapsaisie-accesslog');\n</code></pre> <p>Warning</p> <p>LdapSaisie se connectera \u00e0 la base stockant les logs d'acc\u00e8s de l'annuaire avec les m\u00eames param\u00e8tres de connexion que pour la base principale (except\u00e9 le base DN). Pensez \u00e0 ajuster les ACLs de la base stockant les logs d'acc\u00e8s pour autoriser l'utilisateur d'LdapSaisie \u00e0 se connecter et lire les informations qu'elle contient.</p> <p>Exemple d'ACL \u00e0 mettre en place : <pre><code>to *\n by dn.exact=uid=ldapsaisie,ou=sysaccounts,o=ls read\n by * break\n</code></pre></p> <p>Ci-dessous, vous trouverez un exemple de configuration de la fonction <code>showObjectAccessLogs()</code> comme customActions :</p> <p>Exemple d'utilisation :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople'] = array (\n [...]\n 'customActions' => array (\n 'showObjectAccessLogs' => array (\n 'function' => 'showObjectAccessLogs',\n 'label' => 'Show access logs',\n 'hideLabel' => true,\n 'noConfirmation' => true,\n 'disableOnSuccessMsg' => true,\n 'icon' => 'clock',\n 'rights' => array (\n 'admin'\n ),\n ),\n ),\n [...]\n);\n</code></pre>"},{"location":"conf/LSaddon/LSaddon_asterisk/","title":"LSaddon_asterisk","text":"<p>Cet LSaddon est utilis\u00e9 pour g\u00e9rer les fonctionnalit\u00e9s sp\u00e9cifiques au serveur de t\u00e9l\u00e9phonie Asterisk. Cet LSaddon donne acc\u00e8s \u00e0 une fonction permettant l'encodage d'un mot de passe au format sp\u00e9cifique attendu par Asterisk. Ce format est un hash MD5 d'une chaine de caract\u00e8re compos\u00e9e du nom d'utilisateur, d'une chaine fixe sp\u00e9cifi\u00e9e dans la configuration d'Asterisk et du mot de passe en clair.</p>"},{"location":"conf/LSaddon/LSaddon_exportSearchResultAsCSV/","title":"LSaddon_exportSearchResultAsCSV","text":"<p>Cet LSaddon fournie une fonction du m\u00eame nom pouvant \u00eatre utilis\u00e9e comme customActions et permettant de t\u00e9l\u00e9charger le r\u00e9sultat d'une recherche au format CSV. L'export g\u00e9n\u00e9r\u00e9 reprend exactement le contenu des colonnes du tableau du r\u00e9sultat de la recherche. Le DN de l'objet LDAP correspondant est \u00e9galement fournis dans une colonne.</p> <p>Des param\u00e8tres de configuration sont disponibles dans le fichier de configuration <code>config.LSaddons.exportSearchResultAsCSV.php</code>. Ils permettent notamment de contr\u00f4ller le format du fichier CSV g\u00e9n\u00e9r\u00e9.</p> <pre><code>// CSV file delimiter\ndefine('LS_EXPORTSEARCHRESULTASCSV_DELIMITER',',');\n\n// CSV file enclosure\ndefine('LS_EXPORTSEARCHRESULTASCSV_ENCLOSURE','\"');\n\n// CSV file escape character (available since PHP 5.5.4)\ndefine('LS_EXPORTSEARCHRESULTASCSV_ESCAPE_CHAR','\\\\');\n</code></pre> <p>Ci-dessous, vous trouverez un exemple de configuration de la fonction <code>exportSearchResultAsCSV()</code> comme customActions :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople']['LSsearch'] = array (\n [...]\n 'customActions' => array (\n 'exportSearchResultAsCSV' => array (\n 'label' => 'Export result as CSV',\n 'icon' => 'export_csv',\n 'function' => 'exportSearchResultAsCSV',\n 'noConfirmation' => true,\n 'disableOnSuccessMsg' => true,\n 'rights' => array (\n 'admin'\n )\n ),\n ),\n [...]\n);\n</code></pre> <p>Note</p> <p>Le label et l'ic\u00f4ne fournis dans cet exemple sont traduits et d\u00e9livr\u00e9s avec LdapSaisie.</p>"},{"location":"conf/LSaddon/LSaddon_impersonate/","title":"LSaddon_impersonate","text":"<p>Cet LSaddon fournie une fonction du m\u00eame nom pouvant \u00eatre utilis\u00e9e comme customActions et permettant de se reconnecter en tant qu'un autre utilisateur de l'annuaire.</p> <p>Ci-dessous, vous trouverez un exemple de configuration de la fonction <code>impersonate()</code> comme customActions :</p> <p>Exemple d'utilisation :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople'] = array (\n [...]\n 'customActions' => array (\n 'impersonate' => array (\n 'function' => 'impersonate',\n 'label' => 'Reconnect as this user',\n 'hideLabel' => True,\n 'noConfirmation' => true,\n 'disableOnSuccessMsg' => true,\n 'icon' => 'user_go',\n 'rights' => array (\n 'admin'\n ),\n ),\n ),\n [...]\n);\n</code></pre>"},{"location":"conf/LSaddon/LSaddon_mail/","title":"LSaddon_mail","text":"<p>Cet LSaddon est utilis\u00e9 pour g\u00e9rer l'envoie de mail. Il utilise pour cela les librairies PEAR Mail et Mail_Mime qui doivent \u00eatre install\u00e9s. Cet LSaddon doit \u00eatre configur\u00e9 en \u00e9ditant son fichier de configuration <code>config.LSaddons.mail.php</code>.</p> <pre><code> ***********************************************\n * Configuration du support de l'envoi de mail *\n ***********************************************\n */\n\n// Pear :: Mail\ndefine('PEAR_MAIL','/usr/share/php/Mail.php');\n\n// Pear :: Mail_mime\ndefine('PEAR_MAIL_MIME','/usr/share/php/Mail/mime.php');\n\n/*\n * M\u00e9thode d'envoie :\n * - mail : envoie avec la m\u00e9thode PHP mail()\n * - sendmail : envoie la commande sendmail du syst\u00e8me\n * - smtp : envoie en utilisant un serveur SMTP\n */\ndefine('MAIL_SEND_METHOD','smtp');\n\n/*\n * Param\u00e8tres d'envoie :\n * Ces param\u00e8tres d\u00e9pende de la m\u00e9thode utilis\u00e9. Repport\u00e9 vous \u00e0 la documentation\n * de PEAR :: Mail pour plus d'information.\n * Lien : http://pear.php.net/manual/en/package.mail.mail.factory.php\n * Infos :\n * List of parameter for the backends\n * mail\n * o If safe mode is disabled, $params will be passed as the fifth\n * argument to the PHP mail() function. If $params is an array,\n * its elements will be joined as a space-delimited string.\n * sendmail\n * o $params[\"sendmail_path\"] - The location of the sendmail program\n * on the filesystem. Default is /usr/bin/sendmail.\n * o $params[\"sendmail_args\"] - Additional parameters to pass to the\n * sendmail. Default is -i.\n * smtp\n * o $params[\"host\"] - The server to connect. Default is localhost.\n * o $params[\"port\"] - The port to connect. Default is 25.\n * o $params[\"auth\"] - Whether or not to use SMTP authentication.\n * Default is FALSE.\n * o $params[\"username\"] - The username to use for SMTP authentication.\n * o $params[\"password\"] - The password to use for SMTP authentication.\n * o $params[\"localhost\"] - The value to give when sending EHLO or HELO.\n * Default is localhost\n * o $params[\"timeout\"] - The SMTP connection timeout.\n * Default is NULL (no timeout).\n * o $params[\"verp\"] - Whether to use VERP or not. Default is FALSE.\n * o $params[\"debug\"] - Whether to enable SMTP debug mode or not.\n * Default is FALSE.\n * o $params[\"persist\"] - Indicates whether or not the SMTP connection\n * should persist over multiple calls to the send() method.\n */\n$GLOBALS['MAIL_SEND_PARAMS'] = NULL;\n\n/*\n * Headers :\n */\n$GLOBALS['MAIL_HEARDERS = array();\n\n// Catch all sent emails\n$GLOBALS['MAIL_CATCH_ALL'] = array();\n</code></pre> <p>Cet LSaddon offre la possibilit\u00e9 d'utilis\u00e9 la fonction PHP <code>sendMail()</code> :</p> <pre><code>bool sendMail(\n <string> $to,\n <string> $subject,\n <string> $msg,\n <array(string)> $headers,\n <array> $attachments,\n <string> $eol,\n <string> $encoding,\n <boolean> $html\n);\n</code></pre>"},{"location":"conf/LSaddon/LSaddon_maildir/","title":"LSaddon_maildir","text":"<p>Cet LSaddon est utilis\u00e9 pour g\u00e9rer la manipulation distante de maildir.</p> <p>FIXME</p>"},{"location":"conf/LSaddon/LSaddon_mailquota/","title":"LSaddon_mailquota","text":"<p>Cet LSaddon fournie une fonction <code>mailquota_get_usage</code> pouvant \u00eatre utilis\u00e9e pour r\u00e9cup\u00e9rer l'utilisation du quota d'une bo\u00eete mail IMAP. Pour cela, LdapSaisie se connecte au serveur IMAP en utilisant un compte ma\u00eetre.</p> <p>Cet LSaddon fournie une \u00e9galement une fonction <code>mailquota_show_usage</code> pouvant \u00eatre utilis\u00e9e comme customActions et permettant d'afficher l'utilisation du quota de la bo\u00eete mail correspondante via une message dynamique (<code>LSinfo</code>).</p> <p>Des param\u00e8tres de configuration sont disponibles dans le fichier de configuration <code>config.LSaddons.mailquota.php</code>.</p> <pre><code>// IMAP Mailbox connection string LSformat (composed with LSldapObject attributes)\n// See : https://php.net/imap_open (parameter $mailbox)\ndefine('MAILQUOTA_IMAP_MAILBOX','{localhost}');\n\n// IMAP Master user\ndefine('MAILQUOTA_IMAP_MASTER_USER', 'ldapsaisie');\n\n// IMAP Master user's password\ndefine('MAILQUOTA_IMAP_MASTER_USER_PWD', 'secret');\n\n// IMAP Master user LSformat composed with :\n// * masteruser = master username (MAILQUOTA_IMAP_MASTER_USER)\n// * LSldapObject attributes\ndefine('MAILQUOTA_IMAP_MASTER_USER_FORMAT', '%{mail}*%{masteruser}');\n\n// IMAP quota root mailbox\ndefine('MAILQUOTA_IMAP_QUOTA_ROOT_MAILBOX', 'INBOX');\n</code></pre> <p>Ci-dessous, vous trouverez un exemple de configuration de la fonction <code>mailquota_show_usage()</code> comme customActions :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople'] = array (\n [...]\n 'customActions' => array (\n 'showmailquotausage' => array (\n 'function' => 'mailquota_show_usage',\n 'label' => 'Show mail quota usage',\n 'noConfirmation' => true,\n 'disableOnSuccessMsg' => true,\n 'icon' => 'mail',\n 'rights' => array (\n 'admin'\n )\n ),\n [...]\n ),\n [...]\n);\n</code></pre>"},{"location":"conf/LSaddon/LSaddon_phpldapadmin/","title":"LSaddon_phpldapadmin","text":"<p>Cet LSaddon est utilis\u00e9 pour permettre un lien facile entre le logiciel PhpLdapAdmin et LdapSaisie. Il sera possible ainsi \u00e0 partir d'un objet dans LdapSaisie de voir ce m\u00eame objet dans PhpLdapAdmin.</p> <p>Il est necessaire de configurer l'URL de votre installation de PhpLdapAdmin dans le fichier de configuration <code>config.LSaddons.phpldapadmin.php</code>.</p> <p>Structure du fichier :</p> <pre><code>// PhpLdapAdmin View Object URL format\ndefine('LS_PHPLDAPADMIN_VIEW_OBJECT_URL_FORMAT','//'.$_SERVER['SERVER_NAME'].'/phpldapadmin/cmd.php?cmd=template_engine&server_id=0&dn=%{dn}');\n</code></pre> <p>Cet LSaddon offre la possibilit\u00e9 d'utilis\u00e9 la fonction PHP <code>redirectToPhpLdapAdmin()</code> comme customActions.</p> <p>Exemple d'utilisation :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople'] = array (\n [...]\n 'customActions' => array (\n 'redirectPhpLdapAdmin' => array (\n 'function' => 'redirectToPhpLdapAdmin',\n 'label' => 'See in PhpLdapAdmin',\n 'hideLabel' => True,\n 'noConfirmation' => true,\n 'disableOnSuccessMsg' => true,\n 'icon' => 'phpldapadmin',\n 'rights' => array (\n 'admin'\n )\n ),\n ),\n [...]\n);\n</code></pre>"},{"location":"conf/LSaddon/LSaddon_ppolicy/","title":"LSaddon_ppolicy","text":"<p>Cet LSaddon fourni :</p> <ul> <li> <p>une fonction <code>ppolicy_extraDisplayColumn_password_expiration</code> pouvant \u00eatre utilis\u00e9e pour la g\u00e9n\u00e9ration d'une extraDisplayedColumn affichant l'\u00e9tat d'expiration du mot de passe des objets d'une recherche.</p> <p>Exemple d'utilisation :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople']['LSsearch'] = array (\n [...]\n 'extraDisplayedColumns' => array (\n [...]\n 'password_expiration' => array (\n 'label' => 'Password expiration',\n 'generateFunction' => 'ppolicy_extraDisplayColumn_password_expiration',\n 'additionalAttrs' => array('pwdChangedTime', 'pwdPolicySubentry'),\n 'escape' => false,\n 'cssStyle' => 'width: 14em; text-align: center;'\n ),\n [...]\n ),\n [...]\n);\n</code></pre> </li> </ul> <ul> <li> <p>une fonction <code>ppolicy_export_search_info</code> pouvant \u00eatre utilis\u00e9e comme actions personnalis\u00e9es sur les recherches d'LSobjects pour exporter au format CSV les informations des politiques de mots de passe des objets retourn\u00e9s par la recherche.</p> <p>Exemple d'utilisation :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople']['LSsearch'] = array (\n [...]\n 'customActions' => array (\n 'exportPpolicyInfo' => array (\n 'label' => 'Export password policy info',\n 'icon' => 'export_csv',\n 'function' => 'ppolicy_export_search_info',\n 'noConfirmation' => true,\n 'disableOnSuccessMsg' => true,\n 'rights' => array (\n 'admin',\n ),\n ),\n ),\n [...]\n);\n</code></pre> </li> </ul> <ul> <li>la m\u00e9thode d'API <code>exportPpolicyInfo</code> permettant d'exporter les informations des politiques de mots de passe de tous les objets d'un type donn\u00e9. Cette m\u00e9thode est accessible via l'URL au format suivant : <code>/api/1.0/exportPpolicyInfo/[object type]</code></li> </ul> <ul> <li> <p>la commande CLI <code>export_ppolicy_info</code> permettant d'exporter les informations des politiques de mots de passe de tous les objets d'un type donn\u00e9.</p> <p>Utilisation :</p> <pre><code>ldapsaisie export_ppolicy_info [object type] [-o|--output filepath] [-j|--json [-p|--pretty]]\n</code></pre> </li> </ul> <p>Des param\u00e8tres de configuration sont disponibles dans le fichier de configuration <code>config.LSaddons.ppolicy.php</code>.</p> <pre><code>// Default password policy object DN (set to null if no default policy is configured)\ndefine('LS_PPOLICY_DEFAULT_DN', null);\n\n// Ppolicy password warning expiration threshold (in seconds)\ndefine('LS_PPOLICY_WARNING_EXPIRATION_THRESHOLD', 7 * 86400);\n\n// Ppolicy password critical expiration threshold (in seconds)\ndefine('LS_PPOLICY_CRITICAL_EXPIRATION_THRESHOLD', 2 * 86400);\n\n// CSV file delimiter\ndefine('LS_PPOLICY_CSV_DELIMITER',';');\n\n// CSV file enclosure\ndefine('LS_PPOLICY_CSV_ENCLOSURE','\"');\n\n// CSV file escape character (available since PHP 5.5.4)\ndefine('LS_PPOLICY_CSV_ESCAPE_CHAR','\\\\');\n\n// List of LSprofiles who are granted to use the exportPpolicyInfo API method\n$GLOBALS['LS_PPOLICY_API_GRANTED_PROFILES'] = array('admin');\n\n// List of extra attributes to include in Ppolicy info export\n$GLOBALS['LS_PPOLICY_INFO_EXPORT_EXTRA_ATTRS'] = array();\n</code></pre> <ul> <li> <p><code>LS_PPOLICY_DEFAULT_DN</code></p> <p>Constante d\u00e9finissant le DN de la politique par d\u00e9faut. Si aucune politique par d\u00e9faut n'est d\u00e9finie, ce param\u00e8tre doit valoir <code>null</code>.</p> </li> </ul> <ul> <li> <p><code>LS_PPOLICY_WARNING_EXPIRATION_THRESHOLD</code></p> <p>Constante d\u00e9finissant le seuil d'alerte pour l'expiration des mots de passe (en seconde). Par d\u00e9faut : 7 jours.</p> </li> </ul> <ul> <li> <p><code>LS_PPOLICY_CRITICAL_EXPIRATION_THRESHOLD</code></p> <p>Constante d\u00e9finissant le seuil critique pour l'expiration des mots de passe (en seconde). Par d\u00e9faut : 2 jours.</p> </li> </ul> <ul> <li> <p><code>LS_PPOLICY_CSV_DELIMITER</code></p> <p>Constante d\u00e9finissant le caract\u00e8re utilis\u00e9 lors de la g\u00e9n\u00e9ration de l'export CSV comme s\u00e9parateur de champ. Par d\u00e9faut : un point-virgule.</p> </li> </ul> <ul> <li> <p><code>LS_PPOLICY_CSV_ENCLOSURE</code></p> <p>Constante d\u00e9finissant le caract\u00e8re utilis\u00e9 lors de la g\u00e9n\u00e9ration de l'export CSV pour l'encadrement des champs. Par d\u00e9faut : un guillemet double.</p> </li> </ul> <ul> <li> <p><code>LS_PPOLICY_CSV_ESCAPE_CHAR</code></p> <p>Constante d\u00e9finissant le caract\u00e8re utilis\u00e9 lors de la g\u00e9n\u00e9ration de l'export CSV pour l'\u00e9chappement des champs. Par d\u00e9faut : une barre oblique inverse.</p> </li> </ul> <ul> <li> <p><code>$GLOBALS['LS_PPOLICY_API_GRANTED_PROFILES']</code></p> <p>Tableau global listant les LSprofiles autoris\u00e9s \u00e0 utiliser la m\u00e9thode d'API <code>exportPpolicyInfo</code>.</p> </li> </ul> <ul> <li> <p><code>$GLOBALS['LS_PPOLICY_INFO_EXPORT_EXTRA_ATTRS']</code></p> <p>Tableau global listant les attributs suppl\u00e9mentaires \u00e0 inclure lors de l'export des informations de politique de mots de passe.</p> </li> </ul>"},{"location":"conf/LSaddon/LSaddon_showSupportInfo/","title":"LSaddon_showSupportInfo","text":"<p>Cet LSaddon fourni une page affichant les informations utiles pour l'\u00e9quipe assurant le support de l'application. Cette page est accessible \u00e0 l'adresse <code>addon/showSupportInfo/showMySupportInfo</code>. Elle compile (et permet de t\u00e9l\u00e9charger) l'ensemble des informations utiles \u00e0 l'appr\u00e9ciation du contexte d'acc\u00e8s \u00e0 l'application par l'utilisateur.</p> <p>Cette page est accessible par tous les utilisateurs connect\u00e9s \u00e0 l'application. Cependant, par d\u00e9faut, il n'y a aucun lien d'acc\u00e8s \u00e0 celle-ci. Il est possible d'ajouter un lien d'acc\u00e8s dans le menu et modifiant la valeur de la constante <code>SHOW_SUPPORT_INFO_IN_MENU</code> \u00e0 <code>True</code>.</p> <p>Une fonction <code>showMySupportInfo()</code> est \u00e9galement fournie et peut-\u00eatre utilis\u00e9e comme customActions. Elle redirigera alors l'utilisateur vers cette page. Ci-dessous, vous trouverez un exemple de configuration de la fonction <code>showMySupportInfo()</code> comme customActions :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople'] = array (\n [...]\n 'customActions' => array (\n 'showMySupportInfo' => array (\n 'function' => 'showMySupportInfo',\n 'label' => 'Show my support information',\n 'hideLabel' => True,\n 'noConfirmation' => true,\n 'disableOnSuccessMsg' => true,\n 'icon' => 'terminal',\n 'rights' => array (\n 'self'\n ),\n ),\n ),\n [...]\n);\n</code></pre> <p>Note</p> <p>Le label et l'ic\u00f4ne fournis dans cet exemple sont traduits et d\u00e9livr\u00e9s avec LdapSaisie.</p>"},{"location":"conf/LSaddon/LSaddon_showTechInfo/","title":"LSaddon_showTechInfo","text":"<p>Cet LSaddon fournie une fonction du m\u00eame nom pouvant \u00eatre utilis\u00e9e comme customActions et permettant d'afficher les informations techniques d'un objet de l'annuaire.</p> <p>Ci-dessous, vous trouverez un exemple de configuration de la fonction <code>showTechInfo()</code> comme customActions :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople'] = array (\n [...]\n 'customActions' => array (\n 'showTechInfo' => array (\n 'function' => 'showTechInfo',\n 'label' => 'Show technical information',\n 'hideLabel' => True,\n 'noConfirmation' => true,\n 'disableOnSuccessMsg' => true,\n 'icon' => 'tech_info',\n 'rights' => array (\n 'admin'\n ),\n ),\n ),\n [...]\n);\n</code></pre> <p>Note</p> <p>Le label et l'ic\u00f4ne fournis dans cet exemple sont traduits et d\u00e9livr\u00e9s avec LdapSaisie.</p>"},{"location":"conf/LSauthMethod/","title":"Configuration des m\u00e9thodes d'authentification (LSauthMethod)","text":"<p>Cette partie d\u00e9crit la mani\u00e8re de configurer les m\u00e9thodes d'authentification d'LdapSaisie appel\u00e9e LSauthMethod). Ces librairies peuvent avoir un fichier de configuration et il sera alors stock\u00e9 dans le dossier <code>conf/LSauth/</code>.</p>"},{"location":"conf/LSauthMethod/LSauthMethod_CAS/","title":"LSauthMethod_CAS","text":"<p>Cette LSauthMethod est utilis\u00e9e pour g\u00e9rer l'authentification via un service SSO CAS. Cette librairie doit \u00eatre configur\u00e9e en \u00e9ditant le fichier de configuration <code>conf/LSauth/config.LSauthMethod_CAS.php</code>.</p> <p>Structure du fichier :</p> <pre><code>/*\n *****************************************************\n * Configuration of the CAS authentification support *\n *****************************************************\n */\n\n// phpCAS Path (http://www.ja-sig.org/wiki/display/CASC/phpCAS)\ndefine('PHP_CAS_PATH','/usr/share/php/CAS.php');\n\n// phpCAS Debug File\n// define('PHP_CAS_DEBUG_FILE','/tmp/phpCAS.log');\n\n// Disable logout\ndefine('LSAUTH_CAS_DISABLE_LOGOUT',false);\n\n// CAS Server version (used constant name know by phpCAS : CAS_VERSION_1_0 or CAS_VERSION_2_0)\ndefine('LSAUTH_CAS_VERSION','CAS_VERSION_2_0');\n\n// CAS Server hostname\ndefine('LSAUTH_CAS_SERVER_HOSTNAME','cas.univ.fr');\n\n// CAS Server port\ndefine('LSAUTH_CAS_SERVER_PORT',443);\n\n// CAS Server URI (empty by default)\n// define('LSAUTH_CAS_SERVER_URI','cas/');\n\n// No SSL validation for the CAS server\ndefine('LSAUTH_CAS_SERVER_NO_SSL_VALIDATION',false);\n\n// CAS server SSL CA Certificate path\n//define('LSAUTH_CAS_SERVER_SSL_CACERT','');\n</code></pre> <ul> <li> <p><code>PHP_CAS_PATH</code></p> <p>Le chemin d'acc\u00e8s du fichier <code>CAS.php</code> de la librairie phpCAS. Le chemin d'exemple correspond au chemin r\u00e9sultant d'une installation via PEAR sur une Debian (Lenny).</p> </li> </ul> <ul> <li> <p><code>PHP_CAS_DEBUG_FILE</code></p> <p>Chemin du fichier de log de la librairie phpCAS. Commenter la ligne pour d\u00e9sactiver les logs.</p> </li> </ul> <ul> <li> <p><code>LSAUTH_CAS_DISABLE_LOGOUT</code></p> <p>Bool\u00e9en d\u00e9finissant si l'utilisateur peut se d\u00e9connecter du serveur CAS depuis l'interface.</p> <p>Note</p> <p>Remarque : l'appel de l'URL de d\u00e9connexion via une requ\u00eate <code>GET</code> supprimera la session PHP et donc la session LdapSaisie sans d\u00e9connecter pour autant l'utilisateur au niveau du serveur CAS. Cela peut donc permettre de g\u00e9rer la d\u00e9connexion automatique au niveau d'LdapSaisie suite \u00e0 une d\u00e9connexion au niveau du CAS \u00e0 traver le concepte de <code>Global Logout</code>.</p> </li> </ul> <ul> <li> <p><code>LSAUTH_CAS_VERSION</code></p> <p>Nom de la constant phpCAS permettant de d\u00e9finir la version CAS du serveur. Actuellement, la librairie phpCAS ne reconnait que la constante <code>CAS_VERSION_1_0</code> pour la version 1 de CAS ou la constante <code>CAS_VERSION_2_0</code> pour la version 2 de CAS.</p> <p>Note</p> <p>Remarque : Des tests on montr\u00e9s que l'utilisation d'une compatibilit\u00e9 CAS version 2 peut \u00e9galement fonctionner sur un version 3 du serveur CAS.</p> </li> </ul> <ul> <li> <p><code>LSAUTH_CAS_SERVER_HOSTNAME</code></p> <p>Le nom d'h\u00f4te du serveur CAS.</p> </li> </ul> <ul> <li> <p><code>LSAUTH_CAS_SERVER_PORT</code></p> <p>Le port d'\u00e9coute du serveur CAS.</p> </li> </ul> <ul> <li> <p><code>LSAUTH_CAS_SERVER_URI</code></p> <p>Le dossier HTTP dans lequel se trouve le service CAS. Exemple : Pour un service CAS accessible via l'URL <code>https://cas.univ.fr/cas/</code>, la constante devra valoir <code>cas/</code>.</p> </li> </ul> <ul> <li> <p><code>LSAUTH_CAS_SERVER_NO_SSL_VALIDATION</code></p> <p>Bool\u00e9en permettant de d\u00e9sactiver la validation du certificat SSL du serveur CAS lors des requ\u00eates de validation des tickets CAS.</p> </li> </ul> <ul> <li> <p><code>LSAUTH_CAS_SERVER_SSL_CACERT</code></p> <p>Chemin d'acc\u00e8s du fichier contenant le certificat SSL de la CA du serveur CAS au format PEM. Commenter la ligne pour d\u00e9sactiver ce param\u00e8tre.</p> </li> </ul>"},{"location":"conf/LSauthMethod/LSauthMethod_HTTP/","title":"LSauthMethod_HTTP","text":"<p>Cette LSauthMethod est utilis\u00e9e pour g\u00e9rer l'authentification via les variables d'environnements d\u00e9finies suite \u00e0 une authentification, potentiellement d\u00e9l\u00e9gu\u00e9e au serveur web.</p> <p>Cette m\u00e9thode r\u00e9cup\u00e8re dans l'environment d'ex\u00e9cution PHP, le nom d'utilisateur et le mot de passe de l'utilisateur connect\u00e9. \u00c0 partir du nom d'utilisateur, une recherche dans l'annuaire sera effectu\u00e9e pour trouver l'utilisateur correspondant. L'authentification sera r\u00e9ussie uniquement si un et un seul utilisateur est retourn\u00e9 par la recherche et si une authentification aupr\u00e8s de l'annuaire LDAP r\u00e9ussie \u00e0 l'aide du DN de l'objet LDAP trouv\u00e9 et du mot de passe fourni.</p> <p>Note</p> <p>En cas d'authentification d\u00e9l\u00e9gu\u00e9e au serveur web, il est possible de d\u00e9sactiver la v\u00e9rification du mot de passe via le param\u00e8tre <code>LSAUTHMETHOD_HTTP_TRUST_WITHOUT_PASSWORD_CHALLENGE</code> (voir ci-dessous).</p> <p>Les variables d'environnements utilis\u00e9es pour authentifier l'utilisateur connect\u00e9 d\u00e9pendent de la m\u00e9thode configur\u00e9e via la constante <code>LSAUTHMETHOD_HTTP_METHOD</code> (voir ci-dessous). Si ces variables ne sont pas disponibles, une erreur HTTP 403 sera g\u00e9n\u00e9r\u00e9e pour r\u00e9clamer une authentification \u00e0 l'utilisateur.</p> <p>Note</p> <p>Cette LSauthMethod supporte le mode API et il s'agit de la m\u00e9thode utilis\u00e9e par d\u00e9faut dans ce mode.</p> <p>Cette librairie peut \u00eatre configur\u00e9e en \u00e9ditant le fichier de configuration <code>conf/LSauth/config.LSauthMethod_HTTP.php</code>.</p> <p>Structure du fichier :</p> <pre><code>/*\n *****************************************************\n * Configuration of the HTTP authentification support *\n *****************************************************\n */\n\n// Don't check HTTP server's login/password by LDAP authentication challenge\n//define('LSAUTHMETHOD_HTTP_TRUST_WITHOUT_PASSWORD_CHALLENGE',true);\n\n// Authentication realm (API mode only)\n//define('LSAUTHMETHOD_HTTP_API_REALM', ___('LdapSaisie API - Authentication required'));\n</code></pre> <ul> <li> <p><code>LSAUTHMETHOD_HTTP_TRUST_WITHOUT_PASSWORD_CHALLENGE</code></p> <p>Permet de d\u00e9sactiver le test d'authentification aupr\u00e8s de l'annuaire LDAP. Pour cela, cette constante doit \u00eatre d\u00e9finie et valoir <code>True</code>.</p> </li> </ul> <ul> <li> <p><code>LSAUTHMETHOD_HTTP_METHOD</code></p> <p>Permet de d\u00e9finir la m\u00e9thode utilis\u00e9e par le serveur web pour passer \u00e0 PHP l'identifiant de l'utilisateur connect\u00e9 et son mot de passe.</p> <p>Cette constance peut pendre les valeurs suivantes :</p> <ul> <li> <p><code>PHP_PASS</code></p> <p>Dans cette m\u00e9thode, le serveur web d\u00e9fini les variables d'environnement <code>PHP_AUTH_USER</code> et <code>PHP_AUTH_PW</code>. Cette m\u00e9thode est la m\u00e9thode par d\u00e9faut et convient en cas d'utilisation de <code>mod_php</code>.</p> </li> </ul> <ul> <li> <p><code>REMOTE_USER</code></p> <p>Dans cette m\u00e9thode, le serveur web d\u00e9fini la variable d'environnement <code>REMOTE_USER</code>. Cette variable ne contient que l'identifiant de l'utilisateur connect\u00e9. Cette m\u00e9thode ne peut donc \u00eatre utilis\u00e9e que conjointement avec l'activation du param\u00e8tre <code>LSAUTHMETHOD_HTTP_TRUST_WITHOUT_PASSWORD_CHALLENGE</code>.</p> </li> </ul> <ul> <li> <p><code>AUTHORIZATION</code></p> <p>Dans cette m\u00e9thode, le serveur web passe le contenu de l'ent\u00eate HTTP <code>Authorization</code> dans la variable d'environnement <code>HTTP_AUTHORIZATION</code>. Cette m\u00e9thode convient en cas d'utilisation de PHP en mode CGI ou encore via PHP-FPM.</p> <p>Pour utiliser cette m\u00e9thode, il faudra adapter la configuration du serveur web. Par exemple, pour Apache HTTPd, vous pouvez utiliser le module <code>rewrite</code> et la r\u00e8gle de r\u00e9\u00e9criture suivante :</p> <pre><code>RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]\n</code></pre> </li> </ul> </li> </ul> <ul> <li> <p><code>LSAUTHMETHOD_HTTP_LOGOUT_REMOTE_URL</code></p> <p>URL de d\u00e9connexion externe, utile par exemple dans le contexte d'une connexion via un service SSO. L'utilisateur sera automatiquement redirig\u00e9 vers cette URL apr\u00e8s sa d\u00e9connexion effective au niveau d'LdapSaisie.</p> <p>Note</p> <p>Si cette URL de d\u00e9connexion n'est pas d\u00e9fini, le bouton de d\u00e9connexion sera masqu\u00e9.</p> </li> </ul> <ul> <li> <p><code>LSAUTHMETHOD_HTTP_REALM</code></p> <p>Domaine d'authentification (<code>reaml</code>) utilis\u00e9 pour r\u00e9clamer l'authentification de l'utilisateur (facultatif).</p> <p>Note</p> <p>Pour que le message soit traduit, utilisez la fonction <code>___()</code> (voir exemple).</p> </li> </ul>"},{"location":"conf/LSauthMethod/LSauthMethod_anonymous/","title":"LSauthMethod_anonymous","text":"<p>Cette LSauthMethod est utilis\u00e9e pour g\u00e9rer l'authentification automatique des utilisateurs arrivant (\u00e9quivalent \u00e0 un mode anonyme). Cette librairie doit \u00eatre configur\u00e9e en \u00e9ditant le fichier de configuration <code>conf/LSauth/config.LSauthMethod_anonymous.php</code> et notament en d\u00e9finissant la constante <code>LSAUTHMETHOD_ANONYMOUS_USER</code> contenant le login d'un utilisateur dont les droits d'acc\u00e8s seront endoss\u00e9s par tout les personnes utilisant LdapSaisie.</p>"},{"location":"conf/LSobject/","title":"Configuration LSobject","text":"<p>Cette partie d\u00e9crit la mani\u00e8re de configurer les diff\u00e9rents types de LSobjets manipul\u00e9s par LdapSaisie.</p> <p>La configuration des LSobjects est stock\u00e9e dans le dossier <code>/conf/LSobjects</code>. Dans ce dossier, on retrouve un fichier par type d'LSobject, nomm\u00e9 de la mani\u00e8re suivante :</p> <pre><code>config.LSobjects.[nom du type d'LSobject].php\n</code></pre> <p>Ce fichier contient la d\u00e9claration de la configuration du type d'LSobject qui est stock\u00e9 dans la variable globale <code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']</code>.</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]'] = array (\n 'objectclass' => array(\n 'objetclass1',\n 'objetclass2',\n ...\n ),\n 'filter' => '[filtre LDAP]',\n\n 'rdn' => 'attr1',\n\n 'LSaddons' => [LSaddon(s)],\n\n 'container_dn' => 'ou=people',\n 'generate_container_dn' => '[callable]',\n 'container_auto_create' => array(\n // Information des configurations pour la cr\u00e9ation du conteneur du type d'LSobjet\n // lors de la cr\u00e9ation nouveau subDn\n ),\n\n 'disable_creation' => [boolean]',\n\n 'before_modify' => 'function1',\n 'after_modify' => 'function2',\n 'after_create' => 'function3',\n 'after_delete' => 'function4',\n\n 'label' => 'objet1',\n 'display_name_format' => '[format]',\n 'displayAttrName' => '[booleen]',\n\n //Custom Actions\n 'customActions' => array (\n // Configuration des customActions pour ce type d'objet\n ),\n\n // LSrelation\n 'LSrelation' => array(\n // Configuration des LSrelations entre ce type d'objet et les autres\n ),\n\n // LSform\n 'LSform' => array (\n // Configuration des formulaires de l'objet\n ), // fin LSform\n\n // LSsearch\n 'LSsearch' => array (\n // Configuration des recherches de l'objet\n ), // fin LSsearch\n\n 'globalSearch' => [booleen],\n 'globalSearch_extraDisplayedColumns' => [booleen],\n\n // ioFormat\n 'ioFormat' => array (\n // Configuration des formats d'import/export de l'objet\n ),\n\n // Attributs\n 'attrs' => array (\n // Configuration des attributs du type d'LSobjet\n )\n);\n...\n</code></pre> <ul> <li> <p><code>objectclass</code></p> <p>La liste des objectclass des objets.</p> </li> </ul> <ul> <li> <p><code>filter</code></p> <p>Filtre de recherche LDAP applicable \u00e0 tout les objets de ce type et qui sera utilis\u00e9 lors de chaque recherche de ce type d'objet.</p> </li> </ul> <ul> <li> <p><code>rdn</code></p> <p>Nom de l'attribut correspondant au RDN des objets LDAP.</p> </li> </ul> <ul> <li> <p><code>LSaddons</code></p> <p>LSaddon(s) dont le type d'objet d\u00e9pend. Ce peut \u00eatre un tableau de cha\u00eenes de caract\u00e8res ou une simpe cha\u00eene de caract\u00e8res correspondant au(x) nom(s) du/des LSaddon(s) en d\u00e9pendance.</p> </li> </ul> <ul> <li> <p><code>container_dn</code></p> <p>El\u00e9ment pour construire le basedn de stockage de ce type d'objet. Par exemple, si le basedn de l'annuaire est <code>o=ls</code> et que les objets utilisateurs sont stock\u00e9s dans la branche de l'annuaire <code>ou=people,o=ls</code>, alors <code>container_dn</code> devra valoir <code>ou=people</code>.</p> <p>Lorsque l'annuaire poss\u00e8de des subDn, les objets seront cherch\u00e9s dans le basedn r\u00e9sultant de la concat\u00e9nation du param\u00e8tre <code>container_dn</code>, d'une virgule et du basedn correspondant au subDn courant.</p> </li> </ul> <ul> <li> <p><code>generate_container_dn</code></p> <p>Callable (au sens PHP), utilis\u00e9 pour g\u00e9n\u00e9rer la valeur du param\u00e8tre <code>container_dn</code> dynamiquement. Ce callable prend en param\u00e8tre l'objet LSobject \u00e0 cr\u00e9er et retourne la valeur du param\u00e8tre <code>container_dn</code>.</p> </li> </ul> <ul> <li> <p><code>container_auto_create</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration n\u00e9cessaires \u00e0 la cr\u00e9ation des <code>container_dn</code> dans les nouveaux objets utilis\u00e9s comme subDn. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>disable_creation</code></p> <p>Bool\u00e9en permetant de desactiver la creation de ce type d'objet de mani\u00e8re globale.</p> </li> </ul> <ul> <li> <p><code>before_modify</code></p> <p>Cha\u00eene de caract\u00e8res (ou tableau de chaine de caract\u00e8res) correspondant au nom d'une ou plusieurs fonctions qui seront ex\u00e9cut\u00e9es avant la modification d'un objet. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>after_modify</code></p> <p>Cha\u00eene de caract\u00e8res (ou tableau de chaine de caract\u00e8res) correspondant au nom d'une ou plusieurs fonctions qui seront ex\u00e9cut\u00e9es apr\u00e8s la modification d'un objet. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>after_create</code></p> <p>Cha\u00eene de caract\u00e8res (ou tableau de chaine de caract\u00e8res) correspondant au nom d'une ou plusieurs fonctions qui seront ex\u00e9cut\u00e9es apr\u00e8s la cr\u00e9ation d'un objet. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>after_delete</code></p> <p>Cha\u00eene de caract\u00e8res (ou tableau de chaine de caract\u00e8res) correspondant au nom d'une ou plusieurs fonctions qui seront ex\u00e9cut\u00e9es apr\u00e8s la suppression d'un objet. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>label</code></p> <p>Nom g\u00e9n\u00e9rique au pluriel qualifiant le type d'objet. Exemple : Utilisateurs.</p> </li> </ul> <ul> <li> <p><code>display_name_format</code></p> <p>Format param\u00e8trable du nom des objets compos\u00e9s \u00e0 partir des valeurs d'affichage des attributs de l'objet.</p> </li> </ul> <ul> <li> <p><code>displayAttrName</code></p> <p>Bool\u00e9en d\u00e9finissant si le nom des attributs doit \u00eatre affich\u00e9 en pr\u00e9fixe de leur message d'aide (param\u00e8tre <code>help_info</code>).</p> </li> </ul> <ul> <li> <p><code>customActions</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration des customActions. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>LSrelation</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration des LSrelations. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>LSform</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration des LSforms des LSobjects. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>LSsearch</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration des recherches de LSobject de ce type dans l'annuaire. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>globalSearch</code></p> <p>Inclure ou non ce type d'objet dans le r\u00e9sultat des recherches globales (Par d\u00e9faut : <code>True</code>).</p> </li> </ul> <ul> <li> <p><code>globalSearch_extraDisplayedColumns</code></p> <p>Afficher ou non les colonnes suppl\u00e9mentaires pour ce type d'objet dans le r\u00e9sultat des recherches globales (Par d\u00e9faut : <code>True</code>). Pour plus de d\u00e9tails les colonnes suppl\u00e9mentaires, voir la section d\u00e9di\u00e9e.</p> </li> </ul> <ul> <li> <p><code>ioFormat</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration des formats de fichiers d'import/export de ce type d'LSobject. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>attrs</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration des attributs des objets. Voir la section concern\u00e9e.</p> </li> </ul>"},{"location":"conf/LSobject/LSform/","title":"Les formulaires (LSform)","text":"<p>Cette section d\u00e9crit la mani\u00e8re de param\u00e9trer les formulaires d'LdapSaisie pour un type LSobject donn\u00e9. Pour chaque type d'LSobject, il faut configurer plusieurs formulaires correspondant aux vues g\u00e9r\u00e9es par LdapSaisie (cr\u00e9ation, modification, ...). Les formulaires se configurent par plusieurs biais :</p> <ul> <li>Via la configuration des attributs : La configuration des attributs d\u00e9termine la pr\u00e9sence ou non des attributs dans les formulaires. Elle permet \u00e9galement de d\u00e9finir si on souhaite bloquer leur pr\u00e9sence en lecture seulement.</li> </ul> <ul> <li>Via les droits de l'utilisateur connect\u00e9 sur les attributs de l'objet \u00e0 \u00e9diter : en fonction des droits de l'utilisateur sur un attribut, celui-ci appara\u00eetra en lecture-\u00e9criture ou en lecture uniquement voir pas du tout.</li> </ul> <ul> <li> <p>Via la configuration au niveau de chaque type d'LSobject : il y est possible de d\u00e9finir le comportement globale du formulaire comme la validation via Ajax ou encore la disposition logique des attributs dans le formulaire.</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform'] = array (\n 'ajaxSubmit' => [bool\u00e9en],\n 'layout' => array (\n // Configuration de la disposition logique des attributs\n ),\n 'dataEntryForm' => array (\n // Configuration des masques de saisie\n )\n\n);\n</code></pre> <ul> <li> <p><code>ajaxSubmit</code></p> <p>Bool\u00e9en d\u00e9finissant si le formulaire sera envoy\u00e9 via une requ\u00eate Ajax plut\u00f4t qu'\u00e0 travers un rafra\u00eechissement de la page. Par d\u00e9faut : <code>True</code>.</p> </li> </ul> <ul> <li> <p><code>layout</code></p> <p>Tableau contenant la configuration de l'affichage du formulaire : il est possible de d\u00e9finir la disposition des attributs dans le formulaire en les regroupant dans des onglets et en les faisant appara\u00eetre dans un ordre logique. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>dataEntryForm</code></p> <p>Tableau contenant la configuration des masques de saisie : il est possible de d\u00e9finir des masques de saisie pour faire en sorte que lors de la cr\u00e9ation d'un objet, seul un certain nombre d'\u00e9lements soit demand\u00e9 \u00e0 l'utilisateur. Voir la section concern\u00e9e.</p> </li> </ul> </li> </ul>"},{"location":"conf/LSobject/LSform/#configuration-de-laffichage","title":"Configuration de l'affichage","text":"<p>La configuration des layout se situe dans la configuration des LSobjects, dans la variable <code>layout</code> (<code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform']['layout']</code>). Cette variable est un tableau associatif dont la cl\u00e9 est l'identifiant de l'onglet et dont la valeur associ\u00e9e est la configuration de l'onglet.</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform']['layout'] = array (\n 'onglet1' => array(\n 'label' => '[label de l'onglet]',\n 'img' => 1, // Valeur possible 1 ou 0\n 'args' => array (\n 'arg1',\n 'arg2',\n ...\n )\n ),\n ...\n);\n</code></pre> <ul> <li> <p><code>label</code></p> <p>Le label de l'onglet.</p> </li> </ul> <ul> <li> <p><code>img</code></p> <p>Affiche ou non l'image d'un \u00e9ventuel attribut de type HTML LSattr_html_image.</p> </li> </ul> <ul> <li> <p><code>args</code></p> <p>Tableau associatif contenant une liste ordonn\u00e9e des attributs qui appara\u00eetront dans l'onglet.</p> </li> </ul> <p>Important</p> <p>Lorsqu'un layout est d\u00e9fini, celui-ci est \"suivi \u00e0 la lettre\" pour l'affichage du LSform. Ainsi, si un attribut est d\u00e9fini dans la configuration de l'objet comme pr\u00e9sent dans le LSform courant, mais que celui-ci n'est pas pr\u00e9sent dans le layout, il ne sera pas du tout affich\u00e9.</p>"},{"location":"conf/LSobject/LSform/#configuration-des-masques-de-saisie","title":"Configuration des masques de saisie","text":"<p>La configuration des masques de saisie (dataEntryForm) se situe dans la configuration des LSobjects, dans la variable <code>dataEntryForm</code> (<code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform']['dataEntryForm']</code>). Cette variable est un tableau associatif dont la cl\u00e9 est l'identifiant du masque de saisie et dont la valeur associ\u00e9e est sa configuration.</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform']['dataEntryForm'] = array (\n 'masque1' => array(\n 'label' => '[label du masque de saisie]',\n 'disabledLayout' => [booleen],\n 'displayedElements' => array (\n 'attr1',\n 'attr2',\n ...\n ),\n 'defaultValues' => array (\n 'attr3' => [value],\n 'attr4' => [value],\n ...\n ),\n 'requiredAllAttributes' => [booleen],\n 'requiredAttributes' => array (\n 'attr1',\n 'attr2',\n ...\n ),\n 'forceGeneration' => array (\n 'attr1',\n 'attr2',\n ...\n ),\n ),\n ...\n);\n</code></pre> <ul> <li> <p><code>label</code></p> <p>Le label du masque de saisie.</p> </li> </ul> <ul> <li> <p><code>disabledLayout</code></p> <p>Active ou non les layouts pour ce masque de saisie.</p> </li> </ul> <ul> <li> <p><code>displayedElements</code></p> <p>Tableau contenant la liste des attributs qui devront \u00eatre saisie dans le masque de saisie.</p> </li> </ul> <ul> <li> <p><code>defaultValues</code></p> <p>Tableau associatif contenant la liste des valeurs par d\u00e9faut des attributs. Les valeurs multiples sont possibles en utilisant des tableaux.</p> <p>Important</p> <p>Les valeurs seront vue comme des valeurs retourn\u00e9es par le formulaire et non comme des valeurs des attribus LDAP eux-m\u00eame. Ainsi et par exemple, un attribut trait\u00e9 comme un bool\u00e9en dans un formulaire pourra prendre comme valeur par d\u00e9faut <code>yes</code> ou <code>no</code>.</p> </li> </ul> <ul> <li> <p><code>requiredAttributes</code></p> <p>Tableau contenant la liste des attributs obligatoires du masque de saisie. Cette liste d'attributs obligatoires viendra en compl\u00e9ment de la configuration des attributs. Il est ainsi possible de rendre des attributs obligatoires durant la saisie d'un masque tout en les laissant facultatif le reste du temps.</p> </li> </ul> <ul> <li> <p><code>requiredAllAttributes</code></p> <p>Si ce parametre vaut <code>True</code>, tout les attributs du masque de saisie seront tous obligatoires de la m\u00eame mani\u00e8re qu'avec le param\u00e8tre <code>requiredAttributes</code>.</p> </li> </ul> <ul> <li> <p><code>forceGeneration</code></p> <p>Tableau contenant la liste des attributs dont la g\u00e9n\u00e9ration sera forc\u00e9e lors de la validation du formation.</p> </li> </ul>"},{"location":"conf/LSobject/LSrelation/","title":"Les relations entre les objets de l'annuire (LSrelation)","text":"<p>Cette section d\u00e9crit la mani\u00e8re de configurer les relations entre les LSobjects appel\u00e9es LSrelation.</p> <p>Dans le cadre d'une liaison d\u00eete simple, c'est \u00e0 dire une liaison au travers la valeur d'un attribut qui fera directement r\u00e9f\u00e9rence \u00e0 un autre objet (DN ou la premi\u00e8re valeur d'un attribut de r\u00e9f\u00e9rence), pourra \u00eatre configur\u00e9e simplement en sp\u00e9cifiant l'attribut de liaison et le type de valeur qu'il contient. Dans le cas d'une liaison plus complexe, il sera possible de d\u00e9velopper vous m\u00eame des m\u00e9thodes de mise en relation.</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSrelation'] = array (\n 'relation1' => array(\n 'label' => '[label de la relation]',\n 'emptyText' => \"[texte affich\u00e9 si aucune relation avec d'autres objets\n n'existe pour l'objet courant]\",\n 'LSobject' => '[le type d'LSobjet en relation]',\n 'display_name_format' => '[LSformat du nom d'affichage des LSobjet en relation]',\n 'canEdit_attribute' => '[nom d'attribut]',\n\n // Liaison simple\n 'linkAttribute' => '[attribut de liaison]',\n 'linkAttributeValue' => '[valeur de l'attribut de liaison]',\n 'linkAttributeOtherValues' => array('[autres valeurs possible de l'attribut de liaison]', [...]),\n\n // Liaison complexe\n 'list_function' => '[m\u00e9thode1]',\n 'getkeyvalue_function' => '[methode2]',\n 'update_function' => '[methode3]',\n 'remove_function' => '[methode4]',\n 'rename_function' => '[methode5]',\n 'canEdit_function' => '[methode6]',\n\n 'rights' => array(\n 'LSprofile1' => 'r',\n 'LSprofile2' => 'w',\n ...\n )\n )\n);\n</code></pre> <ul> <li> <p><code>label</code></p> <p>Le label de la relation.</p> </li> </ul> <ul> <li> <p><code>emptyText</code></p> <p>Le texte \u00e0 afficher pour d\u00e9crire le fait que l'objet courant n'a aucune relation d'\u00e9tablie avec d'autres LSobjects. Exemple (au sujet d'un utilisateur) : N'appartient \u00e0 aucun groupe.</p> </li> </ul> <ul> <li> <p><code>LSobject</code></p> <p>Le type d'LSobject en relation avec le type courant. (Facultatif en cas de liaison complexe)</p> </li> </ul> <ul> <li> <p><code>display_name_format</code></p> <p>LSformat du nom d'affichage des objets en relation.</p> </li> </ul> <ul> <li> <p><code>canEdit_attribute</code></p> <p>Le nom de l'attibut du type d'LSobject en relation devant \u00eatre \u00e9ditable par l'utilisateur pour que celui-ci puisse modifier la relation. Dans le cadre d'une relation simple, celui-ci peut, si n\u00e9cessaire, \u00eatre diff\u00e9rent du param\u00e8tre <code>linkAttribute</code>.</p> </li> </ul> <ul> <li> <p><code>linkAttribute</code></p> <p>Dans le cadre d'une relation simple, il s'agit de l'attribut de liaison du type d'LSobject en relation avec le type courant, c'est \u00e0 dire l'attribut dans lequel on retrouve une valeur en relation avec l'objet courant. (Facultatif en cas de liaison complexe)</p> </li> </ul> <ul> <li> <p><code>linkAttributeValue</code></p> <p>Dans le cadre d'une relation simple, il s'agit du type de valeur prisent par l'attribut de liaison du type d'LSobject en relation avec le type courant. Il peut s'agir du mot cl\u00e9 <code>dn</code> si l'attribut de liaison contient le DN de l'objet courant ou bien le nom d'un attribut du type d'objet courant dont la premi\u00e8re valeur sera stock\u00e9e par l'attribut de liaison. (Facultatif en cas de liaison complexe)</p> </li> </ul> <ul> <li> <p><code>linkAttributeOtherValues</code></p> <p>Dans le cadre d'une relation simple, il s'agit d'autres types de valeur possiblement prisent par l'attribut en plus de celui d\u00e9fini par le param\u00e8tre <code>linkAttributeValue</code>. Ce param\u00e8tre ne sert qu'a d\u00e9tecter des liaisons \u00e9tablies \u00e0 l'aide de valeurs autres que celle relative au param\u00e8tre <code>linkAttributeValue</code> : en cas de nouvelle liaison, c'est la valeur associ\u00e9e \u00e0 ce dernier qui sera utilis\u00e9e pour \u00e9tablir la liaison. (Facultatif en cas de liaison complexe)</p> </li> </ul> <ul> <li> <p><code>list_function</code></p> <p>La m\u00e9thode de la classe du type d'LSobject en relation, permettant de lister les objets de ce type en relation avec l'objet courant. (Facultatif en cas de liaison simple)</p> </li> </ul> <ul> <li> <p><code>getkeyvalue_function</code></p> <p>La m\u00e9thode de la classe du type d'LSobject en relation, permettant d'obtenir la valeur cl\u00e9 \u00e0 stocker pour \u00e9tablir la relation entre l'objet courant et d'autres objets du type concern\u00e9. (Facultatif en cas de liaison simple)</p> </li> </ul> <ul> <li> <p><code>update_function</code></p> <p>La m\u00e9thode de la classe du type d'LSobject en relation, permettant de mettre \u00e0 jour les relations existantes entre l'objet courant et les objets du type concern\u00e9. Cette liste d'objets en relation est \u00e9tablie par l'utilisateur \u00e0 travers l'interface. (Facultatif en cas de liaison simple)</p> </li> </ul> <ul> <li> <p><code>remove_function</code></p> <p>La m\u00e9thode de la classe du type d'LSobject en relation permettant de supprimer une relation existante entre l'objet courant et un objet du type concern\u00e9. (Facultatif en cas de liaison simple)</p> </li> </ul> <ul> <li> <p><code>rename_function</code></p> <p>La m\u00e9thode de la classe du type d'LSobject en relation permettant d'effectuer les actions n\u00e9cessaires lorsque l'objet courant est renomm\u00e9 dans le but de maintenir les valeurs cl\u00e9s permettant d'\u00e9tablir les relations entre l'objet courant et les objets en relation avec lui. (Facultatif en cas de liaison simple)</p> </li> </ul> <ul> <li> <p><code>canEdit_function</code></p> <p>La m\u00e9thode de la classe du type d'LSobject en relation permettant de v\u00e9rifier que l'utilisateur \u00e0 le droit de modifier la relation avec un objet en particulier. (Facultatif en cas de liaison simple)</p> </li> </ul> <ul> <li> <p><code>rights</code></p> <p>Tableau associatif dont les cl\u00e9s sont les noms des LSprofiles ayant des droits sur cette relation et dont les valeurs associ\u00e9es sont les droits correspondants. La valeur des droits d'un LSprofile peut \u00eatre <code>r</code> pour le droit de lecture ou <code>w</code> pour le droit de lecture-\u00e9criture.Par d\u00e9faut, un LSprofile n'a aucun droit.</p> </li> </ul>"},{"location":"conf/LSobject/LSsearch/","title":"Recherche des objets dans l'annuaire (LSsearch)","text":"<p>Cette section d\u00e9crit la mani\u00e8re de param\u00e9trer les recherches dans l'annuaire pour un type d'LSobject donn\u00e9.</p> <p>La configuration des LSsearch se situe dans la configuration des LSobjects, dans la variable <code>LSsearch</code> (<code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSsearch']</code>).</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSsearch'] = array (\n 'attrs' => array(\n 'attr1',\n 'attr2',\n ...\n 'attr3' => array(\n 'searchLSformat' => '[LSformat]',\n 'approxLSformat' => '[LSformat]',\n ),\n ...\n ),\n 'params' => array(\n // Param\u00e8tres de la recherche\n 'pattern' => '[string]',\n 'sizelimit' => [integer],\n 'recursive' => [boolean],\n 'approx' => [boolean],\n 'withoutCache' => [boolean],\n 'onlyAccessible' => [boolean],\n // Param\u00e8tres de tri\n 'sortBy' => [displayName|subDn],\n 'sortDirection' => [ASC|DESC],\n 'sortlimit' => [integer],\n // Param\u00e8tre d'affichage\n 'displayFormat' => [LSformat],\n 'nbObjectsByPage' => [integer],\n 'nbObjectsByPageChoices' => array([integer], [integer], ...),\n 'validPatternRegex' => '[regex]'\n ),\n 'predefinedFilters' => array(\n 'filter1' => 'label filter1',\n 'filter2' => 'label filter2'\n ),\n 'extraDisplayedColumns' => array(\n 'col1' => array(\n 'label' => 'label column 1',\n 'LSformat' => '[LSformat]'\n ),\n 'col2' => array(\n 'label' => 'label column 2',\n 'generateFunction' => '[fonction de g\u00e9n\u00e9ration]',\n 'additionalAttrs' => array('[attr1]', '[attr2]', ...),\n 'escape' => [bool\u00e9en],\n ),\n 'col3' => array(\n 'label' => 'label column 3',\n 'LSformat' => '[LSformat]',\n 'alternativeLSformats' => array (\n '[LSformat 1]',\n '[LSformat 2]'\n ),\n 'formaterLSformat' => '[LSformat]',\n 'formaterFunction' => '[fonction de formatage]',\n 'cssStyle' => '[CSS style]',\n 'visibleTo' => array (\n '[LSprofile 1]',\n '[LSprofile 2]'\n )\n ),\n ),\n 'customActions' => array (\n // Configuration des customActions pour les recherches de ce type d'objet\n )\n);\n</code></pre> <ul> <li> <p><code>attrs</code></p> <p>Tableau listant les attributs pouvant \u00eatre utilis\u00e9s dans les filtres de recherche LDAP employ\u00e9s par LdapSaisie. Lorsqu'un motif de recherche est pass\u00e9 par l'utilisateur, LdapSaisie composera un filtre LDAP \u00e0 partir de cette liste.</p> <p>Lors d'une recherche non-approximative, le filtre de recherche sera compos\u00e9 (par d\u00e9faut) de la mani\u00e8re suivante :</p> <pre><code>(|(attr1=*motif*)(attr2=*motif*)...)\n</code></pre> <p>Lors d'une recherche approximative, le filtre de recherche sera compos\u00e9 (par d\u00e9faut) de la mani\u00e8re suivante :</p> <pre><code>(|(attr1=~motif)(attr2~=motif)...)\n</code></pre> <p>Il est \u00e9galement possible de param\u00e9trer la mani\u00e8re dont sera compos\u00e9 le filtre de recherche attribut par attribut \u00e0 l'aide des param\u00e8tres <code>searchLSformat</code> et <code>approxLSformat</code>.</p> <p>Important</p> <p>Ces filtres, une fois compos\u00e9s, sont ins\u00e9r\u00e9s dans un autre, filtrant en plus sur les ObjectClass du type d'LSobject de la mani\u00e8re suivante :</p> <pre><code>(& (&(objectclass=oc1)(objectclass=oc2)) (filtre) )\n</code></pre> <ul> <li> <p><code>searchLSformat</code></p> <p>Ce param\u00e8tre est un LSformat permettant de d\u00e9finir, attribut par attribut, comment le filtre de recherche LDAP est compos\u00e9 \u00e0 partir d'un motif de recherche et en cas de recherche non-approximative.</p> <p>Ce LSformat est compos\u00e9 \u00e0 l'aide des \u00e9l\u00e9ments <code>name</code>, le nom de l'attribut et <code>pattern</code>, le motif de recherche.</p> <pre><code>(%{name}=%{pattern})\n</code></pre> <p>Important</p> <p>Le filtre d\u00e9duit doit obligatoirement commencer par <code>(</code> et se terminer par <code>)</code>.</p> </li> </ul> <ul> <li> <p><code>approxLSformat</code></p> <p>Ce param\u00e8tre est un LSformat permettant de d\u00e9finir, attribut par attribut, comment le filtre de recherche LDAP est compos\u00e9 \u00e0 partir d'un motif de recherche et en cas de recherche approximative.</p> <p>Ce LSformat est compos\u00e9 \u00e0 l'aide des \u00e9l\u00e9ments <code>name</code>, le nom de l'attribut et <code>pattern</code>, le motif de recherche.</p> <pre><code>(%{name}=~%{pattern})\n</code></pre> <p>Important</p> <p>Le filtre d\u00e9duit doit obligatoirement commencer par <code>(</code> et se terminer par <code>)</code>.</p> </li> </ul> </li> </ul> <ul> <li> <p><code>params</code></p> <p>Tableau des param\u00e8tres par d\u00e9faut d'une recherche. Ce tableau contient les param\u00e8tres qui seront utilis\u00e9s pour initialis\u00e9 une recherche. Ces param\u00e8tres pourront \u00eatre red\u00e9fini par l'utilisateur ou par l'application en fonction du contexte dans lequel cette recherche est effectu\u00e9e.</p> <ul> <li> <p><code>pattern</code></p> <p>Mot cl\u00e9 de la recherche.</p> </li> </ul> <ul> <li> <p><code>sizelimit</code></p> <p>Entier determinant le nombre maximum d'objet pouvant \u00eatre retourn\u00e9s dans une recherche.</p> </li> </ul> <ul> <li> <p><code>recursive</code></p> <p>Bool\u00e9en d\u00e9terminant si la recherche r\u00e9cursive est activ\u00e9e.</p> </li> </ul> <ul> <li> <p><code>approx</code></p> <p>Bool\u00e9en d\u00e9terminant si la recherche approximative est activ\u00e9e.</p> </li> </ul> <ul> <li> <p><code>withoutCache</code></p> <p>Bool\u00e9en d\u00e9terminant si le cache de recherche doit \u00eatre utilis\u00e9.</p> </li> </ul> <ul> <li> <p><code>onlyAccessible</code></p> <p>Bool\u00e9en d\u00e9terminant si seul les objets accessibles \u00e0 l'utilisateur connect\u00e9 doivent \u00eatre retourn\u00e9s par la recherche.</p> </li> </ul> <ul> <li> <p><code>sortBy</code></p> <p>Mot cl\u00e9 d\u00e9terminant sur quel valeur/colonne le r\u00e9sultat de recherche sera tri\u00e9.</p> <p>Valeurs possibles : <code>displayName</code>, <code>subDn</code> ou <code>NULL</code>.</p> </li> </ul> <ul> <li> <p><code>sortDirection</code></p> <p>Mot cl\u00e9 d\u00e9terminant le sens du trie du r\u00e9sultat de la recherche.</p> <p>Valeurs possibles : <code>ASC</code>, <code>DESC</code> ou <code>NULL</code>.</p> </li> </ul> <ul> <li> <p><code>sortlimit</code></p> <p>Entier determinant le nombre maximum d'objet pouvant \u00eatre tri\u00e9s dans le r\u00e9sultat d'une recherche.</p> </li> </ul> <ul> <li> <p><code>displayFormat</code></p> <p>LSformat d'affichage du nom de l'objet dans le r\u00e9sultat de la recherche.</p> </li> </ul> <ul> <li> <p><code>nbObjectsByPage</code></p> <p>Entier d\u00e9terminant le nombre d'objet maximum affich\u00e9s dans une page de r\u00e9sultat de la recherche.</p> </li> </ul> <ul> <li> <p><code>nbObjectsByPageChoices</code></p> <p>Tableau des choix propos\u00e9s \u00e0 l'utilisateur pour le nombre d'objets maximum affich\u00e9s dans une page de r\u00e9sultat de la recherche.</p> </li> </ul> <ul> <li> <p><code>validPatternRegex</code></p> <p>Expression r\u00e9guli\u00e8re de validation des mots cl\u00e9s de recherche pour ce type d'LSobject.</p> <p>(Par d\u00e9faut : <code>/^[\\w\\-_\\\\\\'\\\"^[]\\(\\){}\\=\\+\\\u00a3\\%\\$\\\u20ac\\.\\:\\;\\,\\?\\/\\@]+$/iu</code>)</p> </li> </ul> </li> </ul> <ul> <li> <p><code>predefinedFilters</code></p> <p>Tableau associatif contenant des filtres pr\u00e9d\u00e9finis pour la recherche. Les cl\u00e9s sont les filtres au format LDAP et les valeurs sont les labels associ\u00e9s.</p> </li> </ul> <ul> <li> <p><code>extraDisplayedColumns</code></p> <p>Tableau associatif contenant des colonnes suppl\u00e9mentaires \u00e0 afficher dans les r\u00e9sultats de recherche. Les cl\u00e9s sont les identifiants des colonnes suppl\u00e9mentaires et les valeurs sont leur configuration d\u00e9finie \u00e0 partir des param\u00e8tres suivant :</p> <ul> <li> <p><code>label</code></p> <p>Le label de la colonne.</p> </li> </ul> <ul> <li> <p><code>LSformat</code></p> <p>Le LSformat d'affichage de la colonne. Ce format est compos\u00e9 \u00e0 partir des attributs des objets LDAP dans leur format brut.</p> </li> </ul> <ul> <li> <p><code>alternativeLSformats</code></p> <p>Tableau des LSformats alternatifs \u00e0 utiliser si le r\u00e9sultat du format principal est vide. Les formats d\u00e9finis dans cette liste sont essay\u00e9s les uns apr\u00e8s les autres et le premier LSformat retournant une valeur non-vide est utilis\u00e9.</p> </li> </ul> <ul> <li> <p><code>formaterLSformat</code></p> <p>LSformat optionnel permettant de mettre en forme le r\u00e9sultat obtenu des LSformats pr\u00e9c\u00e9dents. Ce LSformat ne sera utilis\u00e9 que si le r\u00e9sultat obtenu pr\u00e9c\u00e9dement n'est pas vide. Il est ainsi possible d'utiliser les param\u00e8tres <code>LSformat</code> et <code>alternativeLSformats</code> afin de r\u00e9cup\u00e9rer la valeur \u00e0 afficher, puis de la mettre en forme gr\u00e2ce \u00e0 ce LSformat. Ce format est compos\u00e9 \u00e0 partir des attributs des objets LDAP dans leur format brut et de la valeur retourn\u00e9s pr\u00e9cedement accessible via la variable <code>val</code>.</p> </li> </ul> <ul> <li> <p><code>formaterFunction</code></p> <p>Le nom d'une fonction optionnelle \u00e0 ex\u00e9cuter pour mettre en forme le r\u00e9sultat obtenu des LSformats pr\u00e9c\u00e9dents. Cette fonction ne sera appel\u00e9e que si le r\u00e9sultat obtenu pr\u00e9c\u00e9dement n'est pas vide. La fonction prendra en param\u00e8tre la valeur \u00e0 mettre en forme et retournera la valeur mise en forme.</p> </li> </ul> <ul> <li> <p><code>generateFunction</code></p> <p>Le nom d'une fonction qui sera utilis\u00e9e pour g\u00e9n\u00e9rer la valeur d'affichage de cette colonne. La fonction prendra en param\u00e8tre une r\u00e9f\u00e9rence de l'objet <code>LSsearchEntry</code> et retournera la valeur de la colonne.</p> </li> </ul> <ul> <li> <p><code>additionalAttrs</code></p> <p>Un tableau de nom d'attributs \u00e0 inclure dans le resultat de la recherche LDAP. Ce tableau permet notamment d'inclure les attributs n\u00e9cessaires au bon fonctionnement de la fonction <code>generateFunction</code>.</p> </li> </ul> <ul> <li> <p><code>escape</code></p> <p>Ce param\u00e8tre bool\u00e9en permet de d\u00e9finir si, lors de l'affichage, le contenu de la colonne doit \u00eatre transform\u00e9 pour prot\u00e9ger les caract\u00e8res \u00e9ligibles en entit\u00e9s HTML. Par d\u00e9faut, ce param\u00e8tre est <code>True</code>.</p> <p>Warning</p> <p>Cette fonctionnalit\u00e9 existe pour des raisons de s\u00e9curit\u00e9 et notamment en protection des failles <code>XSS</code>. Si vous d\u00e9sactivez cette fonctionnalit\u00e9, il est important de g\u00e9rer la probl\u00e9matique de s\u00e9curit\u00e9 par ailleurs.</p> </li> </ul> <ul> <li> <p><code>cssStyle</code></p> <p>Ce param\u00e8tre permet de d\u00e9finir un style CSS personnalis\u00e9 pour la colonne. S'il est d\u00e9fini, le contenu de ce param\u00e8tre sera ajout\u00e9 en tant qu'attribut <code>style</code> des balises <code>th</code> et <code>td</code> de la colone.</p> </li> </ul> <ul> <li> <p><code>visibleTo</code></p> <p>Ce param\u00e8tre permet de restreindre la visibilit\u00e9 de cette colonne aux seuls LSprofiles sp\u00e9cifi\u00e9s. S'il est omis, la colonne sera visible pour tous.</p> </li> </ul> </li> </ul> <ul> <li> <p><code>customActions</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration des customActions. Voir la section concern\u00e9e.</p> </li> </ul>"},{"location":"conf/LSobject/LSsearch/#les-actions-personnalisees-customactions","title":"Les actions personnalis\u00e9es (customActions)","text":"<p>Cette section d\u00e9crit la mani\u00e8re de configurer les actions personnalis\u00e9es ex\u00e9cutables sur les recherches d'LSobjects appel\u00e9es customActions.</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSsearch']['customActions'] = array (\n 'action1' => array(\n 'label' => '[label l'action]',\n 'hideLabel' => '[bool\u00e9en]',\n 'icon' => '[nom de l'ic\u00f4ne de l'action]',\n 'function' => '[fonction \u00e0 ex\u00e9cuter]',\n 'question_format' => '[LSformat de la question de confirmation]',\n 'onSuccessMsgFormat' => '[LSformat du message \u00e0 afficher en cas de succ\u00e8s de l'action]',\n 'disableOnSuccessMsg' => '[bool\u00e9en]',\n 'noConfirmation' => '[bool\u00e9en]',\n 'redirectToObjectList' => '[bool\u00e9en]',\n 'rights' => array(\n 'LSprofile1',\n 'LSprofile2',\n ...\n )\n )\n);\n</code></pre> <ul> <li> <p><code>label</code></p> <p>Le label de l'action.</p> </li> </ul> <ul> <li> <p><code>hideLabel</code></p> <p>Cache le label dans le bouton de l'action.</p> </li> </ul> <ul> <li> <p><code>icon</code></p> <p>Nom de l'\u00eecone \u00e0 afficher dans le bouton de l'action. Ce nom correspond au nom du fichier de l'image (sans l'extention) qui devra se trouver dans le dossier <code>/src/images/[nom du theme d'images]/</code> ou dans le dossier <code>src/local/images</code>.</p> </li> </ul> <ul> <li> <p><code>function</code></p> <p>Le nom de la fonction \u00e0 ex\u00e9cuter qui impl\u00e9mente l'action personnalis\u00e9e Cette fonction prendra en seule param\u00e8tre l'objet LSsearch. sur lequel l'action devra \u00eatre ex\u00e9cut\u00e9e et retournera <code>True</code> en cas de succ\u00e8s ou <code>False</code> en cas d'\u00e9chec d'ex\u00e9cution de la fonction.</p> </li> </ul> <ul> <li> <p><code>question_format</code></p> <p>Le LSformat de la question de confirmation d'ex\u00e9cution de l'action. Ce LSformat sera compos\u00e9 \u00e0 l'aide du label de l'action.</p> </li> </ul> <ul> <li> <p><code>onSuccessMsgFormat</code></p> <p>Le LSformat du message \u00e0 afficher en cas de succ\u00e8s d'ex\u00e9cution de l'action. Ce LSformat sera compos\u00e9 \u00e0 l'aide du label de l'action.</p> </li> </ul> <ul> <li> <p><code>disableOnSuccessMsg</code></p> <p>Bool\u00e9en permetant de d\u00e9sactiver le message afficher en cas de succ\u00e8s d'ex\u00e9cution de l'action.</p> </li> </ul> <ul> <li> <p><code>noConfirmation</code></p> <p>Bool\u00e9en permetant de d\u00e9sactiver la confirmation de l'ex\u00e9cution de l'action.</p> </li> </ul> <ul> <li> <p><code>redirectToObjectList</code></p> <p>Bool\u00e9en permetant de rediriger ou non l'utilisateur vers la liste des objets (Vrai par d\u00e9faut). Si l'utilisateur n'est redirig\u00e9, le template par d\u00e9faut (ou celui d\u00e9fini durant l'\u00e9x\u00e9cution de la fonction) sera affich\u00e9.</p> </li> </ul> <ul> <li> <p><code>rights</code></p> <p>Tableau contenant la liste des noms des LSprofiles ayant le droit d'ex\u00e9cuter cette action.</p> </li> </ul>"},{"location":"conf/LSobject/LSsearch/#ecriture-dune-fonction-implementant-une-customaction","title":"\u00c9criture d'une fonction impl\u00e9mentant une customAction","text":"<p>Une fonction impl\u00e9mentant une customAction se d\u00e9clare de la mani\u00e8re suivante :</p> <pre><code>/*\n * Ma fonction impl\u00e9mentant ma customAction\n *\n * Param\u00e8tre :\n * - $search : L'objet LSsearch de la recherche sur lequel mon action doit \u00eatre ex\u00e9cut\u00e9e\n *\n * Valeurs retourn\u00e9es :\n * - True : Tout s'est bien pass\u00e9\n * - False : Une erreur est survenue\n */\nfunction maFonction ($search) {\n\n // Actions\n\n}\n</code></pre> <p>Cette fonction doit prendre pour seul param\u00e8tre, l'objet LSsearch. sur lequel l'action personnalis\u00e9e doit \u00eatre ex\u00e9cut\u00e9e et doit retourner soit <code>True</code> si tout s'est bien pass\u00e9, soit <code>False</code> en cas de probl\u00e8me.</p> <p>Important</p> <p>La recherche pass\u00e9e en param\u00e8tre n'a pas encore \u00e9t\u00e9 ex\u00e9cut\u00e9e. En cons\u00e9quence, si vous avez besoin d'acc\u00e9der au r\u00e9sultat de la recherche, il est n\u00e9cessaire d'ex\u00e9cuter au pr\u00e9alable : <code>$search -> run();</code>. Cela permet en outre, de modifier les param\u00e8tres de la recherche avant de l'ex\u00e9cuter. Cela peut par exemple \u00eatre utile, si vous avez besoin d'acc\u00e8der aux valeurs d'attributs particuliers, d'ajouter des attributs au r\u00e9sultat de la recherche :</p> <pre><code>$search -> setParam('attributes',array('attr1','attr2'));\n</code></pre> <p>Note</p> <p>Ces fonctions sont le plus couramment d\u00e9finies au sein d'LSaddon.</p>"},{"location":"conf/LSobject/container_auto_create/","title":"Cr\u00e9ation automatique du conteneur des LSobjets dans un subDn","text":"<p>Cette section d\u00e9crit la mani\u00e8re de configurer la cr\u00e9ation automatique des conteneurs des LSobjets. Si le basedn correspondant \u00e0 la branche de stockage des LSobjects n'existe pas, LdapSaisie tentera de le cr\u00e9er \u00e0 partir de la configuration de la variable <code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['container_auto_create']</code>.</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['container_auto_create'] = array (\n 'objectclass' => array(\n 'objectclass1',\n 'objectclass2',\n ...\n ),\n 'attrs' => array(\n 'attr1' => 'val1',\n 'attr2' => array(\n 'val2',\n 'val3',\n ...\n ),\n ...\n )\n);\n</code></pre> <ul> <li> <p><code>objectclass</code></p> <p>La liste des objectclass de l'objet conteneur.</p> </li> </ul> <ul> <li> <p><code>attrs</code></p> <p>Un tableau associatif dont les cl\u00e9s sont les noms des attributs de l'objet conteneur \u00e0 d\u00e9finir et dont les valeurs associ\u00e9es sont la/les valeur(s) de ces attributs.</p> </li> </ul>"},{"location":"conf/LSobject/customActions/","title":"Actions personnalis\u00e9es (customActions)","text":"<p>Cette section d\u00e9crit la mani\u00e8re de configurer les actions personnalis\u00e9es ex\u00e9cutables sur les LSobjects appel\u00e9es customActions.</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['customActions'] = array (\n 'action1' => array(\n 'label' => '[label l'action]',\n 'hideLabel' => '[bool\u00e9en]',\n 'helpInfo' => '[label d'aide]',\n 'icon' => '[nom de l'ic\u00f4ne de l'action]',\n 'function' => '[fonction \u00e0 ex\u00e9cuter]',\n 'question_format' => '[LSformat de la question de confirmation]',\n 'onSuccessMsgFormat' => '[LSformat du message \u00e0 afficher en cas de succ\u00e8s de l'action]',\n 'disableOnSuccessMsg' => '[bool\u00e9en]',\n 'noConfirmation' => '[bool\u00e9en]',\n 'redirectToObjectList' => '[bool\u00e9en]',\n 'noRedirect' => '[bool\u00e9en]',\n 'rights' => array(\n 'LSprofile1',\n 'LSprofile2',\n ...\n )\n )\n);\n</code></pre> <ul> <li> <p><code>label</code></p> <p>Le label de l'action.</p> </li> </ul> <ul> <li> <p><code>hideLabel</code></p> <p>Cache le label dans le bouton de l'action.</p> </li> </ul> <ul> <li> <p><code>helpInfo</code></p> <p>Le label du message d'aide qui sera affich\u00e9 au survole du bouton de l'action.</p> </li> </ul> <ul> <li> <p><code>icon</code></p> <p>Nom de l'\u00eecone \u00e0 afficher dans le bouton de l'action. Ce nom correspond au nom du fichier de l'image (sans l'extention) qui devra se trouver dans le dossier <code>src/images/[nom du theme d'images]/</code> ou dans le dossier <code>src/local/images</code>.</p> </li> </ul> <ul> <li> <p><code>function</code></p> <p>Le nom de la fonction \u00e0 ex\u00e9cuter qui impl\u00e9mente l'action personnalis\u00e9e Cette fonction prendra en seule param\u00e8tre le LSobject sur lequel l'action devra \u00eatre ex\u00e9cut\u00e9e et retournera <code>True</code> en cas de succ\u00e8s ou <code>False</code> en cas d'\u00e9chec d'ex\u00e9cution de la fonction.</p> </li> </ul> <ul> <li> <p><code>question_format</code></p> <p>Le LSformat de la question de confirmation d'ex\u00e9cution de l'action. Ce LSformat sera compos\u00e9 \u00e0 l'aide du nom de l'objet.</p> </li> </ul> <ul> <li> <p><code>onSuccessMsgFormat</code></p> <p>Le LSformat du message \u00e0 afficher en cas de succ\u00e8s d'ex\u00e9cution de l'action. Ce LSformat sera compos\u00e9 \u00e0 l'aide du nom de l'objet.</p> </li> </ul> <ul> <li> <p><code>disableOnSuccessMsg</code></p> <p>Bool\u00e9en permetant de d\u00e9sactiver le message afficher en cas de succ\u00e8s d'ex\u00e9cution de l'action.</p> </li> </ul> <ul> <li> <p><code>noConfirmation</code></p> <p>Bool\u00e9en permetant de d\u00e9sactiver la confirmation de l'ex\u00e9cution de l'action.</p> </li> </ul> <ul> <li> <p><code>redirectToObjectList</code></p> <p>Bool\u00e9en permetant de rediriger l'utilisateur vers la liste des objets plut\u00f4t que sur la fiche de l'objet apr\u00e8s l'execution de l'action.</p> </li> </ul> <ul> <li> <p><code>noRedirect</code></p> <p>Bool\u00e9en permetant de d\u00e9sactiver la redirection de l'utilisateur apr\u00e8s l'execution de l'action. Cela permet \u00e0 la fonction de d\u00e9finir son propre fichier de template de retour et donc d'afficher une page personnalisable.</p> </li> </ul> <ul> <li> <p><code>rights</code></p> <p>Tableau contenant la liste des noms des LSprofiles ayant le droit d'ex\u00e9cuter cette action.</p> </li> </ul>"},{"location":"conf/LSobject/customActions/#ecriture-dune-fonction-implementant-une-customaction","title":"\u00c9criture d'une fonction impl\u00e9mentant une customAction","text":"<p>Une fonction impl\u00e9mentant une customAction se d\u00e9clare de la mani\u00e8re suivante :</p> <pre><code>/*\n * Ma fonction impl\u00e9mentant ma customAction\n *\n * Param\u00e8tre :\n * - $object : Le LSobject sur lequel mon action doit \u00eatre ex\u00e9cut\u00e9e\n *\n * Valeurs retourn\u00e9es :\n * - True : Tout s'est bien pass\u00e9\n * - False : Une erreur est survenue\n */\nfunction maFonction ($object) {\n\n // Actions\n\n}\n</code></pre> <p>Cette fonction doit prendre pour seul param\u00e8tre, le LSobject sur lequel l'action personnalis\u00e9e doit \u00eatre ex\u00e9cut\u00e9e et doit retourner soit <code>True</code> si tout s'est bien pass\u00e9, soit <code>False</code> en cas de probl\u00e8me.</p> <p>Note</p> <p>Ces fonctions sont le plus couramment d\u00e9finies au sein d' LSaddon.</p>"},{"location":"conf/LSobject/ioFormat/","title":"Les formats d'import/export (ioFormat)","text":"<p>Cette section d\u00e9crit la mani\u00e8re de param\u00e9trer les formats d'import/export pour un type d' LSobject donn\u00e9.</p> <p>La configuration des ioFormats se situe dans la configuration des LSobjects, dans la variable <code>ioFormat</code> (<code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['ioFormat']</code>). Cette variable est un tableau associatif dont la cl\u00e9 est l'identifiant du format et dont la valeur associ\u00e9e est la configuration du format.</p> <p>Important</p> <p>Le moteur d'importation simule la validation d'un formulaire de cr\u00e9ation du type d'LSobject (ou de modification en cas d'activation du mode mise \u00e0 jour uniquement, voir ci-dessous). En cons\u00e9quence :</p> <ul> <li>seul les attributs pr\u00e9sent dans le formulaire de cr\u00e9ation peuvent \u00eatre import\u00e9s.</li> </ul> <ul> <li>tous les attributs obligatoires pr\u00e9sents dans le formulaire de cr\u00e9ation doivent \u00eatre fournis par le fichier source ou g\u00e9n\u00e9rer \u00e0 partir des autres attributs.</li> </ul> <ul> <li>Les valeurs des attributs issus de l'importation seront vue comme des valeurs retourn\u00e9es par le formulaire et non comme des valeurs des attribus LDAP eux-m\u00eame. Ainsi et par exemple, un attribut trait\u00e9 comme un bool\u00e9en dans un formulaire pourra prendre comme valeur par d\u00e9faut <code>yes</code> ou <code>no</code>.</li> </ul> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['ioFormat'] = array (\n '[ioFormat ID]' => array (\n 'label' => '[Label du type de fichier]',\n 'driver' => '[Pilote d'ioFormat utilis\u00e9]',\n 'driver_options' => array([Options du pilote d'ioFormat utilis\u00e9]),\n 'update_only' => '[Bool\u00e9en]',\n 'fields => array (\n '[champ 1]' => '[attribut 1]',\n '[champ 2]' => '[attribut 2]',\n [...]\n ),\n 'generated_fields' => array (\n '[attribute 3]' => '[LSformat]',\n '[attribute 4]' => array('[LSformat1]', '[LSformat2]', ...)\n '[attribute 5]' => function($attrs, $row) {\n return array([...]);\n },\n [...]\n ),\n 'before_import' => array('function1', 'function2'),\n 'after_import' => 'function3',\n ),\n [...]\n);\n</code></pre> <ul> <li> <p><code>label</code></p> <p>Le label du format</p> </li> </ul> <ul> <li> <p><code>driver</code></p> <p>Le pilote a utilis\u00e9 pour ce format. Le pilote permet de g\u00e9r\u00e9r la lecture et l'\u00e9criture dans un type de fichier d'import/export. Pour plus d'information sur les pilotes disponibles, Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>driver_options</code></p> <p>Tableau associatif des options du pilote utilis\u00e9 pour ce format. Pour plus d'informations, consulter la documentation du pilote utilis\u00e9.</p> </li> </ul> <ul> <li> <p><code>update_only</code></p> <p>Bool\u00e9en permettant d'activer le mode mise \u00e0 jour uniquement pour ce format. Dans ce mode, les donn\u00e9es de l'objet LDAP correspondant seront charg\u00e9es depuis l'annuaire avant toutes validations des donn\u00e9es fournies dans le fichier d'import, et ce, dans un formulaire de modifications et non pas un formulaire de cr\u00e9ation autrement. Pour que cela soit possible, il est indispensable que le DN de l'objet puisse \u00eatre d\u00e9duit depuis les donn\u00e9es fournies dans le fichier d'import. Pour cela, vous pouvez le fournir via un champ du fichier d'import associ\u00e9 \u00e0 la cl\u00e9 <code>dn</code> ou \u00e0 d\u00e9faut il sera g\u00e9n\u00e9r\u00e9 \u00e0 partir du RDN dont la valeur devra \u00eatre fournie dans le fichier d'import. Vous pouvez \u00e9galement le g\u00e9n\u00e9rer via le param\u00e8tre <code>generated_fields</code> (voir ci-dessous).</p> </li> </ul> <ul> <li> <p><code>fields</code></p> <p>Tableau associatif permettant d'associer un champ du fichier source (la cl\u00e9) avec attribut de l'objet LDAP (la valeur). Il est \u00e9galement possible d'associ\u00e9 un champ avec la valeur <code>dn</code> pour fournir le DN de l'objet en mode mise \u00e0 jour uniquement (voir ci-dessus).</p> </li> </ul> <ul> <li> <p><code>generated_fields</code></p> <p>Tableau associatif permettant de d\u00e9finir soit des LSformats, soit un callable (au sens PHP) pour g\u00e9n\u00e9rer les valeurs d'attributs automatiquement. Ce tableau contient en cl\u00e9, le nom de l'attribut \u00e0 g\u00e9n\u00e9rer (ou <code>dn</code> pour la g\u00e9n\u00e9ration du DN de l'objet en mode mise \u00e0 jour uniquement), et en valeur associ\u00e9e, un ou plusieurs LSformat ou un callable \u00e0 utiliser pour g\u00e9n\u00e9rer ses valeurs. En cas de LSformat, ils seront compos\u00e9s \u00e0 l'aide des valeurs des autres attributs de l'objet. En cas d'un callable, il sera appeler avec en param\u00e8tre le tableau des valeurs des autres attributs (<code>$attrs</code>), le tableau des donn\u00e9es issues du fichier source (<code>$row</code>) et devra retourner le tableau des valeurs g\u00e9n\u00e9r\u00e9es de l'attribut ou <code>false</code> en cas d'erreur.</p> </li> </ul> <ul> <li> <p><code>before_import</code></p> <p>Cha\u00eene de caract\u00e8res (ou tableau de cha\u00eene de caract\u00e8res) correspondant au nom d'une ou plusieurs fonctions qui seront ex\u00e9cut\u00e9es avant chaque import. Voir la section concern\u00e9e</p> </li> </ul> <ul> <li> <p><code>after_import</code></p> <p>Cha\u00eene de caract\u00e8res (ou tableau de cha\u00eene de caract\u00e8res) correspondant au nom d'une ou plusieurs fonctions qui seront ex\u00e9cut\u00e9es apr\u00e8s chaque import. Voir la section concern\u00e9e</p> </li> </ul>"},{"location":"conf/LSobject/ioFormat/#pilote-dioformat","title":"Pilote d'ioFormat","text":"<p>Cette section d\u00e9crit la mani\u00e8re de configurer les pilotes d'ioFormat utilis\u00e9s lors des imports/exports d'LSobjects.</p>"},{"location":"conf/LSobject/ioFormat/#pilote-de-fichiers-csv","title":"Pilote de fichiers CSV","text":"<p>Ce pilote permet de g\u00e9rer l'import/export de LSobject \u00e0 partir d'un fichier <code>CSV</code>. Depuis la version 4 d'LdapSaisie, ce pilote utilise les fonctions standards <code>fgetcsv()</code> et <code>fputcsv</code> fournis par PHP. Avant cela, la classe PEAR File_CSV_DataSource \u00e9tait utilis\u00e9e. Par d\u00e9faut, les param\u00e8tres de lecture et d'\u00e9criture des fichiers sont : la virgule sert de d\u00e9limiteur, le caract\u00e8re <code>\"</code> peut \u00eatre utilis\u00e9 pour encadrer les valeurs des champs et la longueur maximale d'une ligne est infini. Ces param\u00e8tres peuvent \u00eatre modifi\u00e9s en configurant les options du pilote.</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['ioFormat']['[ID ioFormat]']['driver_options'] = array (\n 'delimiter' => '[d\u00e9limiteur]',\n 'enclosure' => '[caract\u00e8re d'encadrement de texte]',\n 'length' => [longueur maximale d'une ligne],\n 'escape' => '[caract\u00e8re d'\u00e9chappement]',\n 'multiple_value_delimiter' => '[d\u00e9limiteur]',\n);\n</code></pre> <ul> <li> <p><code>delimiter</code></p> <p>Le caract\u00e8re utilis\u00e9 pour d\u00e9limiter les champs (Par d\u00e9faut, une virgule).</p> </li> </ul> <ul> <li> <p><code>length</code></p> <p>La longueur maximale d'une ligne du fichier. Si z\u00e9ro est sp\u00e9cifi\u00e9, la longueur d'une ligne ne sera pas limit\u00e9, mais la lecture du fichier sera ralentie. (Par d\u00e9faut : <code>0</code>)</p> </li> </ul> <ul> <li> <p><code>enclosure</code></p> <p>Le caract\u00e8re utilis\u00e9 pour encadrer les valeurs des champs (Par d\u00e9faut : <code>\"</code>).</p> </li> </ul> <ul> <li> <p><code>escape</code></p> <p>Le caract\u00e8re d'\u00e9chappement utilis\u00e9 si un des champs d'une ligne de fichier contient le caract\u00e8re utilis\u00e9 pour encadrer les valeurs. (Par d\u00e9faut : <code>\\</code>).</p> <p>Note</p> <p>Selon la RFC4180, l'echappement du caract\u00e8re utilis\u00e9 pour encadrer les valeurs des champs doit se faire en le doublant. Le caract\u00e8re d\u00e9fini ici est une alternative \u00e0 ce comportement par d\u00e9faut. Pour d\u00e9sactiver ce caract\u00e8re d'\u00e9chappement alternatif, il est possible depuis de la version 7.4.0 de PHP de mettre ici une chaine vide.</p> </li> </ul> <ul> <li> <p><code>multiple_value_delimiter</code></p> <p>Le caract\u00e8re utilis\u00e9 pour d\u00e9limiter au sein d'un champs, les valeurs valeurs multiples d'un attribut (Par d\u00e9faut : <code>|</code>).</p> </li> </ul>"},{"location":"conf/LSobject/ioFormat/#declencheurs","title":"D\u00e9clencheurs","text":"<p>Cette section d\u00e9crit la mani\u00e8re de param\u00e9trer des d\u00e9clencheurs afin que LdapSaisie ex\u00e9cute durant ses processus, et \u00e0 des moments bien pr\u00e9cis des traitements d'un ioFormat, des fonctions que vous pourrez d\u00e9velopper vous m\u00eame. De plus, le r\u00e9sultat de l'ex\u00e9cution de vos fonctions pourra influer sur le d\u00e9roulement des processus.</p> <p>Actuellement, les \u00e9venements suivant sont g\u00e9r\u00e9s :</p> Nom Description Bloquant <code>before_import</code> Avant l'import. Oui <code>after_import</code> Apr\u00e8s l'import'. Non <p>Note</p> <p>Si un \u00e9v\u00e9nement est dit bloquant, lors de l'ex\u00e9cution des actions li\u00e9es, si une des fonctions retourne <code>false</code>, le processus s'arr\u00eatera.</p>"},{"location":"conf/LSobject/ioFormat/#configuration","title":"Configuration","text":"<p>La configuration des d\u00e9clencheurs se fait dans la d\u00e9finition des types d'ioFormat. Par exemple, pour d\u00e9finir les fonctions \u00e0 ex\u00e9cuter apr\u00e8s l'import des LSobjects de type LSpeople avec son LSioFormat mycsv, c'est \u00e0 dire lors de leur \u00e9v\u00e8nement <code>after_import</code>, il faut d\u00e9finir la variable suivante :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople']['ioFormat']['mycsv']['after_import']\n</code></pre> <p>Cette variable peut contenir soit une chaine de caract\u00e8res correspondant au nom de la fonction \u00e0 ex\u00e9cuter, soit un tableau de cha\u00eenes de caract\u00e8res correspondant aux noms des fonctions \u00e0 ex\u00e9cuter. Il est \u00e9galement possible de mettre ici directement des fonctions anonymes.</p>"},{"location":"conf/LSobject/ioFormat/#ecriture-dune-fonction","title":"Ecriture d'une fonction","text":"<p>Une fonction ex\u00e9cut\u00e9e par un d\u00e9clencheur d'un ioFormat se d\u00e9clare de la mani\u00e8re suivante :</p> <pre><code>/*\n * Ma fonction \u00e0 ex\u00e9cuter lors de l'evenement [event]\n *\n * Param\u00e8tres :\n * - $ioFormat : Le LSioFormat sur lequel l'\u00e9v\u00e8nement survient\n * - $data : Les donn\u00e9es de contexte de l'\u00e9v\u00e8nement\n *\n * Valeurs retourn\u00e9es :\n * - True : Tout s'est bien pass\u00e9\n * - False : Une erreur est survenue ou la fonction souhaite bloquer le\n * processus lors d'un \u00e9v\u00e8nement bloquant.\n */\nfunction maFonction (&$ioFormat, &$data) {\n\n // Actions\n\n}\n</code></pre> <p>Cette fonction doit accepter deux param\u00e8tres, le LSioFormat sur lequel l'\u00e9v\u00e8nement survient et un tableau des donn\u00e9es contextuelles de l'\u00e9v\u00e8nement. Elle doit par ailleurs retourner <code>True</code> si tout s'est bien pass\u00e9 ou <code>False</code> en cas de probl\u00e8me. Dans le cas d'un \u00e9v\u00e9nement bloquant, si la fonction retourne <code>False</code>, le processus est arr\u00eat\u00e9.</p> <p>Les donn\u00e9es contextuelles de l'\u00e9v\u00e8nement, pass\u00e9es en param\u00e8tre, pourront d\u00e9pendre du contexte et de l'\u00e9v\u00e8nement d\u00e9clencheur, mais pour les moments, il s'agit toujours d'un tableau telque d\u00e9crit ci-dessous :</p> <pre><code>array(\n 'input_file' => \"[/path/of/import.file]\",\n 'updateIfExists' => [boolean],\n 'justTry' => [boolean],\n 'objectsData' => array(\n [Donn\u00e9es des objets charg\u00e9s depuis le fichier d'import]\n ),\n 'return' => array(\n 'success' => [boolean],\n 'LSobject' => \"[nom du type d'LSobject]\",\n 'ioFormat' => \"[nom du type d'ioFormat]\",\n 'updateIfExists' => [boolean],\n 'justTry' => [boolean],\n 'imported' => array([objets import\u00e9s]),\n 'updated' => array([objets mis \u00e0 jour]),\n 'errors' => array(\n array(\n 'data' => [donn\u00e9es de l'objet import\u00e9 ayant d\u00e9clench\u00e9 l'erreur],\n 'errors' => array (\n 'globals' => array(\"Erreur 1\", [...]),\n 'attrs' => array(\n 'attr1' => array(\"Erreur 1\", [...]),\n [...]\n ),\n ),\n ),\n [...]\n ),\n ),\n)\n</code></pre> <p>Note</p> <p>Les cl\u00e9s <code>objectsData</code> et <code>return</code> sont des r\u00e9f\u00e9rences. En cas de modification, cela influencera respectivement sur les donn\u00e9es utilis\u00e9es pour l'import et sur le r\u00e9sultat de l'import tel qu'affich\u00e9 dans l'interface.</p>"},{"location":"conf/LSobject/triggers/","title":"D\u00e9clencheurs","text":"<p>Cette section d\u00e9crit la mani\u00e8re de param\u00e9trer des d\u00e9clencheurs afin que LdapSaisie ex\u00e9cute durant ses processus, et \u00e0 des moments bien pr\u00e9cis des traitements d'un LSobject, des fonctions que vous pourrez d\u00e9velopper vous m\u00eame. De plus, le r\u00e9sultat de l'ex\u00e9cution de vos fonctions pourra influer sur le d\u00e9roulement des processus.</p> <p>Actuellement, les \u00e9venements suivant sont g\u00e9r\u00e9s :</p> Nom Description Bloquant <code>before_create</code> Avant la cr\u00e9ation du LSobject. Oui <code>after_create</code> Apr\u00e8s la cr\u00e9ation du LSobject. Non <code>before_modify</code> Avant la modification du LSobject Oui <code>after_modify</code> Apr\u00e8s la modification du LSobject Non <code>before_rename</code> Avant de renommer le LSobject Oui <code>after_rename</code> Apr\u00e8s avoir renomm\u00e9 le LSobject Non <code>before_delete</code> Avant la suppression du LSobject Oui <code>after_delete</code> Apr\u00e8s la suppression du LSobject Non <p>Note</p> <p>Si un \u00e9v\u00e9nement est dit bloquant, lors de l'ex\u00e9cution des actions li\u00e9es, si une des fonctions retourne <code>false</code>, le processus s'arr\u00eatera.</p>"},{"location":"conf/LSobject/triggers/#configuration","title":"Configuration","text":"<p>La configuration des d\u00e9clencheurs se fait dans la d\u00e9finition des types d'LSobjects. Par exemple, pour d\u00e9finir les fonctions \u00e0 ex\u00e9cuter apr\u00e8s la modification des LSobjects de type LSpeople, c'est \u00e0 dire lors de leur \u00e9v\u00e8nement <code>after_modify</code>, il faut d\u00e9finir la variable suivante :</p> <pre><code>$GLOBALS['LSobjects']['[nom du type d'LSobject]']['after_modify']\n</code></pre> <p>Cette variable peut contenir soit une chaine de caract\u00e8res correspondant au nom de la fonction \u00e0 ex\u00e9cuter, soit un tableau de cha\u00eenes de caract\u00e8res correspondant aux noms des fonctions \u00e0 ex\u00e9cuter.</p>"},{"location":"conf/LSobject/triggers/#ecriture-dune-fonction","title":"\u00c9criture d'une fonction","text":"<p>Une fonction ex\u00e9cut\u00e9 par un d\u00e9clencheur d'un LSobject se d\u00e9clare de la mani\u00e8re suivante :</p> <pre><code>/*\n * Ma fonction \u00e0 ex\u00e9cuter lors de l'evenement [event]\n *\n * Param\u00e8tre :\n * - $object : Le LSobject sur lequel l'\u00e9v\u00e8nement survient\n *\n * Valeurs retourn\u00e9es :\n * - True : Tout s'est bien pass\u00e9\n * - False : Une erreur est survenue ou la fonction souhaite bloquer le\n * processus lors d'un \u00e9v\u00e8nement bloquant.\n */\nfunction maFonction ($object) {\n\n // Actions\n\n}\n</code></pre> <p>Cette fonction doit prendre pour seul param\u00e8tre, le LSobject sur lequel l'\u00e9v\u00e8nement survient et doit retourner soit <code>True</code> si tout s'est bien pass\u00e9, soit <code>False</code> en cas de probl\u00e8me. Dans le cas d'un \u00e9v\u00e9nement bloquant, si la fonction retourne <code>False</code>, le processus est arr\u00eat\u00e9.</p>"},{"location":"conf/LSobject/LSattribute/","title":"Configuration des attributs","text":"<p>Cette section d\u00e9crit les options de configuration des attributs des LSobjects. Les attributs sont d\u00e9finis dans le tableau associatif <code>attrs</code> de la configuration des LSobjects. Dans ce tableau, les cl\u00e9 les noms des attributs et les valeurs li\u00e9s sont la configuration des attributs.</p> <p>Warning</p> <p>Contrairement \u00e0 ce qui existe dans le standard LDAP, les noms des attributs sont sensibles \u00e0 la casse. Il faut que le nom des attributs dans LdapSaisie soient scrupuleusement les m\u00eames que ceux retourn\u00e9 par Net_LDAP2</p> <pre><code>'attrs' => array (\n /* ----------- start -----------*/\n 'attr1' => array (\n 'label' => '[label de l'attr1',\n 'displayAttrName' => '[booleen]',\n 'help_info' => '[Message d'aide sur l'attribut attr1]',\n 'help_info_in_view' => '[booleen]',\n 'ldap_type' => 'ldaptype1',\n 'ldap_options' => array(\n // Options LDAP li\u00e9es au type LDAP de l'attribut\n ),\n 'html_type' => 'htmltype1',\n 'html_options' => array(\n // Options HTML li\u00e9es au type HTML de l'attribut\n ),\n 'no_value_label' => '[No set value label]',\n 'multiple' => 0,\n 'required' => 1,\n 'generate_function' => 'fonction1',\n 'generate_value_format' => '[LSformat]',\n 'default_value' => 'valeur1',\n 'check_data' => array (\n // R\u00e9gle de v\u00e9rification syntaxique des donn\u00e9es saisies\n ),\n 'validation' => array (\n // R\u00e8gle de v\u00e9rification d'int\u00e9grit\u00e9 des donn\u00e9es saisies\n ),\n 'rights' => array(\n 'LSprofile1' => 'droit1',\n 'LSprofile2' => 'droit2',\n ...\n ),\n 'view' => 1,\n 'form' => array (\n 'create' => 1,\n 'modify' => 0,\n ...\n ),\n 'dependAttrs' => array(\n // Attributs en d\u00e9pendance\n ),\n 'onDisplay' => 'fonction2'\n\n 'before_modify' => 'function1',\n 'after_modify' => 'function2'\n ),\n /* ----------- end -----------*/\n ...\n);\n...\n</code></pre> <ul> <li> <p><code>label</code></p> <p>Le label de l'attribut.</p> </li> </ul> <ul> <li> <p><code>displayAttrName</code></p> <p>Bool\u00e9en d\u00e9finissant si le nom de l'attribut doit \u00eatre affich\u00e9 en pr\u00e9fixe du message d'aide (param\u00e8tre <code>help_info</code>).</p> </li> </ul> <ul> <li> <p><code>help_info</code></p> <p>Message d'aide qui sera affich\u00e9 dans une bulle d'aide \u00e0 c\u00f4t\u00e9 du nom de l'attribut dans les formulaires.</p> </li> </ul> <ul> <li> <p><code>help_info_in_view</code></p> <p>Bool\u00e9en d\u00e9finissant si le message d'aide doit \u00eatre affich\u00e9 sur la vue de visualisation de l'objet.</p> <p>Valeurs possibles : 0 ou 1</p> <p>Valeur par d\u00e9faut : 0</p> </li> </ul> <ul> <li> <p><code>ldap_type</code></p> <p>Le type LDAP de l'attribut (facultatif, par d\u00e9faut: LSattr_ldap_ascii). Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>ldap_options</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration du type LDAP de l'attribut. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>html_type</code></p> <p>Le type HTML de l'attribut (facultatif, par d\u00e9faut: LSattr_html_text). Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>html_options</code></p> <p>Tableau associatif contenant les param\u00e8tres de configuration du type HTML de l'attribut. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>no_value_label</code></p> <p>Label affich\u00e9 lorsque l'attribut n'a pas de valeur (facultatif).</p> </li> </ul> <ul> <li> <p><code>multiple</code></p> <p>Bool\u00e9en d\u00e9finissant si cet attribut peut stocker plusieurs valeurs.</p> <p>Valeurs possibles : 0 ou 1</p> <p>Valeur par d\u00e9faut : 0</p> </li> </ul> <ul> <li> <p><code>required</code></p> <p>Bool\u00e9en d\u00e9finissant si cet attribut doit obligatoirement \u00eatre d\u00e9fini.</p> <p>Valeurs possibles : 0 ou 1</p> <p>Valeur par d\u00e9faut : 0</p> </li> </ul> <ul> <li> <p><code>generate_function</code></p> <p>Nom de la fonction permettant de g\u00e9n\u00e9rer la valeur de l'attribut. Cette fonction sera \u00e9xecut\u00e9e, en passant en premier param\u00e8tre, l'objet LSobject courant.</p> </li> </ul> <ul> <li> <p><code>generate_value_format</code></p> <p>LSformat permettant la g\u00e9n\u00e9ration de l'attribut.</p> <p>Note</p> <p>Cette m\u00e9thode de g\u00e9n\u00e9ration est utilis\u00e9e uniquement si aucune fonction de g\u00e9n\u00e9ration de la valeur n'est d\u00e9finie (param\u00e8tre <code>generate_function</code>).</p> </li> </ul> <ul> <li> <p><code>default_value</code></p> <p>Valeur par d\u00e9faut de l'attribut.</p> <p>Warning</p> <p>Il doit s'agir de la valeur telque retourn\u00e9e par le formulaire web. Ainsi, par exemple dans le cas d'un attribut bool\u00e9en, les valeurs possibles sont <code>yes</code> ou <code>no</code>.</p> <p>Note</p> <p>Cette valeur est \u00e9galement utilis\u00e9e dans le cadre de la g\u00e9n\u00e9ration automatique de la valeur de l'attribut si aucune autre m\u00e9thode n'est disponible (via une fonction ou un LSformat).</p> </li> </ul> <ul> <li> <p><code>check_data</code></p> <p>Tableau associatif contenant les r\u00e8gles de v\u00e9rification syntaxique des donn\u00e9es de l'attribut. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>validation</code></p> <p>Tableau associatif contenant les r\u00e8gles de v\u00e9rification d'int\u00e9grit\u00e9 des donn\u00e9es de l'attribut. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>rights</code></p> <p>Tableau associatif dont les cl\u00e9s sont les noms des LSprofiles ayant des droits sur cet attribut et les valeurs associ\u00e9es sont les droits correspondants. La valeur des droits d'un LSprofile peut \u00eatre <code>r</code> pour le droit de lecture ou <code>w</code> pour le droit de lecture-\u00e9criture. Par d\u00e9faut, un LSprofile n'a aucun droit.</p> </li> </ul> <ul> <li> <p><code>view</code></p> <p>Bool\u00e9en d\u00e9finissant si l'attribut est, ou non, affich\u00e9 lors de la visualisation des objets du type courant.</p> <p>Valeurs possibles : 0 ou 1</p> <p>Valeur par d\u00e9faut : 0</p> </li> </ul> <ul> <li> <p><code>form</code></p> <p>Tableau associatif dont les cl\u00e9s sont les noms des LSforms et les valeurs associ\u00e9es la d\u00e9finition de l'affichage dans ce LSform. Si cette valeur vaut <code>0</code>, alors l'attribut sera lecture-seule et si cette valeur vaut <code>1</code>, cet attribut sera affich\u00e9 en lecture-\u00e9criture.</p> </li> </ul> <ul> <li> <p><code>dependAttrs</code></p> <p>Tableau associatif listant les attributs d\u00e9pendants de celui-ci. Les attributs list\u00e9s ici seront reg\u00e9n\u00e9r\u00e9s lors de chaque modification de l'attribut courant. Cette g\u00e9n\u00e9ration sera effectu\u00e9e avec la fonction d\u00e9finie dans le param\u00e8tre <code>generate_function</code> de l'attribut.</p> </li> </ul> <ul> <li> <p><code>onDisplay</code></p> <p>Nom ou liste de nom des fonctions retournant les valeurs d'affichages de l'attribut. Si c'est une liste, chacune des fonctions seront execut\u00e9e les unes apr\u00e8s les autres. Ces fonctions seront \u00e9xecut\u00e9es, en passant en premier param\u00e8tre, le tableau des valeurs de l'objet.</p> </li> </ul> <ul> <li> <p><code>before_modify</code></p> <p>Cha\u00eene de caract\u00e8res (ou tableau de chaine de caract\u00e8res) correspondant au nom d'une ou plusieurs fonctions qui seront ex\u00e9cut\u00e9es avant toutes modifications de la valeur de l'attribut. Voir la section concern\u00e9e</p> </li> </ul> <ul> <li> <p><code>after_modify</code></p> <p>Cha\u00eene de caract\u00e8res (ou tableau de chaine de caract\u00e8res) correspondant au nom d'une ou plusieurs fonctions qui seront ex\u00e9cut\u00e9es apr\u00e8s toutes modifications de la valeur de l'attribut. Voir la section concern\u00e9e</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/triggers/","title":"D\u00e9clencheurs","text":"<p>Cette section d\u00e9crit la mani\u00e8re de param\u00e9trer des d\u00e9clencheurs afin que LdapSaisie ex\u00e9cute durant ses processus, et \u00e0 des moments bien pr\u00e9cis des traitements d'un LSattributes, des fonctions que vous pourrez d\u00e9velopper vous m\u00eame. De plus, le r\u00e9sultat de l'ex\u00e9cution de vos fonctions pourra influer sur le d\u00e9roulement des processus.</p> <p>Actuellement, les \u00e9v\u00e8nements suivant sont g\u00e9r\u00e9s :</p> Nom Description Bloquant <code>before_create</code> Avant la cr\u00e9ation du LSobject, lorsque l'attribut a au moins une valeur. Oui <code>after_create</code> Apr\u00e8s la cr\u00e9ation du LSobject, lorsque l'attribut a au moins une valeur. Non <code>before_modify</code> Avant la modification de la valeur de l'attribut. Oui <code>after_modify</code> Apr\u00e8s la modification de la valeur de l'attribut. Non <code>before_delete</code> Avant la suppression du LSobject contenant l'attribut. Oui <code>after_delete</code> Apr\u00e8s la suppression du LSobject contenant l'attribut. Non <p>Note</p> <p>Si un \u00e9v\u00e9nement est dit bloquant, lors de l'ex\u00e9cution des actions li\u00e9es, si une des fonctions retourne <code>false</code>, le processus s'arr\u00eatera.</p>"},{"location":"conf/LSobject/LSattribute/triggers/#configuration","title":"Configuration","text":"<p>La configuration des d\u00e9clencheurs se fait dans la d\u00e9finition des LSattributes. Par exemple, pour d\u00e9finir les fonctions \u00e0 ex\u00e9cuter apr\u00e8s la modification de la valeur de l'attribut mail du type de LSobject LSpeople, c'est \u00e0 dire lors de leur \u00e9venement <code>after_modify</code>, il faut d\u00e9finir la variable suivante :</p> <pre><code>$GLOBALS['LSobjects']['LSpeople']['attrs']['mail']['after_modify']\n</code></pre> <p>Cette variable peut contenir soit une chaine de caract\u00e8res correspondant au nom de la fonction \u00e0 ex\u00e9cuter, soit un tableau de cha\u00eenes de caract\u00e8res correspondant aux noms des fonctions \u00e0 ex\u00e9cuter.</p>"},{"location":"conf/LSobject/LSattribute/triggers/#ecriture-dune-fonction","title":"\u00c9criture d'une fonction","text":"<p>Une fonction ex\u00e9cut\u00e9 par un d\u00e9clencheur d'un LSattribute se d\u00e9clare de la mani\u00e8re suivante :</p> <pre><code>/*\n * Ma fonction \u00e0 ex\u00e9cuter lors de l'\u00e9v\u00e8nement [event]\n *\n * Param\u00e8tre :\n * - $object : Le LSobject contenant le LSattribute sur lequel l'\u00e9venement\n * survient\n *\n * Valeurs retourn\u00e9es :\n * - True : Tout s'est bien pass\u00e9\n * - False : Une erreur est survenue ou la fonction souhaite bloquer le\n * processus lors d'un \u00e9v\u00e8nement bloquant.\n */\nfunction maFonction ($object) {\n\n // Actions\n\n}\n</code></pre> <p>Cette fonction doit prendre pour seul param\u00e8tre, le LSobject contenant le LSattribute sur lequel l'\u00e9venement survient et doit retourner soit <code>True</code> si tout s'est bien pass\u00e9, soit <code>False</code> en cas de probl\u00e8me. Dans le cas d'un \u00e9v\u00e9nement bloquant, si la fonction retourne <code>False</code>, le processus est arr\u00eat\u00e9.</p>"},{"location":"conf/LSobject/LSattribute/validation/","title":"Configuration des r\u00e8gles de v\u00e9rification d'int\u00e9grit\u00e9","text":"<p>Cette section d\u00e9crit la mani\u00e8re de configurer des r\u00e8gles de v\u00e9rification d'int\u00e9grit\u00e9 sur les donn\u00e9es des attributs. Il est possible de valider la valeur de l'attribut par l'interm\u00e9diraire de la v\u00e9rification de r\u00e9sultat d'une recherche param\u00e8trable dans l'annuaire ou encore d'appeler une fonction de votre choix pour effectuer la v\u00e9rification voulue.</p>"},{"location":"conf/LSobject/LSattribute/validation/#validation-par-lanalyse-du-resultat-dune-recherche-dans-lannuaire","title":"Validation par l'analyse du r\u00e9sultat d'une recherche dans l'annuaire","text":"<p>Une telle r\u00e8gle permet de v\u00e9rifier si les valeurs des attributs n'entrent pas en conflit avec d'autres objets de l'annuaire. Ce test peut \u00e9galement permetre de v\u00e9rifier si les valeurs devant faire r\u00e9f\u00e9rence \u00e0 d'autres objets de l'annuaire sont correctes.</p> <pre><code>'validation' => array (\n ...\n array(\n 'msg' => \"[LSformat du message d'erreur]\",\n 'filter' => '[LSformat du filtre de la recherche]',\n 'object_type' => '[Type d'LSobject recherch\u00e9]',\n 'basedn' => '[BaseDn de la recherche]',\n 'scope' => '[Scope de la recherche]',\n 'result' => '[R\u00e9sultat positif de la recherche]',\n 'except_current_object' => '[Exclure l'objet courant]'\n ),\n ...\n),\n...\n</code></pre> <ul> <li> <p><code>msg</code></p> <p>LSformat du message d'erreur \u00e0 afficher lorsque la validation \u00e9choue. Ce format est construit avec les valeurs du LSobject.</p> </li> </ul> <ul> <li> <p><code>filter</code></p> <p>LSformat du filtre de la recherche. Ce format peut \u00eatre construit avec toutes les valeurs du LSobject (attributs, DN, ...) et \u00e9galement avec la valeur \u00e0 valider en utilisant pour mot cl\u00e9 <code>%{val}</code>.</p> </li> </ul> <ul> <li> <p><code>object_type</code></p> <p>Le nom du type d'LSobject recherch\u00e9. Si un type est sp\u00e9cifi\u00e9, le filtre de la recherche sera une combinaison de celui du param\u00e8tre <code>filter</code> et du filtre compos\u00e9 \u00e0 partir des objectClass du type d'LSobject. Param\u00e8tre facultatif.</p> </li> </ul> <ul> <li> <p><code>basedn</code></p> <p>Le basedn de la recherche (Param\u00e8tre facultatif, par d\u00e9faut : racine de l'annuaire).</p> </li> </ul> <ul> <li> <p><code>scope</code></p> <p>Le scope de la recherche (Param\u00e8tre facultatif, par d\u00e9faut : <code>sub</code>).</p> </li> </ul> <ul> <li> <p><code>result</code></p> <p>Le r\u00e9sultat de la recherche : si <code>result</code> vaut z\u00e9ro, la recherche ne devra retourner aucun objet pour que la validation soit r\u00e9ussie. Sinon, la recherche devra retourner au moins un objet.</p> </li> </ul> <ul> <li> <p><code>except_current_object</code></p> <p>Bool\u00e9en d\u00e9finissant si l'objet courrant doit \u00eatre exclu du r\u00e9sultat de la recherche. Ce param\u00e8tre n'est \u00e9valu\u00e9 quand cas de cr\u00e9ation (formulaire <code>create</code>).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/validation/#validation-par-lexecution-dune-fonction","title":"Validation par l'ex\u00e9cution d'une fonction","text":"<p>Il est possible d'effectuer la validation de l'attribut par l'ex\u00e9cution d'une fonction de votre choix. Il lui sera pass\u00e9 en param\u00e8tre une r\u00e9f\u00e9rence \u00e0 l'objet <code>LSldapObject</code> courant. Si la fonction ne retourne pas true, la validation \u00e9chouera.</p> <pre><code>'validation' => array (\n ..\n array(\n 'msg' => \"[LSformat du message d'erreur]\",\n 'function' => '[Nom de la fonction de validation]'\n ),\n ...\n),\n...\n</code></pre> <ul> <li> <p><code>msg</code></p> <p>LSformat du message d'erreur \u00e0 afficher lorsque la validation \u00e9choue. Ce format est construit avec les valeurs du LSobject.</p> </li> </ul> <ul> <li> <p><code>function</code></p> <p>Le nom de la fonction \u00e0 ex\u00e9cuter. Si cette fonction n'existe pas, un message d'erreur sera affich\u00e9 et la validation \u00e9chouera.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/","title":"Configuration des attributs HTML (LSattr_html)","text":"<p>Cette section d\u00e9crit les options propres \u00e0 chacun des types d'attributs HTML support\u00e9s par LdapSaisie.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_boolean/","title":"LSattr_html_boolean","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un bool\u00e9en.</p> <p>La valeur retourn\u00e9e est l'une des cha\u00eenes de caract\u00e8res suivantes :</p> <ul> <li><code>yes</code> pour Vrai</li> </ul> <ul> <li><code>no</code> pour <code>False</code></li> </ul> <pre><code>'html_options' => array (\n 'true_label' => '[label]',\n 'false_label' => '[label]',\n),\n...\n</code></pre> <ul> <li> <p><code>true_label</code></p> <p>Label affich\u00e9 pour d\u00e9signer la valeur <code>True</code>.</p> </li> </ul> <ul> <li> <p><code>false_label</code></p> <p>Label affich\u00e9 pour d\u00e9signer la valeur <code>False</code>.</p> </li> </ul> <p>Note</p> <p>Pour le moment, les attributs \u00e0 valeurs multiples ne sont pas g\u00e9r\u00e9s.</p> <p>Note</p> <p>Pour ma\u00eetriser les valeurs stock\u00e9es dans l'annuaire, il faut coupler ce type d'attribut HTML avec le type d'attribut LDAP boolean</p> <p>Important</p> <p>La d\u00e9finition de la valeur par d\u00e9faut d'un attribut utilisant ce type HTML (param\u00e8tre <code>default_value</code>), doit se faire \u00e0 l'aide des valeurs <code>yes</code> ou <code>no</code>.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_date/","title":"LSattr_html_date","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une date. L'outil de s\u00e9lection de date MooTools-DatePicker est utilis\u00e9 pour la s\u00e9lection graphique de la date et de l'heure.</p> <pre><code>'html_options' => array (\n 'format' => '[Format d'affichage de la date]',\n 'time' => '[Booleen pour le choix ou non de l heure]',\n 'manual' => '[Booleen pour l edition manuelle ou non]',\n 'showNowButton' => '[Booleen]',\n 'showTodayButton' => '[Booleen]',\n 'style' => '[Nom du style utilise]',\n 'special_values' => array (\n '[value]' => '[label]',\n [...]\n ),\n),\n...\n</code></pre> <ul> <li> <p><code>format</code></p> <p>Format d'affichage de la date dans le champ de saisie. Ce format est compos\u00e9 \u00e0 partir des motifs cl\u00e9s suivants :</p> Mot cl\u00e9 Valeur de substitution Exemple de valeur <code>%a</code> Nom abr\u00e9g\u00e9 du jour de la semaine De Sun \u00e0 Sat <code>%A</code> Nom complet du jour de la semaine De Sunday \u00e0 Saturday <code>%b</code> Nom du mois, abr\u00e9g\u00e9, suivant la locale De Jan \u00e0 Dec <code>%B</code> Nom complet du mois, suivant la locale De January \u00e0 December <code>%c</code> Date et heure pr\u00e9f\u00e9r\u00e9es, bas\u00e9es sur la locale Exemple : Tue Feb 5 00:45:10 2009 pour le 5 F\u00e9vrier 2009 \u00e0 12:45:10 AM <code>%d</code> Jour du mois en num\u00e9rique, sur 2 chiffres (avec le z\u00e9ro initial) De 01 \u00e0 31 <code>%e</code> Jour du mois, avec un espace pr\u00e9c\u00e9dant le premier chiffre. L'impl\u00e9mentation Windows est diff\u00e9rente, voyez apr\u00e8s pour plus d'informations. De 1 \u00e0 31 <code>%H</code> L'heure, sur 2 chiffres, au format 24 heures De 00 \u00e0 23 <code>%I</code> Heure, sur 2 chiffres, au format 12 heures De 01 \u00e0 12 <code>%j</code> Jour de l'ann\u00e9e, sur 3 chiffres avec un z\u00e9ro initial 001 \u00e0 366 <code>%m</code> Mois, sur 2 chiffres De 01 (pour Janvier) \u00e0 12 (pour D\u00e9cembre) <code>%M</code> Minute, sur 2 chiffres De 00 \u00e0 59 <code>%p</code> 'AM' ou 'PM', en majuscule, bas\u00e9 sur l'heure fournie Exemple : AM pour 00:31, PM pour 22:23 <code>%s</code> Timestamp de l'\u00e9poque Unix (identique \u00e0 la fonction time()) Exemple : 305815200 pour le 10 Septembre 1979 08:40:00 AM <code>%S</code> Seconde, sur 2 chiffres De 00 \u00e0 59 <code>%T</code> Identique \u00e0 \"%H:%M:%S\" Exemple : 21:34:17 pour 09:34:17 PM <code>%U</code> Num\u00e9ro de la semaine de l'ann\u00e9e donn\u00e9e, en commen\u00e7ant par le premier Lundi comme premi\u00e8re semaine 13 (pour la 13\u00e8me semaine pleine de l'ann\u00e9e) <code>%w</code> Repr\u00e9sentation num\u00e9rique du jour de la semaine De 0 (pour Dimanche) \u00e0 6 (pour Samedi) <code>%y</code> L'ann\u00e9e, sur 2 chiffres Exemple : 09 pour 2009, 79 pour 1979 <code>%Y</code> L'ann\u00e9e, sur 4 chiffres Exemple : 2038 <code>%z</code> Soit le d\u00e9calage horaire depuis UTC, ou son abr\u00e9viation (suivant le syst\u00e8me d'exploitation) Exemple : -0500 ou EST pour l'heure de l'Est <code>%Z</code> Le d\u00e9calage horaire ou son abr\u00e9viation NON fournie par %z (suivant le syst\u00e8me d'exploitation) Exemple : -0500 ou EST pour l'heure de l'Est <code>%%</code> Le caract\u00e8re de pourcentage (\"%\") --- <p>Note</p> <p>La valeur par d\u00e9faut est %d/%m/%Y, %T. Exemple : 23/04/2009, 23:03:04</p> </li> </ul> <ul> <li> <p><code>time</code></p> <p>Bool\u00e9en d\u00e9finissant si l'outil de s\u00e9lection permetra ou non le choix de l'heure en plus de la date</p> </li> </ul> <ul> <li> <p><code>manual</code></p> <p>Bool\u00e9en autorisant ou non l'\u00e9dition manuelle du champs. Si ce param\u00e8tre vaut <code>False</code>, la s\u00e9lection se fera uniquement \u00e0 l'aide de l'outil graphique</p> </li> </ul> <ul> <li> <p><code>showNowButton</code></p> <p>Bool\u00e9en d\u00e9finissant si le bouton Maintenant est affich\u00e9 ou non. Par d\u00e9faut, il est affich\u00e9.</p> </li> </ul> <ul> <li> <p><code>showTodayButton</code></p> <p>Bool\u00e9en d\u00e9finissant si le bouton Aujourd'hui est affich\u00e9 ou non. Par d\u00e9faut, il est affich\u00e9.</p> </li> </ul> <ul> <li> <p><code>style</code></p> <p>Nom du style d'affichage de l'outil de s\u00e9lection. Les valeurs possibles sont par d\u00e9faut :</p> <ul> <li><code>default</code></li> <li><code>dashboard</code></li> <li><code>vista</code></li> <li><code>jqui</code></li> </ul> <p>Note</p> <p>La cr\u00e9ation de nouveau th\u00e8me est possible. Pour plus d'information, consulter l'aide de l'outil de s\u00e9lection de date.</p> </li> </ul> <ul> <li> <p><code>special_values</code></p> <p>Tableau listant les valeurs sp\u00e9ciales que peut prendre l'attribut. Dans ce tableau associatif, la cl\u00e9 doit correspondre \u00e0 la valeur de l'attribut (telle que fournie par l'attribut LDAP) et la valeur associ\u00e9e au label associ\u00e9.</p> <p>Ces valeurs sp\u00e9ciales seront propos\u00e9es \u00e0 l'utilisateur sous la forme de cases \u00e0 cocher dans le formulaire. Elles peuvent permettre par exemple de donn\u00e9es une signification particuli\u00e8re au z\u00e9ro pour un attribut LDAP stockant un timestamp.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_image/","title":"LSattr_html_image","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une image. Pour le moment, les attributs \u00e0 valeurs multiples ne sont pas g\u00e9r\u00e9s.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_jsonCompositeAttribute/","title":"LSattr_html_jsonCompositeAttribute","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont les valeurs sont des dictionnaires de valeurs encod\u00e9es aux formats JSON.</p> <p>Exemple de valeur g\u00e9r\u00e9e :</p> <pre><code>{\"component1\": \"value1\", \"component2\": \"value2\", \"component3\": \"value3\"}\n</code></pre> <p>Le principe est que ces dictionnaires contienent plusieurs composants r\u00e9f\u00e9renc\u00e9s par leur cl\u00e9 et stockant une valeur dont le type peut \u00eatre un texte libre ou bien \u00eatre issue d'une liste d\u00e9roulante configurable selon le m\u00eame principe que le type d'attribut LSattr_html_select_list.</p> <pre><code>'html_options' => array (\n 'components' => array (\n '[cl\u00e9 composant 1]' => array (\n 'label' => '[Label du composant]',\n 'help_info' => '[Message d'aide sur le composant]',\n 'type' => '[Type de la valeur stock\u00e9]',\n 'required' => [Bool\u00e9en],\n 'multiple' => [Bool\u00e9en],\n 'check_data' => => array (\n // R\u00e9gle de v\u00e9rification syntaxique des donn\u00e9es saisies\n ),\n ),\n '[cl\u00e9 composant 2]' => array (\n 'label' => '[Label du composant 2]',\n 'type' => 'select_list',\n 'required' => [Bool\u00e9en],\n 'options' => array (\n [Configuration \u00e9quivalente \u00e0 un attribut LSattr_html_select_list]\n )\n ),\n [...]\n ),\n 'fullWidth' => [bool\u00e9en],\n),\n...\n</code></pre> <ul> <li> <p><code>components</code></p> <p>Tableau associatif obligatoire contenant en valeur cl\u00e9, l'identifiant des composants, correspondant \u00e0 la cl\u00e9 dans le dictionnaire JSON, et en valeurs associ\u00e9s, la configuration du composant.</p> <ul> <li> <p><code>label</code></p> <p>Le label du composant.</p> </li> </ul> <ul> <li> <p><code>help_info</code></p> <p>Message d'aide sur le composant (affich\u00e9 uniquement en mode \u00e9dition).</p> </li> </ul> <ul> <li> <p><code>type</code></p> <p>Le type de valeur du composant. Les types possibles sont <code>text</code> ou <code>select_list</code> pour respectivement soit une valeur saisie librement, soit une valeur s\u00e9lectionn\u00e9e parmis une liste d\u00e9roulante.</p> </li> </ul> <ul> <li> <p><code>options</code></p> <p>Dans le cadre d'un composant de type <code>select_list</code>, cela correspond \u00e0 la configuration de la liste d\u00e9roulante. Cette configuration utilise la m\u00eame syntaxe de configuration que celle du type d'attribut LSattr_html_select_list et son param\u00e8tre <code>html_options</code>.</p> </li> </ul> <ul> <li> <p><code>multiple</code></p> <p>Bool\u00e9en d\u00e9finissant si ce composant peut stocker plusieurs valeurs (Par d\u00e9faut : <code>False</code>).</p> </li> </ul> <ul> <li> <p><code>required</code></p> <p>Bool\u00e9en d\u00e9finissant si ce composant doit obligatoirement \u00eatre d\u00e9fini (Par d\u00e9faut : <code>False</code>).</p> </li> </ul> <ul> <li> <p><code>check_data</code></p> <p>Tableau associatif contenant les r\u00e8gles de v\u00e9rification syntaxique des donn\u00e9es du composant. Ces r\u00e8gles sont configurables de la m\u00eame mani\u00e8re que les celles des valeurs attributs. Voir la section concern\u00e9e.</p> </li> </ul> </li> </ul> <ul> <li> <p><code>fullWidth</code></p> <p>Bool\u00e9en permettant de d\u00e9finir si l'affichage dans le formulaire doit se faire sur toute la largeur disponible de la page (Par d\u00e9faut : <code>False</code>).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_labeledValue/","title":"LSattr_html_labeledValue","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est prefix\u00e9 d'un <code>label</code> et qui respecte le format suivant : <code>[label]valeur</code>.</p> <pre><code>'html_options' => array(\n 'labels' => array ( // Liste des labels possible\n 'label1' => 'Libell\u00e9 label1',\n 'label2' => 'Libell\u00e9 label2',\n [...]\n ),\n 'translate_labels' => [bool\u00e9en],\n),\n...\n</code></pre> <ul> <li> <p><code>labels</code></p> <p>Tableau associatif obligatoire contenant en valeur cl\u00e9, le <code>label</code> utilis\u00e9 dans la valeur stock\u00e9e et en valeur associ\u00e9e, le valeur d'affichage du <code>label</code>.</p> </li> </ul> <ul> <li> <p><code>translate_labels</code></p> <p>Bool\u00e9en permettant d'activer/d\u00e9sactiver la traduction des labels (Par d\u00e9faut : <code>True</code>).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_mail/","title":"LSattr_html_mail","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une adresse e-mail. En plus d'un affichage adapt\u00e9, il offre la possibilit\u00e9 d'envoyer des mails directement depuis l'interface de l'application.</p> <pre><code>'html_options' => array(\n 'disableMailSending' => [bool\u00e9en],\n),\n...\n</code></pre> <ul> <li> <p><code>disableMailSending</code></p> <p>D\u00e9sactive l'envoi de mail depuis l'interface pour cet attribut.</p> <p>Note</p> <p>Ceci ne d\u00e9sactive pas pour autant le lien HTML de type mailto:. Pour cela, utilisez plut\u00f4t le type d'attribut HTML text.</p> </li> </ul> <p>Important</p> <p>Ce type d'attribut HTML est d\u00e9riv\u00e9 du type text. Il profite donc de toutes les fonctionnalit\u00e9s d'un champ de ce type (autog\u00e9n\u00e9ration, ...).</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_mailQuota/","title":"LSattr_html_mailQuota","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est le quota d'une boite mail. Le format de la valeur g\u00e9n\u00e9r\u00e9e correspondant au format attendu par le serveur de mail Courier] par d\u00e9faut. Exemple : 50000000S correspond \u00e0 un quota de 50Mio.</p> <pre><code>'html_options' => array(\n 'suffix' => '[suffix]',\n )\n),\n...\n</code></pre> <ul> <li> <p><code>suffix</code></p> <p>Chaine de caract\u00e8res suffixant la valeur du quota (Par d\u00e9faut : <code>S</code>).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_maildir/","title":"LSattr_html_maildir","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est le chemin d'une maildir. Typiquement, ce type attribut HTML est utile dans le cas de l'attribut mailbox utilis\u00e9 par maildrop pour stocker le chemin des boites mails. Ce type d'attribut offre la possibilit\u00e9 de g\u00e9r\u00e9r un niveau de l'attribut et \u00e0 travers les d\u00e9clencheurs g\u00e9r\u00e9s par LdapSaisie la cr\u00e9ation, la modification et ou la suppression de la boite mails. Le LSaddon maildir est utilis\u00e9 pour manipuler la boite mail \u00e0 distance.</p> <p>Note</p> <p>Actuellement, cet LSaddon ne g\u00e9rant que l'acc\u00e8s via FTP au serveur distant, l'API d'acc\u00e8s via FTP est attaqu\u00e9e directement.</p> <pre><code>'html_options' => array (\n 'LSform' => array (\n '[LSform1]' => [bool\u00e9en],\n '[LSform2]' => [bool\u00e9en],\n ...\n ),\n 'remoteRootPathRegex' => \"[Expression r\u00e9guli\u00e8re pour matcher le dossier \u00e0 cr\u00e9er]\",\n 'archiveNameFormat' => \"[LSformat du chemin/nom du fichier une fois archiver]\"\n ),\n...\n</code></pre> <ul> <li> <p><code>LSform</code></p> <p>Tableau associatif obligatoire contenant en valeur cl\u00e9 le nom des LSforms dans lesquels la fonctionnalit\u00e9 de modification de la boite mail sera pr\u00e9sente. Les valeurs attach\u00e9es sont des bool\u00e9ens d\u00e9finissant si la modification est active par d\u00e9faut.</p> </li> </ul> <ul> <li> <p><code>remoteRootPathRegex</code></p> <p>Expression r\u00e9guli\u00e8re (compatible Perl) facultative dont le but est de matcher dans la valeur compl\u00e8te du chemin distant de la maildir, le chemin de la maildir \u00e0 cr\u00e9er une fois connect\u00e9 sur le serveur.</p> <p>Exemple : Si le chemin complet de la maildir est <code>/home/vmail/user</code>, mais que l'utilisateur FTP lorsqu'il se connecte arrive directement dans <code>/home/vmail</code>, et faut d\u00e9finir le param\u00e8tre <code>remoteRootPathRegex</code> de la mani\u00e8re suivante :</p> <pre><code>/^\\/home\\/vmail\\/([^\\/]*)\\/+$/\n</code></pre> </li> </ul> <ul> <li> <p><code>archiveNameFormat</code></p> <p>LSformat du nom du dossier de la maildir une fois archiv\u00e9e. Si ce format est d\u00e9fini, le dossier ne sera pas supprim\u00e9 mais d\u00e9plac\u00e9 ou r\u00e9nomm\u00e9. Le format sera construit avec pour seul mot cl\u00e9, le nom de l'ancien dossier. Exemple : Si le dossier de la maildir est <code>/home/vmail/user</code> et le param\u00e8tre <code>archiveNameFormat</code> vaut <code>%{old}.bckp</code>, le dossier sera renomm\u00e9 en <code>/home/vmail/user.bckp</code>.</p> <p>Important</p> <p>Ce format est interpr\u00e9t\u00e9 apr\u00e8s application de la routine li\u00e9e au param\u00e8tre <code>remoteRootPathRegex</code>. Ainsi, dans l'exemple pr\u00e9c\u00e9dent, si le param\u00e8tre <code>remoteRootPathRegex</code> tronquait uniquement le nom du dossier final, c'est \u00e0 dire <code>user</code>, le format une fois interpr\u00e9t\u00e9 donnerai <code>user.bckp</code>.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_password/","title":"LSattr_html_password","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un mot de passe.</p> <pre><code>'html_options' => array(\n 'isLoginPassword' => [booleen],\n 'generationTool' => [booleen],\n 'autoGenerate' => [booleen],\n 'length' => [nombre de caract\u00e8res],\n 'chars' => array ( // Caract\u00e8res que peut contenir le mot de passe\n array( // Liste caract\u00e8re avec un nombre mininum d'apparition sup\u00e9rieur \u00e0 1\n 'nb' => [nb caract\u00e8res],\n 'chars' => '[liste de caract\u00e8res possibles]'\n ),\n '[autre liste de caract\u00e8res possibles]', // Liste caract\u00e8re avec un nombre\n // d'apparitions \u00e9gal \u00e0 1\n ...\n ),\n 'use_pwgen' => [bool\u00e9en], // Utiliser pwgen pour la g\u00e9n\u00e9ration du mot de passe\n 'pwgen_path' => \"/path/to/pwgen\",\n 'pwgen_opts' => \"[options \u00e0 passer \u00e0 pwgen]\",\n 'verify' => [bool\u00e9en], // Activation de l'outil de v\u00e9rification du mot de passe\n 'viewHash' => [bool\u00e9en], // Activation de l'outil de visualisation du mot de passe hach\u00e9\n 'confirmChange' => [bool\u00e9en], // Activation de la confirmation en cas de changement du mot de passe\n 'confirmChangeQuestion' => \"[LSformat]\", // LSformat de la question de confirmation du changement du mot de passe\n 'mail' => array( // Configuration de l'envoi du mot de passe par mail\n 'subject' => \"[LSformat du sujet du mail]\",\n 'msg' => \"[LSformat du message du mail]\",\n 'mail_attr' => 'mail', // Attribut mail de l'objet\n 'get_mail_attr_function' => '[function]', // Fonction retournant l'attribut mail de l'objet\n 'send' => 1, // Activation par d\u00e9faut de l'envoi du mot de passe\n 'ask' => 1, // Laisser le choix \u00e0 l'utilisateur\n 'canEdit' => 1, // Activation de l'\u00e9dition du LSformat du message par l'utilisateur\n 'checkDomain' => false, // D\u00e9sactivation de la v\u00e9rification du domaine de l'adresse email\n 'domain' => '[nom de domaine]', // Nom de domaine obligatoire lors de la validation de l'adresse email\n )\n),\n...\n</code></pre> <ul> <li> <p><code>isLoginPassword</code></p> <p>Bool\u00e9en d\u00e9finissant si le mot de passe est celui utilis\u00e9 par l'utilisateur pour se logguer \u00e0 l'annuaire LDAP. Si c'est le cas, pour v\u00e9rifier si le mot de passe correspond avec un autre, une tentative de connexion de l'utilisateur \u00e0 l'annuaire sera faite. (Par d\u00e9faut : <code>False</code>)</p> </li> </ul> <ul> <li> <p><code>generationTool</code></p> <p>Bool\u00e9en d\u00e9finissant si l'outil de g\u00e9n\u00e9ration de mot de passe est activ\u00e9.</p> </li> </ul> <ul> <li> <p><code>autoGenerate</code></p> <p>Active la g\u00e9n\u00e9ration automatique du mot de passe lorsque l'attribut n'a encore aucune valeur de d\u00e9finie. Il faut \u00e9galement que l'outil de g\u00e9n\u00e9ration soit activ\u00e9 (<code>generationTool</code>).</p> </li> </ul> <ul> <li> <p><code>length</code></p> <p>Nombre de caract\u00e8res que devront contenir les mots de passe g\u00e9n\u00e9r\u00e9s.</p> </li> </ul> <ul> <li> <p><code>chars</code></p> <p>Tableau contenant une liste de listes de caract\u00e8res possibles pour composer le mot de passe. Dans chacune de ces listes, au moins un caract\u00e8re sera utilis\u00e9 dans le nouveau mot de passe. Il est possible de d\u00e9finir un nombre sup\u00e9rieur de caract\u00e8res d'une liste devant appara\u00eetre dans les mots de passe g\u00e9n\u00e9r\u00e9s en sp\u00e9cifiant un tableau associatif dont la cl\u00e9 nb associra le nombre entier de caract\u00e8res et la cl\u00e9 chars la liste de caract\u00e8res. Une liste de caract\u00e8res est un cha\u00eene.</p> </li> </ul> <ul> <li> <p><code>use_pwgen</code></p> <p>Bool\u00e9en d\u00e9finissant si la commande <code>pwgen</code> doit \u00eatre utilis\u00e9 pour g\u00e9n\u00e9rer le mot de passe.</p> </li> </ul> <ul> <li> <p><code>pwgen_path</code></p> <p>Chemin d'acc\u00e8s au binaire <code>pwgen</code>. (Par d\u00e9faut : <code>pwgen</code>).</p> </li> </ul> <ul> <li> <p><code>pwgen_opts</code></p> <p>Options \u00e0 passer \u00e0 la commande <code>pwgen</code>.</p> </li> </ul> <ul> <li> <p><code>verify</code></p> <p>Bool\u00e9en d\u00e9finissant si l'outil de v\u00e9rification du mot de passe est activ\u00e9. Si celui-ci est activ\u00e9, l'utilisateur pourra entrer un mot de passe dans le champ et cliquer sur un bouton qui lancera une proc\u00e9dure de v\u00e9rification du mot de passe via un test de connexion \u00e0 l'annuaire.</p> </li> </ul> <ul> <li> <p><code>viewHash</code></p> <p>Bool\u00e9en d\u00e9finissant si l'utilisateur aura acc\u00e8s \u00e0 la fonctionnalit\u00e9 de visualisation du mot de passe hach\u00e9.</p> </li> </ul> <ul> <li> <p><code>confirmInput</code></p> <p>Bool\u00e9en d\u00e9finissant si un second champ mot de passe sera affich\u00e9 dans le formulaire pour que l'utilisateur confirme la saisie du nouveau mot de passe.</p> </li> </ul> <ul> <li> <p><code>confirmInputError</code></p> <p>LSformat du message d'erreur affich\u00e9 \u00e0 l'utilisateur si le mot de passe saisie dans le champs de confirmation ne correspond pas au nouveau mot de passe. Param\u00e8tre facultatif.</p> </li> </ul> <ul> <li> <p><code>confirmChange</code></p> <p>Bool\u00e9en d\u00e9finissant si l'utilisateur devra confirmer le changement de ce mot de passe. Lorsque cette fonctionnalit\u00e9 est activ\u00e9e, l'utilisateur verra appara\u00eetre une popup de confirmation \u00e0 la validation du formulaire s'il a saisi un nouveau mot de passe.</p> </li> </ul> <ul> <li> <p><code>confirmChangeQuestion</code></p> <p>LSformat de la question pos\u00e9e \u00e0 l'utilisateur en cas de changement du mot de passe et si la fonctionnalit\u00e9 est activ\u00e9e. Il sera compos\u00e9 \u00e0 l'aide du label de l'attribut. Param\u00e8tre facultatif.</p> </li> </ul> <ul> <li> <p><code>clearView</code></p> <p>Bool\u00e9en d\u00e9finissant si l'utilisateur pourra voir le mot de passe en clair par d\u00e9faut (y comris en mode visualisation uniquement).</p> </li> </ul> <ul> <li> <p><code>clearEdit</code></p> <p>Bool\u00e9en d\u00e9finissant si l'utilisateur \u00e9ditera le mot de passe au travers un champs HTML de type text et donc lisible ou au travers un champs HTML de type password.</p> </li> </ul> <ul> <li> <p><code>mail</code></p> <p>Param\u00e8tres de configuration de l'envoi par mail du mot de passe \u00e0 l'utilisateur. Lorsque cet outil est activ\u00e9, lors de la modification/cr\u00e9ation du mot de passe, l'utilisateur pourra recevoir un mail lui sp\u00e9cifiant son nouveau mot de passe.</p> <ul> <li> <p><code>send</code></p> <p>Bool\u00e9en d\u00e9finissant si l'envoi du mot de passe est activ\u00e9 par d\u00e9faut.</p> </li> </ul> <ul> <li> <p><code>ask</code></p> <p>Bool\u00e9en d\u00e9finissant si on laisse le choix \u00e0 l'utilisateur d'activer ou non l'envoi du mot de passe par mail.</p> </li> </ul> <ul> <li> <p><code>canEdit</code></p> <p>Bool\u00e9en d\u00e9finissant si on laisse la possibilit\u00e9 \u00e0 l'utilisateur d'\u00e9diter le LSformat du message et du sujet.</p> </li> </ul> <ul> <li> <p><code>subject</code></p> <p>LSformat du sujet du mail. Ce format sera compos\u00e9 avec la valeur du nouveau mot de passe de l'utilisateur.</p> </li> </ul> <ul> <li> <p><code>msg</code></p> <p>LSformat du message du mail. Ce format sera compos\u00e9 avec les informations de l'object LDAP, y compris le mot cl\u00e9 %{password} correspondant \u00e0 la valeur du nouveau mot de passe de l'utilisateur.</p> </li> </ul> <ul> <li> <p><code>mail_attr</code></p> <p>Le nom de l'attribut listant les mails possibles de l'utilisateur. Par d\u00e9faut, la premi\u00e8re valeur de l'attribut sera utilis\u00e9e comme adresse mail destinatrice. Cet attribut peut \u00e9galement \u00eatre un tableau de plusieurs noms d'attributs. Dans ce cas, la premi\u00e8re valeur correcte sera retenue. Si <code>canEdit</code> est activ\u00e9, l'utilisateur pourra choisir l'adresse mail destinatrice parmi la liste des valeurs de l'attribut.</p> </li> </ul> <ul> <li> <p><code>get_mail_attr_function</code></p> <p>Nom de la fonction (ou <code>callable</code> au sens PHP) qui sera utilis\u00e9 pour r\u00e9cup\u00e9rer le nom de l'attribut listant les mails possibles de l'utilisateur. Cette fonction prendra en param\u00e8tre, l'objet <code>LSformElement</code> courant et devra retourner une valeur \u00e9quivalente au param\u00e8tre de configuration <code>mail_attr</code>. Si ce param\u00e8tre est d\u00e9fini, il pr\u00e9valera toujours sur le param\u00e8tre <code>mail_attr</code>.</p> </li> </ul> <ul> <li> <p><code>bcc</code></p> <p>Mettre en BCC un mail syst\u00e9matiquement (ou plusieurs en les s\u00e9parant par des virgules).</p> </li> </ul> <ul> <li> <p><code>headers</code></p> <p>Un tableau de type cl\u00e9/valeur ou la cl\u00e9 est le nom d'un header \u00e0 ajouter au mail et la valeur est la valeur de l'header en question.</p> </li> </ul> <ul> <li> <p><code>checkDomain</code></p> <p>Bool\u00e9en d\u00e9finissant si le domaine de l'adresse mail doit \u00eatre valid\u00e9e. *Param\u00e8tre facultatif, par d\u00e9faut: <code>True</code></p> </li> </ul> <ul> <li> <p><code>domain</code></p> <p>Nom de domaine obligatoire lors de la validation de l'adresse mail. Ce param\u00e8tre peut \u00eatre une simple chaine correspondant au domaine ou un tableau listant plusieurs domaines valides. Param\u00e8tre facultatif, par d\u00e9faut tous les domaines sont accept\u00e9s.</p> </li> </ul> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_postaladdress/","title":"LSattr_html_postaladdress","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs du type de l'attribut standard postalAddress. Ce type d'attribut permet d'afficher, en plus de l'adresse, un lien compos\u00e9 \u00e0 partir d'informations de l'objet permettant par exemple d'afficher un lien vers une carte g\u00e9ocalisant l'adresse postale.</p> <p>Par d\u00e9faut, le lien ajout\u00e9 sera un lien de recherche de l'adresse postale g\u00e9n\u00e9r\u00e9e \u00e0 partir de la valeur de l'attribut (en rempla\u00e7ant les retours \u00e0 la ligne (<code>\\n</code>) par des espaces) via le service Nominatim d'OpenStreetMap.</p> <p>Note</p> <p>Dans le cadre du fonctionnement par d\u00e9faut et pour ma\u00eetriser les valeurs stock\u00e9es dans l'annuaire, il faut coupler ce type d'attribut HTML avec le type d'attribut LDAP postaladdress</p> <pre><code>'html_options' => array(\n 'map_url_pattern_format' => '[LSformat]',\n 'map_url_pattern_generate_function' => '[callable]',\n 'map_url_format' => '[LSformat]',\n),\n...\n</code></pre> <ul> <li> <p><code>map_url_pattern_format</code></p> <p>Ce LSformat doit permettre de g\u00e9n\u00e9rer la valeur de l'adresse postale qui sera ins\u00e9r\u00e9e dans l'URL du lien ajout\u00e9 dans l'interface.</p> </li> </ul> <ul> <li> <p><code>map_url_pattern_generate_function</code></p> <p>Ce param\u00e8tre permet de d\u00e9finir une fonction qui sera utilis\u00e9e \u00e0 la place du param\u00e8tre <code>map_url_pattern_format</code> pour g\u00e9n\u00e9rer la valeur de l'adresse postale qui sera ins\u00e9r\u00e9e dans l'URL du lien ajout\u00e9 dans l'interface. Cette fonction prendra en param\u00e8tre l'objet LSformElement courant et devra retourner une cha\u00eene de caract\u00e8res correspondant \u00e0 l'adresse postale \u00e0 ins\u00e9rer dans le lien de l'interface. Par d\u00e9faut, la fonction <code>LSformElement_postaladdress__generate_pattern</code> est utilis\u00e9e.</p> </li> </ul> <ul> <li> <p><code>map_url_format</code></p> <p>Ce LSformat doit permettre de g\u00e9n\u00e9rer l'URL du lien ajout\u00e9 dans l'interface. Il sera compos\u00e9 avec les informations de l'objet LDAP, y compris le mot cl\u00e9 <code>%{pattern}</code> correspondant \u00e0 la valeur de l'adresse postale g\u00e9n\u00e9r\u00e9e \u00e0 l'aide des param\u00e8tres pr\u00e9c\u00e9dents. Par d\u00e9faut, la format suivant sera utilis\u00e9 : <code>http://nominatim.openstreetmap.org/search.php?q=%{pattern}</code></p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_pre/","title":"LSattr_html_pre","text":"<p>Ce type est d\u00e9riv\u00e9 du type LSattr_html_textarea et permet simplement que lors de l'affichage de la valeur, celle-ci soit affich\u00e9e en respectant les retours \u00e0 la ligne et en utilisant une police de caract\u00e8res <code>monospace</code>. Cela reproduit l'affichage d'une balise HTML <code>pre</code>.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_rss/","title":"LSattr_html_rss","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est l'URL d'un flux RSS. Il propose directement dans l'interface, la possibilit\u00e9 d'acc\u00e8der au flux RSS.</p> <p>Important</p> <p>Ce type d'attribut HTML est d\u00e9riv\u00e9 du type text. Il profite donc de toutes les fonctionnalit\u00e9s d'un champ de ce type (autog\u00e9n\u00e9ration, ...).</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_sambaAcctFlags/","title":"LSattr_html_sambaAcctFlags","text":"<p>Ce type est pr\u00e9vu pour g\u00e9rer l'attribut sambaAcctFlags du sch\u00e9ma Samba, qui au travers d'une seule et unique valeur, respectant un format pr\u00e9vu, liste l'ensemble des drapeaux actifs d'un compte Samba. Il est con\u00e7u pour \u00eatre utilis\u00e9 conjointement avec le type d'attribut LDAP LSattr_ldap_sambaAcctFlags.</p> <p>Pour d\u00e9finir la valeur par d\u00e9faut de cet attribut, il faut d\u00e9finir param\u00e8tre <code>default_value</code> comme un tableau des drapeaux telque pr\u00e9vu par Samba :</p> <p>- <code>U</code></p> <pre><code>Compte utilisateur standard\n</code></pre> <p>- <code>W</code></p> <pre><code>Compte de poste de travail approuv\u00e9\n</code></pre> <p>- <code>S</code></p> <pre><code>Compte de serveur approuv\u00e9\n</code></pre> <p>- <code>I</code></p> <pre><code>Compte de domaine approuv\u00e9\n</code></pre> <p>- <code>M</code></p> <pre><code>Compte de connexion Majority Node Set (MNS)\n</code></pre> <p>- <code>H</code></p> <pre><code>Dossier personnel requis\n</code></pre> <p>- <code>N</code></p> <pre><code>Compte sans mot de passe\n</code></pre> <p>- <code>X</code></p> <pre><code>Le mot de passe n'expire jamais\n</code></pre> <p>- <code>D</code></p> <pre><code>Compte d\u00e9sactiv\u00e9\n</code></pre> <p>- <code>T</code></p> <pre><code>Copie temporaire d'un autre compte\n</code></pre> <p>- <code>L</code></p> <pre><code>Compte automatiquement bloqu\u00e9\n</code></pre> <pre><code> Exemple de valeur par d\u00e9faut...\n'default_value' => array('U', 'X'),\n...\n</code></pre> <p>Note</p> <p>Ce type d'attribut est impl\u00e9ment\u00e9 en d\u00e9rivant le type LSattr_html_select_box dont les valeurs possibles sont pr\u00e9-configur\u00e9es (param\u00e8tre <code>possible_values</code>). M\u00eame si cela n'est pas forc\u00e9ment utiles, les autres param\u00e8tres du type parent restent utilisables.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_select_box/","title":"LSattr_html_select_box","text":"<p>Ce type est identique au type LSattr_html_select_list except\u00e9 qu'il utilise en lieu et place d'une balise HTML <code>select</code>, plusieurs balises HTML <code>input</code> de type <code>checkbox</code> en cas de valeurs multiples ou de type <code>radio</code> en cas de valeur unique. Les param\u00e8tres de configuration de la classe LSattr_html_select_list sont tous h\u00e9rit\u00e9s et fonctionnent donc de la m\u00eame mani\u00e8re. Par ailleurs, ce type dispose \u00e9galement de param\u00e8tres qui lui sont propre (voir ci-dessous).</p> <pre><code>'html_options' => array (\n 'inline' => [Bool\u00e9en],\n),\n...\n</code></pre> <ul> <li> <p><code>inline</code></p> <p>Bool\u00e9en d\u00e9finissant si les valeurs possibles doivent \u00eatre affich\u00e9es sur une m\u00eame ligne ou non (Faux par d\u00e9faut).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_select_list/","title":"LSattr_html_select_list","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont les valeurs font partie d'une liste statique ou dynamique. Il est possible de lister des valeurs statiques et \u00e9galement des r\u00e9f\u00e9rences \u00e0 d'autres LSobjects. La r\u00e9f\u00e9rence \u00e0 un objet correspond \u00e0 une valeur cl\u00e9, r\u00e9f\u00e9rente \u00e0 un objet pr\u00e9cis, qui peut \u00eatre soit la valeur d'un de ses attributs, soit son DN.</p> <pre><code>'html_options' => array (\n 'possible_values' => array (\n '[LSformat de la valeur cl\u00e9]' => '[LSformat du nom d'affichage]',\n ...\n 'OTHER_OBJECT' => array (\n 'object_type' => '[Type d'LSobject]',\n 'display_name_format' => '[LSformat du nom d'affichage des LSobjects]',\n 'value_attribute' => '[Nom de l'attribut cl\u00e9]',\n 'values_attribute' => '[Nom de l'attribut cl\u00e9 multi-valeur]',\n 'filter' => '[Filtre de recherche des LSobject]',\n 'scope' => '[Scope de la recherche]',\n 'basedn' => '[Basedn de la recherche]',\n 'onlyAccessible' => '[Bool\u00e9en]'\n ),\n 'OTHER_ATTRIBUTE' => '[attr]',\n // Or :\n 'OTHER_ATTRIBUTE' => array(\n '[attr1]' => '[label1]',\n '[attr2]' => '[label2]',\n [...]\n ),\n // Or :\n 'OTHER_ATTRIBUTE' => array(\n 'attr' => [attr],\n 'json_component_key' => '[Composant JSON cl\u00e9]',\n 'json_component_label' => '[Composant JSON label]',\n ),\n array (\n 'label' => '[LSformat du nom du groupe de valeurs]',\n 'possible_values' => array (\n '[LSformat de la valeur cl\u00e9]' => '[LSformat du nom d'affichage]',\n ...\n 'OTHER_OBJECT' => array (\n ...\n )\n )\n )\n ),\n 'get_possible_values' => [callable],\n 'translate_labels' => [bool\u00e9en],\n 'sort' => [Bool\u00e9en],\n 'sortDirection' => '[ASC|DESC]'\n),\n...\n</code></pre> <ul> <li> <p><code>possible_values</code></p> <p>Tableau associatif obligatoire contenant en valeur cl\u00e9 le LSformat des valeurs cl\u00e9s prisent par l'attribut et en valeurs associ\u00e9es, le LSformat des noms d'affichage de ces valeurs. Ces LSformats sont compos\u00e9s \u00e0 partir des valeurs de l'objet courant (attributs, dn, ...).</p> <p>Si la valeur cl\u00e9 est \u00e9gale \u00e0 <code>OTHER_OBJECT</code>, une liste d'LSobject sera ins\u00e9r\u00e9e dans la liste des valeurs possibles. La valeur associ\u00e9e est alors un tableau associatif dont les valeurs cl\u00e9s sont les noms des param\u00e8tres de configuration de la recherche de ces LSobjects et les valeurs associ\u00e9es, les valeurs des param\u00e8tres.</p> <p>Il est possible de regrouper des valeurs de l'attribut en pla\u00e7ant leur d\u00e9claration dans un sous-tableau. Ce sous-tableau devra contenir la cl\u00e9 <code>label</code> dont la valeur associ\u00e9 sera le LSformat du nom du groupe de valeurs. Ce LSformat est compos\u00e9 \u00e0 partir des valeurs de l'objet courant (attributs, dn, ...). Une seconde cl\u00e9 <code>possible_values</code> regroupera les valeurs possibles du groupe. Comme pour le tableau principal, la cl\u00e9 <code>OTHER_OBJECT</code> permet d'imcorporer une liste d'LSobject.</p> <ul> <li> <p><code>object_type</code></p> <p>Nom du type d'LSobject en r\u00e9f\u00e9rence.</p> </li> </ul> <ul> <li> <p><code>display_name_format</code></p> <p>LSformat du nom d'affichage des objets lors de leur s\u00e9lection.</p> </li> </ul> <ul> <li> <p><code>value_attribute</code></p> <p>Nom de l'attribut des LSobjects en r\u00e9f\u00e9rence servant de valeur cl\u00e9 et permettant de les identifier (Exemple : <code>dn</code> ou <code>uid</code>).</p> </li> </ul> <ul> <li> <p><code>values_attribute</code></p> <p>Nom de l'attribut des LSobjects en r\u00e9f\u00e9rence servant de catalogue de valeurs. Dans ce mode, la valeur n'a pas de label et est affich\u00e9e directement dans l'interface. Ce param\u00e8tre peut-\u00eatre utilis\u00e9 en compl\u00e9ment ou non du param\u00e8tre <code>value_attribute</code>.</p> </li> </ul> <ul> <li> <p><code>filter</code></p> <p>Filtre falcultatif de la recherche des LSobjets. Il sera dans tous les cas agr\u00e9ment\u00e9 des valeurs des objectclass du type d'LSobject.</p> </li> </ul> <ul> <li> <p><code>scope</code></p> <p>Scope falcultatif de la recherche des LSobjets.</p> </li> </ul> <ul> <li> <p><code>basedn</code></p> <p>Basedn falcultatif de la recherche des LSobjets.</p> </li> </ul> <ul> <li> <p><code>onlyAccessible</code></p> <p>Bool\u00e9en falcultatif d\u00e9finissant si seul les LSobjets auxquels l'utilisateur connect\u00e9 \u00e0 acc\u00e8s doivent \u00eatre consid\u00e9r\u00e9s comme s\u00e9lectionnables (Faux par d\u00e9faut).</p> </li> </ul> <p>Si la valeur cl\u00e9 est \u00e9gale \u00e0 <code>OTHER_ATTRIBTE</code>, une liste de valeur possible sera compos\u00e9e \u00e0 l'aide des valeurs d'un (ou plusieurs) autre attribut de l'objet courant. La valeur associ\u00e9e peut \u00eatre alors\u00a0:</p> <ul> <li>soit le nom d'un attribut dont les valeurs seront utilis\u00e9es comme valeurs possibles (la valeur affich\u00e9e est \u00e9gale \u00e0 la valeur stock\u00e9e).</li> </ul> <ul> <li>soit un tableau associatif dont les valeurs cl\u00e9s sont les noms des attributs dont les valeurs seront utilis\u00e9s comme valeurs possibles et dont les valeurs associ\u00e9s seront les labels sous lesquels ces valeurs seront regroup\u00e9es (la valeur affich\u00e9e est \u00e9gale \u00e0 la valeur stock\u00e9e).</li> </ul> <ul> <li>soit un tableau associatif r\u00e9f\u00e9ren\u00e7ant un attribut sous la cl\u00e9 <code>attr</code> dont les valeurs seront utilis\u00e9es comme valeurs possibles. Cet attribut peut-\u00eatre du type LSattr_html_jsonCompositeAttribute. Il sera alors possible d'utiliser les valeurs d'un composant en particulier en le r\u00e9f\u00e9ren\u00e7ant \u00e0 l'aide de la cl\u00e9 <code>json_component_key</code>. Il est \u00e9galement possible de r\u00e9f\u00e9rencer un autre composant \u00e0 l'aide de la cl\u00e9 <code>json_component_label</code> et dont les valeurs seront utilis\u00e9es comme valeurs affich\u00e9es lors de la s\u00e9lection. \u00c0 d\u00e9faut, les valeurs affich\u00e9es seront identiques \u00e0 celles stock\u00e9es.</li> </ul> </li> </ul> <ul> <li> <p><code>get_possible_values</code></p> <p>Param\u00e8tre permettant de sp\u00e9cifier un callable qui sera utilis\u00e9 pour lister les valeurs possibles de l'attribut. Il recevra en param\u00e8tres les informations suivantes:</p> <ul> <li> <p><code>$options</code></p> <p>Les options HTML de l'attribut.</p> </li> </ul> <ul> <li> <p><code>$name</code></p> <p>Le nom de l'attribut.</p> </li> </ul> <ul> <li> <p><code>&$ldapObject</code></p> <p>Une r\u00e9f\u00e9rence \u00e0 l'objet <code>LSldapObject</code>.</p> </li> </ul> <p>La valeur de retour attendue est un tableau associatif des valeurs possibles de l'attribut avec la valeur que prendra l'attribut en tant que cl\u00e9 et le label correspondant en tant que valeur. Tout autre retour sera consid\u00e9r\u00e9 comme un \u00e9chec et d\u00e9clenchera une erreur.</p> <p>Il est \u00e9galement possible de regrouper des valeurs possibles de l'attribut: pour cela, le tableau retourn\u00e9 devra lui-m\u00eame contenir un tableau associatif contenant la label traduit du groupe sous la cl\u00e9 <code>label</code> et les valeurs possibles du groupe sous la cl\u00e9 <code>possible_values</code>.</p> <p>Les valeurs retourn\u00e9es pourront \u00eatre combin\u00e9es avec les autres valeurs possibles configur\u00e9es de l'attribut. La prise en charge du tri des valeurs possibles est assur\u00e9e par la fonction appelante sauf dans le cas des sous-groupes de valeurs possibles. Dans ce cas, la m\u00e9thode <code>LSattr_html_select_list :: _sort()</code> pourra \u00eatre utilis\u00e9e pour trier les valeurs du sous-groupe : cette m\u00e9thode accepte en param\u00e8tre une r\u00e9f\u00e9rence du tableau des valeurs possibles ainsi que les options HTML de l'attribut.</p> <p>Si la traduction des labels des valeurs possibles de l'attribut est activ\u00e9es (voir ci-dessous), celle-ci doit \u00eatre prise en charge par la fonction configur\u00e9e.</p> </li> </ul> <ul> <li> <p><code>translate_labels</code></p> <p>Bool\u00e9en permettant d'activer/d\u00e9sactiver la traduction des labels (Par d\u00e9faut : <code>True</code>).</p> </li> </ul> <ul> <li> <p><code>sort</code></p> <p>Bool\u00e9en d\u00e9finissant si les valeurs possibles doivent \u00eatre tri\u00e9es ou non (Vrai par d\u00e9faut). Le trie est effectu\u00e9 sur les libell\u00e9s des valeurs possibles.</p> </li> </ul> <ul> <li> <p><code>sortDirection</code></p> <p>Mot cl\u00e9 d\u00e9terminant le sens du trie des valeurs possibles.</p> <p>Valeurs possibles : <code>ASC</code> ou <code>DESC</code> (<code>ASC</code> par d\u00e9faut).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_select_object/","title":"LSattr_html_select_object","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont les valeurs sont des r\u00e9f\u00e9rences \u00e0 d'autres LSobjects. Chaque r\u00e9f\u00e9rence \u00e0 un objet correspond \u00e0 une valeur prise par l'attribut. Les valeurs cl\u00e9s r\u00e9f\u00e9rant \u00e0 un LSobject sont soit la valeur d'un de leurs attributs, soit leur DN.</p> <pre><code>'html_options' => array (\n selectable_object => array (\n array (\n 'object_type' => '[Type d'LSobject selectionnable]',\n 'display_name_format' => '[LSformat du nom d'affichage des LSobjects]',\n 'value_attribute' => '[Nom de l'attribut cl\u00e9 des LSobjects]',\n 'filter' => '[Filtre de recherche]',\n 'onlyAccessible' => '[Bool\u00e9en]'\n ),\n [...]\n ),\n 'ordered' => [Bool\u00e9en],\n 'sort' => [Bool\u00e9en],\n 'sortDirection' => '[ASC|DESC]'\n),\n...\n</code></pre> <ul> <li> <p><code>selectable_object</code></p> <p>Tableau dont chaque valeur correspond \u00e0 un tableau associatif sp\u00e9cifiant un type d'LSobject s\u00e9lectionnable. Pour chaque type d'objet s\u00e9lectionnable, les param\u00e8tres suivants doivent \u00eatre renseign\u00e9s :</p> <ul> <li> <p><code>object_type</code></p> <p>Nom du type d'LSobject en r\u00e9f\u00e9rence (Param\u00e8tre obligatoire).</p> </li> </ul> <ul> <li> <p><code>display_name_format</code></p> <p>LSformat du nom d'affichage des objets lors de leur s\u00e9lection (Param\u00e8tre facultatif).</p> </li> </ul> <ul> <li> <p><code>value_attribute</code></p> <p>Nom de l'attribut des LSobjects en r\u00e9f\u00e9rence servant de valeur cl\u00e9 et permettant de les identifier (Param\u00e8tre obligatoire, exemples : <code>dn</code> ou <code>uid</code>).</p> </li> </ul> <ul> <li> <p><code>filter</code></p> <p>Filtre de recherche qui sera ajouter au filtre par d\u00e9faut lors de la s\u00e9lection des objets (Param\u00e8tre facultatif).</p> </li> </ul> <ul> <li> <p><code>onlyAccessible</code></p> <p>Bool\u00e9en d\u00e9finissant si seul les LSobjets auxquels l'utilisateur connect\u00e9 \u00e0 acc\u00e8s doivent \u00eatre consid\u00e9r\u00e9s comme s\u00e9lectionnables (Param\u00e8tre facultatif, par d\u00e9faut: <code>False</code>).</p> </li> </ul> </li> </ul> <ul> <li> <p><code>ordered</code></p> <p>Bool\u00e9en d\u00e9finissant si la liste des objets choisis doit \u00eatre ordonnable ou non (Param\u00e8tre facultatif, par d\u00e9faut: <code>False</code>). Cela aura pour effet d'activer une fonctionnalit\u00e9 dynamique de l'interface permettant de remonter ou descendre dans la liste les objets choisis.</p> <p>Note</p> <p>Cette fonctionnalit\u00e9 d\u00e9sactive automatiquement le trie des objets \u00e0 l'affichage.</p> </li> </ul> <ul> <li> <p><code>sort</code></p> <p>Bool\u00e9en d\u00e9finissant si la liste des objets choisis doit \u00eatre tri\u00e9e ou non (Param\u00e8tre facultatif, par d\u00e9faut: <code>True</code>). Le trie est effectu\u00e9 sur les libell\u00e9s des objets choisis.</p> </li> </ul> <ul> <li> <p><code>sortDirection</code></p> <p>Mot cl\u00e9 d\u00e9terminant le sens du trie des objets choisis.</p> <p>Valeurs possibles : <code>ASC</code> ou <code>DESC</code> (<code>ASC</code> par d\u00e9faut).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_ssh_key/","title":"LSattr_html_ssh_key","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une clef publique SSH. Il permet dans l'interface, d'avoir un affichage adapt\u00e9 \u00e0 ce type de donn\u00e9e.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_tel/","title":"LSattr_html_tel","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un num\u00e9ro de t\u00e9l\u00e9phone. Lors de l'affichage, un lien hypertexte avec une URI de type <code>tel:~~</code> est affich\u00e9.</p> <p>Important</p> <p>Ce type d'attribut HTML est d\u00e9riv\u00e9 du type text. Il profite donc de toutes les fonctionnalit\u00e9s d'un champ de ce type (autog\u00e9n\u00e9ration, ...).</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_text/","title":"LSattr_html_text","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une cha\u00eene de caract\u00e8res devant \u00eatre affich\u00e9e dans un champ input HTML de type text.</p> <pre><code>'html_options' => array(\n 'generate_value_format' => '[LSformat pour la g\u00e9n\u00e9ration de la valeur]',\n 'autoGenerateOnCreate' => [bool\u00e9en],\n 'autoGenerateOnModify' => [bool\u00e9en],\n 'withoutAccent' => [booleen],\n 'replaceSpaces' => \"[cha\u00eene de remplacement]\",\n 'upperCase' => [booleen],\n 'lowerCase' => [booleen],\n\n // Autocompl\u00e9tion\n 'autocomplete' => array (\n 'object_type' => '[Type d'LSobject]', // facultatif (voir ci-dessous)\n 'value_attributes' => array (\n '[attr1]',\n '[attr2]',\n [...]\n ),\n 'filter' => '[filtre LDAP]',\n 'basedn' => '[base DN sp\u00e9cifique]',\n 'scope' => '[scope de recherche]',\n 'displayFormat' => '[LSformat]',\n 'onlyAccessible' => [bool\u00e9en],\n ),\n\n),\n...\n</code></pre> <ul> <li> <p><code>generate_value_format</code></p> <p>LSformat de la valeur utilis\u00e9e pour la g\u00e9n\u00e9ration automatique de celle-ci \u00e0 partir des informations saisies dans le formulaire. Les valeurs clefs du format sont les noms des attributs de l'objet. Seuls les attributs affich\u00e9s au moins en lecture seule dans le formulaire peuvent \u00eatre utilis\u00e9s dans le format. Une seule valeur par attribut sera utilis\u00e9e pour la g\u00e9n\u00e9ration : celle du premier champ (dans l'ordre d'apparition dans le formulaire).</p> <p>Important</p> <p>Seuls les \u00e9l\u00e9ments du formulaire de type HTML input, select ou textarea peuvent \u00eatre utilis\u00e9s.</p> </li> </ul> <ul> <li> <p><code>autoGenerateOnCreate</code></p> <p>Activation de la g\u00e9n\u00e9ration automatique lorsque celui-ci est vide au moment du chargement du formulaire (par d\u00e9faut : <code>False</code>).</p> </li> </ul> <ul> <li> <p><code>autoGenerateOnModify</code></p> <p>Activation de la g\u00e9n\u00e9ration automatique lors de chaque modification de la valeur des champs du formulaire li\u00e9 (par d\u00e9faut : <code>False</code>).</p> </li> </ul> <ul> <li> <p><code>withoutAccent</code></p> <p>Activation de la suppression des accents dans la cha\u00eene de caract\u00e8res g\u00e9n\u00e9r\u00e9e automatiquement (par d\u00e9faut : <code>False</code>).</p> </li> </ul> <ul> <li> <p><code>withoutAccent</code></p> <p>Activation du remplacement des accents dans la cha\u00eene de caract\u00e8res g\u00e9n\u00e9r\u00e9e automatiquement. La valeur de remplacement est celle du param\u00e8tre (par d\u00e9faut : <code>False</code>).</p> </li> </ul> <ul> <li> <p><code>upperCase</code></p> <p>Activation de la mise en majuscule de la valeur g\u00e9n\u00e9r\u00e9e automatiquement (par d\u00e9faut : <code>False</code>).</p> </li> </ul> <ul> <li> <p><code>lowerCase</code></p> <p>Activation de la mise en minuscule de la valeur g\u00e9n\u00e9r\u00e9e automatiquement (par d\u00e9faut : <code>False</code>).</p> </li> </ul> <ul> <li> <p><code>autocomplete</code></p> <p>Param\u00e8trage de l'autocompl\u00e9tion des valeurs saisies : on param\u00e8tre ici la recherche des valeurs possibles de l'attribut dans l'annuaire qui peut se faire :</p> <ul> <li>Sur la base d'un type d'LSobject donn\u00e9 : l'autocompl\u00e9tion se fera alors comme n'importe quelle recherche d'un type d'objet donn\u00e9.</li> </ul> <ul> <li>Sur la base d'une recherche brute dans l'annuaire : l'autocompl\u00e9tion se fera alors au travers une recherche brute dans l'annuaire sur n'importe quels objets ayant un des attributs sp\u00e9cifi\u00e9s dans le param\u00e8tre <code>value_attributes</code> correspondant.</li> </ul> <p>Les param\u00e8tres associ\u00e9s \u00e0 ces deux cas de figure sont d\u00e9crits ci-dessous :</p> <ul> <li> <p><code>object_type</code></p> <p>Le type d'LSobject recherch\u00e9.</p> </li> </ul> <ul> <li> <p><code>value_attributes</code></p> <p>Le(s) nom de l'attribut stockant les valeurs possibles recherch\u00e9es. Il peut s'agir d'une cha\u00eene de caract\u00e8res ou d'un tableau s'il y a plusieurs attributs.</p> </li> </ul> <ul> <li> <p><code>pattern_filter</code></p> <p>Le LSformat du filtre de recherche \u00e0 partir du mot cl\u00e9 recherch\u00e9. Ce param\u00e8tre est facultatif et utile que dans le cas d'une recherche sans type d'LSobject pr\u00e9cis. S'il est d\u00e9fini, ce LSformat sera compos\u00e9 \u00e0 l'aide du mot cl\u00e9 recherch\u00e9. \u00c0 d\u00e9faut, le filtre de recherche sera compos\u00e9 \u00e0 l'aide des diff\u00e9rents <code>value_attributes</code> configur\u00e9s.</p> </li> </ul> <ul> <li> <p><code>filter</code></p> <p>Un filtre de recherche facultatif venant en plus de celui calcul\u00e9 automatiquement \u00e0 partir du mot cl\u00e9 de recherche.</p> </li> </ul> <ul> <li> <p><code>basedn</code></p> <p>Le basedn de la recherche. Param\u00e8tre facultatif.</p> </li> </ul> <ul> <li> <p><code>scope</code></p> <p>Le scope de la recherche. Param\u00e8tre facultatif, par d\u00e9faut : <code>sub</code>.</p> </li> </ul> <ul> <li> <p><code>display_name_format</code></p> <p>Le LSformat d'affichage des objets trouv\u00e9s. Ce param\u00e8tre est facultatif et par d\u00e9faut, il s'agira du format d'affichage propre au type d'LSobject (si d\u00e9fini) et \u00e0 d\u00e9faut, la valeur possible trouv\u00e9e sera affich\u00e9e. Si est configur\u00e9, ce LSformat sera compos\u00e9 \u00e0 l'aide des valeurs brutes des attributs des objets correspondants avec en plus la valeur possible trouv\u00e9e dans le mot cl\u00e9 <code>value</code>.</p> </li> </ul> <ul> <li> <p><code>only_accessible</code></p> <p>Bool\u00e9en falcultatif d\u00e9finissant si seul les LSobjects auxquels l'utilisateur connect\u00e9 \u00e0 acc\u00e8s doivent \u00eatre consid\u00e9r\u00e9s comme s\u00e9lectionnables (Faux par d\u00e9faut). Ce param\u00e8tre n'est appliqu\u00e9 que dans le cas d'une recherche pour un type d'LSobject donn\u00e9.</p> </li> </ul> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_textarea/","title":"LSattr_html_textarea","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une chaine de caract\u00e8res trop longue pour \u00eatre saisie dans un champs HTML imput de type text et est plus adapt\u00e9 \u00e0 un champ HTML textarea.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_url/","title":"LSattr_html_url","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une URL. Il propose directement dans l'interface, la possibilit\u00e9 d'acc\u00e8der au site ou encore de l'ajouter dans ses favoris (lorsque le navigateur le supporte).</p> <p>Important</p> <p>Ce type d'attribut HTML est d\u00e9riv\u00e9 du type text. Il profite donc de toutes les fonctionnalit\u00e9s d'un champ de ce type (autog\u00e9n\u00e9ration, ...).</p>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_valueWithUnit/","title":"LSattr_html_valueWithUnit","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un entier auxquel un facteur peut s'appliquer (par exemple : <code>Kilo, M\u00e9ga, ...</code>).</p> <pre><code>'html_options' => array(\n 'units' => array (\n '[facteur1]' => '[label unit1]',\n '[facteur2]' => '[label unit2]',\n [...]\n ),\n 'translate_labels' => [bool\u00e9en],\n 'nb_decimals' => [number of decimals],\n 'dec_point' => '[decimals point]',\n 'thousands_sep' => '[thousands separator]',\n 'store_integer' => [bool\u00e9en],\n 'round_down' => [bool\u00e9en],\n )\n),\n...\n</code></pre> <ul> <li> <p><code>units</code></p> <p>Tableau associatif dont la cl\u00e9 est un entier correspondant au facteur et la valeur est le label de l'unit\u00e9. (Par exemple : <code>1 => Octet, 1024 => Kilo-octet, ...</code>).</p> </li> </ul> <ul> <li> <p><code>translate_labels</code></p> <p>Bool\u00e9en permettant d'activer/d\u00e9sactiver la traduction des labels (Par d\u00e9faut : <code>True</code>).</p> </li> </ul> <ul> <li> <p><code>nb_decimals</code></p> <p>Le nombre de d\u00e9cimals \u00e0 afficher en cas de nombre non-entier (Par d\u00e9faut : <code>2</code>).</p> </li> </ul> <ul> <li> <p><code>dec_point</code></p> <p>Le caract\u00e8re \u00e0 utiliser comme s\u00e9parateur de d\u00e9cimal (Par d\u00e9faut, une virgule).</p> </li> </ul> <ul> <li> <p><code>thousands_sep</code></p> <p>Le caract\u00e8re \u00e0 utiliser comme s\u00e9parateur de milliers (Par d\u00e9faut, un espace).</p> </li> </ul> <ul> <li> <p><code>store_integer</code></p> <p>Bool\u00e9en permettant d'activer/d\u00e9sactiver le stockage de valeurs enti\u00e8res (Par d\u00e9faut : <code>True</code>).</p> </li> </ul> <ul> <li> <p><code>round_down</code></p> <p>Bool\u00e9en permettant d'arrondir \u00e0 l'entier inf\u00e9rieur (et non \u00e0 l'entier sup\u00e9rieur par d\u00e9faut) en cas de stockage de valeurs enti\u00e8res.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_wysiwyg/","title":"LSattr_html_wysiwyg","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est du code HTML et dont l'\u00e9dition doit \u00eatre fait \u00e0 l'aide d'un \u00e9diteur WYSIWYG. La librairie TinyMCE est utilis\u00e9e pour cela.</p> <pre><code>'html_options' => array(\n 'extra_options' => array (\n [Options \u00e0 passer \u00e0 TinyMCE]\n ),\n),\n...\n</code></pre> <ul> <li> <p><code>extra_options</code></p> <p>Ce param\u00e8tre permet de passer des options \u00e0 TinyMCE pour personnaliser son comportement. Par exemple, il est possible d'utiliser le param\u00e8tre <code>valid_styles</code> pour d\u00e9finir quels styles CSS sont autoris\u00e9s. Pour plus d'informations, consultez la documentation de TinyMCE .</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_xmpp/","title":"LSattr_html_xmpp","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une adresse XMPP. Il propose directement dans l'interface, la possibilit\u00e9 de lancer une fen\u00eatre de dialogue avec l'interlocuteur de son client XMPP pr\u00e9f\u00e9r\u00e9.</p> <p>Note</p> <p>Cette fonctionnalit\u00e9 n'est support\u00e9 uniquement par les navigateurs web supportant les URI de type <code>xmpp://</code>.</p> <p>Important</p> <p>Ce type d'attribut HTML est d\u00e9riv\u00e9 du type text. Il profite donc de toutes les fonctionnalit\u00e9s d'un champ de ce type (autog\u00e9n\u00e9ration, ...).</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/","title":"Configuration des attributs LDAP (LSattr_ldap)","text":"<p>Cette section d\u00e9crit les options propres \u00e0 chacun des types d'attributs LDAP support\u00e9s par LdapSaisie.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_ascii/","title":"LSattr_ldap_ascii","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une chaine de caract\u00e8re. Ce type est le type par d\u00e9faut.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_boolean/","title":"LSattr_ldap_boolean","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une bool\u00e9en. On attend ici par bool\u00e9en, tout attribut ne pouvant prendre que deux valeurs pr\u00e9-d\u00e9finies correspond pour l'un \u00e0 Oui et l'autre \u00e0 Non</p> <pre><code>'ldap_options' => array (\n 'true_value' => '[valeur correspondant \u00e0 Vrai]',\n 'false_value' => '[valeur correspondant \u00e0 Faux]'\n),\n...\n</code></pre> <ul> <li> <p><code>true_value</code></p> <p>La valeur de l'attribut correspondant \u00e0 Vrai\u00ad. (Par d\u00e9faut : <code>TRUE</code>)</p> </li> </ul> <ul> <li> <p><code>false_value</code></p> <p>La valeur de l'attribut correspondant \u00e0 <code>False</code>\u00ad. (Par d\u00e9faut : <code>FALSE</code>)</p> </li> </ul> <p>Important</p> <p>Les valeurs possibles pour le param\u00e8tre <code>default_value</code> sont <code>yes</code> et <code>no</code>.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_compositeValueToJSON/","title":"LSattr_ldap_compositeValueToJSON","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs composites dont les valeurs respectent le format suivant : <code>[key1=value1][key2=value2][...]</code></p> <p>Ce type d'attribut LDAP sera utilis\u00e9 pour convertir la valeur en son \u00e9quivalent <code>JSON</code> pour pouvoir \u00eatre trait\u00e9 \u00e0 l'aide du type d' attribut HTML LSattr_html_jsonCompositeAttribute.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_date/","title":"LSattr_ldap_date","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une date.</p> <p>Note</p> <p>Au sein d'LdapSaisie, les dates manipul\u00e9es au travers ce type d'attribut LDAP, sont au format timestamp. Il s'agit donc de nombres entiers correpondants au nombre de secondes depuis le 1 janvier 1970.</p> <p>Le type d'attribut HTML utilis\u00e9 conjointement avec ce type d'attribut LDAP devra \u00eatre pr\u00e9vu pour recevoir et fournir des dates au format timestamp, comme c'est le cas pour le type d'attribut HTML date.</p> <pre><code>'ldap_options' => array (\n 'timestamp' => [Bool\u00e9en], // Si la date est stock\u00e9e au format timestamp\n 'formats' => array(\n '[Format de stockage principal]', // Par d\u00e9faut : \"YmdHisO\"\n '[Formats de stockage alternatifs]', // Par d\u00e9faut : \"YmdHis.vO\" & \"YmdHis.uO\"\n [...]\n ),\n 'timezone' => '[Fuseau horaire]', // Default : \"UTC\"\n),\n...\n</code></pre> <ul> <li> <p><code>timestamp</code></p> <p>Bool\u00e9en d\u00e9finissant si la date est stock\u00e9e sous la forme d'un timestamp Unix (nombre de secondes depuis le 1er janvier 1970 \u00e0 00:00:00 UTC)\u00ad.</p> <p>Si <code>timestamp</code> est vrai, LdapSaisie ne tient pas compte du param\u00e8tre format.</p> </li> </ul> <ul> <li> <p><code>formats</code></p> <p>Formats de stockage de la date dans l'annuaire. Ces formats sont compos\u00e9s \u00e0 partir des motifs cl\u00e9s g\u00e9r\u00e9s par la fonction <code>date()</code> de PHP. Pour plus d'information, consulter la documentation officielle. Plusieurs formats peuvent \u00eatre d\u00e9finis, mais en cas de stockage d'une nouvelle valeur, se sera le premier format d\u00e9fini qui sera utilis\u00e9.</p> <p>Note</p> <p>La valeur par d\u00e9faut est [\"YmdHisO\", \"YmdHis.vO\", \"YmdHis.uO\"], correspondant \u00e0 la syntaxe <code>Generalized Time</code> (sans et avec les milli-secondes ou micro-secondes) telle que d\u00e9finie dans la RFC4517. Exemples : <code>20091206230506Z</code> (=2009/12/06 23:05:66 UTC), <code>20190613143537+0200</code> (=2019/06/13 14:35:37 UTC+0200) ou <code>20230818121005.307+0200</code> (=2023/08/18 12:10:05.307 UTC+0200).</p> <p>Warning</p> <p>Si vous exploitez un attribut stockant une date incluant les milli-secondes ou les micro-secondes, ce type d'attribut LDAP sera capable de g\u00e9rer l'interpratation des valeurs stock\u00e9es, en outre le type d'attribut LSattr_html_date, s'appuyant sur les m\u00e9thodes standards <code>strftime()</code> et <code>strptime()</code>, ne permettra pas aujourd'hui leur saisie et affichage.</p> </li> </ul> <ul> <li> <p><code>timezone</code></p> <p>Fuseau horaire de stockage des dates dans l'annuaire LDAP. Les valeurs possibles sont document\u00e9es dans la documentation officielle de PHP. (Par d\u00e9faut : <code>UTC</code>)</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_image/","title":"LSattr_ldap_image","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une image. Pour le moment, aucun traitement particulier n'est appliqu\u00e9 pour le stockage.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_naiveDate/","title":"LSattr_ldap_naiveDate","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une date dont la timezone doit \u00eatre ignor\u00e9e. C\u00f4t\u00e9 LDAP, les dates seront stock\u00e9es au format UTC \u00e9tant donn\u00e9e que la syntaxe LDAP exige une timezone, cependant celle-ci sera compl\u00e8tement ignor\u00e9e. Ce type peut-\u00eatre utilis\u00e9 \u00e0 la place du type LSattr_ldap_date.</p> <pre><code>'ldap_options' => array (\n 'format' => '[Format de stockage]', // Default : \"%Y%m%d%H%M%SZ\"\n),\n...\n</code></pre> <ul> <li> <p><code>format</code></p> <p>Format de stockage de la date dans l'annuaire. Ce format est compos\u00e9 \u00e0 partir des motifs cl\u00e9s g\u00e9r\u00e9s par la fonction <code>strftime()</code> de PHP. Pour plus d'information, consulter la documentation officielle.</p> <p>Note</p> <p>La valeur par d\u00e9faut est %Y%m%d%H%M%SZ, correspondant \u00e0 la syntaxe <code>Generalized Time</code> (sans les micro-secondes) telle que d\u00e9finie dans la RFC4517. Exemple : <code>20091206230506Z</code> (=2009/12/06 23:05:66 UTC).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_numeric/","title":"LSattr_ldap_numeric","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un nombre. Pour le moment, aucun traitement particulier est n'appliqu\u00e9 pour le stockage.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_password/","title":"LSattr_ldap_password","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un mot de passe.</p> <pre><code>'ldap_options' => array (\n 'encode' => '[Type d'encodage du mot de passe]',\n 'encode_function' => '[Nom de la fonction d'encodage]',\n 'verify_function' => '[Nom de la fonction de v\u00e9rification]',\n 'no_random_crypt_salt' => '[Bool\u00e9en]', // D\u00e9sactivation de l'utilisation d'une salt al\u00e9atoire\n 'wildcardPassword' => '[mot de passe(s) en clair]',\n 'encodedWildcardPassword' => '[mot de passe(s) encod\u00e9(s)]'\n),\n...\n</code></pre> <ul> <li> <p><code>encode</code></p> <p>Nom du type d'encodage du mot de passe utilis\u00e9. Les types d'encodages support\u00e9s sont les suivants :</p> <ul> <li><code>argon2</code> (ou <code>argon2i</code>, PHP >= 7.2)</li> <li><code>argon2id</code> (PHP >= 7.3)</li> <li><code>md5crypt</code></li> <li><code>crypt</code></li> <li><code>ext_des</code></li> <li><code>blowfish</code></li> <li><code>sha</code></li> <li><code>sha256</code></li> <li><code>sha512</code></li> <li><code>ssha</code></li> <li><code>ssha256</code></li> <li><code>ssha512</code></li> <li><code>smd5</code></li> <li><code>md5</code></li> <li><code>clear</code></li> </ul> <p>Note</p> <p>Valeur par d\u00e9faut : <code>md5crypt</code></p> <p>Important</p> <p>Si le type d'encodage est inconnu, ou qu'il n'est pas support\u00e9 par le serveur web, un message d'erreur alertera l'utilisateur et le mot de passe sera stock\u00e9 en clair.</p> </li> </ul> <ul> <li> <p><code>encode_function</code></p> <p>Nom d'une function qui sera utilis\u00e9e afin d'encoder le mot de passe. Cette fonction recevra deux param\u00e8tres : le <code>LSldapObject</code> et le mot de passe en clair.</p> </li> </ul> <ul> <li> <p><code>verify_function</code></p> <p>Nom d'une function qui sera utilis\u00e9e afin de valider un mot de passe soumis par l'utilisateur par rapport \u00e0 celui stock\u00e9 dans l'annuaire. Cette fonction recevra trois param\u00e8tres : le <code>LSldapObject</code>,le mot de passe en clair et le mot de passe hash\u00e9. Si ce param\u00e8tre est omis et que le param\u00e8tre <code>encode_function</code> est d\u00e9fini, le mot de passe \u00e0 tester sera encod\u00e9 \u00e0 nouveau \u00e0 l'aide de la fonction <code>encode_function</code> et le r\u00e9sultat sera compar\u00e9 avec le mot de passe stock\u00e9 dans l'annuaire.</p> </li> </ul> <ul> <li> <p><code>no_random_crypt_salt</code></p> <p>D\u00e9sactivation de l'utilisation d'une salt g\u00e9n\u00e9r\u00e9e al\u00e9atoirement au profit de l'utilisation des deux premiers caract\u00e8res du mot de passe. Ce param\u00e8tre impacte uniquement le type de cryptage <code>crypt</code>.</p> </li> </ul> <ul> <li> <p><code>wildcardPassword</code></p> <p>Mot de passe (ou tableau de mot de passe) qui sera ajout\u00e9 syst\u00e9matiquement, en plus du mot de passe choisi. Il sera encod\u00e9 de la m\u00eame mani\u00e8re que pour le mot de passe choisi avant enregistrement.</p> </li> </ul> <ul> <li> <p><code>encodedWildcardPassword</code></p> <p>Mot de passe (ou tableau de mot de passe) qui sera ajout\u00e9 syst\u00e9matiquement, en plus du mot de passe choisi. Contrairement \u00e0 la directive <code>wildcardPassword</code>, le mot de passe ne sera pas encod\u00e9 avant enregistrement.</p> <p>Note</p> <p>Cette directive peut cohabiter avec sa cousine <code>wildcardPassword</code>. Les mot de passes contenus dans les deux directives seront alors ajout\u00e9s.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_postaladdress/","title":"LSattr_ldap_postaladdress","text":"<p>Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est construite sur le mod\u00e8le de l'attribut standard postalAddress, c'est \u00e0 dire dont les lignes sont s\u00e9par\u00e9es \u00e0 l'aide du caract\u00e8re de d\u00e9limiteur <code>$</code>.</p> <p>Lors de la lecture des valeurs de ce type d'attribut dans l'annuaire, les caract\u00e8res <code>$</code> seront remplac\u00e9s par des caract\u00e8res <code>\\n</code> et, \u00e0 l'inverse, lors de l'\u00e9criture des valeurs de ce type d'attribut dans l'annuaire, les caract\u00e8res <code>\\n</code> seront remplac\u00e9s par des caract\u00e8res <code>$</code>.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_pwdHistory/","title":"LSattr_ldap_pwdHistory","text":"<p>Ce type est utilis\u00e9 pour la gestion de l'attribut standard pwdHistory. Cet attribut, accessible en lecture uniquement, stocke dans un format pr\u00e9d\u00e9fini l'historique des mots de passe d'une utilisateur avec pour chaque entr\u00e9e :</p> <ul> <li>la date et heure de l'ajout du mot de passe dans l'historique</li> <li>l'OID de la syntaxe du mot de passe</li> <li>la longueur du mot de passe</li> <li>le mot de passe (h\u00e2ch\u00e9)</li> </ul> <p>Ce type d'attribut LDAP permettra de convertir la valeur en son \u00e9quivalent <code>JSON</code> pour pouvoir \u00eatre trait\u00e9 \u00e0 l'aide du type d'attribut HTML LSattr_html_jsonCompositeAttribute.</p> <p>Exemple de valeur de l'attribut pwdHistory :</p> <pre><code>20201202144718Z#1.3.6.1.4.1.1466.115.121.1.40#105#{SSHA512}XDSiR6Sh6W7gyVIk6Rr2OUv8rNPr+0rHF99d9lcirE/TnnEdkjkncIi5iPubErL5lpfgh8gXLgSfmqvmFcMqXLToC25xIqyk\n</code></pre> <p>Exemple de valeur tranform\u00e9e :</p> <pre><code>{\"time\":1606920438,\"syntaxOID\":\"1.3.6.1.4.1.1466.115.121.1.40\",\"length\":105,\"hashed_password\":\"{SSHA512}XDSiR6Sh6W7gyVIk6Rr2OUv8rNPr+0rHF99d9lcirE/TnnEdkjkncIi5iPubErL5lpfgh8gXLgSfmqvmFcMqXLToC25xIqyk\"}\n</code></pre> <p>Exemple de configuration compl\u00e8te de l'attribut :</p> <pre><code>'pwdHistory' => array (\n 'label' => 'Passwords in history',\n 'ldap_type' => 'pwdHistory',\n 'html_type' => 'jsonCompositeAttribute',\n 'html_options' => array (\n 'components' => array (\n 'time' => array (\n 'label' => 'Date added to history',\n 'type' => 'text',\n 'required' => true,\n 'multiple' => false,\n ),\n 'syntaxOID' => array (\n 'label' => 'Syntax OID',\n 'type' => 'text',\n 'required' => true,\n 'multiple' => false,\n ),\n 'length' => array (\n 'label' => 'Length',\n 'type' => 'text',\n 'required' => true,\n 'multiple' => false,\n ),\n 'hashed_password' => array (\n 'label' => 'Hashed password',\n 'type' => 'text',\n 'required' => true,\n 'multiple' => false,\n ),\n ),\n ),\n 'no_value_label' => 'History is empty.',\n 'multiple' => 1,\n 'rights' => array(\n 'admin' => 'r',\n ),\n 'view' => 1,\n),\n</code></pre> <p>La date et heure de l'ajout du mot de passe dans l'historique est convertie dans un format lisible. Par d\u00e9faut, ce format est <code>AAAA/MM/JJ HH:MM:SS</code>, mais il peut aussi est personnalis\u00e9 via le param\u00e8tre <code>date_format</code>. Ce format est compos\u00e9 \u00e0 partir des motifs cl\u00e9s g\u00e9r\u00e9s par la fonction <code>date()</code> de PHP. Pour plus d'information, consulter la documentation officielle.</p> <p>Note</p> <p>La valeur par d\u00e9faut est YmdHisO, correspondant \u00e0 la syntaxe <code>Generalized Time</code> telle que d\u00e9finie dans la RFC4517 et pr\u00e9vu par le Draft-behera-ldap-password-policy sp\u00e9cifiant cet attribut standard.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_sambaAcctFlags/","title":"LSattr_ldap_sambaAcctFlags","text":"<p>Ce type est pr\u00e9vu pour g\u00e9rer l'attribut sambaAcctFlags du sch\u00e9ma Samba, qui au travers d'une seule et unique valeur, respectant un format pr\u00e9vu, liste l'ensemble des drapeaux actifs d'un compte Samba. Il transforme l'unique valeur de l'attribut LDAP en une liste de drapeaux actuellement activ\u00e9s sur le compte. Il est con\u00e7u pour \u00eatre utilis\u00e9 conjointement avec le type d'attribut HTML LSattr_html_sambaAcctFlags.</p>"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_shadowExpire/","title":"LSattr_ldap_shadowExpire","text":"<p>Ce type est pr\u00e9vu pour g\u00e9rer l'attribut <code>shadowExpire</code> du sch\u00e9ma POSIX, qui une stocke une date sous la forme d'un entier correspondant au nombre de jours depuis le premier 1er 1970. Il est pr\u00e9vu pour \u00eatre utilis\u00e9 conjointement avec le type d'attribut HTML LSattr_html_date.</p> <p>Note</p> <p>Malgr\u00e9s son nom, ce type d'attribut LDAP peux \u00eatre utilis\u00e9 pour d'autres attributs stockant ce m\u00eame format de date, tel-que l'attribut <code>shadowLastChange</code>.</p>"},{"location":"conf/LSobject/LSattribute/check_data/","title":"Configuration des r\u00e8gles de v\u00e9rification syntaxique","text":"<p>Cette section d\u00e9crit la mani\u00e8re de configuer des r\u00e8gles de v\u00e9rification syntaxique sur les donn\u00e9es des attributs. Ces r\u00e8gles seront utilis\u00e9es pour v\u00e9rifier que les valeurs saisies par un utilisateur dans un formulaire sont correctes.</p> <pre><code>'check_data' => array (\n '[regle1]' => array(\n 'msg' => \"[Message d'erreur]\",\n 'params' => array(\n // Param\u00e8tres de la r\u00e8gle\n )\n ),\n ...\n),\n...\n</code></pre> <p>Le param\u00e8tre <code>check_data</code> est un tableau associatif dont les cl\u00e9s sont les noms des r\u00e8gles de v\u00e9rification syntaxique actives et les valeurs associ\u00e9es sont des tableaux associatifs contenant les param\u00e8tres des r\u00e8gles.</p> <ul> <li> <p><code>msg</code></p> <p>Le message d'erreur \u00e0 afficher lors que la r\u00e8gle n'est pas respect\u00e9e (optionnel).</p> </li> </ul> <ul> <li> <p><code>params</code></p> <p>Tableau associatif contenant les param\u00e8tres de la r\u00e8gle. Les param\u00e8tres possibles sont propres \u00e0 chaque type de r\u00e8gle. Les cl\u00e8s sont les noms des param\u00e8tres et les valeurs associ\u00e9s, les valeurs des param\u00e8tres.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/alphanumeric/","title":"alphanumeric","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur est une cha\u00eene de caract\u00e8res compos\u00e9e uniquement de lettres non-accuent\u00e9es, en minuscule ou en majuscule et/ou de chiffres.</p> <ul> <li> <p><code>withAccents</code></p> <p>Si le param\u00e8tre est \u00e0 true, les lettres accentu\u00e9es seront accept\u00e9es.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/callable/","title":"callable","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie est correcte en utilisant une fonction personnalis\u00e9e. Cette fonction devra prendre en param\u00e8tres la valeur \u00e0 valider, le tableau des param\u00e8tres de la r\u00e8gle ainsi qu'un pointeur sur l'objet LSformElement. Sur la base de ses informations, elle devra valider la valeur et retourner <code>True</code> si la valeur est valide et <code>False</code> sinon.</p> <ul> <li> <p><code>callable</code></p> <p>Le nom de la fonction (ou tout autre <code>callable</code> au sens PHP) de validation.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/date/","title":"date","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie est bien une date et qu'elle respecte un format pr\u00e9cis.</p> <ul> <li> <p><code>format</code></p> <p>Format de la date \u00e0 respecter. Ce format doit \u00eatre compatible avec la fonction <code>strftime()</code> de PHP. Voir la documentation de la fonction</p> </li> </ul> <ul> <li> <p><code>special_values</code></p> <p>Tableau listant les valeurs sp\u00e9ciales que peut prendre l'attribut. Dans ce tableau, seules les valeurs sont utilis\u00e9es et les cl\u00e9s n'ont pas d'importance. Ces valeurs sp\u00e9ciales n'auront pas forc\u00e9ment besoin de respecter le format attendu.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/differentPassword/","title":"differentPassword","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie ne correspond pas \u00e0 un des mots de passe stock\u00e9s dans d'autres attributs du m\u00eame objet.</p> <p>Important</p> <p>Les autres attributs doivent utiliser le type d'attribut LDAP LSattr_ldap_password.</p> <ul> <li> <p><code>otherPasswordAttributes</code></p> <p>La liste des autres attributs dont les mots de passe doivent \u00eatre diff\u00e9rent.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/email/","title":"email","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie est bien une adresse e-mail. Il est possible de v\u00e9rifier si elle appartient bien \u00e0 un domaine en particulier ou encore de v\u00e9rifier si le domaine existe et qu'il poss\u00e8de un serveur de mail(MX).</p> <ul> <li> <p><code>domain</code></p> <p>Nom de domaine obligatoire. Ce param\u00e8tre peut \u00eatre une simple chaine correspondant au domaine ou un tableau listant plusieurs domaines possibles.</p> </li> </ul> <ul> <li> <p><code>checkDomain</code></p> <p>Bool\u00e9en d\u00e9finissant si le domaine de l'adresse mail doit \u00eatre valid\u00e9e.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/filesize/","title":"filesize","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur est un fichier dont la taille en octets respecte les limites pass\u00e9es en param\u00e8tre.</p> <ul> <li> <p><code>minSize</code></p> <p>Taille minimum.</p> </li> </ul> <ul> <li> <p><code>maxSize</code></p> <p>Taille maximum.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/imagefile/","title":"imagefile","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur est bien un fichier et que le type mime de celui-ci est bien une image. Cette r\u00e8gle utilise la r\u00e8gle mimetype en sp\u00e9cifiant si l'utilisateur ne le fait pas que le type mime doit respecter la regex suivante : <code>/image\\/.*/</code></p> <p>Important</p> <p>Cette r\u00e8gle est une simple interface \u00e0 la r\u00e8gle mimetype, il est donc possible de passer d'autres param\u00e8tres propres \u00e0 ce type.</p>"},{"location":"conf/LSobject/LSattribute/check_data/imagesize/","title":"imagesize","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur est une image dont la taille en pixels respecte les limites pass\u00e9es en param\u00e8tre.</p> <ul> <li> <p><code>minWidth</code></p> <p>Largeur minimum.</p> </li> </ul> <ul> <li> <p><code>maxWitdh</code></p> <p>Largeur maximum.</p> </li> </ul> <ul> <li> <p><code>minHeight</code></p> <p>Hauteur minimum.</p> </li> </ul> <ul> <li> <p><code>maxHeight</code></p> <p>Hauteur maximum.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/inarray/","title":"inarray","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie fait partie d'une liste de valeurs autoris\u00e9es (ou interdites).</p> <ul> <li> <p><code>possible_values</code></p> <p>Tableau listant les valeurs autoris\u00e9es.</p> </li> </ul> <ul> <li> <p><code>reverse</code></p> <p>Bool\u00e9en permettant d'inverser la logique de validation : si <code>reverse</code> est vrai, la valeur test\u00e9e sera accept\u00e9e si elle ne fait pas partie des valeurs possibles (Param\u00e8tre facultatif, par d\u00e9faut : <code>False</code>).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/integer/","title":"integer","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie est un entier. Les param\u00e8tres permettent de sp\u00e9cifier \u00e9ventuellement si la valeur doit \u00eatre positive ou n\u00e9gative et \u00e9galement de borner les valeurs valides.</p> <ul> <li> <p><code>positive</code></p> <p>Bool\u00e9en d\u00e9finissant si la valeur doit \u00eatre positive.</p> </li> </ul> <ul> <li> <p><code>negative</code></p> <p>Bool\u00e9en d\u00e9finissant si la valeur doit \u00eatre negative.</p> </li> </ul> <ul> <li> <p><code>min</code></p> <p>Valeur minimale (sup\u00e9rieur ou \u00e9gale).</p> </li> </ul> <ul> <li> <p><code>max</code></p> <p>Valeur maximale (inf\u00e9rieur ou \u00e9gale).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/ldapSearchURI/","title":"ldapSearchURI","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur est une URI de recherche LDAP valide, c'est \u00e0 dire, par exemple, <code>ldaps://ldap.example.com:636/o=example?attr1,attr2?one?(gidNumber=100)</code></p> <p>Cette v\u00e9rification commence par d\u00e9couper la valeur \u00e0 l'aide du s\u00e9p\u00e9rateur <code>?</code> et elle s'assure ensuite :</p> <ul> <li>Que la premi\u00e8re partie est bien une URI LDAP valide. Si l'h\u00f4te LDAP est sp\u00e9cifi\u00e9, elle s'assure qu'il soit une adresse IP ou un nom de domaine valide. Si le port LDAP est sp\u00e9cifi\u00e9, elle s'assure \u00e9galement qu'il soit correct et que l'h\u00f4te est \u00e9galement bien sp\u00e9cifi\u00e9.</li> </ul> <ul> <li>Si la base de recherche est sp\u00e9cifi\u00e9e, elle s'assure qu'elle soit compatible avec la racine de l'annuaire connect\u00e9.</li> </ul> <ul> <li>Si un ou plusieurs attributs sont sp\u00e9cifi\u00e9s, elle les v\u00e9rifie un \u00e0 un afin de v\u00e9rifier qu'il s'agit de nom d'attribut valide.</li> </ul> <ul> <li>Que le scope de recherche soit bien sp\u00e9cifi\u00e9 et valide.</li> </ul> <ul> <li>Si le filtre de recherche est sp\u00e9cifi\u00e9, elle v\u00e9rifie qu'il soit valide.</li> </ul> <p>Param\u00eatres de configuration :</p> <ul> <li> <p><code>check_resolving_ldap_host</code></p> <p>Si l'h\u00f4te du serveur LDAP est sp\u00e9cifi\u00e9 et qu'il s'agit d'un nom de domaine valide, un tentative de r\u00e9solution DNS sera \u00e9galement faite (optionnel, par d\u00e9faut : <code>True</code>).</p> </li> </ul> <ul> <li> <p><code>host_required</code></p> <p>Bool\u00e9en d\u00e9termintant si une erreur est relev\u00e9e en cas d'absence de l'h\u00f4te LDAP. (optionnel, par d\u00e9faut : <code>False</code>)</p> </li> </ul> <ul> <li> <p><code>basedn_required</code></p> <p>Bool\u00e9en d\u00e9termintant si une erreur est relev\u00e9e en cas d'absence de base de recherche. (optionnel, par d\u00e9faut : <code>False</code>)</p> </li> </ul> <ul> <li> <p><code>scope_required</code></p> <p>Bool\u00e9en d\u00e9termintant si une erreur est relev\u00e9e en cas d'absence de port\u00e9e de recherche. (optionnel, par d\u00e9faut : <code>True</code>)</p> </li> </ul> <ul> <li> <p><code>attr_required</code></p> <p>Bool\u00e9en d\u00e9termintant si une erreur est relev\u00e9e en cas d'absence d'attribut recherch\u00e9. (optionnel, par d\u00e9faut : <code>False</code>)</p> </li> </ul> <ul> <li> <p><code>max_attrs_count</code></p> <p>Nombre maximum d'attribut recherch\u00e9s. (optionnel, par d\u00e9faut : pas de limite)</p> </li> </ul> <ul> <li> <p><code>filter_required</code></p> <p>Bool\u00e9en d\u00e9termintant si une erreur est relev\u00e9e en cas d'absence de filtre de recherche. (optionnel, par d\u00e9faut : <code>False</code>)</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/lettersonly/","title":"lettersonly","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur est une cha\u00eene de caract\u00e8res compos\u00e9e uniquement de lettres non-accuent\u00e9es, en minuscule ou en majuscule.</p>"},{"location":"conf/LSobject/LSattribute/check_data/maxlength/","title":"maxlength","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie est une chaine de caract\u00e8res dont la longueur est inf\u00e9rieur ou \u00e9gale \u00e0 la valeur pass\u00e9es en param\u00e8tre.</p> <ul> <li> <p><code>limit</code></p> <p>Limite sup\u00e9rieur (ou \u00e9gale) de la longueur de la cha\u00eene de carat\u00e8res.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/mimetype/","title":"mimetype","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur est bien un fichier et que le type mime de celui-ci est correct. Il est possible de v\u00e9rifier si le type mime fait partie d'une liste ou encore s'il valide une expression r\u00e9guli\u00e8re.</p> <ul> <li> <p><code>mimeType</code></p> <p>Type mime obligatoire. Ce param\u00e8tre peut \u00eatre une simple chaine correspondant au type mime ou un tableau listant plusieurs possibilit\u00e9s.</p> </li> </ul> <ul> <li> <p><code>mimeTypeRegEx</code></p> <p>Expression r\u00e9guli\u00e8re que doit respecter le type mime.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/minlength/","title":"minlength","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie est une chaine de caract\u00e8res dont la longueur est sup\u00e9rieur ou \u00e9gale \u00e0 la valeur pass\u00e9e en param\u00e8tre.</p> <ul> <li> <p><code>limit</code></p> <p>Limite inf\u00e9rieure (ou \u00e9gale) de la longueur de la cha\u00eene de carat\u00e8res.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/nonzero/","title":"nonzero","text":"<p>Cette r\u00e9gle v\u00e9rifie que la valeur est une valeur num\u00e9rique non nulle.</p>"},{"location":"conf/LSobject/LSattribute/check_data/nopunctuation/","title":"nopunctuation","text":"<p>Cette r\u00e9gle v\u00e9rifie que la valeur est une cha\u00eene de caract\u00e8res ne contenant pas de signe de ponctuation. Les caract\u00e8res suivants sont actuellement exclus : <code>( ) . \\ / \\ * \\ ^ \\ ? # ! @ $ % + = , \" ' > < ~ [ ] { }</code></p>"},{"location":"conf/LSobject/LSattribute/check_data/numberOfValues/","title":"numberOfValues","text":"<p>Cette r\u00e8gle v\u00e9rifie que le nombre de valeurs de l'attribut est comprise entre les limites pass\u00e9es en param\u00e8tre.</p> <ul> <li> <p><code>min</code></p> <p>Nombre minimum de valeurs (param\u00e8tre optionnel).</p> </li> </ul> <ul> <li> <p><code>max</code></p> <p>Nombre maximum de valeurs (param\u00e8tre optionnel).</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/numeric/","title":"numeric","text":"<p>Cette r\u00e9gle v\u00e9rifie que la valeur est une valeur num\u00e9rique.</p>"},{"location":"conf/LSobject/LSattribute/check_data/password/","title":"password","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur est un mot de passe respectant la politique de s\u00e9curit\u00e9 d\u00e9finie par les param\u00e8tres de la r\u00e8gle.</p> <ul> <li> <p><code>minlength</code></p> <p>Longueur minimale du mot de passe.</p> </li> </ul> <ul> <li> <p><code>maxlength</code></p> <p>Longueur maximale du mot de passe.</p> </li> </ul> <ul> <li> <p><code>prohibitedValues</code></p> <p>Tableau de valeurs interdites.</p> </li> </ul> <ul> <li> <p><code>regex</code></p> <p>Expression(s) r\u00e9guli\u00e8re(s) que doit respecter le mot de passe. Ce param\u00e8tre peut \u00eatre une expression r\u00e9guli\u00e8re au format PCRE ou un tableau d'expressions r\u00e9guli\u00e8res.</p> </li> </ul> <ul> <li> <p><code>minValidRegex</code></p> <p>Le nombre minimum d'expression r\u00e9guli\u00e8re qui doivent \u00eatre valid\u00e9es pour que le mot de passe soit consid\u00e9r\u00e9 comme correct. Ce param\u00e8tre est optionnel, par d\u00e9faut, toutes les expressions r\u00e9guli\u00e8res doivent \u00eatre valid\u00e9es.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/rangelength/","title":"rangelength","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie est une chaine de caract\u00e8res dont la longueur est comprise entre deux valeurs pass\u00e9es en param\u00e8tre.</p> <ul> <li> <p><code>limits</code></p> <p>Tableau contenant deux valeurs, la premi\u00e8re \u00e9tant la limite inf\u00e9rieure ou \u00e9gale et la seconde la limite sup\u00e9rieure ou \u00e9gale.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/regex/","title":"regex","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur saisie respecte bien l'expression r\u00e9guli\u00e8re pass\u00e9e en param\u00e8tre.</p> <ul> <li> <p><code>regex</code></p> <p>L'expression r\u00e9guli\u00e8re devant \u00eatre respect\u00e9e. Cette expression r\u00e9guli\u00e8re doit \u00eatre au format PCRE.</p> </li> </ul>"},{"location":"conf/LSobject/LSattribute/check_data/required/","title":"required","text":"<p>Cette r\u00e9gle v\u00e9rifie que la valeur n'est pas une cha\u00eene de caract\u00e8res de longueur nulle.</p>"},{"location":"conf/LSobject/LSattribute/check_data/ssh_pub_key/","title":"ssh_pub_key","text":"<p>Cette r\u00e8gle v\u00e9rifie que la valeur est une cl\u00e9 publique SSH.</p> <p>Cette v\u00e9rification utilise tout d'abord une expression r\u00e9guli\u00e8re pour valider la forme syntaxique de la cl\u00e9 publique (<code>ssh-[type] [cl\u00e9 au format base64] [commentaire]</code>) puis tente de d\u00e9coder la partie en base64 de la cl\u00e9 pour v\u00e9rifier qu'il s'agit bien d'une chaine de caract\u00e8res.</p>"},{"location":"conf/LSobject/LSattribute/check_data/telephonenumber/","title":"telephonenumber","text":"<p>Cette r\u00e9gle v\u00e9rifie que la valeur est un num\u00e9ro de t\u00e9l\u00e9phone fran\u00e7ais. Celui-ci doit respecter l'expression reguli\u00e8re suivante : <code>/^(01|02|03|04|05|06|08|09)[0-9]{8}$/</code></p>"},{"location":"conf/LSobject/LSattribute/check_data/zxcvbn/","title":"zxcvbn","text":"<p>Cette r\u00e8gle v\u00e9rifie la s\u00e9curit\u00e9 d'un mot de passe en utilisant la librairie ZxcvbnPhp. Cette librairie s'appuie sur un ensemble de v\u00e9rifications permettant de d\u00e9terminer \u00e0 quel point le mot de passe choisi est commun, pr\u00e9visible et plus globalement, estime en combien de temps il pourra \u00eatre cass\u00e9 par une personne malveillante. Sur la base de l'analyse du mot de passe saisi, des conseils seront donn\u00e9s \u00e0 l'utilisateur pour le guider dans le choix d'un mot de passe s\u00fbre.</p> <p>Warning</p> <p>La librairie <code>ZxcvbnPhp</code> n'est compatible qu'avec PHP 7 et sup\u00e9rieur.</p> <ul> <li> <p><code>minScore</code></p> <p>Le score minimal pour que le mot de passe soit accept\u00e9. Il doit s'agir d'un entier cimpris entre 0 (le plus faible) et 4 (le plus s\u00e9curis\u00e9). Param\u00e8tre facultatif valant 4 par d\u00e9faut.</p> </li> </ul> <ul> <li> <p><code>userDataAttrs</code></p> <p>Liste d'attributs de l'objet dont les valeurs seront pass\u00e9es \u00e0 la librairie <code>Zxcvbn</code> qui les consid\u00e9rera comme associ\u00e9s \u00e0 l'utilisateur. Ainsi, par exemple, si l'utilisateur utilise son nom de famille ou encore son pr\u00e9nom dans son mot de passe, la librairie pourra lui indiqu\u00e9 que cela ne le prot\u00e8ge que peut des attaques cibl\u00e9es. Param\u00e8tre facultatif, mais il est fortement conseill\u00e9 de renseigner un maximum d'attributs contenant des informations personnelles relatives \u00e0 l'utilisteur.</p> </li> </ul> <ul> <li> <p><code>showWarning</code></p> <p>Bool\u00e9en d\u00e9finissant si les messages d'alertes retourn\u00e9s par la librairie <code>Zxcvbn</code> doivent \u00eatre affich\u00e9s \u00e0 l'utilisateur. Param\u00e8tre facultatif et vrai par d\u00e9faut.</p> </li> </ul> <ul> <li> <p><code>showSuggestions</code></p> <p>Bool\u00e9en d\u00e9finissant si les messages de suggestions retourn\u00e9s par la librairie <code>Zxcvbn</code> doivent \u00eatre affich\u00e9s \u00e0 l'utilisateur. Param\u00e8tre facultatif et vrai par d\u00e9faut.</p> </li> </ul> <ul> <li> <p><code>zxcvbn_autoload_path</code></p> <p>Le chemin vers le fichier de chargement automatique des classes de la librairie ZxcvbnPhp. Ce param\u00e8tre est facultatif et vaut par d\u00e9faut <code>Zxcvbn/autoload.php</code>, ce qui est adapt\u00e9 si vous utiliser le paquet Debian <code>php-zxcvbn</code> disponible sur le d\u00e9p\u00f4t Debian du projet LdapSaisie.</p> </li> </ul>"},{"location":"conf/global/","title":"Configuration globale","text":"<p>La plus grande partie de la configuration globale se trouve dans le fichier <code>config.inc.php</code>.</p> <pre><code>// Variables globales\n$GLOBALS['LSconfig'] = array(\n // Variables globales\n);\n\n// Variables et constantes ind\u00e9pendantes\n$var1 = 'val1'\n$var2 = 'val2'\n...\ndefine('CONST1','val1')\ndefine('CONST2','val2')\n...\n</code></pre>"},{"location":"conf/global/#variables-globales","title":"Variables globales","text":"<ul> <li> <p><code>NetLDAP2</code></p> <p>Chemin vers la librairie PEAR Net_LDAP2.</p> <pre><code>/usr/share/php/Net/LDAP2.php\n</code></pre> </li> </ul> <ul> <li> <p><code>Smarty</code></p> <p>Chemin vers le moteur de template Smarty.</p> <pre><code>/usr/share/php/smarty/libs/Smarty.class.php\n</code></pre> </li> </ul> <ul> <li> <p><code>public_root_url</code></p> <p>URL publique de la racine web de l'application. Il peut s'agir d'une URL relative bien qu'une URL absolue soit pr\u00e9f\u00e9rable, notament pour \u00e9viter l'auto-d\u00e9tection de celle-ci lorsque n\u00e9cessaire (lien dans un e-mail par exemple. Par d\u00e9faut : <code>/</code>.)</p> <p>Important</p> <p>Il est indispensable que ce param\u00e8tre soit configur\u00e9 en ad\u00e9quation avec votre environement pour que l'application fonctionne correctement (notament en cas en cas de d\u00e9ploiement dans un sous-dossier ou encore dans le cadre d'un acc\u00e8s \u00e0 l'application au travers un reverse-proxy).</p> </li> </ul> <ul> <li> <p><code>lang</code></p> <p>Param\u00e8tre utilis\u00e9 pour l'internationalisation : code de la langue (<code>fr_FR</code> ou <code>en_US</code>)</p> </li> </ul> <ul> <li> <p><code>encoding</code></p> <p>Encodage de caract\u00e8re (<code>UTF8</code>)</p> </li> </ul> <ul> <li> <p><code>ldap_servers</code></p> <p>Configuration des serveurs LDAP. Voir section concern\u00e9e.</p> </li> </ul>"},{"location":"conf/global/#preferences-globales","title":"Pr\u00e9f\u00e9rences globales","text":"<p>Important</p> <p>Les variables globales suivantes ont une action globale, mais non-prioritaire sur le comportement de l'application. Il peux \u00eatre red\u00e9fini pour chacun des serveurs LDAP.</p> <ul> <li> <p><code>cacheLSprofiles</code></p> <p>Activation/D\u00e9sactivation de la mise en cache des profils des utilisateurs connect\u00e9s (LSprofiles).</p> <p>Valeurs possibles : <code>True</code> ou <code>False</code></p> <p>Valeur recommand\u00e9e : <code>True</code></p> <p>Valeur par d\u00e9faut : <code>False</code></p> </li> </ul> <ul> <li> <p><code>cacheSubDn</code></p> <p>Activation/D\u00e9sactivation de la mise en cache des niveaux de connexion (subDn) dans l'annuaire.</p> <p>Valeurs possibles : <code>True</code> ou <code>False</code></p> <p>Valeur recommand\u00e9e : <code>True</code></p> <p>Valeur par d\u00e9faut : <code>False</code></p> </li> </ul> <ul> <li> <p><code>cacheSearch</code></p> <p>Activation/D\u00e9sactivation de la mise en cache du r\u00e9sultat des recherches dans l'annuaire.</p> <p>Valeurs possibles : <code>True</code> ou <code>False</code></p> <p>Valeur recommand\u00e9e : <code>True</code></p> <p>Valeur par d\u00e9faut : <code>False</code></p> </li> </ul> <ul> <li> <p><code>globalSearch</code></p> <p>Activation/D\u00e9sactivation de la recherche globale dans l'annuaire.</p> <p>Valeurs possibles : <code>True</code> ou <code>False</code></p> <p>Valeur par d\u00e9faut : <code>True</code></p> </li> </ul> <ul> <li> <p><code>keepLSsessionActive</code></p> <p>Activation/D\u00e9sactivation du maintient de la LSsession active.</p> <p>Valeurs possibles : <code>True</code> ou <code>False</code></p> <p>Valeur par d\u00e9faut : <code>False</code></p> </li> </ul>"},{"location":"conf/global/#variables-et-constantes-independantes","title":"Variables et constantes ind\u00e9pendantes","text":"<ul> <li> <p><code>LS_THEME</code></p> <p>Constante d\u00e9terminant le nom du theme utilis\u00e9.</p> <p>Valeur par d\u00e9faut : default</p> </li> </ul> <ul> <li> <p><code>LS_TEMPLATES_DIR</code></p> <p>Constante d\u00e9terminant le chemin du dossier des templates.</p> <p>Valeur par d\u00e9faut : templates</p> </li> </ul> <ul> <li> <p><code>LS_IMAGES_DIR</code></p> <p>Constante d\u00e9terminant le chemin du dossier des images.</p> <p>Valeur par d\u00e9faut : images</p> </li> </ul> <ul> <li> <p><code>LS_CSS_DIR</code></p> <p>Constante d\u00e9terminant le chemin du dossier des CSS.</p> <p>Valeur par d\u00e9faut : css</p> </li> </ul> <ul> <li> <p><code>LSdebug</code></p> <p>Variable bool\u00e9enne d\u00e9terminant si le d\u00e9bogage \u00e0 l'\u00e9cran est activ\u00e9.</p> </li> </ul> <ul> <li> <p><code>$GLOBALS['LSlog']</code></p> <p>Variable permettant de configurer la journalisation de l'application. Voir section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>NB_LSOBJECT_LIST</code></p> <p>Constante d\u00e9terminant le nombre d'objet affich\u00e9s par page de r\u00e9sultat de recherche.</p> </li> </ul> <ul> <li> <p><code>NB_LSOBJECT_LIST_SELECT</code></p> <p>Constante d\u00e9terminant le nombre d'objet affich\u00e9s par page de r\u00e9sultat de recherche dans une fen\u00eatre LSselect.</p> </li> </ul> <ul> <li> <p><code>$GLOBALS['NB_LSOBJECT_LIST_CHOICES']</code></p> <p>Variable permettant de configurer la liste des choix propos\u00e9s \u00e0 l'utilisateur pour le nombre maximum d'objets affich\u00e9s par page de r\u00e9sultat de recherche.</p> </li> </ul> <ul> <li> <p><code>MAX_SEND_FILE_SIZE</code></p> <p>Constante d\u00e9terminant la taille maximale d'un fichier envoy\u00e9 \u00e0 travers les formulaires.</p> </li> </ul> <ul> <li> <p><code>$GLOBALS['defaultJSscripts']</code></p> <p>Tableau d\u00e9terminant les fichiers Javascript \u00e0 charger sur toute les pages.</p> </li> </ul> <ul> <li> <p><code>$GLOBALS['defaultCSSfiles']</code></p> <p>Tableau d\u00e9terminant les fichiers CSS \u00e0 charger sur toute les pages. Ces fichiers seront charg\u00e9s dans l'ordre et en dernier permettant de surcharger tous param\u00e8tres de style.</p> </li> </ul>"},{"location":"conf/global/LDAP_search_params/","title":"Param\u00e8tres \u00e9tendus des recherches dans l'annuaire","text":"<p>Les param\u00e8tres des recherches sont ceux support\u00e9s par Net_LDAP2. Ces param\u00e8tres sont pass\u00e9s sous la forme d'un tableau associatif. Les param\u00e8tres support\u00e9s sont d\u00e9taill\u00e9s ci-dessous :</p> Nom Description Valeur par d\u00e9faut <code>scope</code> <p>D\u00e9finition de l'\u00e9tendue de la recherche :</p> <ul> <li><p><code>base</code> - Sur une entr\u00e9e seulement</p></li> <li><p><code>one</code> - Sur les entr\u00e9es im\u00e9diatement contenu par le <code>basedn</code> de la recherche</p></li> <li><p><code>sub</code> - Sur l'arbre entier</p></li> </ul> <code>sub</code> <code>sizelimit</code> Le nombre maximum d'entr\u00e9es retourn\u00e9es par la recherche. <code>0</code> (illimit\u00e9) <code>timelimit</code> Le d\u00e9lai d'attente maximum de la r\u00e9ponse du serveur en secondes. <code>0</code> (illimit\u00e9) <code>attrsonly</code> Si vrai, seuls les noms des atttributs seront retourn\u00e9s. <code>false</code> <code>attributes</code> Tableau contenant les noms des attributs que les entr\u00e9es retourn\u00e9es peuvent contenir et que l'on souhaite r\u00e9cup\u00e9rer. <code>array()</code>(tous) <p>Pour plus d'information sur le sujet, vous pouvez consulter la documentation officiel du projet Net_LDAP2.</p>"},{"location":"conf/global/LSformat/","title":"Format param\u00e9trable (LSfomat)","text":"<p>Un format param\u00e9trable est une cha\u00eene de caract\u00e8res contenant des mots cl\u00e9s form\u00e9s comme dans l'exemple suivant\u00a0:</p> <pre><code>%{[nom du mot cl\u00e9][:A][:B][! ou _][~][%]}\n</code></pre> <p>Le nom du mot cl\u00e9 peut contenir des lettres de \"a\" \u00e0 \"z\", de \"A\" \u00e0 \"Z\" et des chiffres de 0 \u00e0 9. Ces mots cl\u00e9s seront remplac\u00e9s par les valeurs pass\u00e9es en param\u00e8tres et li\u00e9es au contexte d'utilisation. Les param\u00e8tres :A et :B permettent d'extraire une partie de la cha\u00eene compl\u00e8te avant la substitution.</p> <p>Le param\u00e8tre <code>A</code> correspond, lorsque <code>B</code> n'est pas d\u00e9fini, au nombre maximum de caract\u00e8res \u00e0 extraire de la cha\u00eene de substitution. A doit \u00eatre un entier dont le signe influ, comme expliqu\u00e9 ci-dessous\u00a0:</p> <ul> <li>Si <code>A</code> est positif, les <code>A</code> premiers caract\u00e8res de la cha\u00eene de substitution seront extraits.</li> </ul> <ul> <li>Si <code>A</code> est n\u00e9gatif, les <code>|A|</code> derniers caract\u00e8res de la cha\u00eene de substitution seront extraits.</li> </ul> <p>Lorsque le param\u00e8tre <code>B</code> est d\u00e9fini, <code>A</code> correspond au rang du premier caract\u00e8re \u00e0 partir duquel la cha\u00eene de substitution sera d\u00e9coup\u00e9e et <code>B</code> le nombre maximum de caract\u00e8res \u00e0 extraire. Le signe de <code>B</code> influera comme expliqu\u00e9 dans le premier cas. Si <code>B</code> vaut z\u00e9ro, la totalit\u00e9 de la longeur de la cha\u00eene sera retourn\u00e9e en tenant compte de <code>A</code> pour le rang du premier caract\u00e8re.</p> <p>Il existe par ailleurs des param\u00e8tres permettant de modifier la valeur de substitution avant son utilisation :</p> <ul> <li>Les param\u00e8tres ! ou _ permettre respectivement de forcer la mise en majuscule ou en minuscule ;</li> </ul> <ul> <li>Le param\u00e8tre ~ permet de forcer la suppression des accents ;</li> </ul> <ul> <li>Le param\u00e8tre % permet de prot\u00e9ger les caract\u00e8res \u00e9ligibles en entit\u00e9s HTML.</li> </ul> <p>Important</p> <p>Lorsque qu'une seule valeur cl\u00e9 est disponible pour la substitution, le nom du mot cl\u00e9 n'importe pas. Tous les mots cl\u00e9s trouv\u00e9s dans le format seront remplac\u00e9s par cette seule valeur.</p>"},{"location":"conf/global/LSlog/","title":"Configuration de la journalisation (LSlog)","text":"<p>Cette section d\u00e9crit le tableau de configuration de la journalisation de l'application.</p> <pre><code>$GLOBALS['LSlog'] = array(\n 'enable' => [bool\u00e9en],\n 'level' => '[niveau]',\n 'handlers' => array(\n '[handler 1]',\n array (\n 'handler' => [handler 2],\n 'enabled' => [bool\u00e9en],\n 'level' => '[niveau]',\n 'loggers' => array('logger1', [...]),\n 'excluded_loggers' => array('logger2', [...]),\n 'format' => '[LSformat]',\n 'cli_format' => '[LSformat]',\n 'datetime_prefix' => [bool\u00e9en],\n 'datetime_format' => '[format date()]',\n // Autres param\u00e8tres propre \u00e0 ce handler\n [...]\n ),\n [...]\n ),\n 'loggers' => array (\n 'logger1' => array (\n 'level' => 'DEBUG',\n ),\n 'logger2' => array (\n 'enabled' => false,\n ),\n [...]\n );\n);\n...\n</code></pre> <ul> <li> <p><code>enable</code></p> <p>Bool\u00e9en permatant d'activer ou d\u00e9sactiver compl\u00e8tement la journalisation. Par d\u00e9faut : <code>False</code></p> </li> </ul> <ul> <li> <p><code>level</code></p> <p>Ce param\u00e8tre d\u00e9fini le niveau minimum de la journalisation : tous les messages des niveaux inf\u00e9rieurs ne seront pas inclus dans le journal de l'application. Les niveaux de journalisation g\u00e9r\u00e9s par l'application sont (dans l'ordre du plus petit au plus grand) :</p> <ul> <li><code>TRACE</code></li> <li><code>DEBUG</code></li> <li><code>INFO</code></li> <li><code>WARNING</code></li> <li><code>ERROR</code></li> <li><code>FATAL</code></li> </ul> </li> </ul> <ul> <li> <p><code>handlers</code></p> <p>Tableau permettant de configurer les handlers de la journalisation. Chaque handler g\u00e8re les messages journalis\u00e9s d'une mani\u00e8re qui lui est propre.</p> <p>Plusieurs handlers peuvent \u00eatre configur\u00e9s en m\u00eame temps (y compris plusieurs handlers du m\u00eame type).</p> <p>Ce tableau peut contenir simplement le nom du type de handler \u00e0 utiliser ou bien des tableaux configurant un \u00e0 un chacun des handlers. Dans ce second cas, la structure de la configuration d'un handler est la suivante :</p> <pre><code>array(\n 'handler' => [type],\n 'level' => '[niveau]',\n 'loggers' => array('logger1', [...]),\n 'excluded_loggers' => array('logger2', [...]),\n 'format' => '[LSformat]',\n 'cli_format' => '[LSformat]',\n 'datetime_prefix' => [bool\u00e9en],\n 'datetime_format' => '[format date()]',\n // Autres param\u00e8tres propre \u00e0 ce handler\n [...]\n)\n...\n</code></pre> <ul> <li> <p><code>handler</code></p> <p>Type du handler (voir ci-dessous).</p> </li> </ul> <ul> <li> <p><code>level</code></p> <p>Ce param\u00e8tre d\u00e9fini le niveau minimum de la journalisation sp\u00e9cifique \u00e0 cet handler. Si ce param\u00e8tre est omis, le niveau global sera utilis\u00e9. Les valeurs possibles de ce param\u00e8tre sont les m\u00eames que pour le param\u00e8tre <code>$GLOBALS['LSlog']['level']</code>.</p> </li> </ul> <ul> <li> <p><code>enabled</code></p> <p>Bool\u00e9en permettant d'activer ou d\u00e9sactiver cet handler (param\u00e8tre facultatif, par d\u00e9faut : <code>True</code>).</p> </li> </ul> <ul> <li> <p><code>loggers</code></p> <p>Liste exhautive des composants dont les messages doivent \u00eatre trait\u00e9s par ce handler (param\u00e8tre facultatif, par d\u00e9faut : tous les composants).</p> </li> </ul> <ul> <li> <p><code>excluded_loggers</code></p> <p>Liste exhautive des composants dont les messages ne doivent pas \u00eatre trait\u00e9s par ce handler (param\u00e8tre facultatif, par d\u00e9faut : aucun composant).</p> </li> </ul> <ul> <li> <p><code>format</code></p> <p>LSformat des messages de cet journalis\u00e9 par ce handler. Ce format est compos\u00e9 \u00e0 partir des informations d\u00e9critent ci-dessous. Par d\u00e9faut :</p> <pre><code>%{requesturi} - %{remoteaddr} - %{ldapservername} - %{authuser} - %{logger} - %{level} - %{message}\n</code></pre> <ul> <li> <p><code>level</code></p> <p>Le niveau du message.</p> </li> </ul> <ul> <li> <p><code>message</code></p> <p>Le message.</p> </li> </ul> <ul> <li> <p><code>logger</code></p> <p>Le composant ayant d\u00e9chench\u00e9 cette journalisation.</p> </li> </ul> <ul> <li> <p><code>clibinpath</code></p> <p>Le nom du script ayant d\u00e9clench\u00e9 cette jounalisation (uniquement en cas d'ex\u00e9cution en ligne de commande).</p> </li> </ul> <ul> <li> <p><code>requesturi</code></p> <p>L'URL de la page courante (uniquement dans un contexte Web).</p> </li> </ul> <ul> <li> <p><code>remoteaddr</code></p> <p>L'adresse IP du client (uniquement dans un contexte Web).</p> </li> </ul> <ul> <li> <p><code>ldapservername</code></p> <p>Le nom du serveur LDAP courant.</p> </li> </ul> <ul> <li> <p><code>authuser</code></p> <p>Le DN de l'utilisateur connect\u00e9 (uniquement dans un contexte Web).</p> </li> </ul> </li> </ul> <ul> <li> <p><code>cli_format</code></p> <p>LSformat des messages de cet journalis\u00e9 par ce handler dans le cas d'une ex\u00e9cution en ligne de commande. Ce format est compos\u00e9 \u00e0 partir des m\u00eame informations que le param\u00e8tre <code>format</code> (voir ci-dessus). Par d\u00e9faut : <pre><code>%{clibinpath} - %{logger} - %{level} - %{message}\n</code></pre></p> </li> </ul> <ul> <li> <p><code>datetime_format</code></p> <p>Bool\u00e9en permettant de d\u00e9finir si le message doit \u00eatre pr\u00e9fix\u00e9 de la date et heure courante. La valeur par d\u00e9faut d\u00e9pends de l'handler (en r\u00e8gle g\u00e9n\u00e9ral, toujours actif sauf lorsque le canal de journalisation l'ajoute d\u00e9j\u00e0).</p> </li> </ul> <ul> <li> <p><code>datetime_format</code></p> <p>Format de la date et heure lorsque celle-ci est ajout\u00e9e en pr\u00e9fixe du message (voir param\u00e8tre <code>datetime_format</code>). Le format correspond \u00e0 celui attendu par la function <code>date()</code> de PHP. Consultez la documentation officielle pour plus de d\u00e9tails (Par d\u00e9faut : <code>Y/m/d H:i:s</code>).</p> </li> </ul> <p>Il existe plusieurs types d'handlers g\u00e9r\u00e9s par l'application :</p> <ul> <li> <p><code>file</code></p> <p>Journalisation dans un simple fichier texte. Le chemin du fichier peut \u00eatre configur\u00e9 via le param\u00e8tre <code>path</code>. Si ce param\u00e8tre est omis, le chemin du fichier par d\u00e9faut est soit la valeur de la variable <code>$GLOBALS['LSlog']['filename']</code> (pour la r\u00e9tro-compatibilit\u00e9 avec les anciennes versions d'LdapSaisie) ou \u00e0 d\u00e9faut : <code>tmp/LS.log</code>.</p> </li> </ul> <ul> <li> <p><code>syslog</code></p> <p>Journalisation via le service syslog. Il est possible de configurer une priorit\u00e9 syst\u00e9matique pour les messages journalis\u00e9s. \u00c0 d\u00e9faut, la priorit\u00e9 sera d\u00e9termin\u00e9e automatiquement en fonction du niveau du message. Les valeurs possibles de ce param\u00e8tre sont : <code>EMERG, ALERT, CRITICAL,ERROR, WARNING, NOTICE, INFO, DEBUG</code></p> </li> </ul> <ul> <li> <p><code>system</code></p> <p>Journalisation via le gestionnaire d'erreurs PHP. Cet handler utilise la fonction PHP <code>error_log</code>. Pour plus d'informations sur comment configurer le gestionnaire d'erreurs PHP, consulter la documentation officielle.</p> </li> </ul> <ul> <li> <p><code>email</code></p> <p>Journalisation via l'envoi d'un email : chaque message journalis\u00e9 d\u00e9clenchera l'envoi d'un email au destinataire configur\u00e9. L'adresse email du destinataire peut-\u00eatre configur\u00e9e via le param\u00e8tre <code>recipient</code>.</p> <p>Note</p> <p>Il est conseill\u00e9 d'utiliser ce type d'handler avec un niveau minimum de journalisation important (<code>FATAL</code> recommand\u00e9) pour ne pas d\u00e9clencher un nombre trop important d'envois d'emails.</p> </li> </ul> </li> </ul> <ul> <li> <p><code>loggers</code></p> <p>Tableau permettant de configurer la journalisation composant par composant. Chaque composant peut avoir son propre <code>logger</code> ce qui permet alors, par exemple, de configurer le niveau de log sp\u00e9cifiquement pour ce composant.</p> <p>Le nom des composant correspond en g\u00e9n\u00e9ral au nom de la classe PHP correspondante, ou bien encore le nom d'une commande (lors d'une ex\u00e9cution en ligne de commande).</p> <p>Note</p> <p>Par d\u00e9faut, le nom du composant ayant d\u00e9clench\u00e9 un message journalis\u00e9 est affich\u00e9 juste avant le niveau de log.</p> <ul> <li> <p><code>enabled</code></p> <p>Bool\u00e9en permettant de d\u00e9sactiver compl\u00e8tement les logs du composant (par d\u00e9faut: <code>True</code>).</p> </li> </ul> <ul> <li> <p><code>level</code></p> <p>Niveau de log sp\u00e9cifique pour ce composant (par d\u00e9faut: le niveau de log global).</p> </li> </ul> </li> </ul>"},{"location":"conf/global/ldap/","title":"Configuration des serveurs LDAP","text":"<p>Cette section d\u00e9crit le tableau de configuration des diff\u00e9rents serveurs LDAP utilis\u00e9s par l'application. Ce tableau contient lui m\u00eame un tableau par serveur LDAP.</p> <pre><code>$GLOBALS['LSconfig'] = array(\n ...\n 'ldap_servers' => array(\n array (\n 'name' => [nom de l'annuaire],\n 'ldap_config'=> array(\n // D\u00e9finition des param\u00e8tres de connexion \u00e0 l'annuaire\n ),\n 'useUserCredentials' => [boolean],\n 'useAuthzProxyControl' => [boolean],\n 'LSauth' => array (\n 'method' => [LSauth method],\n 'api_method' => [LSauth method],\n 'LSobjects' => array(\n '[object type 1]',\n '[object type 2]' => array(\n 'filter' => '[LDAP filter]',\n 'filter_function' => [callable],\n 'password_attribute' => '[attribute name]',\n 'web_access' => [bool\u00e9en],\n 'api_access' => [bool\u00e9en],\n )\n )\n ),\n 'LSprofiles' => array (\n // D\u00e9finition des LSprofiles\n ),\n 'cacheLSprofiles' => [boolean],\n 'cacheSearch' => [boolean],\n 'globalSearch' => [boolean],\n 'LSaccess' => array (\n [Type LSobject 1],\n [Type LSobject 2],\n ...\n ),\n 'subDn' => array(\n // D\u00e9finition des sous-niveaux de l'annuaire\n ),\n 'subDnLabel' => [nom des sous-niveaux],\n 'recoverPassword' => array(\n // D\u00e9finition des param\u00e8tres de configuration de la r\u00e9cup\u00e9ration de mot de passe\n ),\n 'defaultView' => [view],\n 'emailSender' => [email],\n 'keepLSsessionActive' => [bool\u00e9en]\n )\n ...\n);\n...\n</code></pre> <ul> <li> <p><code>name</code></p> <p>Le nom d'affichage de ce serveur Ldap (utilis\u00e9 lorsque plusieurs serveur LDAP sont d\u00e9clar\u00e9s).</p> </li> </ul> <ul> <li> <p><code>ldap_config</code></p> <p>Informations de connexion au serveur LDAP. Ces informations sont structur\u00e9es selon les attentes de la librairie Net_LDAP2. Plus d'informations</p> </li> </ul> <ul> <li> <p><code>useUserCredentials</code></p> <p>Bool\u00e9en d\u00e9finissant si il faut utiliser les identifiants de l'utilisateur pour se connecter \u00e0 l'annuaire (false par d\u00e9faut). Si cette option est activ\u00e9e, la connexion \u00e0 l'annuaire LDAP sera \u00e9tablie avec la configuration fournie dans le param\u00e8tre ldap_config en \u00e9crasant les informations de connexion (binddn et bindpwd) par ceux de l'utilisateur. Si l'utilisateur n'est pas encore connect\u00e9, la connexion sera \u00e9talie sans modifier la configuration fournie.</p> </li> </ul> <ul> <li> <p><code>useAuthzProxyControl</code></p> <p>Bool\u00e9en d\u00e9finissant si, lorsqu'on utilise les identifiants de l'utilisateur pour se connecter \u00e0 l'annuaire, il faut utiliser une authentification via proxy authorization. Dans ce cas, les identifiants de l'utilisateur ne seront pas, \u00e0 proprement parl\u00e9, utilis\u00e9s pour se connecter \u00e0 l'annuaire, mais une demande de proxy authorization en tant que l'utilisateur connect\u00e9 sera faites \u00e0 l'aide des identifiants de l'application. Ce mode n\u00e9cessite une configuration particuli\u00e8re au niveau de l'annuaire pour autoriser le compte de l'application \u00e0 faire des demandes de proxy authorization en tant que les autres utilisateurs de l'annuaire.</p> </li> </ul> <ul> <li> <p><code>LSprofiles</code></p> <p>D\u00e9finition des profils d'utilisateurs se connectant \u00e0 l'annuaire. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>LSauth</code></p> <p>Ce tableau d\u00e9fini les param\u00e8tres d'authentification \u00e0 l'application.</p> <ul> <li> <p><code>method</code></p> <p>Nom de la m\u00e9thode d'authentification LSauthMethod. Exemple : pour utiliser la classe <code>LSauthMethod_HTTP</code>, la valeur de ce param\u00e8tre sera <code>HTTP</code>. Param\u00e8tre facultatif, m\u00e9thode par d\u00e9faut : <code>basic</code>.</p> </li> </ul> <ul> <li> <p><code>api_method</code></p> <p>Nom de la m\u00e9thode d'authentification LSauthMethod \u00e0 utilis\u00e9e lors d'une connexion \u00e0 l'API. Exemple : pour utiliser la classe <code>LSauthMethod_HTTP</code>, la valeur de ce param\u00e8tre sera <code>HTTP</code>. Param\u00e8tre facultatif, m\u00e9thode par d\u00e9faut : <code>HTTP</code>.</p> <p>Warning</p> <p>Toutes les LSauthMethod ne supportent pas forc\u00e9ment le mode API.</p> </li> </ul> <ul> <li> <p><code>LSobjects</code></p> <p>Tableau listant les types LSobjects pouvant se connecter \u00e0 l'application. Les valeurs de ce tableau peuvent \u00eatre un nom de type d'objet ou bien tableau d\u00e9taillant les param\u00e8tres de connexion de ce type d'objet.</p> <ul> <li> <p><code>filter</code></p> <p>LSformat du filtre de recherche de l'utilisateur \u00e0 sa connexion. Ce format sera compos\u00e9 avec l'identifiant fourni par l'utilisateur. Cela peut par exemple permettre \u00e0 l'utilisateur de se connecter en fournissant son login ou son email comme identifiant. Exemple de valeur : <code>(|(uid=%{user})(mail=%{user}))</code>. Param\u00e8tre facultatif, filtre par d\u00e9faut compos\u00e9 \u00e0 l'aide de l'attribut RDN.</p> </li> </ul> <ul> <li> <p><code>filter_function</code></p> <p>Callable (au sens PHP) utilis\u00e9 pour filtrer les utilisateurs trouv\u00e9s dans l'annuaire \u00e0 partir des autres param\u00e8tres : cette fonction, si elle est d\u00e9finie, sera appel\u00e9e pour chaque utilisateur trouv\u00e9, avec pour unique param\u00e8tre, une r\u00e9f\u00e9rence \u00e0 l'objet LDAP correspondant (<code>LSldapObject</code>). Cette m\u00e9thode devra alors retourner <code>true</code> ou <code>false</code> pour respectivement autoriser ou interdire l'acc\u00e8s \u00e0 l'application \u00e0 l'utilisateur.</p> <p>Note</p> <p>Si un utilisateur est exclus par cette m\u00e9thode et qu'aucun autre utilisateur correspondant n'a \u00e9t\u00e9 trouv\u00e9 dans l'annuaire, une page d'erreur sera affich\u00e9e et indiquera que l'acc\u00e8s \u00e0 l'application est refus\u00e9e.</p> </li> </ul> <ul> <li> <p><code>password_attribute</code></p> <p>Nom de l'attribut stockant le mot de passe de ce type d'LSobject. Param\u00e8tre facultatif, valeur par d\u00e9faut : <code>userPassword</code>.</p> <p>Note</p> <p>C'est cet attribut de l'utilisateur qui sera modifi\u00e9 par la fonctionnalit\u00e9 de r\u00e9cup\u00e9ration de mot de passe.</p> </li> </ul> <ul> <li> <p><code>web_access</code></p> <p>Permet de d\u00e9finir si ce type d'objet \u00e0 le droit d'utiliser l'interface web (facultatif, par d\u00e9faut : <code>True</code>).</p> </li> </ul> <ul> <li> <p><code>api_access</code></p> <p>Permet de d\u00e9finir si ce type d'objet \u00e0 le droit d'utiliser l'API (facultatif, par d\u00e9faut : <code>False</code>).</p> </li> </ul> </li> </ul> <ul> <li> <p><code>allow_multi_match</code></p> <p>Bool\u00e9en permettant de d\u00e9finir si un doublon d'identifiant utilisateur est autoris\u00e9. Si c'est le cas et lorsqu'un identifiant fourni par l'utilisateur a sa connexion a permi de trouver plus d'un utilisateur possible correspondant, l'application tentera de d\u00e9terminer lequel de ces utilisateurs correspond \u00e0 la tentative d'authentification. La m\u00e9thodologie employ\u00e9e d\u00e9pendra de la LSauthMethod configur\u00e9e. Par exemple, la LSauthMethod <code>basic</code> tentera de s'identifier avec le mot de passe. Dans tous cas, si cette m\u00e9thode n'a pas permis d'identifier un seul utilisateur, l'authentification \u00e9choura. Param\u00e8tre facultatif, valeur par d\u00e9faut : <code>False</code>.</p> </li> </ul> </li> </ul> <ul> <li> <p><code>cacheLSprofiles</code></p> <p>Activation/D\u00e9sactivation de la mise en cache des LSprofiles des utilisateurs connect\u00e9s \u00e0 ce serveur.</p> <p>Valeur par d\u00e9faut : valeur de la variable globale du m\u00eame nom</p> </li> </ul> <ul> <li> <p><code>cacheSearch</code></p> <p>Activation/D\u00e9sactivation de la mise en cache du r\u00e9sultat des recherches sur ce serveur.</p> <p>Valeur par d\u00e9faut : valeur de la variable globale du m\u00eame nom</p> </li> </ul> <ul> <li> <p><code>globalSearch</code></p> <p>Activation/D\u00e9sactivation de la recherche globale sur ce serveur en particulier. Par d\u00e9faut, la valeur du param\u00e8tre global <code>globalSearch</code> est utilis\u00e9e.</p> <p>Valeur par d\u00e9faut : valeur de la variable globale du m\u00eame nom</p> </li> </ul> <ul> <li> <p><code>LSaccess</code> </p> <p>D\u00e9finition des types d'LSobjects devant appara\u00eetre dans le menu de l'interface.</p> <p>Important</p> <p>Ce param\u00e8tre n'est utilis\u00e9 que pour les annuaires n'ayant pas de sous-niveaux (subDn).</p> </li> </ul> <ul> <li> <p><code>subDn</code></p> <p>D\u00e9finition des sous-niveaux de connexion \u00e0 l'annuaire. Voir section concern\u00e9e.</p> <p>Important</p> <p>Ce param\u00e8tre remplace le param\u00e8tre LSaccess dans le cas d'un annuaire multi-niveaux.</p> </li> </ul> <ul> <li> <p><code>subDnLabel</code></p> <p>D\u00e9finition du label utilis\u00e9 pour qualifier les sous-niveaux de connexion.</p> <p>Important</p> <p>Ce param\u00e8tre est utile uniquement dans le cas d'un annuaire multi-niveaux.</p> </li> </ul> <ul> <li> <p><code>recoverPassword</code></p> <p>D\u00e9finition des param\u00e8tres de la r\u00e9cup\u00e9ration de mot de passe. Voir la section concern\u00e9e.</p> </li> </ul> <ul> <li> <p><code>defaultView</code></p> <p>D\u00e9finition de la vue par d\u00e9faut de l'application. Par d\u00e9faut, une page blanche est affich\u00e9e et il est possible de d\u00e9finir \u00e0 l'aide de ce param\u00e8tre la vue qui s'affichera. Ce param\u00e8tre peut prendre comme valeur :</p> <ul> <li><code>SELF</code> pour la vue Mon compte</li> </ul> <ul> <li>Le nom d'un LSobject pour afficher la liste de ce type d'objet</li> </ul> <ul> <li>Le nom d'une vue d'un LSaddon au format <code>[addon]::[viewId]</code> pour afficher cette vue</li> </ul> </li> </ul> <ul> <li> <p><code>emailSender</code></p> <p>Adresse mail utilis\u00e9e par LdapSaisie pour envoyer des e-mails en relation avec cet annuaire. Cette adresse est celle utilis\u00e9e par d\u00e9faut. L'adresse utilis\u00e9e peut \u00e9galement \u00eatre configur\u00e9e dans le contexte de configuration du module devant envoyer des e-mails.</p> </li> </ul> <ul> <li> <p><code>keepLSsessionActive</code></p> <p>Activation/D\u00e9sactivation du maintient de la LSsession active.</p> <p>Valeurs possibles : <code>True</code> ou <code>False</code></p> <p>Valeur par d\u00e9faut : valeur de la variable globale du m\u00eame nom</p> </li> </ul>"},{"location":"conf/global/ldap/LSprofile/","title":"Profils d'utilisateurs (LSprofile)","text":"<p>Cette section d\u00e9crit la mani\u00e8re dont sont d\u00e9finis les profils d'utilisateurs se connectant \u00e0 l'interface appel\u00e9s LSprofile. Il est possible d'attribuer un profil \u00e0 l'utilisateur connect\u00e9 sur tout ou partie de l'annuaire LDAP.</p>"},{"location":"conf/global/ldap/LSprofile/#profils-dutilisateurs-par-defaut","title":"Profils d'utilisateurs par d\u00e9faut","text":"<p>Il existe des profils d'utilisateurs par d\u00e9faut, non li\u00e9e \u00e0 la configuration de l'application:</p> <ul> <li> <p><code>user</code></p> <p>Tous les utilisateurs connect\u00e9s \u00e0 l'utilisateur. Ce LSprofile est valide sur l'ensemble de l'annuaire.</p> </li> </ul> <ul> <li> <p><code>self</code></p> <p>L'utilisateur connect\u00e9 sur son objet correspondant dans l'annuaire. Ce LSprofile est utile pour donner des droits \u00e0 l'utilisateur sur lui-m\u00eame.</p> </li> </ul> <ul> <li> <p><code>nom du type de l'objet connect\u00e9</code></p> <p>Un LSprofile du nom du type d'objet utilisateur connect\u00e9 est automatiquement ajout\u00e9 \u00e0 l'utilisateur. Ainsi, si l'utilisateur connect\u00e9 est un LSobject <code>LSpeople</code> par exemple, il aura le LSprofile <code>LSpeople</code> sur tous l'annuaire. Ce LSprofile est utile pour donner des droits \u00e0 tous un type d'objets pouvant se connecter \u00e0 l'application (par exemple, tous les utilisateurs applicatifs).</p> </li> </ul>"},{"location":"conf/global/ldap/LSprofile/#profils-dutilisateurs-personalises","title":"Profils d'utilisateurs personalis\u00e9s","text":"<p>Il est possible de d\u00e9finir autant de profils d'utilisateurs que l'on souhaite. Pour chaque profil d'utilisateur personnalis\u00e9, il faudra d\u00e9finir dans quelles parties de l'annuaire ce profil existe (Exemple : les admistrateurs de groupes existent uniquement dans la branche de l'annuaire stockant les groupes). Enfin pour chaque partie de l'annuaire, il faudra d\u00e9finir la mani\u00e8re d'identifier si l'utilisateur qui se connecte appartient \u00e0 ce profil.</p> <pre><code>'LSprofile' => array (\n [nom d'un LSprofile] => array (\n [label] => [label du LSprofile],\n [basedn] => [dn utilisateur],\n [autre basedn] => array (\n [dn d'un utilisateur] => NULL,\n [autre dn] => array ( // via un listage de l'attribut d'un objet\n 'attr' => [nom de l'attribut cl\u00e9 de l'objet],\n 'attr_value' => [format de la valeur de l'attribut cl\u00e9],\n 'LSobject' => [nom du type LSobject de l'objet]\n )\n ),\n 'LSobjects' => array ( // via une liste d'objet sur lequel l'utilisateur a des pouvoirs\n [nom du LSobject] => array (\n 'attr' => [nom de l'attribut cl\u00e9],\n 'attr_value' => [format de la valeur de l'attribut cl\u00e9],\n // ou\n 'filter' => [format du filtre de recherche],\n\n 'basedn' => [basedn de recherche],\n 'params' => [configuration de la recherche]\n ),\n [nom quelconque] => array (\n 'filters' => array(\n array(\n 'LSobject' => [nom du LSobject],\n 'attr' => [nom de l'attribut cl\u00e9],\n 'attr_value' => [format de la valeur de l'attribut cl\u00e9],\n // ou\n 'filter' => [format du filtre de recherche],\n\n 'basedn' => [basedn de recherche],\n 'params' => [configuration de la recherche]\n ),\n ),\n ),\n ...\n )\n ),\n ...\n),\n...\n</code></pre> <p>Le param\u00e8tre <code>LSprofiles</code> est un tableau associatif contenant, en valeur cl\u00e9, le nom d'un LSprofile et en valeur associ\u00e9e, la configuration n\u00e9cessaire pour d\u00e9terminer si l'utilisateur connect\u00e9 appartient \u00e0 ce LSprofile pour tout ou partie de l'annuaire.</p> <p>Dans chaque configuration de LSprofile, il est possible d'identifier l'appartenance ou non de l'utilisateur connect\u00e9 de deux mani\u00e8res\u00a0:</p> <ul> <li> <p>Pour une branche de l'annuaire donn\u00e9e (basedn)\u00a0: en listant les utilisateurs appartenant \u00e0 ce LSprofile pour tous les objets de la branche. Il sera possible de lister les utilisateurs dont on connait le DN ou de lister les utilisateurs appartenant \u00e0 une liste stock\u00e9e dans l'annuaire (par exemple la liste des membres d'un groupe).</p> <ul> <li> <p>Liste des DNs d'utilisateurs\u00a0:</p> <pre><code>'LSprofile' => array (\n [nom du LSprofile] => array (\n [basedn] => [dn utilisateur],\n // ou si plusieurs DNs\n [autre basedn] => array (\n [dn d'un utilisateur] => NULL,\n [dn d'un utilisateur 2] => NULL\n ),\n ...\n ),\n ...\n),\n...\n</code></pre> <p>Explication\u00a0: Pour un LSprofile et un basedn donn\u00e9s, on d\u00e9finit l'utilisateur appartenant au LSprofile en donnant son DN. Si on souhaite lister plusieurs utilisateurs, on utilise un tableau associatif dans lequel les cl\u00e9s sont les DNs des utilisateurs et les valeurs associ\u00e9es sont toutes NULL.</p> </li> </ul> <ul> <li> <p>Liste d'utilisateurs stock\u00e9e dans l'annuaire\u00a0:</p> <pre><code>'LSprofile' => array (\n [nom du LSprofile] => array (\n [basedn] => array (\n [DN d'un object] => array (\n 'attr' => [nom de l'attribut cl\u00e9 de l'objet],\n 'attr_value' => [format de la valeur de l'attribut cl\u00e9],\n 'LSobject' => [nom du type LSobject de l'objet]\n )\n ),\n ...\n),\n...\n</code></pre> <p>Explication\u00a0: Pour un LSprofile et un basedn donn\u00e9s, on liste les utilisateurs du LSprofile r\u00e9f\u00e9renc\u00e9s dans l'attribut <code>attr</code> de l'object de type <code>LSobject</code> et selon le format de valeur d\u00e9crit dans <code>attr_value</code>.</p> </li> </ul> </li> </ul> <ul> <li> <p>Pour un type de LSobject donn\u00e9\u00a0: en listant les objets pour lesquels l'utilisateur aura les droits du LSprofile. Il sera possible, \u00e0 travers une recherche param\u00e9trable dans l'annuaire, de lister les objets pour lesquels l'utilisateur appartiendra au LSprofile.</p> <pre><code>'LSprofile' => array (\n [nom d'un LSprofile] => array (\n 'LSobjects' => array ( // via un liste d'objet pour lequel l'utilisateur\n // appartient au LSprofile\n [nom du LSobject] => array (\n 'attr' => [nom de l'attribut cl\u00e9],\n 'attr_value' => [format de la valeur de l'attribut cl\u00e9],\n // or\n 'filter' => [format du filtre de recherche],\n\n 'basedn' => [format du basedn de recherche],\n 'params' => [configuration de la recherche]\n ),\n array (\n 'filters' => array(\n array(\n 'LSobject' => [nom du LSobject],\n 'attr' => [nom de l'attribut cl\u00e9],\n 'attr_value' => [format de la valeur de l'attribut cl\u00e9],\n // ou\n 'filter' => [format du filtre de recherche],\n\n 'basedn' => [format du basedn de recherche],\n 'params' => [configuration de la recherche]\n ),\n ),\n ),\n ...\n )\n ),\n ...\n),\n...\n</code></pre> <p>Explications\u00a0: Dans la configuration d'un LSprofile, la valeur cl\u00e9 LSobjects signifie qu'on est dans un cas de la d\u00e9l\u00e9gation de droits sur des types d'LSobject. Dans ce tableau associatif, il est possible de d\u00e9finir un ou plusieurs types de LSobject pour lesquels on d\u00e9l\u00e8gue des droits via des recherches simples ou encha\u00een\u00e9es. Le fonctionnement simple consiste \u00e0 partir de l'objet de l'utilisateur et \u00e0 g\u00e9n\u00e9rer un filtre et une base de recherche sur un type de LSobject. Le fonctionnement enchain\u00e9e consiste \u00e0 faire un premi\u00e8re recherche \u00e0 partir de l'objet de l'utilisateur puis \u00e0 recommencer \u00e0 partir des objets trouv\u00e9s en construisant une liste de filtres de recherche pour chaque objet qui seront combin\u00e9s via l'op\u00e9rateur bool\u00e9en ou. Dans le cadre d'un fonctionnement enchain\u00e9e, la base de recherche est toujours g\u00e9n\u00e9rer \u00e0 partir de l'objet de l'utilisateur connect\u00e9.</p> <p>Pour configurer une d\u00e9l\u00e9gation de type simple on mettra le nom du LSobject dans la cl\u00e9 du tableau et dans la valeur un tableau d\u00e9finissant la recherche. Il est possible de ne pas utiliser la cl\u00e9 du tableau comme nom du LSobject gr\u00e2ce \u00e0 la cl\u00e9 de configuration LSobject.</p> <p>Pour configurer une d\u00e9l\u00e9gation de type encha\u00een\u00e9 on pourra utiliser n'importe quelle valeur unique pour la cl\u00e9 du tableau et pour la valeur un tableau contenant une unique cl\u00e9 filters. La valeur associ\u00e9e \u00e0 cette cl\u00e9 est celle d'une d\u00e9l\u00e9gation de type simple o\u00f9 la cl\u00e9 LSobject est devenue obligatoire.</p> <p>Cette configuration contient les param\u00e8tres d'une ou plusieurs recherches dans l'annuaire en consid\u00e9rant que l'utilisateur connect\u00e9 aura les droits du LSprofile sur les objets retourn\u00e9s. Les param\u00e8tres de la recherche sont\u00a0:</p> <ul> <li> <p><code>LSobject</code></p> <p>C'est le nom du LSobject recherch\u00e9. (Param\u00e8tre facultatif pour une d\u00e9l\u00e9gation de type simple)</p> </li> </ul> <ul> <li> <p><code>attr</code></p> <p>Nom de l'attribut des LSobjets contenant une valeur cl\u00e9 qui permettra d'identifier l'utilisateur comme ayant droit.</p> </li> </ul> <ul> <li> <p><code>attr_value</code></p> <p>Le format de la valeur cl\u00e9 prise par l'attribut <code>attr</code>. Ce format est compos\u00e9 \u00e0 partir des donn\u00e9es de l'objet de l'utilisateur connect\u00e9. Voir le paragraphe Format param\u00e8trable pour plus d'informations sur l'\u00e9criture du format.</p> </li> </ul> <ul> <li> <p><code>filter</code></p> <p>Ce param\u00e8tre remplace les param\u00e8tres <code>attr</code> et <code>attr_value</code>. Il est possible ici d'\u00e9crire directement le format param\u00e8trable du filtre recherche dans l'annuaire. Ce filtre sera automatiquement agr\u00e9ment\u00e9 des conditions sur l'attribut objectclass. Voir le paragraphe Format param\u00e8trable pour plus d'informations sur l'\u00e9criture du format.</p> </li> </ul> <ul> <li> <p><code>basedn</code></p> <p>C'est le format param\u00e9trable du basedn de la recherche g\u00e9n\u00e9r\u00e9 \u00e0 partir de l'utilisateur connect\u00e9. Il est possible ainsi de la limiter sur les LSojects d'une branche pr\u00e9cise de l'annuaire. Voir le paragraphe Format param\u00e8trable pour plus d'informations sur l'\u00e9criture du format. (Param\u00e8tre facultatif)</p> </li> </ul> <ul> <li> <p><code>params</code></p> <p>C'est un tableau associatif contenant les param\u00e8tres \u00e9tendus de la recherche. Voir le paragraphe Param\u00e8tres \u00e9tendus des recherches dans l'annuaire pour plus de d\u00e9tails. (Param\u00e8tre facultatif)</p> </li> </ul> </li> </ul> <p>Par ailleurs, il est possible d'attribuer un label plus explicite \u00e0 chaque LSprofile \u00e0 l'aide de la cl\u00e9 <code>label</code>. Ce label sera utilis\u00e9 pour faire r\u00e9f\u00e9rence au LSprofile lorsque n\u00e9c\u00e9ssaire. (Param\u00e8tre facultatif)</p>"},{"location":"conf/global/ldap/recoverPassword/","title":"R\u00e9cup\u00e9ration de mot de passe","text":"<p>Cette section d\u00e9crit la mani\u00e8re de configurer la r\u00e9cup\u00e9ration de mot de passe par les utilisateurs. Le m\u00e9canisme de r\u00e9cup\u00e9ration de mot de passe fonctionne en deux parties\u00a0:</p> <ul> <li> <p>Dans un premier lieu, l'utilisateur ayant perdu son mot de passe acc\u00e8de \u00e0 l'interface de r\u00e9cup\u00e9ration \u00e0 partir de la page de connexion. L'interface lui demande de saisir son identifiant et \u00e9ventuellement de s\u00e9lectionner le serveur LDAP concern\u00e9. Une fois ces informations saisies, une recherche de l'utilisateur est effectu\u00e9e dans l'annuaire et si celui-ci est trouv\u00e9, la valeur de l'attribut <code>recoveryHashAttr</code> de l'objet est alors red\u00e9finie avec une valeur al\u00e9atoire.</p> <p>Un mail est ensuite envoy\u00e9 \u00e0 l'utilisateur en utilisant la premi\u00e8re valeur de l'attribut <code>mailAttr</code> comme adresse. Ce mail est form\u00e9 \u00e0 partir des param\u00e8tres du tableau associatif <code>recoveryHashMail</code>. Celui-ci doit contenir le sujet du mail dans <code>subject</code> et le corps du message dans <code>msg</code>. Ces deux informations sont des formats param\u00e8trables compos\u00e9s avec, comme valeur cl\u00e9, l'URL de retour \u00e0 laquelle l'utilisateur devra se rendre pour acc\u00e8der \u00e0 la seconde \u00e9tape de la r\u00e9cup\u00e9ration de son mot de passe.</p> </li> </ul> <ul> <li> <p>L'utilisateur doit donc se rendre sur l'interface par l'interm\u00e9diaire de l'URL qui lui aura \u00e9t\u00e9 fournie dans le mail de l'\u00e9tape pr\u00e9c\u00e9dente. Cette URL contient la valeur de l'attribut <code>recoveryHashAttr</code> pr\u00e9c\u00e9dement d\u00e9finie. A partir de cette information, une recherche est effectu\u00e9e dans l'annuaire pour retrouver l'utilisateur correspondant.</p> <p>Si l'utilisateur est retrouv\u00e9, un nouveau mot de passe lui est g\u00e9n\u00e9r\u00e9 en utilisant les param\u00e8tres de configuration \u00e9ventuellement d\u00e9finis dans la configuration HTML de l'attribut \"mot de passe\". Pour avoir plus d'information sur ces param\u00e8tres, consulter la documentation du type d'attribut HTML LSattr_html_password. L'attribut <code>recoveryHashAttr</code> est quant \u00e0 lui supprim\u00e9.</p> <p>Ensuite, un mail est compos\u00e9 \u00e0 partir des param\u00e8tres du tableau associatif <code>newPasswordMail</code> et est envoy\u00e9 \u00e0 l'utilisateur. Ce tableau doit contenir le sujet du mail dans <code>subject</code> et le corps du message dans <code>msg</code>. Ces deux informations sont des formats param\u00e8trables compos\u00e9s avec, comme valeur cl\u00e9, le nouveau mot de passe de l'utilisateur.</p> </li> </ul> <pre><code>'recoverPassword' => array(\n 'mailAttr' => '[attribut mail]',\n 'recoveryHashAttr' => '[attribut hash]',\n 'recoveryEmailSender' => '[adresse mail utilis\u00e9e par LdapSaisie pour l'envoi des mails]',\n 'recoveryHashMail' => array( // 1er mail : avec l'URL pour l'acc\u00e8s \u00e0 la 2nde partie\n 'subject' => '[sujet du mail]',\n 'msg' => \"[message contenant le mot cl\u00e9 %{url}]\"\n ),\n 'newPasswordMail' => array( // 2nd mail : avec le mot de passe\n 'subject' => '[sujet du mail]',\n 'msg' => \"[message contenant le mot cl\u00e9 %{mdp}]\"\n )\n),\n...\n</code></pre>"},{"location":"conf/global/ldap/subDn/","title":"Sous-niveaux de connexion","text":"<p>Cette section d\u00e9crit la mani\u00e8re de d\u00e9finir des sous-niveaux de connexion \u00e0 l'annuaire (subDn). Le concept de sous-niveau de connexion sert \u00e0 d\u00e9clarer les niveaux logiques de l'annuaire. Par exemple, dans un annuaire dans lequel sont stock\u00e9s des objets concernant plusieurs organisations et que celles-ci se distinguent gr\u00e2ce \u00e0 la pr\u00e9sence d'une s\u00e9paration dans l'arbre, il sera alors possible de d\u00e9finir des sous-niveaux de connexion pour chacune des organisations.</p> <p>Exemple d'arborescence d'annuaire utilisant le concept de sous-niveaux correspondant \u00e0 des soci\u00e9t\u00e9s :</p> <pre><code>|- o=ls\n| |- ou=companies\n| | |- ou=company1\n| | | |- ou=people\n| | | |- ou=groups\n| | |- ou=company2\n| | | |- ou=people\n| | | |- ou=groups\n| |- ou=people\n| |- ou=groups\n</code></pre> <p>Explications : Il est possible dans cet exemple de d\u00e9finir des sous-niveaux de connexion correspondants aux soci\u00e9t\u00e9s. Dans chacune de ces soci\u00e9t\u00e9s, on retrouve les OU correspondant au type d'LSobjets. Lors de la connexion \u00e0 l'interface, l'utilisateur devra choisir dans quel sous-niveau de l'annuaire il souhaite se connecter. Une fois connect\u00e9, l'utilisateur manipulera uniquement les objets du sous-niveau de l'annuaire dans lequel il se trouve. Il lui sera \u00e9galement possible de changer de sous-niveau de connexion \u00e0 travers l'interface\u00a0: une liste d\u00e9roulante est disponible pour cela dans le menu.</p> <p>Il existe deux mani\u00e8res de d\u00e9clarer des sous-niveaux de connexion \u00e0 l'annuaire\u00a0:</p> <ul> <li>En d\u00e9clarant manuellement un subDn de l'annuaire et en lui donnant un nom.</li> </ul> <ul> <li>En listant les LSobjets d'un type pr\u00e9cis et en utilisant leurs donn\u00e9es pour constituer le nom des sous-niveaux. Cette liste est constitu\u00e9e en effectuant une recherche dans l'annuaire. Il est possible de d\u00e9finir un basedn particulier pour cette recherche.</li> </ul> <p>Pour chacune de ces m\u00e9thodes on d\u00e9finira \u00e9galement les types d'LSobjets qui sont pr\u00e9sents dans cette branche de l'annuaire.</p> <pre><code>'subDn' => array(\n // D\u00e9claration manuelle\n '[Nom du sous-niveau]' => array(\n 'dn' => '[basedn du sous-niveau]',\n 'nologin' => true, // D\u00e9sactive la connection dans ce subDn\n 'LSobjects' => array( // Liste des types d'LSobjets pr\u00e9sents dans le sous-niveau\n [LSobject1],\n [LSobject2],\n ...\n )\n ),\n // Liste de LSobjets\n 'LSobject' => array(\n '[type d'LSobject]' => array( // le type d'LSobjet \u00e0 lister\n 'basedn' => '[basedn]', // Le basedn de la recherche\n 'displayValue' => '[format]', // Format du nom des sous-niveaux\n 'nologin' => true, // D\u00e9sactive la connection dans ces subDn\n 'onlyAccessible' => True, // Pour que seul les LSobjet accessible \u00e0 l'utilisateur soit list\u00e9\n 'LSobjects' => array( // Liste des types d'LSobjets pr\u00e9sents dans les sous-niveaux\n [LSobject1],\n [LSobject2],\n ...\n )\n )\n )\n),\n...\n</code></pre>"},{"location":"contrib/","title":"Contribution","text":"<p>Comme tout projet libre qui se respecte, les contributions \u00e0 LdapSaisie sont les bienvenues. Ce chapitre explique les possibilit\u00e9s de contribution.</p>"},{"location":"contrib/form-elements/","title":"Les \u00e9l\u00e9ments des formulaires (LSformElement)","text":"<p>Les LSformElements sont les types de champs de formulaire support\u00e9s par l'application.</p> <p>Pour chaque type impl\u00e9ment\u00e9, on devra trouver :</p> <ul> <li>Une classe PHP d\u00e9riv\u00e9e de la classe <code>LSattr_html</code> et devant s'appeler <code>LSattr_html_[nom du type d'attribut HTML]</code>. Dans celle-ci, il devra \u00eatre d\u00e9fini \u00e0 minima la variable de classe <code>LSformElement_type</code> permettant de r\u00e9f\u00e9rencer le type d'LSformElement \u00e0 utiliser ;</li> </ul> <ul> <li> <p>Une classe PHP d\u00e9riv\u00e9e de la classe <code>LSformElement</code> et devant s'appeler <code>LSformElement_[nom du type d'LSformElement]</code>. Cette classe impl\u00e9mentera tout ce qui concerne l'affichage du champ dans le formulaire et le traitement d'une valeur retourn\u00e9e par ce dernier. Cela concerne notamment les m\u00e9thodes suivantes\u00a0:</p> <ul> <li> <p><code>getDisplay()</code></p> <p>Retourne les informations d'affichage du champ dans un formulaire sous la forme d'un tableau (impl\u00e9mentation obligatoire, pas de m\u00e9thode par d\u00e9faut). Il sera possible de s'appuyer sur la m\u00e9thode <code>getLabelInfos()</code> permettant de g\u00e9n\u00e9rer et r\u00e9cup\u00e9rer tout ce qui concerne le label du champ du formulaire. Il faudra cependant \u00e0 minima fournir \u00e9galement la cl\u00e9 <code>html</code> dans le tableau retourn\u00e9 qui devra contenir le bout de code HTML correspondant au champ du formulaire. Commun\u00e9ment, ce code HTML est g\u00e9n\u00e9r\u00e9 en appelant la m\u00e9thode <code>fetchTemplate()</code>.</p> </li> </ul> <ul> <li> <p><code>fetchTemplate()</code></p> <p>Retourne le code HTML du champ dans le formulaire. L'impl\u00e9mentation de cette m\u00e9thode est facultative et par d\u00e9faut, cette m\u00e9thode utilisera la variable de classe <code>$template</code> pour conna\u00eetre le fichier de template \u00e0 utiliser. Ce fichier de template permettra la g\u00e9n\u00e9ration de la liste de tous les champs associ\u00e9s \u00e0 chacune des valeurs de l'attribut. Individuellement, le champ d'une des valeurs de l'attribut est g\u00e9n\u00e9r\u00e9 \u00e0 l'aide du fichier de template r\u00e9f\u00e9renc\u00e9 dans la variable de class <code>$fieldTemplate</code>.</p> <p>Note</p> <p>La variable de classe <code>$fieldTemplate</code> est \u00e9galement utilis\u00e9e par la m\u00e9thode <code>LSformElement :: getEmptyField()</code> qui sert \u00e0 g\u00e9n\u00e9rer le code HTML d'un champ du formulaire pour une nouvelle valeur de l'attribut. Cette m\u00e9thode est notamment utilis\u00e9e lorsque l'on clique sur le bouton permettant d'ajouter une valeur \u00e0 un champ du formulaire.</p> </li> </ul> <ul> <li> <p><code>getPostData()</code></p> <p>R\u00e9cup\u00e8re dans les donn\u00e9es post\u00e9es par le formulaire, celle concernant ce champ. Cette m\u00e9thode devra potentiellement traiter l'ensemble des valeurs de l'attribut envoy\u00e9es par le formulaire et les d\u00e9finir dans le tableau pass\u00e9 en r\u00e9f\u00e9rence en tant que premier argument, les valeurs de l'attribut. L'impl\u00e9mentation de cette m\u00e9thode est facultative et par d\u00e9faut, un tableau de valeurs portant le nom de l'attribut LDAP correspondant sera r\u00e9cup\u00e9r\u00e9e comme valeur de l'attribut.</p> <p>Note</p> <p>Pour plus d'informations sur le r\u00f4le et fonctionnement de cette m\u00e9thode, r\u00e9f\u00e9rer \u00e0 la m\u00e9thode par d\u00e9faut, d\u00e9finie dans la classe PHP parente <code>LSformElement</code>.</p> </li> </ul> <ul> <li> <p><code>setValueFromPostData()</code></p> <p>D\u00e9finit les valeurs de l'attribut \u00e0 partir des donn\u00e9es re\u00e7ues du formulaire (et r\u00e9cup\u00e9r\u00e9es par la m\u00e9thode <code>getPostData</code>). L'impl\u00e9mentation de cette m\u00e9thode est facultative et par d\u00e9faut, aucune transformation ne sera faites \u00e0 cette \u00e9tape sur les donn\u00e9es r\u00e9cup\u00e9r\u00e9es depuis le formulaire. Impl\u00e9menter cette m\u00e9thode pourra cependant se r\u00e9v\u00e9ler utile en cas de champs de formulaire complexe (attribut composite par exemple).</p> </li> </ul> <ul> <li> <p><code>autocomplete_attr_values()</code></p> <p>G\u00e9n\u00e8re de la liste des valeurs possibles de l'attribut dans un contexte CLI.</p> <p>Note</p> <p>Pour plus d'informations sur le r\u00f4le et fonctionnement de cette m\u00e9thode, r\u00e9f\u00e9rer aux commentaires de la m\u00e9thode par d\u00e9faut, d\u00e9finie dans la classe PHP parente <code>LSformElement</code>. Vous pouvez \u00e9galement vous inspirer des exemples d'impl\u00e9mentations fournies avec les autres type d'LSformElement.</p> </li> </ul> </li> </ul> <ul> <li>Un (ou plusieurs) fichier template pour la g\u00e9n\u00e9ration du code HTML du champ du formulaire. Commun\u00e9ment, le fichier <code>LSformElement.tpl</code> est utilis\u00e9 pour g\u00e9n\u00e9rer la structure de la liste des champs correspondant aux diff\u00e9rentes valeurs de l'attribut. Ce template utilise une variable <code>$fieldTemplate</code> pour d\u00e9finir quel fichier template devra \u00eatre utilis\u00e9 pour g\u00e9n\u00e9rer le code HTML de chaque champ associ\u00e9s \u00e0 une valeur. C'est ce second fichier de template qui est en g\u00e9n\u00e9ral \u00e0 fournir \u00e0 minima avec votre LSformElement.</li> </ul> <p>Note</p> <p>Il peut \u00eatre utile d'\u00e9tendre un type d'LSformElement existant pour faciliter l'impl\u00e9mentation d'un nouveau type. Pour cela, vous devez utiliser l'h\u00e9ritage de classe PHP en faisant d\u00e9river vos nouvelles classes des classes du LSformElement dont vous vous inspirer, plut\u00f4t que les classes g\u00e9n\u00e9riques. Vous pouvez prendre exemple sur le type d'LSformElement <code>pre</code> qui s'inspire du type <code>textarea</code>, ou encore du type <code>url</code> d\u00e9riv\u00e9 du type <code>text</code>.</p>"},{"location":"contrib/form-rules/","title":"Les r\u00e8gles de validation syntaxiques (LSformRule)","text":"<p>Les LSformRules sont les r\u00e8gles syntaxiques applicables aux champs des formulaires. Ces r\u00e8gles serviront \u00e0 s'assurer que les valeurs des champs r\u00e9cup\u00e9r\u00e9es des formulaires sont syntaxiquement correctes. Elles seront configurables via le param\u00e8tre <code>check_data</code> des attributs des LSobjects.</p> <p>Pour chaque type impl\u00e9ment\u00e9, on trouvera une classe PHP d\u00e9riv\u00e9e de la classe <code>LSformRule</code> et devant s'appeler <code>LSattr_rule_[nom du type]</code>. Dans celle-ci, il devra \u00eatre d\u00e9fini la m\u00e9thode statique <code>validate()</code> qui impl\u00e9mentera le contr\u00f4le syntaxique. Cette m\u00e9thode prendra en param\u00e8tres :</p> <ul> <li> <p><code>$value</code></p> <p>La valeur \u00e0 tester.</p> </li> </ul> <ul> <li> <p><code>$options</code></p> <p>Un tableau des options d\u00e9finies dans la configuration pour ce contr\u00f4le syntaxique.</p> </li> </ul> <ul> <li> <p><code>$formElement</code></p> <p>Une r\u00e9f\u00e9rence au champ du formulaire (objet LSformElement).</p> </li> </ul> <p>Cette m\u00e9thode devra retourner <code>True</code> ou <code>False</code> si la valeur test\u00e9e est respectivement valide ou invalide. Elle pourra \u00e9galement d\u00e9clencher une exception <code>LSformRuleException</code> qui lui permettra de donner des messages d'erreurs elle-m\u00eame sur le(s) probl\u00e8me(s) detect\u00e9(s) durant l'analyse de la valeur pass\u00e9e. Le constructeur de ce type d'exception prend en tant que premier param\u00e8tre un tableau de messages d'erreurs (ou un simple message d'erreur) qui seront retourn\u00e9s \u00e0 l'utilisateur.</p> <p>Note</p> <p>Par d\u00e9faut, les valeurs de l'attribut sont test\u00e9es une \u00e0 une via la m\u00e9thode <code>validate()</code>. Cependant, il est possible d'impl\u00e9menter une m\u00e9thode de validation pour toutes les valeurs de l'attribut en une seule fois en affectant la valeur <code>false</code> \u00e0 la constante de classe <code>validate_one_by_one</code>. Dans ce cas, l'ensemble des valeurs de l'attribut seront pass\u00e9es via le param\u00e8tre <code>$value</code> \u00e0 la m\u00e9thode <code>validate()</code> (sous la forme d'un tableau). Cela pourra par exemple \u00eatre utile pour impl\u00e9menter une validation de la coh\u00e9rence des valeurs les unes vis \u00e0 vis des autres (unicit\u00e9, nombre maximum de valeurs, \u2026).</p>"},{"location":"contrib/addons/","title":"Les addons (LSaddon)","text":"<p>Les LSaddons sont utilis\u00e9s pour impl\u00e9menter dans LdapSaisie des fonctionnalit\u00e9s sp\u00e9cifiques tel que :</p> <ul> <li>le support d'une famille d'attributs sp\u00e9cifiques (POSIX, Samba, SUPANN\u2026) par le biais de m\u00e9thodes de g\u00e9n\u00e9ration de la valeur de ces attributs par exemple (param\u00e8tre <code>generate_function</code>) ;</li> </ul> <ul> <li>des t\u00e2ches communes et g\u00e9n\u00e9riques (envoi de mails, connexion FTP/SSH\u2026) ;</li> </ul> <ul> <li>l'impl\u00e9mentation de d\u00e9clencheurs sp\u00e9cifiques \u00e0 votre environnement : cr\u00e9ation automatique du dossier client sur le serveur de fichiers de l'entreprise, cr\u00e9ation de la boite mail de l'utilisateur\u2026 ;</li> </ul> <ul> <li>l'impl\u00e9mentation de vues personnalis\u00e9es propos\u00e9es dans l'interface</li> </ul> <ul> <li>l'impl\u00e9mentation d'action personnalis\u00e9e sur les objets (synchronisation, archivage\u2026) ou sur les r\u00e9sultats de recherches (export, rapport personnalis\u00e9\u2026) ;</li> </ul>"},{"location":"contrib/addons/#structure-decriture","title":"Structure d'\u00e9criture","text":"<p>L'\u00e9criture d'un LSaddon doit respecter une structure suffisamment souple afin de ne pas \u00eatre un frein \u00e0 vos contributions, tout en permettant d'assurer la bonne int\u00e9gration de votre contribution au projet. Le code que vous \u00e9crirez sera r\u00e9parti dans deux fichiers :</p> <ul> <li> <p><code>conf/LSaddons/config.LSaddons.[addon name].php</code></p> <p>Ce fichier contiendra la configuration de votre LSaddon. On y retrouvera la d\u00e9claration de constances et/ou variables de configuration permettant d'adapter votre LSaddon \u00e0 une installation et \u00e0 un environnement.</p> </li> </ul> <ul> <li> <p><code>includes/addons/LSaddons.[addon name].php</code></p> <p>Ce fichier contiendra le code \u00e0 proprement dit de votre LSaddon.</p> <p>Structure du fichier includes/addons/LSaddons.[addon name].php :</p> <pre><code><?php\n\n/*\n * Error messages\n */\n\n// Support error messages\nLSerror :: defineError('MYADDON_SUPPORT_01',\n ___(\"MYADDON Support : Unable to load %{dep}.\")\n);\n\nLSerror :: defineError('MYADDON_SUPPORT_02',\n ___(\"MYADDON Support : The constant %{const} is not defined.\")\n);\n\n// Other orror messages\nLSerror :: defineError('MYADDON_01',\n ___(\"An error : %{msg}.\")\n);\n\nLSerror :: defineError('MYADDON_02',\n ___(\"An other error about %{about} : %{msg}\")\n);\n\nLSerror :: defineError('MYADDON_03',\n ___(\"Unknown error.\")\n);\n\n/**\n * Verify support of my addon by LdapSaisie\n *\n * @author My Name <my.email@example.com>\n *\n * @return boolean true if my addon is totaly supported, false in other cases\n **/\nfunction LSaddon_myaddon_support() {\n\n $retval=true;\n\n // Check/load dependencies\n if ( !class_exists('mylib') ) {\n if ( !LSsession::includeFile(LS_LIB_DIR . 'class.mylib.php') ) {\n LSerror :: addErrorCode('MYADDON_SUPPORT_01', 'mylib');\n $retval=false;\n }\n }\n\n\n $MUST_DEFINE_CONST= array(\n 'LS_MYADDON_CONF_O1',\n 'LS_MYADDON_CONF_O2',\n ...\n );\n\n foreach($MUST_DEFINE_CONST as $const) {\n if ( (!defined($const)) || (constant($const) == \"\")) {\n LSerror :: addErrorCode('MYADDON_SUPPORT_02',$const);\n $retval=false;\n }\n }\n\n if ($retval) {\n // Register LSaddon view using LSsession :: registerLSaddonView()\n\n if (php_sapi_name() == 'cli') {\n // Register LSaddon CLI command using LScli :: add_command()\n }\n }\n\n return $retval;\n}\n\n/**\n * My first function\n *\n * Description of this wonderfull function\n *\n * @author My Name <my.email@example.com>\n *\n * @return [type(s) of returned values (pipe separator)] Description of the return of this function\n **/\nfunction myaddon_first_function($arg1, $arg2) {\n // Do some stuff\n if (something) {\n LSerror :: addErrorCode(\n 'MYADDON_01',\n 'something went wrong' // Error LSformat unique argument\n );\n return false;\n }\n\n if (something else) {\n LSerror :: addErrorCode(\n 'MYADDON_02',\n array( // Error LSformat arguments\n 'about' => 'second step',\n 'msg' => 'something went wrong'\n )\n );\n return false;\n }\n\n if (still something else) {\n LSerror :: addErrorCode('MYADDON_03'); // Error without argument\n return false;\n }\n return true;\n}\n\n[...]\n\n// Defined custom CLI commands functions only on CLI context\nif (php_sapi_name() != 'cli')\n return true; // Always return true to avoid some warning in log\n\n// Defined functions handling custom CLI commands and optionnaly\n// their arguments autocompleter functions.\n</code></pre> </li> </ul> <p>Par convention, la structure de ce fichier est toujours \u00e0 peu pr\u00e8s la m\u00eame:</p> <ul> <li>On d\u00e9clare tout d'abord les messages d'erreurs qui seront potentiellement \u00e9mis par notre LSaddon en commen\u00e7ant par les messages d'erreurs li\u00e9s au support de cet LSaddon. On utilise pour cela la m\u00e9thode <code>LSerror :: defineError()</code> qui attends en premier argument, l'identifiant du message d'erreur et en tant que second argument, le LSformat du message d'erreur. Par convention, les identifiants des messages d'erreurs seront en majuscule et pr\u00e9fix\u00e9s du nom du LSaddon.</li> </ul> <ul> <li> <p>On d\u00e9clare ensuite une fonction <code>LSaddon_[myaddon]_support</code> qui sera ex\u00e9cut\u00e9e lors du chargement de l'addon et qui permettra de s'assurer du support de celui-ci. Cette fonction devra retourner <code>True</code> si c'est le cas ou <code>False</code> dans le cas contraire.</p> <p>Cette fonction s'assura notamment :</p> <ul> <li>que les librairies dont l'addon d\u00e9pends sont bien charg\u00e9es et fonctionnelles ;</li> <li>que ses variables et constantes de configuration sont bien d\u00e9finies ;</li> <li>de d\u00e9clarer les vues personnalis\u00e9es fournies par cet LSaddon ;</li> <li>de d\u00e9clarer les commandes CLI personnalis\u00e9es fournies par cet LSaddon ;</li> </ul> </li> </ul> <ul> <li>On d\u00e9clare ensuite les fonctions, classes et \u00e9l\u00e9ments fournis et manipul\u00e9s par l'addon.</li> <li> <p>Si notre addon offre des commandes CLI personnalis\u00e9es, les fonctions les impl\u00e9mentant ne seront d\u00e9finies, dans un souci de performance, que dans un contexte ou elles seraient potentiellement appelables, c'est \u00e0 dire dans un contexte d'ex\u00e9cution <code>CLI</code>. Pour cela, nous utilisons commun\u00e9ment la fonction <code>php_sapi_name</code> pour d\u00e9terminer le contexte d'ex\u00e9cution et si celui-ci vaut <code>cli</code>, nous stoppons l'ex\u00e9cution du reste du code du fichier via un <code>return true</code>.</p> <p>Note</p> <p>Il est important dans ce contexte de ne jamais retourner autre chose que <code>True</code> pour \u00e9viter tout message d'erreur inutile dans les logs.</p> </li> </ul> <ul> <li>On d\u00e9clare, pour finir, les fonctions impl\u00e9mentant les commandes CLI personnalis\u00e9es et leur \u00e9ventuelle fonction g\u00e9rant l'autocompl\u00e9tion des arguments qu'elles acceptent.</li> </ul>"},{"location":"contrib/addons/cli-commands/","title":"Les commandes CLI personnalis\u00e9es","text":"<p>Les LSaddons peuvent fournir des commandes CLI personnalis\u00e9es qui seront accessibles via la commande <code>ldapsaisie</code> fournie avec l'application. Cela peut, par exemple, vous permettre de rendre accessible en ligne de commandes une proc\u00e9dure impl\u00e9ment\u00e9e dans le code d'LdapSaisie et vous permettre de mettre en place une t\u00e2che planifi\u00e9e ex\u00e9cutant cette proc\u00e9dure r\u00e9guli\u00e8rement.</p> <p>Pour mettre en place une telle commande CLI personnalis\u00e9e, il est n\u00e9cessaire de :</p> <ul> <li>D\u00e9clarer cette vue dans la fonction <code>LSaddon_[addon]_support</code> de l'addon \u00e0 l'aide de la m\u00e9thode <code>LScli :: add_command()</code> ;</li> </ul> <ul> <li>D\u00e9clarer la fonction impl\u00e9mentant cette commande CLI personnalis\u00e9e. Cette fonction acceptera, en tant qu'unique param\u00e8tre, un tableau des arguments re\u00e7us lors de l'ex\u00e9cution de la commande et retournera <code>True</code> ou <code>False</code> en cas de succ\u00e8s/d'erreur d'ex\u00e9cution de la commande. Cette valeur de retour influencera le code retourn\u00e9 par la commande : <code>0</code> en cas de succ\u00e8s, <code>1</code> en cas d'erreur.</li> </ul> <ul> <li> <p>Bien que cela ne soit pas obligatoire, il sera \u00e9galement possible de d\u00e9clarer une fonction permettant l'autocompl\u00e9tion des arguments accept\u00e9s par la commande.</p> <p>Cette m\u00e9thode recevra en param\u00e8tre :</p> <ul> <li> <p><code>$command_args</code></p> <p>Un tableau des arguments d\u00e9j\u00e0 re\u00e7us par la commande.</p> </li> </ul> <ul> <li> <p><code>$comp_word_num</code></p> <p>Un entier indiquant le rang de l'argument que l'autocompl\u00e9tion tente de compl\u00e9ter. Il peut s'agir du rang d'un param\u00e8tre d\u00e9j\u00e0 fourni et pr\u00e9sent dans le tableau <code>$command_args</code> ou bien d'un rang sup\u00e9rieur aux nombres d'arguments d\u00e9j\u00e0 fournis \u00e0 la commande et dans ce cas il s'agira d'autocompl\u00e9ter tous potentiels autre argument que pourrait accepter cette commande.</p> </li> </ul> <ul> <li> <p><code>$comp_word</code></p> <p>Une cha\u00eene de caract\u00e8res correspondant \u00e0 ce qu'a d\u00e9j\u00e0 saisi l'utilisateur de l'argument que l'on tente d'autocompl\u00e9ter. Cette cha\u00eene de caract\u00e8res peut \u00eatre vide ou non, en fonction de s'il s'agit d'un nouvel argument \u00e0 autocompl\u00e9ter ou non.</p> </li> </ul> <ul> <li> <p><code>$opts</code></p> <p>Un tableau des potentiels arguments globaux accept\u00e9s par LScli dans le contexte actuel (par exemple, <code>-d</code> ou <code>--debug</code> pour l'activation du mode debug). La r\u00e9ponse de cette fonction devra inclure ces potentiels arguments si le contexte d'autocompl\u00e9tion si pr\u00eate (nouvel argument par exemple).</p> </li> </ul> <p>Pour finir, cette fonction devra retourner un tableau des potentielles valeurs que pourrait prendre l'argument autocompl\u00e9t\u00e9. Si une unique proposition est faite \u00e0 l'utilisateur, celle-ci sera automatiquement propos\u00e9e \u00e0 l'utilisateur et \u00e0 d\u00e9faut, la liste des valeurs possibles lui seront affich\u00e9es.</p> <p>Note</p> <p>Pour vous aider dans l'\u00e9crire d'une telle m\u00e9thode d'autocompl\u00e9tion, des m\u00e9thodes statiques sont fournies par la classe <code>LScli</code> pour les autocompl\u00e9tions les plus courantes :</p> <ul> <li><code>LScli :: autocomplete_class_name()</code></li> </ul> <p>Autocompl\u00e9tion du nom d'une classe PHP.</p> <ul> <li><code>LScli :: autocomplete_addon_name()</code></li> </ul> <p>Autocompl\u00e9tion du nom d'un LSaddon.</p> <ul> <li><code>LScli :: autocomplete_int()</code></li> </ul> <p>Autocompl\u00e9tion d'un nombre entier.</p> <ul> <li><code>LScli :: autocomplete_LSobject_types()</code></li> </ul> <p>Autocompl\u00e9tion du nom d'un type d'LSobject.</p> <ul> <li><code>LScli :: autocomplete_LSobject_dn()</code></li> </ul> <p>Autocompl\u00e9tion du DN d'un type pr\u00e9cis d'LSobject de l'annuaire.</p> <p>Par ailleurs, la m\u00e9thode <code>LScli :: autocomplete_opts()</code> vous facilitera la construction de la liste des valeurs d'autocompl\u00e9tion de l'argument courant en fonction de ce qui a d\u00e9j\u00e0 \u00e9t\u00e9 saisi par l'utilisateur (param\u00e8tre <code>$comp_word</code>). Cette m\u00e9thode s'occupera en l'occurrence de filtrer parmi toutes les valeurs contextuelles possibles, celles qui correspondent au pr\u00e9fixe fourni par l'utilisateur.</p> </li> </ul> <p>Pour impl\u00e9menter une telle commande CLI personnalis\u00e9e, vous pouvez vous inspirer de l'exemple fourni ci-dessous ou encore des commandes CLI fournies par les autres LSaddons ou classes PHP de l'application.</p> <p>Structure du fichier includes/addons/LSaddons.[addon name].php :</p> <pre><code><?php\nfunction LSaddon_myaddon_support() {\n\n $retval=true;\n\n // Some check\n\n if ($retval) {\n if (php_sapi_name() == 'cli') {\n LScli :: add_command(\n 'my_custom_cli_cmd', // The CLI command name (required)\n 'cli_my_custom_cli_cmd', // The CLI command handler (must be callable, required)\n 'My custom CLI command', // A short description of what this command does (required)\n '[arg1] [arg2] [...]', // A short list of commands available arguments show in usage message\n // (optional, default: false)\n 'This command permit to ...', // A long description of what this command does (optional, default:\n // false)\n true, // Permit to define if this command need connection to LDAP server\n // (optional, default: true)\n 'cli_my_custom_cli_cmd_autocompleter', // Callable of the CLI command arguments autocompleter (optional,\n // default: null)\n true // Allow override if a command already exists with the same name\n // (optional, default: null)\n );\n }\n }\n\n return $retval;\n}\n\n[...]\n\n// Defined CLI commands functions only on CLI context\nif (php_sapi_name() != 'cli')\n return true; // Always return true to avoid some warning in log\n\n/**\n * My addon CLI command my_custom_cli_cmd handler function\n *\n * Description of this CLI command.\n *\n * @param array $command_args Command arguments\n * - Positional arguments :\n * - LSobject\n * - dn\n * - Optional arguments :\n * - -f|--force : Force mode\n *\n * @author My Name <my.email@example.com>\n *\n * @return boolean True on success, false otherwise\n **/\nfunction cli_my_custom_cli_cmd($command_args) {\n $objType = null;\n $dn = null;\n $force_mode = false;\n foreach ($command_args as $arg) {\n if ($arg == '-f' || $arg == '--force')\n $force_mode = true;\n elseif (is_null($objType)) {\n $objType = $arg;\n }\n elseif (is_null($dn)) {\n $dn = $arg;\n }\n else\n LScli :: usage(\"Invalid $arg parameter.\");\n }\n\n if (is_null($objType) || is_null($dn))\n LScli :: usage('You must provide LSobject type and DN.');\n\n if (!LSsession :: loadLSobject($objType))\n return false;\n\n $obj = new $objType();\n if (!$obj->loadData($dn)) {\n self :: log_fatal(\"Fail to load object $dn data from LDAP\");\n return false;\n }\n\n // Do some stuff on loaded object\n [...]\n\n return true;\n}\n\n/**\n * Args autocompleter for CLI my_custom_cli_cmd command\n *\n * @param array<string> $command_args List of already typed words of the command\n * @param int $comp_word_num The command word number to autocomplete\n * @param string $comp_word The command word to autocomplete\n * @param array<string> $opts List of global available options\n *\n * @return array<string> List of available options for the word to autocomplete\n **/\npublic static function cli_my_custom_cli_cmd_autocompleter($command_args, $comp_word_num, $comp_word, $opts) {\n $opts = array_merge($opts, array ('-f', '--force'));\n\n // Handle positional args\n $objType = null;\n $objType_arg_num = null;\n $dn = null;\n $dn_arg_num = null;\n for ($i=0; $i < count($command_args); $i++) {\n if (!in_array($command_args[$i], $opts)) {\n // If object type not defined\n if (is_null($objType)) {\n // Defined it\n $objType = $command_args[$i];\n LScli :: unquote_word($objType);\n $objType_arg_num = $i;\n\n // Check object type exists\n $objTypes = LScli :: autocomplete_LSobject_types($objType);\n\n // Load it if exist and not trying to complete it\n if (in_array($objType, $objTypes) && $i != $comp_word_num) {\n LSsession :: loadLSobject($objType, false);\n }\n }\n elseif (is_null($dn)) {\n $dn = $command_args[$i];\n LScli :: unquote_word($dn);\n $dn_arg_num = $i;\n }\n }\n }\n\n // If objType not already choiced (or currently autocomplete), add LSobject types to available options\n if (!$objType || $objType_arg_num == $comp_word_num)\n $opts = array_merge($opts, LScli :: autocomplete_LSobject_types($comp_word));\n\n // If dn not alreay choiced (or currently autocomplete), try autocomplete it\n elseif (!$dn || $dn_arg_num == $comp_word_num)\n $opts = array_merge($opts, LScli :: autocomplete_LSobject_dn($objType, $comp_word));\n\n return LScli :: autocomplete_opts($opts, $comp_word);\n}\n</code></pre>"},{"location":"contrib/addons/custom-views/","title":"Les vues personnalis\u00e9es","text":"<p>Les LSaddons peuvent fournir des vues personnalis\u00e9es qui seront accessibles \u00e0 tout ou parties des utilisateurs de l'application. Ce filtrage d'acc\u00e8s sera fait en utilisant les LSprofiles de l'utilisateur connect\u00e9 sur la racine courante de l'annuaire LDAP.</p> <p>Pour mettre en place une telle vue personnalis\u00e9e, il est n\u00e9cessaire de :</p> <ul> <li>D\u00e9clarer cette vue dans la fonction <code>LSaddon_[addon]_support</code> de l'addon \u00e0 l'aide de la m\u00e9thode <code>LSsession :: registerLSaddonView()</code> ;</li> </ul> <ul> <li>D\u00e9clarer la fonction impl\u00e9mentant cette vue. Cette fonction n'acceptera aucun param\u00e8tre et ne retournera rien. Elle devra en outre s'occuper de d\u00e9finir son fichier template et charger les d\u00e9pendances de ce dernier (fichiers CSS & JS, variables...).</li> </ul> <p>Pour impl\u00e9menter une telle vue personnalis\u00e9e, vous pouvez vous inspirer de l'exemple fourni ci-dessous ou encore des vues fournies par les autres LSaddons (par exemple, l'addon exportSearchResultAsCSV).</p> <p>Structure du fichier includes/addons/LSaddons.[addon name].php :</p> <pre><code><?php\nfunction LSaddon_myaddon_support() {\n\n $retval=true;\n\n // Some check\n\n if ($retval) {\n $retval = LSsession :: registerLSaddonView(\n 'myaddon', // addon name\n 'myaddon_view', // addon view ID\n __('MyAddon view'), // addon view label\n 'myaddon_view', // callable (ex: function name) that implement addon view\n array('user'), // array listing allowed LSprofiles\n true // Show/hide this addon view in user menu\n );\n }\n\n return $retval;\n}\n\n[...]\n\n/**\n * My addon view handler function\n *\n * Description of this view\n *\n * @author My Name <my.email@example.com>\n *\n * @return void\n **/\nfunction myaddon_view() {\n // Do some stuff and set some template variables\n $list = array ([...]);\n LStemplate :: assign('list', $list);\n\n // Load some CSS & JS files need on this view\n LStemplate :: addCssFile('LSaddon_myadon.css');\n LStemplate :: addJSscript('LSaddon_myadon.js');\n\n // Set template file of the view\n LSsession :: setTemplate('LSaddon_myadon_view.tpl');\n}\n</code></pre>"},{"location":"install/arbo/","title":"Arborescence du projet","text":"<ul> <li> <p><code>doc/</code></p> <p>Les fichiers sources de la documentation (Markdown & configuration Mkdocs).</p> </li> </ul> <ul> <li> <p><code>lsexample/</code></p> <p>Les fichiers relatifs \u00e0 l'annuaire d'exemple.</p> </li> </ul> <ul> <li> <p><code>src/</code></p> <p>Les sources de l'application.</p> <ul> <li> <p><code>public_html/</code></p> <p>La racine web de l'application : celle-ci ne contient que les fichiers <code>.htaccess</code> et <code>index.php</code> qui configure et d\u00e9clenche la r\u00e9\u00e9criture d'URL.</p> </li> </ul> <ul> <li> <p><code>conf/</code></p> <p>Contient les fichiers de configuration.</p> <ul> <li> <p><code>LSobjects/</code></p> <p>Configuration des LSobjects.</p> </li> </ul> <ul> <li> <p><code>LSaddons/</code></p> <p>Configuration des LSaddons.</p> </li> </ul> <ul> <li> <p><code>LSauth/</code></p> <p>Configuration des LSauthMethod.</p> </li> </ul> </li> </ul> <ul> <li> <p><code>includes/</code></p> <p>Contient les fichiers des ressources.</p> <ul> <li> <p><code>addons/</code></p> <p>Les addons au projet.</p> </li> </ul> <ul> <li> <p><code>class/</code></p> <p>Les fichiers de d\u00e9finition des classes PHP.</p> </li> </ul> <ul> <li> <p><code>js/</code></p> <p>Les fichiers Javascript.</p> </li> </ul> <ul> <li> <p><code>libs/</code></p> <p>Les librairies utilis\u00e9es.</p> </li> </ul> </li> </ul> <ul> <li> <p><code>lang/</code></p> <p>Les fichiers d'internationalisation.</p> </li> </ul> <ul> <li> <p><code>templates/</code></p> <p>Les fichiers template de l'interface. Il y a un sous-dossier par template.</p> </li> </ul> <ul> <li> <p><code>css/</code></p> <p>Les fichiers css de l'interface. Il y a un sous-dossier par template CSS.</p> </li> </ul> <ul> <li> <p><code>images/</code></p> <p>Les images de l'interface. Il y a un sous-dossier par template d'image.</p> </li> </ul> <ul> <li> <p><code>local/</code></p> <p>Les fichiers personnalis\u00e9s de l'installation.</p> </li> </ul> <ul> <li> <p><code>tmp/</code></p> <p>Les fichiers temporaires (y compris le cache des templates).</p> </li> </ul> </li> </ul>"},{"location":"install/download/","title":"T\u00e9l\u00e9chargement","text":""},{"location":"install/download/#a-partir-du-paquet-debian","title":"\u00c0 partir du paquet Debian","text":"<p>L'installation \u00e0 partir du paquet Debian peut \u00eatre r\u00e9alis\u00e9e soit en t\u00e9l\u00e9chargeant manuellement le paquet, soit en d\u00e9clarant le d\u00e9p\u00f4t APT suivant dans votre fichier <code>/etc/apt/sources.list</code> :</p> <pre><code>deb http://ldapsaisie.org/debian stable main\n</code></pre> <p>Il ne vous restera ensuite plus qu'a installer le paquet <code>ldapsaisie</code> avec la commande suivante :</p> <pre><code>apt-get install ldapsaisie\n</code></pre> <p>Le fichier <code>/etc/ldapsaisie/apache.conf</code> est un example de configuration du serveur web Apache. La configuration du logiciel ce fera ensuite dans le dossier <code>/etc/ldapsaisie/local/</code>.</p>"},{"location":"install/download/#a-partir-de-git","title":"\u00c0 partir de Git","text":"<p>Le d\u00e9p\u00f4t Git peut \u00eatre r\u00e9cup\u00e9r\u00e9 anonymement en utilisant la commande suivante :</p> <pre><code>git clone https://gitlab.easter-eggs.com/ee/ldapsaisie.git\n</code></pre> <p>La racine web de l'application se trouvera alors dans le dossier <code>/ldapsaisie/src/public_html/</code>.</p>"},{"location":"install/download/#a-partir-des-snapshot","title":"\u00c0 partir des snapshot","text":"<p>Toutes les nuits, un snapshot de l'arbre Git est r\u00e9alis\u00e9 et est t\u00e9l\u00e9chargeable au format tar.gz \u00e0 l'adresse suivante :</p> <p>http://ldapsaisie.org/download/ldapsaisie-snapshoot.tar.gz</p>"},{"location":"install/howto/","title":"Tutoriel d'installation","text":"<p>Cette section d\u00e9crit les diff\u00e9rentes \u00e9tapes de l'installation de LdapSaisie. Deux m\u00e9thodes d'installation sont pr\u00e9sent\u00e9es ici, l'une \u00e0 partir des sources du projet et l'autre \u00e0 partir du paquet Debian.</p> <p>Dans ce tutoriel, nous partirons du principe que vous avez pleinement la main sur votre serveur (installation de nouveau paquet et configuration de votre serveur web). Nous partons \u00e9galement du principe que votre annuaire LDAP est d\u00e9j\u00e0 en place. Nous utiliserons pour cette exemple de mise en oeuvre l'annuaire correspondant au sch\u00e9ma et \u00e0 la configuration pr\u00e9sente dans les sources du projet dans le dossier <code>lsexample</code>.</p> <p>La premi\u00e8re \u00e9tape consiste \u00e0 installer le locigiel en tant que tel. Pour cela, r\u00e9f\u00e9rez vous au chapitre T\u00e9l\u00e9chargement.</p> <p>En cas d'installation \u00e0 partir du paquet Debian, la configuration du logiciel se fera dans le dossier <code>/etc/ldapsaisie/local/</code>. Les fichiers plac\u00e9s dans ce dossier pr\u00e9valeront toujours aux fichiers fournis par le paquet Debian, vous permettant facilement de modifier un composant existant ou dans \u00e9crire de nouveaux. Ainsi, pour modifier un fichier CSS par exemple, il vous suffira de le placer dans le dossier <code>/etc/ldapsaisie/local/css/</code>.</p> <p>Pour une installation \u00e0 partir du code source, il vous faut cloner le d\u00e9p\u00f4t Git du projet dans le dossier <code>/var/www/ldapsaisie</code>. Pour cela il vous faut avoir install\u00e9s les outils de Git contenu, dans Debian, dans le paquet <code>git-core</code>. Le d\u00e9p\u00f4t Git doit ensuite \u00eatre r\u00e9cup\u00e9r\u00e9 anonymement en utilisant la commande suivante :</p> <pre><code>git clone https://gitlab.easter-eggs.com/ee/ldapsaisie.git /var/www/ldapsaisie\n</code></pre> <p>Note</p> <p>Pour que cette commande se d\u00e9roule correctement, vous devez avoir acc\u00e8s au port TCP 443 du serveur <code>gitlab.easter-eggs.com</code>. En cas de probl\u00e8me v\u00e9rifiez votre parefeu.</p> <p>La suite des op\u00e9rations se d\u00e9roulera donc maintenant dans le dossier <code>/var/www/ldapsaisie</code>. Pour avoir plus de d\u00e9tails sur les \u00e9lements qu'on retrouve dans ce dossier, vous pouvez consulter la section concern\u00e9e. Nous allons nous inst\u00e9r\u00e9sser plus particuli\u00e8rement :</p> <ul> <li>au script <code>upgradeFromGit.sh</code> permettant la mise \u00e0 jour de votre repos tout en concervant les adaptations que nous ferons pour l'usage d'LdapSaisie adapt\u00e9 \u00e0 notre annuaire ;</li> </ul> <ul> <li>au dossier <code>config.local</code> dans lequel seront stock\u00e9s vos fichiers et vos adaptations de l'application ;</li> </ul> <ul> <li>au dossier <code>src/public_html</code> qui correspond \u00e0 la futur racine du site web de l'application.</li> </ul> <p>Le principe de l'adaptation est ici de mettre vos fichiers personnalis\u00e9s dans le dossier <code>config.local</code>, de les d\u00e9clarer dans votre fichier <code>config.local/local.sh</code> contenant la liste des fichiers devant \u00eatre install\u00e9s. Le fichier <code>local.sh</code> est la source de configuration du script <code>upgradeFromGit.sh</code>. Il faut donc dans un premier temps cr\u00e9er votre fichier <code>local.sh</code> en copiant le fichier d'example <code>local.sh.example</code>. Ce fichier est un script bash d\u00e9clarant les variables de configurations suivantes :</p> <ul> <li> <p><code>LOCAL_FILES</code></p> <p>La liste des chemins des fichiers \u00e0 installer dans l'arboressence du site. Cette \u00e9l\u00e9ment doivent \u00eatre s\u00e9par\u00e9s par des espaces ou des retour \u00e0 la liste. Exemple :</p> <pre><code>conf/config.inc.php\nlang/fr_FR.UTF8/lang.php\n</code></pre> </li> </ul> <ul> <li> <p><code>LOG_FILE</code></p> <p>Nom du fichier de log des mises \u00e0 jour.</p> </li> </ul> <ul> <li> <p><code>THEME</code></p> <p>Le nom du theme \u00e0 installer (facultatif et non trait\u00e9 dans ce tutoriel).</p> <p>Note</p> <p>Il est possible d'utiliser dans ce fichier de configuration la variable bash <code>$ROOT_DIR</code> correspondant au chemin du dossier d'installation, c'est \u00e0 dire dans notre exemple <code>/var/www/ldapsaisie</code>.</p> </li> </ul> <p>La deuxi\u00e8me \u00e9tape concerne la configuration globale de l'application : Cette partie est principalement contenue dans le fichier <code>src/conf/config.inc.php</code> (ou <code>/etc/ldapsaisie/local/conf/config.inc.php</code> en cas d'installation \u00e0 partir du paquet Debian). En cas d'installation \u00e0 partir du code source, il faut donc dans un premier temps copier ce fichier dans le dossier <code>config.local</code> et le d\u00e9clarer dans la liste des fichiers \u00e0 d\u00e9ployer lors des mises \u00e0 jour (variable <code>LOCAL_FILES</code> dans le fichier <code>local.sh</code>). Il s'agit en particulier dans ce fichier de configurer la connexion \u00e0 votre annuaire. Vous pouvez vous inspirer du fichier d'exemple fourni et pour plus de d\u00e9tails, reportez-vous \u00e0 la section concern\u00e9e.</p> <p>Note</p> <p>Notez qu'il est possible de passer l'application en mode debug ce qui peut \u00eatre utile par la suite.</p> <p>La troisi\u00e8me \u00e9tape concerne la configuration des types de LSobjects : Chaque type d'objet manipul\u00e9 par LdapSaisie doit correspondre avec un type de LSobject.</p> <ol> <li> <p>Cr\u00e9ation du fichier de classe (optionnel) : Ce fichier contient la d\u00e9claration de la classe PHP correspondant au type de LSobject. Cette classe \u00e9tend la classe <code>LSldapObject</code> qui contient pour ainsi dire toute les m\u00e9thodes et proprit\u00e9s n\u00e9cessaires pour les types de LSobject simples. Si votre type de LSobject n\u00e9cessite des m\u00e9thodes ou propri\u00e9t\u00e9s particuli\u00e8res, vous pouvez impl\u00e9menter cette classe. \u00c0 d\u00e9faut, une classe vierge d'adaptation sera automatiquement d\u00e9clar\u00e9e.</p> <p>Les fichiers des classes sont contenus dans le dossier <code>/includes/class/</code> et portent les noms compos\u00e9s de la mani\u00e8re suivante :</p> <pre><code>class.LSobjects.[nom du type d'LSobject].php\n</code></pre> </li> <li> <p>Configurer vos LSobject : Cette partie est certainement la plus longue et consiste \u00e0 d\u00e9clarer l'ensemble des informations relatives aux types des objets LDAP manipul\u00e9s. Les fichiers d'exemples fournis vous seront alors d'une aide pr\u00e9cieuse. Basez vous sur l'un de pour cr\u00e9er le votre. Pour cela le fichier de configuration du type d'LSobjet <code>LSpeople</code> est le plus complet et est un bon point de d\u00e9part. Pour plus de d\u00e9tails sur les \u00e9lements de configuration de ce fichier, reportez-vous \u00e0 la section concern\u00e9e.</p> </li> <li> <p>Configurer si n\u00e9cessaire les relations entre les objets appel\u00e9s LSrelations. Les relations les plus simples (via un attribut de liaison) pourront \u00eatre impl\u00e9ment\u00e9es \u00e0 l'aide d'un simple param\u00e8trage. Pour des relations, plus complexes, il sera possible d'impl\u00e9menter des m\u00e9thodes personnalis\u00e9es pour les g\u00e9rer. Pour plus de d\u00e9tails, reportez-vous \u00e0 la section concern\u00e9e.</p> <p>Note</p> <p>Pour avoir un exemple de fichier de classe PHP impl\u00e9mentant des methodes de gestion de LSrelations complexes, vous pouvez consulter le fichier de classe <code>LSgroup</code>.</p> </li> </ol> <p>Important</p> <p>En cas d'installation \u00e0 partir du code source, pensez \u00e0 d\u00e9clarer les fichiers que vous venez de cr\u00e9er dans la variable <code>LOCAL_FILES</code> du fichier <code>local.sh</code>. Exemple pour le type d'LSobjet portant comme nom <code>LSexample</code> :</p> <pre><code>src/conf/LSobjects/config.LSobjects.LSexample.php\nsrc/includes/class/class.LSobjects.LSexample.php\n</code></pre> <p>Note</p> <p>Vous pouvez \u00e9galement personnaliser l'interface : Il est possible de personnaliser \u00e0 votre go\u00fbt l'interface en \u00e9crivant votre template ou en modifiant simplement les fichiers CSS. Une partie de cette documentation concernera bient\u00f4t cette probl\u00e9matique. Patience...</p> <p>En cas d'installation \u00e0 partir du code source, une derni\u00e8re \u00e9tape \u00e0 ce niveau consiste \u00e0 lancer le script <code>upgradeFromGit.sh</code> pour qu'il installe les fichiers que vous venez de cr\u00e9er. Ce script est con\u00e7u pour dire tout ce qu'il fait donc en cas de probl\u00e8me vous devriez rapidement comprendre o\u00f9 cela coince. Dans tout les cas, n'h\u00e9sitez pas \u00e0 poser vos questions \u00e0 la communaut\u00e9 sur la liste ldapsaisie-users@lists.ldapsaisie.org.</p>"},{"location":"install/requirements/","title":"Pr\u00e9-requis","text":"<ul> <li>Le service Apache HTTP avec le module mod_rewrite d'activ\u00e9. Les r\u00e8gles de r\u00e9\u00e9criture d'URL sont d\u00e9finies dans le fichier <code>.htaccess</code> fourni avec l'application et il est donc n\u00e9cessaire d'autoriser une telle configuration \u00e0 ce niveau via la directive <code>AllowOverride</code> devant inclure \u00e0 minima <code>FileInfo</code>.</li> </ul> <ul> <li>L'utisateur ex\u00e9cutant le serveur web doit avoir les droits d'\u00e9criture sur le dossier <code>tmp</code>. En cas d'installation \u00e0 partir du paquet Debian, ce dossier est remplac\u00e9 par un lien symbolique vers le dossier <code>/var/cache/ldapsaisie/</code>.</li> </ul> <ul> <li>PHP 5.6 (ou sup\u00e9rieur) avec <code>magic_quotes_gpc</code> et <code>register_globals</code> \u00e0 <code>off</code>. L'outil CLI de PHP est par ailleurs n\u00e9cessaire pour l'utilisation des outils CLI fournis avec l'application (fourni par le paquet <code>php-cli</code> dans Debian).</li> </ul> <ul> <li>Le support LDAP dans PHP (paquet <code>php-ldap</code> dans Debian)</li> </ul> <ul> <li>Le support mhash dans PHP (paquet <code>php5-mhash</code> dans Debian Lenny, int\u00e9gr\u00e9 \u00e0 <code>php-common</code> dans les versions sup\u00e9rieurs)</li> </ul> <ul> <li>Le support json dans PHP (<code>pear install pecl/json</code> sur RedHat, int\u00e9gr\u00e9 au paquet <code>php5-common</code> pr\u00e9c\u00e9dement)</li> </ul> <ul> <li>Net_LDAP2 (paquet <code>php-net-ldap2</code> dans Debian ou <code>pear install net_ldap2</code>)</li> </ul> <ul> <li>Le support mbstring dans PHP (paquet <code>php-mbstring</code> depuis Debian Stretch, int\u00e9gr\u00e9 au paquet <code>php-common</code> dans Debian)</li> </ul> <ul> <li>Smarty (paquet <code>smarty3</code> dans Debian)</li> </ul> <ul> <li>La librairie Console_Table (n\u00e9cessaire pour le fonctionnement de l'outil CLI, paquet <code>php-console-table</code> dans Debian)</li> </ul> <ul> <li>Les librairies Mail et PEAR_Mail_Mime (n\u00e9cessaire pour l'envoi de courriels, paquets <code>php-mail</code> et <code>php-mail-mime</code> dans Debian)</li> </ul> <ul> <li>L'extension PHP <code>ftp</code> (n\u00e9cessaire pour le fonctionnement du LSaddon FTP, paquet <code>php-ftp</code> dans Debian)</li> </ul> <ul> <li>La librairie PhpSecLib (n\u00e9cessaire pour le fonctionnement du LSaddon SSH, paquet <code>php-phpseclib</code> dans Debian)</li> </ul> <p>Warning</p> <p>La librairie Net_LDAP2 oblige le fait que la racine DSE de l'annuaire soit lisible en anonyme sinon la connexion \u00e0 l'annuaire \u00e9chouera syst\u00e9matiquement.</p> <p>Note</p> <p>Cette documentation est \u00e9crite \u00e0 l'aide du langage Markdown et est mis en forme pour une consultation en ligne \u00e0 l'aide de mkdocs et son th\u00e8me mkdocs-material. Le d\u00e9pendances pour construire cette documentation sont list\u00e9es dans le fichier <code>doc/requirements.txt</code> et sont installables \u00e0 l'aide de la commande <code>pip install -r doc/requirements.txt</code>.</p>"},{"location":"upgrade/","title":"Mise \u00e0 jour","text":"<p>Cette section de la documentation d\u00e9taille la proc\u00e9dure de mise \u00e0 jour d'une installation existante et regroupe des informations pratiques et utiles pour des mont\u00e9es de versions sp\u00e9cifiques entra\u00eenant par exemple une perte de r\u00e9trocompatibilit\u00e9 de la configuration.</p>"},{"location":"upgrade/2_4_1-to-3_0_0/","title":"Mise \u00e0 jour 2.4.1 -> 3.0.0","text":"<p>Cette mise \u00e0 jour majeure apporte de nombreuses nouveaut\u00e9s auxquelles il est important de pr\u00eater attention. Cette section ne parlera pas particuli\u00e8rement de ces nouveaut\u00e9s, mais vous pouvez consulter le fichier debian/ldapsaisie.NEWS pour cela. Cette section listera en outre les points de vigilances \u00e0 avoir et les adaptations \u00e0 apporter sur votre configuration et votre code personnalis\u00e9.</p>"},{"location":"upgrade/2_4_1-to-3_0_0/#fichier-configincphp","title":"Fichier config.inc.php","text":"<ul> <li>ajout du param\u00e8tre <code>ConsoleTable</code> avec pour valeur par d\u00e9faut sous Debian <code>/usr/share/php/Console/Table.php</code></li> </ul> <ul> <li>ajout du param\u00e8tre <code>public_root_url</code> avec pour valeur par d\u00e9faut sous Debian <code>/ldapsaisie</code></li> </ul> <ul> <li>param\u00e8tre <code>$GLOBALS['defaultCSSfiles']</code> : il est n\u00e9cessaire de modifier les URLs des fichiers list\u00e9s : seul le nom du fichier doit rester, sa localisation sera d\u00e9tect\u00e9e automatiquement. Par exemple, <code>$GLOBALS['defaultCSSfiles'] = array('../light-blue.css');</code> devient <code>$GLOBALS['defaultCSSfiles'] = array('light-blue.css');</code>.</li> </ul> <ul> <li> <p>les param\u00e8tres <code>authObjectType</code>, <code>authObjectFilter</code> et <code>authObjectTypeAttrPwd</code> sont remplac\u00e9s par le tablau <code>LSobjects</code> dans le param\u00e8tre <code>LSauth</code>.</p> <p>Par exemple:</p> <pre><code>'authObjectType' => 'LSpeople',\n'authObjectFilter' => '(|(uid=%{user})(mail=%{user}))',\n'authObjectTypeAttrPwd' => 'userPassword',\n</code></pre> <p>Devient:</p> <pre><code>'LSauth' => array (\n 'LSobjects' => array(\n 'LSpeople' => array(\n 'filter' => '(|(uid=%{user})(mail=%{user}))',\n 'password_attribute' => 'userPassword',\n ),\n ),\n [...]\n),\n</code></pre> </li> </ul> <ul> <li>Une erreur de frappe historique a \u00e9t\u00e9 corrig\u00e9 dans le nom de la variable <code>$GLOBALS['defaultJSscripts']</code>, \u00e0 savoir un \"R\" manquant.</li> </ul> <ul> <li>Les fichiers Javascript utilis\u00e9s par d\u00e9faut par l'application ne sont d\u00e9sormais plus list\u00e9s dans la variable <code>$GLOBALS['defaultJSscripts']</code>. Seul doit y demeurer vos propres fichiers. Voici la liste des fichiers concern\u00e9s et qui n'ont plus \u00e0 \u00eatre inclus via ce param\u00e8tre :<p>- <code>mootools-core.js</code> - <code>mootools-more.js</code> - <code>functions.js</code> - <code>LSdefault.js</code> - <code>LSinfosBox.js</code></p> </li> </ul>"},{"location":"upgrade/2_4_1-to-3_0_0/#fichiers-css","title":"Fichiers CSS","text":"<p>Note</p> <p>Les fichiers <code>light-*.css</code> ont \u00e9t\u00e9 retravaill\u00e9s pour tous h\u00e9riter du fichier <code>light-blue.css</code> qui d\u00e9fini les couleurs de l'interface au travers des variables. Ainsi, il est tr\u00e8s simple d'ajuster ce th\u00e8me \u00e0 vos couleurs. Si cela vous int\u00e9resse, vous pouvez prendre exemple sur les autres fichiers <code>light-*.css</code>.</p> <p>Au passage, ce th\u00e8me a \u00e9t\u00e9 retravaill\u00e9 pour prendre en compte la mise en forme d'un maximum de composants de l'application tout en profitant du c\u00f4t\u00e9 responsive de l'interface apporter par cette mise \u00e0 jour. Si vous avez un th\u00e8me personnalis\u00e9, il est conseill\u00e9 de regarder si celui-ci ne pourrait pas tirer partie du fichier <code>light-blue.css</code> en le surchargeant. \u00c0 minima, vous pouvez analyser les \u00e9volutions de ce fichier pour identifier les modifications int\u00e9ressantes \u00e0 reporter sur votre th\u00e8me personnel.</p> <ul> <li>Si vous utilisez un des fichiers <code>light-*.css</code> autre que le fichier <code>light-blue.css</code>, vous devez d\u00e9sormais \u00e9galement charger ce dernier en premier.</li> </ul> <ul> <li> <p>corriger les URL des images : <code>url(../../images/default/find.png)</code> devient <code>url(../image/find)</code>. Pour identifier les fichiers CSS concern\u00e9s, vous pouvez utiliser les commandes suivantes :</p> <pre><code>grep -Er 'url\\(.*images' /etc/ldapsaisie/local/css\ngrep -Er 'url\\(.*\\.(png|gif|jpg)' /etc/ldapsaisie/local/css\n</code></pre> </li> </ul> <ul> <li>modification CSS page <code>fatal_error</code> (fichier <code>base.css</code>) : <code>#fatal_error</code> devient <code>#error</code></li> </ul>"},{"location":"upgrade/2_4_1-to-3_0_0/#fichiers-php","title":"Fichiers PHP","text":"<ul> <li> <p><code>LSsession :: redirect()</code> devient <code>LSurl :: redirect()</code>. Pour identifier les fichiers CSS concern\u00e9s, vous pouvez utiliser la commande suivante :</p> <pre><code>grep -Er 'LSsession *:: *redirect *\\(' /etc/ldapsaisie/local/\n</code></pre> </li> </ul> <ul> <li> <p>Les m\u00e9thodes de gestion des Javascript et CSS additionels ont \u00e9t\u00e9 migr\u00e9es de la classe <code>LSsession</code> vers la classe <code>LStemplate</code> :</p> <ul> <li> <p><code>LSsession :: addJSscript()</code> devient <code>LStemplate :: addJSscript()</code>.</p> <p>Par ailleurs le param\u00e8tre <code>$path</code> disparait et la m\u00e9thode <code>addLibJSscript</code> a \u00e9t\u00e9 ajout\u00e9e pour permettre sp\u00e9cifiquement l'inclusion des fichiers Javascript des librairies. Voici quelques exemples d'utilisation et leur \u00e9quivalent \u00e0 pr\u00e9sent:</p> <ul> <li><code>LSsession :: addJSscript('../../local/includes/js/LSformElement_eetelephone.js');</code> devient <code>LStemplate :: addJSscript('LSformElement_eetelephone.js');</code></li> </ul> <ul> <li><code>LSsession :: addJSscript('../../local/includes/js/LSformElement_eetelephone.js');</code> devient <code>LStemplate :: addJSscript('LSformElement_eetelephone.js');</code></li> </ul> <ul> <li><code>LSsession :: addJSscript('click-to-dial_view.js', 'local/includes/js/');</code> devient <code>LStemplate :: addJSscript('click-to-dial_view.js');</code></li> </ul> <ul> <li><code>LSsession :: addJSscript('Picker.js',LS_LIB_DIR.'arian-mootools-datepicker/');</code> devient <code>LStemplate :: addLibJSscript('arian-mootools-datepicker/Picker.js');</code></li> </ul> </li> </ul> <ul> <li><code>LSsession :: addJSconfigParam()</code> devient <code>LStemplate :: addJSconfigParam()</code>.</li> </ul> <ul> <li><code>LSsession :: addHelpInfos()</code> devient <code>LStemplate :: addHelpInfo()</code>.</li> </ul> <ul> <li> <p><code>LSsession :: addCssFile()</code> devient <code>LStemplate :: addCssFile()</code>.</p> <p>Par ailleurs le param\u00e8tre <code>$path</code> disparait et la m\u00e9thode <code>addLibCssFile</code> \u00e0 \u00e9t\u00e9 ajout\u00e9e pour permettre sp\u00e9cifiquement l'inclusion des fichiers CSS des librairies. Voici quelques exemples d'utilisation et leur \u00e9quivalent \u00e0 pr\u00e9sent:</p> <ul> <li><code>LSsession :: addCssFile('test.css', '../../local/css/');</code> devient <code>LStemplate :: addCssFile('test.css');</code>. Doit donc \u00eatre conserv\u00e9, que le nom du fichier CSS, pas de chemin vers celui-ci.</li> </ul> <ul> <li><code>LSsession :: addCssFile('datepicker_vista.css',LS_LIB_DIR.'arian-mootools-datepicker/datepicker_vista/');</code> devient <code>LStemplate :: addLibCssFile('arian-mootools-datepicker/datepicker_vista/datepicker_vista.css');</code></li> </ul> </li> </ul> <p>Pour identifier les fichiers concern\u00e9s, vous pouvez utiliser les commandes suivantes :</p> <pre><code>grep -Er 'LSsession *:: *(addJSscript|addLibJSscript|addJSconfigParam|addHelpInfos|addCssFile|addLibCssFile) *\\(' /etc/ldapsaisie/local/\ngrep -Er '(LSsession|LStemplate) *:: *addJSscript\\(.*local' /etc/ldapsaisie/local/\ngrep -Er '(LSsession|LStemplate) *:: *addJSscript\\(.*\\.\\.\\/' /etc/ldapsaisie/local/\ngrep -Er '(LSsession|LStemplate) *:: *addCssFile\\(.*local' /etc/ldapsaisie/local/\ngrep -Er '(LSsession|LStemplate) *:: *addCssFile\\(.*\\.\\.\\/' /etc/ldapsaisie/local/\n</code></pre> </li> </ul> <ul> <li> <p><code>LSlog</code> vs <code>LSdebug</code> : L\u2019utilisation de <code>LSdebug</code> est d\u00e9prioris\u00e9e en faveur de <code>LSlog</code>. Ce dernier ajoute d\u00e9sormais la notion de logger, permettant d\u2019identifier la source des logs. Ce m\u00e9canisme permet la configuration d\u2019un niveau de log sp\u00e9cifique pour un logger donn\u00e9, ainsi que la mise en place de filtres au niveau des handers pour ne logger par exemple que certains loggers, ou \u00e0 l\u2019inverse en exclure d\u2019autres.</p> <ul> <li>Pour vos classes personnalis\u00e9es : si celles-ci h\u00e9ritent d\u2019une classe standard, il est fort probable qu\u2019il soit possible d\u2019utiliser des m\u00e9thodes fournies par cette classe pour logguer au travers un logger d\u00e9di\u00e9 (voir les m\u00e9thodes <code>log_debug</code>, <code>log_info</code>, \u2026). \u00c0 d\u00e9faut, il est possible d\u2019utiliser la classe <code>LSlog_staticLoggerClass</code> qui facilite l\u2019impl\u00e9mentation.</li> </ul> <ul> <li> <p>Pour vos LSaddons : il est conseill\u00e9 d\u2019utiliser un logger <code>LSaddon_[addon]</code> d\u00e9di\u00e9. Le logger peut facilement \u00eatre r\u00e9cup\u00e9r\u00e9 de la mani\u00e8re suivante :</p> <pre><code>LSlog :: get_logger(\"LSaddon_[addon]\")\n</code></pre> <p>Cette m\u00e9thode retourne une r\u00e9f\u00e9rence au logger et il est possible d\u2019appeler directement une m\u00e9thode de log, par exemple :</p> <pre><code>LSlog :: get_logger(\"LSaddon_[addon]\") -> debug(\"message\");\n</code></pre> </li> </ul> </li> </ul>"},{"location":"upgrade/2_4_1-to-3_0_0/#fichiers-templates","title":"Fichiers templates :","text":""},{"location":"upgrade/2_4_1-to-3_0_0/#changement-de-linclusion-des-templates","title":"Changement de l\u2019inclusion des templates","text":"<ul> <li> <p>Le cas des fichiers <code>top.tpl</code> et <code>bottom.tpl</code></p> <pre><code>{include file='ls:top.tpl'}\n\n[...]\n\n{include file='ls:bottom.tpl'}\n</code></pre> <p>devient :</p> <pre><code>{extends file='ls:base_connected.tpl'}\n{block name=\"content\"}\n\n[...]\n\n{/block}\n</code></pre> <p>Note</p> <p>Pages \u00e0 l\u2019\u00e9tat connect\u00e9 uniquement (incluant le menu, l\u2019ent\u00eate\u2026).</p> </li> </ul> <ul> <li> <p>Fichiers avec ent\u00eate HTML :</p> <pre><code><html>\n <head>\n [...]\n </head>\n <body>\n [...]\n </body>\n</html>\n</code></pre> <p>devient :</p> <pre><code>{extends file='ls:base.tpl'}\n{block name=\"body\"}\n[...]\n{/block}\n</code></pre> <p>Au besoin, si vous avez besoin :</p> <ul> <li> <p>de remplacer les fichiers CSS charg\u00e9s par d\u00e9faut (<code>base.css</code> par exemple) : ajouter le block <code>css</code> :</p> <pre><code>{block name=\"css\"}\n <link rel=\"stylesheet\" type=\"text/css\" href=\"{css name='custom.css'}\" media=\"screen\" title=\"Normal\" />\n {include file='ls:css.tpl'}\n{/block}\n</code></pre> <p>Note</p> <p>Ce block contient tous les CSS, y compris ceux g\u00e9r\u00e9s par <code>LSsession :: addCssFile()</code>. Pensez \u00e0 ajouter <code>{include file='ls:css.tpl'}</code> pour conserver ces derniers.</p> </li> </ul> <ul> <li> <p>d\u2019ajouter des infos dans <code><head></code> : ajouter le block <code>head</code> (vide par d\u00e9faut) :</p> <pre><code>{block name=\"head\"}\n[...]\n{/block}\n</code></pre> </li> </ul> <ul> <li> <p>d\u2019ajouter des fichiers Javascript personnalis\u00e9s : ajouter le block <code>js</code> (vide par d\u00e9faut):</p> <pre><code>{block name=\"js\"}\n[...]\n{/block}\n</code></pre> <p>Note</p> <p>Ce block sera ajout\u00e9 APR\u00c8S les autres fichiers Javascript charg\u00e9s (ceux par d\u00e9faut et ceux ajout\u00e9s via <code>LSsession :: addJSscript()</code>.</p> </li> </ul> </li> </ul> <ul> <li> <p>Autres fichiers remplac\u00e9s :</p> <ul> <li><code>blank.tpl</code> remplac\u00e9 par <code>base.tpl</code></li> <li><code>empty.tpl</code> remplac\u00e9 par <code>base_connected.tpl</code></li> <li><code>accueil.tpl</code> remplac\u00e9 par <code>homepage.tpl</code></li> </ul> </li> </ul> <p>Pour identifier les fichiers concern\u00e9s, vous pouvez utiliser la commande suivante :</p> <pre><code>grep -Er '(accueil|blank|empty|top|bottom)\\.tpl' /etc/ldapsaisie/local/\n</code></pre>"},{"location":"upgrade/2_4_1-to-3_0_0/#fichiers-templates-fournis-par-defaut","title":"Fichiers templates fournis par d\u00e9faut :","text":"<p>V\u00e9rifier les modifications des fichiers templates fourni avec l\u2019application et que vous auriez personnalis\u00e9. Pour cela, vous pouvez utiliser la commande suivante :</p> <pre><code>for i in $( ls /etc/ldapsaisie/local/templates/* )\ndo\n default_file=\"/usr/share/ldapsaisie/templates/default/$( basename \"$i\" )\"\n [ ! -e \"$default_file\" ] && continue\n vi -d $default_file $i\ndone\n</code></pre> <p>Note</p> <p>Une attention particuli\u00e8re doit \u00eatre port\u00e9 aux fichiers <code>login.tpl</code> et <code>recoverpassword.tpl</code> qui ont particuli\u00e8rement chang\u00e9s.</p>"},{"location":"upgrade/2_4_1-to-3_0_0/#corriger-les-url-des-images","title":"Corriger les URL des images :","text":"<p><code>../../images/default/find.png</code> devient <code>../image/find</code></p> <p>Pour identifier les fichiers concern\u00e9s, vous pouvez utiliser les commandes suivantes :</p> <pre><code>grep -Er 'images' /etc/ldapsaisie/local/templates\ngrep -Er '\\.(png|gif|jpg)' /etc/ldapsaisie/local/templates\n</code></pre>"},{"location":"upgrade/2_4_1-to-3_0_0/#le-cas-de-variable-de-template-lssession_css-et-lssession_js","title":"Le cas de variable de template <code>{$LSsession_css}</code> et <code>{$LSsession_js}</code> :","text":"<p>Note</p> <p>Ceci est d\u00e9j\u00e0 g\u00e9r\u00e9 si vous \u00e9tendez bien vos templates du fichier <code>base.tpl</code> (pour les pages non-connect\u00e9es) ou <code>base_connected.tpl</code> (pour les pages connect\u00e9es).</p> <ul> <li><code>{$LSsession_css}</code> doit \u00eatre remplac\u00e9 par <code>{include file='ls:css.tpl'}</code></li> </ul> <ul> <li><code>{$LSsession_js}</code> doit \u00eatre remplac\u00e9 par <code>{include file='ls:js.tpl'}</code></li> </ul>"},{"location":"upgrade/2_4_1-to-3_0_0/#tous-les-fichiers-modification-des-urls","title":"Tous les fichiers : Modification des URLs","text":"<ul> <li> <p><code>view.php</code> :</p> <ul> <li>page recherche : <code>view.php?LSobject=LSpeople</code> devient <code>object/LSpeople</code></li> </ul> <ul> <li>page d'un objet : <code>view.php?LSobject=LSpeople&dn=$dn</code> devient <code>object/LSpeople/$dn</code></li> </ul> </li> </ul> <ul> <li><code>addon_view.php</code> : <code>addon_view.php?LSaddon=ee&view=copyContract</code> devient <code>addon/ee/copyContract</code></li> </ul> <ul> <li> <p><code>index_ajax.php</code> :</p> <ul> <li> <p>Pour les m\u00e9thodes Ajax de classes :</p> <pre><code>var data = {\n template: 'LSformElement_eetelephone',\n action: 'make_call',\n telephoneNumber: tel,\n name: name,\n};\nnew Request({url: 'index_ajax.php', data: data, onSuccess: ...});\n</code></pre> <p>Devient :</p> <pre><code>var data = {\n telephoneNumber: tel,\n name: name,\n};\nnew Request({url: 'ajax/class/LSformElement_eetelephone/make_call', data: data, onSuccess: ...});\n</code></pre> </li> </ul> <ul> <li> <p>Pour les m\u00e9thodes Ajax d'addon :</p> <pre><code>var data = {\n addon: 'asterisk',\n action: 'LSasterisk_make_call',\n telephoneNumber: tel,\n name: name,\n nocache: new Date().getTime()\n};\nnew Request({url: 'index_ajax.php', data: data, onSuccess: ...});\n</code></pre> <p>Devient :</p> <pre><code>var data = {\n telephoneNumber: tel,\n name: name,\n nocache: new Date().getTime()\n};\nnew Request({url: 'ajax/addon/asterisk/LSasterisk_make_call', data: data, onSuccess: ...});\n</code></pre> </li> </ul> </li> </ul> <ul> <li><code>global_search.php</code> : <code>global_search.php?refresh</code> devient <code>search?refresh</code></li> </ul> <ul> <li><code>index.php</code> : <code>index.php?LSsession_recoverPassword</code> devient <code>index?LSsession_recoverPassword</code></li> </ul> <ul> <li><code>create.php</code> : <code>create.php?LSobject=LSpeople</code> devient <code>object/LSpeople/create</code></li> </ul> <ul> <li><code>modify.php</code> : <code>modify.php?LSobject=LSpeople&dn=$dn</code> devient <code>object/LSpeople/$dn/modify</code></li> </ul> <ul> <li><code>import.php</code> : <code>import.php?LSobject=LSpeople</code> devient <code>object/LSpeople/import</code></li> </ul> <ul> <li> <p><code>remove.php</code> : <code>remove.php?LSobject=LSpeople&dn=$dn</code> devient <code>object/LSpeople/$dn/remove</code></p> <p>Avec validation : <code>remove.php?LSobject=LSpeople&dn=$dn&valid</code> devient <code>object/LSpeople/$dn/remove?valid</code></p> </li> </ul> <ul> <li><code>select.php</code> : <code>select.php?LSobject=LSpeople</code> devient <code>object/LSpeople/select</code></li> </ul> <ul> <li> <p><code>custom_action.php</code> : <code>custom_action.php?LSobject=LSpeople&dn=$dn&customAction=$customAction</code> devient <code>object/LSpeople/$dn/customAction/$customAction</code></p> <p>Avec validation : <code>custom_action.php?LSobject=LSpeople&dn=$dn&customAction=$customAction&valid</code> devient <code>object/LSpeople/$dn/customAction/$customAction?valid</code></p> </li> </ul> <ul> <li> <p><code>custom_search_action.php</code> : <code>custom_search_action.php?LSobject=LSpeople&customAction=$customAction</code> devient <code>object/LSpeople/customAction/$customAction</code></p> <p>Avec validation : <code>custom_search_action.php?LSobject=LSpeople&customAction=$customAction&valid</code> devient <code>object/LSpeople/customAction/$customAction?valid</code></p> </li> </ul> <p>Pour identifier les fichiers concern\u00e9s, vous pouvez utiliser la commande suivante :</p> <pre><code>grep -Er '(index|global_search|view|select|create|modify|import|remove|index_ajax|custom_action|custom_search_action|addon_view)\\.php' /etc/ldapsaisie/local/\n</code></pre>"},{"location":"upgrade/method/","title":"Proc\u00e9dure de mise \u00e0 jour","text":""},{"location":"upgrade/method/#installation-via-paquet-debian","title":"Installation via paquet Debian","text":"<p>Lors d\u2019une installation par paquet Debian, la mise \u00e0 jour est grandement facilit\u00e9 par le packaging : Il vous suffit de mettre \u00e0 jour le paquet <code>ldapsaisie</code> :</p> <pre><code>apt update\napt install ldapsaisie\n</code></pre> <p>Une fois l\u2019application mise \u00e0 jour, pr\u00eat\u00e9 attention aux nouveaut\u00e9s et point de vigilances d\u00e9crite dans la section suivante.</p>"},{"location":"upgrade/method/#installation-a-partir-des-sources","title":"Installation \u00e0 partir des sources","text":"<p>Lors d\u2019une installation par \u00e0 partir des sources, le script <code>upgradeFromGit.sh</code> permet d\u2019automatiser la mise \u00e0 jour, \u00e0 condition que vous ayez suivi la proc\u00e9dure d\u2019installation \u00e0 ce sujet.</p> <p>Ce script s\u2019occupera alors de :</p> <ul> <li>Nettoyer <code>working-tree</code> Git des liens symboliques des fichiers locaux (et \u00e9ventuellement du th\u00e8me) mis en place lors d\u2019une pr\u00e9c\u00e9dente ex\u00e9cution ;</li> </ul> <ul> <li>Vider le cache des templates ;</li> </ul> <ul> <li>Mettre \u00e0 jour le <code>working-tree</code> Git via un <code>git pull</code> de la mise \u00e0 jour ;</li> </ul> <ul> <li>Installer des liens symboliques pour les fichiers locaux. En cas de fichier remplacant un fichier livr\u00e9 avec l\u2019application, le script vous notifiera en cas de changement intervenu dans le fichier fourni avec l\u2019application et vous permettra de le mettre \u00e0 jour simplement votre fichier local (via un <code>vim -d</code>) ;</li> </ul> <ul> <li>D\u00e9tecter des changements dans les fichiers <code>MO</code> (traduction) et de d\u00e9clencher dans ce cas un rechargement du serveur web pour prise en compte ;</li> </ul> <ul> <li>Option : de compiler une version locale \u00e0 jour de la documentation ;</li> </ul> <p>Une fois l\u2019application mise \u00e0 jour, pr\u00eat\u00e9 attention aux nouveaut\u00e9s et point de vigilances d\u00e9crite dans la section suivante.</p>"}]} |