From 7ae77d87665708c964a53f27e9683a5a0b807fcd Mon Sep 17 00:00:00 2001 From: ines <> Date: Thu, 9 Jan 2025 21:29:22 +0100 Subject: [PATCH] 1er commit --- build.xml | 71 + nbproject/ant-deploy.xml | 69 + nbproject/build-impl.xml | 1434 +++++++++++++++++ nbproject/genfiles.properties | 8 + nbproject/project.properties | 88 + nbproject/project.xml | 31 + src/conf/MANIFEST.MF | 2 + src/java/Servlet/AuthentificationServlet.java | 116 ++ src/java/Servlet/EditionProfilServlet.java | 118 ++ src/java/Servlet/ProfilPompierServlet.java | 93 ++ src/java/bdd/CaserneMySQL.java | 37 + src/java/bdd/Connexion.java | 61 + src/java/bdd/GradeMySQL.java | 62 + src/java/bdd/PompierMySQL.java | 217 +++ src/java/bdd/StatutMySQL.java | 59 + src/java/bdd/TrancheMySQL.java | 65 + src/java/bdd/TypePersoMySQL.java | 65 + src/java/beans/Caserne.java | 84 + src/java/beans/Disponibilite.java | 41 + src/java/beans/Grade.java | 41 + src/java/beans/Pompier.java | 202 +++ src/java/beans/PompierDispo.java | 63 + src/java/beans/Statut.java | 41 + src/java/beans/Tranche.java | 42 + src/java/beans/TypePers.java | 41 + src/java/form/AuthentifForm.java | 86 + src/java/form/EditionForm.java | 45 + src/java/util/CtrlSaisie.java | 64 + src/java/util/MD5.java | 36 + web/META-INF/context.xml | 2 + web/WEB-INF/shared/EnteteJSP.jsp | 13 + web/WEB-INF/shared/FooterJSP.jsp | 3 + web/WEB-INF/shared/NavigationJSP.jsp | 19 + web/WEB-INF/views/AccueilPompierJSP.jsp | 38 + web/WEB-INF/views/AccueilResponsableJSP.jsp | 12 + web/WEB-INF/views/AuthentificationJSP.jsp | 25 + web/WEB-INF/views/EditionPompierJSP.jsp | 50 + web/WEB-INF/views/ProfilJSP.jsp | 29 + web/WEB-INF/web.xml | 27 + web/img/logo-sdis.png | Bin 0 -> 12885 bytes web/img/pompier.png | Bin 0 -> 3107 bytes web/index.html | 15 + web/ressources/mycss.css | 39 + 43 files changed, 3654 insertions(+) create mode 100644 build.xml create mode 100644 nbproject/ant-deploy.xml create mode 100644 nbproject/build-impl.xml create mode 100644 nbproject/genfiles.properties create mode 100644 nbproject/project.properties create mode 100644 nbproject/project.xml create mode 100644 src/conf/MANIFEST.MF create mode 100644 src/java/Servlet/AuthentificationServlet.java create mode 100644 src/java/Servlet/EditionProfilServlet.java create mode 100644 src/java/Servlet/ProfilPompierServlet.java create mode 100644 src/java/bdd/CaserneMySQL.java create mode 100644 src/java/bdd/Connexion.java create mode 100644 src/java/bdd/GradeMySQL.java create mode 100644 src/java/bdd/PompierMySQL.java create mode 100644 src/java/bdd/StatutMySQL.java create mode 100644 src/java/bdd/TrancheMySQL.java create mode 100644 src/java/bdd/TypePersoMySQL.java create mode 100644 src/java/beans/Caserne.java create mode 100644 src/java/beans/Disponibilite.java create mode 100644 src/java/beans/Grade.java create mode 100644 src/java/beans/Pompier.java create mode 100644 src/java/beans/PompierDispo.java create mode 100644 src/java/beans/Statut.java create mode 100644 src/java/beans/Tranche.java create mode 100644 src/java/beans/TypePers.java create mode 100644 src/java/form/AuthentifForm.java create mode 100644 src/java/form/EditionForm.java create mode 100644 src/java/util/CtrlSaisie.java create mode 100644 src/java/util/MD5.java create mode 100644 web/META-INF/context.xml create mode 100644 web/WEB-INF/shared/EnteteJSP.jsp create mode 100644 web/WEB-INF/shared/FooterJSP.jsp create mode 100644 web/WEB-INF/shared/NavigationJSP.jsp create mode 100644 web/WEB-INF/views/AccueilPompierJSP.jsp create mode 100644 web/WEB-INF/views/AccueilResponsableJSP.jsp create mode 100644 web/WEB-INF/views/AuthentificationJSP.jsp create mode 100644 web/WEB-INF/views/EditionPompierJSP.jsp create mode 100644 web/WEB-INF/views/ProfilJSP.jsp create mode 100644 web/WEB-INF/web.xml create mode 100644 web/img/logo-sdis.png create mode 100644 web/img/pompier.png create mode 100644 web/index.html create mode 100644 web/ressources/mycss.css diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..7a2bc2e --- /dev/null +++ b/build.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + Builds, tests, and runs the project appli3. + + + diff --git a/nbproject/ant-deploy.xml b/nbproject/ant-deploy.xml new file mode 100644 index 0000000..785fa0b --- /dev/null +++ b/nbproject/ant-deploy.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml new file mode 100644 index 0000000..89b5e6a --- /dev/null +++ b/nbproject/build-impl.xml @@ -0,0 +1,1434 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set build.web.dir + Must set build.generated.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.war + + + + + + + + + +The Java EE server classpath is not correctly set up - server home directory is missing. +Either open the project in the IDE and assign the server or setup the server classpath manually. +For example like this: + ant -Dj2ee.server.home=<app_server_installation_directory> + + +The Java EE server classpath is not correctly set up. Your active server type is ${j2ee.server.type}. +Either open the project in the IDE and assign the server or setup the server classpath manually. +For example like this: + ant -Duser.properties.file=<path_to_property_file> (where you put the property "j2ee.platform.classpath" in a .properties file) +or ant -Dj2ee.platform.classpath=<server_classpath> (where no properties file is used) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +The libs.CopyLibs.classpath property is not set up. +This property must point to +org-netbeans-modules-java-j2seproject-copylibstask.jar file which is part +of NetBeans IDE installation and is usually located at +<netbeans_installation>/java<version>/ant/extra folder. +Either open the project in the IDE and make sure CopyLibs library +exists or setup the property manually. For example like this: + ant -Dlibs.CopyLibs.classpath=a/path/to/org-netbeans-modules-java-j2seproject-copylibstask.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.jsp.includes + + + + + + + + + + + + + + + + + + + + + + + + + + Must select a file in the IDE or set jsp.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Browser not found, cannot launch the deployed application. Try to set the BROWSER environment variable. + + + Launching ${browse.url} + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties new file mode 100644 index 0000000..02263d5 --- /dev/null +++ b/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=9e76b6dd +build.xml.script.CRC32=5c202745 +build.xml.stylesheet.CRC32=1707db4f@1.100.0.1 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=9e76b6dd +nbproject/build-impl.xml.script.CRC32=0271ca75 +nbproject/build-impl.xml.stylesheet.CRC32=334708a0@1.100.0.1 diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 0000000..9107674 --- /dev/null +++ b/nbproject/project.properties @@ -0,0 +1,88 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=true +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +build.classes.dir=${build.web.dir}/WEB-INF/classes +build.classes.excludes=**/*.java,**/*.form +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +build.web.dir=${build.dir}/web +build.web.excludes=${build.classes.excludes} +client.urlPart= +compile.jsps=false +conf.dir=${source.root}/conf +debug.classpath=${build.classes.dir}:${javac.classpath} +debug.test.classpath=\ + ${run.test.classpath} +display.browser=true +# Files to be excluded from distribution war +dist.archive.excludes= +dist.dir=dist +dist.ear.war=${dist.dir}/${war.ear.name} +dist.javadoc.dir=${dist.dir}/javadoc +dist.war=${dist.dir}/${war.name} +excludes= +file.reference.jakarta.servlet.jsp.jstl-2.0.0.jar=C:\\Users\\noobm\\Downloads\\drive-download-20250105T160443Z-001\\jakarta.servlet.jsp.jstl-2.0.0.jar +file.reference.jakarta.servlet.jsp.jstl-api-2.0.0.jar=C:\\Users\\noobm\\Downloads\\drive-download-20250105T160443Z-001\\jakarta.servlet.jsp.jstl-api-2.0.0.jar +file.reference.mysql-connector-java-8.0.23.jar=C:\\Users\\noobm\\Downloads\\drive-download-20250105T160443Z-001\\mysql-connector-java-8.0.23.jar +includes=** +j2ee.compile.on.save=true +j2ee.copy.static.files.on.save=true +j2ee.deploy.on.save=true +j2ee.platform=10-web +j2ee.platform.classpath=${j2ee.server.home}/bin/tomcat-juli.jar:${j2ee.server.home}/lib/annotations-api.jar:${j2ee.server.home}/lib/catalina-ant.jar:${j2ee.server.home}/lib/catalina-ha.jar:${j2ee.server.home}/lib/catalina-ssi.jar:${j2ee.server.home}/lib/catalina-storeconfig.jar:${j2ee.server.home}/lib/catalina-tribes.jar:${j2ee.server.home}/lib/catalina.jar:${j2ee.server.home}/lib/ecj-4.27.jar:${j2ee.server.home}/lib/el-api.jar:${j2ee.server.home}/lib/jakartaee-migration-1.0.8-shaded.jar:${j2ee.server.home}/lib/jasper-el.jar:${j2ee.server.home}/lib/jasper.jar:${j2ee.server.home}/lib/jaspic-api.jar:${j2ee.server.home}/lib/jsp-api.jar:${j2ee.server.home}/lib/servlet-api.jar:${j2ee.server.home}/lib/tomcat-api.jar:${j2ee.server.home}/lib/tomcat-coyote-ffm.jar:${j2ee.server.home}/lib/tomcat-coyote.jar:${j2ee.server.home}/lib/tomcat-dbcp.jar:${j2ee.server.home}/lib/tomcat-i18n-cs.jar:${j2ee.server.home}/lib/tomcat-i18n-de.jar:${j2ee.server.home}/lib/tomcat-i18n-es.jar:${j2ee.server.home}/lib/tomcat-i18n-fr.jar:${j2ee.server.home}/lib/tomcat-i18n-ja.jar:${j2ee.server.home}/lib/tomcat-i18n-ko.jar:${j2ee.server.home}/lib/tomcat-i18n-pt-BR.jar:${j2ee.server.home}/lib/tomcat-i18n-ru.jar:${j2ee.server.home}/lib/tomcat-i18n-zh-CN.jar:${j2ee.server.home}/lib/tomcat-jdbc.jar:${j2ee.server.home}/lib/tomcat-jni.jar:${j2ee.server.home}/lib/tomcat-util-scan.jar:${j2ee.server.home}/lib/tomcat-util.jar:${j2ee.server.home}/lib/tomcat-websocket.jar:${j2ee.server.home}/lib/websocket-api.jar:${j2ee.server.home}/lib/websocket-client-api.jar +j2ee.server.type=Tomcat +jar.compress=false +javac.classpath=\ + ${file.reference.jakarta.servlet.jsp.jstl-2.0.0.jar}:\ + ${file.reference.jakarta.servlet.jsp.jstl-api-2.0.0.jar}:\ + ${file.reference.mysql-connector-java-8.0.23.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.debug=true +javac.deprecation=false +javac.processorpath=\ + ${javac.classpath} +javac.source=17 +javac.target=17 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.preview=true +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +lib.dir=${web.docbase.dir}/WEB-INF/lib +no.dependencies=false +persistence.xml.dir=${conf.dir} +platform.active=default_platform +resource.dir=setup +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +# Space-separated list of JVM arguments used when running a class with a main method or a unit test +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value): +runmain.jvmargs= +source.encoding=UTF-8 +source.root=src +src.dir=${source.root}/java +test.src.dir=test +war.content.additional= +war.ear.name=${war.name} +war.name=appli3.war +web.docbase.dir=web +webinf.dir=web/WEB-INF diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 0000000..88eaf61 --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,31 @@ + + + org.netbeans.modules.web.project + + + appli3 + 1.6.5 + + + ${file.reference.jakarta.servlet.jsp.jstl-2.0.0.jar} + WEB-INF/lib + + + ${file.reference.jakarta.servlet.jsp.jstl-api-2.0.0.jar} + WEB-INF/lib + + + ${file.reference.mysql-connector-java-8.0.23.jar} + WEB-INF/lib + + + + + + + + + + + + diff --git a/src/conf/MANIFEST.MF b/src/conf/MANIFEST.MF new file mode 100644 index 0000000..58630c0 --- /dev/null +++ b/src/conf/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/src/java/Servlet/AuthentificationServlet.java b/src/java/Servlet/AuthentificationServlet.java new file mode 100644 index 0000000..5500008 --- /dev/null +++ b/src/java/Servlet/AuthentificationServlet.java @@ -0,0 +1,116 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/JSP_Servlet/Servlet.java to edit this template + */ +package Servlet; + +import beans.Pompier; +import form.AuthentifForm; +import java.io.IOException; +import java.io.PrintWriter; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; + +/** + * + * @author noobm + */ +public class AuthentificationServlet extends HttpServlet { + + /** + * Processes requests for both HTTP GET and POST + * methods. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + protected void processRequest(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + response.setContentType("text/html;charset=UTF-8"); + try (PrintWriter out = response.getWriter()) { + /* TODO output your page here. You may use following sample code. */ + out.println(""); + out.println(""); + out.println(""); + out.println("Servlet authentificationServlet"); + out.println(""); + out.println(""); + out.println("

