From 9887a6f445bb2571810c309d9dc51f67f3c11802 Mon Sep 17 00:00:00 2001 From: doctor Date: Wed, 27 Sep 2023 01:10:25 +0200 Subject: [PATCH] unstable update --- app/assets/js/custom.js | 66 ++++++++- app/index.js | 135 +++++++----------- app/package-lock.json | 309 ++++++++++++++++++++++++++++++++++++++++ app/package.json | 4 + mariadb/rappaurio.sql | 10 +- 5 files changed, 438 insertions(+), 86 deletions(-) diff --git a/app/assets/js/custom.js b/app/assets/js/custom.js index 856f5b7..dc130f3 100644 --- a/app/assets/js/custom.js +++ b/app/assets/js/custom.js @@ -402,11 +402,11 @@ $(document).ready(function () { // Mettez à jour la section HTML avec les données reçues ici - // Rediriger l'utilisateur vers la page de connexion - window.location.href = "/connexion"; + // Rediriger l'utilisateur vers la page de connexion + window.location.href = "/connexion"; + - }, error: function (error) { @@ -420,6 +420,65 @@ $(document).ready(function () { }); }); + // Sélectionnez le formulaire de CONNEXION par son ID + $('#formulaire-inscription').submit(function (e) { + + + // Empêchez la soumission normale du formulaire + e.preventDefault(); + + + // Reste du code pour gérer la soumission du formulaire + //console.log('Formulaire soumis !'); + + // Récupérez les valeurs des champs du formulaire + const name = $('#name').val(); + const email = $('#email').val(); + const password = $('#password').val(); + + // Créez un objet JavaScript avec les données à envoyer au serveur + const formData = { + name: name, + email: email, + password: password + }; + + // Utilisez AJAX pour envoyer les données au serveur + $.ajax({ + type: 'GET', + url: '/connexion', + data: formData, + dataType: 'json', + success: function (response) { + console.log(response); + + // Vérifiez si la réponse contient le token (utilisez la clé appropriée) + if (response.token) { + // Récupérez le token de la réponse JSON + const token = response.token; + + console.log(token); + + // Définissez le cookie avec un chemin approprié + // Par exemple, le chemin '/' signifie que le cookie est valide pour tout le site + document.cookie = `token=${token}`; + } else { + console.error('Token non trouvé dans la réponse JSON.'); + } + + // Mettez à jour la section HTML avec les données reçues ici + + }, + error: function (error) { + console.error('Erreur :', error); + + // Ajoutez une console.log pour vérifier si cette partie du code est exécutée + console.log('Erreur AJAX'); + } + }); + + }); + }); @@ -609,3 +668,4 @@ $(document).ready(function () { + diff --git a/app/index.js b/app/index.js index 4d0508c..4ff8302 100644 --- a/app/index.js +++ b/app/index.js @@ -1,13 +1,7 @@ -// === Liens utiles pour gestion users - -// https://jasonwatmore.com/post/2018/11/28/nodejs-role-based-authorization-tutorial-with-example-api - -// https://github.com/cornflourblue/node-role-based-authorization-api/tree/master - -// --------------------------------------------------- - const express = require('express'); const exphbs = require('express-handlebars'); +const session = require('express-session'); +const MySQLStore = require('connect-mysql')(session); const path = require('path'); const cookieParser = require('cookie-parser'); const axios = require('axios'); @@ -19,7 +13,10 @@ const morgan = require('morgan'); app.use(morgan('dev')); const mysql = require('mysql2'); const dotenv = require('dotenv'); -dotenv.config({ path: '../.env' }); +const jwt = require('jsonwebtoken'); +// get config vars +dotenv.config(); + // Configuration du moteur de modèle Handlebars @@ -33,25 +30,15 @@ app.use(express.static(path.join(__dirname, '/'))); // Utilisation de cookie-parser comme middleware app.use(cookieParser()); -// Middleware pour gérer le thème basé sur le cookie - -/* -app.use((req, res, next) => { - if (req.cookies.theme === 'dark') { - // Si le cookie "theme" est défini sur "dark", ajoutez la classe "dark" au - res.locals.theme = 'dark'; - } else { - // Sinon, retirez la classe "dark" - res.locals.theme = ''; - } - next(); -}); -*/ - // Middleware body-parser pour traiter les données POST du formulaire app.use(bodyParser.urlencoded({ extended: false })); -// ================ FONCTIONS ============================== +// ============================= FONCTIONS ======================================================== + +// Génère un token +function generateAccessToken(username) { + return jwt.sign(username, process.env.TOKEN_SECRET, { expiresIn: '1800s' }); +} // Fonction de nettoyage personnalisée (pour infobox) function cleanInfoboxText(text) { @@ -70,6 +57,8 @@ function cleanInfoboxText(text) { return finalText.trim(); } + + // Fonction pour récupérer les informations d'un article depuis l'API MediaWiki async function fetchArticleInfoFromAPI(articleTitle) { try { @@ -116,7 +105,8 @@ async function fetchArticleInfoFromAPI(articleTitle) { const page_data = await wiki.page(articleTitle); const parsed = page_data.parse(); - const variablesExclues = ['image', 'blason', 'drapeau', 'logo', 'légende', 'carte', 'légende-carte', 'Site-Internet', 'siteweb', '_', 'statut', 1, 2, 3, 4, 5, 6, 7, 8, 9]; + // Filtre des données compliquée à représentée + const variablesExclues = ['image', 'blason', 'drapeau', 'logo', 'légende', 'carte', 'légende-carte', '_', 'statut', 1, 2, 3, 4, 5, 6, 7, 8, 9]; // Lire les modèles Infobox, les convertir en JSON. parsed.each('template', (template_token) => { @@ -198,7 +188,7 @@ async function fetchArticleInfoFromAPI(articleTitle) { return articleInfo; } } else { - console.log(`Warning :l'article "${articleTitle}" n'a pas été trouvé.`); + console.log(`Warning : l'article "${articleTitle}" n'a pas été trouvé.`); return null; } } catch (error) { @@ -207,17 +197,14 @@ async function fetchArticleInfoFromAPI(articleTitle) { } } -// ===================== ROUTES ========================== +// ============================= ROUTES =========================================================== // Index app.get('/', async (req, res) => { - // Renvoyez la page index avec les informations de l'article et de l'infobox res.render('contains/index', { pageTitle: 'Accueil' }); - }); - // Comparaison d'articles app.post('/search', async (req, res) => { try { @@ -248,22 +235,16 @@ app.post('/connexion', async (req, res) => { // Récupérez les données du formulaire depuis req.body const ClientEmail = req.body.email; const ClientPassword = req.body.password; - console.log("Succès : " + ClientEmail + " " + ClientPassword); + //console.log("Succès : " + ClientEmail + " " + ClientPassword); // config de la connexion à la BDD var connection = mysql.createConnection({ host: 'localhost', - //user: process.env.MYSQL_USER, - //password: process.env.MYSQL_PASSWORD, - //database: process.env.MYSQL_DB - user: 'radar', - password: 'changeme', - database: 'rappaurio' + user: process.env.MYSQL_USER, + password: process.env.MYSQL_PASSWORD, + database: process.env.MYSQL_DB }); - const conn = await connection(); - const [rows] = await conn.execute('SELECT * FROM media'); - // Connexion à la BDD connection.connect(function (err) { if (err) { @@ -280,7 +261,7 @@ app.post('/connexion', async (req, res) => { } // Vérification si l'utilisateur est correct - let ValidationConnection = 'NON'; + let ValidationConnection = ''; for (const row of results) { const BddEmail = row.email; @@ -288,12 +269,32 @@ app.post('/connexion', async (req, res) => { if (BddEmail === ClientEmail && BddPassword === ClientPassword) { ValidationConnection = 'OK'; - break; // Sortez de la boucle dès que vous avez trouvé une correspondance + break; // Sort de la boucle dès qu'il y a une correspondance } } - // Renvoyez la réponse au format JSON - res.json({ ValidationConnection }); + if (ValidationConnection !== 'OK') { + ValidationConnection = 'WrongID'; + } + else { + const token = generateAccessToken({ username: ClientEmail }); + //console.log(token); + + res.json({token}); + + connection.query("INSERT INTO sessions (session_id, email) VALUES (?, ?)", [token, ClientEmail], (err, results, fields) => { + if (err) { + console.error('Erreur lors de l\'exécution de la requête :', err); + throw err; + } + }); + + + } + + + + // Fermeture de la BDD connection.end(function (err) { @@ -311,7 +312,6 @@ app.post('/connexion', async (req, res) => { } }); - // Inscription app.get('/inscription', (req, res) => { res.render('contains/signup', { pageTitle: 'Inscription' }); @@ -327,12 +327,9 @@ app.post('/inscription', async (req, res) => { // config de la connexion à la BDD var connection = mysql.createConnection({ host: 'localhost', - //user: process.env.MYSQL_USER, - //password: process.env.MYSQL_PASSWORD, - //database: process.env.MYSQL_DB - user: 'radar', - password: 'changeme', - database: 'rappaurio' + user: process.env.MYSQL_USER, + password: process.env.MYSQL_PASSWORD, + database: process.env.MYSQL_DB }); // Connexion à la BDD @@ -348,7 +345,6 @@ app.post('/inscription', async (req, res) => { console.error('Erreur lors de l\'exécution de la requête :', err); throw err; } - //console.log('Résultats de la requête :', results); let ValidationInscription = ''; @@ -357,23 +353,18 @@ app.post('/inscription', async (req, res) => { if (BddEmail === ClientEmail) { ValidationInscription = 'Doublon'; - break; // Sort de la boucle dès qu'il y à une correspondance + break; // Sort de la boucle dès qu'il y a une correspondance } - } if (ValidationInscription !== 'Doublon') { - - // Requète BDD qui insert les données + // Requète BDD qui insère les données connection.query("INSERT INTO User (name, email, password) VALUES (?, ?, ?)", [name, ClientEmail, ClientPassword], (err, results, fields) => { if (err) { console.error('Erreur lors de l\'exécution de la requête :', err); throw err; } - //console.log('Résultats de la requête :', results); - }); - ValidationInscription = 'OK'; } console.log(ValidationInscription); @@ -386,9 +377,7 @@ app.post('/inscription', async (req, res) => { console.log('Connexion à la base de données fermée.'); } }); - }); - } }); } catch (error) { @@ -396,39 +385,21 @@ app.post('/inscription', async (req, res) => { } }); - - // Historique app.get('/historique', (req, res) => { res.render('contains/historique', { pageTitle: 'Historique' }); }); - -/* EXEMPLE UTILISATION COOKIE - -// Changer le thème en fonction de la case cochée -app.post('/toggle-theme', (req, res) => { - if (req.cookies.theme === 'dark') { - // Si le thème est actuellement "dark", changez-le en "light" - res.cookie('theme', 'light', { sameSite: 'None', secure: true }); - } else { - // Sinon, changez-le en "dark" - res.cookie('theme', 'dark', { sameSite: 'None', secure: true }); - } - res.redirect(req.get('referer')); -}); -*/ - - // 404 app.use((req, res, next) => { res.status(404).render('contains/404', { title: 'Erreur 404' }); }); +// ============================= PORT ============================================================ -// ======================== PORT =========================== +// Port const PORT = process.env.PORT || 5000; app.listen(PORT, () => { console.log(`Info : le serveur est en écoute sur le port ${PORT}`); diff --git a/app/package-lock.json b/app/package-lock.json index 20d4279..118c536 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -11,11 +11,15 @@ "dependencies": { "axios": "^1.5.0", "body-parser": "^1.20.2", + "connect-mysql": "^4.0.0", "cookie-parser": "^1.4.6", + "crypto": "^1.0.1", "dotenv": "^16.3.1", "express": "^4.18.2", "express-handlebars": "^7.1.2", + "express-session": "^1.17.3", "hbs": "^4.2.0", + "jsonwebtoken": "^9.0.2", "morgan": "^1.10.0", "mysql2": "^3.6.1", "wikiapi": "^1.19.4", @@ -86,6 +90,17 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -122,6 +137,19 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -153,6 +181,11 @@ "balanced-match": "^1.0.0" } }, + "node_modules/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": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -216,6 +249,18 @@ "node": ">= 0.8" } }, + "node_modules/connect-mysql": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/connect-mysql/-/connect-mysql-4.0.0.tgz", + "integrity": "sha512-aqXUaWEqi7KujGSmETMey2bzbw1+qCH/v4ZYMjRCut6lJN+rv77+jxzFh+ONYOH9yorVlCmH+ZRbtG4LfQV1WA==", + "dependencies": { + "kruptein": "^2.0.7", + "mysql": "^2.18.1" + }, + "engines": { + "node": ">6" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -260,6 +305,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cross-fetch": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", @@ -281,6 +331,12 @@ "node": ">= 8" } }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -338,6 +394,14 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -423,6 +487,32 @@ "node": ">=v16" } }, + "node_modules/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -765,6 +855,11 @@ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -787,6 +882,97 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "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", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kruptein": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/kruptein/-/kruptein-2.2.3.tgz", + "integrity": "sha512-BTwprBPTzkFT9oTugxKd3WnWrX630MqUDsnmBuoa98eQs12oD4n4TeI0GbpdGcYn/73Xueg2rfnw+oK4dovnJg==", + "dependencies": { + "asn1.js": "^5.4.1" + }, + "engines": { + "node": ">6" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", @@ -851,6 +1037,11 @@ "node": ">= 0.6" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, "node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -912,6 +1103,33 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/mysql/node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mysql2": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.1.tgz", @@ -1063,6 +1281,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1094,6 +1317,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1116,6 +1347,25 @@ "node": ">= 0.8" } }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1140,6 +1390,31 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -1259,6 +1534,19 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -1378,6 +1666,17 @@ "node": ">=0.8.0" } }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -1386,6 +1685,11 @@ "node": ">= 0.8" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -1548,6 +1852,11 @@ "engines": { "node": ">=8" } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/app/package.json b/app/package.json index 0211b4e..1385bb5 100644 --- a/app/package.json +++ b/app/package.json @@ -16,11 +16,15 @@ "dependencies": { "axios": "^1.5.0", "body-parser": "^1.20.2", + "connect-mysql": "^4.0.0", "cookie-parser": "^1.4.6", + "crypto": "^1.0.1", "dotenv": "^16.3.1", "express": "^4.18.2", "express-handlebars": "^7.1.2", + "express-session": "^1.17.3", "hbs": "^4.2.0", + "jsonwebtoken": "^9.0.2", "morgan": "^1.10.0", "mysql2": "^3.6.1", "wikiapi": "^1.19.4", diff --git a/mariadb/rappaurio.sql b/mariadb/rappaurio.sql index 04f9429..1359e2d 100644 --- a/mariadb/rappaurio.sql +++ b/mariadb/rappaurio.sql @@ -22,9 +22,17 @@ CREATE TABLE Search ( FOREIGN KEY (id_user) REFERENCES User(id_user) ); +-- Créer la table "sessions" +CREATE TABLE Sessions ( + session_id VARCHAR(255) NOT NULL PRIMARY KEY, + email VARCHAR(255) NOT NULL +); + +--DROP USER 'radar'@'%'; + -- Créer l'utilsateur CREATE USER IF NOT EXISTS 'radar'@'%' IDENTIFIED BY 'changeme'; - +SET PASSWORD FOR 'radar'@'%' = PASSWORD('changeme'); -- Donne les droits à l'utilisateur pour la BDD spécifiée dans le .env GRANT ALL PRIVILEGES ON rappaurio.* TO 'radar'@'%';