From 2cea15f3fe7599779769b7ae868d6eeb51672f6a Mon Sep 17 00:00:00 2001 From: Fabien Lamarque Date: Thu, 4 Jul 2024 14:45:11 +0000 Subject: [PATCH 1/2] Introduis un adaptateur de journalisation Co-authored-by: Emmanuel Gaillot --- server.js | 8 ++--- src/adaptateurs/journal.js | 5 +++ src/api/connexionFCPlus.js | 10 ++++-- src/routes/routesAuth.js | 14 ++++---- src/siteVitrine.js | 2 ++ test/api/connexionFCPlus.spec.js | 56 ++++++++++++++++++++++---------- test/routes/serveurTest.js | 7 ++++ 7 files changed, 71 insertions(+), 31 deletions(-) create mode 100644 src/adaptateurs/journal.js diff --git a/server.js b/server.js index 2340f55..005669c 100644 --- a/server.js +++ b/server.js @@ -2,6 +2,7 @@ const SiteVitrine = require('./src/siteVitrine'); const adaptateurChiffrement = require('./src/adaptateurs/adaptateurChiffrement'); const adaptateurEnvironnement = require('./src/adaptateurs/adaptateurEnvironnement'); const adaptateurFranceConnectPlus = require('./src/adaptateurs/adaptateurFranceConnectPlus'); +const journal = require('./src/adaptateurs/journal'); const FabriqueSessionFCPlus = require('./src/modeles/fabriqueSessionFCPlus'); const Middleware = require('./src/routes/middleware'); @@ -16,15 +17,12 @@ const serveur = SiteVitrine.creeServeur({ adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, }); const port = process.env.PORT || 3000; serveur.ecoute(port, () => { - /* eslint-disable no-console */ - - console.log(`Le site vitrine est démarré et écoute le port ${port} !…`); - - /* eslint-enable no-console */ + journal.consigne(`Le site vitrine est démarré et écoute le port ${port} !…`); }); diff --git a/src/adaptateurs/journal.js b/src/adaptateurs/journal.js new file mode 100644 index 0000000..4229127 --- /dev/null +++ b/src/adaptateurs/journal.js @@ -0,0 +1,5 @@ +/* eslint-disable no-console */ +const consigne = console.log; +/* eslint-enable no-console */ + +module.exports = { consigne }; diff --git a/src/api/connexionFCPlus.js b/src/api/connexionFCPlus.js index e63ec9b..39563df 100644 --- a/src/api/connexionFCPlus.js +++ b/src/api/connexionFCPlus.js @@ -1,7 +1,12 @@ const { stockeDansCookieSession } = require('../routes/utils'); const connexionFCPlus = (config, code, requete, reponse) => { - const { adaptateurChiffrement, adaptateurEnvironnement, fabriqueSessionFCPlus } = config; + const { + adaptateurChiffrement, + adaptateurEnvironnement, + fabriqueSessionFCPlus, + journal, + } = config; const secret = adaptateurEnvironnement.secretJetonSession(); @@ -13,8 +18,9 @@ const connexionFCPlus = (config, code, requete, reponse) => { return stockeDansCookieSession(infos, adaptateurChiffrement, requete); })) .then(() => reponse.render('redirectionNavigateur', { destination: '/' })) - .catch(() => { + .catch((e) => { requete.session.jeton = undefined; + journal.consigne(`Échec authentification (${e.message})`); reponse.render('redirectionNavigateur', { destination: '/auth/fcplus/destructionSession' }); }); }; diff --git a/src/routes/routesAuth.js b/src/routes/routesAuth.js index 410d67f..dd5a90e 100644 --- a/src/routes/routesAuth.js +++ b/src/routes/routesAuth.js @@ -11,6 +11,7 @@ const routesAuth = (config) => { adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, } = config; @@ -56,12 +57,13 @@ const routesAuth = (config) => { (...args) => middleware.verifieTamponUnique(...args), (requete, reponse) => { const { code } = requete.query; - connexionFCPlus( - { adaptateurChiffrement, adaptateurEnvironnement, fabriqueSessionFCPlus }, - code, - requete, - reponse, - ); + const adaptateurs = { + adaptateurChiffrement, + adaptateurEnvironnement, + fabriqueSessionFCPlus, + journal, + }; + connexionFCPlus(adaptateurs, code, requete, reponse); }, ); diff --git a/src/siteVitrine.js b/src/siteVitrine.js index 9fc84d6..b465ae1 100644 --- a/src/siteVitrine.js +++ b/src/siteVitrine.js @@ -10,6 +10,7 @@ const creeServeur = (config) => { adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, } = config; let serveur; @@ -35,6 +36,7 @@ const creeServeur = (config) => { adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, })); diff --git a/test/api/connexionFCPlus.spec.js b/test/api/connexionFCPlus.spec.js index 458fca8..c311366 100644 --- a/test/api/connexionFCPlus.spec.js +++ b/test/api/connexionFCPlus.spec.js @@ -4,7 +4,13 @@ describe('Le requêteur de connexion FC+', () => { const adaptateurChiffrement = {}; const adaptateurEnvironnement = {}; const fabriqueSessionFCPlus = {}; - const config = { adaptateurChiffrement, adaptateurEnvironnement, fabriqueSessionFCPlus }; + const journal = {}; + const config = { + adaptateurChiffrement, + adaptateurEnvironnement, + fabriqueSessionFCPlus, + journal, + }; const requete = {}; const reponse = {}; @@ -15,6 +21,7 @@ describe('Le requêteur de connexion FC+', () => { fabriqueSessionFCPlus.nouvelleSession = () => Promise.resolve({ enJSON: () => Promise.resolve({}), }); + journal.consigne = () => {}; requete.session = {}; reponse.render = () => Promise.resolve(); reponse.status = () => reponse; @@ -39,25 +46,38 @@ describe('Le requêteur de connexion FC+', () => { .then(() => expect(requete.session.jeton).toBeUndefined()); }); - it('redirige vers la destruction de session FC+ si le nonce retourné est différent du nonce en session', () => { - expect.assertions(2); - adaptateurChiffrement.verifieJeton = () => Promise.resolve({ nonce: 'unNonce' }); + describe('quand nonce retourné diffère du nonce en session', () => { + beforeEach(() => { + adaptateurChiffrement.verifieJeton = () => Promise.resolve({ nonce: 'unNonce' }); - requete.session.jeton = { nonce: 'abcde' }; - fabriqueSessionFCPlus.nouvelleSession = () => Promise.resolve({ - enJSON: () => Promise.resolve({ nonce: 'oups' }), + requete.session.jeton = { nonce: 'abcde' }; + fabriqueSessionFCPlus.nouvelleSession = () => Promise.resolve({ + enJSON: () => Promise.resolve({ nonce: 'oups' }), + }); + }); + + it("journalise l'erreur", () => { + expect.assertions(1); + + journal.consigne = (entree) => { expect(entree).toBe('Échec authentification (nonce invalide)'); }; + + return connexionFCPlus(config, 'unCode', requete, reponse); }); - reponse.render = (nomModelePage, { destination }) => { - try { - expect(nomModelePage).toBe('redirectionNavigateur'); - expect(destination).toBe('/auth/fcplus/destructionSession'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - return connexionFCPlus(config, 'unCode', requete, reponse); + it('redirige vers la destruction de session FC+', () => { + expect.assertions(2); + + reponse.render = (nomModelePage, { destination }) => { + try { + expect(nomModelePage).toBe('redirectionNavigateur'); + expect(destination).toBe('/auth/fcplus/destructionSession'); + return Promise.resolve(); + } catch (e) { + return Promise.reject(e); + } + }; + + return connexionFCPlus(config, 'unCode', requete, reponse); + }); }); }); diff --git a/test/routes/serveurTest.js b/test/routes/serveurTest.js index 84c5723..b061027 100644 --- a/test/routes/serveurTest.js +++ b/test/routes/serveurTest.js @@ -6,6 +6,7 @@ const serveurTest = () => { let adaptateurEnvironnement; let adaptateurFranceConnectPlus; let fabriqueSessionFCPlus; + let journal; let middleware; let serveur; @@ -44,6 +45,10 @@ const serveurTest = () => { nouvelleSession: () => Promise.resolve({ enJSON: () => Promise.resolve({}) }), }; + journal = { + consigne: () => {}, + }; + middleware = new MiddlewareFantaisie({}); serveur = OOTS_FRANCE.creeServeur({ @@ -51,6 +56,7 @@ const serveurTest = () => { adaptateurEnvironnement, adaptateurFranceConnectPlus, fabriqueSessionFCPlus, + journal, middleware, }); @@ -65,6 +71,7 @@ const serveurTest = () => { adaptateurFranceConnectPlus: () => adaptateurFranceConnectPlus, arrete, fabriqueSessionFCPlus: () => fabriqueSessionFCPlus, + journal: () => journal, initialise, middleware: () => middleware, port, From 9f8d821bdd7b3697502f15560605d3579c0f95cd Mon Sep 17 00:00:00 2001 From: Fabien Lamarque Date: Thu, 4 Jul 2024 14:54:58 +0000 Subject: [PATCH 2/2] Utilise le framework de log Diary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (https://github.com/maraisr/diary?tab=readme-ov-file#-benchmark) Il s'agit d'une première étape, on mettra un logger un peu plus sophistiqué dès qu'on en aura trouvé un qui nous plaît. Co-authored-by: Emmanuel Gaillot --- package-lock.json | 6 ++++++ package.json | 1 + server.js | 2 ++ src/adaptateurs/journal.js | 9 +++++---- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 363ab8e..747a08b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "axios": "^1.6.0", "cookie-session": "^2.1.0", + "diary": "^0.4.5", "express": "^4.19.2", "jose": "^5.2.0", "nodemon": "^3.0.1", @@ -2257,6 +2258,11 @@ "node": ">=8" } }, + "node_modules/diary": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/diary/-/diary-0.4.5.tgz", + "integrity": "sha512-dUtG/AVG5bt9Mi+23TgTvjZ0NDJaszjs1GpYooM5cbEzk2xoqdvxCOlVw0xkenQXZw/DFxp23tj5VkP6YmlRmw==" + }, "node_modules/diff-sequences": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", diff --git a/package.json b/package.json index ce2bdf2..99b97c9 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "dependencies": { "axios": "^1.6.0", "cookie-session": "^2.1.0", + "diary": "^0.4.5", "express": "^4.19.2", "jose": "^5.2.0", "nodemon": "^3.0.1", diff --git a/server.js b/server.js index 005669c..c5671e2 100644 --- a/server.js +++ b/server.js @@ -12,6 +12,8 @@ const fabriqueSessionFCPlus = new FabriqueSessionFCPlus({ }); const middleware = new Middleware({ adaptateurChiffrement, adaptateurEnvironnement }); +journal.active(); + const serveur = SiteVitrine.creeServeur({ adaptateurChiffrement, adaptateurEnvironnement, diff --git a/src/adaptateurs/journal.js b/src/adaptateurs/journal.js index 4229127..9c4b3f7 100644 --- a/src/adaptateurs/journal.js +++ b/src/adaptateurs/journal.js @@ -1,5 +1,6 @@ -/* eslint-disable no-console */ -const consigne = console.log; -/* eslint-enable no-console */ +const { enable, info } = require('diary'); -module.exports = { consigne }; +const active = () => enable('*'); +const consigne = info; + +module.exports = { active, consigne };