From feb8d1a4f8e82908b5f7c1e104f2fbeea631e170 Mon Sep 17 00:00:00 2001 From: Samuel Gamez Date: Mon, 27 May 2024 11:01:14 -0500 Subject: [PATCH] Funciones EndPoint y token --- .../src/java/xforce/bl/LoginBL.java | 32 ++++ .../src/java/xforce/bl/PaisesBL.java | 15 +- .../src/java/xforce/bl/UsuariosBL.java | 1 + .../src/java/xforce/dao/LoginDAO.java | 53 ++++++ .../src/java/xforce/dao/UsuariosDAO.java | 1 + .../src/java/xforce/modelo/Usuarios.java | 21 ++- .../src/java/xforce/token/TokenGenerator.java | 26 +++ .../java/xforce/servicios/PaisesEndpoint.java | 155 ++++++++++++++++++ .../java/xforce/vista/DemoBeanUsuarios.java | 12 +- 9 files changed, 302 insertions(+), 14 deletions(-) create mode 100644 ProyectoInventario-ejb/src/java/xforce/token/TokenGenerator.java create mode 100644 ProyectoInventario-war/src/java/xforce/servicios/PaisesEndpoint.java diff --git a/ProyectoInventario-ejb/src/java/xforce/bl/LoginBL.java b/ProyectoInventario-ejb/src/java/xforce/bl/LoginBL.java index 41e7e3b..08a3c6f 100644 --- a/ProyectoInventario-ejb/src/java/xforce/bl/LoginBL.java +++ b/ProyectoInventario-ejb/src/java/xforce/bl/LoginBL.java @@ -12,6 +12,7 @@ import javax.persistence.NoResultException; import xforce.dao.LoginDAO; import xforce.modelo.Usuarios; import xforce.msg.Mensaje; +import xforce.token.TokenGenerator; /** * @@ -45,6 +46,22 @@ public class LoginBL implements LoginBLLocal { m = Mensaje.SIN_ERROR; rol(usuarios); System.out.println(m); + + Usuarios users = loginDAO.buscarElId(usuarios); + + if (users.getToken().equals("0") || users.getToken() == null) { + String token; + Optional loginToken; + do { + token = TokenGenerator.generateToken(); + users.setToken(token); + loginToken = loginDAO.token(users); + } while (loginToken.isPresent()); + + loginDAO.editar(users); + System.out.println("Token generado: " + token); + } + } else { m = Mensaje.NO_EXISTE; rol(usuarios); @@ -52,6 +69,21 @@ public class LoginBL implements LoginBLLocal { } return m; } + + public Mensaje permiso(Usuarios usuarios){ + Mensaje m; + LoginDAO loginDAO = new LoginDAO(); + + Optional loginOptional = loginDAO.token(usuarios); + + if(loginOptional.isPresent()){ + m = Mensaje.SIN_ERROR; + } else { + m = Mensaje.NO_EXISTE; + } + + return m; + } @Override public String rol(Usuarios usuarios) { diff --git a/ProyectoInventario-ejb/src/java/xforce/bl/PaisesBL.java b/ProyectoInventario-ejb/src/java/xforce/bl/PaisesBL.java index 7bd39cf..bb63508 100644 --- a/ProyectoInventario-ejb/src/java/xforce/bl/PaisesBL.java +++ b/ProyectoInventario-ejb/src/java/xforce/bl/PaisesBL.java @@ -75,7 +75,7 @@ public class PaisesBL implements PaisesBLLocal { } Paises paisExistente = paisesDAO.buscarId(paises); - + Optional productoEncontradoActivo = paisesDAO.buscarPaises(paises); if (productoEncontradoActivo.isPresent()) { @@ -205,8 +205,13 @@ public class PaisesBL implements PaisesBLLocal { } public void addMessage(FacesMessage.Severity severity, String summary, String detail) { - FacesContext.getCurrentInstance(). - addMessage("mensajePaises", new FacesMessage(severity, summary, detail)); - } + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////// AGREGAR EL TRY-CATCH EN SU CLASE ////////////////////////// + try { + FacesContext.getCurrentInstance(). + addMessage("mensajePaises", new FacesMessage(severity, summary, detail)); + } catch (NullPointerException e) { + } -} + } +} \ No newline at end of file diff --git a/ProyectoInventario-ejb/src/java/xforce/bl/UsuariosBL.java b/ProyectoInventario-ejb/src/java/xforce/bl/UsuariosBL.java index e43a963..ad6cd09 100644 --- a/ProyectoInventario-ejb/src/java/xforce/bl/UsuariosBL.java +++ b/ProyectoInventario-ejb/src/java/xforce/bl/UsuariosBL.java @@ -230,6 +230,7 @@ public class UsuariosBL implements UsuariosBLLocal { users.setDomicilio(usuarios.getDomicilio()); users.setRolesId(usuarios.getRolesId()); users.setEstadosId(usuarios.getEstadosId()); + users.setToken(users.getToken()); // Guardar la modificación en la base de datos if (p.editar(users)) { diff --git a/ProyectoInventario-ejb/src/java/xforce/dao/LoginDAO.java b/ProyectoInventario-ejb/src/java/xforce/dao/LoginDAO.java index d455e9f..c14c92b 100644 --- a/ProyectoInventario-ejb/src/java/xforce/dao/LoginDAO.java +++ b/ProyectoInventario-ejb/src/java/xforce/dao/LoginDAO.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Optional; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; +import javax.persistence.NoResultException; import javax.persistence.Persistence; import javax.persistence.Query; import xforce.modelo.Usuarios; @@ -51,6 +52,33 @@ public class LoginDAO { } } + public Optional token(Usuarios usuarios) { + Query q1 = em.createNamedQuery("Usuarios.findByToken"); + q1.setParameter("token", usuarios.getToken()); + + List resToken = q1.getResultList(); + + if (!resToken.isEmpty()) { + Usuarios tokenEncontrado = resToken.stream() + .findFirst() + .orElse(null); + return Optional.ofNullable(tokenEncontrado); + } else { + return Optional.empty(); + } + } + + public String tokenEnd(String token) { + try { + Query q = em.createQuery("SELECT u.token FROM Usuarios u WHERE u.token = :token"); + q.setParameter("token", token); + return (String) q.getSingleResult(); + } catch (NoResultException e) { + System.out.println("No token found for: " + token); + return null; // O lanza una excepción específica si prefieres manejarlo de esa manera + } + } + public String rol(Usuarios usuarios) { Query q = em.createQuery("SELECT u.rolesId.rol FROM Usuarios u WHERE u.nombre = :nombre AND u.contrasenia = :contrasenia AND u.estado = :estado"); @@ -61,4 +89,29 @@ public class LoginDAO { return (String) q.getSingleResult(); } + public Usuarios buscarElId(Usuarios usuarios) { + Query q = em.createQuery("SELECT u FROM Usuarios u WHERE u.nombre = :nombre AND u.contrasenia = :contrasenia AND u.estado = :estado"); + q.setParameter("nombre", usuarios.getNombre()); + q.setParameter("contrasenia", usuarios.getContrasenia()); + q.setParameter("estado", usuarios.getEstado()); + + List resultList = q.getResultList(); + if (!resultList.isEmpty()) { + return resultList.get(0); + } else { + return null; // o lanza una excepción si es necesario + } + } + + public boolean editar(Usuarios usuarios) { + if (buscarElId(usuarios) == null) { + return false; + } else { + em.getTransaction().begin(); + em.merge(usuarios);//edita en la base de datos + em.getTransaction().commit(); + return true; + } + } + } diff --git a/ProyectoInventario-ejb/src/java/xforce/dao/UsuariosDAO.java b/ProyectoInventario-ejb/src/java/xforce/dao/UsuariosDAO.java index ee7192a..1906a3c 100644 --- a/ProyectoInventario-ejb/src/java/xforce/dao/UsuariosDAO.java +++ b/ProyectoInventario-ejb/src/java/xforce/dao/UsuariosDAO.java @@ -28,6 +28,7 @@ public class UsuariosDAO { public void agregar(Usuarios a) { em.getTransaction().begin(); a.setEstado(2); + a.setToken("0"); em.persist(a);//almacena en la base de datos em.getTransaction().commit(); } diff --git a/ProyectoInventario-ejb/src/java/xforce/modelo/Usuarios.java b/ProyectoInventario-ejb/src/java/xforce/modelo/Usuarios.java index 0375517..c137731 100644 --- a/ProyectoInventario-ejb/src/java/xforce/modelo/Usuarios.java +++ b/ProyectoInventario-ejb/src/java/xforce/modelo/Usuarios.java @@ -22,7 +22,7 @@ import javax.xml.bind.annotation.XmlRootElement; /** * - * @author hugoa + * @author Samuel Gamez */ @Entity @Table(name = "usuarios", catalog = "inventarioalmacen", schema = "") @@ -36,7 +36,8 @@ import javax.xml.bind.annotation.XmlRootElement; @NamedQuery(name = "Usuarios.findByTelefono", query = "SELECT u FROM Usuarios u WHERE u.telefono = :telefono"), @NamedQuery(name = "Usuarios.findByEstado", query = "SELECT u FROM Usuarios u WHERE u.estado = :estado"), @NamedQuery(name = "Usuarios.findByContrasenia", query = "SELECT u FROM Usuarios u WHERE u.contrasenia = :contrasenia"), - @NamedQuery(name = "Usuarios.findByDomicilio", query = "SELECT u FROM Usuarios u WHERE u.domicilio = :domicilio")}) + @NamedQuery(name = "Usuarios.findByDomicilio", query = "SELECT u FROM Usuarios u WHERE u.domicilio = :domicilio"), + @NamedQuery(name = "Usuarios.findByToken", query = "SELECT u FROM Usuarios u WHERE u.token = :token")}) public class Usuarios implements Serializable { private static final long serialVersionUID = 1L; @@ -80,6 +81,11 @@ public class Usuarios implements Serializable { @Size(min = 1, max = 100) @Column(name = "domicilio") private String domicilio; + @Basic(optional = false) + @NotNull + @Size(min = 1, max = 88) + @Column(name = "token") + private String token; @JoinColumn(name = "estados_id", referencedColumnName = "id") @ManyToOne(optional = false) private Estados estadosId; @@ -94,7 +100,7 @@ public class Usuarios implements Serializable { this.id = id; } - public Usuarios(Integer id, String nombre, String apellidoPaterno, String email, String telefono, int estado, String contrasenia, String domicilio) { + public Usuarios(Integer id, String nombre, String apellidoPaterno, String email, String telefono, int estado, String contrasenia, String domicilio, String token) { this.id = id; this.nombre = nombre; this.apellidoPaterno = apellidoPaterno; @@ -103,6 +109,7 @@ public class Usuarios implements Serializable { this.estado = estado; this.contrasenia = contrasenia; this.domicilio = domicilio; + this.token = token; } public Integer getId() { @@ -169,6 +176,14 @@ public class Usuarios implements Serializable { this.domicilio = domicilio; } + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + public Estados getEstadosId() { return estadosId; } diff --git a/ProyectoInventario-ejb/src/java/xforce/token/TokenGenerator.java b/ProyectoInventario-ejb/src/java/xforce/token/TokenGenerator.java new file mode 100644 index 0000000..a131a5b --- /dev/null +++ b/ProyectoInventario-ejb/src/java/xforce/token/TokenGenerator.java @@ -0,0 +1,26 @@ +/* + * 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 xforce.token; + +import java.security.SecureRandom; + +/** + * + * @author Samuel Gamez + */ +public class TokenGenerator { + + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"; + private static final int TOKEN_LENGTH = 88; + private static final SecureRandom secureRandom = new SecureRandom(); + + public static String generateToken() { + StringBuilder token = new StringBuilder(TOKEN_LENGTH); + for (int i = 0; i < TOKEN_LENGTH; i++) { + token.append(CHARACTERS.charAt(secureRandom.nextInt(CHARACTERS.length()))); + } + return token.toString(); + } +} diff --git a/ProyectoInventario-war/src/java/xforce/servicios/PaisesEndpoint.java b/ProyectoInventario-war/src/java/xforce/servicios/PaisesEndpoint.java new file mode 100644 index 0000000..813ae42 --- /dev/null +++ b/ProyectoInventario-war/src/java/xforce/servicios/PaisesEndpoint.java @@ -0,0 +1,155 @@ +/* + * 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 xforce.servicios; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; +import javax.ejb.EJB; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import xforce.bl.PaisesBLLocal; +import xforce.dao.LoginDAO; +import xforce.modelo.Paises; +import xforce.modelo.Usuarios; +import xforce.msg.Mensaje; + +/** + * + * @author Samuel Gamez + */ +@WebServlet(name = "PaisesEndpoint", urlPatterns = {"/PaisesEndpoint"}) +public class PaisesEndpoint extends HttpServlet { + + @EJB + private PaisesBLLocal paisesBL; + + /** + * 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. */ + + // Obtener el token de la solicitud + String token = request.getParameter("token"); + + // Verificar si el token es válido + LoginDAO loginDAO = new LoginDAO(); + Usuarios usuario = new Usuarios(); + usuario.setToken(token); + String s = loginDAO.tokenEnd(token); + System.out.println(s); + + if (s == null) { + // Token no válido + out.println("

Token no valido

"); + //response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token no válido"); + List listaPaises = paisesBL.buscarValidos(true); + if (listaPaises != null && !listaPaises.isEmpty()) { + for (Paises pais : listaPaises) { + out.println("

" + pais.getNombre() + "

"); + } + } + + return; + } + + Paises paises = new Paises(); + + String opc = request.getParameter("opc"); + String id = request.getParameter("id"); + String nombre = request.getParameter("nombre"); + Mensaje m = null; + + if (opc != null) { + + switch (Integer.parseInt(opc)) { + case 1: + paises.setNombre(nombre); + m = paisesBL.agregar(paises); + break; + case 2: + + paises.setId(Integer.valueOf(id)); + + paises.setNombre(nombre); + + m = paisesBL.editar(paises); + break; + + case 3: + + paises.setId(Integer.valueOf(id)); + + m = paisesBL.eliminar(paises); + + break; + default: + throw new AssertionError(); + } + } + + List listaPaises = paisesBL.buscarValidos(true); + out.print("

" + m + "

"); + if (listaPaises != null && !listaPaises.isEmpty()) { + for (Paises pais : listaPaises) { + out.println("

" + pais.getNombre() + "

"); + } + } + } + } + + // + /** + * 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 { + processRequest(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 { + 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/ProyectoInventario-war/src/java/xforce/vista/DemoBeanUsuarios.java b/ProyectoInventario-war/src/java/xforce/vista/DemoBeanUsuarios.java index 386be56..99a4810 100644 --- a/ProyectoInventario-war/src/java/xforce/vista/DemoBeanUsuarios.java +++ b/ProyectoInventario-war/src/java/xforce/vista/DemoBeanUsuarios.java @@ -46,14 +46,14 @@ public class DemoBeanUsuarios implements Serializable { public String agregar() { Estados estao = new Estados(); - estao.setId(3); - - usuario.setEstadosId(estao); - + estao.setId(3); + + usuario.setEstadosId(estao); + Mensaje mensaje = usuariosBL.agregar(usuario); switch (mensaje) { case SIN_ERROR: - + usuario = new Usuarios(); PrimeFaces.current().executeScript("PF('user').hide()"); PrimeFaces.current().ajax().update("userTable:messages"); @@ -162,7 +162,7 @@ public class DemoBeanUsuarios implements Serializable { || u.getRolesId().getRol().toLowerCase().contains(filterText) || u.getEstadosId().getNombre().toLowerCase().contains(filterText); } - + // public String buscar() { // Usuarios usuarios = new Usuarios(); //