{"config":{"lang":["fr"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Introduction","text":"

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.

"},{"location":"#fonctionnalites","title":"Fonctionnalit\u00e9s","text":"

De part sa modularit\u00e9, LdapSaisie est facilement extensible. Cependant, voici une liste non-exhaustive de ses fonctionnalit\u00e9s :

"},{"location":"api/","title":"API","text":"

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, ...

Note

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 !

"},{"location":"api/#authentification","title":"Authentification","text":"

L'authentification \u00e0 l'API utilise le m\u00eame composant LSauth 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.

Warning

Il est \u00e0 noter que tous les types d'utilisateur ne peuvent pas forc\u00e9ment utiliser l'API : le param\u00e8tre api_access doit \u00eatre explicitement positionn\u00e9 \u00e0 True dans la configuration du serveur LDAP.

Une fois connect\u00e9, l'utilisateur endossera les droits associ\u00e9s \u00e0 ses LSprofiles, tout comme un utilisateur connect\u00e9 \u00e0 l'interface web.

"},{"location":"api/#methodes-exposees","title":"M\u00e9thodes expos\u00e9es","text":"

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 api/. 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.

Toutes les m\u00e9thodes retournent des informations au format JSON et accepte le param\u00e8tre pretty 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 :

Note

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 lang accept\u00e9 par toutes les m\u00e9thodes (exemple : fr_FR ou en_US).

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.

Important

Sauf pr\u00e9cision contraire, toutes les m\u00e9thodes expos\u00e9es sont accessibles uniquement via les m\u00e9thodes HTTP GET ou POST. L'acc\u00e8s via une autre m\u00e9thode retournera une erreur 404.

Important

Pour chaque type d'objets inclus dans la recherche, un filtre et/ou un mot cl\u00e9 de recherche doit \u00eatre sp\u00e9cifi\u00e9. Cette m\u00e9thode n'a pas vocation \u00e0 permettre de lister tous les objets de l'annuaire.

Exemple :

# curl -u username:secret 'https://ldapsaisie/api/1.0/search?pattern=LdapSaisie&pretty'\n{\n    \"success\": true,\n    \"objects\": {\n        \"uid=s.ldapsaisie,ou=people,o=ls\": {\n            \"name\": \"Secretariat LdapSaisie\",\n            \"type\": \"LSpeople\",\n            \"Mail\": \"secretariat@ldapsaisie.biz\"\n        },\n        \"uid=ls,ou=people,o=ls\": {\n            \"name\": \"LdapSaisie\",\n            \"type\": \"LSpeople\",\n            \"Mail\": \"ldap.saisie@ls.com\"\n        },\n        \"uid=erwpa,ou=people,o=ls\": {\n            \"name\": \"Erwan PAGE\",\n            \"type\": \"LSpeople\",\n            \"Mail\": \"erwan.page@ldapsaisie.biz\"\n        },\n        \"uid=invite,ou=people,o=ls\": {\n            \"name\": \"Utilisateur de passage\",\n            \"type\": \"LSpeople\",\n            \"Mail\": \"invite@ldapsaisie.biz\"\n        },\n        \"uid=demo,ou=people,o=ls\": {\n            \"name\": \"Demonstration LdapSaisie\",\n            \"type\": \"LSpeople\",\n            \"Mail\": \"demo@ls.com\"\n        },\n        \"uid=admin,ou=people,o=ls\": {\n            \"name\": \"Administration LdapSaisie\",\n            \"type\": \"LSpeople\",\n            \"Mail\": \"admin@ls.com\"\n        },\n        \"uid=admin3,ou=people,o=ls\": {\n            \"name\": \"ZAdministration LdapSaisie\",\n            \"type\": \"LSpeople\",\n            \"Mail\": \"admin@ls.com\"\n        },\n        \"uid=ldapsaisie,ou=sysaccounts,o=ls\": {\n            \"name\": \"ldapsaisie\",\n            \"type\": \"LSsysaccount\"\n        }\n    },\n    \"total\": null,\n    \"params\": {\n        \"keepParamsBetweenSearches\": false,\n        \"LSpeople\": {\n            \"filter\": null,\n            \"pattern\": \"LdapSaisie\",\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        \"LSsysaccount\": {\n            \"filter\": null,\n            \"pattern\": \"LdapSaisie\",\n            \"predefinedFilter\": false,\n            \"basedn\": null,\n            \"scope\": null,\n            \"sizelimit\": 0,\n            \"attronly\": false,\n            \"approx\": false,\n            \"recursive\": false,\n            \"attributes\": [],\n            \"onlyAccessible\": true,\n            \"sortDirection\": null,\n            \"sortBy\": null,\n            \"sortlimit\": 0,\n            \"displayFormat\": \"%{uid}\",\n            \"nbObjectsByPage\": 30,\n            \"withoutCache\": false,\n            \"extraDisplayedColumns\": true\n        }\n    },\n    \"page\": 1,\n    \"nbPages\": 1\n}\n
"},{"location":"conf/","title":"Configuration","text":"

La configuration du projet est situ\u00e9e principalement dans le dossier conf/. Les exceptions seront d\u00e9taill\u00e9es par la suite.

Warning

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.

"},{"location":"conf/LSaddon/","title":"Configuration des LSaddons","text":"

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 conf/LSaddons/ et potera le nom config.LSaddons.[addon name].php.

"},{"location":"conf/LSaddon/LSaddon_LSaccessRightsMatrixView/","title":"LSaddon_LSaccessRightsMatrixView","text":"

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.

Le fichier de configuration permet de d\u00e9finir au travers la variable $GLOBALS['LSaccessRightsMatrixView_allowed_LSprofiles'] la liste des LSprofiles autoris\u00e9s \u00e0 acc\u00e9der \u00e0 cette interface.

"},{"location":"conf/LSaddon/LSaddon_accesslog/","title":"LSaddon_accesslog","text":"

Cet LSaddon fournit la fonction showObjectAccessLogs() 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.

La constante LS_ACCESSLOG_BASEDN du fichier de configuration de l'addon (conf/LSaddons/config.LSaddons.accesslog.php) permet d'indiquer le base DN de la base stockant les logs :

// Accesslog base DN\ndefine('LS_ACCESSLOG_BASEDN', 'cn=ldapsaisie-accesslog');\n

Warning

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.

Exemple d'ACL \u00e0 mettre en place :

to *\n      by dn.exact=uid=ldapsaisie,ou=sysaccounts,o=ls read\n      by * break\n

Ci-dessous, vous trouverez un exemple de configuration de la fonction showObjectAccessLogs() comme customActions :

Exemple d'utilisation :

$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
"},{"location":"conf/LSaddon/LSaddon_asterisk/","title":"LSaddon_asterisk","text":"

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.

"},{"location":"conf/LSaddon/LSaddon_exportSearchResultAsCSV/","title":"LSaddon_exportSearchResultAsCSV","text":"

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.

Des param\u00e8tres de configuration sont disponibles dans le fichier de configuration config.LSaddons.exportSearchResultAsCSV.php. Ils permettent notamment de contr\u00f4ller le format du fichier CSV g\u00e9n\u00e9r\u00e9.

// 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

Ci-dessous, vous trouverez un exemple de configuration de la fonction exportSearchResultAsCSV() comme customActions :

$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

Note

Le label et l'ic\u00f4ne fournis dans cet exemple sont traduits et d\u00e9livr\u00e9s avec LdapSaisie.

"},{"location":"conf/LSaddon/LSaddon_impersonate/","title":"LSaddon_impersonate","text":"

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.

Ci-dessous, vous trouverez un exemple de configuration de la fonction impersonate() comme customActions :

Exemple d'utilisation :

$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
"},{"location":"conf/LSaddon/LSaddon_mail/","title":"LSaddon_mail","text":"

Cet LSaddon est utilis\u00e9 pour g\u00e9rer l'envoi de courriels. Il utilise pour cela les librairies PEAR Mail et Mail_Mime qui doivent \u00eatre install\u00e9s.

Cet LSaddon offre aussi la possibilit\u00e9 d'envoyer des courriels dont le contenu est construit \u00e0 partir de mod\u00e8les. Ces mod\u00e8les sont enregistr\u00e9s dans des fichiers textes stock\u00e9s (voir $GLOBALS['MAIL_TEMPLATES_DIRECTORIES']). Pour chaque mod\u00e8le, vous devez fournir trois fichiers portant le m\u00eame nom mais avec des extensions diff\u00e9rentes :

Ces trois fichiers sont utilis\u00e9s en tant que mod\u00e8le Smarty et seront construit en utilisant les variables fournies dans le contexte d'envoi des courriels. \u00c0 noter que le moteur Smarty utilis\u00e9 pour la g\u00e9n\u00e9ration du contenu de ces courriels n'est pas le m\u00eame que celui utilis\u00e9 par LdapSaisie pour l'affichage des pages.

Par ailleurs, cet LSaddon fourni une vue de gestion des mod\u00e8les de courriels existants (voir $GLOBALS['MAIL_TEMPLATES_EDITOR_VIEW_ACCESS'] pour la configuration des acc\u00e8s).

Warning

Cette vue n'est pas con\u00e7ues pour \u00eatre mise entre toutes les mains. La s\u00e9curisation de mod\u00e8les de courriels \u00e9tant tr\u00e8s complexe, il est fortement recommand\u00e9 de n'ouvrir l'acc\u00e8s \u00e0 cette vue qu'aux utilisateurs avertis et de confiances.

Cet LSaddon doit \u00eatre configur\u00e9 en \u00e9ditant son fichier de configuration config.LSaddons.mail.php.

 ***********************************************\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\n/**\n * Email templates\n *\n * This addon offer ability to send email by using templates. Email templates are stored in\n * full-text files in configured directories (see $GLOBALS['MAIL_TEMPLATES_DIRECTORIES']). For each\n * template, you have to provide three files with the same name but with different extensions:\n * - template.subject: the email subject. Note: only the first line is used (and stripped)\n * - template.html: the HTML content of the email\n * - template.txt: the text content of the email\n * All these files will be used as Smarty templates and will be computed using variables provided\n * in the sending context. Note that the Smarty object used to compute the template is not the same\n * as the one used by LdapSaisie to display pages.\n *\n * Futhermore, this addon offer a view to list and edit existing template (see\n * $GLOBALS['MAIL_TEMPLATES_EDITOR_VIEW_ACCESS'] to configured access).\n */\n\n// List of directory paths where as stored mail templates\n// Notes:\n// - provided path could be absolute or relative. Relative path are relative to the root base\n//   sources LdapSaisie directory (commonly /usr/share/ldapsaisie or the src directory if you\n//   installed it from sources). On Debian installation, you can specify 'local/email_templates' to\n//   refer to /etc/ldapsaisie/local/email_templates directory/\n// - Multiple directories could be specified, sorted so that the first ones take priority over\n//   the last one.\n// - To allow users to edit them using the editor view, these directories must be\n//   writable by PHP process (commonly runed as www-data).\n$GLOBALS['MAIL_TEMPLATES_DIRECTORIES'] = array('local/email_templates');\n\n// List of granted LSprofiles to access mail templates editor view\n// WARNING: Sanitizing mail templates is hell... EXPOSE THIS VIEW ONLY TO TRUSTED USERS!\n$GLOBALS['MAIL_TEMPLATES_EDITOR_VIEW_ACCESS'] = array('admin');\n

Cet LSaddon offre avant tout la possibilit\u00e9 d'envoyer des courriels en utilisant la fonction PHP sendMail() :

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

Pour l'envoi de courriels en utilisant un mod\u00e8le, il faut utiliser la fonction PHP sendMailFromTemplate() :

bool sendMailFromTemplate(\n  <string> $tplname,\n  <string> $to,\n  <array> $variables,\n  <array(string)> $headers,\n  <array> $attachments\n);\n
"},{"location":"conf/LSaddon/LSaddon_maildir/","title":"LSaddon_maildir","text":"

Cet LSaddon est utilis\u00e9 pour g\u00e9rer la manipulation distante de maildir.

FIXME

"},{"location":"conf/LSaddon/LSaddon_mailquota/","title":"LSaddon_mailquota","text":"

Cet LSaddon fournie une fonction mailquota_get_usage 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.

Cet LSaddon fournie une \u00e9galement une fonction mailquota_show_usage pouvant \u00eatre utilis\u00e9e comme customActions et permettant d'afficher l'utilisation du quota de la bo\u00eete mail correspondante via une message dynamique (LSinfo).

Des param\u00e8tres de configuration sont disponibles dans le fichier de configuration config.LSaddons.mailquota.php.

// 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

Ci-dessous, vous trouverez un exemple de configuration de la fonction mailquota_show_usage() comme customActions :

$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
"},{"location":"conf/LSaddon/LSaddon_phpldapadmin/","title":"LSaddon_phpldapadmin","text":"

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.

Il est necessaire de configurer l'URL de votre installation de PhpLdapAdmin dans le fichier de configuration config.LSaddons.phpldapadmin.php.

Structure du fichier :

// 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

Cet LSaddon offre la possibilit\u00e9 d'utilis\u00e9 la fonction PHP redirectToPhpLdapAdmin() comme customActions.

Exemple d'utilisation :

$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
"},{"location":"conf/LSaddon/LSaddon_ppolicy/","title":"LSaddon_ppolicy","text":"

Cet LSaddon fourni :

Des param\u00e8tres de configuration sont disponibles dans le fichier de configuration config.LSaddons.ppolicy.php.

// 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
"},{"location":"conf/LSaddon/LSaddon_showSupportInfo/","title":"LSaddon_showSupportInfo","text":"

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 addon/showSupportInfo/showMySupportInfo. 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.

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 SHOW_SUPPORT_INFO_IN_MENU \u00e0 True.

Une fonction showMySupportInfo() 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 showMySupportInfo() comme customActions :

$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

Note

Le label et l'ic\u00f4ne fournis dans cet exemple sont traduits et d\u00e9livr\u00e9s avec LdapSaisie.

"},{"location":"conf/LSaddon/LSaddon_showTechInfo/","title":"LSaddon_showTechInfo","text":"

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.

Ci-dessous, vous trouverez un exemple de configuration de la fonction showTechInfo() comme customActions :

$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

Note

Le label et l'ic\u00f4ne fournis dans cet exemple sont traduits et d\u00e9livr\u00e9s avec LdapSaisie.

"},{"location":"conf/LSauthMethod/","title":"Configuration des m\u00e9thodes d'authentification (LSauthMethod)","text":"

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 conf/LSauth/.

"},{"location":"conf/LSauthMethod/LSauthMethod_CAS/","title":"LSauthMethod_CAS","text":"

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 conf/LSauth/config.LSauthMethod_CAS.php.

Structure du fichier :

/*\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
"},{"location":"conf/LSauthMethod/LSauthMethod_HTTP/","title":"LSauthMethod_HTTP","text":"

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.

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.

Note

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 LSAUTHMETHOD_HTTP_TRUST_WITHOUT_PASSWORD_CHALLENGE (voir ci-dessous).

Les variables d'environnements utilis\u00e9es pour authentifier l'utilisateur connect\u00e9 d\u00e9pendent de la m\u00e9thode configur\u00e9e via la constante LSAUTHMETHOD_HTTP_METHOD (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.

Note

Cette LSauthMethod supporte le mode API et il s'agit de la m\u00e9thode utilis\u00e9e par d\u00e9faut dans ce mode.

Cette librairie peut \u00eatre configur\u00e9e en \u00e9ditant le fichier de configuration conf/LSauth/config.LSauthMethod_HTTP.php.

Structure du fichier :

/*\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
"},{"location":"conf/LSauthMethod/LSauthMethod_anonymous/","title":"LSauthMethod_anonymous","text":"

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 conf/LSauth/config.LSauthMethod_anonymous.php et notament en d\u00e9finissant la constante LSAUTHMETHOD_ANONYMOUS_USER contenant le login d'un utilisateur dont les droits d'acc\u00e8s seront endoss\u00e9s par tout les personnes utilisant LdapSaisie.

"},{"location":"conf/LSobject/","title":"Configuration LSobject","text":"

Cette partie d\u00e9crit la mani\u00e8re de configurer les diff\u00e9rents types de LSobjets manipul\u00e9s par LdapSaisie.

La configuration des LSobjects est stock\u00e9e dans le dossier /conf/LSobjects. Dans ce dossier, on retrouve un fichier par type d'LSobject, nomm\u00e9 de la mani\u00e8re suivante :

config.LSobjects.[nom du type d'LSobject].php\n

Ce fichier contient la d\u00e9claration de la configuration du type d'LSobject qui est stock\u00e9 dans la variable globale $GLOBALS['LSobjects']['[nom du type d'LSobject]'].

$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
"},{"location":"conf/LSobject/LSform/","title":"Les formulaires (LSform)","text":"

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 :

"},{"location":"conf/LSobject/LSform/#configuration-de-laffichage","title":"Configuration de l'affichage","text":"

La configuration des layout se situe dans la configuration des LSobjects, dans la variable layout ($GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform']['layout']). 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.

$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

Important

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.

"},{"location":"conf/LSobject/LSform/#configuration-des-masques-de-saisie","title":"Configuration des masques de saisie","text":"

La configuration des masques de saisie (dataEntryForm) se situe dans la configuration des LSobjects, dans la variable dataEntryForm ($GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSform']['dataEntryForm']). 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.

$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
"},{"location":"conf/LSobject/LSrelation/","title":"Les relations entre les objets de l'annuire (LSrelation)","text":"

Cette section d\u00e9crit la mani\u00e8re de configurer les relations entre les LSobjects appel\u00e9es LSrelation.

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.

$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
"},{"location":"conf/LSobject/LSsearch/","title":"Recherche des objets dans l'annuaire (LSsearch)","text":"

Cette section d\u00e9crit la mani\u00e8re de param\u00e9trer les recherches dans l'annuaire pour un type d'LSobject donn\u00e9.

La configuration des LSsearch se situe dans la configuration des LSobjects, dans la variable LSsearch ($GLOBALS['LSobjects']['[nom du type d'LSobject]']['LSsearch']).

$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  'showSelectionBoxes' => [boolean],\n);\n
"},{"location":"conf/LSobject/LSsearch/#les-actions-personnalisees-customactions","title":"Les actions personnalis\u00e9es (customActions)","text":"

Cette section d\u00e9crit la mani\u00e8re de configurer les actions personnalis\u00e9es ex\u00e9cutables sur les recherches d'LSobjects appel\u00e9es customActions.

$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
"},{"location":"conf/LSobject/LSsearch/#ecriture-dune-fonction-implementant-une-customaction","title":"\u00c9criture d'une fonction impl\u00e9mentant une customAction","text":"

Une fonction impl\u00e9mentant une customAction se d\u00e9clare de la mani\u00e8re suivante :

/*\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

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 True si tout s'est bien pass\u00e9, soit False en cas de probl\u00e8me.

Important

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 : $search -> run();. 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 :

$search -> setParam('attributes',array('attr1','attr2'));\n

Note

Ces fonctions sont le plus couramment d\u00e9finies au sein d'LSaddon.

"},{"location":"conf/LSobject/container_auto_create/","title":"Cr\u00e9ation automatique du conteneur des LSobjets dans un subDn","text":"

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 $GLOBALS['LSobjects']['[nom du type d'LSobject]']['container_auto_create'].

$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
"},{"location":"conf/LSobject/customActions/","title":"Actions personnalis\u00e9es (customActions)","text":"

Cette section d\u00e9crit la mani\u00e8re de configurer les actions personnalis\u00e9es ex\u00e9cutables sur les LSobjects appel\u00e9es customActions.

$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    'accessMethods' => array(\n      'web',\n      'api',\n    ),\n    'rights' => array(\n      'LSprofile1',\n      'LSprofile2',\n      ...\n    )\n  )\n);\n
"},{"location":"conf/LSobject/customActions/#ecriture-dune-fonction-implementant-une-customaction","title":"\u00c9criture d'une fonction impl\u00e9mentant une customAction","text":"

Une fonction impl\u00e9mentant une customAction se d\u00e9clare de la mani\u00e8re suivante :

/*\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 *     - Cas particulier pour une ex\u00e9cution via l'API : un tableau des donn\u00e9es\n *       \u00e0 retourner. Exemple :\n *       [\"success\" => true, \"extra_info1\" => \"...\", \"extra_info2\" => \"...\"]\n */\nfunction maFonction ($object) {\n\n  // Actions\n\n}\n

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 True si tout s'est bien pass\u00e9, soit False en cas de probl\u00e8me.

Une customAction pourra \u00e9galement \u00eatre appel\u00e9 via l'API. Dans ce cas, il est possible de retourner un tableau associatif et non un simple bool\u00e9en. Le r\u00e9sultat retourn\u00e9 sera alors fusionn\u00e9 avec les donn\u00e9es retourn\u00e9es par la requ\u00eate. Ce tableau devra contenir \u00e0 minima la cl\u00e9 success qui indiquera via un bool\u00e9en si l'ex\u00e9cution est un succ\u00e8s ou non. Il est possible de d\u00e9tecter si la m\u00e9thode est appel\u00e9e via l'API en appelant la m\u00e9thode LSsession :: get('api_mode'). Vous pouvez prendre exemple sur le code de la m\u00e9thode showTechInfo() fournie par le LSaddon showTechInfo.

Note

Ces fonctions sont le plus couramment d\u00e9finies au sein d' LSaddon.

"},{"location":"conf/LSobject/ioFormat/","title":"Les formats d'import/export (ioFormat)","text":"

Cette section d\u00e9crit la mani\u00e8re de param\u00e9trer les formats d'import/export pour un type d' LSobject donn\u00e9.

La configuration des ioFormats se situe dans la configuration des LSobjects, dans la variable ioFormat ($GLOBALS['LSobjects']['[nom du type d'LSobject]']['ioFormat']). 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.

Important

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 :

$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
"},{"location":"conf/LSobject/ioFormat/#pilote-dioformat","title":"Pilote d'ioFormat","text":"

Cette section d\u00e9crit la mani\u00e8re de configurer les pilotes d'ioFormat utilis\u00e9s lors des imports/exports d'LSobjects.

"},{"location":"conf/LSobject/ioFormat/#pilote-de-fichiers-csv","title":"Pilote de fichiers CSV","text":"

Ce pilote permet de g\u00e9rer l'import/export de LSobject \u00e0 partir d'un fichier CSV. Depuis la version 4 d'LdapSaisie, ce pilote utilise les fonctions standards fgetcsv() et fputcsv 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 \" 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.

$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
"},{"location":"conf/LSobject/ioFormat/#declencheurs","title":"D\u00e9clencheurs","text":"

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.

Actuellement, les \u00e9venements suivant sont g\u00e9r\u00e9s :

Nom Description Bloquant before_import Avant l'import. Oui after_import Apr\u00e8s l'import'. Non

Note

Si un \u00e9v\u00e9nement est dit bloquant, lors de l'ex\u00e9cution des actions li\u00e9es, si une des fonctions retourne false, le processus s'arr\u00eatera.

"},{"location":"conf/LSobject/ioFormat/#configuration","title":"Configuration","text":"

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 after_import, il faut d\u00e9finir la variable suivante :

$GLOBALS['LSobjects']['LSpeople']['ioFormat']['mycsv']['after_import']\n

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.

"},{"location":"conf/LSobject/ioFormat/#ecriture-dune-fonction","title":"Ecriture d'une fonction","text":"

Une fonction ex\u00e9cut\u00e9e par un d\u00e9clencheur d'un ioFormat se d\u00e9clare de la mani\u00e8re suivante :

/*\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

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 True si tout s'est bien pass\u00e9 ou False en cas de probl\u00e8me. Dans le cas d'un \u00e9v\u00e9nement bloquant, si la fonction retourne False, le processus est arr\u00eat\u00e9.

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 :

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

Note

Les cl\u00e9s objectsData et return 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.

"},{"location":"conf/LSobject/triggers/","title":"D\u00e9clencheurs","text":"

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.

Actuellement, les \u00e9venements suivant sont g\u00e9r\u00e9s :

Nom Description Bloquant before_create Avant la cr\u00e9ation du LSobject. Oui after_create Apr\u00e8s la cr\u00e9ation du LSobject. Non before_modify Avant la modification du LSobject Oui after_modify Apr\u00e8s la modification du LSobject Non before_rename Avant de renommer le LSobject Oui after_rename Apr\u00e8s avoir renomm\u00e9 le LSobject Non before_delete Avant la suppression du LSobject Oui after_delete Apr\u00e8s la suppression du LSobject Non

Note

Si un \u00e9v\u00e9nement est dit bloquant, lors de l'ex\u00e9cution des actions li\u00e9es, si une des fonctions retourne false, le processus s'arr\u00eatera.

"},{"location":"conf/LSobject/triggers/#configuration","title":"Configuration","text":"

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 after_modify, il faut d\u00e9finir la variable suivante :

$GLOBALS['LSobjects']['[nom du type d'LSobject]']['after_modify']\n

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.

"},{"location":"conf/LSobject/triggers/#ecriture-dune-fonction","title":"\u00c9criture d'une fonction","text":"

Une fonction ex\u00e9cut\u00e9 par un d\u00e9clencheur d'un LSobject se d\u00e9clare de la mani\u00e8re suivante :

/*\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

Cette fonction doit prendre pour seul param\u00e8tre, le LSobject sur lequel l'\u00e9v\u00e8nement survient et doit retourner soit True si tout s'est bien pass\u00e9, soit False en cas de probl\u00e8me. Dans le cas d'un \u00e9v\u00e9nement bloquant, si la fonction retourne False, le processus est arr\u00eat\u00e9.

"},{"location":"conf/LSobject/LSattribute/","title":"Configuration des attributs","text":"

Cette section d\u00e9crit les options de configuration des attributs des LSobjects. Les attributs sont d\u00e9finis dans le tableau associatif attrs 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.

Warning

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

'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    'set_default_value_on_creation_if_empty' => [booleen],\n    'force_generation_if_empty' => [booleen],\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
"},{"location":"conf/LSobject/LSattribute/triggers/","title":"D\u00e9clencheurs","text":"

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.

Actuellement, les \u00e9v\u00e8nements suivant sont g\u00e9r\u00e9s :

Nom Description Bloquant before_create Avant la cr\u00e9ation du LSobject, lorsque l'attribut a au moins une valeur. Oui after_create Apr\u00e8s la cr\u00e9ation du LSobject, lorsque l'attribut a au moins une valeur. Non before_modify Avant la modification de la valeur de l'attribut. Oui after_modify Apr\u00e8s la modification de la valeur de l'attribut. Non before_delete Avant la suppression du LSobject contenant l'attribut. Oui after_delete Apr\u00e8s la suppression du LSobject contenant l'attribut. Non

Note

Si un \u00e9v\u00e9nement est dit bloquant, lors de l'ex\u00e9cution des actions li\u00e9es, si une des fonctions retourne false, le processus s'arr\u00eatera.

"},{"location":"conf/LSobject/LSattribute/triggers/#configuration","title":"Configuration","text":"

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 after_modify, il faut d\u00e9finir la variable suivante :

$GLOBALS['LSobjects']['LSpeople']['attrs']['mail']['after_modify']\n

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.

"},{"location":"conf/LSobject/LSattribute/triggers/#ecriture-dune-fonction","title":"\u00c9criture d'une fonction","text":"

Une fonction ex\u00e9cut\u00e9 par un d\u00e9clencheur d'un LSattribute se d\u00e9clare de la mani\u00e8re suivante :

/*\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

Cette fonction doit prendre pour seul param\u00e8tre, le LSobject contenant le LSattribute sur lequel l'\u00e9venement survient et doit retourner soit True si tout s'est bien pass\u00e9, soit False en cas de probl\u00e8me. Dans le cas d'un \u00e9v\u00e9nement bloquant, si la fonction retourne False, le processus est arr\u00eat\u00e9.

"},{"location":"conf/LSobject/LSattribute/validation/","title":"Configuration des r\u00e8gles de v\u00e9rification d'int\u00e9grit\u00e9","text":"

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.

"},{"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":"

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.

'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
"},{"location":"conf/LSobject/LSattribute/validation/#validation-par-lexecution-dune-fonction","title":"Validation par l'ex\u00e9cution d'une fonction","text":"

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 LSldapObject courant. Si la fonction ne retourne pas true, la validation \u00e9chouera.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/","title":"Configuration des attributs HTML (LSattr_html)","text":"

Cette section d\u00e9crit les options propres \u00e0 chacun des types d'attributs HTML support\u00e9s par LdapSaisie.

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_boolean/","title":"LSattr_html_boolean","text":"

Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un bool\u00e9en.

La valeur retourn\u00e9e est l'une des cha\u00eenes de caract\u00e8res suivantes :

'html_options' => array (\n  'true_label' => '[label]',\n  'false_label' => '[label]',\n),\n...\n

Note

Pour le moment, les attributs \u00e0 valeurs multiples ne sont pas g\u00e9r\u00e9s.

Note

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

Important

La d\u00e9finition de la valeur par d\u00e9faut d'un attribut utilisant ce type HTML (param\u00e8tre default_value), doit se faire \u00e0 l'aide des valeurs yes ou no.

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_date/","title":"LSattr_html_date","text":"

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.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_gpg_pub_key/","title":"LSattr_html_gpg_pub_key","text":"

Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une clef publique GPG. Il permet dans l'interface, d'avoir un affichage adapt\u00e9 \u00e0 ce type de donn\u00e9e.

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_image/","title":"LSattr_html_image","text":"

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.

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_jsonCompositeAttribute/","title":"LSattr_html_jsonCompositeAttribute","text":"

Ce type est utilis\u00e9 pour la gestion des attributs dont les valeurs sont des dictionnaires de valeurs encod\u00e9es aux formats JSON.

Exemple de valeur g\u00e9r\u00e9e :

{\"component1\": \"value1\", \"component2\": \"value2\", \"component3\": \"value3\"}\n

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.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_labeledValue/","title":"LSattr_html_labeledValue","text":"

Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est prefix\u00e9 d'un label et qui respecte le format suivant : [label]valeur.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_mail/","title":"LSattr_html_mail","text":"

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.

'html_options' => array(\n  'disableMailSending' => [bool\u00e9en],\n),\n...\n

Important

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, ...).

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_mailQuota/","title":"LSattr_html_mailQuota","text":"

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.

'html_options' => array(\n    'suffix' => '[suffix]',\n  )\n),\n...\n
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_maildir/","title":"LSattr_html_maildir","text":"

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.

Note

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.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_password/","title":"LSattr_html_password","text":"

Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un mot de passe.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_postaladdress/","title":"LSattr_html_postaladdress","text":"

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.

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 (\\n) par des espaces) via le service Nominatim d'OpenStreetMap.

Note

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

'html_options' => array(\n  'map_url_pattern_format' => '[LSformat]',\n  'map_url_pattern_generate_function' => '[callable]',\n  'map_url_format' => '[LSformat]',\n),\n...\n
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_pre/","title":"LSattr_html_pre","text":"

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 monospace. Cela reproduit l'affichage d'une balise HTML pre.

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_rss/","title":"LSattr_html_rss","text":"

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.

Important

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, ...).

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_sambaAcctFlags/","title":"LSattr_html_sambaAcctFlags","text":"

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.

Pour d\u00e9finir la valeur par d\u00e9faut de cet attribut, il faut d\u00e9finir param\u00e8tre default_value comme un tableau des drapeaux telque pr\u00e9vu par Samba :

- U

Compte utilisateur standard\n

- W

Compte de poste de travail approuv\u00e9\n

- S

Compte de serveur approuv\u00e9\n

- I

Compte de domaine approuv\u00e9\n

- M

Compte de connexion Majority Node Set (MNS)\n

- H

Dossier personnel requis\n

- N

Compte sans mot de passe\n

- X

Le mot de passe n'expire jamais\n

- D

Compte d\u00e9sactiv\u00e9\n

- T

Copie temporaire d'un autre compte\n

- L

Compte automatiquement bloqu\u00e9\n
  Exemple de valeur par d\u00e9faut...\n'default_value' => array('U', 'X'),\n...\n

Note

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 possible_values). M\u00eame si cela n'est pas forc\u00e9ment utiles, les autres param\u00e8tres du type parent restent utilisables.

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_select_box/","title":"LSattr_html_select_box","text":"

Ce type est identique au type LSattr_html_select_list except\u00e9 qu'il utilise en lieu et place d'une balise HTML select, plusieurs balises HTML input de type checkbox en cas de valeurs multiples ou de type radio 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).

'html_options' => array (\n   'inline' => [Bool\u00e9en],\n),\n...\n
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_select_list/","title":"LSattr_html_select_list","text":"

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.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_select_object/","title":"LSattr_html_select_object","text":"

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.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_ssh_key/","title":"LSattr_html_ssh_key","text":"

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.

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_tel/","title":"LSattr_html_tel","text":"

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 tel:~~ est affich\u00e9.

Important

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, ...).

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_text/","title":"LSattr_html_text","text":"

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.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_textarea/","title":"LSattr_html_textarea","text":"

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.

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_url/","title":"LSattr_html_url","text":"

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).

Important

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, ...).

"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_valueWithUnit/","title":"LSattr_html_valueWithUnit","text":"

Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un entier auxquel un facteur peut s'appliquer (par exemple : Kilo, M\u00e9ga, ...).

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_wysiwyg/","title":"LSattr_html_wysiwyg","text":"

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.

'html_options' => array(\n  'extra_options' => array (\n    [Options \u00e0 passer \u00e0 TinyMCE]\n  ),\n),\n...\n
"},{"location":"conf/LSobject/LSattribute/LSattr_html/LSattr_html_xmpp/","title":"LSattr_html_xmpp","text":"

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.

Note

Cette fonctionnalit\u00e9 n'est support\u00e9 uniquement par les navigateurs web supportant les URI de type xmpp://.

Important

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, ...).

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/","title":"Configuration des attributs LDAP (LSattr_ldap)","text":"

Cette section d\u00e9crit les options propres \u00e0 chacun des types d'attributs LDAP support\u00e9s par LdapSaisie.

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_ascii/","title":"LSattr_ldap_ascii","text":"

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.

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_boolean/","title":"LSattr_ldap_boolean","text":"

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

'ldap_options' => array (\n  'true_value' => '[valeur correspondant \u00e0 Vrai]',\n  'false_value' => '[valeur correspondant \u00e0 Faux]'\n),\n...\n

Important

Les valeurs possibles pour le param\u00e8tre default_value sont yes et no.

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_compositeValueToJSON/","title":"LSattr_ldap_compositeValueToJSON","text":"

Ce type est utilis\u00e9 pour la gestion des attributs composites dont les valeurs respectent le format suivant : [key1=value1][key2=value2][...]

Ce type d'attribut LDAP sera utilis\u00e9 pour convertir la valeur en son \u00e9quivalent JSON pour pouvoir \u00eatre trait\u00e9 \u00e0 l'aide du type d' attribut HTML LSattr_html_jsonCompositeAttribute.

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_date/","title":"LSattr_ldap_date","text":"

Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est une date.

Note

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.

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.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_image/","title":"LSattr_ldap_image","text":"

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.

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_naiveDate/","title":"LSattr_ldap_naiveDate","text":"

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.

'ldap_options' => array (\n  'format' => '[Format de stockage]', // Default : \"%Y%m%d%H%M%SZ\"\n),\n...\n
"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_numeric/","title":"LSattr_ldap_numeric","text":"

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.

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_password/","title":"LSattr_ldap_password","text":"

Ce type est utilis\u00e9 pour la gestion des attributs dont la valeur est un mot de passe.

'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
"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_postaladdress/","title":"LSattr_ldap_postaladdress","text":"

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 $.

Lors de la lecture des valeurs de ce type d'attribut dans l'annuaire, les caract\u00e8res $ seront remplac\u00e9s par des caract\u00e8res \\n et, \u00e0 l'inverse, lors de l'\u00e9criture des valeurs de ce type d'attribut dans l'annuaire, les caract\u00e8res \\n seront remplac\u00e9s par des caract\u00e8res $.

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_pwdHistory/","title":"LSattr_ldap_pwdHistory","text":"

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 :

Ce type d'attribut LDAP permettra de convertir la valeur en son \u00e9quivalent JSON pour pouvoir \u00eatre trait\u00e9 \u00e0 l'aide du type d'attribut HTML LSattr_html_jsonCompositeAttribute.

Exemple de valeur de l'attribut pwdHistory :

20201202144718Z#1.3.6.1.4.1.1466.115.121.1.40#105#{SSHA512}XDSiR6Sh6W7gyVIk6Rr2OUv8rNPr+0rHF99d9lcirE/TnnEdkjkncIi5iPubErL5lpfgh8gXLgSfmqvmFcMqXLToC25xIqyk\n

Exemple de valeur tranform\u00e9e :

{\"time\":1606920438,\"syntaxOID\":\"1.3.6.1.4.1.1466.115.121.1.40\",\"length\":105,\"hashed_password\":\"{SSHA512}XDSiR6Sh6W7gyVIk6Rr2OUv8rNPr+0rHF99d9lcirE/TnnEdkjkncIi5iPubErL5lpfgh8gXLgSfmqvmFcMqXLToC25xIqyk\"}\n

Exemple de configuration compl\u00e8te de l'attribut :

'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

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 AAAA/MM/JJ HH:MM:SS, mais il peut aussi est personnalis\u00e9 via le param\u00e8tre date_format. Ce format est compos\u00e9 \u00e0 partir des motifs cl\u00e9s g\u00e9r\u00e9s par la fonction date() de PHP. Pour plus d'information, consulter la documentation officielle.

Note

La valeur par d\u00e9faut est YmdHisO, correspondant \u00e0 la syntaxe Generalized Time telle que d\u00e9finie dans la RFC4517 et pr\u00e9vu par le Draft-behera-ldap-password-policy sp\u00e9cifiant cet attribut standard.

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_sambaAcctFlags/","title":"LSattr_ldap_sambaAcctFlags","text":"

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.

"},{"location":"conf/LSobject/LSattribute/LSattr_ldap/LSattr_ldap_shadowExpire/","title":"LSattr_ldap_shadowExpire","text":"

Ce type est pr\u00e9vu pour g\u00e9rer l'attribut shadowExpire 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.

Note

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 shadowLastChange.

"},{"location":"conf/LSobject/LSattribute/check_data/","title":"Configuration des r\u00e8gles de v\u00e9rification syntaxique","text":"

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.

'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

Le param\u00e8tre check_data 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.

"},{"location":"conf/LSobject/LSattribute/check_data/alphanumeric/","title":"alphanumeric","text":"

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.

"},{"location":"conf/LSobject/LSattribute/check_data/callable/","title":"callable","text":"

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 True si la valeur est valide et False sinon.

"},{"location":"conf/LSobject/LSattribute/check_data/date/","title":"date","text":"

Cette r\u00e8gle v\u00e9rifie que la valeur saisie est bien une date et qu'elle respecte un format pr\u00e9cis.

"},{"location":"conf/LSobject/LSattribute/check_data/differentPassword/","title":"differentPassword","text":"

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.

Important

Les autres attributs doivent utiliser le type d'attribut LDAP LSattr_ldap_password.

"},{"location":"conf/LSobject/LSattribute/check_data/email/","title":"email","text":"

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).

"},{"location":"conf/LSobject/LSattribute/check_data/filesize/","title":"filesize","text":"

Cette r\u00e8gle v\u00e9rifie que la valeur est un fichier dont la taille en octets respecte les limites pass\u00e9es en param\u00e8tre.

"},{"location":"conf/LSobject/LSattribute/check_data/gpg_pub_key/","title":"gpg_pub_key","text":"

Cette r\u00e8gle v\u00e9rifie que la valeur est une cl\u00e9 publique GPG. Pour cela, la cl\u00e9 est import\u00e9e dans un keyring GnuPG.

"},{"location":"conf/LSobject/LSattribute/check_data/imagefile/","title":"imagefile","text":"

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 : /image\\/.*/

Important

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.

"},{"location":"conf/LSobject/LSattribute/check_data/imagesize/","title":"imagesize","text":"

Cette r\u00e8gle v\u00e9rifie que la valeur est une image dont la taille en pixels respecte les limites pass\u00e9es en param\u00e8tre.

"},{"location":"conf/LSobject/LSattribute/check_data/inarray/","title":"inarray","text":"

Cette r\u00e8gle v\u00e9rifie que la valeur saisie fait partie d'une liste de valeurs autoris\u00e9es (ou interdites).

"},{"location":"conf/LSobject/LSattribute/check_data/integer/","title":"integer","text":"

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.

"},{"location":"conf/LSobject/LSattribute/check_data/ldapSearchURI/","title":"ldapSearchURI","text":"

Cette r\u00e8gle v\u00e9rifie que la valeur est une URI de recherche LDAP valide, c'est \u00e0 dire, par exemple, ldaps://ldap.example.com:636/o=example?attr1,attr2?one?(gidNumber=100)

Cette v\u00e9rification commence par d\u00e9couper la valeur \u00e0 l'aide du s\u00e9p\u00e9rateur ? et elle s'assure ensuite :

Param\u00eatres de configuration :

"},{"location":"conf/LSobject/LSattribute/check_data/lettersonly/","title":"lettersonly","text":"

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.

"},{"location":"conf/LSobject/LSattribute/check_data/maxlength/","title":"maxlength","text":"

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.

"},{"location":"conf/LSobject/LSattribute/check_data/mimetype/","title":"mimetype","text":"

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.

"},{"location":"conf/LSobject/LSattribute/check_data/minlength/","title":"minlength","text":"

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.

"},{"location":"conf/LSobject/LSattribute/check_data/nonzero/","title":"nonzero","text":"

Cette r\u00e9gle v\u00e9rifie que la valeur est une valeur num\u00e9rique non nulle.

"},{"location":"conf/LSobject/LSattribute/check_data/nopunctuation/","title":"nopunctuation","text":"

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 : ( ) . \\ / \\ * \\ ^ \\ ? # ! @ $ % + = , \" ' > < ~ [ ] { }

"},{"location":"conf/LSobject/LSattribute/check_data/numberOfValues/","title":"numberOfValues","text":"

Cette r\u00e8gle v\u00e9rifie que le nombre de valeurs de l'attribut est comprise entre les limites pass\u00e9es en param\u00e8tre.

"},{"location":"conf/LSobject/LSattribute/check_data/numeric/","title":"numeric","text":"

Cette r\u00e9gle v\u00e9rifie que la valeur est une valeur num\u00e9rique.

"},{"location":"conf/LSobject/LSattribute/check_data/password/","title":"password","text":"

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.

"},{"location":"conf/LSobject/LSattribute/check_data/rangelength/","title":"rangelength","text":"

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.

"},{"location":"conf/LSobject/LSattribute/check_data/regex/","title":"regex","text":"

Cette r\u00e8gle v\u00e9rifie que la valeur saisie respecte bien l'expression r\u00e9guli\u00e8re pass\u00e9e en param\u00e8tre.

"},{"location":"conf/LSobject/LSattribute/check_data/required/","title":"required","text":"

Cette r\u00e9gle v\u00e9rifie que la valeur n'est pas une cha\u00eene de caract\u00e8res de longueur nulle.

"},{"location":"conf/LSobject/LSattribute/check_data/ssh_pub_key/","title":"ssh_pub_key","text":"

Cette r\u00e8gle v\u00e9rifie que la valeur est une cl\u00e9 publique SSH.

Cette v\u00e9rification utilise tout d'abord une expression r\u00e9guli\u00e8re pour valider la forme syntaxique de la cl\u00e9 publique (ssh-[type] [cl\u00e9 au format base64] [commentaire]) 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.

"},{"location":"conf/LSobject/LSattribute/check_data/telephonenumber/","title":"telephonenumber","text":"

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 : /^(01|02|03|04|05|06|08|09)[0-9]{8}$/

"},{"location":"conf/LSobject/LSattribute/check_data/zxcvbn/","title":"zxcvbn","text":"

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.

Warning

La librairie ZxcvbnPhp n'est compatible qu'avec PHP 7 et sup\u00e9rieur.

"},{"location":"conf/global/","title":"Configuration globale","text":"

La plus grande partie de la configuration globale se trouve dans le fichier config.inc.php.

// 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
"},{"location":"conf/global/#variables-globales","title":"Variables globales","text":" "},{"location":"conf/global/#preferences-globales","title":"Pr\u00e9f\u00e9rences globales","text":"

Important

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.

"},{"location":"conf/global/#variables-et-constantes-independantes","title":"Variables et constantes ind\u00e9pendantes","text":" "},{"location":"conf/global/LDAP_search_params/","title":"Param\u00e8tres \u00e9tendus des recherches dans l'annuaire","text":"

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 :

Nom Description Valeur par d\u00e9faut scope

D\u00e9finition de l'\u00e9tendue de la recherche :

sub sizelimit Le nombre maximum d'entr\u00e9es retourn\u00e9es par la recherche. 0 (illimit\u00e9) timelimit Le d\u00e9lai d'attente maximum de la r\u00e9ponse du serveur en secondes. 0 (illimit\u00e9) attrsonly Si vrai, seuls les noms des atttributs seront retourn\u00e9s. false attributes Tableau contenant les noms des attributs que les entr\u00e9es retourn\u00e9es peuvent contenir et que l'on souhaite r\u00e9cup\u00e9rer. array()(tous)

Pour plus d'information sur le sujet, vous pouvez consulter la documentation officiel du projet Net_LDAP2.

"},{"location":"conf/global/LSformat/","title":"Format param\u00e9trable (LSfomat)","text":"

Un format param\u00e9trable est une cha\u00eene de caract\u00e8res contenant des mots cl\u00e9s form\u00e9s comme dans l'exemple suivant\u00a0:

%{[nom du mot cl\u00e9][:A][:B][! ou _][~][%]}\n

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.

Le param\u00e8tre A correspond, lorsque B 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:

Lorsque le param\u00e8tre B est d\u00e9fini, A correspond au rang du premier caract\u00e8re \u00e0 partir duquel la cha\u00eene de substitution sera d\u00e9coup\u00e9e et B le nombre maximum de caract\u00e8res \u00e0 extraire. Le signe de B influera comme expliqu\u00e9 dans le premier cas. Si B vaut z\u00e9ro, la totalit\u00e9 de la longeur de la cha\u00eene sera retourn\u00e9e en tenant compte de A pour le rang du premier caract\u00e8re.

Il existe par ailleurs des param\u00e8tres permettant de modifier la valeur de substitution avant son utilisation :

Important

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.

"},{"location":"conf/global/LSlog/","title":"Configuration de la journalisation (LSlog)","text":"

Cette section d\u00e9crit le tableau de configuration de la journalisation de l'application.

$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
"},{"location":"conf/global/ldap/","title":"Configuration des serveurs LDAP","text":"

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.

$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
"},{"location":"conf/global/ldap/LSprofile/","title":"Profils d'utilisateurs (LSprofile)","text":"

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.

"},{"location":"conf/global/ldap/LSprofile/#profils-dutilisateurs-par-defaut","title":"Profils d'utilisateurs par d\u00e9faut","text":"

Il existe des profils d'utilisateurs par d\u00e9faut, non li\u00e9e \u00e0 la configuration de l'application:

"},{"location":"conf/global/ldap/LSprofile/#profils-dutilisateurs-personalises","title":"Profils d'utilisateurs personalis\u00e9s","text":"

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.

'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

Le param\u00e8tre LSprofiles 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.

Dans chaque configuration de LSprofile, il est possible d'identifier l'appartenance ou non de l'utilisateur connect\u00e9 de deux mani\u00e8res\u00a0:

Par ailleurs, il est possible d'attribuer un label plus explicite \u00e0 chaque LSprofile \u00e0 l'aide de la cl\u00e9 label. Ce label sera utilis\u00e9 pour faire r\u00e9f\u00e9rence au LSprofile lorsque n\u00e9c\u00e9ssaire. (Param\u00e8tre facultatif)

"},{"location":"conf/global/ldap/recoverPassword/","title":"R\u00e9cup\u00e9ration de mot de passe","text":"

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:

'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
"},{"location":"conf/global/ldap/subDn/","title":"Sous-niveaux de connexion","text":"

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.

Exemple d'arborescence d'annuaire utilisant le concept de sous-niveaux correspondant \u00e0 des soci\u00e9t\u00e9s :

|- 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

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.

Il existe deux mani\u00e8res de d\u00e9clarer des sous-niveaux de connexion \u00e0 l'annuaire\u00a0:

Pour chacune de ces m\u00e9thodes on d\u00e9finira \u00e9galement les types d'LSobjets qui sont pr\u00e9sents dans cette branche de l'annuaire.

'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
"},{"location":"contrib/","title":"Contribution","text":"

Comme tout projet libre qui se respecte, les contributions \u00e0 LdapSaisie sont les bienvenues. Ce chapitre explique les possibilit\u00e9s de contribution.

"},{"location":"contrib/form-elements/","title":"Les \u00e9l\u00e9ments des formulaires (LSformElement)","text":"

Les LSformElements sont les types de champs de formulaire support\u00e9s par l'application.

Pour chaque type impl\u00e9ment\u00e9, on devra trouver :

Note

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 pre qui s'inspire du type textarea, ou encore du type url d\u00e9riv\u00e9 du type text.

"},{"location":"contrib/form-rules/","title":"Les r\u00e8gles de validation syntaxiques (LSformRule)","text":"

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 check_data des attributs des LSobjects.

Pour chaque type impl\u00e9ment\u00e9, on trouvera une classe PHP d\u00e9riv\u00e9e de la classe LSformRule et devant s'appeler LSattr_rule_[nom du type]. Dans celle-ci, il devra \u00eatre d\u00e9fini la m\u00e9thode statique validate() qui impl\u00e9mentera le contr\u00f4le syntaxique. Cette m\u00e9thode prendra en param\u00e8tres :

Cette m\u00e9thode devra retourner True ou False si la valeur test\u00e9e est respectivement valide ou invalide. Elle pourra \u00e9galement d\u00e9clencher une exception LSformRuleException 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.

Note

Par d\u00e9faut, les valeurs de l'attribut sont test\u00e9es une \u00e0 une via la m\u00e9thode validate(). 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 false \u00e0 la constante de classe validate_one_by_one. Dans ce cas, l'ensemble des valeurs de l'attribut seront pass\u00e9es via le param\u00e8tre $value \u00e0 la m\u00e9thode validate() (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).

"},{"location":"contrib/addons/","title":"Les addons (LSaddon)","text":"

Les LSaddons sont utilis\u00e9s pour impl\u00e9menter dans LdapSaisie des fonctionnalit\u00e9s sp\u00e9cifiques tel que :

"},{"location":"contrib/addons/#structure-decriture","title":"Structure d'\u00e9criture","text":"

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 :

Par convention, la structure de ce fichier est toujours \u00e0 peu pr\u00e8s la m\u00eame:

"},{"location":"contrib/addons/cli-commands/","title":"Les commandes CLI personnalis\u00e9es","text":"

Les LSaddons peuvent fournir des commandes CLI personnalis\u00e9es qui seront accessibles via la commande ldapsaisie 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.

Pour mettre en place une telle commande CLI personnalis\u00e9e, il est n\u00e9cessaire de :

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.

Structure du fichier includes/addons/LSaddons.[addon name].php :

<?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
"},{"location":"contrib/addons/custom-views/","title":"Les vues personnalis\u00e9es","text":"

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.

Pour mettre en place une telle vue personnalis\u00e9e, il est n\u00e9cessaire de :

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).

Structure du fichier includes/addons/LSaddons.[addon name].php :

<?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
"},{"location":"install/arbo/","title":"Arborescence du projet","text":" "},{"location":"install/download/","title":"T\u00e9l\u00e9chargement","text":""},{"location":"install/download/#a-partir-du-paquet-debian","title":"\u00c0 partir du paquet Debian","text":"

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 /etc/apt/sources.list :

deb http://ldapsaisie.org/debian stable main\n

Il ne vous restera ensuite plus qu'a installer le paquet ldapsaisie avec la commande suivante :

apt-get install ldapsaisie\n

Le fichier /etc/ldapsaisie/apache.conf est un example de configuration du serveur web Apache. La configuration du logiciel ce fera ensuite dans le dossier /etc/ldapsaisie/local/.

"},{"location":"install/download/#a-partir-de-git","title":"\u00c0 partir de Git","text":"

Le d\u00e9p\u00f4t Git peut \u00eatre r\u00e9cup\u00e9r\u00e9 anonymement en utilisant la commande suivante :

git clone https://gitlab.easter-eggs.com/ee/ldapsaisie.git\n

La racine web de l'application se trouvera alors dans le dossier /ldapsaisie/src/public_html/.

"},{"location":"install/download/#a-partir-des-snapshot","title":"\u00c0 partir des snapshot","text":"

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 :

http://ldapsaisie.org/download/ldapsaisie-snapshoot.tar.gz

"},{"location":"install/howto/","title":"Tutoriel d'installation","text":"

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.

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 lsexample.

La premi\u00e8re \u00e9tape consiste \u00e0 installer le locigiel en tant que tel. Pour cela, r\u00e9f\u00e9rez vous au chapitre T\u00e9l\u00e9chargement.

En cas d'installation \u00e0 partir du paquet Debian, la configuration du logiciel se fera dans le dossier /etc/ldapsaisie/local/. 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 /etc/ldapsaisie/local/css/.

Pour une installation \u00e0 partir du code source, il vous faut cloner le d\u00e9p\u00f4t Git du projet dans le dossier /var/www/ldapsaisie. Pour cela il vous faut avoir install\u00e9s les outils de Git contenu, dans Debian, dans le paquet git-core. Le d\u00e9p\u00f4t Git doit ensuite \u00eatre r\u00e9cup\u00e9r\u00e9 anonymement en utilisant la commande suivante :

git clone https://gitlab.easter-eggs.com/ee/ldapsaisie.git /var/www/ldapsaisie\n

Note

Pour que cette commande se d\u00e9roule correctement, vous devez avoir acc\u00e8s au port TCP 443 du serveur gitlab.easter-eggs.com. En cas de probl\u00e8me v\u00e9rifiez votre parefeu.

La suite des op\u00e9rations se d\u00e9roulera donc maintenant dans le dossier /var/www/ldapsaisie. 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 :

Le principe de l'adaptation est ici de mettre vos fichiers personnalis\u00e9s dans le dossier config.local, de les d\u00e9clarer dans votre fichier config.local/local.sh contenant la liste des fichiers devant \u00eatre install\u00e9s. Le fichier local.sh est la source de configuration du script upgradeFromGit.sh. Il faut donc dans un premier temps cr\u00e9er votre fichier local.sh en copiant le fichier d'example local.sh.example. Ce fichier est un script bash d\u00e9clarant les variables de configurations suivantes :

La deuxi\u00e8me \u00e9tape concerne la configuration globale de l'application : Cette partie est principalement contenue dans le fichier src/conf/config.inc.php (ou /etc/ldapsaisie/local/conf/config.inc.php 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 config.local et le d\u00e9clarer dans la liste des fichiers \u00e0 d\u00e9ployer lors des mises \u00e0 jour (variable LOCAL_FILES dans le fichier local.sh). 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.

Note

Notez qu'il est possible de passer l'application en mode debug ce qui peut \u00eatre utile par la suite.

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.

  1. 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 LSldapObject 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.

    Les fichiers des classes sont contenus dans le dossier /includes/class/ et portent les noms compos\u00e9s de la mani\u00e8re suivante :

    class.LSobjects.[nom du type d'LSobject].php\n
  2. 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 LSpeople 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.

  3. 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.

    Note

    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 LSgroup.

Important

En cas d'installation \u00e0 partir du code source, pensez \u00e0 d\u00e9clarer les fichiers que vous venez de cr\u00e9er dans la variable LOCAL_FILES du fichier local.sh. Exemple pour le type d'LSobjet portant comme nom LSexample :

src/conf/LSobjects/config.LSobjects.LSexample.php\nsrc/includes/class/class.LSobjects.LSexample.php\n

Note

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...

En cas d'installation \u00e0 partir du code source, une derni\u00e8re \u00e9tape \u00e0 ce niveau consiste \u00e0 lancer le script upgradeFromGit.sh 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.

"},{"location":"install/requirements/","title":"Pr\u00e9-requis","text":"

Warning

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.

Note

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 doc/requirements.txt et sont installables \u00e0 l'aide de la commande pip install -r doc/requirements.txt.

"},{"location":"upgrade/","title":"Mise \u00e0 jour","text":"

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.

"},{"location":"upgrade/2_4_1-to-3_0_0/","title":"Mise \u00e0 jour 2.4.1 -> 3.0.0","text":"

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.

"},{"location":"upgrade/2_4_1-to-3_0_0/#fichier-configincphp","title":"Fichier config.inc.php","text":" "},{"location":"upgrade/2_4_1-to-3_0_0/#fichiers-css","title":"Fichiers CSS","text":"

Note

Les fichiers light-*.css ont \u00e9t\u00e9 retravaill\u00e9s pour tous h\u00e9riter du fichier light-blue.css 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 light-*.css.

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 light-blue.css 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.

"},{"location":"upgrade/2_4_1-to-3_0_0/#fichiers-php","title":"Fichiers PHP","text":" "},{"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":"

Pour identifier les fichiers concern\u00e9s, vous pouvez utiliser la commande suivante :

grep -Er '(accueil|blank|empty|top|bottom)\\.tpl' /etc/ldapsaisie/local/\n
"},{"location":"upgrade/2_4_1-to-3_0_0/#fichiers-templates-fournis-par-defaut","title":"Fichiers templates fournis par d\u00e9faut :","text":"

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 :

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

Note

Une attention particuli\u00e8re doit \u00eatre port\u00e9 aux fichiers login.tpl et recoverpassword.tpl qui ont particuli\u00e8rement chang\u00e9s.

"},{"location":"upgrade/2_4_1-to-3_0_0/#corriger-les-url-des-images","title":"Corriger les URL des images :","text":"

../../images/default/find.png devient ../image/find

Pour identifier les fichiers concern\u00e9s, vous pouvez utiliser les commandes suivantes :

grep -Er 'images' /etc/ldapsaisie/local/templates\ngrep -Er '\\.(png|gif|jpg)' /etc/ldapsaisie/local/templates\n
"},{"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 {$LSsession_css} et {$LSsession_js} :","text":"

Note

Ceci est d\u00e9j\u00e0 g\u00e9r\u00e9 si vous \u00e9tendez bien vos templates du fichier base.tpl (pour les pages non-connect\u00e9es) ou base_connected.tpl (pour les pages connect\u00e9es).

"},{"location":"upgrade/2_4_1-to-3_0_0/#tous-les-fichiers-modification-des-urls","title":"Tous les fichiers : Modification des URLs","text":"

Pour identifier les fichiers concern\u00e9s, vous pouvez utiliser la commande suivante :

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
"},{"location":"upgrade/method/","title":"Proc\u00e9dure de mise \u00e0 jour","text":""},{"location":"upgrade/method/#installation-via-paquet-debian","title":"Installation via paquet Debian","text":"

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 ldapsaisie :

apt update\napt install ldapsaisie\n

Une fois l\u2019application mise \u00e0 jour, pr\u00eat\u00e9 attention aux nouveaut\u00e9s et point de vigilances d\u00e9crite dans la section suivante.

"},{"location":"upgrade/method/#installation-a-partir-des-sources","title":"Installation \u00e0 partir des sources","text":"

Lors d\u2019une installation par \u00e0 partir des sources, le script upgradeFromGit.sh permet d\u2019automatiser la mise \u00e0 jour, \u00e0 condition que vous ayez suivi la proc\u00e9dure d\u2019installation \u00e0 ce sujet.

Ce script s\u2019occupera alors de :

Une fois l\u2019application mise \u00e0 jour, pr\u00eat\u00e9 attention aux nouveaut\u00e9s et point de vigilances d\u00e9crite dans la section suivante.

"}]}