Servlet authentificationServlet at " + request.getContextPath() + "

"); + out.println(""); + out.println(""); + } + } + + // + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + HttpSession Session = request.getSession(); + Session.removeAttribute("lePompierConnecte"); + Session.removeAttribute("lesPompiers"); + Session.removeAttribute("lePompier"); + request.getRequestDispatcher("/WEB-INF/views/AuthentificationJSP.jsp").forward(request, response); + } + + /** + * Handles the HTTP POST method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + Pompier lePompier = null; + AuthentifForm authentif = new AuthentifForm(request); + if (authentif.ctrlAuthentif() && authentif.ctrlBDD()) { + HttpSession maSession = request.getSession(); + lePompier = (Pompier) maSession.getAttribute("lePompierConnecte"); + + if (lePompier != null) { + if (lePompier.getStatut() == 1) { + getServletContext().getRequestDispatcher("/WEB-INF/views/AccueilPompierJSP.jsp").forward(request, response); + } else if (lePompier.getStatut() == 2) { + + getServletContext().getRequestDispatcher("/WEB-INF/views/AccueilResponsableJSP.jsp").forward(request, response); + + } else { + request.setAttribute("message", "Statut non reconnu."); + getServletContext().getRequestDispatcher("/WEB-INF/views/AuthentificationJSP.jsp").forward(request, response); + } + } else { + request.setAttribute("message", "Erreur interne : utilisateur non trouvé."); + getServletContext().getRequestDispatcher("/WEB-INF/views/AuthentificationJSP.jsp").forward(request, response); + } + } else { + getServletContext().getRequestDispatcher("/WEB-INF/views/AuthentificationJSP.jsp").forward(request, response); + } + } + + + /** + * Returns a short description of the servlet. + * + * @return a String containing servlet description + */ + @Override + public String getServletInfo() { + return "Short description"; + }// + +} diff --git a/src/java/Servlet/EditionProfilServlet.java b/src/java/Servlet/EditionProfilServlet.java new file mode 100644 index 0000000..d47a06c --- /dev/null +++ b/src/java/Servlet/EditionProfilServlet.java @@ -0,0 +1,118 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/JSP_Servlet/Servlet.java to edit this template + */ +package Servlet; + +import beans.Pompier; +import form.EditionForm; +import java.io.IOException; +import java.io.PrintWriter; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; + +/** + * + * @author noobm + */ +public class EditionProfilServlet extends HttpServlet { + + /** + * Processes requests for both HTTP GET and POST + * methods. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + protected void processRequest(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + response.setContentType("text/html;charset=UTF-8"); + try (PrintWriter out = response.getWriter()) { + /* TODO output your page here. You may use following sample code. */ + out.println(""); + out.println(""); + out.println(""); + out.println("Servlet EditionPompierServlet"); + out.println(""); + out.println(""); + out.println("

