Correction + sujet eval et update session3

master
Juan 3 years ago
parent 65c81de4ef
commit c153385c40

@ -0,0 +1,167 @@
/*
Ecrire une API en node, tournant sur le port 8088,
permettant de vérifier qu'un utilisateur est existant dans une
base de donnée "sécurisée" dans laquelle le mot de passe est
stocké en MD5.
Les informations de connexion seront stockées en json.
Votre réponse sera sous forme d'un zip.
Elle contiendra au minimum :
- un fichier SQL pour la création de la base avec un utilisateur dédié
- un deuxième fichier SQL pour la création de la table et ajoutant un au moins un utilisateur à la table
- un fichier README indiquant comment installer votre projet et les routes disponibles
- un fichier package.json
- un fichier api.js contenant votre code Node
*/
// testing :
// https://mariadb.com/kb/en/nodejs-connector/
import http from 'http'; // to create server
import url from 'url'; // to parse url
import fs from 'fs'; // to load config
// https://www.npmjs.com/package/email-validator
// pour vérifier que le mail est un mail valid :
import validator from 'email-validator';
// pour valider le mot de passe
import md5 from 'md5';
// on ajoute la possibilité de require du json en objet
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const BASIC_API_PORT = 8088;
var config=null;
if(fs.existsSync(process.cwd() + '/config.json')){
config = require(process.cwd() + '/config.json');
}
else {
console.log('no config');
exit(0);
}
const mariadb = require('mariadb');
const { exit } = require('process');
const pool = mariadb.createPool({
host: config.DB_HOST,
port: config.DB_PORT,
user: config.DB_USR,
password:config.DB_PWD,
database: config.DB_NAME,
connectionLimit: 5,
});
//const server = http.createServer(function (req, resp) {
const app = http.createServer
(
async (req, res) =>
{
const parsedURL = url.parse(req.url, true);
let response_json = JSON.stringify({"up":false});
if(req.method === 'GET' && parsedURL.pathname.startsWith('/up'))
{
var cnx = null;
try
{
cnx=await pool.getConnection();
const tables_res = await cnx.query("SHOW TABLES");
if(tables_res.length > 0)
{
response_json = JSON.stringify({'up':true});
}
}
catch(err)
{
console.log(err);
res.statusCode = 400;
res.end(response_json);
if(cnx)
{
return cnx.end();
}
throw(err);
}
finally
{
res.statusCode = 200;
res.end(response_json);
if(cnx)
{
return cnx.end();
}
}
}
else if(req.method === 'POST' && parsedURL.pathname.startsWith('/check'))
{
console.log("checking :");
let responseString = "";
req.on('data', function (varposted) {
responseString += varposted;
}).on('end', async function () {
if(responseString.indexOf('?')<0) {
responseString = '?'+responseString;
}
let parsedData = url.parse(responseString, true);
console.log("ParsedData", parsedData);
let response_content = {'up':false,'emailtocheck':''};
if(parsedData.query['email'] && parsedData.query['password']) {
response_content.emailtocheck = parsedData.query['email'];
response_content.hashedpassword = md5(parsedData.query['password']);
if(validator.validate(response_content.emailtocheck))
{
cnx=await pool.getConnection();
//let query="SELECT * FROM users WHERE courriel = '" + response_content.emailtocheck +"'";
let query="SELECT * FROM users WHERE courriel = ? AND mot_de_passe = ?";
console.log('query : ',query,' with ? = ', response_content.emailtocheck);
const email_res = await cnx.query(query, [response_content.emailtocheck, response_content.hashedpassword]);
if(email_res.length > 0)
{
response_content.up=true;
response_content.emailValid=true;
}
else
{
response_content.up=true;
response_content.emailValid=false;
response_content.error='Not Found';
response_content.error_code=404;
}
res.statusCode = 200;
res.end(JSON.stringify(response_content));
if(cnx)
{
return cnx.end();
}
}
else {
response_content.up=true;
response_content.emailValid=false;
response_content.error='I\'m a teapot';
response_content.error_code=418;
res.statusCode = 200;
res.end(JSON.stringify(response_content));
}
}
else {
response_content.up=true;
response_content.emailValid=false;
response_content.emailtocheck=parsedData.query['email'];
response_content.error='Invalid query mail or password do match requirements';
response_content.error_code=400;
res.statusCode = 200;
res.end(JSON.stringify(response_content));
}
});
}
else
{
res.statusCode = 400;
res.end("API Endpoint Not Supported");
}
}
);
app.listen(BASIC_API_PORT);
console.log('mariadb test api started');

