From 469b037232e3f9a9abb73dbe3a34771a39824574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luc=C3=A0s?= Date: Wed, 17 Apr 2024 13:59:16 +0200 Subject: [PATCH] feat!(DevWeb): Add BulmaCSS, refacto, handle error on login pages, use bean, filters and tags --- S2/DevWeb/Projet/pom.xml | 8 + .../src/main/java/uppa/project/Main.java | 10 +- .../java/uppa/project/bean/LoginBean.java | 58 +++++++ .../java/uppa/project/bean/RegisterBean.java | 127 +++++++++++++++ .../dao/AbstractDAOFactory.java | 4 +- .../uppa/project/{ => database}/dao/DAO.java | 2 +- .../{ => database}/dao/DAOException.java | 2 +- .../dao}/EntityManagerProvider.java | 2 +- .../{ => database}/dao/GameDAOFactory.java | 10 +- .../{ => database}/dao/PersistenceKind.java | 2 +- .../{ => database}/dao/jpa/DAO_JPA_Game.java | 11 +- .../dao/jpa/DAO_JPA_Player.java | 10 +- .../jpa/DAO_JPA_RecoveryPasswordToken.java | 10 +- .../{ => database}/dao/jpa/DAO_JPA_User.java | 10 +- .../dao/jpa/Game_JPA_DAO_Factory.java | 13 +- .../project/{ => database}/pojo/Card.java | 2 +- .../project/{ => database}/pojo/Deck.java | 3 +- .../project/{ => database}/pojo/Game.java | 4 +- .../project/{ => database}/pojo/Player.java | 2 +- .../pojo/RecoveryPasswordToken.java | 2 +- .../project/{ => database}/pojo/User.java | 5 +- .../java/uppa/project/json/HttpResponse.java | 37 +++++ .../uppa/project/json/HttpResponseCode.java | 23 +++ .../{pojo => }/json/websocket/Message.java | 2 +- .../uppa/project/pojo/json/ErrorResponse.java | 53 ------- .../uppa/project/pojo/json/HttpResponse.java | 37 ----- .../uppa/project/servlet/LoginServlet.java | 33 ---- .../uppa/project/servlet/RegisterServlet.java | 34 ---- .../servlet/api/auth/AuthLoginServlet.java | 82 ---------- .../servlet/api/auth/AuthRegisterServlet.java | 103 ------------ .../web/filter/AlreadyLoggedFilter.java | 31 ++++ .../web/filter/AuthenticationFilter.java | 32 ++++ .../servlet/ForgottenPasswordServlet.java | 16 +- .../{ => web}/servlet/IndexServlet.java | 9 +- .../project/web/servlet/LoginServlet.java | 59 +++++++ .../{ => web}/servlet/LogoutServlet.java | 9 +- .../{ => web}/servlet/MainMenuServlet.java | 15 +- .../project/web/servlet/RegisterServlet.java | 63 ++++++++ .../servlet/ResetPasswordServlet.java | 14 +- .../websocket/ConnectedUsersWS.java} | 22 +-- .../main/resources/META-INF/persistence.xml | 16 +- .../main/webapp/WEB-INF/components/navbar.jsp | 2 +- .../webapp/WEB-INF/components/new-game.jsp | 6 +- .../webapp/WEB-INF/components/statistics.jsp | 8 +- .../{views => pages}/forgotten-password.jsp | 0 .../webapp/WEB-INF/{views => pages}/index.jsp | 2 +- .../src/main/webapp/WEB-INF/pages/login.jsp | 24 +++ .../main/webapp/WEB-INF/pages/main-menu.jsp | 61 +++++++ .../main/webapp/WEB-INF/pages/register.jsp | 76 +++++++++ .../{views => pages}/reset-password.jsp | 0 .../webapp/WEB-INF/tags/components/card.tag | 12 ++ .../tags/components/connectedUserList.tag | 85 ++++++++++ .../webapp/WEB-INF/tags/components/footer.tag | 9 ++ .../webapp/WEB-INF/tags/components/navbar.tag | 35 ++++ .../main/webapp/WEB-INF/tags/forms/login.tag | 123 ++++++++++++++ .../webapp/WEB-INF/tags/forms/newGame.tag | 56 +++++++ .../webapp/WEB-INF/tags/forms/register.tag | 150 ++++++++++++++++++ .../main/webapp/WEB-INF/tags/layouts/base.tag | 26 +++ .../src/main/webapp/WEB-INF/views/login.jsp | 39 ----- .../main/webapp/WEB-INF/views/main-menu.jsp | 32 ---- .../main/webapp/WEB-INF/views/register.jsp | 52 ------ .../Projet/src/main/webapp/WEB-INF/web.xml | 23 +++ .../src/main/webapp/components/navbar.jsp | 16 ++ .../main/webapp/static/img/CardsRushLogo.svg | 8 +- .../webapp/static/img/CardsRushLogoBlack.svg | 21 +++ .../Projet/src/main/webapp/static/js/login.js | 28 ---- .../src/main/webapp/static/js/main-menu.js | 25 --- .../src/main/webapp/static/js/register.js | 21 --- .../project/dao/AbstractDAOFactoryTest.java | 6 +- .../project/dao/jpa/DAO_JPA_GameTest.java | 10 +- .../project/dao/jpa/DAO_JPA_PlayerTest.java | 15 +- .../DAO_JPA_RecoveryPasswordTokenTest.java | 12 +- .../project/dao/jpa/DAO_JPA_UserTest.java | 10 +- .../dao/jpa/Game_JPA_DAO_FactoryTest.java | 9 +- .../test/java/uppa/project/pojo/CardTest.java | 1 + .../test/java/uppa/project/pojo/DeckTest.java | 2 + .../test/java/uppa/project/pojo/GameTest.java | 4 + .../java/uppa/project/pojo/PlayerTest.java | 4 + .../pojo/RecoveryPasswordTokenTest.java | 2 + .../test/java/uppa/project/pojo/UserTest.java | 3 + .../provider/EntityManagerProviderTest.java | 1 + 81 files changed, 1315 insertions(+), 691 deletions(-) create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/bean/LoginBean.java create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/bean/RegisterBean.java rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/AbstractDAOFactory.java (87%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/DAO.java (98%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/DAOException.java (93%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{provider => database/dao}/EntityManagerProvider.java (96%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/GameDAOFactory.java (85%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/PersistenceKind.java (89%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/jpa/DAO_JPA_Game.java (89%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/jpa/DAO_JPA_Player.java (88%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/jpa/DAO_JPA_RecoveryPasswordToken.java (89%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/jpa/DAO_JPA_User.java (88%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/dao/jpa/Game_JPA_DAO_Factory.java (74%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/pojo/Card.java (97%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/pojo/Deck.java (97%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/pojo/Game.java (99%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/pojo/Player.java (99%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/pojo/RecoveryPasswordToken.java (99%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => database}/pojo/User.java (99%) create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/json/HttpResponse.java create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/json/HttpResponseCode.java rename S2/DevWeb/Projet/src/main/java/uppa/project/{pojo => }/json/websocket/Message.java (90%) delete mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/ErrorResponse.java delete mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/HttpResponse.java delete mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/servlet/LoginServlet.java delete mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/servlet/RegisterServlet.java delete mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthLoginServlet.java delete mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthRegisterServlet.java create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/web/filter/AlreadyLoggedFilter.java create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/web/filter/AuthenticationFilter.java rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => web}/servlet/ForgottenPasswordServlet.java (92%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => web}/servlet/IndexServlet.java (74%) create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/LoginServlet.java rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => web}/servlet/LogoutServlet.java (77%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => web}/servlet/MainMenuServlet.java (84%) create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/RegisterServlet.java rename S2/DevWeb/Projet/src/main/java/uppa/project/{ => web}/servlet/ResetPasswordServlet.java (89%) rename S2/DevWeb/Projet/src/main/java/uppa/project/{websocket/MainMenuWS.java => web/websocket/ConnectedUsersWS.java} (72%) rename S2/DevWeb/Projet/src/main/webapp/WEB-INF/{views => pages}/forgotten-password.jsp (100%) rename S2/DevWeb/Projet/src/main/webapp/WEB-INF/{views => pages}/index.jsp (95%) create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/pages/login.jsp create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/pages/main-menu.jsp create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/pages/register.jsp rename S2/DevWeb/Projet/src/main/webapp/WEB-INF/{views => pages}/reset-password.jsp (100%) create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/card.tag create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/connectedUserList.tag create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/footer.tag create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/navbar.tag create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/forms/login.tag create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/forms/newGame.tag create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/forms/register.tag create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/layouts/base.tag delete mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/views/login.jsp delete mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/views/main-menu.jsp delete mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/views/register.jsp create mode 100644 S2/DevWeb/Projet/src/main/webapp/components/navbar.jsp create mode 100644 S2/DevWeb/Projet/src/main/webapp/static/img/CardsRushLogoBlack.svg delete mode 100644 S2/DevWeb/Projet/src/main/webapp/static/js/login.js delete mode 100644 S2/DevWeb/Projet/src/main/webapp/static/js/main-menu.js delete mode 100644 S2/DevWeb/Projet/src/main/webapp/static/js/register.js diff --git a/S2/DevWeb/Projet/pom.xml b/S2/DevWeb/Projet/pom.xml index da36ff7..1a486c5 100644 --- a/S2/DevWeb/Projet/pom.xml +++ b/S2/DevWeb/Projet/pom.xml @@ -46,6 +46,14 @@ mysql-connector-java 8.0.27 + + + javax.servlet.jsp + javax.servlet.jsp-api + 2.3.3 + provided + + org.junit.jupiter junit-jupiter-api diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/Main.java b/S2/DevWeb/Projet/src/main/java/uppa/project/Main.java index 5ceacfc..72543a9 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/Main.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/Main.java @@ -1,12 +1,8 @@ package uppa.project; -import java.util.Calendar; -import uppa.project.dao.DAO; -import uppa.project.dao.DAOException; -import uppa.project.dao.jpa.Game_JPA_DAO_Factory; -import uppa.project.pojo.Card; -import uppa.project.pojo.Deck; -import uppa.project.pojo.User; +import uppa.project.database.dao.DAOException; +import uppa.project.database.pojo.Card; +import uppa.project.database.pojo.Deck; public class Main { diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/bean/LoginBean.java b/S2/DevWeb/Projet/src/main/java/uppa/project/bean/LoginBean.java new file mode 100644 index 0000000..f62777b --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/bean/LoginBean.java @@ -0,0 +1,58 @@ +package uppa.project.bean; + +import java.io.Serializable; +import uppa.project.database.dao.DAO; +import uppa.project.database.dao.DAOException; +import uppa.project.database.dao.jpa.Game_JPA_DAO_Factory; +import uppa.project.database.pojo.User; + +public class LoginBean implements Serializable { + + private static final long serialVersionUID = 1L; + + private String username; + private String password; + private User user; + + public LoginBean() { + } + + public LoginBean(String username, String password) { + this.username = username; + this.password = password; + } + + public boolean validate() { + Game_JPA_DAO_Factory factory = new Game_JPA_DAO_Factory(); + + try { + DAO userDao = factory.getDAOUser(); + User[] user = userDao.findByField("username", username); + + for (User u : user) { + if (u.getUsername().equals(username)) { + this.user = u; + return true; + } + } + + } catch (DAOException e) { + throw new RuntimeException(e); + } + return false; + } + + public User getUser() { + return user; + } + + public LoginBean setUsername(String username) { + this.username = username; + return this; + } + + public LoginBean setPassword(String password) { + this.password = password; + return this; + } +} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/bean/RegisterBean.java b/S2/DevWeb/Projet/src/main/java/uppa/project/bean/RegisterBean.java new file mode 100644 index 0000000..25d5d8f --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/bean/RegisterBean.java @@ -0,0 +1,127 @@ +package uppa.project.bean; + +import jakarta.persistence.EntityManager; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; +import uppa.project.database.dao.DAO; +import uppa.project.database.dao.DAOException; +import uppa.project.database.dao.EntityManagerProvider; +import uppa.project.database.dao.jpa.Game_JPA_DAO_Factory; +import uppa.project.database.pojo.User; + +public class RegisterBean implements Serializable { + + private static final long serialVersionUID = 1L; + + private String username; + private String email; + private String password; + private String birth; + private String gender; + private String errorMessage; + + public RegisterBean() { + } + + public RegisterBean(String username, String email, String password, String birth, String gender) { + this.username = username; + this.email = email; + this.password = password; + this.birth = birth; + this.gender = gender; + } + + public boolean validate() { + Game_JPA_DAO_Factory jpaDaoFactory = new Game_JPA_DAO_Factory(); + DAO userDAO; + + // Check if the user is valid + try { + userDAO = jpaDaoFactory.getDAOUser(); + + // Check if the username is already taken + User[] users = userDAO.findByField("username", username); + if (users.length > 0) { + errorMessage = "Ce nom d'utilisateur est déjà pris"; + return false; + } + + // Check if the email is already taken + users = userDAO.findByField("email", email); + if (users.length > 0) { + errorMessage = "Cet email est déjà utilisé"; + return false; + } + } catch(DAOException e) { + errorMessage = "Une erreur est survenue (DB_CONNECTION_ERROR)"; + return false; + } + + // Create a new User + User user = new User(); + user.setUsername(username); + user.setPassword(password); + user.setEmail(email); + try { + user.setGender(User.Gender.valueOf(gender)); + } catch (IllegalArgumentException e) { + errorMessage = "Le genre n'est pas valide"; + return false; + } + + // convert the birthdate from String as YYYY-MM-DD to Date object + try { + LocalDate localDate = LocalDate.parse(birth); + ZoneId defaultZoneId = ZoneId.systemDefault(); + Date date = Date.from(localDate.atStartOfDay(defaultZoneId).toInstant()); + user.setBirth(date); + } catch (Exception e) { + errorMessage = "La date de naissance n'est pas valide"; + return false; + } + + // Send the user to the database + EntityManager entityManager = EntityManagerProvider.getInstance(); + entityManager.getTransaction().begin(); + try { + userDAO = jpaDaoFactory.getDAOUser(); + userDAO.create(user); + entityManager.getTransaction().commit(); + return true; + } catch(DAOException e) { + entityManager.getTransaction().rollback(); + } + return false; + } + + public RegisterBean setUsername(String username) { + this.username = username; + return this; + } + + public RegisterBean setPassword(String password) { + this.password = password; + return this; + } + + public RegisterBean setEmail(String email) { + this.email = email; + return this; + } + + public RegisterBean setBirth(String birth) { + this.birth = birth; + return this; + } + + public RegisterBean setGender(String gender) { + this.gender = gender; + return this; + } + + public String getErrorMessage() { + return errorMessage; + } +} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/AbstractDAOFactory.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/AbstractDAOFactory.java similarity index 87% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/AbstractDAOFactory.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/AbstractDAOFactory.java index 2337c4d..7d19acc 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/AbstractDAOFactory.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/AbstractDAOFactory.java @@ -4,9 +4,9 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao; +package uppa.project.database.dao; -import uppa.project.dao.jpa.Game_JPA_DAO_Factory; +import uppa.project.database.dao.jpa.Game_JPA_DAO_Factory; /** * Factory renvoyant une factory de DAO en fonction du support de persistance choisi diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAO.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAO.java similarity index 98% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAO.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAO.java index 5033597..3360e69 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAO.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAO.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao; +package uppa.project.database.dao; /** * DAO abstrait et générique pour tout type de données diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAOException.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAOException.java similarity index 93% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAOException.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAOException.java index 2bdc028..8d6f8f3 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/DAOException.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAOException.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao; +package uppa.project.database.dao; /** * Exception spécifique aux problèmes d'accès aux données via un DAO diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/provider/EntityManagerProvider.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/EntityManagerProvider.java similarity index 96% rename from S2/DevWeb/Projet/src/main/java/uppa/project/provider/EntityManagerProvider.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/EntityManagerProvider.java index c9e428a..bf29418 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/provider/EntityManagerProvider.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/EntityManagerProvider.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.provider; +package uppa.project.database.dao; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/GameDAOFactory.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/GameDAOFactory.java similarity index 85% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/GameDAOFactory.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/GameDAOFactory.java index 51faef7..68abea3 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/GameDAOFactory.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/GameDAOFactory.java @@ -4,12 +4,12 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao; +package uppa.project.database.dao; -import uppa.project.pojo.Game; -import uppa.project.pojo.Player; -import uppa.project.pojo.RecoveryPasswordToken; -import uppa.project.pojo.User; +import uppa.project.database.pojo.Game; +import uppa.project.database.pojo.Player; +import uppa.project.database.pojo.RecoveryPasswordToken; +import uppa.project.database.pojo.User; /** * Fabrique abstraite de DAO pour le schéma du jeu diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/PersistenceKind.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/PersistenceKind.java similarity index 89% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/PersistenceKind.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/PersistenceKind.java index 4efcb28..585ed62 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/PersistenceKind.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/PersistenceKind.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao; +package uppa.project.database.dao; /** * Type de support de persistance pour les données diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Game.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_Game.java similarity index 89% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Game.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_Game.java index 4ef7fd3..baad0a0 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Game.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_Game.java @@ -4,17 +4,16 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao.jpa; +package uppa.project.database.dao.jpa; import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import java.math.BigDecimal; import java.util.List; -import java.util.Objects; -import uppa.project.dao.DAO; -import uppa.project.dao.DAOException; -import uppa.project.pojo.Game; -import uppa.project.provider.EntityManagerProvider; +import uppa.project.database.dao.DAO; +import uppa.project.database.dao.DAOException; +import uppa.project.database.pojo.Game; +import uppa.project.database.dao.EntityManagerProvider; /** * DAO pour les parties de jeu diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Player.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_Player.java similarity index 88% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Player.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_Player.java index e1cce19..673846f 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_Player.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_Player.java @@ -4,16 +4,16 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao.jpa; +package uppa.project.database.dao.jpa; import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import java.math.BigDecimal; import java.util.List; -import uppa.project.dao.DAO; -import uppa.project.dao.DAOException; -import uppa.project.pojo.Player; -import uppa.project.provider.EntityManagerProvider; +import uppa.project.database.dao.DAO; +import uppa.project.database.dao.DAOException; +import uppa.project.database.dao.EntityManagerProvider; +import uppa.project.database.pojo.Player; /** * DAO pour les joueurs diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_RecoveryPasswordToken.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_RecoveryPasswordToken.java similarity index 89% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_RecoveryPasswordToken.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_RecoveryPasswordToken.java index 2ee6e7b..c07c920 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_RecoveryPasswordToken.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_RecoveryPasswordToken.java @@ -4,16 +4,16 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao.jpa; +package uppa.project.database.dao.jpa; import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import java.math.BigDecimal; import java.util.List; -import uppa.project.dao.DAO; -import uppa.project.dao.DAOException; -import uppa.project.pojo.RecoveryPasswordToken; -import uppa.project.provider.EntityManagerProvider; +import uppa.project.database.dao.DAO; +import uppa.project.database.dao.DAOException; +import uppa.project.database.dao.EntityManagerProvider; +import uppa.project.database.pojo.RecoveryPasswordToken; /** * DAO pour les tokens de récupération de mot de passe diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_User.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_User.java similarity index 88% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_User.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_User.java index 34289f2..fb3ede3 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/DAO_JPA_User.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/DAO_JPA_User.java @@ -4,16 +4,16 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao.jpa; +package uppa.project.database.dao.jpa; import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import java.math.BigDecimal; import java.util.List; -import uppa.project.dao.DAO; -import uppa.project.dao.DAOException; -import uppa.project.pojo.User; -import uppa.project.provider.EntityManagerProvider; +import uppa.project.database.dao.DAO; +import uppa.project.database.dao.DAOException; +import uppa.project.database.pojo.User; +import uppa.project.database.dao.EntityManagerProvider; /** * DAO pour les utilisateurs diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/Game_JPA_DAO_Factory.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/Game_JPA_DAO_Factory.java similarity index 74% rename from S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/Game_JPA_DAO_Factory.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/Game_JPA_DAO_Factory.java index 3e80654..6286b90 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/dao/jpa/Game_JPA_DAO_Factory.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/jpa/Game_JPA_DAO_Factory.java @@ -4,12 +4,15 @@ * Pas de copyright, aucun droits */ -package uppa.project.dao.jpa; +package uppa.project.database.dao.jpa; -import uppa.project.dao.DAO; -import uppa.project.pojo.*; -import uppa.project.dao.DAOException; -import uppa.project.dao.GameDAOFactory; +import uppa.project.database.dao.DAO; +import uppa.project.database.dao.GameDAOFactory; +import uppa.project.database.pojo.Game; +import uppa.project.database.pojo.Player; +import uppa.project.database.pojo.RecoveryPasswordToken; +import uppa.project.database.pojo.User; +import uppa.project.database.dao.DAOException; /** * Fabrique concrète de DAO pour le schéma relationnel sports avec une implémentation en JDBC. diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Card.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Card.java similarity index 97% rename from S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Card.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Card.java index 4907a66..05f67f4 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Card.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Card.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.pojo; +package uppa.project.database.pojo; import jakarta.persistence.Transient; diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Deck.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Deck.java similarity index 97% rename from S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Deck.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Deck.java index 0e4917e..3278729 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Deck.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Deck.java @@ -4,9 +4,8 @@ * Pas de copyright, aucun droits */ -package uppa.project.pojo; +package uppa.project.database.pojo; -import jakarta.persistence.Transient; import java.util.ArrayList; import java.util.Collections; diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Game.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Game.java similarity index 99% rename from S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Game.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Game.java index d18e146..97454b6 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Game.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Game.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.pojo; +package uppa.project.database.pojo; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -25,8 +25,6 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.Objects; -import java.util.Timer; -import java.util.TimerTask; /** * Représentation d'une partie de jeu diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Player.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Player.java similarity index 99% rename from S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Player.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Player.java index 04aed00..c9602bc 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/Player.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/Player.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.pojo; +package uppa.project.database.pojo; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/RecoveryPasswordToken.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/RecoveryPasswordToken.java similarity index 99% rename from S2/DevWeb/Projet/src/main/java/uppa/project/pojo/RecoveryPasswordToken.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/RecoveryPasswordToken.java index 3811501..8e7043e 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/RecoveryPasswordToken.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/RecoveryPasswordToken.java @@ -1,4 +1,4 @@ -package uppa.project.pojo; +package uppa.project.database.pojo; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/User.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/User.java similarity index 99% rename from S2/DevWeb/Projet/src/main/java/uppa/project/pojo/User.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/User.java index 8cccbb4..fe3a59d 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/User.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/pojo/User.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.pojo; +package uppa.project.database.pojo; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -23,8 +23,6 @@ import java.io.Serializable; import java.math.BigDecimal; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.time.LocalDate; -import java.time.Period; import java.util.ArrayList; import java.util.Date; import java.util.Objects; @@ -195,6 +193,7 @@ public class User implements Serializable { /** * Modifie le mot de passe de l'utilisateur + * Le mot de passe est hashé avant d'être stocké * * @param password le nouveau mot de passe */ diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/json/HttpResponse.java b/S2/DevWeb/Projet/src/main/java/uppa/project/json/HttpResponse.java new file mode 100644 index 0000000..44c3862 --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/json/HttpResponse.java @@ -0,0 +1,37 @@ +/* + * HttpResponse.java, 20/03/2024 + * UPPA M1 TI 2023-2024 + * Pas de copyright, aucun droits + */ + +package uppa.project.json; + +/** + * Classe représentant une réponse HTTP + * + * @author Kevin Mitresse + * @author Lucàs Vabre + */ +public class HttpResponse { + + /** + * Défini si la réponse est un succès + */ + protected final int code; + + /** + * Message de la réponse + */ + protected final String message; + + /** + * Constructeur + * + * @param code code HTTP de l'erreur + * @param message message d'erreur + */ + public HttpResponse(HttpResponseCode code, String message) { + this.code = code.getCode(); + this.message = message; + } +} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/json/HttpResponseCode.java b/S2/DevWeb/Projet/src/main/java/uppa/project/json/HttpResponseCode.java new file mode 100644 index 0000000..c7d1378 --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/json/HttpResponseCode.java @@ -0,0 +1,23 @@ +package uppa.project.json; + +public enum HttpResponseCode { + OK(200), + CREATED(201), + NO_CONTENT(204), + BAD_REQUEST(400), + UNAUTHORIZED(401), + FORBIDDEN(403), + NOT_FOUND(404), + CONFLICT(409), + INTERNAL_SERVER_ERROR(500); + + private final int code; + + HttpResponseCode(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/websocket/Message.java b/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/Message.java similarity index 90% rename from S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/websocket/Message.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/Message.java index 9bf16c4..6c7b6fa 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/websocket/Message.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/Message.java @@ -1,4 +1,4 @@ -package uppa.project.pojo.json.websocket; +package uppa.project.json.websocket; public class Message { private final String type; diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/ErrorResponse.java b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/ErrorResponse.java deleted file mode 100644 index 849789c..0000000 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/ErrorResponse.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ErrorResponse.java, 20/03/2024 - * UPPA M1 TI 2023-2024 - * Pas de copyright, aucun droits - */ - -package uppa.project.pojo.json; - -/** - * Classe représentant une erreur - * - * @author Kevin Mitresse - * @author Lucàs Vabre - */ -public class ErrorResponse extends HttpResponse{ - - /** - * Type de l'erreur - */ - private final String error; - - /** - * Message d'erreur - */ - private final String message; - - /** - * Constructeur - * - * @param status code HTTP de l'erreur - * @param error type de l'erreur - * @param message message d'erreur - */ - public ErrorResponse(int status, String error, String message) { - super(status); - this.error = error; - this.message = message; - } - - /** - * @return le type de l'erreur - */ - public String getError() { - return error; - } - - /** - * @return le message d'erreur - */ - public String getMessage() { - return message; - } -} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/HttpResponse.java b/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/HttpResponse.java deleted file mode 100644 index 51c71d5..0000000 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/pojo/json/HttpResponse.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * HttpResponse.java, 20/03/2024 - * UPPA M1 TI 2023-2024 - * Pas de copyright, aucun droits - */ - -package uppa.project.pojo.json; - -/** - * Classe représentant une réponse HTTP - * - * @author Kevin Mitresse - * @author Lucàs Vabre - */ -public abstract class HttpResponse { - - /** - * Code HTTP de la réponse - */ - protected final int status; - - /** - * Constructeur - * - * @param status code HTTP de l'erreur - */ - public HttpResponse(int status) { - this.status = status; - } - - /** - * @return le code HTTP de la réponse - */ - public int getStatus() { - return status; - } -} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/LoginServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/LoginServlet.java deleted file mode 100644 index e08fbf4..0000000 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/LoginServlet.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * LoginServlet.java, 20/03/2024 - * UPPA M1 TI 2023-2024 - * Pas de copyright, aucun droits - */ - -package uppa.project.servlet; - -import jakarta.servlet.ServletException; -import jakarta.servlet.annotation.WebServlet; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; - -@WebServlet(name = "loginServlet", value = "/login") -public class LoginServlet extends HttpServlet { - - public void init() { - } - - public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - if (request.getSession().getAttribute("user") != null) { - response.sendRedirect(request.getContextPath() + "/main-menu"); - return; - } - request.setAttribute("current", "login"); - request.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(request, response); - } - - public void destroy() { - } -} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/RegisterServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/RegisterServlet.java deleted file mode 100644 index 564574a..0000000 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/RegisterServlet.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * RegisterServlet.java, 20/03/2024 - * UPPA M1 TI 2023-2024 - * Pas de copyright, aucun droits - */ - -package uppa.project.servlet; - -import jakarta.servlet.ServletException; -import jakarta.servlet.annotation.WebServlet; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; - -@WebServlet(name = "registerServlet", value = "/register") -public class RegisterServlet extends HttpServlet { - - public void init() { - } - - public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - if (request.getSession().getAttribute("user") != null) { - response.sendRedirect(request.getContextPath() + "/main-menu"); - return; - } - - request.setAttribute("current", "register"); - request.getRequestDispatcher("/WEB-INF/views/register.jsp").forward(request, response); - } - - public void destroy() { - } -} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthLoginServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthLoginServlet.java deleted file mode 100644 index 636c469..0000000 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthLoginServlet.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * LoginServlet.java, 20/03/2024 - * UPPA M1 TI 2023-2024 - * Pas de copyright, aucun droits - */ - -package uppa.project.servlet.api.auth; - -import com.google.gson.Gson; -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 uppa.project.dao.DAO; -import uppa.project.dao.DAOException; -import uppa.project.dao.jpa.Game_JPA_DAO_Factory; -import uppa.project.listener.SessionServletContextListener; -import uppa.project.pojo.User; - -@WebServlet(name = "authLoginServlet", value = "/api/auth/login") -public class AuthLoginServlet extends HttpServlet { - - private static class JsonRequest { - private String username; - private String password; - } - - 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); - - // Login User - User user = loginUser(jsonRequest); - - // Set user in session - request.getSession().setAttribute("user", user); - SessionServletContextListener.addSession(request.getSession()); - - out.println(gson.toJson(user)); - out.flush(); - } - - private static User loginUser(JsonRequest jsonRequest) { - String username = jsonRequest.username; - String password = jsonRequest.password; - - Game_JPA_DAO_Factory factory = new Game_JPA_DAO_Factory(); - try { - DAO userDao = factory.getDAOUser(); - User[] users = userDao.findByField("username", username); - - for (User user : users) { - if (user.verifyPassword(password)) return user; - } - } catch (DAOException e) { - throw new RuntimeException(e); - } - return null; - } - - public void destroy() { - } -} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthRegisterServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthRegisterServlet.java deleted file mode 100644 index 7d3b8f1..0000000 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/api/auth/AuthRegisterServlet.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * 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 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 userDAO = jpaDaoFactory.getDAOUser(); - - User newUser = userDAO.create(user); - entityManager.getTransaction().commit(); - return newUser; - } catch(DAOException e) { - entityManager.getTransaction().rollback(); - return null; - } - } - - public void destroy() { - } -} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/web/filter/AlreadyLoggedFilter.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/filter/AlreadyLoggedFilter.java new file mode 100644 index 0000000..7ac566d --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/filter/AlreadyLoggedFilter.java @@ -0,0 +1,31 @@ +package uppa.project.web.filter; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import java.io.IOException; + +public class AlreadyLoggedFilter implements Filter { + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletResponse httpResponse = (HttpServletResponse) response; + HttpSession session = httpRequest.getSession(false); + + // Vérifier si l'utilisateur est connecté en vérifiant la présence d'une session + boolean isLoggedIn = (session != null && session.getAttribute("user") != null); + + // Si l'utilisateur n'est pas connecté, laisser passer la requête + if (!isLoggedIn) { + chain.doFilter(request, response); + } else { + // Sinon, rediriger vers la page du menu principal + httpResponse.sendRedirect(httpRequest.getContextPath() + "/main-menu"); + } + } +} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/web/filter/AuthenticationFilter.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/filter/AuthenticationFilter.java new file mode 100644 index 0000000..7e73182 --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/filter/AuthenticationFilter.java @@ -0,0 +1,32 @@ +package uppa.project.web.filter; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import java.io.IOException; + +public class AuthenticationFilter implements Filter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletResponse httpResponse = (HttpServletResponse) response; + HttpSession session = httpRequest.getSession(false); + + // Vérifier si l'utilisateur est connecté en vérifiant la présence d'une session + boolean isLoggedIn = (session != null && session.getAttribute("user") != null); + + // Si l'utilisateur est connecté, laisser passer la requête + if (isLoggedIn) { + chain.doFilter(request, response); + } else { + // Sinon, rediriger vers la page de connexion + httpResponse.sendRedirect(httpRequest.getContextPath() + "/login"); + } + } +} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/ForgottenPasswordServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ForgottenPasswordServlet.java similarity index 92% rename from S2/DevWeb/Projet/src/main/java/uppa/project/servlet/ForgottenPasswordServlet.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ForgottenPasswordServlet.java index 150726c..42eaeb3 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/ForgottenPasswordServlet.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ForgottenPasswordServlet.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.servlet; +package uppa.project.web.servlet; import jakarta.persistence.EntityManager; import jakarta.servlet.ServletException; @@ -16,16 +16,16 @@ import java.io.IOException; import java.util.UUID; import javax.mail.Message; import uppa.project.Global; -import uppa.project.dao.DAO; -import uppa.project.dao.DAOException; -import uppa.project.dao.jpa.DAO_JPA_User; -import uppa.project.dao.jpa.Game_JPA_DAO_Factory; -import uppa.project.pojo.RecoveryPasswordToken; -import uppa.project.pojo.User; +import uppa.project.database.dao.DAO; +import uppa.project.database.dao.DAOException; +import uppa.project.database.dao.jpa.DAO_JPA_User; +import uppa.project.database.dao.jpa.Game_JPA_DAO_Factory; +import uppa.project.database.pojo.RecoveryPasswordToken; +import uppa.project.database.pojo.User; import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; -import uppa.project.provider.EntityManagerProvider; +import uppa.project.database.dao.EntityManagerProvider; @WebServlet(name = "forgottenPasswordServlet", value = "/forgotten-password") diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/IndexServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/IndexServlet.java similarity index 74% rename from S2/DevWeb/Projet/src/main/java/uppa/project/servlet/IndexServlet.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/IndexServlet.java index de9656b..80ee750 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/IndexServlet.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/IndexServlet.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.servlet; +package uppa.project.web.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -20,13 +20,8 @@ public class IndexServlet extends HttpServlet { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - if (request.getSession().getAttribute("user") != null) { - response.sendRedirect(request.getContextPath() + "/main-menu"); - return; - } - request.setAttribute("current", "index"); - request.getRequestDispatcher("/WEB-INF/views/index.jsp").forward(request, response); + request.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(request, response); } public void destroy() { diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/LoginServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/LoginServlet.java new file mode 100644 index 0000000..2674e2c --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/LoginServlet.java @@ -0,0 +1,59 @@ +/* + * LoginServlet.java, 20/03/2024 + * UPPA M1 TI 2023-2024 + * Pas de copyright, aucun droits + */ + +package uppa.project.web.servlet; + +import com.google.gson.Gson; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import uppa.project.bean.LoginBean; +import uppa.project.json.HttpResponse; +import uppa.project.json.HttpResponseCode; + +@WebServlet(name = "loginServlet", value = "/login") +public class LoginServlet extends HttpServlet { + + public void init() { + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + request.setAttribute("current", "login"); + request.getRequestDispatcher("/WEB-INF/pages/login.jsp").forward(request, response); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + PrintWriter out = response.getWriter(); + + LoginBean loginBean = new LoginBean() + .setUsername(request.getParameter("username")) + .setPassword(request.getParameter("password")) + ; + + Gson gson = new Gson(); + HttpResponse httpResponse; + if (loginBean.validate()) { + request.getSession().setAttribute("user", loginBean.getUser()); + + httpResponse = new HttpResponse(HttpResponseCode.OK, "Login success"); + } else { + httpResponse = new HttpResponse(HttpResponseCode.UNAUTHORIZED, "Erreur de connexion: Le nom d'utilisateur ou le " + + "mot de passe est incorrect."); + } + + out.println(gson.toJson(httpResponse)); + out.flush(); + } + + public void destroy() { + } +} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/LogoutServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/LogoutServlet.java similarity index 77% rename from S2/DevWeb/Projet/src/main/java/uppa/project/servlet/LogoutServlet.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/LogoutServlet.java index 27ceff6..38c4aa1 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/LogoutServlet.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/LogoutServlet.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.servlet; +package uppa.project.web.servlet; import com.google.gson.Gson; import jakarta.servlet.annotation.WebServlet; @@ -23,11 +23,8 @@ public class LogoutServlet extends HttpServlet { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - if (request.getSession().getAttribute("user") != null) { - SessionServletContextListener.removeSession(request.getSession()); - request.getSession().removeAttribute("user"); - } - + SessionServletContextListener.removeSession(request.getSession()); + request.getSession().removeAttribute("user"); response.sendRedirect(request.getContextPath() + "/login"); } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/MainMenuServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/MainMenuServlet.java similarity index 84% rename from S2/DevWeb/Projet/src/main/java/uppa/project/servlet/MainMenuServlet.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/MainMenuServlet.java index 8f36411..e95a786 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/MainMenuServlet.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/MainMenuServlet.java @@ -4,7 +4,7 @@ * Pas de copyright, aucun droits */ -package uppa.project.servlet; +package uppa.project.web.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -16,9 +16,9 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Set; -import uppa.project.pojo.Game; -import uppa.project.pojo.Player; -import uppa.project.pojo.User; +import uppa.project.database.pojo.Game; +import uppa.project.database.pojo.Player; +import uppa.project.database.pojo.User; @WebServlet(name = "mainMenuServlet", value = "/main-menu") public class MainMenuServlet extends HttpServlet { @@ -34,8 +34,8 @@ public class MainMenuServlet extends HttpServlet { // } request.setAttribute("current", "main-menu"); manageNewGame(request, response, user); - manageStatistiques(request, response, user); - request.getRequestDispatcher("/WEB-INF/views/main-menu.jsp").forward(request, response); + manageStatistics(request, response, user); + request.getRequestDispatcher("/WEB-INF/pages/main-menu.jsp").forward(request, response); } public void destroy() { @@ -44,6 +44,7 @@ public class MainMenuServlet extends HttpServlet { private void manageNewGame(HttpServletRequest request, HttpServletResponse response, User sessionUser) throws IOException, ServletException { List connectedUsers = new ArrayList<>(); Set loginsSessions = (Set) request.getServletContext().getAttribute("loginSession"); + if (loginsSessions == null) { throw new RuntimeException("No login sessions found"); } @@ -57,7 +58,7 @@ public class MainMenuServlet extends HttpServlet { request.setAttribute("connectedUsers", connectedUsers); } - private void manageStatistiques(HttpServletRequest request, HttpServletResponse response, User sessionUser) throws IOException, ServletException { + private void manageStatistics(HttpServletRequest request, HttpServletResponse response, User sessionUser) throws IOException, ServletException { List games = new ArrayList<>(); if (sessionUser != null && sessionUser.getPlayedGames() != null) { for (Player player : sessionUser.getPlayedGames()) { diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/RegisterServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/RegisterServlet.java new file mode 100644 index 0000000..a1688dd --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/RegisterServlet.java @@ -0,0 +1,63 @@ +/* + * RegisterServlet.java, 20/03/2024 + * UPPA M1 TI 2023-2024 + * Pas de copyright, aucun droits + */ + +package uppa.project.web.servlet; + +import com.google.gson.Gson; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import uppa.project.bean.LoginBean; +import uppa.project.bean.RegisterBean; +import uppa.project.json.HttpResponse; +import uppa.project.json.HttpResponseCode; + +@WebServlet(name = "registerServlet", value = "/register") +public class RegisterServlet extends HttpServlet { + + public void init() { + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + request.setAttribute("current", "register"); + request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request, response); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + PrintWriter out = response.getWriter(); + + RegisterBean registerBean = new RegisterBean() + .setUsername(request.getParameter("username")) + .setEmail(request.getParameter("email")) + .setPassword(request.getParameter("password")) + .setBirth(request.getParameter("birth")) + .setGender(request.getParameter("gender")) + ; + + Gson gson = new Gson(); + HttpResponse httpResponse; + if (registerBean.validate()) { + httpResponse = new HttpResponse( + HttpResponseCode.OK, + "Register success" + ); + } else { + httpResponse = new HttpResponse(HttpResponseCode.UNAUTHORIZED, registerBean.getErrorMessage()); + } + + out.println(gson.toJson(httpResponse)); + out.flush(); + } + + public void destroy() { + } +} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/ResetPasswordServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ResetPasswordServlet.java similarity index 89% rename from S2/DevWeb/Projet/src/main/java/uppa/project/servlet/ResetPasswordServlet.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ResetPasswordServlet.java index 782298d..2e384ef 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/servlet/ResetPasswordServlet.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ResetPasswordServlet.java @@ -1,4 +1,4 @@ -package uppa.project.servlet; +package uppa.project.web.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -6,11 +6,11 @@ import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import uppa.project.dao.DAOException; -import uppa.project.dao.jpa.DAO_JPA_RecoveryPasswordToken; -import uppa.project.dao.jpa.DAO_JPA_User; -import uppa.project.pojo.RecoveryPasswordToken; -import uppa.project.pojo.User; +import uppa.project.database.dao.DAOException; +import uppa.project.database.dao.jpa.DAO_JPA_RecoveryPasswordToken; +import uppa.project.database.dao.jpa.DAO_JPA_User; +import uppa.project.database.pojo.RecoveryPasswordToken; +import uppa.project.database.pojo.User; @WebServlet(name = "resetPasswordServlet", value = "/reset-password") public class ResetPasswordServlet extends HttpServlet { @@ -28,7 +28,7 @@ public class ResetPasswordServlet extends HttpServlet { return; } request.setAttribute("current", "reset-password"); - request.getRequestDispatcher("/WEB-INF/views/reset-password.jsp").forward(request, response); + request.getRequestDispatcher("/WEB-INF/pages/reset-password.jsp").forward(request, response); } /** diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/websocket/MainMenuWS.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/websocket/ConnectedUsersWS.java similarity index 72% rename from S2/DevWeb/Projet/src/main/java/uppa/project/websocket/MainMenuWS.java rename to S2/DevWeb/Projet/src/main/java/uppa/project/web/websocket/ConnectedUsersWS.java index 998ebc7..d1da64f 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/websocket/MainMenuWS.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/websocket/ConnectedUsersWS.java @@ -1,4 +1,4 @@ -package uppa.project.websocket; +package uppa.project.web.websocket; import com.google.gson.Gson; import jakarta.websocket.OnClose; @@ -10,18 +10,16 @@ import jakarta.websocket.Session; import jakarta.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.HashMap; -import uppa.project.pojo.User; -import uppa.project.pojo.json.websocket.Message; +import uppa.project.database.pojo.User; +import uppa.project.json.websocket.Message; -@ServerEndpoint(value = "/main-menu") -public class MainMenuWS { +@ServerEndpoint(value = "/ws/connected-users") +public class ConnectedUsersWS { private static final HashMap connections = new HashMap<>(); @OnOpen - public void onOpen(Session session) { - System.out.println("Connexion WebSocket ouverte : " + session.getId()); - } + public void onOpen(Session session) {} private void broadcastConnectedUsers() { Gson gson = new Gson(); @@ -30,8 +28,6 @@ public class MainMenuWS { Message websocketObject = new Message("userList", gson.toJson(connectedUsers)); String message = gson.toJson(websocketObject); - System.out.println("Broadcasting connected users : " + message); - for (Session session : connections.keySet()) { RemoteEndpoint.Basic remote = session.getBasicRemote(); try { @@ -44,7 +40,6 @@ public class MainMenuWS { @OnClose public void onClose(Session session) { - System.out.println("Connexion WebSocket fermée : " + session.getId()); connections.remove(session); // Update connected users list @@ -53,7 +48,6 @@ public class MainMenuWS { @OnError public void onError(Throwable throwable) { - System.out.println("Erreur WebSocket : " + throwable.getMessage()); throwable.printStackTrace(); } @@ -62,12 +56,8 @@ public class MainMenuWS { Gson gson = new Gson(); Message websocketMessage = gson.fromJson(message, Message.class); - System.out.println("Message reçu : " + websocketMessage); - if (websocketMessage.getType().equals("linkUserSession")) { User user = gson.fromJson(websocketMessage.getData(), User.class); - System.out.println(user); - connections.put(session, user); broadcastConnectedUsers(); } diff --git a/S2/DevWeb/Projet/src/main/resources/META-INF/persistence.xml b/S2/DevWeb/Projet/src/main/resources/META-INF/persistence.xml index 715a4d5..f381173 100644 --- a/S2/DevWeb/Projet/src/main/resources/META-INF/persistence.xml +++ b/S2/DevWeb/Projet/src/main/resources/META-INF/persistence.xml @@ -5,10 +5,10 @@ version="3.0"> - uppa.project.pojo.User - uppa.project.pojo.Game - uppa.project.pojo.Player - uppa.project.pojo.RecoveryPasswordToken + uppa.project.database.pojo.User + uppa.project.database.pojo.Game + uppa.project.database.pojo.Player + uppa.project.database.pojo.RecoveryPasswordToken @@ -19,10 +19,10 @@ - uppa.project.pojo.User - uppa.project.pojo.Game - uppa.project.pojo.Player - uppa.project.pojo.RecoveryPasswordToken + uppa.project.database.pojo.User + uppa.project.database.pojo.Game + uppa.project.database.pojo.Player + uppa.project.database.pojo.RecoveryPasswordToken diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/components/navbar.jsp b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/components/navbar.jsp index 719ebcf..bdaae67 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/components/navbar.jsp +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/components/navbar.jsp @@ -1,4 +1,4 @@ -<%@ page import="uppa.project.pojo.User" %> +<%@ page import="uppa.project.database.pojo.User" %> <%@ page pageEncoding="UTF-8" %> <%-- Created by IntelliJ IDEA. diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/components/new-game.jsp b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/components/new-game.jsp index 176420e..469fb90 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/components/new-game.jsp +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/components/new-game.jsp @@ -1,6 +1,6 @@ -<%@ page import="uppa.project.pojo.User" %> -<%@ page import="uppa.project.pojo.Game" %> -<%@ page import="uppa.project.pojo.Deck" %> +<%@ page import="uppa.project.database.pojo.User" %> +<%@ page import="uppa.project.database.pojo.Game" %> +<%@ page import="uppa.project.database.pojo.Deck" %> <%@ page pageEncoding="UTF-8" %>