Servlet EditionPompierServlet at " + request.getContextPath() + "

"); + out.println(""); + out.println(""); + } + } + + // + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Pompier lePompier = null; + HttpSession maSession = request.getSession(); + lePompier = (Pompier) maSession.getAttribute("lePompierConnecte"); + + if (lePompier != null) { + request.setAttribute("pompier", lePompier); + request.getRequestDispatcher("/WEB-INF/views/EditionPompierJSP.jsp").forward(request, response); + } else { + response.sendRedirect("/WEB-INF/views/AuthentificationJSP.jsp"); + } + } + + /** + * Handles the HTTP POST method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + EditionForm edition = new EditionForm(request); + Pompier lePompier = null; + HttpSession maSession = request.getSession(); + lePompier = (Pompier) maSession.getAttribute("lePompierConnecte"); + if (edition.ctrlEdition() && lePompier != null){ + + lePompier.setNom(request.getParameter("nom")); + lePompier.setPrenom(request.getParameter("prenom")); + lePompier.setLogin(request.getParameter("login")); + lePompier.setMail(request.getParameter("mail")); + lePompier.setAdresse(request.getParameter("adresse")); + lePompier.setCp(request.getParameter("cp")); + lePompier.setVille(request.getParameter("ville")); + lePompier.setBip(request.getParameter("bip")); + lePompier.setGrade(Integer.parseInt(request.getParameter("grade"))); + lePompier.setCommentaire(request.getParameter("commentaire")); + + + request.getSession().setAttribute("lePompierConnecte", lePompier); + response.sendRedirect("/WEB-INF/views/ProfilJSP.jsp");} + + else { + response.sendRedirect("/WEB-INF/views/AuthentificationJSP.jsp"); // Rediriger si pas de pompier connecté + } + } + + /** + * Returns a short description of the servlet. + * + * @return a String containing servlet description + */ + @Override + public String getServletInfo() { + return "Short description"; + }// + +} diff --git a/src/java/Servlet/ProfilPompierServlet.java b/src/java/Servlet/ProfilPompierServlet.java new file mode 100644 index 0000000..d31a7ff --- /dev/null +++ b/src/java/Servlet/ProfilPompierServlet.java @@ -0,0 +1,93 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/JSP_Servlet/Servlet.java to edit this template + */ +package Servlet; + +import beans.Pompier; +import java.io.IOException; +import java.io.PrintWriter; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; + +/** + * + * @author noobm + */ +public class ProfilPompierServlet extends HttpServlet { + + /** + * Processes requests for both HTTP GET and POST + * methods. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + protected void processRequest(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + response.setContentType("text/html;charset=UTF-8"); + try (PrintWriter out = response.getWriter()) { + /* TODO output your page here. You may use following sample code. */ + out.println(""); + out.println(""); + out.println(""); + out.println("Servlet AccueilPompierServlet"); + out.println(""); + out.println(""); + out.println("

Servlet AccueilPompierServlet at " + request.getContextPath() + "

