From 692cc4f26d9bcdbbed326e3dea625994b6bc6dd1 Mon Sep 17 00:00:00 2001 From: Emmanuel Gaillot Date: Thu, 23 May 2024 16:09:21 +0200 Subject: [PATCH] =?UTF-8?q?D=C3=A9porte=20code=20site=20vitrine=20vers=20u?= =?UTF-8?q?n=20projet=20=C3=A0=20part?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Cf. https://github.com/numerique-gouv/vitrine-eidas) Co-authored-by: Fabien Lamarque --- .env.oots.template | 10 -- .env.template | 2 - docker-compose.yml | 33 ---- mockFCPlus.js | 129 -------------- nginx.template/conf/nginx.conf | 31 ---- nginx.template/scripts/init-letsencrypt.sh | 80 --------- server.js | 13 -- src/adaptateurs/adaptateurChiffrement.js | 39 ----- src/adaptateurs/adaptateurEnvironnement.js | 28 --- .../adaptateurFranceConnectPlus.js | 47 ----- src/api/connexionFCPlus.js | 25 --- src/api/creationSessionFCPlus.js | 15 -- src/api/deconnexionFCPlus.js | 6 - src/api/destructionSessionFCPlus.js | 21 --- src/modeles/fabriqueSessionFCPlus.js | 36 ---- src/modeles/sessionFCPlus.js | 45 ----- src/ootsFrance.js | 18 +- src/routes/middleware.js | 16 -- src/routes/routesAuth.js | 93 ---------- src/routes/routesBase.js | 22 +-- src/vues/pageAccueil.mustache | 18 -- test/api/connexionFCPlus.spec.js | 39 ----- test/api/creationSessionFCPlus.spec.js | 130 -------------- test/api/deconnexionFCPlus.spec.js | 19 -- test/api/destructionSessionFCPlus.spec.js | 108 ------------ test/mocks/middleware.js | 16 -- test/modeles/fabriqueSessionFCPlus.spec.js | 52 ------ test/modeles/sessionFCPlus.spec.js | 135 -------------- test/routes/middleware.spec.js | 60 ------- test/routes/routesAuth.spec.js | 165 ------------------ test/routes/routesBase.spec.js | 53 ------ test/routes/serveurTest.js | 41 ----- 32 files changed, 5 insertions(+), 1540 deletions(-) delete mode 100644 mockFCPlus.js delete mode 100644 nginx.template/conf/nginx.conf delete mode 100755 nginx.template/scripts/init-letsencrypt.sh delete mode 100644 src/adaptateurs/adaptateurChiffrement.js delete mode 100644 src/adaptateurs/adaptateurFranceConnectPlus.js delete mode 100644 src/api/connexionFCPlus.js delete mode 100644 src/api/creationSessionFCPlus.js delete mode 100644 src/api/deconnexionFCPlus.js delete mode 100644 src/api/destructionSessionFCPlus.js delete mode 100644 src/modeles/fabriqueSessionFCPlus.js delete mode 100644 src/modeles/sessionFCPlus.js delete mode 100644 src/routes/middleware.js delete mode 100644 src/routes/routesAuth.js delete mode 100644 src/vues/pageAccueil.mustache delete mode 100644 test/api/connexionFCPlus.spec.js delete mode 100644 test/api/creationSessionFCPlus.spec.js delete mode 100644 test/api/deconnexionFCPlus.spec.js delete mode 100644 test/api/destructionSessionFCPlus.spec.js delete mode 100644 test/mocks/middleware.js delete mode 100644 test/modeles/fabriqueSessionFCPlus.spec.js delete mode 100644 test/modeles/sessionFCPlus.spec.js delete mode 100644 test/routes/middleware.spec.js delete mode 100644 test/routes/routesAuth.spec.js delete mode 100644 test/routes/routesBase.spec.js diff --git a/.env.oots.template b/.env.oots.template index ab683af..f31fab7 100644 --- a/.env.oots.template +++ b/.env.oots.template @@ -1,4 +1,3 @@ -AVEC_CONNEXION_FC_PLUS= # autorise connexion à FC Plus AVEC_ENVOI_COOKIE_SUR_HTTP= # autorise envoi du cookie de session par HTTP avec valeur true AVEC_REQUETE_PIECE_JUSTIFICATIVE= # active l'API /requete/pieceJustificative avec valeur true IDENTIFIANT_EIDAS= # identifiant eIDAS injecté dans les requêtes (tant qu'on ne sait pas le récupérer) @@ -10,14 +9,5 @@ SUFFIXE_IDENTIFIANTS_DOMIBUS= # suffixe à ajouter dans les trames EBMS, ex. oot TYPE_IDENTIFIANT_EXPEDITEUR_DOMIBUS= # type d'identifiant expéditeur Domibus URL_BASE_DOMIBUS= # URL instance Domibus, ex. https://domibus.gouv.fr -AVEC_AUTHENTIFICATION_EIDAS= # si renseigné à `true`, passe par le « bridge eIDAS » pour l'authentification -CLE_PRIVEE_JWK_EN_BASE64= # Cle privée utilisée pour déchiffrer les infos utilisateur provenant de eIDAS (données au format JWK, chiffrées en base64) -IDENTIFIANT_CLIENT_FCPLUS= # identifiant d'accès au serveur FC+ -SECRET_CLIENT_FCPLUS= # secret d'accès au serveur FC+ -SECRET_JETON_SESSION= # secret utilisé pour chiffrer et déchiffrer le jeton stocké dans le cookie de session -URL_CONFIGURATION_OPEN_ID_FCPLUS= # URL accès aux informations de configuration Open ID de FranceConnect+ -URL_REDIRECTION_CONNEXION= # URL redirection après authentification FranceConnect+ -URL_REDIRECTION_DECONNEXION= # URL redirection après destruction session FranceConnect+ - LOGIN_API_REST= # Login utilisé pour accéder à l'API REST de DOMIBUS MOT_DE_PASSE_API_REST= # Mot de passe utilisé pour accéder à l'API REST de DOMIBUS diff --git a/.env.template b/.env.template index 0bfe46d..be3a5d5 100644 --- a/.env.template +++ b/.env.template @@ -1,4 +1,2 @@ PORT_DOMIBUS= # port d'accès à la console Domibus (depuis la machine hôte) -PORT_MOCK_FCPLUS= # port d'accès au mock FC plus PORT_OOTS_FRANCE= # port sur lequel le serveur écoute -URL_BASE= # URL du serveur sur lequel les conteneurs sont instanciés (ex. https://example.com) diff --git a/docker-compose.yml b/docker-compose.yml index e4c6762..437105c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,47 +18,14 @@ services: <<: *configuration-base command: "npm run test:watch" - certbot: - image: certbot/certbot - container_name: certbot - volumes: - - ./nginx/certbot/conf:/etc/letsencrypt - - ./nginx/certbot/www:/var/www/certbot - depends_on: - - nginx - entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'" - - nginx: - image: nginx:mainline-alpine - restart: unless-stopped - ports: - - "80:80" - - "443:443" - volumes: - - ./nginx/conf:/etc/nginx/conf.d - - ./nginx/certbot/conf:/etc/letsencrypt - - ./nginx/certbot/www:/var/www/certbot - depends_on: - - web - command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'" - web: <<: *configuration-base command: "npx nodemon server.js" ports: - "${PORT_OOTS_FRANCE}:3000" depends_on: - - mock_fcplus - domibus - mock_fcplus: - <<: *configuration-base - command: "npx nodemon mockFCPlus.js" - ports: - - "${PORT_MOCK_FCPLUS}:4000" - environment: - - URL_BASE_MOCK_FCPLUS=${URL_BASE}:${PORT_MOCK_FCPLUS} - domibus: image: code.europa.eu:4567/edelivery/docker/domibus-tomcat9:5.0.4 <<: *env-domibus diff --git a/mockFCPlus.js b/mockFCPlus.js deleted file mode 100644 index 89c3dd3..0000000 --- a/mockFCPlus.js +++ /dev/null @@ -1,129 +0,0 @@ -const express = require('express'); -const jose = require('jose'); - -const adaptateurChiffrement = require('./src/adaptateurs/adaptateurChiffrement'); - -const JETON_CAS_SIGNATURE_INVALIDE = 'jetonCasSignatureInvalide'; - -const jwkValide = { - kty: 'RSA', - n: 'whYOFK2Ocbbpb_zVypi9SeKiNUqKQH0zTKN1-6fpCTu6ZalGI82s7XK3tan4dJt90ptUPKD2zvxqTzFNfx4HHHsrYCf2-FMLn1VTJfQazA2BvJqAwcpW1bqRUEty8tS_Yv4hRvWfQPcc2Gc3-_fQOOW57zVy-rNoJc744kb30NjQxdGp03J2S3GLQu7oKtSDDPooQHD38PEMNnITf0pj-KgDPjymkMGoJlO3aKppsjfbt_AH6GGdRghYRLOUwQU-h-ofWHR3lbYiKtXPn5dN24kiHy61e3VAQ9_YAZlwXC_99GGtw_NpghFAuM4P1JDn0DppJldy3PGFC0GfBCZASw', - e: 'AQAB', - d: 'VuVE_KEP6323WjpbBdAIv7HGahGrgGANvbxZsIhm34lsVOPK0XDegZkhAybMZHjRhp-gwVxX5ChC-J3cUpOBH5FNxElgW6HizD2Jcq6t6LoLYgPSrfEHm71iHg8JsgrqfUnGYFzMJmv88C6WdCtpgG_qJV1K00_Ly1G1QKoBffEs-v4fAMJrCbUdCz1qWto-PU-HLMEo-krfEpGgcmtZeRlDADh8cETMQlgQfQX2VWq_aAP4a1SXmo-j0cvRU4W5Fj0RVwNesIpetX2ZFz4p_JmB5sWFEj_fC7h5z2lq-6Bme2T3BHtXkIxoBW0_pYVnASC8P2puO5FnVxDmWuHDYQ', - p: '07rgXd_tLUhVRF_g1OaqRZh5uZ8hiLWUSU0vu9coOaQcatSqjQlIwLW8UdKv_38GrmpIfgcEVQjzq6rFBowUm9zWBO9Eq6enpasYJBOeD8EMeDK-nsST57HjPVOCvoVC5ZX-cozPXna3iRNZ1TVYBY3smn0IaxysIK-zxESf4pM', - q: '6qrE9TPhCS5iNR7QrKThunLu6t4H_8CkYRPLbvOIt2MgZyPLiZCsvdkTVSOX76QQEXt7Y0nTNua69q3K3Jhf-YOkPSJsWTxgrfOnjoDvRKzbW3OExIMm7D99fVBODuNWinjYgUwGSqGAsb_3TKhtI-Gr5ls3fn6B6oEjVL0dpmk', - dp: 'mHqjrFdgelT2OyiFRS3dAAPf3cLxJoAGC4gP0UoQyPocEP-Y17sQ7t-ygIanguubBy65iDFLeGXa_g0cmSt2iAzRAHrDzI8P1-pQl2KdWSEg9ssspjBRh_F_AiJLLSPRWn_b3-jySkhawtfxwO8Kte1QsK1My765Y0zFvJnjPws', - dq: 'KmjaV4YcsVAUp4z-IXVa5htHWmLuByaFjpXJOjABEUN0467wZdgjn9vPRp-8Ia8AyGgMkJES_uUL_PDDrMJM9gb4c6P4-NeUkVtreLGMjFjA-_IQmIMrUZ7XywHsWXx0c2oLlrJqoKo3W-hZhR0bPFTYgDUT_mRWjk7wV6wl46E', - qi: 'iYltkV_4PmQDfZfGFpzn2UtYEKyhy-9t3Vy8Mw2VHLAADKGwJvVK5ficQAr2atIF1-agXY2bd6KV-w52zR8rmZfTr0gobzYIyqHczOm13t7uXJv2WygY7QEC2OGjdxa2Fr9RnvS99ozMa5nomZBqTqT7z5QV33czjPRCjvg6FcE', -}; - -const jwkInvalide = { - kty: 'RSA', - n: 'y6CltudeoaMikeSwChFGWePEDUJevbb-pb2o0aDREQ_7jqfwUR6uCGU_eXmEfIor-f3afasfBmbpiKIHSPosUFSbpImkBoCwd5W8miSBwhWIxYIgUnsjGu4nfaM9i2NtHc4EGG8SM5yQd6i6Eb1q2KTbjwIzsPAMTwnrGmYmeFVZPK6wdtDYKuXzrmt6CcBZu3duG4Y0uhz-DhssVgZQZIMyn6mEnep-XsvKvRjNU7Gl26woWnHueIlcG0e4WaoPxbc5Xd1ZbT7Bu6M8N3FjHHS6FrXIqeYtrzJOtwDe37IOsuR4d87n_cNKf311fXK6iYYimoSOQwsSAG6WgalfNw', - e: 'AQAB', - d: 'W8BlKwcR0s9JEmfzEnY6NuK0Qi03t1AvacsNuHc3_PIwrVTqqgKi9FF6ymeA1QUFT72cp6dlcWMJs3Eeyzk-omudPgRvDicKXLfxpZrxhNxjJmu92Kx3YvkQfkIBxz7judxMaB4UG4FebyxtuvSYokmWTNf3JrDjOvIDJ4ADsZAlb3QXzJwRzKMzYMN6PAt5CW9CEPqR_nwu9p_zlUFtC4qDXitfmSpLO5quZTpDJrBYWsnHdj77pe3knqcjw8lTGLCojSDmCydbG7hkz3Xq31-eY0YFOPJgWcbQMkLiyF0y5GsF1CjRKFNywgfxljzRzEiLCs4Ihof0phkX-vqT4Q', - p: '8coKPaGjRE9q-xjVRLfAWpJ9aW6D6xUVGeC26jJu9D2nPyG3mpORzn72EtP_VxsHK7KQ4DnNgvT000-mSeiKkjufxTss7N2-TJUupkc0IJpr5QjDXP3fJcplJGyF6BgBVaUuJJWytRrrBrdQBtCKv5dNkhdDNZFhIB7TYPGs5ak', - q: '15htNxigCp5aq23f5507wKFamM_sOZSKYldTNod8XJOtnYXT1ZOY7AWUwHWIs3glU8xlw9GX1VJcWn9YGqe6rYgd_yxVglq2PR7vVhUuT7Dym0r5Z1Q605DAqh3tyVfFkegxYB0kNwmSw3LHvxsxCyXeaUOzeRO5oDM4SyXjad8', - dp: 'Eeh69bGhHBAdxldChIJvlsW-0C5FSwYWuAHyyknN-f0PBBgFN0eyxu6UXzSgdt0jnNLu9AyT8h0efQArOtIkYUxVOxB09V4_GAD8oYgojjmhwCb0AVE0U-I3t4jqKhSNFMDVOBR2Vf-WZLrzDG4puKMGNcnPSopn_S8LTOTZf3E', - dq: 'vuFNkQJUcBJT5IObQc2MIbi6JaGxXCmPfBIkspqyGKUHiff63ZWYRx-J2_wz0_ID2nWVhBIFg_Evo1AsCS2HsixZopr1-jumLec9r9GA9z2LDsMKndmNW9NFQVjONv1nBw-054vljHUFY9Yz05eXjG8yw7AVLpWwO44dwSsCdbE', - qi: 'tA3h9_ecg1pu9zenGhdkW9lY7HqU3a41ROPQxYVX8rVybgwiO7MlqBQmy2zgezB5NQfzIgeWMtgThemN5RiQ3bunGRBOHL9PFjMo_aGO3hZkj93EdoxZBiIlLwJX11yxmMBC05jojVR-2XjX9Eijs5xmFdrjkngmwlAhbYyz6M0', -}; - -const ootsJWK = JSON.parse(atob(process.env.CLE_PRIVEE_JWK_EN_BASE64)); - -const enJWE = (cleSignature, infos) => { - const headerJWT = { - alg: 'RS256', - }; - - const headerJWE = { - alg: 'RSA-OAEP', - enc: 'A256GCM', - cty: 'JWT', - kid: adaptateurChiffrement.cleHachage(ootsJWK.n), - iss: 'http://oots', - aud: process.env.IDENTIFIANT_CLIENT_FCPLUS, - }; - - return jose.importJWK(cleSignature) - .then((clePrivee) => new jose.SignJWT(infos) - .setProtectedHeader(headerJWT) - .setIssuedAt() - .setIssuer('http://mock_fcplus') - .setAudience(process.env.IDENTIFIANT_CLIENT_FCPLUS) - .setExpirationTime('1h') - .sign(clePrivee)) - .then((jwt) => jose.importJWK(ootsJWK) - .then((clePrivee) => new jose.CompactEncrypt(new TextEncoder().encode(jwt)) - .setProtectedHeader(headerJWE) - .encrypt(clePrivee))); -}; - -const port = 4000; -const app = express(); - -app.use(express.urlencoded({ extended: true })); - -app.get('/', (_requete, reponse) => { - reponse.json({ - authorization_endpoint: `${process.env.URL_BASE_MOCK_FCPLUS}/debut_session`, - end_session_endpoint: `${process.env.URL_BASE_MOCK_FCPLUS}/fin_session`, - jwks_uri: `${process.env.URL_BASE_MOCK_FCPLUS}/jwks`, - token_endpoint: `${process.env.URL_BASE_MOCK_FCPLUS}/jeton`, - userinfo_endpoint: `${process.env.URL_BASE_MOCK_FCPLUS}/userinfo`, - }); -}); - -app.get('/debut_session', (requete, reponse) => { - const etat = requete.params.state; - reponse.redirect(`${process.env.URL_REDIRECTION_CONNEXION}?state=${etat}&code=abcdef`); -}); - -app.get('/fin_session', (_requete, reponse) => { - reponse.redirect(process.env.URL_REDIRECTION_DECONNEXION); -}); - -app.post('/jeton', (requete, reponse) => { - const { code } = requete.body; - const jeton = (code === 'XXX') ? JETON_CAS_SIGNATURE_INVALIDE : 'unJeton'; - - enJWE(jwkValide, {}) - .then((jwe) => reponse.json({ access_token: jeton, id_token: jwe })); -}); - -app.get('/jwks', (_requete, reponse) => { - const { kty, n, e } = jwkValide; - - reponse.json({ - keys: [{ - use: 'sig', - kty, - n, - e, - }], - }); -}); - -app.get('/userinfo', (requete, reponse) => { - const jeton = requete.headers.authorization.match(/Bearer (.*)/)[1]; - const cleSignature = (jeton === JETON_CAS_SIGNATURE_INVALIDE) ? jwkInvalide : jwkValide; - - const envoieInfos = (infos) => enJWE(cleSignature, infos) - .then((jwe) => reponse.send(jwe)); - - envoieInfos({ - given_name: 'Anne-Juliette', - family_name: 'HAUDEBERT', - birthdate: '1962-08-24', - gender: 'female', - sub: '1234567890abcdef', - }); -}); - -app.listen(port, () => { - /* eslint-disable no-console */ - - console.log(`Mock FCPlus est démarré et écoute sur le port ${port} !…`); - - /* eslint-enable no-console */ -}); diff --git a/nginx.template/conf/nginx.conf b/nginx.template/conf/nginx.conf deleted file mode 100644 index 9152a04..0000000 --- a/nginx.template/conf/nginx.conf +++ /dev/null @@ -1,31 +0,0 @@ -server { - listen 80; - server_name example.com; - server_tokens off; - - location /.well-known/acme-challenge/ { - root /var/www/certbot; - } - - location / { - return 301 https://$host$request_uri; - } -} - -server { - listen 443 ssl; - server_name example.com; - server_tokens off; - - ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; - include /etc/letsencrypt/options-ssl-nginx.conf; - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - - location / { - proxy_pass http://web:3000; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } -} diff --git a/nginx.template/scripts/init-letsencrypt.sh b/nginx.template/scripts/init-letsencrypt.sh deleted file mode 100755 index f19041b..0000000 --- a/nginx.template/scripts/init-letsencrypt.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/bash - -if ! [ -x "$(command -v docker-compose)" ]; then - echo 'Error: docker-compose is not installed.' >&2 - exit 1 -fi - -domains=(example.com) -rsa_key_size=4096 -data_path="./nginx/certbot" -email="user@example.com" # Adding a valid address is strongly recommended -staging=0 # Set to 1 if you're testing your setup to avoid hitting request limits - -if [ -d "$data_path" ]; then - read -p "Existing data found for $domains. Continue and replace existing certificate? (y/N) " decision - if [ "$decision" != "Y" ] && [ "$decision" != "y" ]; then - exit - fi -fi - - -if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then - echo "### Downloading recommended TLS parameters ..." - mkdir -p "$data_path/conf" - curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf" - curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem" - echo -fi - -echo "### Creating dummy certificate for $domains ..." -path="/etc/letsencrypt/live/$domains" -mkdir -p "$data_path/conf/live/$domains" -docker-compose run --rm --entrypoint "\ - openssl req -x509 -nodes -newkey rsa:$rsa_key_size -days 1\ - -keyout '$path/privkey.pem' \ - -out '$path/fullchain.pem' \ - -subj '/CN=localhost'" certbot -echo - - -echo "### Starting nginx ..." -docker-compose up --force-recreate -d nginx -echo - -echo "### Deleting dummy certificate for $domains ..." -docker-compose run --rm --entrypoint "\ - rm -Rf /etc/letsencrypt/live/$domains && \ - rm -Rf /etc/letsencrypt/archive/$domains && \ - rm -Rf /etc/letsencrypt/renewal/$domains.conf" certbot -echo - - -echo "### Requesting Let's Encrypt certificate for $domains ..." -#Join $domains to -d args -domain_args="" -for domain in "${domains[@]}"; do - domain_args="$domain_args -d $domain" -done - -# Select appropriate email arg -case "$email" in - "") email_arg="--register-unsafely-without-email" ;; - *) email_arg="--email $email" ;; -esac - -# Enable staging mode if needed -if [ $staging != "0" ]; then staging_arg="--staging"; fi - -docker-compose run --rm --entrypoint "\ - certbot certonly --webroot -w /var/www/certbot \ - $staging_arg \ - $email_arg \ - $domain_args \ - --rsa-key-size $rsa_key_size \ - --agree-tos \ - --force-renewal" certbot -echo - -echo "### Reloading nginx ..." -docker-compose exec nginx nginx -s reload diff --git a/server.js b/server.js index 39754be..8d30854 100644 --- a/server.js +++ b/server.js @@ -1,35 +1,22 @@ const EcouteurDomibus = require('./src/ecouteurDomibus'); const OOTS_FRANCE = require('./src/ootsFrance'); -const adaptateurChiffrement = require('./src/adaptateurs/adaptateurChiffrement'); const AdaptateurDomibus = require('./src/adaptateurs/adaptateurDomibus'); const adaptateurEnvironnement = require('./src/adaptateurs/adaptateurEnvironnement'); -const adaptateurFranceConnectPlus = require('./src/adaptateurs/adaptateurFranceConnectPlus'); const adaptateurUUID = require('./src/adaptateurs/adaptateurUUID'); -const FabriqueSessionFCPlus = require('./src/modeles/fabriqueSessionFCPlus'); const horodateur = require('./src/adaptateurs/horodateur'); const DepotPointsAcces = require('./src/depots/depotPointsAcces'); -const Middleware = require('./src/routes/middleware'); const adaptateurDomibus = AdaptateurDomibus({ adaptateurUUID, horodateur }); const depotPointsAcces = new DepotPointsAcces(adaptateurDomibus); const ecouteurDomibus = new EcouteurDomibus({ adaptateurDomibus, intervalleEcoute: 1000 }); -const fabriqueSessionFCPlus = new FabriqueSessionFCPlus({ - adaptateurChiffrement, - adaptateurFranceConnectPlus, -}); -const middleware = new Middleware({ adaptateurChiffrement, adaptateurEnvironnement }); const serveur = OOTS_FRANCE.creeServeur({ - adaptateurChiffrement, adaptateurDomibus, adaptateurEnvironnement, - adaptateurFranceConnectPlus, adaptateurUUID, depotPointsAcces, ecouteurDomibus, - fabriqueSessionFCPlus, horodateur, - middleware, }); const port = process.env.PORT || 3000; diff --git a/src/adaptateurs/adaptateurChiffrement.js b/src/adaptateurs/adaptateurChiffrement.js deleted file mode 100644 index 41bb2dc..0000000 --- a/src/adaptateurs/adaptateurChiffrement.js +++ /dev/null @@ -1,39 +0,0 @@ -const crypto = require('crypto'); -const jose = require('jose'); - -const adaptateurEnvironnement = require('./adaptateurEnvironnement'); -const { ErreurJetonInvalide } = require('../erreurs'); - -const cleHachage = (chaine) => crypto.createHash('md5').update(chaine).digest('hex'); - -const dechiffreJWE = (jwe) => jose - .importJWK(adaptateurEnvironnement.clePriveeJWK()) - .then((k) => jose.compactDecrypt(jwe, k)) - .then(({ plaintext }) => plaintext.toString()); - -const genereJeton = (donnees) => new jose.SignJWT(donnees) - .setProtectedHeader({ alg: 'HS256' }) - .sign(adaptateurEnvironnement.secretJetonSession()); - -const verifieJeton = (jeton, secret) => { - if (typeof jeton === 'undefined') { - return Promise.resolve(); - } - - return jose.jwtVerify(jeton, secret) - .then(({ payload }) => payload) - .catch((e) => Promise.reject(new ErreurJetonInvalide(e))); -}; - -const verifieSignatureJWTDepuisJWKS = (jwt, urlJWKS) => { - const jwks = jose.createRemoteJWKSet(new URL(urlJWKS)); - return verifieJeton(jwt, jwks); -}; - -module.exports = { - cleHachage, - dechiffreJWE, - genereJeton, - verifieJeton, - verifieSignatureJWTDepuisJWKS, -}; diff --git a/src/adaptateurs/adaptateurEnvironnement.js b/src/adaptateurs/adaptateurEnvironnement.js index 3b80d20..fb15e50 100644 --- a/src/adaptateurs/adaptateurEnvironnement.js +++ b/src/adaptateurs/adaptateurEnvironnement.js @@ -1,42 +1,14 @@ -const avecConnexionFCPlus = () => process.env.AVEC_CONNEXION_FC_PLUS === 'true'; - const avecEnvoiCookieSurHTTP = () => process.env.AVEC_ENVOI_COOKIE_SUR_HTTP === 'true'; const avecRequetePieceJustificative = () => process.env.AVEC_REQUETE_PIECE_JUSTIFICATIVE === 'true'; -const clePriveeJWK = () => JSON.parse(atob(process.env.CLE_PRIVEE_JWK_EN_BASE64)); - -const fournisseurIdentiteSuggere = () => (process.env.AVEC_AUTHENTIFICATION_EIDAS === 'true' ? 'eidas-bridge' : ''); - -const identifiantClient = () => process.env.IDENTIFIANT_CLIENT_FCPLUS; - const identifiantEIDAS = () => process.env.IDENTIFIANT_EIDAS; -const parametresRequeteJeton = () => ({ - client_id: process.env.IDENTIFIANT_CLIENT_FCPLUS, - client_secret: process.env.SECRET_CLIENT_FCPLUS, - redirect_uri: process.env.URL_REDIRECTION_CONNEXION, -}); - const secretJetonSession = () => new TextEncoder().encode(process.env.SECRET_JETON_SESSION); -const urlConfigurationOpenIdFCPlus = () => process.env.URL_CONFIGURATION_OPEN_ID_FCPLUS; - -const urlRedirectionConnexion = () => process.env.URL_REDIRECTION_CONNEXION; - -const urlRedirectionDeconnexion = () => process.env.URL_REDIRECTION_DECONNEXION; - module.exports = { avecEnvoiCookieSurHTTP, - avecConnexionFCPlus, avecRequetePieceJustificative, - clePriveeJWK, - fournisseurIdentiteSuggere, - identifiantClient, identifiantEIDAS, - parametresRequeteJeton, secretJetonSession, - urlConfigurationOpenIdFCPlus, - urlRedirectionConnexion, - urlRedirectionDeconnexion, }; diff --git a/src/adaptateurs/adaptateurFranceConnectPlus.js b/src/adaptateurs/adaptateurFranceConnectPlus.js deleted file mode 100644 index 7239a2f..0000000 --- a/src/adaptateurs/adaptateurFranceConnectPlus.js +++ /dev/null @@ -1,47 +0,0 @@ -const axios = require('axios'); -const adaptateurEnvironnement = require('./adaptateurEnvironnement'); - -const configurationOpenIdFranceConnectPlus = axios - .get(adaptateurEnvironnement.urlConfigurationOpenIdFCPlus()) - .then(({ data }) => data); - -const parametresRequeteJeton = (code) => Object.assign( - adaptateurEnvironnement.parametresRequeteJeton(), - { code, grant_type: 'authorization_code' }, -); - -const recupereDonneesJetonAcces = (code) => configurationOpenIdFranceConnectPlus - .then(({ token_endpoint: urlRecuperationJetonAcces }) => ( - axios.post( - urlRecuperationJetonAcces, - parametresRequeteJeton(code), - { headers: { 'content-type': 'application/x-www-form-urlencoded' } }, - ) - )) - .then(({ data }) => data); - -const recupereInfosUtilisateurChiffrees = (jetonAcces) => configurationOpenIdFranceConnectPlus - .then(({ userinfo_endpoint: urlRecuperationInfosUtilisateur }) => ( - axios.get( - urlRecuperationInfosUtilisateur, - { headers: { Authorization: `Bearer ${jetonAcces}` } }, - ) - )) - .then(({ data }) => data); - -const recupereURLClefsPubliques = () => configurationOpenIdFranceConnectPlus - .then(({ jwks_uri: url }) => url); - -const urlCreationSession = () => configurationOpenIdFranceConnectPlus - .then(({ authorization_endpoint: url }) => url); - -const urlDestructionSession = () => configurationOpenIdFranceConnectPlus - .then(({ end_session_endpoint: url }) => url); - -module.exports = { - recupereDonneesJetonAcces, - recupereInfosUtilisateurChiffrees, - recupereURLClefsPubliques, - urlCreationSession, - urlDestructionSession, -}; diff --git a/src/api/connexionFCPlus.js b/src/api/connexionFCPlus.js deleted file mode 100644 index fd8152f..0000000 --- a/src/api/connexionFCPlus.js +++ /dev/null @@ -1,25 +0,0 @@ -const stockeDansCookieSession = (infos, adaptateurChiffrement, requete) => adaptateurChiffrement - .genereJeton(infos) - .then((jwt) => { requete.session.jeton = jwt; }); - -const redirigeDepuisNavigateur = (destination, reponse) => reponse.send(` - - - - - -`); - -const connexionFCPlus = (config, code, requete, reponse) => { - const { adaptateurChiffrement, fabriqueSessionFCPlus } = config; - - requete.session.jeton = undefined; - - return fabriqueSessionFCPlus.nouvelleSession(code) - .then((session) => session.enJSON()) - .then((infos) => stockeDansCookieSession(infos, adaptateurChiffrement, requete)) - .then(() => redirigeDepuisNavigateur('/', reponse)) - .catch((e) => reponse.status(502).json({ erreur: `Échec authentification (${e.message})` })); -}; - -module.exports = connexionFCPlus; diff --git a/src/api/creationSessionFCPlus.js b/src/api/creationSessionFCPlus.js deleted file mode 100644 index 7d36da5..0000000 --- a/src/api/creationSessionFCPlus.js +++ /dev/null @@ -1,15 +0,0 @@ -const creationSessionFCPlus = (config, requete, reponse) => { - const { adaptateurChiffrement, adaptateurEnvironnement, adaptateurFranceConnectPlus } = config; - - const identifiantClient = adaptateurEnvironnement.identifiantClient(); - const urlRedirectionConnexion = adaptateurEnvironnement.urlRedirectionConnexion(); - const etat = adaptateurChiffrement.cleHachage(`${Math.random()}`); - const nonce = adaptateurChiffrement.cleHachage(`${Math.random()}`); - - return adaptateurFranceConnectPlus.urlCreationSession() - .then((url) => reponse.redirect( - `${url}?scope=profile%20openid&acr_values=eidas2&claims={%22id_token%22:{%22amr%22:{%22essential%22:true}}}&prompt=login%20consent&response_type=code&idp_hint=${adaptateurEnvironnement.fournisseurIdentiteSuggere()}&client_id=${identifiantClient}&redirect_uri=${urlRedirectionConnexion}&state=${etat}&nonce=${nonce}`, - )); -}; - -module.exports = creationSessionFCPlus; diff --git a/src/api/deconnexionFCPlus.js b/src/api/deconnexionFCPlus.js deleted file mode 100644 index d66c067..0000000 --- a/src/api/deconnexionFCPlus.js +++ /dev/null @@ -1,6 +0,0 @@ -const deconnexionFCPlus = (requete, reponse) => { - requete.session = null; - reponse.redirect('/'); -}; - -module.exports = deconnexionFCPlus; diff --git a/src/api/destructionSessionFCPlus.js b/src/api/destructionSessionFCPlus.js deleted file mode 100644 index 9819874..0000000 --- a/src/api/destructionSessionFCPlus.js +++ /dev/null @@ -1,21 +0,0 @@ -const destructionSessionFCPlus = (config, requete, reponse) => { - const { - adaptateurChiffrement, - adaptateurEnvironnement, - adaptateurFranceConnectPlus, - } = config; - - const { utilisateurCourant } = requete; - if (!utilisateurCourant) { return reponse.redirect('/auth/fcplus/deconnexion'); } - - const { jwtSessionFCPlus } = utilisateurCourant; - const etat = adaptateurChiffrement.cleHachage(`${Math.random()}`); - const urlRedirectionDeconnexion = adaptateurEnvironnement.urlRedirectionDeconnexion(); - - return adaptateurFranceConnectPlus.urlDestructionSession() - .then((url) => reponse.redirect( - `${url}?id_token_hint=${jwtSessionFCPlus}&state=${etat}&post_logout_redirect_uri=${urlRedirectionDeconnexion}`, - )); -}; - -module.exports = destructionSessionFCPlus; diff --git a/src/modeles/fabriqueSessionFCPlus.js b/src/modeles/fabriqueSessionFCPlus.js deleted file mode 100644 index dc85006..0000000 --- a/src/modeles/fabriqueSessionFCPlus.js +++ /dev/null @@ -1,36 +0,0 @@ -const SessionFCPlus = require('./sessionFCPlus'); - -class FabriqueSessionFCPlus { - constructor(config) { - this.config = config; - this.adaptateurChiffrement = config.adaptateurChiffrement; - this.adaptateurFranceConnectPlus = config.adaptateurFranceConnectPlus; - } - - peupleDonneesJetonAcces(code) { - const conserveJetonAcces = (jetonAcces) => { this.session.jetonAcces = jetonAcces; }; - - const conserveJWT = (jwe) => this.adaptateurChiffrement - .dechiffreJWE(jwe) - .then((jwt) => { this.session.jwt = jwt; }); - - const conserveURLClefsPubliques = () => this.adaptateurFranceConnectPlus - .recupereURLClefsPubliques() - .then((url) => { this.session.urlClefsPubliques = url; }); - - return this.adaptateurFranceConnectPlus.recupereDonneesJetonAcces(code) - .then((donnees) => Promise.all([ - conserveJetonAcces(donnees.access_token), - conserveJWT(donnees.id_token), - conserveURLClefsPubliques(), - ])); - } - - nouvelleSession(code) { - this.session = new SessionFCPlus(this.config); - return this.peupleDonneesJetonAcces(code) - .then(() => this.session); - } -} - -module.exports = FabriqueSessionFCPlus; diff --git a/src/modeles/sessionFCPlus.js b/src/modeles/sessionFCPlus.js deleted file mode 100644 index 6a8ad95..0000000 --- a/src/modeles/sessionFCPlus.js +++ /dev/null @@ -1,45 +0,0 @@ -const { ErreurEchecAuthentification } = require('../erreurs'); - -const leveErreurParametreManquant = (messageParamManquant) => ( - `${messageParamManquant}. La session a-t-elle bien été instanciée depuis la fabrique ?` -); - -class SessionFCPlus { - constructor(config) { - this.adaptateurChiffrement = config.adaptateurChiffrement; - this.adaptateurFranceConnectPlus = config.adaptateurFranceConnectPlus; - - this.jetonAcces = undefined; - this.jwt = undefined; - this.urlClefsPubliques = undefined; - } - - enJSON() { - if (!this.jwt) { - return Promise.reject(new Error(leveErreurParametreManquant('JWT non défini'))); - } - - if (!this.urlClefsPubliques) { - return Promise.reject(new Error(leveErreurParametreManquant('URL clefs publiques non définie'))); - } - - return this.infosUtilisateurDechiffrees() - .then((jwtInfosUtilisateur) => this.adaptateurChiffrement.verifieSignatureJWTDepuisJWKS( - jwtInfosUtilisateur, - this.urlClefsPubliques, - )) - .then((infosDechiffrees) => Object.assign(infosDechiffrees, { jwtSessionFCPlus: this.jwt })) - .catch((e) => Promise.reject(new ErreurEchecAuthentification(e.message))); - } - - infosUtilisateurDechiffrees() { - if (!this.jetonAcces) { - return Promise.reject(new Error(leveErreurParametreManquant('Jeton accès non défini'))); - } - - return this.adaptateurFranceConnectPlus.recupereInfosUtilisateurChiffrees(this.jetonAcces) - .then((jwe) => this.adaptateurChiffrement.dechiffreJWE(jwe)); - } -} - -module.exports = SessionFCPlus; diff --git a/src/ootsFrance.js b/src/ootsFrance.js index 5f5bbb6..d4158f9 100644 --- a/src/ootsFrance.js +++ b/src/ootsFrance.js @@ -3,23 +3,18 @@ const express = require('express'); const mustacheExpress = require('mustache-express'); const routesAdmin = require('./routes/routesAdmin'); -const routesAuth = require('./routes/routesAuth'); const routesBase = require('./routes/routesBase'); const routesEbms = require('./routes/routesEbms'); const routesRequete = require('./routes/routesRequete'); const creeServeur = (config) => { const { - adaptateurChiffrement, adaptateurDomibus, adaptateurEnvironnement, - adaptateurFranceConnectPlus, adaptateurUUID, depotPointsAcces, ecouteurDomibus, - fabriqueSessionFCPlus, horodateur, - middleware, } = config; let serveur; const app = express(); @@ -40,14 +35,6 @@ const creeServeur = (config) => { app.use('/admin', routesAdmin({ ecouteurDomibus })); - app.use('/auth', routesAuth({ - adaptateurChiffrement, - adaptateurEnvironnement, - adaptateurFranceConnectPlus, - fabriqueSessionFCPlus, - middleware, - })); - app.use('/ebms', routesEbms({ adaptateurUUID, horodateur })); app.use('/requete', routesRequete({ @@ -57,10 +44,7 @@ const creeServeur = (config) => { depotPointsAcces, })); - app.use('/', routesBase({ - adaptateurEnvironnement, - middleware, - })); + app.use('/', routesBase()); const arreteEcoute = (suite) => serveur.close(suite); diff --git a/src/routes/middleware.js b/src/routes/middleware.js deleted file mode 100644 index 680749d..0000000 --- a/src/routes/middleware.js +++ /dev/null @@ -1,16 +0,0 @@ -class Middleware { - constructor(config) { - this.adaptateurChiffrement = config.adaptateurChiffrement; - this.adaptateurEnvironnement = config.adaptateurEnvironnement; - } - - renseigneUtilisateurCourant(requete, _reponse, suite) { - const secret = this.adaptateurEnvironnement.secretJetonSession(); - return this.adaptateurChiffrement.verifieJeton(requete.session.jeton, secret) - .then((infosUtilisateur) => { requete.utilisateurCourant = infosUtilisateur; }) - .catch(() => { requete.utilisateurCourant = undefined; }) - .then(() => suite()); - } -} - -module.exports = Middleware; diff --git a/src/routes/routesAuth.js b/src/routes/routesAuth.js deleted file mode 100644 index 8674a1b..0000000 --- a/src/routes/routesAuth.js +++ /dev/null @@ -1,93 +0,0 @@ -const express = require('express'); - -const connexionFCPlus = require('../api/connexionFCPlus'); -const deconnexionFCPlus = require('../api/deconnexionFCPlus'); -const creationSessionFCPlus = require('../api/creationSessionFCPlus'); -const destructionSessionFCPlus = require('../api/destructionSessionFCPlus'); - -const routesAuth = (config) => { - const { - adaptateurChiffrement, - adaptateurEnvironnement, - adaptateurFranceConnectPlus, - fabriqueSessionFCPlus, - middleware, - } = config; - - const routes = express.Router(); - - routes.get('/cles_publiques', (_requete, reponse) => { - const { kty, n, e } = adaptateurEnvironnement.clePriveeJWK(); - const idClePublique = adaptateurChiffrement.cleHachage(n); - - const clePubliqueDansJWKSet = { - keys: [{ - kid: idClePublique, - use: 'enc', - kty, - e, - n, - }], - }; - - reponse.set('Content-Type', 'application/json'); - reponse.status(200) - .send(clePubliqueDansJWKSet); - }); - - routes.get('/fcplus/connexion', (requete, reponse) => { - const { code, state } = requete.query; - if (typeof state === 'undefined' || state === '') { - reponse.status(400).json({ erreur: "Paramètre 'state' absent de la requête" }); - } else if (typeof code === 'undefined' || code === '') { - reponse.status(400).json({ erreur: "Paramètre 'code' absent de la requête" }); - } else { - connexionFCPlus( - { adaptateurChiffrement, fabriqueSessionFCPlus }, - code, - requete, - reponse, - ); - } - }); - - routes.get('/fcplus/deconnexion', (requete, reponse) => ( - deconnexionFCPlus(requete, reponse) - )); - - routes.get('/fcplus/destructionSession', (...args) => middleware.renseigneUtilisateurCourant(...args), (requete, reponse) => { - if (adaptateurEnvironnement.avecConnexionFCPlus()) { - destructionSessionFCPlus( - { - adaptateurChiffrement, - adaptateurEnvironnement, - adaptateurFranceConnectPlus, - }, - requete, - reponse, - ); - } else { - reponse.status(501).send('Not Implemented Yet!'); - } - }); - - routes.get('/fcplus/creationSession', (requete, reponse) => { - if (adaptateurEnvironnement.avecConnexionFCPlus()) { - creationSessionFCPlus( - { - adaptateurChiffrement, - adaptateurEnvironnement, - adaptateurFranceConnectPlus, - }, - requete, - reponse, - ); - } else { - reponse.status(501).send('Not Implemented Yet!'); - } - }); - - return routes; -}; - -module.exports = routesAuth; diff --git a/src/routes/routesBase.js b/src/routes/routesBase.js index 5e5a3fe..52648b9 100644 --- a/src/routes/routesBase.js +++ b/src/routes/routesBase.js @@ -1,25 +1,11 @@ const express = require('express'); -const routesBase = (config) => { - const { - adaptateurEnvironnement, - middleware, - } = config; - +const routesBase = () => { const routes = express.Router(); - routes.get( - '/', - (...args) => middleware.renseigneUtilisateurCourant(...args), - (requete, reponse) => { - const infosUtilisateur = requete.utilisateurCourant; - const avecConnexionFCPlus = adaptateurEnvironnement.avecConnexionFCPlus(); - reponse.render('pageAccueil', { - infosUtilisateur, - avecConnexionFCPlus, - }); - }, - ); + routes.get('/', (_requete, reponse) => { + reponse.send('OOTS-France'); + }); return routes; }; diff --git a/src/vues/pageAccueil.mustache b/src/vues/pageAccueil.mustache deleted file mode 100644 index aecf2cd..0000000 --- a/src/vues/pageAccueil.mustache +++ /dev/null @@ -1,18 +0,0 @@ - - -OOTS-France - -{{#avecConnexionFCPlus}} -{{#infosUtilisateur}} -

