diff --git a/package.json b/package.json index fe4cacd..2ee4492 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "passport-local": "^1.0.0", "rimraf": "^3.0.2", "sass": "^1.49.7", + "svg-captcha": "^1.4.0", "uuid": "^8.3.2", "vue": "^3.2.31" }, diff --git a/src/middleware/Albums.js b/src/middleware/Albums.js index 5363c2c..3ca4558 100644 --- a/src/middleware/Albums.js +++ b/src/middleware/Albums.js @@ -197,7 +197,11 @@ class Albums extends Pages { }); if (!album) { - throw new ErrorEvent(404, "Impossible de trouver cet album"); + throw new ErrorEvent( + 404, + "Mise à jour", + "Impossible de trouver cet album" + ); } const values = await getAlbumDetails(album.discogsId); @@ -221,7 +225,11 @@ class Albums extends Pages { return true; } - throw new ErrorEvent(404, "Impossible de trouver cet album"); + throw new ErrorEvent( + 404, + "Suppression", + "Impossible de trouver cet album" + ); } /** diff --git a/src/routes/api/v1/contact.js b/src/routes/api/v1/contact.js index f4a3265..4ecce22 100644 --- a/src/routes/api/v1/contact.js +++ b/src/routes/api/v1/contact.js @@ -1,5 +1,6 @@ import express from "express"; import nodemailer from "nodemailer"; +import svgCaptcha from "svg-captcha"; import { sendResponse } from "../../../libs/format"; @@ -9,42 +10,68 @@ import ErrorEvent from "../../../libs/error"; // eslint-disable-next-line new-cap const router = express.Router(); -router.route("/").post(async (req, res, next) => { - try { - if (mailMethod === "smtp") { - const { email, name, message } = req.body; +router + .route("/") + .get(async (req, res, next) => { + try { + const captcha = svgCaptcha.create({ + size: 4, + noise: 2, + color: true, + }); + req.session.captcha = captcha.text; - if (!email || !message) { - throw new ErrorEvent( - 406, - "Le formulaire n'est pas correctement saisi" - ); + res.type("svg"); + return res.status(200).send(captcha.data); + } catch (err) { + return next(err); + } + }) + .post(async (req, res, next) => { + try { + if (mailMethod === "smtp") { + const { email, name, message, captcha } = req.body; + + if (!captcha || captcha !== req.session.captcha) { + throw new ErrorEvent( + 406, + "Captcha", + "Le captcha n'est pas valide" + ); + } + + if (!email || !message) { + throw new ErrorEvent( + 406, + "Erreur de saisie", + "Le formulaire n'est pas correctement saisi" + ); + } + + const transporter = nodemailer.createTransport(smtpConfig); + + const text = `Bonjour, + Vous venez de recevoir un nouveau message de ${name} (${email}) : + + ${message} + `; + + const data = await transporter.sendMail({ + from: smtpConfig.auth.user, + to: mailTo, + subject: `${siteName} : Nouveau message`, + text, + }); + + const { messageId, response } = data; + + return sendResponse(req, res, { messageId, response }); } - const transporter = nodemailer.createTransport(smtpConfig); - - const text = `Bonjour, -Vous venez de recevoir un nouveau message de ${name} (${email}) : - -${message} - `; - - const data = await transporter.sendMail({ - from: smtpConfig.auth.user, - to: mailTo, - subject: `${siteName} : Nouveau message`, - text, - }); - - const { messageId, response } = data; - - return sendResponse(req, res, { messageId, response }); + throw new ErrorEvent(500, "Routeur", "Méthode non configurée"); + } catch (err) { + return next(err); } - - throw new ErrorEvent(500, "Méthode non configurée"); - } catch (err) { - return next(err); - } -}); + }); export default router; diff --git a/views/pages/nous-contacter.ejs b/views/pages/nous-contacter.ejs index 223f2a7..276b6f4 100644 --- a/views/pages/nous-contacter.ejs +++ b/views/pages/nous-contacter.ejs @@ -17,6 +17,14 @@ + <% if (config.mailMethod !== 'formspree' ) { %> + Captcha +
+ + +
+ <% } %> +