"); + out.println(""); + out.println(""); + } + } + + // + /** + * Handles the HTTP GET method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + HttpSession maSession = request.getSession(); + Pompier lePompier = (Pompier) maSession.getAttribute("lePompierConnecte"); + + if (lePompier != null) { + request.setAttribute("pompier", lePompier); + request.getRequestDispatcher("/WEB-INF/views/ProfilJSP.jsp").forward(request, response); + } else { + // Rediriger vers la page de connexion si aucun pompier n'est connecté + response.sendRedirect("login"); + } + } + /** + * Handles the HTTP POST method. + * + * @param request servlet request + * @param response servlet response + * @throws ServletException if a servlet-specific error occurs + * @throws IOException if an I/O error occurs + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + processRequest(request, response); + } + /** + * Returns a short description of the servlet. + * + * @return a String containing servlet description + */ + @Override + public String getServletInfo() { + return "Short description"; + }// + +} diff --git a/src/java/bdd/CaserneMySQL.java b/src/java/bdd/CaserneMySQL.java new file mode 100644 index 0000000..2b823a9 --- /dev/null +++ b/src/java/bdd/CaserneMySQL.java @@ -0,0 +1,37 @@ +/* + * bddd/CaserneMySQL.java + */ +package bdd; + +import beans.Caserne; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CaserneMySQL { + private final Connection laConnection = Connexion.getConnect("172.20.10.5", + "sdis29", + "adminBDsdis", + "mdpBDsdis"); + public Caserne read(int id) { + Caserne laCaserne = null; + try { + PreparedStatement prepStmt = null; + String sql = "SELECT * FROM caserne WHERE id=?"; + prepStmt = laConnection.prepareStatement(sql); + prepStmt.setInt(1, id); + ResultSet result = prepStmt.executeQuery(); + if (result.next()) { + laCaserne = new Caserne(result.getInt(1), result.getString(2),result.getString(3), + result.getString(4), result.getString(5),result.getString(6)); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return laCaserne; + } +} diff --git a/src/java/bdd/Connexion.java b/src/java/bdd/Connexion.java new file mode 100644 index 0000000..3c45d8c --- /dev/null +++ b/src/java/bdd/Connexion.java @@ -0,0 +1,61 @@ +package bdd; +/* +Connexion.java +Classe permettant d'établir une connexion avec une base de données mySQL +*/ +import java.sql.Connection; +import java.sql.DriverManager; + +public class Connexion { + private static Connection connect; // Variable de connexion + + /** + * Constructeur + * @param serveur nom du serveur, localhost si local + * @param bdd nom de la base de données + * @param nomUtil nom utilisateur + * @param mdp mot de passe lié à l'utilisateur + */ + private Connexion(String serveur, String bdd, String nomUtil, String mdp) { + try { + // 1. Chargement du driver + //Class.forName("com.mysql.jdbc.Driver"); + Class.forName("com.mysql.cj.jdbc.Driver"); + System.out.println("Driver accessible"); + + // 2. Initialisation des paramètres de connexion + String host = serveur; // Serveur de bd + String dbname = bdd; // Nom bd + String url = "jdbc:mysql://" + host + "/" + dbname; // url de connexion + url += "?autoReconnect=true"; // Ajout 26/09/2021 + System.out.println("url : "+url); + String user = nomUtil; // nom du user + System.out.println("nomUtil : "+nomUtil); + String passwd = mdp; // mot de passe + System.out.println("mdp : "+mdp); + + // 3. Connexion + connect = (Connection) DriverManager.getConnection(url, user, passwd); + System.out.println("Connexion réussie !"); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Retourne la connection établie (Création d'une connection si elle n'existe pas) + * @param serveur nom du serveur, localhost si local + * @param bdd nom de la base de données + * @param nomUtil nom utilisateur + * @param mdp mot de passe lié à l'utilisateur + * @return connection établie + */ + public static Connection getConnect(String serveur, String bdd, String nomUtil, String mdp) { + //System.out.println("getConnect"); + if (connect == null) { + new Connexion(serveur, bdd, nomUtil, mdp); + } + return connect; + } +} diff --git a/src/java/bdd/GradeMySQL.java b/src/java/bdd/GradeMySQL.java new file mode 100644 index 0000000..a7e6173 --- /dev/null +++ b/src/java/bdd/GradeMySQL.java @@ -0,0 +1,62 @@ +package bdd; + +import beans.Grade; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; + +/** + * + * @author noobm + */ +public class GradeMySQL { + private final Connection laConnection = Connexion.getConnect("172.20.10.5", + "sdis29", + "adminBDsdis", + "mdpBDsdis"); + + public Grade read(int id) { + Grade leGrade = null; + try { + PreparedStatement prepStmt = null; + String sql = "SELECT * FROM grade WHERE idGrade=?"; + prepStmt = laConnection.prepareStatement(sql); + prepStmt.setInt(1, id); + ResultSet result = prepStmt.executeQuery(); + if (result.next()) { + leGrade = new Grade(result.getInt(1), result.getString(2)); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return leGrade; + } + + // Lecture de tous les grades dans la base de données + public ArrayList readGrades() { + ArrayList lesGrades = new ArrayList<>(); + try { + PreparedStatement prepStmt = null; + String sql = "SELECT * FROM grade"; + prepStmt = laConnection.prepareStatement(sql); + ResultSet result = prepStmt.executeQuery(); + + + while (result.next()) { + Grade grade = new Grade(result.getInt(1), result.getString(2)); + lesGrades.add(grade); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return lesGrades; + } +} diff --git a/src/java/bdd/PompierMySQL.java b/src/java/bdd/PompierMySQL.java new file mode 100644 index 0000000..6ceb9a3 --- /dev/null +++ b/src/java/bdd/PompierMySQL.java @@ -0,0 +1,217 @@ +/* + * bdd/PompierMysql.java + */ +package bdd; + +import beans.Caserne; +import beans.Pompier; +import beans.Statut; +import beans.TypePers; +import beans.Grade; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class PompierMySQL { + + private final Connection theConnection = Connexion.getConnect("172.20.10.5", + "sdis29", + "adminBDsdis", + "mdpBDsdis"); + // Tableau des attributs mis à jour + // 1ère dimension : noms des attributs en bdd + // 2ème dimension : noms des champs transmis + // 3ème dimension : type de données, i pour Integet, s pour String + private String[][] lesAttributs = { + {"id", "idCaserne", "nom", "prenom", "statut", "typePers", "mail", "login", "mdp", "adresse", "cp", "ville", "bip", "grade", "commentaire"}, + {"idPompier", "idCaserne", "nom", "prenom", "statut", "type", "mail", "login", "mdp", "adresse", "cp", "ville", "bip", "grade", "obs"}, + {"i", "i", "s", "s", "i", "i", "s", "s", "s", "s", "s", "s", "s", "i", "s"} + }; + + /** + * Recherche du pompier ayant le login et le mdp passé en paramètres + * + * @param login + * @param mdp + * @return Pompier correspondant ou null si non trouvé + */ + public Pompier readAuthentif(String login, String mdp) { + Pompier lePompier = null; + try { + PreparedStatement prepStmt; + String sql = "SELECT * FROM pompier WHERE login=? AND mdp=? "; + + prepStmt = theConnection.prepareStatement(sql); + prepStmt.setString(1, login); + prepStmt.setString(2, mdp); + ResultSet result = prepStmt.executeQuery(); + if (result.next()) { + CaserneMySQL laCaserneMySQL = new CaserneMySQL(); + Caserne laCaserne = laCaserneMySQL.read(result.getInt(2)); + lePompier = constituerLePompier(result, laCaserne); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return lePompier; + } + + /** + * Recherche les pompiers volontaires de la caserne + * + * @param idCaserne + * @return collection des pompiers concernés + */ + public ArrayList readLesPompiersCaserne(int idCaserne) { + ArrayList lesPompiers = new ArrayList(); + try { + PreparedStatement prepStmt; + String sql = "SELECT * FROM pompier WHERE idCaserne=? AND statut=1 AND typePers=2 ORDER BY nom, prenom"; + + prepStmt = theConnection.prepareStatement(sql); + prepStmt.setInt(1, idCaserne); + ResultSet result = prepStmt.executeQuery(); + CaserneMySQL laCaserneMySQL = new CaserneMySQL(); + Caserne laCaserne = laCaserneMySQL.read(idCaserne); + while (result.next()) { + Pompier unPompier = constituerLePompier(result, laCaserne); + lesPompiers.add(unPompier); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return lesPompiers; + } + + public Pompier constituerLePompier(ResultSet result, Caserne laCaserne) { + Pompier lePompier = null; + StatutMySQL leStatutMySQL = new StatutMySQL(); + GradeMySQL leGradeMySQL = new GradeMySQL(); + TypePersoMySQL leTypePersoMySQL = new TypePersoMySQL(); + try { + + Statut leStatut = leStatutMySQL.read(result.getInt("statut")); + TypePers leTypePers = leTypePersoMySQL.read(result.getInt("typePers")); + Grade leGrade = leGradeMySQL.read(result.getInt("grade")); + + lePompier = new Pompier( + result.getInt(1), + laCaserne.getId(), + result.getString(3), + result.getString(4), + leStatut.getIdStatut(), + leTypePers.getIdTypePers(), + result.getString(7), + result.getString(8), + result.getString(9), + result.getString(10), + result.getString(11), + result.getString(12), + result.getString(13), + leGrade.getIdGrade(), + result.getString(16)); + //System.out.println("lePompier " + lePompier); + } catch (SQLException ex) { + Logger.getLogger(PompierMySQL.class.getName()).log(Level.SEVERE, null, ex); + } + return lePompier; + } + + public Pompier create(HashMap lesParametres) { + Pompier lePompierCree = null; + + String valeurs [] = new String[lesAttributs[1].length]; + String sql = "INSERT INTO pompier ("; + int nbAttributsMaj = 0; + String virgule = ""; + for (HashMap.Entry unParam : lesParametres.entrySet()) { + + int i = 0; + while (i < lesAttributs[1].length && !(lesAttributs[1][i].equals(unParam.getKey()))) { + i++; + } + if (i < lesAttributs[0].length) { + sql += virgule + lesAttributs[0][i]; + valeurs[nbAttributsMaj] = "("+lesAttributs[2][i]+")" + unParam.getValue(); + nbAttributsMaj++; + virgule = ", "; + } + } + sql += ", dateEnreg) values (?"; + for (int i=0; i 0) { + ResultSet result = prepStmt.getGeneratedKeys(); + if (result.first()) { + int id = result.getInt(1); + lePompierCree = read(id); + System.out.println("lePompierCree : "+ lePompierCree); + } + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + + return lePompierCree; + } + + public Pompier read(int idP) { + Pompier unPompier = null; + try { + PreparedStatement prepStmt; + String sql = "SELECT * FROM pompier WHERE idPompier=? "; + + prepStmt = theConnection.prepareStatement(sql); + prepStmt.setInt(1, idP); + ResultSet result = prepStmt.executeQuery(); + if (result.next()) { + CaserneMySQL laCaserneMySQL = new CaserneMySQL(); + Caserne laCaserne = laCaserneMySQL.read(result.getInt(2)); + unPompier = constituerLePompier(result, laCaserne); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return unPompier; + } +} diff --git a/src/java/bdd/StatutMySQL.java b/src/java/bdd/StatutMySQL.java new file mode 100644 index 0000000..1ee049c --- /dev/null +++ b/src/java/bdd/StatutMySQL.java @@ -0,0 +1,59 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package bdd; +import beans.Statut; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; + +public class StatutMySQL { + private final Connection laConnection = Connexion.getConnect("172.20.10.5", + "sdis29", + "adminBDsdis", + "mdpBDsdis"); + public Statut read(int id) { + Statut leStatut = null; + try { + PreparedStatement prepStmt = null; + String sql = "SELECT * FROM statut WHERE idStatut=?"; + prepStmt = laConnection.prepareStatement(sql); + prepStmt.setInt(1, id); + ResultSet result = prepStmt.executeQuery(); + if (result.next()) { + leStatut = new Statut(result.getInt(1), result.getString(2)); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return leStatut; + } + // Lecture de tous les grades dans la base de données + public ArrayList readStatuts() { + ArrayList lesStatuts = new ArrayList<>(); + try { + PreparedStatement prepStmt = null; + String sql = "SELECT * FROM statut"; + prepStmt = laConnection.prepareStatement(sql); + ResultSet result = prepStmt.executeQuery(); + + + while (result.next()) { + Statut leStatut = new Statut(result.getInt(1), result.getString(2)); + lesStatuts.add(leStatut); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return lesStatuts; + } +} diff --git a/src/java/bdd/TrancheMySQL.java b/src/java/bdd/TrancheMySQL.java new file mode 100644 index 0000000..a5e1de9 --- /dev/null +++ b/src/java/bdd/TrancheMySQL.java @@ -0,0 +1,65 @@ +package bdd; + +import beans.Tranche; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; + +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ + +/** + * + * @author noobm + */ +public class TrancheMySQL { + private final Connection laConnection = Connexion.getConnect("172.20.10.5", + "sdis29", + "adminBDsdis", + "mdpBDsdis"); + public Tranche read(int id) { + Tranche laTranche = null; + try { + PreparedStatement prepStmt = null; + String sql = "SELECT * FROM tranche WHERE idTranche=?"; + prepStmt = laConnection.prepareStatement(sql); + prepStmt.setInt(1, id); + ResultSet result = prepStmt.executeQuery(); + if (result.next()) { + laTranche = new Tranche(result.getInt(1), result.getString(2)); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return laTranche; + } + // Lecture de tous les grades dans la base de données + public ArrayList readTranches() { + ArrayList lesTranches = new ArrayList<>(); + try { + PreparedStatement prepStmt = null; + String sql = "SELECT * FROM tranche"; + prepStmt = laConnection.prepareStatement(sql); + ResultSet result = prepStmt.executeQuery(); + + + while (result.next()) { + Tranche laTranche = new Tranche(result.getInt(1), result.getString(2)); + lesTranches.add(laTranche); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return lesTranches; + } +} diff --git a/src/java/bdd/TypePersoMySQL.java b/src/java/bdd/TypePersoMySQL.java new file mode 100644 index 0000000..4306806 --- /dev/null +++ b/src/java/bdd/TypePersoMySQL.java @@ -0,0 +1,65 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package bdd; +import beans.TypePers; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ + + + +public class TypePersoMySQL { + private final Connection laConnection = Connexion.getConnect("172.20.10.5", + "sdis29", + "adminBDsdis", + "mdpBDsdis"); + public TypePers read(int id) { + TypePers leTypePerso = null; + try { + PreparedStatement prepStmt = null; + String sql = "SELECT * FROM typePers WHERE idTypePers=?"; + prepStmt = laConnection.prepareStatement(sql); + prepStmt.setInt(1, id); + ResultSet result = prepStmt.executeQuery(); + if (result.next()) { + leTypePerso = new TypePers(result.getInt(1), result.getString(2)); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return leTypePerso; + } + // Lecture de tous les grades dans la base de données + public ArrayList readStatuts() { + ArrayList lesTypePers = new ArrayList<>(); + try { + PreparedStatement prepStmt = null; + String sql = "SELECT * FROM typePers"; + prepStmt = laConnection.prepareStatement(sql); + ResultSet result = prepStmt.executeQuery(); + + + while (result.next()) { + TypePers leTypePers = new TypePers(result.getInt(1), result.getString(2)); + lesTypePers.add(leTypePers); + } + prepStmt.close(); + } catch (SQLException ex) { + System.out.println("SQLExeption : " + ex.getMessage()); + System.out.println("SQLState : " + ex.getSQLState()); + System.out.println("Code erreur : " + ex.getErrorCode()); + } + return lesTypePers; + } +} diff --git a/src/java/beans/Caserne.java b/src/java/beans/Caserne.java new file mode 100644 index 0000000..83ffbad --- /dev/null +++ b/src/java/beans/Caserne.java @@ -0,0 +1,84 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package beans; + +public class Caserne { + private int id; + private String nom; + private String adresse; + private String tel; + private String groupement; + private String codePostal; + + public Caserne(int id, String nom, String adresse, String tel, String groupement, String codePostal) { + this.id = id; + this.nom = nom; + this.adresse = adresse; + this.tel = tel; + this.groupement = groupement; + this.codePostal = codePostal; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public String getAdresse() { + return adresse; + } + + public void setAdresse(String adresse) { + this.adresse = adresse; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getGroupement() { + return groupement; + } + + public void setGroupement(String groupement) { + this.groupement = groupement; + } + + public String getCodePostal() { + return codePostal; + } + + public void setCodePostal(String codePostal) { + this.codePostal = codePostal; + } + + @Override + public String toString() { + return "Caserne{" + + "id=" + id + + ", nom='" + nom + '\'' + + ", adresse='" + adresse + '\'' + + ", tel='" + tel + '\'' + + ", groupement='" + groupement + '\'' + + ", codePostal='" + codePostal + '\'' + + '}'; + } +} + diff --git a/src/java/beans/Disponibilite.java b/src/java/beans/Disponibilite.java new file mode 100644 index 0000000..0ca78d7 --- /dev/null +++ b/src/java/beans/Disponibilite.java @@ -0,0 +1,41 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package beans; + +public class Disponibilite { + private int idDispo; + private String libelle; + + public Disponibilite() {} + + public Disponibilite(int idDispo, String libelle) { + this.idDispo = idDispo; + this.libelle = libelle; + } + + public int getIdDispo() { + return idDispo; + } + + public void setIdDispo(int idDispo) { + this.idDispo = idDispo; + } + + public String getLibelle() { + return libelle; + } + + public void setLibelle(String libelle) { + this.libelle = libelle; + } + + @Override + public String toString() { + return "Disponibilite{" + + "idDispo=" + idDispo + + ", libelle='" + libelle + '\'' + + '}'; + } +} diff --git a/src/java/beans/Grade.java b/src/java/beans/Grade.java new file mode 100644 index 0000000..2273f32 --- /dev/null +++ b/src/java/beans/Grade.java @@ -0,0 +1,41 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package beans; + +public class Grade { + private int idGrade; + private String libelle; + + public Grade() {} + + public Grade(int idGrade, String libelle) { + this.idGrade = idGrade; + this.libelle = libelle; + } + + public int getIdGrade() { + return idGrade; + } + + public void setIdGrade(int idGrade) { + this.idGrade = idGrade; + } + + public String getLibelle() { + return libelle; + } + + public void setLibelle(String libelle) { + this.libelle = libelle; + } + + @Override + public String toString() { + return "Grade{" + + "idGrade=" + idGrade + + ", libelle='" + libelle + '\'' + + '}'; + } +} diff --git a/src/java/beans/Pompier.java b/src/java/beans/Pompier.java new file mode 100644 index 0000000..7372ee6 --- /dev/null +++ b/src/java/beans/Pompier.java @@ -0,0 +1,202 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package beans; + +public class Pompier { + private int idPompier; + private int idCaserne; + private String nom; + private String prenom; + private int statut; + private int typePers; + private String mail; + private String login; + private String mdp; + private String adresse; + private String cp; + private String ville; + private String bip; + private int grade; + private String commentaire; + + + + public Pompier( + int idPompier, + int idCaserne, + String nom, + String prenom, + int statut, + int typePers, + String mail, + String login, + String mdp, + String adresse, + String cp, + String ville, + String bip, + int grade, + String commentaire) { + this.idPompier = idPompier; + this.idCaserne = idCaserne; + this.nom = nom; + this.prenom = prenom; + this.statut = statut; + this.typePers = typePers; + this.mail = mail; + this.login = login; + this.mdp = mdp; + this.adresse = adresse; + this.cp = cp; + this.ville = ville; + this.bip = bip; + this.grade = grade; + this.commentaire = commentaire; + } + + public int getIdPompier() { + return idPompier; + } + + public void setIdPompier(int idPompier) { + this.idPompier = idPompier; + } + + public int getIdCaserne() { + return idCaserne; + } + + public void setIdCaserne(int idCaserne) { + this.idCaserne = idCaserne; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public String getPrenom() { + return prenom; + } + + public void setPrenom(String prenom) { + this.prenom = prenom; + } + + public int getStatut() { + return statut; + } + + public void setStatut(int statut) { + this.statut = statut; + } + + public int getTypePers() { + return typePers; + } + + public void setTypePers(int typePers) { + this.typePers = typePers; + } + + public String getMail() { + return mail; + } + + public void setMail(String mail) { + this.mail = mail; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getMdp() { + return mdp; + } + + public void setMdp(String mdp) { + this.mdp = mdp; + } + + public String getAdresse() { + return adresse; + } + + public void setAdresse(String adresse) { + this.adresse = adresse; + } + + public String getCp() { + return cp; + } + + public void setCp(String cp) { + this.cp = cp; + } + + public String getVille() { + return ville; + } + + public void setVille(String ville) { + this.ville = ville; + } + + public String getBip() { + return bip; + } + + public void setBip(String bip) { + this.bip = bip; + } + + public int getGrade() { + return grade; + } + + public void setGrade(int grade) { + this.grade = grade; + } + + public String getCommentaire() { + return commentaire; + } + + public void setCommentaire(String commentaire) { + this.commentaire = commentaire; + } + + + @Override + public String toString() { + return "Pompier{" + + "idPompier=" + idPompier + + ", idCaserne=" + idCaserne + + ", nom='" + nom + '\'' + + ", prenom='" + prenom + '\'' + + ", statut=" + statut + + ", typePers=" + typePers + + ", mail='" + mail + '\'' + + ", login='" + login + '\'' + + ", mdp='" + mdp + '\'' + + ", adresse='" + adresse + '\'' + + ", cp='" + cp + '\'' + + ", ville='" + ville + '\'' + + ", bip='" + bip + '\'' + + ", grade=" + grade + + ", commentaire='" + commentaire + '\'' + + + '}'; + } +} + diff --git a/src/java/beans/PompierDispo.java b/src/java/beans/PompierDispo.java new file mode 100644 index 0000000..9fff260 --- /dev/null +++ b/src/java/beans/PompierDispo.java @@ -0,0 +1,63 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package beans; + +public class PompierDispo { + private int idJour; + private int idPompier; + private int idTranche; + private Integer idDisponibilite; + + public PompierDispo() {} + + public PompierDispo(int idJour, int idPompier, int idTranche, Integer idDisponibilite) { + this.idJour = idJour; + this.idPompier = idPompier; + this.idTranche = idTranche; + this.idDisponibilite = idDisponibilite; + } + + public int getIdJour() { + return idJour; + } + + public void setIdJour(int idJour) { + this.idJour = idJour; + } + + public int getIdPompier() { + return idPompier; + } + + public void setIdPompier(int idPompier) { + this.idPompier = idPompier; + } + + public int getIdTranche() { + return idTranche; + } + + public void setIdTranche(int idTranche) { + this.idTranche = idTranche; + } + + public Integer getIdDisponibilite() { + return idDisponibilite; + } + + public void setIdDisponibilite(Integer idDisponibilite) { + this.idDisponibilite = idDisponibilite; + } + + @Override + public String toString() { + return "PompierDispo{" + + "idJour=" + idJour + + ", idPompier=" + idPompier + + ", idTranche=" + idTranche + + ", idDisponibilite=" + idDisponibilite + + '}'; + } +} diff --git a/src/java/beans/Statut.java b/src/java/beans/Statut.java new file mode 100644 index 0000000..b238b2f --- /dev/null +++ b/src/java/beans/Statut.java @@ -0,0 +1,41 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package beans; + +public class Statut { + private int idStatut; + private String libelle; + + public Statut() {} + + public Statut(int idStatut, String libelle) { + this.idStatut = idStatut; + this.libelle = libelle; + } + + public int getIdStatut() { + return idStatut; + } + + public void setIdStatut(int idStatut) { + this.idStatut = idStatut; + } + + public String getLibelle() { + return libelle; + } + + public void setLibelle(String libelle) { + this.libelle = libelle; + } + + @Override + public String toString() { + return "Statut{" + + "idStatut=" + idStatut + + ", libelle='" + libelle + '\'' + + '}'; + } +} diff --git a/src/java/beans/Tranche.java b/src/java/beans/Tranche.java new file mode 100644 index 0000000..d760657 --- /dev/null +++ b/src/java/beans/Tranche.java @@ -0,0 +1,42 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package beans; + +public class Tranche { + private int idTranche; + private String libelle; + + public Tranche() {} + + public Tranche(int idTranche, String libelle) { + this.idTranche = idTranche; + this.libelle = libelle; + } + + public int getIdTranche() { + return idTranche; + } + + public void setIdTranche(int idTranche) { + this.idTranche = idTranche; + } + + public String getLibelle() { + return libelle; + } + + public void setLibelle(String libelle) { + this.libelle = libelle; + } + + @Override + public String toString() { + return "Tranche{" + + "idTranche=" + idTranche + + ", libelle='" + libelle + '\'' + + '}'; + } +} + diff --git a/src/java/beans/TypePers.java b/src/java/beans/TypePers.java new file mode 100644 index 0000000..f9730fb --- /dev/null +++ b/src/java/beans/TypePers.java @@ -0,0 +1,41 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package beans; + +public class TypePers { + private int idTypePers; + private String libelle; + + public TypePers() {} + + public TypePers(int idTypePers, String libelle) { + this.idTypePers = idTypePers; + this.libelle = libelle; + } + + public int getIdTypePers() { + return idTypePers; + } + + public void setIdTypePers(int idTypePers) { + this.idTypePers = idTypePers; + } + + public String getLibelle() { + return libelle; + } + + public void setLibelle(String libelle) { + this.libelle = libelle; + } + + @Override + public String toString() { + return "TypePers{" + + "idTypePers=" + idTypePers + + ", libelle='" + libelle + '\'' + + '}'; + } +} diff --git a/src/java/form/AuthentifForm.java b/src/java/form/AuthentifForm.java new file mode 100644 index 0000000..37ffe32 --- /dev/null +++ b/src/java/form/AuthentifForm.java @@ -0,0 +1,86 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package form; + +import bdd.GradeMySQL; +import bdd.PompierMySQL; +import bdd.StatutMySQL; +import bdd.TypePersoMySQL; +import bdd.TrancheMySQL; +import beans.Pompier; +import beans.Statut; +import beans.TypePers; +import beans.Grade; +import beans.Tranche; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import java.util.ArrayList; +import util.CtrlSaisie; +import util.MD5; +public class AuthentifForm { + + String message; + HttpServletRequest request; + + public AuthentifForm(HttpServletRequest request) { + this.request = request; + } + + public boolean ctrlAuthentif() { + request.removeAttribute("message"); + String[] champsObligatoires = {"username", "password"}; + if (!CtrlSaisie.CtrlChampsObligatoires(request, champsObligatoires)) { + return false; + } + + // Vérification absence de chevron + if (!CtrlSaisie.CtrlChevron(request)) { + return false; + } + return true; + } + + public boolean ctrlBDD() { + boolean trouve = false; + String login = request.getParameter("username"); + String mdp = MD5.encode(request.getParameter("password")); + PompierMySQL pompierMySQL = new PompierMySQL(); + Pompier lePompier = pompierMySQL.readAuthentif(login, mdp); + if (lePompier!= null) { + trouve = true; + HttpSession maSession = request.getSession(); + maSession.setAttribute("lePompierConnecte", lePompier); + StatutMySQL leStatutMySQL = new StatutMySQL(); + GradeMySQL leGradeMySQL = new GradeMySQL(); + TrancheMySQL lesTranchesMySQL = new TrancheMySQL(); + TypePersoMySQL leTypePersoMySQL = new TypePersoMySQL(); + + ArrayList lesGrades = leGradeMySQL.readGrades(); + maSession.setAttribute("les grades", lesGrades); + + + ArrayList lesTranches = lesTranchesMySQL.readTranches(); + maSession.setAttribute("les tranches", lesTranches); + + + ArrayList lesStatuts = leStatutMySQL.readStatuts(); + maSession.setAttribute("les statuts", lesStatuts); + + + ArrayList lesTypes = leTypePersoMySQL.readStatuts(); + maSession.setAttribute("lesTypes", lesTypes); + + if (lePompier.getStatut()== 2) { + + ArrayList lesPompiers = pompierMySQL.readLesPompiersCaserne(lePompier.getIdCaserne()); + maSession.setAttribute("lesPompiers", lesPompiers); + } + } else { + request.setAttribute("message", "Login ou mot de passe erroné"); + } + + return trouve; + } +} diff --git a/src/java/form/EditionForm.java b/src/java/form/EditionForm.java new file mode 100644 index 0000000..7300d13 --- /dev/null +++ b/src/java/form/EditionForm.java @@ -0,0 +1,45 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package form; +import bdd.GradeMySQL; +import bdd.PompierMySQL; +import bdd.StatutMySQL; +import bdd.TypePersoMySQL; +import bdd.TrancheMySQL; +import beans.Pompier; +import beans.Statut; +import beans.TypePers; +import beans.Grade; +import beans.Tranche; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import java.util.ArrayList; +import util.CtrlSaisie; +/** + * + * @author noobm + */ +public class EditionForm { + String message; + HttpServletRequest request; + + public EditionForm(HttpServletRequest request) { + this.request = request; + } + public boolean ctrlEdition() { + request.removeAttribute("message"); + String[] champsObligatoires = {"username", "password",}; + if (!CtrlSaisie.CtrlChampsObligatoires(request, champsObligatoires)) { + return false; + } + + // Vérification absence de chevron + if (!CtrlSaisie.CtrlChevron(request)) { + return false; + } + return true; + } + +} diff --git a/src/java/util/CtrlSaisie.java b/src/java/util/CtrlSaisie.java new file mode 100644 index 0000000..a40fba5 --- /dev/null +++ b/src/java/util/CtrlSaisie.java @@ -0,0 +1,64 @@ +/* + * util/CtrlSaisie.java + */ +package util; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Enumeration; + +/** + * + * @author domin + */ +public abstract class CtrlSaisie { + /** + * Vérifie la présence des champs obligatoires dans les paramètres transmis + * @param request + * @param champsObligatoires : tableau de chaine de caractères, avec le nom des champs obligatoires + * @return booléen + */ + public static boolean CtrlChampsObligatoires(HttpServletRequest request, String[] champsObligatoires) { + ArrayList champsPresents = new ArrayList<>(request.getParameterMap().keySet()); + int i = 0; + int nbChampsO = champsObligatoires.length; + boolean erreur = false; + while (erreur == false && i < nbChampsO && champsPresents.contains(champsObligatoires[i])){ + String value=request.getParameter(champsObligatoires[i]); + if (value.trim().length() > 0) { + i++; + } else { + erreur = true; + } + } + if (i < nbChampsO) { + request.setAttribute("message", "Veuillez renseigner toutes les zones obligatoires ("+i+')'); + } + return (i>=nbChampsO); + } + + /** + * Contrôle si un champ de saisie contient un chevron + * @param request + * @return 0 sinon, -1 si oui + */ + public static boolean CtrlChevron(HttpServletRequest request) { + // Contrôle car "<" dans les zones de texte + Enumeration lesNoms = request.getParameterNames(); + int erreur = 0; + //ArrayList parameterNames = new ArrayList(request.getParameterMap().keySet()); + while (erreur == 0 && lesNoms.hasMoreElements()) { + Object paramObjet=lesNoms.nextElement(); + String param=(String) paramObjet; + String value=request.getParameter(param); + if (value.contains("<") || value.contains("<")) { + String message = "Veuillez recommencer votre saisie, une anomalie sur une zone de saisie a été détectée "; + request.setAttribute("message", message); + erreur=1; + } + } + return (erreur > 0) ? false : true; + + } + +} diff --git a/src/java/util/MD5.java b/src/java/util/MD5.java new file mode 100644 index 0000000..cccd368 --- /dev/null +++ b/src/java/util/MD5.java @@ -0,0 +1,36 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package util; + +/** + * + * @author sio + */ + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.logging.Level; +import java.util.logging.Logger; + +public abstract class MD5 { + + public static String encode(String uneChaine){ + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException ex) { + throw new IllegalArgumentException(ex); + } + md.update(uneChaine.getBytes()); + byte[] digest = md.digest(); + //myHash = DatatypeConverter.printHexBinary(digest).toLowerCase(); + StringBuilder sb = new StringBuilder(); + for (byte b : digest) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } +} diff --git a/web/META-INF/context.xml b/web/META-INF/context.xml new file mode 100644 index 0000000..f040549 --- /dev/null +++ b/web/META-INF/context.xml @@ -0,0 +1,2 @@ + + diff --git a/web/WEB-INF/shared/EnteteJSP.jsp b/web/WEB-INF/shared/EnteteJSP.jsp new file mode 100644 index 0000000..0708496 --- /dev/null +++ b/web/WEB-INF/shared/EnteteJSP.jsp @@ -0,0 +1,13 @@ + + + + + + SDIS29 + + + +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + diff --git a/web/WEB-INF/shared/FooterJSP.jsp b/web/WEB-INF/shared/FooterJSP.jsp new file mode 100644 index 0000000..8f7ac75 --- /dev/null +++ b/web/WEB-INF/shared/FooterJSP.jsp @@ -0,0 +1,3 @@ + + + diff --git a/web/WEB-INF/shared/NavigationJSP.jsp b/web/WEB-INF/shared/NavigationJSP.jsp new file mode 100644 index 0000000..9f490ce --- /dev/null +++ b/web/WEB-INF/shared/NavigationJSP.jsp @@ -0,0 +1,19 @@ + + diff --git a/web/WEB-INF/views/AccueilPompierJSP.jsp b/web/WEB-INF/views/AccueilPompierJSP.jsp new file mode 100644 index 0000000..7eb795d --- /dev/null +++ b/web/WEB-INF/views/AccueilPompierJSP.jsp @@ -0,0 +1,38 @@ + + +
+
+
+
+ +
+
Card 1
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.

