package com.ejie.x38.rss.security;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerException;
import n38a.exe.N38APISesion;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import com.ejie.x38.rss.exception.RssAuthenticationException;
import com.ejie.x38.util.XmlManager;
import com.ejie.x38.webdav.security.WebDAVHttpServletRequestWrapper;
/**
* Clase de utilidades para facilitar el proceso de autenticación de un usuario
* contra XLNets que vaya aceder al contenido RSS.
*
* @author UDA
*
*/
public class RssXLNetsAutenticationHelper {
private static final String ERROR_TYPE_INFO = "informacion";
private static final String ERROR_TYPE_WARNING = "warning";
private static final String ERROR_TYPE_ERROR = "error";
private static final String XPATH_N38_ROOT = "/n38";
private static final String XPATH_N38UIDSESION = "/n38/elementos/elemento[@subtipo='N38Sesion']/parametro[@id='n38uidsesion']/valor";
private static final String XPATH_N38DOMINIOUID = "/n38/elementos/elemento[@subtipo='N38Sesion']/parametro[@id='n38dominiouid']/valor";
/**
* Comprueba que el documento generado desde XLNets es válido.
*
* @param nodo
* Documento de sesión de XLNets.
*/
public static void checkSecuritySesionValid(Node nodo) {
if (null == nodo)
return;
try {
Node nodeN38 = XmlManager.searchDomNode(nodo, RssXLNetsAutenticationHelper.XPATH_N38_ROOT);
Node node = nodeN38.getFirstChild();
if (RssXLNetsAutenticationHelper.ERROR_TYPE_INFO.equalsIgnoreCase(node.getNodeName())) {
throw new RssAuthenticationException(RssXLNetsAutenticationHelper.getErrorString(node, RssXLNetsAutenticationHelper.ERROR_TYPE_INFO));
}
if (RssXLNetsAutenticationHelper.ERROR_TYPE_WARNING.equalsIgnoreCase(node.getNodeName())) {
throw new RssAuthenticationException(RssXLNetsAutenticationHelper.getErrorString(node, RssXLNetsAutenticationHelper.ERROR_TYPE_WARNING));
}
if (RssXLNetsAutenticationHelper.ERROR_TYPE_ERROR.equalsIgnoreCase(node.getNodeName())) {
throw new RssAuthenticationException(RssXLNetsAutenticationHelper.getErrorString(node, RssXLNetsAutenticationHelper.ERROR_TYPE_ERROR));
}
} catch (TransformerException e) {
throw new RssAuthenticationException("Se ha producido un error a la hora de validar el xml de sesión de XLNets", e);
}
}
/**
* Genera una sesión de XLNets realizando un login mediante usuario y
* contraseña.
*
* @param username
* Nombre de usuario de XLNets.
* @param password
* Password del usuario en XLNets.
* @param request
* HTTP Request.
* @param response
* HTTP Response.
* @return Request generada a partir de la indicada por parámetro en la que
* se añaden las cookies correspondientes a la sesión de XLNets
* generada.
*/
public static HttpServletRequest createXLNetsSessionUP(String username, String password, HttpServletRequest request, HttpServletResponse response) {
N38APISesion n38APISession = new N38APISesion(request);
Document n38apiSesionCrearUP = n38APISession.n38APISesionCrearUP(username, password);
RssXLNetsAutenticationHelper.checkSecuritySesionValid(n38apiSesionCrearUP);
WebDAVHttpServletRequestWrapper wrapedRequest = new WebDAVHttpServletRequestWrapper(request);
wrapedRequest.getSession(true);
String searchDomNodeUidSesion;
String searchDomNodeDominioUid;
try {
searchDomNodeUidSesion = XmlManager.searchDomNode(n38apiSesionCrearUP, RssXLNetsAutenticationHelper.XPATH_N38UIDSESION).getFirstChild().getNodeValue();
searchDomNodeDominioUid = XmlManager.searchDomNode(n38apiSesionCrearUP, RssXLNetsAutenticationHelper.XPATH_N38DOMINIOUID).getFirstChild().getNodeValue();
} catch (TransformerException e) {
throw new RssAuthenticationException("Se ha producido un error a la hora de validar el xml de sesión de XLNets", e);
}
wrapedRequest.addCookie(new Cookie("n38UidSesion", searchDomNodeUidSesion));
wrapedRequest.addCookie(new Cookie("n38DominioUid", searchDomNodeDominioUid));
return wrapedRequest;
}
/**
* Genera un código de error a partir de un xml de error devuelto por
* XLNets.
*
* @param node
* Documento de error de xlnets.
* @param type
* Tipo de error.
* @return Mensaje de error correspondiente al error de XLNets.
* @throws DOMException
* Excepción DOMException.
* @throws TransformerException
* Excepción TransformerException.
*/
private static String getErrorString(Node node, String type) throws DOMException, TransformerException {
String codigo = XmlManager.searchDomNode(node, "/n38/" + type + "/@codigo").getNodeValue();
String descripcion = XmlManager.searchDomNode(node, "/n38/" + type + "/descripcionCA/text()").getNodeValue();
String motivo = XmlManager.searchDomNode(node, "/n38/" + type + "/motivo/text()").getNodeValue();
return "XLNets Error Code '" + codigo + "': " + descripcion + " -- " + motivo;
}
}