diff --git a/.gitignore b/.gitignore index 2ff2621baa8911c4fe92b60a827ecee77bd92171..f2538606a019f1ef194242596008918e4e8b7aa8 100644 --- a/.gitignore +++ b/.gitignore @@ -69,5 +69,4 @@ typings/ # Generated files doc/ build/ -ldap_config.json sigma-back.service \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 75529fa355afaf009a389b2a98c7ae813fcbda77..df35bb706847fff6fd94ea74e72ea60258b04677 100644 --- a/package-lock.json +++ b/package-lock.json @@ -157,7 +157,6 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, "requires": { "co": "4.6.0", "fast-deep-equal": "1.0.0", @@ -1024,8 +1023,7 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "code-point-at": { "version": "1.1.0", @@ -2146,6 +2144,15 @@ "object-assign": "4.1.1" } }, + "file-loader": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.10.tgz", + "integrity": "sha512-dNnT4yJgUPtGDg0+m03kQ0b/PZi3Y12EnqYuRPNCsbYkBZc6j+fwVWy40jWzZjn5kIzQ4BLIxzJimbwAYlnPGw==", + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.4.5" + } + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -5753,6 +5760,32 @@ "ret": "0.1.15" } }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "requires": { + "ajv": "6.2.0", + "ajv-keywords": "3.1.0" + }, + "dependencies": { + "ajv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.0.tgz", + "integrity": "sha1-r6wpW7qgFSRJ5SJ0LkVHwa6TKNI=", + "requires": { + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=" + } + } + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -6723,6 +6756,26 @@ } } }, + "url-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "requires": { + "loader-utils": "1.1.0", + "mime": "1.4.1", + "schema-utils": "0.3.0" + }, + "dependencies": { + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "requires": { + "ajv": "5.5.2" + } + } + } + }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", diff --git a/package.json b/package.json index 2227f83fe49302f4c9dbb55c6ff6597f48699132..012148b1897a5c3f756b868280ec9b738d66478e 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "cors": "^2.8.4", "express": "^4.16.2", "express-session": "^1.15.6", + "file-loader": "^1.1.10", "fs": "0.0.1-security", "fuse.js": "^3.2.0", "graphql": "^0.13.1", @@ -25,6 +26,7 @@ "pg": "^7.4.1", "pug": "^2.0.0-rc.4", "serve-favicon": "^2.4.5", + "url-loader": "^0.6.2", "webpack": "^3.11.0", "webpack-node-externals": "^1.6.0" }, diff --git a/sigma-back-dev.service b/sigma-back-dev.service index 118eacbb61a3fab935a2a8129acf3264f68dc82e..46874305bf25d714ce7152bae87ebc0d2ff3aa66 100644 --- a/sigma-back-dev.service +++ b/sigma-back-dev.service @@ -6,7 +6,7 @@ After=network-online.target [Service] Environment=NODE_ENV=development WorkingDirectory=/opt/sigma-back -ExecStart=/usr/bin/node app.js +ExecStart=node app.js Restart=always [Install] diff --git a/src/admin_view/admin_router.js b/src/admin_view/admin_router.js index 4a4a663a0399002eda6dddf291918779dd355641..503d8dd5cffc33ed42923e3cd7e962244d3c6dd8 100644 --- a/src/admin_view/admin_router.js +++ b/src/admin_view/admin_router.js @@ -17,11 +17,32 @@ router.get('/', function (req, res) { errorMessage: req.flash('error') }); }); +/** + * @description Le login se fait en POST. Faire un GET à /login renvoie à la racine / + */ +router.get('/login', function(req,res) { + console.log('Redirecting to home...'); + res.redirect('/'); +}); + router.get('/admin', - // ensureLoggedIn('/'), + ensureLoggedIn('/login'), function (req, res) { console.log('Connecting to ' + req.url); - res.render('home', { title: 'Home', port: port }); + let userName; + /* + * On ne veut pas déclencer d'erreur 500 si on ne peut pas lire l'utilisateur + * La personne n'est peut-être pas connectée, mais cela doit être géré autrement + */ + try { + let user = req.session.passport.user; + console.log('Welcome,',user.cn); + userName = user.cn; + } catch (err) { + console.log(err.message); + userName = "No one"; + } + res.render('home', { title: 'Home', port: port, userName: userName }); }); router.post('/login', @@ -105,7 +126,9 @@ router.use((req, res, next) => { * @summary Gère les erreurs 404 */ router.use((err, req, res, next) => { + console.log("Entering error handler"); res.locals.message = err.message; + console.log(err.message); res.status(err.status || 500); let error_message = res.statusCode == 404 ? 'Not found.' : 'Internal server error.'; diff --git a/src/graphql/schema.js b/src/graphql/schema.js index 1dee84f8c7be0f2013011b16f5f8b5ded9ffb6bc..ca8bca32b9a31dd6e462a294aeff6251840ff172 100644 --- a/src/graphql/schema.js +++ b/src/graphql/schema.js @@ -1,5 +1,5 @@ /** - * @file Ce fichier genere le shema utilise par Apollo. C'est ici que les requetes GraphQl sont résolues. + * @file Ce fichier génère le schéma GraphQL. C'est ici que les requêtes GraphQl sont résolues. * @author akka vodol */ import knex from '../../db/knex_router'; @@ -40,11 +40,11 @@ const typeDefs = ` asViewer(groupid: String): ViewerMutation createGroup( - uid: ID = null, - name: String, - website: String, - description: String, - school: String, + uid: ID = null + name: String + website: String + description: String + school: String parentuid : String ): Group } @@ -200,6 +200,7 @@ const resolvers = { user: (obj, args, context) => { const refactorer = (data) => { return { + uid: args.uid, lastName: data.sn, givenName: data.givenName, birthdate: data.brBirthdate, @@ -207,15 +208,13 @@ const resolvers = { }; }; - const result = rens(args.uid).then((res) => { - let refactData = res.map(data => { - let result = refactorer(data); - return result; - }); - console.log(refactData); - return refactData; + console.log("Logged in as:",context.user); + + const result = rens(context.user, args.uid).then(res => { + const output = res.map(entry => refactorer(entry)); + return output; }); - console.log(result); + return result; } }, diff --git a/src/ldap/ldap_data.js b/src/ldap/ldap_data.js index f34fba5f56a1ea0ce166f89df11264cfef9c745f..27fd16790a56d292cbf3a4daab14acb7a428eedb 100644 --- a/src/ldap/ldap_data.js +++ b/src/ldap/ldap_data.js @@ -208,7 +208,7 @@ function listAdmins(user, gid) { * @arg {Object} user - Utilisateur de la forme nécessaire au bind * @arg {string} user[key] - uid et password * @arg {string} uid - Identifiant de l'utilisateur - * @return {Object} Informations recueillies ; rennvoit une liste de dictionnaire avec les mêmes clés que dans le TOL, voir config.json. + * @return {Object} Informations recueillies ; renvoie une liste de dictionnaire avec les mêmes clés que dans le TOL, voir config.json. */ function rens(user, uid) { return new Promise(function(resolve, reject) { diff --git a/src/server.js b/src/server.js index 994fb46cc9d8847dc0fd87a5dd5fdadca11b600d..99184c879573b713d47106b48f5607a6e3506460 100644 --- a/src/server.js +++ b/src/server.js @@ -2,6 +2,7 @@ * @file Cree le serveur express avec tous les middleware qui vont bien */ import express from 'express'; +import session from 'express-session'; import bodyParser from 'body-parser'; import favicon from 'serve-favicon'; import morgan from 'morgan'; @@ -19,6 +20,19 @@ server.use(bodyParser.urlencoded({ extended: true })); +/** + * @description Cache le fait que l'application tourne sous Express dans le header HTTP. + */ +server.disable('x-powered-by'); + +// Configuration de express-session +server.use(session({ + secret: 'race condition', + cookie: { maxAge: 60000 }, + resave: true, + saveUninitialized: true +})); + // setting up view engine for pug let viewpath = path.resolve('./','src','views'); server.set('views', viewpath); @@ -39,14 +53,11 @@ server.use('/graphql', bodyParser.json(), cors(), let password; try { - uid = "anatole.romon"; - password = "mythe" - //uid = req.session.id; - //password = req.session.password; + uid = req.session.passport.user.uid; + password = "mythe"; } catch (err) { - uid = "louis.vanneau"; - password = "mythe" - + uid = "louis.vaneau"; + password = "mythe"; } return { diff --git a/src/views/home.pug b/src/views/home.pug index 5f54ed0546251e286f383302cdc4305ef6034302..ecf13fedf6636a61dca465b52cdd07c5ef4dbafc 100644 --- a/src/views/home.pug +++ b/src/views/home.pug @@ -20,5 +20,6 @@ block content | requests to the database. a(href="/graphiql") Check it out. | + p Currently logged in as: #{userName}. form(action="/logout", method="post") button.form-control(type="submit") Déconnexion/<em>Logout</em> diff --git a/webpack.config.js b/webpack.config.js index eb89149a2ae7cb850e9071bfd68a5003c01ebb95..192a23d259b42d65fd9ccf028e7e989052844c8c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,19 +1,30 @@ const path = require('path'); const nodeExternals = require('webpack-node-externals'); -var config = { +const config = { entry: './src/index.js', + target: 'node', + output: { - filename: 'bundle.js', - path: path.resolve(__dirname, 'build') + path: path.resolve(__dirname, 'build'), + publicPath: '/', + filename: 'bundle.js' }, + externals: [nodeExternals()], + module: { loaders: [{ - test: /\.(png|jpg|ico)/, + test: /\.css$/, + use: ['style-loader', 'css-loader'] + },{ + test: /\.(png|jpg|ico)$/, exclude: /node_modules/, - loader: 'url-loader' + loader: 'file-loader', + options: { + limit: 10000 + } }] } };