+
+
+
+ +
+
+ +
+
Card 2
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.

+
+
+
+ +
+
+ +
+
Card 3
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/web/WEB-INF/views/AccueilResponsableJSP.jsp b/web/WEB-INF/views/AccueilResponsableJSP.jsp new file mode 100644 index 0000000..959aaab --- /dev/null +++ b/web/WEB-INF/views/AccueilResponsableJSP.jsp @@ -0,0 +1,12 @@ + +<%@page contentType="text/html" pageEncoding="UTF-8"%> + + + + + JSP Page + + +

Hello World!

+ + diff --git a/web/WEB-INF/views/AuthentificationJSP.jsp b/web/WEB-INF/views/AuthentificationJSP.jsp new file mode 100644 index 0000000..1998dd8 --- /dev/null +++ b/web/WEB-INF/views/AuthentificationJSP.jsp @@ -0,0 +1,25 @@ + + +
+

Connexion

+
+
+ + +
+
+ + +
+ +
+ ${message} +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/web/WEB-INF/views/EditionPompierJSP.jsp b/web/WEB-INF/views/EditionPompierJSP.jsp new file mode 100644 index 0000000..1370a2b --- /dev/null +++ b/web/WEB-INF/views/EditionPompierJSP.jsp @@ -0,0 +1,50 @@ + + + + +
+