@ -0,0 +1,7 @@
{
"DB_HOST" : "127.0.0.1",
"DB_PORT" : "3306",
"DB_USR" : "eval_user",
"DB_PWD" : "ov62p67t7PId9N3",
"DB_NAME" : "eval_bdd"
}

@ -0,0 +1,12 @@
CREATE DATABASE IF NOT EXISTS `eval_bdd`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
GRANT USAGE ON *.* TO "eval_user"@"localhost" IDENTIFIED BY "ov62p67t7PId9N3"
WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
GRANT USAGE ON *.* TO "eval_user"@"%" IDENTIFIED BY "ov62p67t7PId9N3"
WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
GRANT ALL PRIVILEGES ON `eval_bdd`.* TO 'eval_user'@'%';
GRANT ALL PRIVILEGES ON `eval_bdd`.* TO 'eval_user'@'localhost';

@ -0,0 +1,129 @@
/*
Ecrire une API en node, tournant sur le port 8088,
permettant de vérifier qu'un utilisateur est existant dans une
base de donnée "sécurisée" dans laquelle le mot de passe est
stocké en MD5.
Les informations de connexion seront stockées en json.
Votre réponse sera sous forme d'un zip.
Elle contiendra au minimum :
- un fichier SQL pour la création de la base avec un utilisateur dédié
- un deuxième fichier SQL pour la création de la table et ajoutant un au moins un utilisateur à la table
- un fichier README indiquant comment installer votre projet et les routes disponibles
- un fichier package.json
- un fichier api.js contenant votre code Node
*/
// testing :
// https://mariadb.com/kb/en/nodejs-connector/
const http = require ('http'); // to create server
const url = require('url'); // to parse url
const fs = require('fs'); // to load config
const BASIC_API_PORT = 8088;
var config=null;
if(fs.existsSync(process.cwd() + '/config.json')){
config = require(process.cwd() + '/config.json');
}
else {
console.log('no config');
}
const mariadb = require('mariadb');
const { exit } = require('process');
const pool = mariadb.createPool({
host: config.DB_HOST,
port: config.DB_PORT,
user: config.DB_USR,
password:config.DB_PWD,
database: config.DB_NAME,
connectionLimit: 5,
});
//const server = http.createServer(function (req, resp) {
const app = http.createServer
(
async (req, res) =>
{
const parsedURL = url.parse(req.url, true);
var response_json = JSON.stringify({"up":false});
if(req.method === 'GET' && parsedURL.pathname.startsWith('/up'))
{
var cnx = null;
try
{
cnx=await pool.getConnection();
const tables_res = await cnx.query("SHOW TABLES");
if(tables_res.length > 0)
{
response_json = JSON.stringify({'up':true});
}
}
catch(err)
{
console.log(err);
res.statusCode = 400;
res.end(response_json);
if(cnx)
{
return cnx.end();
}
throw(err);
}
finally
{
res.statusCode = 200;
res.end(response_json);
if(cnx)
{
return cnx.end();
}
}
}
else if(req.method === 'POST' && parsedURL.pathname.startsWith('/check'))
{
console.log("checking :");
responseString = "?";
req.on('data', function (varposted) {
responseString += varposted;
}).on('end', async function () {
parsedData = url.parse(responseString, true);
console.log("ParsedData", parsedData);
let response_content = {'up':false,'emailtocheck':''};
if(parsedData.query['email']) {
response_content.emailtocheck = parsedData.query['email'];
cnx=await pool.getConnection();
let query="SELECT * FROM users WHERE courriel = '"+ response_content.emailtocheck +"'";
console.log(query);
const email_res = await cnx.query(query);
if(email_res.length > 0)
{
response_content.up=true;
response_content.emailValid=true;
}
else
{
response_content.up=true;
response_content.emailValid=false;
}
res.statusCode = 200;
res.end(JSON.stringify(response_content));
if(cnx)
{
return cnx.end();
}
}
});
}
else
{
res.statusCode = 400;
res.end("API Endpoint Not Supported");
}
}
);
app.listen(BASIC_API_PORT);
console.log('mariadb test api started');

