package com.FitBank.web.servlet; import com.FitBank.common.Debug; import com.FitBank.common.Servicios; import com.FitBank.web.util.ConstruirContenido; import com.FitBank.web.util.EjecutarEventos; import com.FitBank.xml.Mensaje.DatoGeneral; import com.FitBank.xml.Mensaje.MensajeXml; import org.apache.commons.lang.StringUtils; /** * Servlet que inicializa un mensaje TIP_SIG que se envía para su verificación y autenticación al * repositorio, luego analiza el resultado y administra la la sesión del Application Server, si * este es positivo asigna la sesión caso contrario invalida la sesión. * * @author FitBank */ public class ValidarSesion extends BaseServlets { private static final String SUCCESS_RESPONSE = "0"; private static final String EXPIRE_PASSWORD = "000001"; private static final int RESPUESTA_EXITOSA = 1; private static final int RESPUESTA_FALLIDA = 2; private static final int RESPUESTA_CAMBIO_PASS = 3; protected void inicializar() { aceptarGet(); aceptarPost(); obtenerWriter(); } protected void procesarPedido() { int indicador; // No rehacer login si ya está hecho if (evento == null || !evento.procesoXml.getXmlMensaje().getValor("USR", MensajeXml.SEC_CAB).equalsIgnoreCase(pedido.getParameter("usr"))) { evento = new EjecutarEventos(); evento.procesoXml.crearMensaje(construirEncabezado()); evento.obtenerCompanias(pedido); indicador = verificarRespuesta(); } else { indicador = RESPUESTA_EXITOSA; } switch (indicador) { case RESPUESTA_EXITOSA: String estilo = (String) sesion.getAttribute("estilo"); sesion.invalidate(); sesion = pedido.getSession(true); sesion.setAttribute("FBOS", evento); sesion.setAttribute("estilo", estilo); String subs = pedido.getParameter("subs"); String tran = pedido.getParameter("tran"); if(StringUtils.isNotBlank(subs) && StringUtils.isNotBlank(tran)){ try { getServletConfig().getServletContext().getRequestDispatcher("/FBSVF;jsessionid=" + pedido.getSession().getId()).forward(pedido, respuesta); } catch (Exception e) { Debug.imprimirError(e); } } else { writer.print(ConstruirContenido.forSession(pedido)); } break; case RESPUESTA_FALLIDA: sesion.invalidate(); writer.print(ConstruirContenido.forInvalidate(evento)); break; case RESPUESTA_CAMBIO_PASS: try { getServletConfig().getServletContext().getRequestDispatcher("/FBSCP;jsessionid=" + pedido.getSession().getId()).forward(pedido, respuesta); } catch (Exception e) { Debug.imprimirError(e); } break; } } /** * Método en el cual se construye el objeto que contiene los parámetros del encabezado del * mensaje que se va a construir para subir a sesión. * * @param sesion Objeto que contiene el contexto de la session del Application Server. * @param pedido Objeto que posee la petición del cliente. * * @return Matriz de objetos String en la cual se retornan los parámetros del encabezado. */ private String[][] construirEncabezado() { try { String estilo = pedido.getParameter("plataforma"); if (StringUtils.isBlank(estilo)) { estilo = "Fitbank.css"; } sesion.setAttribute("estilo", estilo); String sessionParameter = pedido.getParameter("session"); String session = Servicios.verificarCadena( String.valueOf(sessionParameter == null ? sesion.getId() : sessionParameter)); String passwordParameter = pedido.getParameter("password"); String password = Servicios.verificarCadena(String.valueOf( passwordParameter)); String[][] cb = { {"USR", Servicios.verificarCadena(String.valueOf(pedido.getParameter("usuario")))}, {"SID", session}, {"PWD", password}, {"TIP", MensajeXml.TIP_SIG}, {"FTR", Servicios.obtenerFechaAS()}, {"IPA", pedido.getRemoteAddr()}, {"MAC", pedido.getRemoteAddr()}, {"SUB", "01"}, {"TRN", "0000"}, {"VER", "01"} }; return cb; } catch (Exception ex) { Debug.imprimirError(ex); return new String[0][0]; } } /** * Método que analiza la respuesta del Mensaje luego de solicitar el SIGN ON en el sistema, si la * respuesta trae un código cero 0, se asume que es correcta la validación de seguridad, en caso * de que el código sea diferente de cero se verifica que no se encuentre caducado el password, * y si ninguno de los dos casos anteriores se presenta se presume la falla en el proceso de * SIGN ON. * * @param evento Objeto que contiene el mensaje en el cual se analiza la respuesta. * * @return Objeto que se encuentra seteado con TRUE si el análisis del código es correcto, en * FALSE si esta caducado el password y null si el mensaje indica que ha fracasado el * proceso de SIGN ON. */ private int verificarRespuesta() { MensajeXml respuesta = evento.procesoXml.getXmlMensaje(); if (respuesta != null) { if (respuesta.getValor("COD", MensajeXml.SEC_RES).equalsIgnoreCase(SUCCESS_RESPONSE)) { return RESPUESTA_EXITOSA; } else if (respuesta.getValor("COD", MensajeXml.SEC_RES).equalsIgnoreCase(EXPIRE_PASSWORD)) { return RESPUESTA_CAMBIO_PASS; } } return RESPUESTA_FALLIDA; } }