From 9277154e0cfac5de2c6861814b2f48c119dc9d17 Mon Sep 17 00:00:00 2001 From: Lensors Date: Sat, 3 May 2025 08:28:53 +0200 Subject: [PATCH] Ajout historique_bloc --- Projet/projet.sql | 17 +++++++++++ Projet/src/main/java/projet/Bloc.java | 31 ++++++++++++++------ Projet/src/main/java/projet/Hasher.java | 24 +++++++++++++++ Projet/src/main/java/projet/ModifBloc.java | 2 +- Projet/src/main/java/projet/Utilisateur.java | 4 +-- 5 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 Projet/src/main/java/projet/Hasher.java diff --git a/Projet/projet.sql b/Projet/projet.sql index dabf43a..66941fe 100644 --- a/Projet/projet.sql +++ b/Projet/projet.sql @@ -2,6 +2,7 @@ CREATE DATABASE IF NOT EXISTS projet; USE projet; DROP TABLE IF EXISTS bloc; +DROP TABLE IF EXISTS historique_bloc; DROP TABLE IF EXISTS partage; DROP TABLE IF EXISTS page; DROP TABLE IF EXISTS message; @@ -40,6 +41,20 @@ CREATE TABLE bloc ( FOREIGN KEY (auteur_id) REFERENCES utilisateur(id) ON DELETE CASCADE ); +CREATE TABLE historique_bloc ( + id INT PRIMARY KEY AUTO_INCREMENT, + bloc_id INT NOT NULL, + version INT NOT NULL, + contenu TEXT, + date_modification DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + modifie_par INT, + metadata JSON NOT NULL, + ordre INT NOT NULL, + type ENUM('TEXTE', 'LISTE', 'TITRE', 'CODE', 'PAGE', 'SEPARATEUR', 'CITATION') NOT NULL, + FOREIGN KEY (bloc_id) REFERENCES bloc(id) ON DELETE CASCADE, + FOREIGN KEY (modifie_par) REFERENCES utilisateur(id) ON DELETE SET NULL +); + CREATE TABLE message ( id INT AUTO_INCREMENT PRIMARY KEY, login VARCHAR(100) NOT NULL, @@ -58,6 +73,8 @@ CREATE TABLE partage ( UNIQUE(page_id, utilisateur_id) -- Empêche les doublons de partage ); +INSERT INTO utilisateur (login, mot_de_passe, privilege) +VALUES ('root', SHA2('123', 256), 'ADMIN'); CREATE INDEX idx_page_auteur ON page(auteur_id); CREATE INDEX idx_bloc_page ON bloc(page_id); diff --git a/Projet/src/main/java/projet/Bloc.java b/Projet/src/main/java/projet/Bloc.java index fe0db78..a633da1 100644 --- a/Projet/src/main/java/projet/Bloc.java +++ b/Projet/src/main/java/projet/Bloc.java @@ -159,22 +159,35 @@ public class Bloc extends ParamBD { } - public static void updateBloc(int idBloc, String nouveauContenu, String type, String metadata) { + public static void updateBloc(int idBloc, String nouveauContenu, String type, String metadata, int idU) { + String sql; + PreparedStatement pst; try { Connection connexion = DriverManager.getConnection(bdURL, bdLogin, bdPassword); - String sql = " UPDATE bloc" - + " SET contenu = ?" - + ", type = ?" - + ", metadata = ?" - + ", date_modification = ?" + + // 1. Insérer dans l'historique + sql = + "INSERT INTO historique_bloc (bloc_id, version, contenu, date_modification, modifie_par, metadata, ordre, type) " + + "SELECT b.id, COALESCE(MAX(h.version), 0) + 1, b.contenu, NOW(), ?, b.metadata, b.ordre, b.type " + + "FROM bloc b " + + "LEFT JOIN historique_bloc h ON h.bloc_id = b.id " + + "WHERE b.id = ? " + + "GROUP BY b.id, b.contenu, b.metadata, b.ordre, b.type"; + pst = connexion.prepareStatement(sql); + pst.setInt(1, idU); + pst.setInt(2, idBloc); + pst.executeUpdate(); + + // 2. Mise à jour du bloc + sql = " UPDATE bloc" + + " SET contenu = ?, type = ?, metadata = ?, date_modification = NOW()" + " WHERE id = ?" + ";"; - PreparedStatement pst = connexion.prepareStatement(sql); + pst = connexion.prepareStatement(sql); pst.setString(1, nouveauContenu); pst.setString(2, type); pst.setString(3, metadata); - pst.setDate(4, Date.valueOf(LocalDate.now())); - pst.setInt(5, idBloc); + pst.setInt(4, idBloc); pst.executeUpdate(); pst.close(); diff --git a/Projet/src/main/java/projet/Hasher.java b/Projet/src/main/java/projet/Hasher.java new file mode 100644 index 0000000..bb49bd5 --- /dev/null +++ b/Projet/src/main/java/projet/Hasher.java @@ -0,0 +1,24 @@ +package projet; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class Hasher { + + public static String hashPassword(String password) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] hashedBytes = md.digest(password.getBytes()); + + StringBuilder sb = new StringBuilder(); + for (byte b : hashedBytes) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Erreur lors du hachage", e); + } + } + +} diff --git a/Projet/src/main/java/projet/ModifBloc.java b/Projet/src/main/java/projet/ModifBloc.java index 9ca11d2..21c046d 100644 --- a/Projet/src/main/java/projet/ModifBloc.java +++ b/Projet/src/main/java/projet/ModifBloc.java @@ -41,7 +41,7 @@ public class ModifBloc extends HttpServlet { int blocId = Integer.parseInt(request.getParameter("blocId")); - Bloc.updateBloc(blocId, contenu, type, metadata); + Bloc.updateBloc(blocId, contenu, type, metadata, u.getId()); response.sendRedirect("AfficherPage"); } else { response.sendRedirect("/Projet/"); diff --git a/Projet/src/main/java/projet/Utilisateur.java b/Projet/src/main/java/projet/Utilisateur.java index 192a7ab..cca7703 100644 --- a/Projet/src/main/java/projet/Utilisateur.java +++ b/Projet/src/main/java/projet/Utilisateur.java @@ -159,7 +159,7 @@ public class Utilisateur extends ParamBD { + ";"; PreparedStatement pst = connexion.prepareStatement(sql); pst.setString(1, login); - pst.setString(2, mdp); + pst.setString(2, Hasher.hashPassword(mdp)); ResultSet rs = pst.executeQuery(); while(rs.next()) { int id = rs.getInt("id"); @@ -205,7 +205,7 @@ public class Utilisateur extends ParamBD { + ";"; pst = connexion.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pst.setString(1, login); - pst.setString(2, mdp); + pst.setString(2, Hasher.hashPassword(mdp)); int ri = pst.executeUpdate(); if (ri > 0) {