Utilisateur courant : {{given_name}} {{family_name}}

- Déconnexion -{{/infosUtilisateur}} -{{^infosUtilisateur}} -

Pas d'utilisateur courant

- Connexion -{{/infosUtilisateur}} -{{/avecConnexionFCPlus}} - -{{^avecConnexionFCPlus}} -

Pas d'utilisateur courant

-{{/avecConnexionFCPlus}} diff --git a/test/api/connexionFCPlus.spec.js b/test/api/connexionFCPlus.spec.js deleted file mode 100644 index 75db5eb..0000000 --- a/test/api/connexionFCPlus.spec.js +++ /dev/null @@ -1,39 +0,0 @@ -const connexionFCPlus = require('../../src/api/connexionFCPlus'); - -describe('Le requêteur de connexion FC+', () => { - const adaptateurChiffrement = {}; - const fabriqueSessionFCPlus = {}; - const config = { adaptateurChiffrement, fabriqueSessionFCPlus }; - const requete = {}; - const reponse = {}; - - beforeEach(() => { - adaptateurChiffrement.genereJeton = () => Promise.resolve(); - fabriqueSessionFCPlus.nouvelleSession = () => Promise.resolve({ - enJSON: () => Promise.resolve({}), - }); - requete.session = {}; - reponse.json = () => Promise.resolve(); - reponse.redirect = () => Promise.resolve(); - reponse.status = () => reponse; - }); - - it('conserve les infos utilisateurs dans un cookie de session', () => { - adaptateurChiffrement.genereJeton = () => Promise.resolve('XXX'); - - expect(requete.session.jeton).toBeUndefined(); - return connexionFCPlus(config, 'unCode', requete, reponse) - .then(() => expect(requete.session.jeton).toBe('XXX')); - }); - - it('supprime le jeton déjà en session sur erreur récupération infos', () => { - fabriqueSessionFCPlus.nouvelleSession = () => Promise.resolve({ - enJSON: () => Promise.reject(new Error('oups')), - }); - adaptateurChiffrement.genereJeton = () => Promise.resolve('abcdef'); - - requete.session.jeton = 'unJeton'; - return connexionFCPlus(config, 'unCode', requete, reponse) - .then(() => expect(requete.session.jeton).toBeUndefined()); - }); -}); diff --git a/test/api/creationSessionFCPlus.spec.js b/test/api/creationSessionFCPlus.spec.js deleted file mode 100644 index 1847643..0000000 --- a/test/api/creationSessionFCPlus.spec.js +++ /dev/null @@ -1,130 +0,0 @@ -const creationSessionFCPlus = require('../../src/api/creationSessionFCPlus'); - -describe('Le requêteur de création de session FC+', () => { - const adaptateurChiffrement = {}; - const adaptateurEnvironnement = {}; - const adaptateurFranceConnectPlus = {}; - const config = { adaptateurChiffrement, adaptateurEnvironnement, adaptateurFranceConnectPlus }; - const reponse = {}; - - const requete = {}; - - beforeEach(() => { - adaptateurChiffrement.cleHachage = () => ''; - adaptateurEnvironnement.fournisseurIdentiteSuggere = () => ''; - adaptateurEnvironnement.identifiantClient = () => ''; - adaptateurEnvironnement.urlRedirectionConnexion = () => ''; - adaptateurFranceConnectPlus.urlCreationSession = () => Promise.resolve(''); - }); - - it('redirige vers serveur France Connect Plus', () => { - expect.assertions(1); - adaptateurFranceConnectPlus.urlCreationSession = () => Promise.resolve('http://example.com'); - - reponse.redirect = (url) => { - try { - expect(url).toMatch(/^http:\/\/example\.com\?/); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - return creationSessionFCPlus(config, requete, reponse); - }); - - it('ajoute des paramètres à la requête', () => { - expect.assertions(6); - - reponse.redirect = (url) => { - try { - expect(url).toContain('scope=profile%20openid'); - expect(url).toContain('acr_values=eidas2'); - expect(url).toContain('claims={%22id_token%22:{%22amr%22:{%22essential%22:true}}}'); - expect(url).toContain('prompt=login%20consent'); - expect(url).toContain('response_type=code'); - expect(url).toContain('idp_hint='); - - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - return creationSessionFCPlus(config, requete, reponse); - }); - - it("ajoute l'identifiant client FC+ en paramètre", () => { - expect.assertions(1); - - adaptateurEnvironnement.identifiantClient = () => '12345'; - - reponse.redirect = (url) => { - try { - expect(url).toContain('client_id=12345'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - return creationSessionFCPlus(config, requete, reponse); - }); - - it("ajoute l'URL de redirection post-login en paramètre", () => { - expect.assertions(1); - - adaptateurEnvironnement.urlRedirectionConnexion = () => 'http://example.com'; - - reponse.redirect = (url) => { - try { - expect(url).toContain('redirect_uri=http://example.com'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - return creationSessionFCPlus(config, requete, reponse); - }); - - it('ajoute un état et un nonce en paramètres de la requête', () => { - expect.assertions(2); - let nbClesGenerees = 0; - - adaptateurChiffrement.cleHachage = () => { - nbClesGenerees += 1; - return `12345-${nbClesGenerees}`; - }; - - reponse.redirect = (url) => { - try { - expect(url).toContain('state=12345-1'); - expect(url).toContain('nonce=12345-2'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - return creationSessionFCPlus(config, requete, reponse); - }); - - describe('Si utilisation bridge eIDAS', () => { - it('renseigne le paramètre `idp_hint` avec la valeur `eidas-bridge`', () => { - expect.assertions(1); - adaptateurEnvironnement.fournisseurIdentiteSuggere = () => 'eidas-bridge'; - - reponse.redirect = (url) => { - try { - expect(url).toContain('idp_hint=eidas-bridge'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - return creationSessionFCPlus(config, requete, reponse); - }); - }); -}); diff --git a/test/api/deconnexionFCPlus.spec.js b/test/api/deconnexionFCPlus.spec.js deleted file mode 100644 index c8138d0..0000000 --- a/test/api/deconnexionFCPlus.spec.js +++ /dev/null @@ -1,19 +0,0 @@ -const deconnexionFCPlus = require('../../src/api/deconnexionFCPlus'); - -describe('Le requêteur de déconnexion FC+', () => { - const requete = {}; - const reponse = {}; - - beforeEach(() => { - requete.session = {}; - reponse.redirect = () => Promise.resolve(); - reponse.end = () => Promise.resolve(); - }); - - it('vide le cookie de session', () => { - requete.session.jeton = 'unJeton'; - - deconnexionFCPlus(requete, reponse); - expect(requete.session).toBe(null); - }); -}); diff --git a/test/api/destructionSessionFCPlus.spec.js b/test/api/destructionSessionFCPlus.spec.js deleted file mode 100644 index f05b148..0000000 --- a/test/api/destructionSessionFCPlus.spec.js +++ /dev/null @@ -1,108 +0,0 @@ -const destructionSessionFCPlus = require('../../src/api/destructionSessionFCPlus'); - -describe('Le requêteur de destruction de session FC+', () => { - const adaptateurChiffrement = {}; - const adaptateurEnvironnement = {}; - const adaptateurFranceConnectPlus = {}; - const config = { adaptateurChiffrement, adaptateurEnvironnement, adaptateurFranceConnectPlus }; - const reponse = {}; - - let requete = {}; - - beforeEach(() => { - adaptateurChiffrement.cleHachage = () => ''; - adaptateurEnvironnement.urlRedirectionDeconnexion = () => ''; - adaptateurFranceConnectPlus.urlDestructionSession = () => Promise.resolve(''); - requete = {}; - reponse.end = () => Promise.resolve(); - reponse.redirect = () => Promise.resolve(); - }); - - describe('quand le JWT de session FC+ existe', () => { - beforeEach(() => { - requete.utilisateurCourant = { jwtSessionFCPlus: '' }; - }); - - it('redirige vers serveur FC+', () => { - expect.assertions(1); - adaptateurFranceConnectPlus.urlDestructionSession = () => Promise.resolve('http://example.com'); - - reponse.redirect = (url) => { - try { - expect(url).toMatch(/^http:\/\/example\.com\?/); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - destructionSessionFCPlus(config, requete, reponse); - }); - - it('récupère le JWT de session FC+ stocké dans la session locale', () => { - expect.assertions(1); - - requete.utilisateurCourant = { jwtSessionFCPlus: 'abcdef' }; - reponse.redirect = (url) => { - try { - expect(url).toContain('id_token_hint=abcdef'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - destructionSessionFCPlus(config, requete, reponse); - }); - - it('ajoute un état en paramètre de la requête', () => { - expect.assertions(1); - adaptateurChiffrement.cleHachage = () => '12345'; - - reponse.redirect = (url) => { - try { - expect(url).toContain('state=12345'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - destructionSessionFCPlus(config, requete, reponse); - }); - - it("ajoute l'URL de redirection post-logout en paramètre de la requête", () => { - expect.assertions(1); - adaptateurEnvironnement.urlRedirectionDeconnexion = () => 'http://example.com'; - - reponse.redirect = (url) => { - try { - expect(url).toContain('post_logout_redirect_uri=http://example.com'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - destructionSessionFCPlus(config, requete, reponse); - }); - }); - - describe('Quand le JWT de session est inexistant', () => { - it('redirige vers `/auth/fcplus/deconnexion`', () => { - expect.assertions(2); - expect(requete.utilisateurCourant).toBeUndefined(); - - reponse.redirect = (url) => { - try { - expect(url).toBe('/auth/fcplus/deconnexion'); - return Promise.resolve(); - } catch (e) { - return Promise.reject(e); - } - }; - - destructionSessionFCPlus(config, requete, reponse); - }); - }); -}); diff --git a/test/mocks/middleware.js b/test/mocks/middleware.js deleted file mode 100644 index 03b1ab6..0000000 --- a/test/mocks/middleware.js +++ /dev/null @@ -1,16 +0,0 @@ -class MiddlewareFantaisie { - constructor(donnees) { - this.reinitialise(donnees); - } - - reinitialise({ utilisateurCourant }) { - this.utilisateurCourant = utilisateurCourant; - } - - renseigneUtilisateurCourant(requete, _reponse, suite) { - requete.utilisateurCourant = this.utilisateurCourant; - suite(); - } -} - -module.exports = MiddlewareFantaisie; diff --git a/test/modeles/fabriqueSessionFCPlus.spec.js b/test/modeles/fabriqueSessionFCPlus.spec.js deleted file mode 100644 index 3d31b66..0000000 --- a/test/modeles/fabriqueSessionFCPlus.spec.js +++ /dev/null @@ -1,52 +0,0 @@ -const FabriqueSessionFCPlus = require('../../src/modeles/fabriqueSessionFCPlus'); - -describe('La fabrique de session FC+', () => { - const adaptateurChiffrement = {}; - const adaptateurFranceConnectPlus = {}; - const config = { adaptateurChiffrement, adaptateurFranceConnectPlus }; - - beforeEach(() => { - adaptateurChiffrement.dechiffreJWE = () => Promise.resolve(''); - adaptateurFranceConnectPlus.recupereDonneesJetonAcces = () => Promise.resolve({}); - adaptateurFranceConnectPlus.recupereURLClefsPubliques = () => Promise.resolve(''); - }); - - it("conserve le jeton d'accès", () => { - adaptateurFranceConnectPlus.recupereDonneesJetonAcces = (code) => { - try { - expect(code).toBe('unCode'); - return Promise.resolve({ access_token: 'abcdef' }); - } catch (e) { - return Promise.reject(e); - } - }; - - const fabrique = new FabriqueSessionFCPlus(config); - return fabrique.nouvelleSession('unCode') - .then((session) => expect(session.jetonAcces).toBe('abcdef')); - }); - - it('conserve le JWT de la session FC+', () => { - adaptateurFranceConnectPlus.recupereDonneesJetonAcces = () => Promise.resolve({ id_token: '123' }); - adaptateurChiffrement.dechiffreJWE = (jwe) => { - try { - expect(jwe).toBe('123'); - return Promise.resolve('999'); - } catch (e) { - return Promise.reject(e); - } - }; - - const fabrique = new FabriqueSessionFCPlus(config); - return fabrique.nouvelleSession('unCode') - .then((session) => expect(session.jwt).toBe('999')); - }); - - it("conserve l'URL des clefs publiques FC+", () => { - adaptateurFranceConnectPlus.recupereURLClefsPubliques = () => Promise.resolve('http://example.com'); - - const fabrique = new FabriqueSessionFCPlus(config); - return fabrique.nouvelleSession('unCode') - .then((session) => expect(session.urlClefsPubliques).toBe('http://example.com')); - }); -}); diff --git a/test/modeles/sessionFCPlus.spec.js b/test/modeles/sessionFCPlus.spec.js deleted file mode 100644 index 6534811..0000000 --- a/test/modeles/sessionFCPlus.spec.js +++ /dev/null @@ -1,135 +0,0 @@ -const { ErreurEchecAuthentification } = require('../../src/erreurs'); -const SessionFCPlus = require('../../src/modeles/sessionFCPlus'); - -describe('Une session FranceConnect+', () => { - const adaptateurChiffrement = {}; - const adaptateurFranceConnectPlus = {}; - const config = { adaptateurChiffrement, adaptateurFranceConnectPlus }; - - beforeEach(() => { - adaptateurChiffrement.dechiffreJWE = () => Promise.resolve(''); - adaptateurChiffrement.verifieSignatureJWTDepuisJWKS = () => Promise.resolve({}); - adaptateurFranceConnectPlus.recupereInfosUtilisateurChiffrees = () => Promise.resolve(''); - }); - - const nouvelleSession = ({ - jetonAcces = 'unJetonAcces', - jwt = 'unJWT', - urlClefsPubliques = 'uneURL', - } = {}) => { - const session = new SessionFCPlus(config); - Object.assign(session, { jetonAcces, jwt, urlClefsPubliques }); - - return session; - }; - - describe('sur demande infos utilisateur déchiffrées', () => { - it('récupère les infos', () => { - adaptateurFranceConnectPlus.recupereInfosUtilisateurChiffrees = (jetonAcces) => { - try { - expect(jetonAcces).toBe('abcdef'); - return Promise.resolve('123'); - } catch (e) { - return Promise.reject(e); - } - }; - - adaptateurChiffrement.dechiffreJWE = (jwe) => { - try { - expect(jwe).toBe('123'); - return Promise.resolve('999'); - } catch (e) { - return Promise.reject(e); - } - }; - - const session = new SessionFCPlus(config, 'unCode'); - session.jetonAcces = 'abcdef'; - - return session.infosUtilisateurDechiffrees() - .then((jwt) => { - expect(jwt).toBe('999'); - }); - }); - - it("lève une erreur si le jeton d'accès n'est pas défini", () => { - expect.assertions(2); - - const session = nouvelleSession({ jetonAcces: '' }); - expect(session.jetonAcces).toBeFalsy(); - - return session.infosUtilisateurDechiffrees() - .catch((e) => expect(e.message).toBe('Jeton accès non défini. La session a-t-elle bien été instanciée depuis la fabrique ?')); - }); - }); - - describe('sur demande description données', () => { - it('vérifie la signature du JWT des infos utilisateur', () => { - let signatureVerifiee = false; - adaptateurChiffrement.verifieSignatureJWTDepuisJWKS = () => { - signatureVerifiee = true; - return Promise.resolve({}); - }; - - const session = nouvelleSession(); - return session.enJSON() - .then(() => expect(signatureVerifiee).toBe(true)); - }); - - it('ajoute le JWT de session aux infos utilisateur', () => { - adaptateurFranceConnectPlus.recupereInfosUtilisateurChiffrees = () => Promise.resolve('aaa'); - adaptateurChiffrement.dechiffreJWE = (jwe) => Promise.resolve(jwe); - adaptateurChiffrement.verifieSignatureJWTDepuisJWKS = (jwt, url) => { - try { - expect(jwt).toBe('aaa'); - expect(url).toBe('http://example.com'); - return Promise.resolve({ uneClef: 'uneValeur' }); - } catch (e) { - return Promise.reject(e); - } - }; - - const session = nouvelleSession({ jwt: '999', urlClefsPubliques: 'http://example.com' }); - - return session.enJSON() - .then((json) => expect(json).toEqual({ - uneClef: 'uneValeur', - jwtSessionFCPlus: '999', - })); - }); - - it('lève une `ErreurEchecAuthentification` si une erreur est rencontrée', () => { - expect.assertions(2); - - adaptateurFranceConnectPlus.recupereInfosUtilisateurChiffrees = () => Promise.reject(new Error('oups')); - - const session = nouvelleSession(); - - return session.enJSON() - .catch((e) => { - expect(e).toBeInstanceOf(ErreurEchecAuthentification); - expect(e.message).toBe('oups'); - }); - }); - - it("lève une erreur si le JWT n'est pas défini", () => { - expect.assertions(2); - - const session = nouvelleSession({ jwt: '' }); - expect(session.jwt).toBeFalsy(); - - return session.enJSON() - .catch((e) => expect(e.message).toBe('JWT non défini. La session a-t-elle bien été instanciée depuis la fabrique ?')); - }); - - it("lève une erreur si l'URL des clefs publiques n'est pas définie", () => { - expect.assertions(2); - - const session = nouvelleSession({ urlClefsPubliques: '' }); - expect(session.urlClefsPubliques).toBeFalsy(); - - return session.enJSON() - .catch((e) => expect(e.message).toBe('URL clefs publiques non définie. La session a-t-elle bien été instanciée depuis la fabrique ?')); - }); - }); -}); diff --git a/test/routes/middleware.spec.js b/test/routes/middleware.spec.js deleted file mode 100644 index 4580adb..0000000 --- a/test/routes/middleware.spec.js +++ /dev/null @@ -1,60 +0,0 @@ -const { ErreurJetonInvalide } = require('../../src/erreurs'); -const Middleware = require('../../src/routes/middleware'); - -describe('Le middleware OOTS-France', () => { - const adaptateurChiffrement = {}; - const adaptateurEnvironnement = {}; - const config = { adaptateurChiffrement, adaptateurEnvironnement }; - let requete; - - beforeEach(() => { - adaptateurEnvironnement.secretJetonSession = () => ''; - adaptateurChiffrement.verifieJeton = () => Promise.resolve(); - - requete = { session: { jeton: '' } }; - }); - - it('vérifie le jeton stocké en session', (suite) => { - requete.session.jeton = 'jeton'; - adaptateurEnvironnement.secretJetonSession = () => 'secret'; - adaptateurChiffrement.verifieJeton = (jeton, secret) => { - try { - expect(jeton).toBe('jeton'); - expect(secret).toBe('secret'); - - return Promise.resolve(); - } catch (e) { return Promise.reject(e); } - }; - - const middleware = new Middleware(config); - - middleware.renseigneUtilisateurCourant(requete, null, suite) - .catch(suite); - }); - - it("renseigne les infos de l'utilisateur courant dans la requête", (suite) => { - adaptateurChiffrement.verifieJeton = () => Promise.resolve({ infos: 'des infos' }); - - const middleware = new Middleware(config); - expect(requete.utilisateurCourant).toBeUndefined(); - - middleware.renseigneUtilisateurCourant(requete, null, () => { - try { - expect(requete.utilisateurCourant).toEqual({ infos: 'des infos' }); - suite(); - } catch (e) { suite(e); } - }) - .catch(suite); - }); - - it("supprime les infos de l'utilisateur courant si le jeton est invalide", (suite) => { - adaptateurChiffrement.verifieJeton = () => Promise.reject(new ErreurJetonInvalide('oups')); - - const middleware = new Middleware(config); - middleware.renseigneUtilisateurCourant(requete, null, () => { - expect(requete.utilisateurCourant).toBeUndefined(); - suite(); - }) - .catch(suite); - }); -}); diff --git a/test/routes/routesAuth.spec.js b/test/routes/routesAuth.spec.js deleted file mode 100644 index 7c1f914..0000000 --- a/test/routes/routesAuth.spec.js +++ /dev/null @@ -1,165 +0,0 @@ -const axios = require('axios'); - -const { leveErreur } = require('./utils'); -const serveurTest = require('./serveurTest'); - -describe('Le serveur des routes `/auth`', () => { - const serveur = serveurTest(); - let port; - - beforeEach((suite) => serveur.initialise(() => { - port = serveur.port(); - suite(); - })); - - afterEach((suite) => serveur.arrete(suite)); - - describe('sur GET /auth/cles_publiques', () => { - it('retourne les clés de chiffrement au format JSON Web Key Set', () => { - serveur.adaptateurEnvironnement().clePriveeJWK = () => ({ e: 'AQAB', n: '503as-2qay5...', kty: 'RSA' }); - serveur.adaptateurChiffrement().cleHachage = (chaine) => `hash de ${chaine}`; - - return axios.get(`http://localhost:${port}/auth/cles_publiques`) - .then((reponse) => { - expect(reponse.status).toEqual(200); - expect(reponse.data).toEqual({ - keys: [{ - kid: 'hash de 503as-2qay5...', - kty: 'RSA', - use: 'enc', - e: 'AQAB', - n: '503as-2qay5...', - }], - }); - }) - .catch(leveErreur); - }); - }); - - describe('sur GET /auth/fcplus/connexion', () => { - describe('lorsque les paramètres `code` et `state` sont présents', () => { - it('redirige vers page accueil depuis navigateur', () => ( - axios.get(`http://localhost:${port}/auth/fcplus/connexion?state=unState&code=unCode`) - .then((reponse) => expect(reponse.data).toContain('')) - .catch(leveErreur) - )); - - it('stocke les infos dans un cookie sans attribut `Secure` si autorisé avant la redirection', () => { - serveur.adaptateurEnvironnement().avecEnvoiCookieSurHTTP = () => true; - return axios({ - method: 'get', - url: `http://localhost:${port}/auth/fcplus/connexion?state=unState&code=unCode`, - maxRedirects: 0, - }) - .catch(({ response }) => { - expect(response.status).toBe(302); - expect(response.headers).toHaveProperty('set-cookie'); - const valeurEnteteSetCookie = response - .headers['set-cookie'] - .find((h) => h.match(/session=/)); - expect(valeurEnteteSetCookie).not.toContain('secure'); - }) - .catch(leveErreur); - }); - - it("sert une erreur HTTP 502 (Bad Gateway) quand l'authentification échoue", () => { - expect.assertions(2); - - serveur.fabriqueSessionFCPlus().nouvelleSession = () => Promise.resolve({ - enJSON: () => Promise.reject(new Error('Oups')), - }); - - return axios.get(`http://localhost:${port}/auth/fcplus/connexion?code=unCode&state=unState`) - .catch(({ response }) => { - expect(response.status).toBe(502); - expect(response.data).toEqual({ erreur: 'Échec authentification (Oups)' }); - }); - }); - }); - - it("sert une erreur HTTP 400 (Bad Request) si le paramètre 'code' est manquant", () => { - expect.assertions(2); - - return axios.get(`http://localhost:${port}/auth/fcplus/connexion?state=unState`) - .catch(({ response }) => { - expect(response.status).toBe(400); - expect(response.data).toEqual({ erreur: "Paramètre 'code' absent de la requête" }); - }); - }); - - it("sert une erreur HTTP 400 (Bad Request) si le paramètre 'state' est manquant", () => { - expect.assertions(2); - - return axios.get(`http://localhost:${port}/auth/fcplus/connexion?code=unCode`) - .catch(({ response }) => { - expect(response.status).toBe(400); - expect(response.data).toEqual({ erreur: "Paramètre 'state' absent de la requête" }); - }); - }); - }); - - describe('sur GET /auth/fcplus/deconnexion', () => { - it('redirige vers page accueil', () => ( - axios.get(`http://localhost:${port}/auth/fcplus/deconnexion`) - .then((reponse) => expect(reponse.request.path).toBe('/')) - .catch(leveErreur) - )); - }); - - describe('sur GET /auth/fcplus/destructionSession', () => { - it("appelle le middleware pour renseigner les infos de l'utilisateur courant", () => { - serveur.middleware().reinitialise({ - utilisateurCourant: { given_name: '', family_name: '', jwtSessionFCPlus: 'abcdef' }, - }); - - serveur.adaptateurFranceConnectPlus().urlDestructionSession = () => Promise.resolve(`http://localhost:${port}`); - - return axios.get(`http://localhost:${port}/auth/fcplus/destructionSession`) - .then((reponse) => expect(reponse.request.path).toContain('id_token_hint=abcdef')) - .catch(leveErreur); - }); - - it('retourne une erreur 501 si le feature-flipping est désactivé', () => { - expect.assertions(1); - - serveur.adaptateurEnvironnement().avecConnexionFCPlus = () => false; - - return axios.get(`http://localhost:${port}/auth/fcplus/creationSession`) - .catch(({ response }) => { - expect(response.status).toEqual(501); - }); - }); - }); - - describe('sur GET /auth/fcplus/creationSession', () => { - const verifieRedirection = (urlSource, urlDestination) => axios({ - method: 'get', - url: urlSource, - maxRedirects: 0, - }) - .catch(({ response }) => { - expect(response.status).toBe(302); - expect(response.headers.location).toMatch(new RegExp(`^${urlDestination}`)); - }) - .catch(leveErreur); - - it("redirige vers l'URL (FC+) de création de session", () => { - serveur.adaptateurFranceConnectPlus().urlCreationSession = () => Promise.resolve( - `http://localhost:${port}/redirectionConnexion`, // page inexistante, résultera en une erreur HTTP 404 - ); - - return verifieRedirection(`http://localhost:${port}/auth/fcplus/creationSession`, `http://localhost:${port}/redirectionConnexion`); - }); - - it('retourne une erreur 501 si le feature-flipping est désactivé', () => { - expect.assertions(1); - - serveur.adaptateurEnvironnement().avecConnexionFCPlus = () => false; - - return axios.get(`http://localhost:${port}/auth/fcplus/creationSession`) - .catch(({ response }) => { - expect(response.status).toEqual(501); - }); - }); - }); -}); diff --git a/test/routes/routesBase.spec.js b/test/routes/routesBase.spec.js deleted file mode 100644 index f6e29f1..0000000 --- a/test/routes/routesBase.spec.js +++ /dev/null @@ -1,53 +0,0 @@ -const axios = require('axios'); - -const serveurTest = require('./serveurTest'); -const { leveErreur } = require('./utils'); - -describe('Le serveur des routes `/`', () => { - const serveur = serveurTest(); - let port; - - beforeEach((suite) => serveur.initialise(() => { - port = serveur.port(); - suite(); - })); - - afterEach((suite) => serveur.arrete(suite)); - - describe('sur GET /', () => { - it("affiche qu'il n'y a pas pas d'utilisateur courant par défaut", () => ( - axios.get(`http://localhost:${port}/`) - .then((reponse) => { - expect(reponse.status).toBe(200); - expect(reponse.data).toContain("Pas d'utilisateur courant"); - }) - .catch(leveErreur))); - - it("affiche prénom et nom de l'utilisateur courant s'il existe", () => { - serveur.middleware().reinitialise({ - utilisateurCourant: { - given_name: 'Sandra', - family_name: 'Nicouette', - }, - }); - - return axios.get(`http://localhost:${port}/`) - .then((reponse) => { - expect(reponse.status).toBe(200); - expect(reponse.data).toContain('Utilisateur courant : Sandra Nicouette'); - }) - .catch(leveErreur); - }); - it("n'affiche pas le bouton quand le feature flip est désactivé", () => { - expect.assertions(2); - - serveur.adaptateurEnvironnement().avecConnexionFCPlus = () => false; - - return axios.get(`http://localhost:${port}/`) - .then((reponse) => { - expect(reponse.status).toEqual(200); - expect(reponse.data).not.toContain('Connexion'); - }); - }); - }); -}); diff --git a/test/routes/serveurTest.js b/test/routes/serveurTest.js index 5e5c0ec..3427377 100644 --- a/test/routes/serveurTest.js +++ b/test/routes/serveurTest.js @@ -1,19 +1,13 @@ const OOTS_FRANCE = require('../../src/ootsFrance'); - -const MiddlewareFantaisie = require('../mocks/middleware'); const { ErreurAbsenceReponseDestinataire } = require('../../src/erreurs'); const serveurTest = () => { - let adaptateurChiffrement; let adaptateurDomibus; let adaptateurEnvironnement; - let adaptateurFranceConnectPlus; let adaptateurUUID; let depotPointsAcces; let ecouteurDomibus; - let fabriqueSessionFCPlus; let horodateur; - let middleware; let serveur; @@ -22,14 +16,6 @@ const serveurTest = () => { }; const initialise = (suite) => { - adaptateurChiffrement = { - cleHachage: () => '', - dechiffreJWE: () => Promise.resolve(), - genereJeton: () => Promise.resolve(), - verifieJeton: () => Promise.resolve(), - verifieSignatureJWTDepuisJWKS: () => Promise.resolve({}), - }; - adaptateurDomibus = { envoieMessageRequete: () => Promise.resolve(), urlRedirectionDepuisReponse: () => Promise.reject(new ErreurAbsenceReponseDestinataire('aucune URL reçue')), @@ -37,23 +23,10 @@ const serveurTest = () => { }; adaptateurEnvironnement = { - avecConnexionFCPlus: () => true, avecEnvoiCookieSurHTTP: () => true, avecRequetePieceJustificative: () => true, - fournisseurIdentiteSuggere: () => '', - identifiantClient: () => '', identifiantEIDAS: () => 'FR/BE/123456789', secretJetonSession: () => 'secret', - urlRedirectionConnexion: () => '', - urlRedirectionDeconnexion: () => '', - }; - - adaptateurFranceConnectPlus = { - recupereDonneesJetonAcces: () => Promise.resolve({}), - recupereInfosUtilisateurChiffrees: () => Promise.resolve(), - recupereURLClefsPubliques: () => Promise.resolve(), - urlCreationSession: () => Promise.resolve(''), - urlDestructionSession: () => Promise.resolve(''), }; adaptateurUUID = { @@ -70,27 +43,17 @@ const serveurTest = () => { etat: () => '', }; - fabriqueSessionFCPlus = { - nouvelleSession: () => Promise.resolve({ enJSON: () => Promise.resolve({}) }), - }; - horodateur = { maintenant: () => '', }; - middleware = new MiddlewareFantaisie({}); - serveur = OOTS_FRANCE.creeServeur({ - adaptateurChiffrement, adaptateurDomibus, adaptateurEnvironnement, - adaptateurFranceConnectPlus, adaptateurUUID, depotPointsAcces, ecouteurDomibus, - fabriqueSessionFCPlus, horodateur, - middleware, }); serveur.ecoute(0, suite); @@ -99,18 +62,14 @@ const serveurTest = () => { const port = () => serveur.port(); return { - adaptateurChiffrement: () => adaptateurChiffrement, adaptateurDomibus: () => adaptateurDomibus, adaptateurEnvironnement: () => adaptateurEnvironnement, - adaptateurFranceConnectPlus: () => adaptateurFranceConnectPlus, adaptateurUUID: () => adaptateurUUID, arrete, depotPointsAcces: () => depotPointsAcces, ecouteurDomibus: () => ecouteurDomibus, - fabriqueSessionFCPlus: () => fabriqueSessionFCPlus, horodateur: () => horodateur, initialise, - middleware: () => middleware, port, }; };