diff --git a/README.md b/README.md index d44d0c0be3f93feb14bc651f6ff752d8fdf5303c..9a91be0a03c73e35fb9ce43d84708ffe75d6887e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ [](https://gitlab.binets.fr/br/sigma-backend/commits/master) -# Backend Sigma +## Introduction -Ce dépôt contient le _backend_ de Sigma, le successeur de Frankiz. +Ce dépôt contient le _backend_ de Sigma, le successeur de Frankiz, un site étudiant permettant de gérer les groupes et les étudiants du plateau de Saclay. Pour obtenir une copie de ce dépôt, clonez-le avec @@ -10,16 +10,20 @@ Pour obtenir une copie de ce dépôt, clonez-le avec ou `git clone https://gitlab.binets.fr/br/sigma-backend.git`, puis installez les dépendences JavaScript avec `npm install`. +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é...). + +Ce document détaille les différentes dépendances du projet, sa structure générale, détaille un peu plus des éléments sur la base de données et la documentation ; le code est également commenté en détail. + ## Dépendances -Une dépendance, c'est un librairie JavaScript dont dépend le code source, soit pour le faire tourner soit pour faire tourner les outils dévs. Les dépendances dév servent à tester par exemple. On trouve la liste des dépendances dans [`package.json`](./package.json). Express est un exemple de dépendance normale, nodemon et ESLint (voir infra) sont des dépendances dev (`devDependencies`). +Une dépendance, c'est un librairie JavaScript dont dépend le code source, soit pour le faire tourner soit pour faire tourner les outils dévs. Les dépendances développeur servent à tester par exemple. On trouve la liste des dépendances dans [`package.json`](./package.json). Express est un exemple de dépendance normale, nodemon et ESLint (voir infra) sont des dépendances dev (`devDependencies`). Les dépendances s'installent avec `npm install`. Par défaut, toutes les dépendances sont installées. Si la variable `NODE_ENV` est configurée (vérifier avec la commande `echo "$NODE_ENV"`), * la valeur `development` installe tout -* la valeur `production` n'installe pas les dépendances dév +* la valeur `production` n'installe pas les dépendances développeur -Certaines d'entre elles comme KnexJS ou Webpack devraient être installées globalement : +Certaines d'entre elles comme KnexJS ou Webpack doivent être installées globalement : ```bash npm install -g knex @@ -27,44 +31,83 @@ npm install -g webpack npm install -g eslint ``` +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. + +Le serveur utilisé est [express.js](https://expressjs.com/) ; il est configuré dans [`server.js`](./src/server.js) puis lancé sur le port 8888 dans [`index.js`](./src/index.js). + ## Structure -Les fichiers source se situent dans le dossier `src`. +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. + +- Racine du projet : fichiers de configuration ; + - config.json : données "sensibles" spécifique au projet à priori non partageable (adresse du LDAP, mots de passe), + - configfile_doc.json : JSDoc, l'outil de génération automatique de documentation, + - autres fichiers relatifs à des modules particuliers ou à la gestion de paquets, + - [`assets`](./assets) : ressources ; + - images et divers (dont l'essentiel flavicon) + - [`build`](./build) : dépendances gérées automatiquement ; + - bundle.js est un monstrueux fichier généré automatiquement qui gère nos dépendances. + - [`db`](./db) : base de donnée sigma ; + - knex_router.js charge la configuration précisée dans knexfile.js, + - [`migrations`](./db/migrations) 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), + - [`seeds`](./db/seeds) : stocke les éléments de générations des BDD ; c'est un ensemble de scripts. + - [`doc`](./doc) : documentation ; + - ensemble de pages html et fichiers associés ; index.html permet de naviguer sereinement sur toute la doc JSDoc. + - [`node_modules`](./node_modules) : gestion automatique des modules. + - [`src`](./src) : code source + - [`admin_view`](./src/admin_view) : gestion d'une interface administrateur de la base de donnée, s'appuie sur *css* et *views* + - [`ldap`](./src/ldap) : gestion des requêtes LDAP -Le serveur utilisé est [express.js](https://expressjs.com/) ; il est configuré dans [`server.js`](./src/server.js) puis lancé sur le port 8888 dans [`index.js`](./src/index.js). La syntaxe adoptée est JavaScript ES6, un standard moderne (2015) de JavaScript. Il permet d'importer des dépendances en utilisant le mot-clé `import`, ce que le serveur Node.js ne comprend pas puisque la version 8 de Node ne comprend que le standard ES5 (2009), qui gère les imports avec `require()`. -Node comprend le code dans [`build/bundle.js`](./build/bundle.js), donc on le lance dessus après avoir compilé ce fichier. - ## Base de données -La base de donnée utilisée est PostgreSQL. +Sigma s'appuie sur deux bases de données : + +* La BDD frankiz accessible par LDAP hébergée sur un serveur de l'école, qui contient identifiants, mots de passe, et toutes les informations sur les utilisateurs et groupes spécifiques X. + * On y accède par des requêtes LDAP, d'où la nécessité de ldap.js. +* La BDD de sigma propre est en [PostgreSQL](https://www.postgresql.fr/), hébergée en propre BR, qui contient les groupes et leurs niveaux de visibilité mais peu d'information sur les utilisateurs (seulement son école). + * Cette BDD est géré par [Knex](http://knexjs.org). + +Cette structure peut sembler lourde et redondante mais s'explique par plusieurs raisons : + +* Volonté d'intégrer d'autres écoles simplement + * Rajouter leurs groupes sur la BDD sigma + * Pas les obliger à rejoindre notre LDAP avec notre structure +* Garder le LDAP X et le mettre à jour ; il est utilisé par beaucoup d'autres sites X +* Enjeu de sécurité + * La BDD de sigma est public et ne comporte rien de compromettant + * La BDD accessible par LDAP de l'X qui contient des informations plus sensibles et qui doit être plus protégée + +Les deux sections suivantes détaillent les opérations possibles grâce au back directement sur les bases de données via sigma. -Le schéma de la BDD est géré par [Knex](http://knexjs.org). La config de Knex est dans [`knexfile.js`](./knexfile.js) : c'est un objet JSON qui précise la BDD à lequelle se connecter, l'utilisateur sous lequel elle est, le mot de passe... +### Fonctions knexjs + +Quelques exemples de fonctions utiles de `knexjs` [Knex](http://knexjs.org) * `knex migrate:make migration_name` crée une migration dans `migrations/` : le nom du fichier est `migration_name.js` avec la date et l'heure en préfixe * `knex migrate:latest` met à jour le schéma de la BDD * `knex seed:make filename` crée un _seed_ `seeds/filename` * `knex seed:run` insère les _seeds_ dans la BDD -### Seeds +Un fichier _seed_ permet d'insérer des données dans la BDD. Ils sont stockés dans [`seeds`](./db/seeds). + +### Fonctions LDAP -Un fichier _seed_ permet d'insérer des données dans la BDD. +On peut facilement explorer et modifier des éléments du LDAP de l'école depuis le réseau de l'X avec [JXplorer](http://jxplorer.org/) en entrant `frankiz` dans nouvelle connexion et en allant dans `net`. ## Scripts -Les scripts sont des instructions en ligne de commande que l'on peut faire tourner avec la commande `npm run`. Ils sont définis dans [`package.json`](./package.json). +Les scripts sont des instructions en ligne de commande que l'on peut faire tourner avec la commande `npm run`. Ce sont des raccourcis pour gagner du temps sur des opérations un peu longues. Ils sont définis dans [`package.json`](./package.json). -### Transpiler le serveur +Les plus importants sont détaillées ci-dessous (ne pas oublier `npm install` déjà mentionné plus tôt) : -On utilisera Webpack pour transpiler le fichier source [`src/index.js`](./src/index.js) en [`build/bundle.js`](./build/bundle.js) qui est suit la syntaxe ES5 compatible Node. Pour ça, on utilise +On utilisera Webpack pour transpiler le fichier source [`src/index.js`](./src/index.js) en [`build/bundle.js`](./build/bundle.js) qui est suit la syntaxe ES5 compatible Node. Pour ça, on utilise : * `npm run build` qui exécute la commande `webpack` avec le fichier de configuration `webpack.config.js`, ou * `npm run watch` qui recompile automatiquement dès que le code est modifié. -### Démarrer le serveur - Pour faire tourner le serveur, il y a deux options : * `npm start` fait tourner le serveur `bundle.js` en mode prod sur le port 3000 (donc il faut consulter https://localhost:3000) @@ -72,28 +115,26 @@ Pour faire tourner le serveur, il y a deux options : Donc, lancer `npm run watch` dans un terminal et `npm test` dans un autre permet de recompiler le serveur __et__ le redémarrer automatiquement dès qu'il y a une modification. -## ESLint - -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 `.eslintrc.json`. Pour l'instant, la config ESLint impose d'utiliser quatre espaces pour les indentations et d'utiliser des points-virgule en fin de ligne. +Le script pour faire tourner [JSDoc](http://usejsdoc.org/index.html) et régénérrer la documentation est : `npm run doc` -Il est préférable de l'installer **globalement** avec +## Documentation - npm install -g eslint +La documentation détaillée du projet est [ici](./doc/index.html). Elle a été compilée avec [JSDoc](http://usejsdoc.org/index.html) sous format hmtl selon le fichier de configuration [`configfile_doc.json`](./configfile_doc.json) à la racine du projet. -Pour faire valider les fichiers source par ESLint, utilisez +Les fichiers compilés se situent dans [`doc`](./doc) 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. - npm run lint +A la fin de ce fichier JSDoc rajjoute les commentaires placés dans chacun des fichiers et des hyperliens pour y accéder. -qui fait appel au script `eslint src/` défini dans le [`package.json`](./package.json). L'option `--fix` permet de corriger les fichiers. +## Appendixes -Sinon, si vous utilisez Atom ou Visual Studio Code pour éditer votre code, il existe des plugins qui font tourner ESLint en _live_ sur le code et vérifient que tout est en ordre. +### ESLint -Pour mieux comprendre ESLint, référez-vous à la [doc](https://eslint.org/docs/user-guide/getting-started). +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 `.eslintrc.json`. Pour l'instant, la config ESLint impose d'utiliser quatre espaces pour les indentations et d'utiliser des points-virgule en fin de ligne. -# Documentation +Il est préférable de l'installer **globalement** avec `npm install -g eslint`. Pour faire valider les fichiers source par ESLint, utilisez `npm run lint`. -La documentation est compilée avec JSDoc : le script pour le faire tourner est +qui fait appel au script `eslint src/` défini dans le [`package.json`](./package.json). L'option `--fix` permet de corriger les fichiers. - npm run doc +Sinon, si vous utilisez Atom ou Visual Studio Code pour éditer votre code, il existe des plugins qui font tourner ESLint en _live_ sur le code et vérifient que tout est en ordre. -et les fichiers compilés se situent dans `doc/`. \ No newline at end of file +Pour mieux comprendre ESLint, référez-vous à la [doc](https://eslint.org/docs/user-guide/getting-started). \ No newline at end of file diff --git a/configfile_doc.json b/configfile_doc.json index 9db2f2b152d92f1a012e91393d52d7a45e2dfba1..f27faa9693ea735f82da420b517bc27df6f1912d 100644 --- a/configfile_doc.json +++ b/configfile_doc.json @@ -2,7 +2,7 @@ "plugins": ["plugins/markdown", "plugins/summarize"], "recurseDepth": 5, "source": { - "include": ["./src","./db","./knexfile.js"], + "include": ["./src","./db","./knexfile.js","./README.md"], "exclude": ["./db/migrations","./db/seeds"], "includePattern": ".+\\.js(doc|x)?$", "excludePattern": "(^|\\/|\\\\)_" diff --git a/doc/db_knex_router.js.html b/doc/db_knex_router.js.html index f5a52b629a8eb85fee43ae4ee1408d1a0b393fe0..a69d0112c13b80eefa44384a95fd155c7c585d76 100644 --- a/doc/db_knex_router.js.html +++ b/doc/db_knex_router.js.html @@ -51,7 +51,7 @@ module.exports = require('knex')(config);</code></pre> <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:15:16 GMT+0100 (Paris, Madrid) + 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) </footer> <script> prettyPrint(); </script> diff --git a/doc/global.html b/doc/global.html index 5042c702383f0aee411cc7c6321bcdb8954189f4..0211e7aa79ed1d3c3a20856ad974ab13a348faca 100644 --- a/doc/global.html +++ b/doc/global.html @@ -504,7 +504,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <a href="src_ldap_data_ldap_data.js.html">src/ldap_data/ldap_data.js</a>, <a href="src_ldap_data_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#line17">line 17</a> </li></ul></dd> @@ -663,7 +663,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <a href="src_ldap_data_ldap_data.js.html">src/ldap_data/ldap_data.js</a>, <a href="src_ldap_data_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#line38">line 38</a> </li></ul></dd> @@ -735,7 +735,7 @@ <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:15:16 GMT+0100 (Paris, Madrid) + 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) </footer> <script> prettyPrint(); </script> diff --git a/doc/index.html b/doc/index.html index 210794c6c9129db89c2ec614567d2a712d03f66d..ecebedb1fee41896a89ef6d836799d82bdae6308 100644 --- a/doc/index.html +++ b/doc/index.html @@ -42,6 +42,118 @@ + <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> +<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> +<p>Ce document détaille les différentes dépendances du projet, sa structure générale, détaille un peu plus des éléments sur la base de données et la documentation ; le code est également commenté en détail.</p> +<h2>Dépendances</h2><p>Une dépendance, c'est un librairie JavaScript dont dépend le code source, soit pour le faire tourner soit pour faire tourner les outils dévs. Les dépendances développeur servent à tester par exemple. On trouve la liste des dépendances dans <a href="./package.json"><code>package.json</code></a>. Express est un exemple de dépendance normale, nodemon et ESLint (voir infra) sont des dépendances dev (<code>devDependencies</code>).</p> +<p>Les dépendances s'installent avec <code>npm install</code>. Par défaut, toutes les dépendances sont installées. Si la variable <code>NODE_ENV</code> est configurée (vérifier avec la commande <code>echo "$NODE_ENV"</code>),</p> +<ul> +<li>la valeur <code>development</code> installe tout</li> +<li>la valeur <code>production</code> n'installe pas les dépendances développeur</li> +</ul> +<p>Certaines d'entre elles comme KnexJS ou Webpack doivent être installées globalement :</p> +<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> +<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>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>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>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> +</ul> +</li> +<li><a href="./doc"><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> +</ul> +</li> +</ul> +</li> +</ul> +<p>La syntaxe adoptée est JavaScript ES6, un standard moderne (2015) de JavaScript. Il permet d'importer des dépendances en utilisant le mot-clé <code>import</code>, ce que le serveur Node.js ne comprend pas puisque la version 8 de Node ne comprend que le standard ES5 (2009), qui gère les imports avec <code>require()</code>.</p> +<h2>Base de données</h2><p>Sigma s'appuie sur deux bases de données :</p> +<ul> +<li>La BDD frankiz accessible par LDAP hébergée sur un serveur de l'école, qui contient identifiants, mots de passe, et toutes les informations sur les utilisateurs et groupes spécifiques X.<ul> +<li>On y accède par des requêtes LDAP, d'où la nécessité de ldap.js.</li> +</ul> +</li> +<li>La BDD de sigma propre est en <a href="https://www.postgresql.fr/">PostgreSQL</a>, hébergée en propre BR, qui contient les groupes et leurs niveaux de visibilité mais peu d'information sur les utilisateurs (seulement son école).<ul> +<li>Cette BDD est géré par <a href="http://knexjs.org">Knex</a>.</li> +</ul> +</li> +</ul> +<p>Cette structure peut sembler lourde et redondante mais s'explique par plusieurs raisons :</p> +<ul> +<li>Volonté d'intégrer d'autres écoles simplement<ul> +<li>Rajouter leurs groupes sur la BDD sigma</li> +<li>Pas les obliger à rejoindre notre LDAP avec notre structure</li> +</ul> +</li> +<li>Garder le LDAP X et le mettre à jour ; il est utilisé par beaucoup d'autres sites X</li> +<li>Enjeu de sécurité<ul> +<li>La BDD de sigma est public et ne comporte rien de compromettant</li> +<li>La BDD accessible par LDAP de l'X qui contient des informations plus sensibles et qui doit être plus protégée</li> +</ul> +</li> +</ul> +<p>Les deux sections suivantes détaillent les opérations possibles grâce au back directement sur les bases de données via sigma.</p> +<h3>Fonctions knexjs</h3><p>Quelques exemples de fonctions utiles de <code>knexjs</code> <a href="http://knexjs.org">Knex</a></p> +<ul> +<li><code>knex migrate:make migration_name</code> crée une migration dans <code>migrations/</code> : le nom du fichier est <code>migration_name.js</code> avec la date et l'heure en préfixe</li> +<li><code>knex migrate:latest</code> met à jour le schéma de la BDD</li> +<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> +<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> +<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> +<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> +</ul> +<p>Pour faire tourner le serveur, il y a deux options :</p> +<ul> +<li><code>npm start</code> fait tourner le serveur <code>bundle.js</code> en mode prod sur le port 3000 (donc il faut consulter https://localhost:3000)</li> +<li><code>npm test</code> le démarre avec <a href="https://nodemon.io/">nodemon</a>, outil dév qui redémarre automatiquement le serveur dans <code>bundle.js</code> dès que celui-ci est modifié.</li> +</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>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>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> + @@ -433,7 +545,7 @@ <header> - <h2>src/ldap_auth/ldap_auth.js</h2> + <h2>src/ldap/ldap_auth.js</h2> </header> @@ -484,7 +596,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <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#line11">line 11</a> + <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> @@ -533,7 +645,7 @@ <header> - <h2>src/ldap_auth/ldap_auth.js</h2> + <h2>src/ldap/ldap_auth.js</h2> </header> @@ -577,7 +689,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <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> + <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> </li></ul></dd> @@ -626,7 +738,7 @@ <header> - <h2>src/ldap_data/ldap_data.js</h2> + <h2>src/ldap/ldap_data.js</h2> </header> @@ -677,7 +789,7 @@ <dt class="tag-source">Source:</dt> <dd class="tag-source"><ul class="dummy"><li> - <a href="src_ldap_data_ldap_data.js.html">src/ldap_data/ldap_data.js</a>, <a href="src_ldap_data_ldap_data.js.html#line1">line 1</a> + <a href="src_ldap_ldap_data.js.html">src/ldap/ldap_data.js</a>, <a href="src_ldap_ldap_data.js.html#line1">line 1</a> </li></ul></dd> @@ -821,7 +933,7 @@ <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:15:16 GMT+0100 (Paris, Madrid) + 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) </footer> <script> prettyPrint(); </script> diff --git a/doc/knexfile.js.html b/doc/knexfile.js.html index f149d4d0566e0e23142ba8954a05db293ec5e946..3723ad4e524b2e72d40a627243791e41d8b77791 100644 --- a/doc/knexfile.js.html +++ b/doc/knexfile.js.html @@ -72,7 +72,7 @@ module.exports = { <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:15:16 GMT+0100 (Paris, Madrid) + 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) </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 2f6365d5765f16bcca08d32cba56564318b78a98..ac0f82ec1e9b834624252bed2788ec6d7fa93b4c 100644 --- a/doc/src_admin_view_admin_router.js.html +++ b/doc/src_admin_view_admin_router.js.html @@ -156,7 +156,7 @@ export default router; <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:15:16 GMT+0100 (Paris, Madrid) + 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) </footer> <script> prettyPrint(); </script> diff --git a/doc/src_index.js.html b/doc/src_index.js.html index fd0cd9ad2dfaf6e9b714ad9e57bcca4e83f2cbbb..66d57bd44f08e7d623aae4ced4ffbddc5c8a6906 100644 --- a/doc/src_index.js.html +++ b/doc/src_index.js.html @@ -66,7 +66,7 @@ server.listen(port, () => { <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:15:16 GMT+0100 (Paris, Madrid) + 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) </footer> <script> prettyPrint(); </script> diff --git a/doc/src_ldap_auth_ldap_auth.js.html b/doc/src_ldap_auth_ldap_auth.js.html index a4327d883eb851693392105ed45e779280a0ecd3..2b8cf5b96e966036b0316e22b1a19809259cd6fa 100644 --- a/doc/src_ldap_auth_ldap_auth.js.html +++ b/doc/src_ldap_auth_ldap_auth.js.html @@ -91,7 +91,7 @@ export default setupLdapAuth; <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:15:16 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:20:59 GMT+0100 (Paris, Madrid) </footer> <script> prettyPrint(); </script> diff --git a/doc/src_ldap_data_ldap_data.js.html b/doc/src_ldap_data_ldap_data.js.html index 415cd8d9c2ec17561a912291b5bcbcfdcb78e6ff..1868141a9a4a7de45955452a1feb708e318baed2 100644 --- a/doc/src_ldap_data_ldap_data.js.html +++ b/doc/src_ldap_data_ldap_data.js.html @@ -97,7 +97,7 @@ listGroups("quentin.chevalier","Ie42fds'eaJm1").then((grList) => { console.log(g <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:15:16 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:20:59 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 new file mode 100644 index 0000000000000000000000000000000000000000..de89ecac68e0945e82b2fa63a9e9171916dda2ce --- /dev/null +++ b/doc/src_ldap_ldap_auth.js.html @@ -0,0 +1,100 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>JSDoc: Source: src/ldap/ldap_auth.js</title> + + <script src="scripts/prettify/prettify.js"> </script> + <script src="scripts/prettify/lang-css.js"> </script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> + +<body> + +<div id="main"> + + <h1 class="page-title">Source: src/ldap/ldap_auth.js</h1> + + + + + + + <section> + <article> + <pre class="prettyprint source linenums"><code>/** + * @file ldap_auth + * @summary Setup de l'auth ldap avec passport-ldapauth + */ + +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 + */ + +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 + } + })); + + server.use(session({ + secret: config.sessionSecret, + //store: a modifier avant de lancer en prod + //voir les autres options + resave: true, + saveUninitialized: false + })); + server.use(passport.initialize()); + server.use(passport.session()); + + passport.serializeUser(function(user, done) { + done(null, user); + }); + + passport.deserializeUser(function(user, done) { + done(null, user); + }); + + // Returns middleware that parses cookies + //server.use(cookieParser()); +} + +export default setupLdapAuth; +</code></pre> + </article> + </section> + + + + +</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> +</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) +</footer> + +<script> prettyPrint(); </script> +<script src="scripts/linenumber.js"> </script> +</body> +</html> diff --git a/doc/src_ldap_ldap_data.js.html b/doc/src_ldap_ldap_data.js.html new file mode 100644 index 0000000000000000000000000000000000000000..0b0265d5164e9c8edc965b1358328ac5c35353ae --- /dev/null +++ b/doc/src_ldap_ldap_data.js.html @@ -0,0 +1,106 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>JSDoc: Source: src/ldap/ldap_data.js</title> + + <script src="scripts/prettify/prettify.js"> </script> + <script src="scripts/prettify/lang-css.js"> </script> + <!--[if lt IE 9]> + <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> + <![endif]--> + <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> + <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> +</head> + +<body> + +<div id="main"> + + <h1 class="page-title">Source: src/ldap/ldap_data.js</h1> + + + + + + + <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. + * @author hawkspar +*/ + +var ensureLoggedin = require('connect-ensure-login').ensureLoggedIn; +var ldapescape = require("ldap-escape"); +var ldap = require('ldapjs'); + +var client = ldap.createClient({ url: "ldap://frankiz.eleves.polytechnique.fr", timeout: 10000, idleTimeout: 10000}); + +/** + * @summary Fonction qui retrouve les groupes du LDAP dont un individu est membre (pas de bind nécessaire) + * @arg {int} uid - Identifiant de l'individu à interroger + * @return {string} Liste des uid de groupes (noms flat des groupes) où l'id fourni + */ +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) { + if (err) { + reject(err); + } else { + res.on('searchEntry', function(entry) { groupsList.push(entry.object.uid); }); + res.on('end', function(res) { resolve(groupsList); }); + } + }); + }); +} + +/** + * 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) + */ +function listMembers(uid) { + client.bind("uid=${uid},ou=eleves,dc=frankiz,dc=net", (err) => { console.log(err); }); + + 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) { + if (err) { + reject(err); + } else { + res.on('searchEntry', function(entry) { groupsList.push(entry.object.uid); }); + res.on('end', function(res) { resolve(groupsList); }); + } + }); + }); +} + +// Synthaxe d'utilisation +listGroups("quentin.chevalier","Ie42fds'eaJm1").then((grList) => { console.log(grList); });</code></pre> + </article> + </section> + + + + +</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> +</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) +</footer> + +<script> prettyPrint(); </script> +<script src="scripts/linenumber.js"> </script> +</body> +</html> diff --git a/doc/src_server.js.html b/doc/src_server.js.html index 5897b905c9af3ec795ca44675d802e13c3ae4cc3..570c095a91e3f0d787b50e54215520324f4607be 100644 --- a/doc/src_server.js.html +++ b/doc/src_server.js.html @@ -110,7 +110,7 @@ export default server; <br class="clear"> <footer> - Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Feb 28 2018 10:15:16 GMT+0100 (Paris, Madrid) + 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) </footer> <script> prettyPrint(); </script> diff --git a/src/ldap_auth/ldap_auth.js b/src/ldap/ldap_auth.js similarity index 91% rename from src/ldap_auth/ldap_auth.js rename to src/ldap/ldap_auth.js index 6da40b132f6fce41c18e672b77eafc5643ff0c1b..81d0d89a1b17b10042a4e09e6104e4265ce864f2 100644 --- a/src/ldap_auth/ldap_auth.js +++ b/src/ldap/ldap_auth.js @@ -1,6 +1,6 @@ /** - * @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 Wangounet */ import passport from 'passport'; @@ -8,11 +8,6 @@ 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 - */ - function setupLdapAuth(server) { var config = JSON.parse(fs.readFileSync('config.json', 'utf8')); diff --git a/src/ldap_data/ldap_data.js b/src/ldap/ldap_data.js similarity index 100% rename from src/ldap_data/ldap_data.js rename to src/ldap/ldap_data.js