@ -0,0 +1,7 @@
{
"DB_HOST" : "127.0.0.1",
"DB_PORT" : "3306",
"DB_USR" : "eval_user",
"DB_PWD" : "ov62p67t7PId9N3",
"DB_NAME" : "eval_bdd"
}

@ -0,0 +1,16 @@
{
"name": "eval",
"version": "1.0.0",
"description": "",
"main": "front.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"mariadb": "^3.0.0",
"md5": "^2.3.0",
"node-fetch": "^3.2.6"
}
}

@ -0,0 +1,74 @@
/*
Faire un site en node, tourant sur le port 80.
Le site permet de saisir un email et un mot de passe dans un formulaire.
En retour de soumission du formulaire le site affichera l'email, la chaine MD5 du mot de passe, et l'heure+date de la tentative connexion.
*/
/*
Votre réponse sera sous forme d'un zip.
Elle contiendra au minimum :
- un fichier README indiquant comment installer votre projet et les routes disponibles
- un fichier package.json
- un fichier front.js contenant votre code Node
*/
import http from 'http';
import * as url from 'url';
// npm i md5
// https://www.npmjs.com/package/md5
import md5 from 'md5';
function outputHTML5(status, response, content, title)
{
response.writeHead(status, { 'Content-Type': 'text/html; charset=utf-8' });
response.write(
`
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>${title}</title>
<style type="text/css">*{ font-family: sans-serif }</style>
</head>
<body>
${content}
</body>
</html>
`
);
response.end();
}
var server = http.createServer(function (request, response) {
if(request.url === "/" && request.method==="GET") {
let formHtml = "<form method='post' action='/'>";
formHtml += "<label for='email'>Email</label><input id='email' type='email' value='' name='email' />";
formHtml += "<br/><label for='password'>Mot de passe</label><input id='password' type='password' value='' name='password' />";
formHtml += "<br/><button type='submit'>aller !</button>"
formHtml += "</form>";
outputHTML5(200,response,formHtml,"login");
}
else if(request.url === "/" && request.method==="POST") {
let responseHTML ="informations saisies : ";
let responseString = "?";
request.on('data', function (varposted) {
responseHTML += varposted;
responseString += varposted;
}).on('end', function () {
let parsedData = url.parse(responseString, true);
console.log("ParsedData", parsedData);
Object.keys(parsedData.query).forEach(function(key) {
var value=parsedData.query[key];
if(key==='password') {
value=md5(value);
}
responseHTML+= "<br/>"+key+" : "+value;
});
outputHTML5(200,response,responseHTML,"login");
});
} else {
outputHTML5(404,response,'Y\'a rien ici',"Oups");
}
});
server.listen(80);

