diff --git a/config.json b/config.json index 9e1277e3108d1ed885e5c591fe9f1841514e8be4..27f950c8976c887efdafe22c4897bfdd9842a5c3 100644 --- a/config.json +++ b/config.json @@ -14,7 +14,7 @@ }, "ldap_data_tol": { "searchBase": "ou=eleves,dc=frankiz,dc=net", - "searchFilter": "(&(&(&(|(givenName=*${app_fn})(|(givenName=*${app_fn}*)(givenName=${app_fn}*)))(|(sn=*${app_ln})(|(sn=*${app_ln}*)(sn=${app_ln}*))))(brPromo=${app_yr}))(brMemberOf=*${app_na}))", + "searchFilterAttributes": ["givenName", "sn", "brPromo","telephoneNumber","mail","brRoom","brIP","brMemberOf","brMemberOf","brMemberOf","brMemberOf","brMemberOf","brMemberOf"], "searchAttributes": ["jpegPhoto","givenName", "sn", "brBirthdate", "brPromo","telephoneNumber","mail","brRoom","brIP"] }, "sessionSecret":"change this" diff --git a/doc/db_knex_router.js.html b/doc/db_knex_router.js.html index 6b9955abfc463d4541bd9e7923ef831f24d6ff66..77b0a19670a523b59b3d45f4c80c3ea135bf1507 100644 --- a/doc/db_knex_router.js.html +++ b/doc/db_knex_router.js.html @@ -45,17 +45,13 @@ module.exports = require('knex')(config);</code></pre> </div> <nav> - <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul> + <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul> </nav> <br class="clear"> <footer> -<<<<<<< HEAD - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid) -======= - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time) ->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36 + Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/doc/global.html b/doc/global.html index c50257454724b35b0045fe3b6e121c7de98e0aab..f5578b0321c3be27c2047513620d4b8ba8d5f3b6 100644 --- a/doc/global.html +++ b/doc/global.html @@ -154,7 +154,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line89">line 89</a> + <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line95">line 95</a> </li></ul></dd> @@ -238,7 +238,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line99">line 99</a> + <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line105">line 105</a> </li></ul></dd> @@ -371,7 +371,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line58">line 58</a> + <a href="src_admin_view_admin_router.js.html">src/admin_view/admin_router.js</a>, <a href="src_admin_view_admin_router.js.html#line64">line 64</a> </li></ul></dd> @@ -409,11 +409,15 @@ - <p class="summary"><p>Fonction qui retrouve les groupes du LDAP dont un individu est membre (pas de bind nécessaire)</p></p> + <p class="summary"><p>Fonction qui interroge le LDAP et retrouve les groupes dont un individu est membre.</p></p> +<div class="description"> + <p>Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listGroups(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).</p> +</div> + @@ -504,7 +508,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line17">line 17</a> + <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line30">line 30</a> </li></ul></dd> @@ -531,7 +535,7 @@ <div class="param-desc"> - <p>Liste des uid de groupes (noms flat des groupes) où l'id fourni</p> + <p>Liste des uid de groupes (noms flat des groupes) où l'id fourni est membre</p> </div> @@ -560,17 +564,17 @@ - <h4 class="name" id="listMembers"><span class="type-signature"></span>listMembers<span class="signature">(uid)</span><span class="type-signature"> → {string}</span></h4> + <h4 class="name" id="listMembers"><span class="type-signature"></span>listMembers<span class="signature">(gid)</span><span class="type-signature"> → {string}</span></h4> - <p class="summary"><p>Fonction qui retrouve la liste des membres d'un binet sur le LDAP</p></p> + <p class="summary"><p>Fonction qui interroge le LDAP et retrouve la liste des membres d'un groupe.</p></p> <div class="description"> - <p>TBM</p> + <p>Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listMembers(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).</p> </div> @@ -606,7 +610,7 @@ <tr> - <td class="name"><code>uid</code></td> + <td class="name"><code>gid</code></td> <td class="type"> @@ -622,7 +626,7 @@ - <td class="description last"><p>Identifiant du groupe à interrogeant (pour des raisons d'identification)</p></td> + <td class="description last"><p>Identifiant du groupe à interroger</p></td> </tr> @@ -663,7 +667,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line38">line 38</a> + <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line51">line 51</a> </li></ul></dd> @@ -690,7 +694,7 @@ <div class="param-desc"> - <p>Liste des uid de groupes où l'id fournie est membre (noms flat des groupes)</p> + <p>Liste des uid des membres où l'id fournie est membre (noms flat des groupes)</p> </div> @@ -714,6 +718,441 @@ + + + + + + <h4 class="name" id="TOL"><span class="type-signature"></span>TOL<span class="signature">(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)</span><span class="type-signature"> → {Array.<string>}</span></h4> + + + + <p class="summary"><p>Fonction qui interroge le LDAP et retrouve les paxs validant les critères de recherche.</p></p> + + + + +<div class="description"> + <p>Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete. Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma TOL(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma généré à la volée à partir de config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end).</p> +</div> + + + + + + + + + + <h5>Parameters:</h5> + + +<table class="params"> + <thead> + <tr> + + <th>Name</th> + + + <th>Type</th> + + + + + + <th class="last">Description</th> + </tr> + </thead> + + <tbody> + + + <tr> + + <td class="name"><code>c0</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Prénom</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c1</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Nom</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c2</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Surnom</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c3</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Nationalité</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c4</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Ecole ou université d'origine</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c5</code></td> + + + <td class="type"> + + +<span class="param-type">int</span> + + + + </td> + + + + + + <td class="description last"><p>Promotion</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c6</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Groupe</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c7</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Cours</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c8</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Sport pratiqué</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c9</code></td> + + + <td class="type"> + + +<span class="param-type">int</span> + + + + </td> + + + + + + <td class="description last"><p>Numéro de téléphone</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c10</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Adresse courriel</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c11</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Adresse physique</p></td> + </tr> + + + + <tr> + + <td class="name"><code>c12</code></td> + + + <td class="type"> + + +<span class="param-type">string</span> + + + + </td> + + + + + + <td class="description last"><p>Adresse ip</p></td> + </tr> + + + </tbody> +</table> + + + + + + +<dl class="details"> + + + + + + + + + + + + + + + + + + + + + + + + + + + <dt class="tag-source">Source:</dt> + <dd class="tag-source"><ul class="dummy"><li> + <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line84">line 84</a> + </li></ul></dd> + + + + + + + +</dl> + + + + + + + + + + + + + +<h5>Returns:</h5> + + +<div class="param-desc"> + <p>Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo en byttestring et date de naissance.</p> +</div> + + + +<dl> + <dt> + Type + </dt> + <dd> + +<span class="param-type">Array.<string></span> + + + </dd> +</dl> + + + + + + + + @@ -729,17 +1168,13 @@ </div> <nav> - <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul> + <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul> </nav> <br class="clear"> <footer> -<<<<<<< HEAD - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid) -======= - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time) ->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36 + Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/doc/index.html b/doc/index.html index 60b4594156aa513e4d4661d48aab0917194506a6..04bfcdb11193051b2a612e887d90d4c0aabce777 100644 --- a/doc/index.html +++ b/doc/index.html @@ -44,7 +44,7 @@ <section> <article><p><a href="https://gitlab.binets.fr/br/sigma-backend/commits/master"><img src="https://gitlab.binets.fr/br/sigma-backend/badges/master/pipeline.svg" alt="pipeline status"></a></p> -<h1>Backend Sigma</h1><p>Ce dépôt contient le <em>backend</em> de Sigma, le successeur de Frankiz.</p> +<h2>Introduction</h2><p>Ce dépôt contient le <em>backend</em> de Sigma, le successeur de Frankiz, un site étudiant permettant de gérer les groupes et les étudiants du plateau de Saclay.</p> <p>Pour obtenir une copie de ce dépôt, clonez-le avec</p> <pre class="prettyprint source"><code>git clone git@gitlab.binets.fr:br/sigma-backend.git</code></pre><p>ou <code>git clone https://gitlab.binets.fr/br/sigma-backend.git</code>, puis installez les dépendences JavaScript avec <code>npm install</code>.</p> <p>A terme, ce projet doit tourné sur un serveur de l'école polytechnique et fournir à un serveur front - au code séparé et documenté séparément - toute les données nécessaires à son bon fonctionnement (authentification, appartenance à un groupe, droits de visibilité...).</p> @@ -59,35 +59,35 @@ <pre class="prettyprint source lang-bash"><code>npm install -g knex npm install -g webpack npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont knex.js, notre outil de gestion de BDD locale, GraphQL qui sert à communiquer entre serveurs, ldap.js qui interroge le LDAP avec la plupart des données, webpack qui sert à la gestion du serveur. ESlint est un outil de vérification synthaxique.</p> -<p>Le serveur utilisé est <a href="https://expressjs.com/">express.js</a> ; il est configuré dans <a href="./src/server.js"><code>server.js</code></a> puis lancé sur le port 8888 dans <a href="./src/index.js"><code>index.js</code></a>.</p> +<p>Le serveur utilisé est <a href="https://expressjs.com/">express.js</a> ; il est configuré dans <a href="../src/server.js"><code>server.js</code></a> puis lancé sur le port 8888 dans <a href="../src/index.js"><code>index.js</code></a>.</p> <h2>Structure</h2><p>La structure générale du projet est détaillée ci-dessous ; pas d'inquiétude, la plupart des fichiers .js sont aussi extensivement documentés plus bas.</p> <ul> <li>Racine du projet : fichiers de configuration ;<ul> <li>config.json : données "sensibles" spécifique au projet à priori non partageable (adresse du LDAP, mots de passe),</li> <li>configfile_doc.json : JSDoc, l'outil de génération automatique de documentation,</li> <li>autres fichiers relatifs à des modules particuliers ou à la gestion de paquets,</li> -<li><a href="./assets"><code>assets</code></a> : ressources ;<ul> +<li><a href="../assets"><code>assets</code></a> : ressources ;<ul> <li>images et divers (dont l'essentiel flavicon)</li> </ul> </li> -<li><a href="./build"><code>build</code></a> : dépendances gérées automatiquement ;<ul> +<li><a href="../build"><code>build</code></a> : dépendances gérées automatiquement ;<ul> <li>bundle.js est un monstrueux fichier généré automatiquement qui gère nos dépendances.</li> </ul> </li> -<li><a href="./db"><code>db</code></a> : base de donnée sigma ;<ul> +<li><a href="../db"><code>db</code></a> : base de donnée sigma ;<ul> <li>knex_router.js charge la configuration précisée dans knexfile.js,</li> -<li><a href="./db/migrations"><code>migrations</code></a> stocke l'ensemble des migrations knex ; c'est un équivalent d'un répertoire git pour la BDD sigma (du coup seulement les groupes pas les individus),</li> -<li><a href="./db/seeds"><code>seeds</code></a> : stocke les éléments de générations des BDD ; c'est un ensemble de scripts.</li> +<li><a href="../db/migrations"><code>migrations</code></a> stocke l'ensemble des migrations knex ; c'est un équivalent d'un répertoire git pour la BDD sigma (du coup seulement les groupes pas les individus),</li> +<li><a href="../db/seeds"><code>seeds</code></a> : stocke les éléments de générations des BDD ; c'est un ensemble de scripts.</li> </ul> </li> -<li><a href="./doc"><code>doc</code></a> : documentation ;<ul> +<li><a href="."><code>doc</code></a> : documentation ;<ul> <li>ensemble de pages html et fichiers associés ; index.html permet de naviguer sereinement sur toute la doc JSDoc.</li> </ul> </li> -<li><a href="./node_modules"><code>node_modules</code></a> : gestion automatique des modules.</li> -<li><a href="./src"><code>src</code></a> : code source<ul> -<li><a href="./src/admin_view"><code>admin_view</code></a> : gestion d'une interface administrateur de la base de donnée, s'appuie sur <em>css</em> et <em>views</em></li> -<li><a href="./src/ldap"><code>ldap</code></a> : gestion des requêtes LDAP</li> +<li><a href="../node_modules"><code>node_modules</code></a> : gestion automatique des modules.</li> +<li><a href="../src"><code>src</code></a> : code source<ul> +<li><a href="../src/admin_view"><code>admin_view</code></a> : gestion d'une interface administrateur de la base de donnée, s'appuie sur <em>css</em> et <em>views</em></li> +<li><a href="../src/ldap"><code>ldap</code></a> : gestion des requêtes LDAP</li> </ul> </li> </ul> @@ -127,11 +127,11 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont <li><code>knex seed:make filename</code> crée un <em>seed</em> <code>seeds/filename</code></li> <li><code>knex seed:run</code> insère les <em>seeds</em> dans la BDD</li> </ul> -<p>Un fichier <em>seed</em> permet d'insérer des données dans la BDD. Ils sont stockés dans <a href="./db/seeds"><code>seeds</code></a>.</p> +<p>Un fichier <em>seed</em> permet d'insérer des données dans la BDD. Ils sont stockés dans <a href="../db/seeds"><code>seeds</code></a>.</p> <h3>Fonctions LDAP</h3><p>On peut facilement explorer et modifier des éléments du LDAP de l'école depuis le réseau de l'X avec <a href="http://jxplorer.org/">JXplorer</a> en entrant <code>frankiz</code> dans nouvelle connexion et en allant dans <code>net</code>.</p> -<h2>Scripts</h2><p>Les scripts sont des instructions en ligne de commande que l'on peut faire tourner avec la commande <code>npm run</code>. Ce sont des raccourcis pour gagner du temps sur des opérations un peu longues. Ils sont définis dans <a href="./package.json"><code>package.json</code></a>.</p> +<h2>Scripts</h2><p>Les scripts sont des instructions en ligne de commande que l'on peut faire tourner avec la commande <code>npm run</code>. Ce sont des raccourcis pour gagner du temps sur des opérations un peu longues. Ils sont définis dans <a href="../package.json"><code>package.json</code></a>.</p> <p>Les plus importants sont détaillées ci-dessous (ne pas oublier <code>npm install</code> déjà mentionné plus tôt) :</p> -<p>On utilisera Webpack pour transpiler le fichier source <a href="./src/index.js"><code>src/index.js</code></a> en <a href="./build/bundle.js"><code>build/bundle.js</code></a> qui est suit la syntaxe ES5 compatible Node. Pour ça, on utilise :</p> +<p>On utilisera Webpack pour transpiler le fichier source <a href="../src/index.js"><code>src/index.js</code></a> en <a href="../build/bundle.js"><code>build/bundle.js</code></a> qui est suit la syntaxe ES5 compatible Node. Pour ça, on utilise :</p> <ul> <li><code>npm run build</code> qui exécute la commande <code>webpack</code> avec le fichier de configuration <code>webpack.config.js</code>, ou</li> <li><code>npm run watch</code> qui recompile automatiquement dès que le code est modifié.</li> @@ -143,13 +143,12 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont </ul> <p>Donc, lancer <code>npm run watch</code> dans un terminal et <code>npm test</code> dans un autre permet de recompiler le serveur <strong>et</strong> le redémarrer automatiquement dès qu'il y a une modification.</p> <p>Le script pour faire tourner <a href="http://usejsdoc.org/index.html">JSDoc</a> et régénérrer la documentation est : <code>npm run doc</code> </p> -<h2>Documentation</h2><p>La documentation détaillée du projet est <a href="./doc/index.html">ici</a>. Elle a été compilée avec <a href="http://usejsdoc.org/index.html">JSDoc</a> sous format hmtl selon le fichier de configuration <a href="./configfile_doc.json"><code>configfile_doc.json</code></a> à la racine du projet.</p> -<p>Les fichiers compilés se situent dans <a href="./doc"><code>doc</code></a> avec leurs fichiers image. Par nature de l'outil JSDoc il est facile de documenter en détail des fonctions .js mais plus compliqué de documenter un fichier.</p> +<h2>Documentation</h2><p>La documentation détaillée du projet est <a href="./doc/index.html">ici</a>. Elle a été compilée avec <a href="http://usejsdoc.org/index.html">JSDoc</a> sous format hmtl selon le fichier de configuration <a href="../configfile_doc.json"><code>configfile_doc.json</code></a> à la racine du projet.</p> +<p>Les fichiers compilés se situent dans <a href="."><code>doc</code></a> avec leurs fichiers image. Par nature de l'outil JSDoc il est facile de documenter en détail des fonctions .js mais plus compliqué de documenter un fichier.</p> +<p>A la fin de ce fichier JSDoc rajjoute les commentaires placés dans chacun des fichiers et des hyperliens pour y accéder.</p> <h2>Appendixes</h2><h3>ESLint</h3><p>On utilisera ESLint pour standardiser le code : un ensemble de règles de style pour le code sont appliquées, et quelques-unes d'entre elles sont dans le fichier <code>.eslintrc.json</code>. Pour l'instant, la config ESLint impose d'utiliser quatre espaces pour les indentations et d'utiliser des points-virgule en fin de ligne.</p> -<p>Il est préférable de l'installer <strong>globalement</strong> avec</p> -<p> npm install -g eslint</p> -<p>Pour faire valider les fichiers source par ESLint, utilisez</p> -<pre class="prettyprint source"><code>npm run lint</code></pre><p>qui fait appel au script <code>eslint src/</code> défini dans le <a href="./package.json"><code>package.json</code></a>. L'option <code>--fix</code> permet de corriger les fichiers.</p> +<p>Il est préférable de l'installer <strong>globalement</strong> avec <code>npm install -g eslint</code>. Pour faire valider les fichiers source par ESLint, utilisez <code>npm run lint</code>.</p> +<p>qui fait appel au script <code>eslint src/</code> défini dans le <a href="../package.json"><code>package.json</code></a>. L'option <code>--fix</code> permet de corriger les fichiers.</p> <p>Sinon, si vous utilisez Atom ou Visual Studio Code pour éditer votre code, il existe des plugins qui font tourner ESLint en <em>live</em> sur le code et vérifient que tout est en ordre.</p> <p>Pour mieux comprendre ESLint, référez-vous à la <a href="https://eslint.org/docs/user-guide/getting-started">doc</a>.</p></article> </section> @@ -368,8 +367,6 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont <div class="container-overview"> - <div class="description"><p>Interface "administrateur" de l'acces aux BDD. S'appuie sur css et views.</p></div> - @@ -554,7 +551,7 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont <div class="container-overview"> - <div class="description"><p>ldap_auth</p></div> + <div class="description"><p>Ce fichier gère les authentifications avec le LDAP précisé dans config.json à l'aide de passport-ldapauth.</p></div> @@ -582,106 +579,12 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont <dt class="tag-author">Author:</dt> <dd class="tag-author"> <ul> - <li>Wangounet</li> + <li>Wang</li> </ul> </dd> - - - - - - - <dt class="tag-source">Source:</dt> - <dd class="tag-source"><ul class="dummy"><li> -<<<<<<< HEAD - <a href="src_ldap_ldap_auth.js.html">src/ldap/ldap_auth.js</a>, <a href="src_ldap_ldap_auth.js.html#line11">line 11</a> - </li></ul></dd> - - - - - - - -</dl> - - - - - </div> - - - - - - - - - - - - - - - - - - - - -</article> - -</section> - - - - - - - -<section> - -<header> - - <h2>src/ldap/ldap_auth.js</h2> - - -</header> - -<article> - <div class="container-overview"> - - - <div class="description"><p>ldap_auth</p></div> - - - - - -<dl class="details"> - - - - - - - - - - - - - - - - - - - - @@ -691,9 +594,6 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> <a href="src_ldap_ldap_auth.js.html">src/ldap/ldap_auth.js</a>, <a href="src_ldap_ldap_auth.js.html#line1">line 1</a> -======= - <a href="src_ldap_auth_ldap_auth.js.html">src/ldap_auth/ldap_auth.js</a>, <a href="src_ldap_auth_ldap_auth.js.html#line1">line 1</a> ->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36 </li></ul></dd> @@ -751,7 +651,7 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont <div class="container-overview"> - <div class="description"><p>Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu, liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification.</p></div> + <div class="description"><p>Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu="", liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification.</p></div> @@ -886,7 +786,7 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <a href="src_server.js.html">src/server.js</a>, <a href="src_server.js.html#line11">line 11</a> + <a href="src_server.js.html">src/server.js</a>, <a href="src_server.js.html#line1">line 1</a> </li></ul></dd> @@ -931,17 +831,13 @@ npm install -g eslint</code></pre><p>Les dépendances les plus importantes sont </div> <nav> - <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul> + <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul> </nav> <br class="clear"> <footer> -<<<<<<< HEAD - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid) -======= - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time) ->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36 + Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/doc/knexfile.js.html b/doc/knexfile.js.html index 3eff8aab5c3ca514cec6e78032086a6e019aaaa4..cf39b23a7abd36b8c8f646a25e12d169a1bf256b 100644 --- a/doc/knexfile.js.html +++ b/doc/knexfile.js.html @@ -66,17 +66,13 @@ module.exports = { </div> <nav> - <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul> + <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul> </nav> <br class="clear"> <footer> -<<<<<<< HEAD - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid) -======= - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time) ->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36 + Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/doc/src_admin_view_admin_router.js.html b/doc/src_admin_view_admin_router.js.html index e7e3c34e28a13139b3a282a8ed4f4c9243ce7859..eca8b450a1341f19524253ed11b160e7d7286173 100644 --- a/doc/src_admin_view_admin_router.js.html +++ b/doc/src_admin_view_admin_router.js.html @@ -27,12 +27,12 @@ <section> <article> <pre class="prettyprint source linenums"><code>/** - * @file Interface "administrateur" de l'acces aux BDD. S'appuie sur css et views. + * @file */ - import express from 'express'; import knex from '../../db/knex_router'; import passport from 'passport'; +import { ensureLoggedIn } from 'connect-ensure-login'; const router = express.Router(); @@ -40,25 +40,30 @@ let port = process.env.PORT || 3000; router.get('/', function (req, res) { console.log('Connecting to ' + req.url); - res.render('login', { title: 'Login', port: port }); + req.flash('failureFlash', 'Invalid username or password.'); + res.render('login', { title: 'Login', port: port, + errorMessage: req.flash('error') }); }); -router.get('/admin', function (req, res) { - console.log('Connecting to ' + req.url); - res.render('home', { title: 'Home', port: port }); -}); +router.get('/admin', + ensureLoggedIn('/'), + function (req, res) { + console.log('Connecting to ' + req.url); + res.render('home', { title: 'Home', port: port }); + }); -router.post('/loginAttempt' - , passport.authenticate('ldapauth', { - //successRedirect: '/admin', +router.post('/login', + passport.authenticate('ldapauth', { + successRedirect: '/admin', failureRedirect: '/', - //failureFlash: true - //failureFlas: 'Invalid username or password.' //TODO: test this. ce message s'affiche-t-il tout seul ou faut-il aller le chercher quand on genere login.pug? - }) - // on a commente les deux lignes dessus et on a besoin de faire un callback apres le passport.authenticate car + failureFlash: true + }), + // on a besoin de faire un callback apres le passport.authenticate car // on souhaite garde l'information user.dn et body.password qq part. // TODO: essayer de garder ces informations plus proprement... - , function (req, res) { + // EDIT: en fait apparemment on a pas besoin de ces informations du tout + /* + function (req, res) { req.session.dn = req.user.dn; req.session.password = req.body.password; @@ -68,10 +73,11 @@ router.post('/loginAttempt' res.redirect("/admin"); } } + */ ); -router.get('/logout', function (req, res) { +router.post('/logout', function (req, res) { req.logout(); res.redirect('/'); }); @@ -150,17 +156,13 @@ export default router; </div> <nav> - <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul> + <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul> </nav> <br class="clear"> <footer> -<<<<<<< HEAD - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid) -======= - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time) ->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36 + Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/doc/src_index.js.html b/doc/src_index.js.html index adac30a53b537bfa9a0a955b2b27a9fd1b3d02d1..5678fe8cfd7d98bde0bd22b2fc4aa43fad66cf0e 100644 --- a/doc/src_index.js.html +++ b/doc/src_index.js.html @@ -29,14 +29,9 @@ <pre class="prettyprint source linenums"><code>/** * @file Entry point de webpack */ - import server from './server'; import colors from 'colors'; - -import { graphqlExpress, graphiqlExpress } from 'graphql-server-express'; -import makeExecutableSchema from 'graphql-tools'; - -import setupLdapAuth from './ldap_auth/ldap_auth'; +import setupLdapAuth from './ldap/ldap_auth.js'; import router from './admin_view/admin_router'; // setting up ldap authentication @@ -60,17 +55,13 @@ server.listen(port, () => { </div> <nav> - <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul> + <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul> </nav> <br class="clear"> <footer> -<<<<<<< HEAD - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid) -======= - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time) ->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36 + Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/doc/src_ldap_ldap_auth.js.html b/doc/src_ldap_ldap_auth.js.html index de89ecac68e0945e82b2fa63a9e9171916dda2ce..4feb25815829ca6c8898bf76a78f3059cef28989 100644 --- a/doc/src_ldap_ldap_auth.js.html +++ b/doc/src_ldap_ldap_auth.js.html @@ -27,31 +27,28 @@ <section> <article> <pre class="prettyprint source linenums"><code>/** - * @file ldap_auth - * @summary Setup de l'auth ldap avec passport-ldapauth + * @file Ce fichier gère les authentifications avec le LDAP précisé dans config.json à l'aide de passport-ldapauth. + * @author Wang */ - import passport from 'passport'; import LdapStrategy from 'passport-ldapauth'; import session from 'express-session'; import fs from 'fs'; -/** - * @file Ce fichier gère les authentifications avec le LDAP précisé dans config.json. - * @author Wangounet - */ +let config = JSON.parse(fs.readFileSync('config.json', 'utf8')); + +passport.use(new LdapStrategy({ + server: { + url: config.ldap.server, + searchBase: config.ldap.searchBase, + searchFilter: config.ldap.searchFilter + } +} +)); function setupLdapAuth(server) { - var config = JSON.parse(fs.readFileSync('config.json', 'utf8')); - passport.use(new LdapStrategy({ - server: { - url: config.ldap.server, - searchBase: config.ldap.searchBase, - searchFilter: config.ldap.searchFilter - } - })); - + // Define new login strategy server.use(session({ secret: config.sessionSecret, //store: a modifier avant de lancer en prod @@ -85,13 +82,13 @@ export default setupLdapAuth; </div> <nav> - <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul> + <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul> </nav> <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid) + Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/doc/src_ldap_ldap_data.js.html b/doc/src_ldap_ldap_data.js.html index 0b0265d5164e9c8edc965b1358328ac5c35353ae..943d24f7871cec923247001766e28d734bfbb0f9 100644 --- a/doc/src_ldap_ldap_data.js.html +++ b/doc/src_ldap_ldap_data.js.html @@ -27,26 +27,39 @@ <section> <article> <pre class="prettyprint source linenums"><code>/** - * @file Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu, liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification. + * @file Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu="", liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification. * @author hawkspar */ -var ensureLoggedin = require('connect-ensure-login').ensureLoggedIn; -var ldapescape = require("ldap-escape"); +/* Ne pas hésiter à repasser en synthaxe ES5... Plus simple pour tester en solo avec node directement +import ldap from 'ldapjs'; +import fs from 'fs'; +import ldapEscape from 'ldap-escape'; */ + var ldap = require('ldapjs'); +var fs = require('fs'); +var ldapEscape = require('ldap-escape'); + +// Important ; permet de vérifier que l'utilisateur reste connecté. +var ensureLoggedin = require('connect-ensure-login').ensureLoggedIn; -var client = ldap.createClient({ url: "ldap://frankiz.eleves.polytechnique.fr", timeout: 10000, idleTimeout: 10000}); +// Point central ; tous les champs de la BDD sont 'cachés' dans config.json et pas visibles directement +let config = JSON.parse(fs.readFileSync('../../config.json', 'utf8')); + +// Connection au serveur LDAP avec des temps de timeout arbitraires +var client = ldap.createClient({ url: config.ldap.server, timeout: 10000, idleTimeout: 10000}); /** - * @summary Fonction qui retrouve les groupes du LDAP dont un individu est membre (pas de bind nécessaire) + * @summary Fonction qui interroge le LDAP et retrouve les groupes dont un individu est membre. + * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listGroups(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). * @arg {int} uid - Identifiant de l'individu à interroger - * @return {string} Liste des uid de groupes (noms flat des groupes) où l'id fourni + * @return {string} Liste des uid de groupes (noms flat des groupes) où l'id fourni est membre */ function listGroups(uid) { return new Promise(function(resolve, reject) { var groupsList=[]; - client.search("ou=groups,dc=frankiz,dc=net", {scope: "sub", attributes: "uid", filter: ldapescape.filter("(restrictedMemberUid=${id})", {id: uid})}, function(err, res) { + client.search(config.ldap_data_gl.searchBase, {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_gl.searchFilter, {id: uid})}, function(err, res) { if (err) { reject(err); } else { @@ -58,30 +71,85 @@ function listGroups(uid) { } /** - * TBM - * @summary Fonction qui retrouve la liste des membres d'un binet sur le LDAP - * @arg {int} uid - Identifiant du groupe à interrogeant (pour des raisons d'identification) - * @return {string} Liste des uid de groupes où l'id fournie est membre (noms flat des groupes) + * @summary Fonction qui interroge le LDAP et retrouve la liste des membres d'un groupe. + * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listMembers(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). + * @arg {int} gid - Identifiant du groupe à interroger + * @return {string} Liste des uid des membres où l'id fournie est membre (noms flat des groupes) */ -function listMembers(uid) { - client.bind("uid=${uid},ou=eleves,dc=frankiz,dc=net", (err) => { console.log(err); }); - +function listMembers(gid) { return new Promise(function(resolve, reject) { - var groupsList=[]; + var membersList=[]; - client.search("ou=groups,dc=frankiz,dc=net", {scope: "sub", attributes: "uid", filter: ldapescape.filter("(restrictedMemberUid=${id})", {id: uid})}, function(err, res) { + client.search(config.ldap_data_ml.searchBase="", {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_ml.searchFilter, {id: gid})}, function(err, res) { if (err) { reject(err); } else { - res.on('searchEntry', function(entry) { groupsList.push(entry.object.uid); }); - res.on('end', function(res) { resolve(groupsList); }); + res.on('searchEntry', function(entry) { membersList.push(entry.object.uid); }); + res.on('end', function(res) { resolve(membersList); }); + } + }); + }); +} + +/** + * @summary Fonction qui interroge le LDAP et retrouve les paxs validant les critères de recherche. + * @desc Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete. Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma TOL(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma généré à la volée à partir de config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). + * @arg {string} c0 - Prénom + * @arg {string} c1 - Nom + * @arg {string} c2 - Surnom + * @arg {string} c3 - Nationalité + * @arg {string} c4 - Ecole ou université d'origine + * @arg {int} c5 - Promotion + * @arg {string} c6 - Groupe + * @arg {string} c7 - Cours + * @arg {string} c8 - Sport pratiqué + * @arg {int} c9 - Numéro de téléphone + * @arg {string} c10 - Adresse courriel + * @arg {string} c11 - Adresse physique + * @arg {string} c12 - Adresse ip + * @return {string[]} Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo en byttestring et date de naissance. + */ +function TOL(c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8="", c9="", c10="", c11="", c12="") { + return new Promise(function(resolve, reject) { + var candidatesList=[]; + + var filter=""; + var dic={}; + + config.ldap_data_tol.searchFilterAttributes.forEach((element, index, list) => { + if (eval("c"+index.toString()) != '') { + filter="(&"+filter+"(|("+element+"=*${app_"+element+index+"})"+ + "(|("+element+"=${app_"+element+index+"})"+ + "(|("+element+"=*${app_"+element+index+"}*)"+ + "("+element+"=${app_"+element+index+"}*)))))"; + dic["app_"+element+index]=eval("c"+index.toString()); + } + }); + + client.search(config.ldap_data_tol.searchBase, {scope: "sub", attributes: config.ldap_data_tol.searchAttributes, filter: ldapEscape.filter(filter, dic)}, function(err, res) { + if (err) { + reject(err); + } else { + res.on('searchEntry', function(entry) { + for (var i=0; i<config.ldap_data_tol.searchAttributes.length; i++) { + // Complicated, but hides searchAttributes + eval("candidatesList.push(entry.object."+config.ldap_data_tol.searchAttributes[i]+")"); + } + }); + res.on('end', function(res) { resolve(candidatesList); }); } }); }); } // Synthaxe d'utilisation -listGroups("quentin.chevalier","Ie42fds'eaJm1").then((grList) => { console.log(grList); });</code></pre> +//listGroups("quentin.louis").then((meList) => { console.log(meList); }); +TOL("","","","","","","faerix","","","","","","").then((meList) => { console.log(meList); }); + +/* Partage pour le reste du monde ; même remarque synthaxe +export { listGroups, listMembers, TOL }; */ + +module.exports ={ listGroups, listMembers, TOL };</code></pre> </article> </section> @@ -91,13 +159,13 @@ listGroups("quentin.chevalier","Ie42fds'eaJm1").then((grList) => { console.log(g </div> <nav> - <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul> + <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul> </nav> <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid) + Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/doc/src_server.js.html b/doc/src_server.js.html index d55747f36337aac154ca31d3fbc49a3f11e9e111..e4aac1742a2d0300fcc6081c9c727dda328c4138 100644 --- a/doc/src_server.js.html +++ b/doc/src_server.js.html @@ -26,19 +26,17 @@ <section> <article> - <pre class="prettyprint source linenums"><code>import express from 'express'; + <pre class="prettyprint source linenums"><code>/** + * @file Cree le serveur express avec tous les middleware qui vont bien +*/ +import express from 'express'; import bodyParser from 'body-parser'; import favicon from 'serve-favicon'; import morgan from 'morgan'; -import knex from '../db/knex_router'; import path from 'path'; -import ldap_auth from './ldap_auth/ldap_auth'; +import schema from './graphql/schema'; import { graphqlExpress, graphiqlExpress } from 'graphql-server-express'; -import { makeExecutableSchema } from 'graphql-tools'; - -/** - * @file Cree le serveur express avec tous les middleware qui vont bien -*/ +import flash from 'connect-flash'; const server = express(); @@ -60,41 +58,14 @@ server.use(favicon(path.resolve('./','assets','favicon.ico'))); // Morgan is middleware for logging requests server.use(morgan('dev')); -// setting up ldap authentication -ldap_auth(server); - -const typeDefs = ` - type Query { - groups: [Group] - } - - type Group { - name: String! - id: ID! - website: String - updatedAt: String! - description: String - school: String! - } -`; - -const resolvers = { - Query: { - groups: () => knex.select().from('groups') - } -}; - -const schema = makeExecutableSchema({ - typeDefs, - resolvers -}); - // Charge le middleware express pour GraphQL server.use('/graphql', bodyParser.json(), graphqlExpress({schema})); // GraphiQL est une console interactive pour faire des requêtes au schéma GraphQL server.use('/graphiql', graphiqlExpress({ endpointURL: '/graphql'})); +// connect-flash is middleware for flashing messages +server.use(flash()); export default server; </code></pre> @@ -107,17 +78,13 @@ export default server; </div> <nav> - <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li></ul> + <h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#Error404catcher">Error 404 catcher</a></li><li><a href="global.html#Error404handler">Error 404 handler</a></li><li><a href="global.html#KnexAPI:Gettable">Knex API: Get table</a></li><li><a href="global.html#listGroups">listGroups</a></li><li><a href="global.html#listMembers">listMembers</a></li><li><a href="global.html#TOL">TOL</a></li></ul> </nav> <br class="clear"> <footer> -<<<<<<< HEAD - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 11:39:38 GMT+0100 (Paris, Madrid) -======= - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:56:16 GMT+0100 (Romance Standard Time) ->>>>>>> 21e0f3870a71cc6be0c944541976c3a24302cd36 + Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 18:30:49 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/src/ldap/ldap_data.js b/src/ldap/ldap_data.js index 9d7b3f3a76b2c2b195fed3c560daafa16a1ae9b7..9a93f2dc203c022304c49b32f0e9bfcb13497c51 100644 --- a/src/ldap/ldap_data.js +++ b/src/ldap/ldap_data.js @@ -1,19 +1,29 @@ /** - * @file Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu, liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification. + * @file Ce fichier gère les requêtes LDAP de type données ; liste des groupe d'un individu="", liste des membres d'un groupe... A ne pas confondre avec ldap_auth qui lui gère l'authentification. * @author hawkspar */ -var ldap = require('ldapjs'); + +/* Ne pas hésiter à repasser en synthaxe ES5... Plus simple pour tester en solo avec node directement +import ldap from 'ldapjs'; +import fs from 'fs'; +import ldapEscape from 'ldap-escape'; */ + +var ldap = require('ldapjs'); var fs = require('fs'); var ldapEscape = require('ldap-escape'); +// Important ; permet de vérifier que l'utilisateur reste connecté. var ensureLoggedin = require('connect-ensure-login').ensureLoggedIn; +// Point central ; tous les champs de la BDD sont 'cachés' dans config.json et pas visibles directement let config = JSON.parse(fs.readFileSync('../../config.json', 'utf8')); +// Connection au serveur LDAP avec des temps de timeout arbitraires var client = ldap.createClient({ url: config.ldap.server, timeout: 10000, idleTimeout: 10000}); /** - * @summary Fonction qui retrouve les groupes du LDAP dont un individu est membre (pas de bind nécessaire). + * @summary Fonction qui interroge le LDAP et retrouve les groupes dont un individu est membre. + * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listGroups(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). * @arg {int} uid - Identifiant de l'individu à interroger * @return {string} Liste des uid de groupes (noms flat des groupes) où l'id fourni est membre */ @@ -33,7 +43,8 @@ function listGroups(uid) { } /** - * @summary Fonction qui retrouve la liste des membres d'un binet sur le LDAP. + * @summary Fonction qui interroge le LDAP et retrouve la liste des membres d'un groupe. + * @desc Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma listMembers(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma prédéfini dans config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). * @arg {int} gid - Identifiant du groupe à interroger * @return {string} Liste des uid des membres où l'id fournie est membre (noms flat des groupes) */ @@ -41,7 +52,7 @@ function listMembers(gid) { return new Promise(function(resolve, reject) { var membersList=[]; - client.search(config.ldap_data_ml.searchBase, {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_ml.searchFilter, {id: gid})}, function(err, res) { + client.search(config.ldap_data_ml.searchBase="", {scope: "sub", attributes: "uid", filter: ldapEscape.filter(config.ldap_data_ml.searchFilter, {id: gid})}, function(err, res) { if (err) { reject(err); } else { @@ -53,33 +64,41 @@ function listMembers(gid) { } /** - * @summary Fonction qui retrouve les paxs validant les critères de recherche. Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete. - * @arg {string} fn - Prénom - * @arg {string} ln - Nom - * @arg {string} nk - Surnom - * @arg {string} na - Nationalité - * @arg {string} sc - Ecole ou université d'origine - * @arg {int} yr - Promotion - * @arg {string} gr - Groupe - * @arg {string} co - Cours - * @arg {string} sp - Sport pratiqué - * @arg {int} nb - Numéro de téléphone - * @arg {string} ma - Adresse courriel - * @arg {string} ad - Adresse physique - * @arg {string} ip - Adresse ip - * @return {string[]} Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo et date de naissance ! + * @summary Fonction qui interroge le LDAP et retrouve les paxs validant les critères de recherche. + * @desc Accepte des champs incomplets mais pas approximatifs et ne gère pas l'auto-complete. Cette fonction utilise une Promise pour être asynchrone ; elle renvoit la promesse d'une réponse puis traite la demande. Il faut l'appeler suivant un schéma TOL(uid).then((res) => { truc avec res });. Aucun bind n'est nécessaire donc pas d'identifiant ou de mot de passe à passer. Cette fonction fait une demande au LDAP qu'elle filtre selon un schéma généré à la volée à partir de config.json et à chaque résultat (event SearchEntry) le met dans une liste, et renvoit la liste à l'issue (event end). + * @arg {string} c0 - Prénom + * @arg {string} c1 - Nom + * @arg {string} c2 - Surnom + * @arg {string} c3 - Nationalité + * @arg {string} c4 - Ecole ou université d'origine + * @arg {int} c5 - Promotion + * @arg {string} c6 - Groupe + * @arg {string} c7 - Cours + * @arg {string} c8 - Sport pratiqué + * @arg {int} c9 - Numéro de téléphone + * @arg {string} c10 - Adresse courriel + * @arg {string} c11 - Adresse physique + * @arg {string} c12 - Adresse ip + * @return {string[]} Informations recueillies ; plusieurs fois une liste sur le format ci-dessus pour tous les résultats correspondants plus une photo en byttestring et date de naissance. */ -function TOL(fn, ln, nk, na, sc, yr, gr, co, sp, nb, ma, ad, ip) { +function TOL(c0="", c1="", c2="", c3="", c4="", c5="", c6="", c7="", c8="", c9="", c10="", c11="", c12="") { return new Promise(function(resolve, reject) { var candidatesList=[]; - ["jpegPhoto","givenName", "sn", "brBirthdate", "brPromo","telephoneNumber","mail","brRoom","brIP"] + var filter=""; - - config.ldap_data_tol.searchAttributes.forEach(element => { filter="(&("+filter+")"; - + var dic={}; + + config.ldap_data_tol.searchFilterAttributes.forEach((element, index, list) => { + if (eval("c"+index.toString()) != '') { + filter="(&"+filter+"(|("+element+"=*${app_"+element+index+"})"+ + "(|("+element+"=${app_"+element+index+"})"+ + "(|("+element+"=*${app_"+element+index+"}*)"+ + "("+element+"=${app_"+element+index+"}*)))))"; + dic["app_"+element+index]=eval("c"+index.toString()); + } }); - - client.search(config.ldap_data_tol.searchBase, {scope: "sub", attributes: config.ldap_data_tol.searchAttributes, filter: ldapEscape.filter(config.ldap_data_tol.searchFilter, { app_fn: fn, app_ln: ln, app_nk: nk, app_na: na, app_sc: sc, app_yr: yr, app_gr: gr, app_co: co, app_sp: sp, app_nb: nb, app_ma: ma, app_ad: ad, app_ip: ip})}, function(err, res) { + + client.search(config.ldap_data_tol.searchBase, {scope: "sub", attributes: config.ldap_data_tol.searchAttributes, filter: ldapEscape.filter(filter, dic)}, function(err, res) { if (err) { reject(err); } else { @@ -97,6 +116,9 @@ function TOL(fn, ln, nk, na, sc, yr, gr, co, sp, nb, ma, ad, ip) { // Synthaxe d'utilisation //listGroups("quentin.louis").then((meList) => { console.log(meList); }); -TOL("Quentin","u","","","",2016,"","","","","","").then((meList) => { console.log(meList); }); +TOL("","","","","","","faerix","","","","","","").then((meList) => { console.log(meList); }); + +/* Partage pour le reste du monde ; même remarque synthaxe +export { listGroups, listMembers, TOL }; */ -export { listGroups, listMembers, TOL }; \ No newline at end of file +module.exports ={ listGroups, listMembers, TOL }; \ No newline at end of file