diff --git a/package-lock.json b/package-lock.json index a54d4229fd133b652d2905634d72ddc8ecb6fd35..96e6adcf09b089e9ba17725ae10d01f0fd976ceb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, "requires": { "@babel/highlight": "7.0.0-beta.44" } @@ -16,6 +17,7 @@ "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, "requires": { "@babel/types": "7.0.0-beta.44", "jsesc": "^2.5.1", @@ -28,6 +30,7 @@ "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, "requires": { "@babel/helper-get-function-arity": "7.0.0-beta.44", "@babel/template": "7.0.0-beta.44", @@ -38,6 +41,7 @@ "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, "requires": { "@babel/types": "7.0.0-beta.44" } @@ -46,6 +50,7 @@ "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, "requires": { "@babel/types": "7.0.0-beta.44" } @@ -54,6 +59,7 @@ "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -64,6 +70,7 @@ "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, "requires": { "@babel/code-frame": "7.0.0-beta.44", "@babel/types": "7.0.0-beta.44", @@ -75,6 +82,7 @@ "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, "requires": { "@babel/code-frame": "7.0.0-beta.44", "@babel/generator": "7.0.0-beta.44", @@ -92,6 +100,7 @@ "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.2.0", @@ -521,8 +530,7 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "async-each": { "version": "1.0.1", @@ -630,6 +638,7 @@ "version": "8.2.3", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.3.tgz", "integrity": "sha512-0HeSTtaXg/Em7FCUWxwOT+KeFSO1O7LuRuzhk7g+1BjwdlQGlHq4OyMi3GqGxrNfEq8jEi6Hmt5ylEQUhurgiQ==", + "dev": true, "requires": { "@babel/code-frame": "7.0.0-beta.44", "@babel/traverse": "7.0.0-beta.44", @@ -1444,7 +1453,8 @@ "babylon": { "version": "7.0.0-beta.44", "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==" + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true }, "backoff": { "version": "2.5.0", @@ -1515,6 +1525,11 @@ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + }, "basic-auth": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", @@ -1721,6 +1736,11 @@ "isarray": "^1.0.0" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "buffer-writer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", @@ -1879,6 +1899,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2766,6 +2787,15 @@ "stream-shift": "^1.0.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", + "requires": { + "base64url": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "editions": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", @@ -3129,6 +3159,7 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -3137,7 +3168,8 @@ "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true }, "espree": { "version": "3.5.4", @@ -3168,6 +3200,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, "requires": { "estraverse": "^4.1.0" } @@ -3175,7 +3208,8 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true }, "esutils": { "version": "2.0.2", @@ -3417,6 +3451,17 @@ "raw-body": "^2.3.2" } }, + "express-jwt": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.1.tgz", + "integrity": "sha512-1C9RNq0wMp/JvsH/qZMlg3SIPvKu14YkZ4YYv7gJQ1Vq+Dv8LH9tLKenS5vMNth45gTlEUGx+ycp9IHIlaHP/g==", + "requires": { + "async": "^1.5.0", + "express-unless": "^0.3.0", + "jsonwebtoken": "^8.1.0", + "lodash.set": "^4.0.0" + } + }, "express-session": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", @@ -3443,6 +3488,11 @@ } } }, + "express-unless": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz", + "integrity": "sha1-JVfBRudb65A+LSR/m1ugFFJpbiA=" + }, "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", @@ -4595,7 +4645,8 @@ "globals": { "version": "11.5.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==" + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "dev": true }, "globby": { "version": "7.1.1", @@ -5621,7 +5672,8 @@ "jsesc": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=" + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true }, "json-buffer": { "version": "3.0.0", @@ -5651,6 +5703,30 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, + "jsonwebtoken": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz", + "integrity": "sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw==", + "requires": { + "jws": "^3.1.4", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "xtend": "^4.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, "jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -5660,6 +5736,27 @@ "promise": "^7.0.1" } }, + "jwa": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", + "requires": { + "base64url": "2.0.0", + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.9", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", + "requires": { + "base64url": "^2.0.0", + "jwa": "^1.1.4", + "safe-buffer": "^5.0.1" + } + }, "keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", @@ -5807,9 +5904,9 @@ }, "dependencies": { "@types/node": { - "version": "7.0.56", - "resolved": "http://registry.npmjs.org/@types/node/-/node-7.0.56.tgz", - "integrity": "sha512-NgjN3xPyqbAXSIpznNAR5Cisx5uKqJWxcS9kefzSFEX/9J7O01/FHyfnvPI7SztBf9p6c8mqOn3olZWJx3ja6g==" + "version": "7.0.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.63.tgz", + "integrity": "sha512-YPVhjU3cADo7M7M1KWeEki9MUMZd3yz5FLq0BXkPrY2jpr0B9VRd4iQ2vBSiLrjvLkIPPluzxQFYJ5JkGubtIw==" } } }, @@ -6207,6 +6304,46 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.7.tgz", "integrity": "sha512-jzqTi3vk4J5Dxq43cNjB0ekfCjPLHixoY2Sc0WHTo+0r928taLqe/VCt02vY5uQBvg0rdXgL3xWkK4X0MCmZcw==" }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -9252,7 +9389,8 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "to-object-path": { "version": "0.3.0", @@ -9309,7 +9447,8 @@ "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true }, "tty-browserify": { "version": "0.0.0", diff --git a/package.json b/package.json index 548d8d81c014e727257fff7ccb1837e9de64c11d..c2b626545e4862818fbaf580c322371eb13a8216 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "description": "Backend of sigma, the new Frankiz", "main": "index.js", "dependencies": { - "babel-eslint": "^8.2.3", "body-parser": "^1.18.2", "colors": "^1.2.3", "connect-ensure-login": "^0.1.1", @@ -14,6 +13,7 @@ "cors": "^2.8.4", "express": "^4.16.2", "express-graphql": "^0.6.12", + "express-jwt": "^5.3.1", "express-session": "^1.15.6", "file-loader": "^1.1.11", "fs": "0.0.1-security", @@ -21,6 +21,7 @@ "graphql": "^0.13.2", "graphql-tools": "^2.24.0", "graphql-voyager": "^1.0.0-rc.15", + "jsonwebtoken": "^8.2.1", "knex": "^0.14.6", "ldap-escape": "^1.1.5", "ldapjs": "^1.0.2", @@ -34,6 +35,7 @@ "url-loader": "^0.6.2" }, "devDependencies": { + "babel-eslint": "^8.2.3", "eslint": "^4.19.1", "eslint-config-standard": "^11.0.0", "eslint-loader": "^2.0.0", diff --git a/src/admin_view/admin_router.js b/src/admin_view/admin.router.js similarity index 98% rename from src/admin_view/admin_router.js rename to src/admin_view/admin.router.js index 7b0f3d9862345a569c182e92f06e2ef805abc60b..a7b8b2a4056a66bb209c1f155ffe706072b774a7 100644 --- a/src/admin_view/admin_router.js +++ b/src/admin_view/admin.router.js @@ -7,12 +7,12 @@ * Les res.redirect() sont censes supporter les paths relatifs (et donc pas besoin de repreciser /adminview/* a chaque fois) * mais ca marche visiblement pas... Donc j'ai mis les paths absolus dans les res.redirect(). */ -import express from 'express'; +import { Router } from 'express'; import knex from '../../db/knex_router'; import passport from 'passport'; import { ensureLoggedIn } from 'connect-ensure-login'; -const router = express.Router(); +const router = Router(); let port = process.env.PORT || 3000; @@ -143,7 +143,7 @@ router.get('/db/:table_name?', function (req, res) { */ router.use((req, res, next) => { let err = new Error('Not found'); - err.status = 404; + res.status(404); next(err); }); diff --git a/src/config_passport.js b/src/config_passport.js index 6ba838ba87292035bb4c237feaf17177cf7583e8..717e0a4eda94157dba92093b8174039deccb3dab 100644 --- a/src/config_passport.js +++ b/src/config_passport.js @@ -70,6 +70,6 @@ passport.serializeUser(function (user, done) { //The first argument of deserializeUser corresponds to the key of the user object that was given to the done function in serializeUser //The fetched object is attached to the request object as req.user (available in all subsequent middleware) passport.deserializeUser(function (userUid, done) { - console.log(`passport.deserializeUser(): deserializing user ${userUid}`); // DEBUG + // console.log(`passport.deserializeUser(): deserializing user ${userUid}`); // DEBUG done(null, { uid: userUid }); }); \ No newline at end of file diff --git a/src/graphql/authenticator.js b/src/graphql/authenticator.js new file mode 100644 index 0000000000000000000000000000000000000000..9353a6184b946ddef4dd97b7757352bd27434306 --- /dev/null +++ b/src/graphql/authenticator.js @@ -0,0 +1,22 @@ +import passport from 'passport'; +import '../config_passport'; +import jwt from 'jsonwebtoken'; + +const SECRET_KEY = "boom shakalaka"; + +function loginResolverFunc({ username, password, req }) { + + return new Promise((resolve, reject) => { + passport.authenticate('ldapauth', (err, user, info) => { + if (err) { reject(err); } + if (!user) { reject('Invalid credentials.'); } + + req.login(user, () => { + const token = jwt.sign({uid: user.uid}, SECRET_KEY); + resolve(token); + }); + })({ body: { username, password } }); + }); +} + +export default loginResolverFunc; \ No newline at end of file diff --git a/src/graphql/resolvers.js b/src/graphql/resolvers.js index fa09f4c69c369a60c1fa8dd928b2f13dc06f126e..f1e1c1d93d767bf8f2e44a38fc46bbe8503ad56c 100644 --- a/src/graphql/resolvers.js +++ b/src/graphql/resolvers.js @@ -2,11 +2,15 @@ * @file Implémentation des requêtes GraphQL. * @author akka vodol */ -import { request } from 'https'; import _ from 'lodash'; import { assertBinaryExpression } from 'babel-types'; import knex from '../../db/knex_router'; +import passport from 'passport'; +import './../config_passport'; + +import authenticator from '../graphql/authenticator'; + import * as connectors from './connectors/connectors'; import * as list_selectors from './connectors/list_selectors'; import * as authentifiers from './connectors/authentifiers'; @@ -15,6 +19,7 @@ import * as authentifiers from './connectors/authentifiers'; * @description Résolveurs des différentes requêtes GraphQL */ + export const resolvers = { // @rights user Query: { @@ -22,26 +27,26 @@ export const resolvers = { // group queries allGroups: async function(obj, args, context){ - let user = await authentifiers.anonymous(context.user); + let user = await authentifiers.anonymous(context.bindUser); return user && connectors.getAllVisibleGroups(user); }, allSimpleGroups: async function (obj, args, context){ - let user = await authentifiers.anonymous(context.user); + let user = await authentifiers.anonymous(context.bindUser); return user && connectors.getAllVisibleSimpleGroups(user); }, group: async function(obj, args, context){ - let user = await authentifiers.anonymous(context.user); + let user = await authentifiers.anonymous(context.bindUser); return user && connectors.getGroupIfVisible(user, args.uid); }, simpleGroup: async function(obj, args, context){ - let user = await authentifiers.anonymous(context.user); + let user = await authentifiers.anonymous(context.bindUser); return user && connectors.getSimpleGroupIfVisible(user, args.uid); }, metaGroup: async function(obj, args, context){ - let user = await authentifiers.anonymous(context.user); + let user = await authentifiers.anonymous(context.bindUser); return user && connectors.getMetaGroupIfVisible(user, args.uid); }, @@ -68,7 +73,7 @@ export const resolvers = { // user queries user: async function(obj, args, context){ - let user = await authentifiers.anonymous(context.user); + let user = await authentifiers.anonymous(context.bindUser); return user && connectors.getUser(user,args.uid); }, @@ -96,15 +101,15 @@ export const resolvers = { // member queries allMembers : async function(obj, args, context){ - let user = await authentifiers.member(context.user, args.from); - return user && connectors.getGroupMemberUsers(context.user, obj.groupUID); + let user = await authentifiers.member(context.bindUser, args.from); + return user && connectors.getGroupMemberUsers(context.bindUser, obj.groupUID); }, // speaker queries allRequests: async function(obj, args, context){ let res = []; - let user = authentifiers.admin(context.user, args.from); + let user = authentifiers.admin(context.bindUser, args.from); if(user){ res = res.concat(await connectors.getUserJoinGroupRequests(user, args.from)); } @@ -128,11 +133,11 @@ export const resolvers = { // @rights admin(obj.groupUID) UserJoinGroup: { user : (obj, args, context) => { - return connectors.getUser(context.user, obj.useruid); - /*return connectors.getUser(context.user, "quentin.gendre"); + return connectors.getUser(context.bindUser, obj.useruid); + /*return connectors.getUser(context.bindUser, "quentin.gendre"); if(obj.useruid === "anatole.romon"){ - return connectors.getUser(context.user, "anatole.romon").then(res => { - return connectors.getUser(context.user, "quentin.gendre"); + return connectors.getUser(context.bindUser, "anatole.romon").then(res => { + return connectors.getUser(context.bindUser, "quentin.gendre"); }); }else{ return new Promise( (resolve, reject) => { @@ -145,20 +150,20 @@ export const resolvers = { // @rights speaker(obj.groupUID) GroupJoinEvent : { event: (obj, args, context) => { - return connectors.getEvent(context.user, obj.eventuid); + return connectors.getEvent(context.bindUser, obj.eventuid); }, groupWantingToJoin: (obj, args, context) => { - return connectors.getGroup(context.user, obj.senderuid); + return connectors.getGroup(context.bindUser, obj.senderuid); } }, // @rights speaker(obj.groupUID) YourGroupHostEvent : { event: (obj, args, context) => { - return connectors.getEvent(context.user, obj.eventuid); + return connectors.getEvent(context.bindUser, obj.eventuid); }, sender: (obj, args, context) => { - return connectors.getGroup(context.user, obj.senderuid); + return connectors.getGroup(context.bindUser, obj.senderuid); } }, @@ -166,7 +171,7 @@ export const resolvers = { User : { groups : (obj, args, context) => { let result = Promise.all(obj.groups.map((grid) => { - return connectors.getSimpleGroup(context.user,grid); + return connectors.getSimpleGroup(context.bindUser,grid); })); return result.then(groups => { @@ -194,10 +199,23 @@ export const resolvers = { // Admin mutations createSubgroup: async function (obj, args, context){ - let user = authentifiers.admin(context.user, args.from); + let user = authentifiers.admin(context.bindUser, args.from); return user && connectors.createSubgroup(user, args); }, + login: function(obj, args, context) { + + const {username, password} = args; + const req = context.request; + + const result = authenticator({ username, password, req }); + result.then(value => { + console.log(`Token: ${value}`); + }); + + return result; + } + }, Message: { @@ -262,7 +280,7 @@ export const resolvers = { SimpleGroup: { members: (obj, args, context) => { - return connectors.utilisateur.listMembers(context.user,obj.uid); + return connectors.utilisateur.listMembers(context.bindUser,obj.uid); } }, diff --git a/src/graphql/typeDefs/actions.js b/src/graphql/typeDefs/actions.js index 6204df4e8e54f50cfb0cda08541bf631a51708ca..73ff5f66eb096403883e62169a89ea6f829b590c 100644 --- a/src/graphql/typeDefs/actions.js +++ b/src/graphql/typeDefs/actions.js @@ -92,8 +92,10 @@ const RootTypes = ` postEvent(from : String!, name: String, date: String): Event answerEventRequest(from : String, request: ID, accept : Boolean): Request - # User mutations - + # Log user into the API + login(username: String!, password: String!): String! + # Log user out of the API + logout(username: String!): Boolean leave(from : String!) : Boolean # Viewer mutations @@ -172,7 +174,6 @@ const subMutations = ` requestJoin: Group } - `; const subQueries = ` @@ -201,6 +202,10 @@ const subQueries = ` allAnnouncements: [Announcement] } + + """ + Requête pour obtenir un utilisateur. + """ type UserQuery{ user(uid: ID) : User diff --git a/src/index.js b/src/index.js index ce145b2c2560740ae3823ea35be9a6d33128f95d..d7929d9739ea580e9c23d5eb61d7231ce4b1e46b 100644 --- a/src/index.js +++ b/src/index.js @@ -6,8 +6,8 @@ import app from './server'; import colors from 'colors'; import passport from 'passport'; -let port = process.env.PORT || 3000; +const port = process.env.PORT || 3000; app.listen(port, () => { - console.log(colors.blue(`Express server listening on port ${port}`)); + console.log(colors.blue(`Express server listening on port ${port}.`)); }); diff --git a/src/server.js b/src/server.js index 259e6497d400cdc352e74acbade9acee8d818bf4..e557c632707249399ba1171537aacc7f8b726b40 100644 --- a/src/server.js +++ b/src/server.js @@ -19,7 +19,7 @@ import schema from './graphql/schema'; // packages pour adminview import { ensureLoggedIn } from 'connect-ensure-login'; import flash from 'connect-flash'; -import router from './admin_view/admin_router'; +import router from './admin_view/admin.router'; // packages pour l'authentification import passport from 'passport'; import session from 'express-session'; @@ -32,6 +32,7 @@ import morgan from 'morgan'; import path from 'path'; import fs from 'fs'; +import './config_passport'; const app = express(); // "The app object conventionally denotes the Express application" (https://expressjs.com/en/4x/api.html#app) @@ -137,7 +138,6 @@ app.use(cors(corsOptions)); // Config de passport pour l'authentification ldap. Ne fait que *configurer* passport (aucun passport.authenticate() n'est appele, par exemple) import './config_passport.js'; - //with custom callback: //http://www.passportjs.org/docs/authenticate/#custom-callback // http://toon.io/understanding-passportjs-authentication-flow/ @@ -208,14 +208,12 @@ app.post('/login', */ - - - /** * @desc API GRAPHQL */ -import { dn, passwd } from "../ldap_connexion_config.json"; // default user +import { dn, passwd } from "../ldap_connexion_config.json"; // default bind user +const environment = process.env.NODE_ENV || 'development'; app.use('/graphql', graphqlHTTP(async (req, res, params) => { @@ -244,8 +242,11 @@ app.use('/graphql', return { schema, - graphiql: true, // gives access to graphiql if request is detected to be from browser (je crois) - context: { user: { uid: uid, password: password } } // accessible in every single resolver as the third argument + graphiql: environment == 'development', // gives access to GraphiQL if req comes from browser (je crois) + context: { + request: req, + bindUser: { uid: uid, password: password } + } // accessible in every single resolver as the third argument }; }) ); diff --git a/webpack.config.js b/webpack.config.js index bf2c502c1a02c612ca52f159e07ff691b9a66488..47ae22d5d75574d81dfb3e76453e20a4d120b9af 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -15,15 +15,15 @@ const config = { publicPath: '/assets/', filename: 'bundle.js' }, + + devtool: 'source-map', externals: [nodeExternals()], module: { - rules: [{ test: /\.js$/, - exclude: /node_modules/, - use: [ 'eslint-loader' ] + use: ['eslint-loader'] },{ test: /\.css$/, use: ['style-loader', 'css-loader']