mirror of
https://github.com/kmitresse/Cards-Rush.git
synced 2026-07-09 13:27:45 +00:00
fix(DevWeb): Resolve Login and Register functions
This commit is contained in:
@@ -48,7 +48,7 @@ public abstract class DAO<D> {
|
|||||||
* @throws DAOException en cas de problème
|
* @throws DAOException en cas de problème
|
||||||
* @see D
|
* @see D
|
||||||
*/
|
*/
|
||||||
public abstract void create(D data) throws DAOException;
|
public abstract D create(D data) throws DAOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Met à jour le contenu correspondant à l'objet {@link D} sur le support persistant (l'objet
|
* Met à jour le contenu correspondant à l'objet {@link D} sur le support persistant (l'objet
|
||||||
@@ -58,7 +58,7 @@ public abstract class DAO<D> {
|
|||||||
* @throws DAOException en cas de problème
|
* @throws DAOException en cas de problème
|
||||||
* @see D
|
* @see D
|
||||||
*/
|
*/
|
||||||
public abstract void update(D data) throws DAOException;
|
public abstract D update(D data) throws DAOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Efface du support persistant le contenu équivalent à l'objet {@link D}
|
* Efface du support persistant le contenu équivalent à l'objet {@link D}
|
||||||
|
|||||||
@@ -63,13 +63,13 @@ public class DAO_JPA_Game extends DAO<Game> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create(Game data) throws DAOException {
|
public Game create(Game data) throws DAOException {
|
||||||
update(data);
|
return update(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Game data) throws DAOException {
|
public Game update(Game data) throws DAOException {
|
||||||
entityManager.merge(data);
|
return entityManager.merge(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -57,13 +57,13 @@ public class DAO_JPA_Player extends DAO<Player> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create(Player data) throws DAOException {
|
public Player create(Player data) throws DAOException {
|
||||||
update(data);
|
return update(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Player data) throws DAOException {
|
public Player update(Player data) throws DAOException {
|
||||||
entityManager.merge(data);
|
return entityManager.merge(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+4
-4
@@ -56,13 +56,13 @@ public class DAO_JPA_RecoveryPasswordToken extends DAO<RecoveryPasswordToken> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create(RecoveryPasswordToken data) throws DAOException {
|
public RecoveryPasswordToken create(RecoveryPasswordToken data) throws DAOException {
|
||||||
update(data);
|
return update(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(RecoveryPasswordToken data) throws DAOException {
|
public RecoveryPasswordToken update(RecoveryPasswordToken data) throws DAOException {
|
||||||
entityManager.merge(data);
|
return entityManager.merge(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -56,13 +56,13 @@ public class DAO_JPA_User extends DAO<User> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create(User data) throws DAOException {
|
public User create(User data) throws DAOException {
|
||||||
update(data);
|
return update(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(User data) throws DAOException {
|
public User update(User data) throws DAOException {
|
||||||
entityManager.merge(data);
|
return entityManager.merge(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
package uppa.project.pojo.json;
|
|
||||||
|
|
||||||
public class LoginRequest {
|
|
||||||
|
|
||||||
private String username;
|
|
||||||
private String password;
|
|
||||||
|
|
||||||
public LoginRequest() {}
|
|
||||||
public LoginRequest(String username, String password) {
|
|
||||||
this.username = username;
|
|
||||||
this.password = password;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUsername() {
|
|
||||||
return username;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUsername(String username) {
|
|
||||||
this.username = username;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPassword() {
|
|
||||||
return password;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPassword(String password) {
|
|
||||||
this.password = password;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* LoginResponse.java, 20/03/2024
|
|
||||||
* UPPA M1 TI 2023-2024
|
|
||||||
* Pas de copyright, aucun droits
|
|
||||||
*/
|
|
||||||
|
|
||||||
package uppa.project.pojo.json;
|
|
||||||
|
|
||||||
import uppa.project.pojo.User;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Classe représentant une réponse de connexion
|
|
||||||
*
|
|
||||||
* @author Kevin Mitresse
|
|
||||||
* @author Lucàs Vabre
|
|
||||||
*/
|
|
||||||
public class LoginResponse extends HttpResponse {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Utilisateur connecté
|
|
||||||
*/
|
|
||||||
private final User user;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* L'url de redirection
|
|
||||||
*/
|
|
||||||
private final String redirect;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructeur
|
|
||||||
* @param status code HTTP de la réponse
|
|
||||||
* @param user utilisateur connecté
|
|
||||||
* @param redirect url de redirection
|
|
||||||
*/
|
|
||||||
public LoginResponse(int status, User user, String redirect) {
|
|
||||||
super(status);
|
|
||||||
this.user = user;
|
|
||||||
this.redirect = redirect;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return l'utilisateur connecté
|
|
||||||
*/
|
|
||||||
public User getUser() {
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return l'url de redirection
|
|
||||||
*/
|
|
||||||
public String getRedirect() {
|
|
||||||
return redirect;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -48,6 +48,7 @@ public class MainMenuServlet extends HttpServlet {
|
|||||||
}
|
}
|
||||||
for(HttpSession session : loginsSessions) {
|
for(HttpSession session : loginsSessions) {
|
||||||
User connectedUser = (User) session.getAttribute("user");
|
User connectedUser = (User) session.getAttribute("user");
|
||||||
|
System.out.println(connectedUser.toString());
|
||||||
if(session.getServletContext().getContextPath().equals(request.getServletContext().getContextPath()) && connectedUser != null && !connectedUser.equals(sessionUser)) {
|
if(session.getServletContext().getContextPath().equals(request.getServletContext().getContextPath()) && connectedUser != null && !connectedUser.equals(sessionUser)) {
|
||||||
connectedUsers.add(connectedUser);
|
connectedUsers.add(connectedUser);
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-35
@@ -7,9 +7,6 @@
|
|||||||
package uppa.project.servlet.api.auth;
|
package uppa.project.servlet.api.auth;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import com.google.gson.JsonParser;
|
|
||||||
import jakarta.servlet.annotation.WebServlet;
|
import jakarta.servlet.annotation.WebServlet;
|
||||||
import jakarta.servlet.http.HttpServlet;
|
import jakarta.servlet.http.HttpServlet;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
@@ -20,15 +17,17 @@ import java.io.PrintWriter;
|
|||||||
import uppa.project.dao.DAO;
|
import uppa.project.dao.DAO;
|
||||||
import uppa.project.dao.DAOException;
|
import uppa.project.dao.DAOException;
|
||||||
import uppa.project.dao.jpa.Game_JPA_DAO_Factory;
|
import uppa.project.dao.jpa.Game_JPA_DAO_Factory;
|
||||||
|
import uppa.project.listener.SessionServletContextListener;
|
||||||
import uppa.project.pojo.User;
|
import uppa.project.pojo.User;
|
||||||
import uppa.project.pojo.json.ErrorResponse;
|
|
||||||
import uppa.project.pojo.json.LoginRequest;
|
|
||||||
import uppa.project.pojo.json.LoginResponse;
|
|
||||||
import uppa.project.utils.HttpRequestUtils;
|
|
||||||
|
|
||||||
@WebServlet(name = "authLoginServlet", value = "/api/auth/login")
|
@WebServlet(name = "authLoginServlet", value = "/api/auth/login")
|
||||||
public class AuthLoginServlet extends HttpServlet {
|
public class AuthLoginServlet extends HttpServlet {
|
||||||
|
|
||||||
|
private static class JsonRequest {
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
}
|
||||||
|
|
||||||
private final Gson gson = new Gson();
|
private final Gson gson = new Gson();
|
||||||
|
|
||||||
public void init() {
|
public void init() {
|
||||||
@@ -47,41 +46,22 @@ public class AuthLoginServlet extends HttpServlet {
|
|||||||
sb.append(line);
|
sb.append(line);
|
||||||
}
|
}
|
||||||
String requestBody = sb.toString();
|
String requestBody = sb.toString();
|
||||||
LoginRequest loginRequest = gson.fromJson(requestBody, LoginRequest.class);
|
JsonRequest jsonRequest = gson.fromJson(requestBody, JsonRequest.class);
|
||||||
|
|
||||||
// Check if the username and password are present
|
// Login User
|
||||||
if (loginRequest.getUsername() == null || loginRequest.getPassword() == null) {
|
User user = loginUser(jsonRequest);
|
||||||
int STATUS = 400;
|
|
||||||
ErrorResponse error = new ErrorResponse(STATUS, "Bad Request", "Username and password are required");
|
|
||||||
response.setStatus(STATUS);
|
|
||||||
out.println(gson.toJson(error));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get User from database matching the username and password
|
// Set user in session
|
||||||
User user = AuthLoginServlet.loginUser(loginRequest);
|
|
||||||
if (user == null) {
|
|
||||||
int STATUS = 401;
|
|
||||||
ErrorResponse error = new ErrorResponse(STATUS, "Unauthorized", "Invalid username or password");
|
|
||||||
|
|
||||||
response.setStatus(STATUS);
|
|
||||||
out.println(gson.toJson(error));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the user in the session
|
|
||||||
request.getSession().setAttribute("user", user);
|
request.getSession().setAttribute("user", user);
|
||||||
|
SessionServletContextListener.addSession(request.getSession());
|
||||||
|
|
||||||
// Return the user as JSON
|
out.println(gson.toJson(user));
|
||||||
LoginResponse loginResponse = new LoginResponse(200, user, request.getContextPath() + "/main-menu");
|
|
||||||
String json = gson.toJson(loginResponse);
|
|
||||||
out.println(json);
|
|
||||||
out.flush();
|
out.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static User loginUser(LoginRequest loginRequest) {
|
private static User loginUser(JsonRequest jsonRequest) {
|
||||||
String username = loginRequest.getUsername();
|
String username = jsonRequest.username;
|
||||||
String password = loginRequest.getPassword();
|
String password = jsonRequest.password;
|
||||||
|
|
||||||
Game_JPA_DAO_Factory factory = new Game_JPA_DAO_Factory();
|
Game_JPA_DAO_Factory factory = new Game_JPA_DAO_Factory();
|
||||||
try {
|
try {
|
||||||
|
|||||||
+104
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* RegisterApiServlet.java, 03/04/2024
|
||||||
|
* UPPA M1 TI 2023-2024
|
||||||
|
* Pas de copyright, aucun droits
|
||||||
|
*/
|
||||||
|
|
||||||
|
package uppa.project.servlet.api.auth;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import jakarta.persistence.EntityManager;
|
||||||
|
import jakarta.servlet.annotation.WebServlet;
|
||||||
|
import jakarta.servlet.http.HttpServlet;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Locale;
|
||||||
|
import uppa.project.dao.DAO;
|
||||||
|
import uppa.project.dao.DAOException;
|
||||||
|
import uppa.project.pojo.User;
|
||||||
|
import uppa.project.dao.jpa.Game_JPA_DAO_Factory;
|
||||||
|
import uppa.project.provider.EntityManagerProvider;
|
||||||
|
|
||||||
|
@WebServlet(name = "authRegisterServlet", value = "/api/auth/register")
|
||||||
|
public class AuthRegisterServlet extends HttpServlet {
|
||||||
|
|
||||||
|
private class JsonRequest {
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
private String email;
|
||||||
|
private String birthdate;
|
||||||
|
|
||||||
|
private String gender;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Gson gson = new Gson();
|
||||||
|
|
||||||
|
public void init() {}
|
||||||
|
|
||||||
|
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
||||||
|
response.setContentType("application/json");
|
||||||
|
response.setCharacterEncoding("UTF-8");
|
||||||
|
PrintWriter out = response.getWriter();
|
||||||
|
|
||||||
|
// Get the json in the request body
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
BufferedReader reader = request.getReader();
|
||||||
|
String line;
|
||||||
|
while((line = reader.readLine()) != null) {
|
||||||
|
sb.append(line);
|
||||||
|
}
|
||||||
|
String requestBody = sb.toString();
|
||||||
|
JsonRequest jsonRequest = gson.fromJson(requestBody, JsonRequest.class);
|
||||||
|
|
||||||
|
// Create the user
|
||||||
|
User user = this.createUser(jsonRequest);
|
||||||
|
if (user == null) {
|
||||||
|
// TODO send error
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
out.println(gson.toJson(user));
|
||||||
|
out.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
private User createUser(JsonRequest jsonRequest) {
|
||||||
|
|
||||||
|
// Create a new User
|
||||||
|
User user = new User();
|
||||||
|
user.setUsername(jsonRequest.username);
|
||||||
|
user.setPassword(jsonRequest.password);
|
||||||
|
user.setEmail(jsonRequest.email);
|
||||||
|
user.setGender(User.Gender.valueOf(jsonRequest.gender));
|
||||||
|
|
||||||
|
// convert the birthdate from String as YYYY-MM-DD to Date object)
|
||||||
|
LocalDate localDate = LocalDate.parse(jsonRequest.birthdate);
|
||||||
|
ZoneId defaultZoneId = ZoneId.systemDefault();
|
||||||
|
Date date = Date.from(localDate.atStartOfDay(defaultZoneId).toInstant());
|
||||||
|
user.setBirth(date);
|
||||||
|
|
||||||
|
// Send the user to the database
|
||||||
|
EntityManager entityManager = EntityManagerProvider.getInstance();
|
||||||
|
|
||||||
|
entityManager.getTransaction().begin();
|
||||||
|
try {
|
||||||
|
Game_JPA_DAO_Factory jpaDaoFactory = new Game_JPA_DAO_Factory();
|
||||||
|
DAO<User> userDAO = jpaDaoFactory.getDAOUser();
|
||||||
|
|
||||||
|
User newUser = userDAO.create(user);
|
||||||
|
entityManager.getTransaction().commit();
|
||||||
|
return newUser;
|
||||||
|
} catch(DAOException e) {
|
||||||
|
entityManager.getTransaction().rollback();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void destroy() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,20 +7,14 @@ loginForm.addEventListener("submit", (event) => {
|
|||||||
const data = {};
|
const data = {};
|
||||||
formData.forEach((value, key) => data[key] = value);
|
formData.forEach((value, key) => data[key] = value);
|
||||||
|
|
||||||
const action = loginForm.getAttribute("action")
|
fetch(loginForm.getAttribute("action"), {
|
||||||
const method = loginForm.getAttribute("method")
|
|
||||||
|
|
||||||
fetch(action, {
|
|
||||||
headers: {"Content-Type": "application/json"},
|
headers: {"Content-Type": "application/json"},
|
||||||
body: JSON.stringify(data),
|
body: JSON.stringify(data),
|
||||||
method,
|
method: loginForm.getAttribute("method"),
|
||||||
})
|
})
|
||||||
.then(res => console.log(res))
|
.then(res => res.json())
|
||||||
//.then(data => {
|
.then(d => window.location.href = "./main-menu")
|
||||||
// if (data.status === 200) window.location.href = data.redirect;
|
.catch(error => console.error("Error:", error));
|
||||||
//})
|
|
||||||
.catch(error => console.error("Error:", error))
|
|
||||||
;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +1,21 @@
|
|||||||
const registerForm = document.getElementById("register-form");
|
const registerForm = document.getElementById("register-form");
|
||||||
const confirmPassword = document.getElementById("confirmPassword");
|
const confirmPassword = document.getElementById("confirmPassword");
|
||||||
|
|
||||||
registerForm.addEventListener("submit", function (event) {
|
registerForm.addEventListener("submit", (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
const formData = new FormData(registerForm);
|
const formData = new FormData(registerForm);
|
||||||
|
|
||||||
const data = {};
|
const data = {};
|
||||||
formData.forEach((value, key) => data[key] = value);
|
formData.forEach((value, key) => data[key] = value);
|
||||||
|
|
||||||
const action = loginForm.getAttribute("action")
|
fetch(registerForm.getAttribute("action"), {
|
||||||
const method = loginForm.getAttribute("method")
|
method: registerForm.getAttribute("method"),
|
||||||
|
headers: {"Content-Type": "application/json"},
|
||||||
|
|
||||||
fetch("/reset-password", {
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "application/json"
|
|
||||||
},
|
|
||||||
body: JSON.stringify(data)
|
body: JSON.stringify(data)
|
||||||
}).then(response => {
|
})
|
||||||
if (response.ok) {
|
.then(res => res.json())
|
||||||
window.location.href = "/login";
|
.then(_ => {
|
||||||
} else {
|
window.location.href = "./login"
|
||||||
response.json().then(data => {
|
})
|
||||||
alert(data.message);
|
.catch(error => console.error("Error: " + error))
|
||||||
});
|
|
||||||
}
|
|
||||||
}).catch(error => console.error("Error:", error));
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<div class="flex-column register-gap">
|
<div class="flex-column register-gap">
|
||||||
<div>
|
<div>
|
||||||
<h1>Register</h1>
|
<h1>Register</h1>
|
||||||
<form id="register-form" action="${pageContext.request.contextPath}/register" method="post">
|
<form id="register-form" action="${pageContext.request.contextPath}/api/auth/register" method="POST">
|
||||||
|
|
||||||
<label for="email">Email :</label>
|
<label for="email">Email :</label>
|
||||||
<input type="email" id="email" name="email" required>
|
<input type="email" id="email" name="email" required>
|
||||||
|
|||||||
Reference in New Issue
Block a user