Modifier le profil

+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + + \ No newline at end of file diff --git a/web/WEB-INF/views/ProfilJSP.jsp b/web/WEB-INF/views/ProfilJSP.jsp new file mode 100644 index 0000000..7efd46d --- /dev/null +++ b/web/WEB-INF/views/ProfilJSP.jsp @@ -0,0 +1,29 @@ + + +
+

Informations du Pompier

+ + + + + + + + + + + + + + + + + + + + + + +
ID${pompier.idPompier}
Nom${pompier.nom}
Prénom${pompier.prenom}
Login${pompier.login}
Adresse${pompier.adresse}, ${pompier.ville}, ${pompier.cp}
+
+ \ No newline at end of file diff --git a/web/WEB-INF/web.xml b/web/WEB-INF/web.xml new file mode 100644 index 0000000..92084e9 --- /dev/null +++ b/web/WEB-INF/web.xml @@ -0,0 +1,27 @@ + + + + AuthentificationServlet + Servlet.AuthentificationServlet + + + ProfilPompierServlet + Servlet.ProfilPompierServlet + + + EditionProfilServlet + Servlet.EditionProfilServlet + + + AuthentificationServlet + / + + + ProfilPompierServlet + /Profil + + + EditionProfilServlet + /EditionProfil + + diff --git a/web/img/logo-sdis.png b/web/img/logo-sdis.png new file mode 100644 index 0000000000000000000000000000000000000000..c15050e4cb8e7d07f7d8f1bfd3b4c3fba89c6e18 GIT binary patch literal 12885 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%0AmPQEDF@v&g!Q~_0yv~kV}x>i{B9!m zQR33@t;9CSaaqu=KGuFA`O{R8Va`aAcsid#9XCQjOHW@``bqSv6jOtaaW)2Kd-cv~ zcnJyg`?>bvPcMrFy)cH4r{|W5B#-!-nmsprT1c8wrZIku#^EmUxFAY$&NI8b&KFeI zGMtGwHDUO4mi2TTNqe7ldlYN&R^`)5UXLDTfu04mmp`wlH#E3<5G7)^MB*Owr#|oI z*JmrTPuu)x3+DPi z;=}-;C&F3%IK^oTp&Axz&JYQUz;4vAYJGoSvP={Q!`17t9KIP1%v#+J>xfgi`OzdP zy-;^_8(K8`?s|1}n06!Ms~Z97AbgKYjb;bK{@s@KsEB-W;v!*W_|w_u*+j!UwL$o| zzks&k;KzI8;8H%`;g0eLzfI}`i4R41au$SNjgN)-^&-7j7W8Sq+if^jzcvtEp0{zUNf=k+zywc1#AYh_7_uB0jMMw z-|W0S1y;jN3J;Fp8UwoeHQu0-!j@R^*41GgRt2h#@8unOQe4kko6vc9;9!c}%))BE zc~gD;Unu>V=mx8|Ro-42F+oYHX~lgG#Hk}(s1Fzyf1$R9_o^}cF@*)gbY_E*8Ii~a z>m7?d&#Bx%RQQR3=ZBzFc1Q9c?myCOkt@_tk(^?MlVbK6bIbmde5D|~`oA7E2_>vckwsG}RDR0XM-~kz(dh-32mmL{f5tX9J!=?{`6T z4~42ay49E_ZALSmv&1BKM|N*iD5h3~4bzvMf;)H7P0l5;T;itfkcT1Ljvf@|vJA%? z26Y2vn&w?^t}>XQTJHR21`d3x+fdeWG!GJlsZOE)YcwCcGz&f)vv_5wnY>G<$w8Gq zDGi)vW^{*4jM5B;OXH>X=0@Ev1!T`UcvB-Y9M`$gnYJ8nkIJN5SsMcT#v+OIoc2N@ zGEc1qqwIL0yAUceDuL7^u#eB{+);HWPsH!D*1K&B=|RFMv>dJz=TN_oK;=#}#f)rz zGHq|bu~J|g{WAHI73amSJ^ucJnFtGd`mM9K2=BgdF5v2Lon0!V;({hLsoVg_pI`2pr{Gr623|&3fG3iVQIk2CC~7 zY7v!MFo@v#6|fig&gKfE&OJ1?dkdSP7_4KIXoc0-Z%Oe9o^I1?2PD#%Gws_1w1im} z_GuYaQ4s(GrxN#{*Xe?=aR}(OMkO~cV>II;%Jpj?qn~HQOn!CvW3_L&sex$9jJ-U| zAhC5g)gtWd>t@~iKvpn1>Eb8GzrmfrN7i%CWyRkG4KgtuL+U!AsOWG$A1xxk&6oPE z8leMk#P=a6n1n#Dpi^_hJ0+l1Mm|N8l0HhLFEy_h*8q+b{L2LmYg9Hnf8zw6Cp@!! z(c9Fh@ucsLrprH!9A=CFx|>X8Ml6a>AFkRDS8uU3(@|*3pzc5@y^0@0gUmS_wohcE zc_|6X0g5~!i~VTmrQ$7KEG7ljzMP<@lHh?gPMTZn7uGr!9h4flTa_Ng$c#!8h04vQ z&MI&RD|0Vd!QqpLbnWDDWVmC>upAE8bxvpd4 zW)y8>31*-Ascd{Ra&#G^g^Yk3>j;;NiI;};0DDLG6`q`?gtEp~QGOC98hV9(1FI#f zRzmU=rp?uUy2ifplA#j^R*dr{%|sC1_6=R*7I#oRE$746^)&jb6SMZDMZhaWsV$~D z6d97#^vb^E6n-QQ!3!zoYlCIWp8$x*vUmX4*AgLe18Id|FlTz@S%i9?ecb< z7=53dbFD~MCdDS)WSJ~<_U&?mZRj6kBLV&&lf9n#-K z+{l+fID7GM43EMV)0bzg@L5SCsTDaXc9e8hi>-&GoZNT!O%rlUj`TEFU+2gLp!Kmv z5ExXL9F;sgjy~`Jm&b-|eOILo!K*AWp;MP&)GJ5TEcn4s2qYSy!((gf!Q_&2Ou~uU z?%97j;!B^K)MxIqQHiqiFHpsm6vCjo>OHyEi)%eivO{wGdAMRalolI=rLP#a>;E7( z&cEK*WpjhW0^kWH_<)67syMZ+ycLA|Jkw&+f+V&gs&B^ty=*qdqoPa2BtB?q@pS1dV$w+3;^Apt-Ie*+^$OR#rLSF z?`m@DWH!Fi5Umf}n@Mp4#-~Yb(+^%Vt(Mz(Fhy&di&!&+!hBoxIa{LU; zs5cy?br1TW)OQTOjW8MxPBj!hLDPQ7mrK2eJf z%@bJm)CZYX6`>7A;>oVT<>spiOl7b#hxpsQac5C8a zVkn7NUf9didfXD>8ftim!jT|4{;|1RPkD?=V2(Skg6vwrG17t~COFmc17owm4=BE8 zH5~>S_TGUH_s5Zm^P0Z9l7ev}tC@DWz;DA5Y=mQfHQVu{w(;zL&=$|c#j0_su(2UB zjY54(!f{SDYw{X(#2hn?51segx!<4oX0puAt6YNQ8BNBvED66MoNAf>RNVRIRw1vi z+%`C@b67C%;5=?z!x9+6NRV-kZH+y?!^VC}hI$(d>CwGKP|KUfV?L89<|Bsf-hs!* zsw1&+jct}IwRBy|&q;G}!Z>cGr*4D*rbP1V=}RX5-}**l$x@Uc>*Nq;kFB8WZNfI; zh!kOzp~ce#ZsW3{tvx>l@=y*mLf>~g=&rMvSSgFH6)6YzZha_+f{c6GQN8Ysec8sM zil6nS{DV|41VB1lWi!i)Ve!?ieqC(Ax%At(Cl>khdn~Lzg^`@YB$8W%@5|LN9^vv? zEdNRKLF&Zm_tOrp0aE%tO*ndveDAQ=2Mm-kBbK{28T62JW6Ds-oYH^oIi3x3~Q z>qEwHRyJWEW@DG!$CHv-@@;M33YE&wNO)X))i`lurY=+<%QIOK!txFtMu>Ed36{ZY zlrV^5x(n;=-GOuYGe?Vwa2uNs?_|qy zf6bS$jG1W|`H_iUvg`;|$ssEpeeM{dVq_SIvk0%tdS8$==$ucG-JgC3P5OkIYdOQA z_rWJd&F1zaa+_zzT$CACq=NRd(mYv6_X)#E7@bKPpWbfoM~1adJR6>r$G1!_A2itD zTvE628oXnw5y@qz;6u;)midMos=T2V+!pC#@aj&WVBRheEFOHC9aAO9n!JCX52x(RS&DeIhf~2<58c`WXV- zU2J4S8XFVTuiVEAqu22mni{itiva$BlqU9xl#&!0!kuo=yp|-EoeWNtWa_qr0?TA~ zUOtmuU& jv&*baZWP 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 + + + + TODO supply a title + + + + +
TODO write content
+ + diff --git a/web/ressources/mycss.css b/web/ressources/mycss.css new file mode 100644 index 0000000..5efcc82 --- /dev/null +++ b/web/ressources/mycss.css @@ -0,0 +1,39 @@ + body { + background: linear-gradient(135deg, #667eea, #764ba2); + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; + margin: 0; + } + .auth-form { + background: #fff; + border-radius: 10px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); + padding: 30px; + max-width: 400px; + width: 100%; + } + .auth-form h2 { + text-align: center; + margin-bottom: 20px; + color: #333; + } + .auth-form .btn-primary { + background: #667eea; + border-color: #667eea; + } + .auth-form .btn-primary:hover { + background: #5a67d8; + } + .form-footer { + text-align: center; + margin-top: 15px; + } + .form-footer a { + text-decoration: none; + color: #667eea; + } + .form-footer a:hover { + text-decoration: underline; + } \ No newline at end of file