@ -0,0 +1,85 @@
/*
Modifier votre front (code fait à la section 2) pour qu'il interroge
l'API et indique à l'utilisateur si il existe en base de données
Elle contiendra au minimum :
- un fichier README indiquant comment installer votre projet et les routes disponibles
- un fichier package.json
- un fichier index.js contenant votre code Node
*/
import http from 'http';
import * as url from "url";
// npm i node-fetch
// https://www.npmjs.com/package/node-fetch
import fetch from 'node-fetch';
function outputHTML5(status, response, content, title)
{
response.writeHead(status, { 'Content-Type': 'text/html; charset=utf-8' });
response.write(
`
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>${title}</title>
<style type="text/css">*{ font-family: sans-serif }</style>
</head>
<body>
${content}
</body>
</html>
`
);
response.end();
}
var server = http.createServer(function (request, response) {
if(request.url === "/" && request.method==="GET") {
let formHtml = "<form method='post' action='/'>";
formHtml += "<label for='email'>Email</label><input id='email' type='email' value='' name='email' />";
formHtml += "<br/><label for='password'>Mot de passe</label><input id='password' type='password' value='' name='password' />";
formHtml += "<br/><button type='submit'>aller !</button>"
formHtml += "</form>";
outputHTML5(200,response,formHtml,"login");
}
else if(request.url === "/" && request.method==="POST") {
let responseString = "/?";
console.log("In post");
request.on('data', function (varposted) {
responseString += varposted;
}).on('end', async function () {
let parsedData = url.parse(responseString, true);
if(parsedData.query['email']) {
console.log('got' + parsedData.query['email'])
fetch('http://localhost:8088/check',
{
method:'POST',
body:responseString
}
)
.then(apiresponse =>
apiresponse.json()
)
.then( json => {
if(json.emailValid) {
outputHTML5(200,response,'Ok ! Connexion possible :)',"Cool!");
}
else {
outputHTML5(200,response,"Cet mail n'existe pas ou le mot de passe ne correspond pas à l'email","Zut!");
}
})
.catch(err => {
console.log(err);
outputHTML5(500,response,'Y\'a eu un souci',"Oups!");
});
}
});
} else {
outputHTML5(404,response,'Y\'a rien ici',"Oups");
}
});
server.listen(80);

@ -0,0 +1,18 @@
{
"type": "module",
"name": "eval",
"version": "1.0.0",
"description": "",
"main": "front.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"email-validator": "^2.0.4",
"mariadb": "^3.0.0",
"md5": "^2.3.0",
"node-fetch": "^3.2.6"
}
}

@ -0,0 +1,11 @@
Bonjour à tous,
Voici le sujet pour ce matin :
https://forms.gle/DMdrnCPvyN9WYJMr8
J'essaye de rester disponible sur teams si vous avez des questions.
Je ferme la possiblité de soumettre des réponse à 12h30.
Commencer donc à relire / préparer vos zips à 12h15.
Bon courage !

@ -0,0 +1,46 @@
-- phpMyAdmin SQL Dump
-- version 5.1.1
-- https://www.phpmyadmin.net/
--
-- Hôte : 127.0.0.1
-- Généré le : mer. 22 juin 2022 à 15:33
-- Version du serveur : 10.4.19-MariaDB
-- Version de PHP : 7.4.20
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Base de données : `eval_bdd`
--
-- --------------------------------------------------------
--
-- Structure de la table `users`
--
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`courriel` varchar(255) NOT NULL,
`mot_de_passe` varchar(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Déchargement des données de la table `users`
--
TRUNCATE `users`;
INSERT INTO `users` (`courriel`, `mot_de_passe`) VALUES
('test@test.Fr', MD5('be1b4'));
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

@ -0,0 +1,24 @@
{
"development": {
"config_id": "development",
"app_name": "conf-test",
"app_desc": "An app to test environnement variables",
"node_port": 3000,
"json_indentation": 4,
"database": "nodesandbox_env-dev"
},
"testing": {
"config_id": "testing",
"database": "nodesandbox_env-tst"
},
"staging": {
"config_id": "staging - local",
"node_port": 8080,
"database": "nodesandbox_env-stage"
},
"production": {
"config_id": "production",
"node_port": 8080,
"database": "nodesandbox_env"
}
}

@ -0,0 +1,12 @@
{
"name": "jsonconfig",
"version": "1.0.0",
"description": "simple js on config test",
"main": "server.js",
"scripts": {
"start": "node server.js production users=5",
"dev" : "nodemon server.js development"
},
"author": "",
"license": "ISC"
}
Loading…
Cancel
Save