mirror of
https://github.com/kmitresse/Cards-Rush.git
synced 2026-05-13 17:11:49 +00:00
feat: devweb - Make translations on forgotten and reset password pages (including mail and token)
This commit is contained in:
@@ -8,6 +8,7 @@ package uppa.project.bean;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Properties;
|
||||
import java.util.UUID;
|
||||
import javax.mail.Authenticator;
|
||||
@@ -24,6 +25,7 @@ import uppa.project.database.dao.DAOException;
|
||||
import uppa.project.database.dao.jpa.Game_JPA_DAO_Factory;
|
||||
import uppa.project.database.pojo.RecoveryPasswordToken;
|
||||
import uppa.project.database.pojo.User;
|
||||
import uppa.project.web.translation.Translator;
|
||||
|
||||
import static uppa.project.web.servlet.ForgottenPasswordServlet.CreateToken;
|
||||
|
||||
@@ -34,6 +36,8 @@ public class ForgottenPasswordBean implements Serializable {
|
||||
|
||||
private String email;
|
||||
|
||||
private Translator translator;
|
||||
|
||||
public ForgottenPasswordBean() {
|
||||
}
|
||||
|
||||
@@ -73,6 +77,11 @@ public class ForgottenPasswordBean implements Serializable {
|
||||
return this;
|
||||
}
|
||||
|
||||
public ForgottenPasswordBean setTranslator(Translator translator) {
|
||||
this.translator = translator;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Création et envoi d'un token de réinitialisation de mot de passe
|
||||
*
|
||||
@@ -117,20 +126,12 @@ public class ForgottenPasswordBean implements Serializable {
|
||||
Message message = new MimeMessage(session);
|
||||
message.setFrom(new InternetAddress(username));
|
||||
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(email));
|
||||
message.setSubject("Réinitialisation de votre mot de passe");
|
||||
message.setText("Bonjour,\n\n" +
|
||||
"Vous avez demandé la réinitialisation de votre mot de passe.\n" +
|
||||
"Pour cela, veuillez cliquer sur le lien suivant :"+ requestPath +"/reset-password?token=" + token + "\n\n" +
|
||||
"Ce lien est valable 10 minutes.\n" +
|
||||
"Si vous n'êtes pas à l'origine de cette demande, ne prenez pas compte de ce mail.\n\n" +
|
||||
"Cordialement,\n" +
|
||||
"L'équipe CardRush" +
|
||||
"\n\n\n\n" +
|
||||
"Ce message est généré automatiquement, merci de ne pas y répondre.\n" +
|
||||
"CardRush est la propriété de CardRush Corporation, 2024. Tous droits réservés.\n" +
|
||||
"CardRush Corporation, 2024, 1 rue de la programmation web, 64000 Pau, France\n" +
|
||||
"Société fictive créée dans le cadre d'un projet universitaire. Auteurs du projet: MITRESSÉ Kevin & VABRE Lucàs "
|
||||
);
|
||||
message.setSubject(this.translator.translate("forgotten_email_object"));
|
||||
String contentTemplate = this.translator.translate("forgotten_email_content");
|
||||
String content = MessageFormat.format(contentTemplate, requestPath, token);
|
||||
message.setText(content);
|
||||
System.out.println(contentTemplate);
|
||||
System.out.println(content);
|
||||
// Envoi du message
|
||||
Transport.send(message);
|
||||
|
||||
|
||||
+7
-1
@@ -25,6 +25,7 @@ import uppa.project.database.pojo.User;
|
||||
import uppa.project.database.dao.EntityManagerProvider;
|
||||
import uppa.project.json.HttpResponse;
|
||||
import uppa.project.json.HttpResponseCode;
|
||||
import uppa.project.web.translation.Translator;
|
||||
|
||||
@WebServlet(name = "forgottenPasswordServlet", value = "/forgotten-password")
|
||||
public class ForgottenPasswordServlet extends HttpServlet {
|
||||
@@ -41,6 +42,10 @@ public class ForgottenPasswordServlet extends HttpServlet {
|
||||
* @throws ServletException si une erreur de servlet survient
|
||||
*/
|
||||
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
|
||||
if (request.getSession().getAttribute("translator") == null) {
|
||||
request.getSession().setAttribute("language", "FR");
|
||||
request.getSession().setAttribute("translator", Translator.generateTranslator(request.getSession(), request.getServletContext()));
|
||||
}
|
||||
request.setAttribute("current", "forgotten-password");
|
||||
request.getRequestDispatcher("/WEB-INF/pages/forgotten-password.jsp").forward(request, response);
|
||||
}
|
||||
@@ -58,7 +63,8 @@ public class ForgottenPasswordServlet extends HttpServlet {
|
||||
PrintWriter out = response.getWriter();
|
||||
|
||||
ForgottenPasswordBean forgottenPasswordBean = new ForgottenPasswordBean()
|
||||
.setEmail(request.getParameter("email"));
|
||||
.setEmail(request.getParameter("email"))
|
||||
.setTranslator((Translator) request.getSession().getAttribute("translator"));
|
||||
|
||||
Gson gson = new Gson();
|
||||
HttpResponse httpResponse;
|
||||
|
||||
@@ -14,6 +14,7 @@ import uppa.project.database.dao.jpa.DAO_JPA_RecoveryPasswordToken;
|
||||
import uppa.project.database.pojo.RecoveryPasswordToken;
|
||||
import uppa.project.json.HttpResponse;
|
||||
import uppa.project.json.HttpResponseCode;
|
||||
import uppa.project.web.translation.Translator;
|
||||
|
||||
@WebServlet(name = "resetPasswordServlet", value = "/reset-password")
|
||||
public class ResetPasswordServlet extends HttpServlet {
|
||||
@@ -29,6 +30,10 @@ public class ResetPasswordServlet extends HttpServlet {
|
||||
* @throws ServletException si une erreur de servlet survient
|
||||
*/
|
||||
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
|
||||
if (request.getSession().getAttribute("translator") == null) {
|
||||
request.getSession().setAttribute("language", "FR");
|
||||
request.getSession().setAttribute("translator", Translator.generateTranslator(request.getSession(), request.getServletContext()));
|
||||
}
|
||||
RecoveryPasswordToken token = findRecoveryToken(request.getParameter("token"));
|
||||
if (token == null) {
|
||||
request.getRequestDispatcher("/WEB-INF/pages/errors/invalid-token-password.jsp").forward(request, response);
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
<%@ page import="uppa.project.web.translation.Translator" %>
|
||||
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
|
||||
<%@taglib prefix="layout" tagdir="/WEB-INF/tags/layouts" %>
|
||||
<%@taglib prefix="component" tagdir="/WEB-INF/tags/components" %>
|
||||
<%@taglib prefix="form" tagdir="/WEB-INF/tags/forms" %>
|
||||
<% Translator translator = (Translator) request.getSession().getAttribute("translator"); %>
|
||||
|
||||
<layout:error message="Token expiré">
|
||||
<layout:error message="${translator.translate('expired_token')}">
|
||||
<a href="login" class="button is-primary is-fullwidth has-text-white">
|
||||
Retour à la page de connexion
|
||||
${translator.translate('error_token_go_to_connection_page')}
|
||||
</a>
|
||||
</layout:error>
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
<%@ page import="uppa.project.web.translation.Translator" %>
|
||||
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
|
||||
<%@taglib prefix="layout" tagdir="/WEB-INF/tags/layouts" %>
|
||||
<%@taglib prefix="form" tagdir="/WEB-INF/tags/forms" %>
|
||||
<%@taglib prefix="form" tagdir="/WEB-INF/tags/forms" %>
|
||||
<% Translator translator = (Translator) request.getSession().getAttribute("translator"); %>
|
||||
|
||||
<layout:error message="Token invalide">
|
||||
<layout:error message="${translator.translate('invalid_token')}">
|
||||
<a href="login" class="button is-primary is-fullwidth has-text-white">
|
||||
Retour à la page de connexion
|
||||
${translator.translate('error_token_go_to_connection_page')}
|
||||
</a>
|
||||
</layout:error>
|
||||
</layout:error>
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<%@ page import="uppa.project.web.translation.Translator" %>
|
||||
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
|
||||
<%@taglib prefix="layout" tagdir="/WEB-INF/tags/layouts" %>
|
||||
<%@taglib prefix="component" tagdir="/WEB-INF/tags/components" %>
|
||||
<%@taglib prefix="form" tagdir="/WEB-INF/tags/forms" %>
|
||||
<% Translator translator = (Translator) request.getSession().getAttribute("translator"); %>
|
||||
|
||||
<layout:form title="Mot de passe oublié">
|
||||
<layout:form title="${translator.translate('forgotten_title')}">
|
||||
<jsp:attribute name="script">
|
||||
<script defer type="module" src="${pageContext.request.contextPath}/static/js/form/forgotten-password.js"></script>
|
||||
</jsp:attribute>
|
||||
@@ -12,7 +14,7 @@
|
||||
<div class="columns is-centered">
|
||||
<div class="column is-5-tablet is-5-desktop is-5-widescreen">
|
||||
<div class="box">
|
||||
<h1 class="title has-text-centered">Mot de passe oublié ?</h1>
|
||||
<h1 class="title has-text-centered">${translator.translate('forgotten_title')}</h1>
|
||||
<form:forgotten-password/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<%@ page import="uppa.project.web.translation.Translator" %>
|
||||
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
|
||||
<%@taglib prefix="layout" tagdir="/WEB-INF/tags/layouts" %>
|
||||
<%@taglib prefix="form" tagdir="/WEB-INF/tags/forms" %>
|
||||
<%@taglib prefix="component" tagdir="/WEB-INF/tags/components" %>
|
||||
<% Translator translator = (Translator) request.getSession().getAttribute("translator"); %>
|
||||
|
||||
<layout:form title="Récuperation mot de passe">
|
||||
<layout:form title="${translator.translate('reset_title')}">
|
||||
<jsp:attribute name="script">
|
||||
<script defer type="module" src="${pageContext.request.contextPath}/static/js/form/reset-password.js"></script>
|
||||
</jsp:attribute>
|
||||
@@ -12,12 +14,8 @@
|
||||
<div class="columns is-centered">
|
||||
<div class="column is-5-tablet is-5-desktop is-5-widescreen">
|
||||
<div class="box">
|
||||
<h1 class="title has-text-centered">Récupération de mot de passe</h1>
|
||||
<h1 class="title has-text-centered">${translator.translate('reset_title')}</h1>
|
||||
<form:reset-password/>
|
||||
<hr/>
|
||||
<p class="content has-text-centered">
|
||||
Déjà inscrit ? <a href="${pageContext.request.contextPath}/login">Se connecter</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,47 +1,18 @@
|
||||
<%@tag description="form/forgotten-password" pageEncoding="UTF-8" %>
|
||||
<%@ tag import="uppa.project.web.translation.Translator" %>
|
||||
<% Translator translator = (Translator) request.getSession().getAttribute("translator"); %>
|
||||
|
||||
<form id="forgotten-password-form" action="${pageContext.request.contextPath}/forgotten-password" method="post">
|
||||
<div class="field">
|
||||
<label class="label" for="email">Email</label>
|
||||
<label class="label" for="email">${translator.translate('forgotten_title')}</label>
|
||||
<div class="control has-icons-left">
|
||||
<input id="email" name="email" placeholder="johndoe@exemple.com" class="input is-fullwidth" required/>
|
||||
<span class="icon is-small is-left">
|
||||
<i class="fas fa-envelope"></i>
|
||||
</span>
|
||||
</div>
|
||||
<div class="help">Veuillez entrer votre email pour obtenir un lien de récupération</div>
|
||||
<div class="help">${translator.translate('forgotten_email_description')}</div>
|
||||
</div>
|
||||
<input type="submit" class="button is-primary is-fullwidth has-text-white" value="Envoyer">
|
||||
<input type="submit" class="button is-primary is-fullwidth has-text-white" value="${translator.translate('forgotten_submit')}">
|
||||
</form>
|
||||
|
||||
<%--<script defer type="module">--%>
|
||||
<%-- const forgottenPasswordForm = document.querySelector("form#forgotten-password-form");--%>
|
||||
|
||||
<%-- // Champ email--%>
|
||||
<%-- const inputs = [document.querySelector("input#email")];--%>
|
||||
|
||||
<%-- // Ajout de l'écouteur d'événement sur la soumission du formulaire--%>
|
||||
<%-- forgottenPasswordForm.addEventListener("submit", onSubmit)--%>
|
||||
|
||||
<%-- /**--%>
|
||||
<%-- * Gestion de la soumission du formulaire--%>
|
||||
<%-- * @param event {Event} - Événement de soumission du formulaire--%>
|
||||
<%-- */--%>
|
||||
<%-- function onSubmit(event) {--%>
|
||||
<%-- event.preventDefault();--%>
|
||||
|
||||
<%-- const {action, method} = forgottenPasswordForm;--%>
|
||||
|
||||
<%-- const url = new URL(action);--%>
|
||||
<%-- url.searchParams.append("email", emailInput.value);--%>
|
||||
|
||||
<%-- fetch(url, {headers: {"Content-Type": "application/json"}, method})--%>
|
||||
<%-- .then(res => res.json())--%>
|
||||
<%-- .then(data => {--%>
|
||||
<%-- if (data.code !== 200) throw new Error(data.message);--%>
|
||||
<%-- })--%>
|
||||
<%-- .then(() => window.location.href = "${pageContext.request.contextPath}/login")--%>
|
||||
<%-- .catch(onError);--%>
|
||||
<%-- }--%>
|
||||
<%--</script>--%>
|
||||
|
||||
|
||||
@@ -1,23 +1,25 @@
|
||||
<%@tag description="form/register" pageEncoding="UTF-8" %>
|
||||
<%@ tag import="uppa.project.web.translation.Translator" %>
|
||||
<% Translator translator = (Translator) request.getSession().getAttribute("translator"); %>
|
||||
|
||||
<form id="reset-password-form" action="${pageContext.request.contextPath}/reset-password" method="post">
|
||||
<input type="hidden" id="token" name="token" value="${pageContext.request.getParameter("token")}">
|
||||
<div class="field">
|
||||
<label class="label" for="password">Mot de passe</label>
|
||||
<label class="label" for="password">${translator.translate('user_password')}</label>
|
||||
<div class="control has-icons-left">
|
||||
<input id="password" name="password" type="password" class="input is-fullwidth" required>
|
||||
<input id="password" name="password" type="password" placeholder="${translator.translate('user_password')}" class="input is-fullwidth" required>
|
||||
<span class="icon is-small is-left"><i class="fas fa-lock"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label class="label" for="repassword">Confirmez le mot de passe</label>
|
||||
<label class="label" for="repassword">${translator.translate('user_confirm_password')}</label>
|
||||
<div class="control has-icons-left">
|
||||
<input id="repassword" name="repassword" type="password" class="input is-fullwidth" required>
|
||||
<input id="repassword" name="repassword" placeholder="${translator.translate('user_confirm_password_input')}" type="password" class="input is-fullwidth" required>
|
||||
<span class="icon is-small is-left"><i class="fas fa-lock"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="submit" class="button is-primary has-text-white is-fullwidth" value="Envoyer">
|
||||
<input type="submit" class="button is-primary has-text-white is-fullwidth" value="${translator.translate('reset_submit')}">
|
||||
</form>
|
||||
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
<%@taglib prefix="layout" tagdir="/WEB-INF/tags/layouts" %>
|
||||
<%@taglib prefix="component" tagdir="/WEB-INF/tags/components" %>
|
||||
<%@taglib prefix="form" tagdir="/WEB-INF/tags/forms" %>
|
||||
|
||||
<%@ tag import="uppa.project.web.translation.Translator" %>
|
||||
<% Translator translator = (Translator) request.getSession().getAttribute("translator"); %>
|
||||
<%@attribute name="message"%>
|
||||
|
||||
<layout:base title="Erreur">
|
||||
<layout:base title="${translator.translate('error')}">
|
||||
<component:hero>
|
||||
<div class="columns is-centered">
|
||||
<div class="column is-5-tablet is-5-desktop is-5-widescreen">
|
||||
|
||||
@@ -120,8 +120,8 @@
|
||||
"FR": "Les mots de passe ne correspondent pas"
|
||||
},
|
||||
"forgotten_title" : {
|
||||
"EN": "Forgotten password",
|
||||
"FR": "Mot de passe oublié"
|
||||
"EN": "Forgotten password ?",
|
||||
"FR": "Mot de passe oublié ?"
|
||||
},
|
||||
"forgotten_submit" : {
|
||||
"EN": "Send email",
|
||||
@@ -138,5 +138,69 @@
|
||||
"forgotten_email_description" : {
|
||||
"EN": "Enter the email address associated with your account to receive a password reset link.",
|
||||
"FR": "Entrez l'adresse email associée à votre compte pour recevoir un lien de réinitialisation de mot de passe."
|
||||
},
|
||||
"forgotten_email_object" : {
|
||||
"EN": "Reset password",
|
||||
"FR": "Réinitialiser le mot de passe"
|
||||
},
|
||||
"forgotten_email_content" : {
|
||||
"EN": "Hello,\n\nYou have requested a password reset.\nTo do this, please click on the following link: {0}/reset-password?token={1}\n\nThis link is valid for 10 minutes.\nIf you are not the origin of this request, please ignore this email.\n\nSincerely,\nThe CardRush team\n\n\n\nThis message is generated automatically, please do not reply to it.\nCardRush is the property of CardRush Corporation, 2024. All rights reserved.\nCardRush Corporation, 2024, 1 rue de la programmation web, 64000 Pau, France\nFictitious company created as part of a university project. Project authors: MITRESSÉ Kevin & VABRE Lucàs",
|
||||
"FR": "Bonjour,\n\nVous avez demandé la réinitialisation de votre mot de passe.\nPour cela, veuillez cliquer sur le lien suivant :{0}/reset-password?token={1}\n\nCe lien est valable 10 minutes.\nSi vous n'êtes pas à l'origine de cette demande, ne prenez pas compte de ce mail.\n\nCordialement,\nL'équipe CardRush\n\n\n\nCe message est généré automatiquement, merci de ne pas y répondre.\nCardRush est la propriété de CardRush Corporation, 2024. Tous droits réservés.\\nCardRush Corporation, 2024, 1 rue de la programmation web, 64000 Pau, France\nSociété fictive créée dans le cadre d'un projet universitaire. Auteurs du projet: MITRESSÉ Kevin & VABRE Lucàs"
|
||||
},
|
||||
"reset_title" : {
|
||||
"EN": "Reset password",
|
||||
"FR": "Réinitialisation du mot de passe"
|
||||
},
|
||||
"reset_submit" : {
|
||||
"EN": "Reset",
|
||||
"FR": "Réinitialiser"
|
||||
},
|
||||
"invalid_token" : {
|
||||
"EN": "Invalid token",
|
||||
"FR": "Token invalide"
|
||||
},
|
||||
"expired_token" : {
|
||||
"EN": "Expired token",
|
||||
"FR": "Token expiré"
|
||||
},
|
||||
"error_token_go_to_connection_page" :{
|
||||
"EN": "Return to the login page",
|
||||
"FR": "Retour à la page de connexion"
|
||||
},
|
||||
"error" : {
|
||||
"EN": "Error",
|
||||
"FR": "Erreur"
|
||||
},
|
||||
|
||||
"reset_success" : {
|
||||
"EN": "Password reset successfully",
|
||||
"FR": "Mot de passe réinitialisé avec succès"
|
||||
},
|
||||
"reset_password" : {
|
||||
"EN": "New password",
|
||||
"FR": "Nouveau mot de passe"
|
||||
},
|
||||
"reset_confirm_password" : {
|
||||
"EN": "Confirm new password",
|
||||
"FR": "Confirmer le nouveau mot de passe"
|
||||
},
|
||||
"reset_password_description" : {
|
||||
"EN": "Enter your new password",
|
||||
"FR": "Entrez votre nouveau mot de passe"
|
||||
},
|
||||
"reset_error_password" : {
|
||||
"EN": "Passwords do not match",
|
||||
"FR": "Les mots de passe ne correspondent pas"
|
||||
},
|
||||
"profile_title" : {
|
||||
"EN": "Profile",
|
||||
"FR": "Profil"
|
||||
},
|
||||
"profile_edit" : {
|
||||
"EN": "Edit",
|
||||
"FR": "Modifier"
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user