/* * Copyright 2012 E.J.I.E., S.A. * * Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»); * Solo podrá usarse esta obra si se respeta la Licencia. * Puede obtenerse una copia de la Licencia en * * http://ec.europa.eu/idabc/eupl.html * * Salvo cuando lo exija la legislación aplicable o se acuerde por escrito, * el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL», * SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas. * Véase la Licencia en el idioma concreto que rige los permisos y limitaciones * que establece la Licencia. */ package com.ejie.x38.security; import java.util.HashMap; import java.util.Vector; import javax.servlet.http.HttpServletRequest; import javax.xml.transform.TransformerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import com.ejie.x38.util.StackTraceManager; import com.ejie.x38.util.XmlManager; import n38c.exe.N38API; import n38i.exe.N38DocumentPrinter; import n38i.exe.N38Excepcion; import n38i.exe.N38ParameterException; /** * * @author UDA * */ public class XlnetCore { private static final Logger logger = LoggerFactory.getLogger(XlnetCore.class); public static final String PATH_SUBTIPO_N38INSTANCIA = "/n38/elementos/elemento/elemento/elemento/parametro[@id='n38uidobjseguridad']/valor"; public static final String PATH_SUBTIPO_N38SESION = "/n38/elementos/elemento[@subtipo='N38Sesion']/parametro[@id='?']/valor"; public static final String PATH_SUBTIPO_n38DOMINIOCOMUNCOOKIE = "/n38/elementos/elemento[@subtipo='N38Sesion']/parametro[@id='n38dominiocomuncookie']/valor"; public static final String PATH_SUBTIPO_N38SUBJECTCERT = "/n38/elementos/elemento[@subtipo='N38Sesion']/parametro[@id='n38subjectcert']/valor"; public static final String PATH_SUBTIPO_DNI = "/n38/elementos/elemento[@subtipo='N38Sesion']/parametro[@id='dni']/valor"; public static final String PATH_SUBTIPO_N38PERSONAUID = "n38/elementos/elemento[@subtipo='N38Sesion']/parametro[@id='n38personauid']/valor"; public static final String PATH_SUBTIPO_ORGANIZATIONALUNIT = "/n38/elementos/elemento[@subtipo='OrganizationalUnit']/parametro[@id='ou']/valor[text()='?']/../../elemento[@subtipo=\"n38itemSeguridad\"]/parametro[@id=\"n38uidobjseguridad\"]/valor"; public static final String PATH_CHECK_ERROR = "/n38/error"; public static final String PATH_CHECK_WARNING = "/n38/warning"; public static final String FILTRO_LDAP_UID = "uid="; public static final String PATH_PUESTOUID_SUBTIPO_SN = "/n38/elementos/elemento[@subtipo='n38persona']/parametro[@id='sn']/valor"; public static final String PATH_PUESTOUID_SUBTIPO_CN = "/n38/elementos/elemento[@subtipo='n38persona']/parametro[@id='cn']/valor"; public static final String PATH_PUESTOUID_SUBTIPO_GIVENNAME = "/n38/elementos/elemento[@subtipo='n38persona']/parametro[@id='givenname']/valor"; public static final String PATH_XMLSESION_N38PERFILES = "/n38/elementos/elemento[@subtipo='N38Sesion']/parametro[@id='n38perfiles']/valor"; /** * Devuelve un objeto N38API a partir del contexto de una petición Request. * Si la request es inválida se propaga una excepción. * * @param httpRequest * La request que lleva la validación XLNET. * @return Un objeto N38API con información sobre la sesión XLNET. */ public static N38API getN38API(HttpServletRequest httpRequest) { N38API n38apiRetorno = null; if (httpRequest == null) throw new IllegalArgumentException( "getN38API(): The HttpServletRequest input parameter can't be NULL."); n38apiRetorno = new N38API(httpRequest); return n38apiRetorno; } public static Document getN38ItemSesion(N38API n38api) { Document documentReturn = null; if (n38api == null) throw new IllegalArgumentException( "getN38ItemSesion(): The N38API input parameter can't be NULL."); documentReturn = n38api.n38ItemSesion(); if (documentReturn != null) { logger.trace("N38ItemSesion is: "+ N38DocumentPrinter.print(documentReturn)); } return documentReturn; } public static Document getN38ItemSeguridad(N38API n38api, String idItemSeguridad) { if (n38api != null) logger.trace("N38API is: "+n38api); logger.trace("idItemSeguridad is: "+idItemSeguridad); Document documentReturn = null; if (n38api == null) throw new IllegalArgumentException( "getN38ItemSeguridad(): The N38API input parameter can't be NULL."); documentReturn = n38api.n38ItemSeguridad(idItemSeguridad); if (documentReturn != null) { logger.trace("N38ItemSeguridad is: "+ N38DocumentPrinter.print(documentReturn)); } return documentReturn; } public static boolean isXlnetSessionContainingErrors(Document xmlSesion) { if (xmlSesion != null) logger.trace("XmlSesion is: "+xmlSesion.getTextContent()); if (xmlSesion == null) throw new IllegalArgumentException( "isXlnetSessionContainingErrors(): The Document input parameter can't be NULL."); boolean bResultado = false; try { if (XmlManager.searchDomNode(xmlSesion, PATH_CHECK_ERROR) != null) { bResultado = true; logger.debug("XmlSesion contains errors: "+xmlSesion.getTextContent()); }else{ logger.debug("XmlSesion does not contain errors: "+xmlSesion.getTextContent()); } } catch (TransformerException e) { logger.error("isXlnetSessionContainingErrors(): XML searching error: "+ StackTraceManager.getStackTrace(e)); bResultado = true; } return bResultado; } public static boolean isXlnetSessionContainingWarnings(Document xmlSesion) { if (xmlSesion == null) throw new IllegalArgumentException( "isXlnetSessionContainingErrors(): The Document input parameter can't be NULL."); boolean bResultado = false; try { if (XmlManager.searchDomNode(xmlSesion, PATH_CHECK_WARNING) != null) { bResultado = true; logger.debug("XmlSesion contains warnings: "+xmlSesion.getTextContent()); }else{ logger.debug("XmlSesion is not containing warnings: "+xmlSesion.getTextContent()); } } catch (TransformerException e) { logger.error("isXlnetSessionContainingWarnings(): XML searching error: "+ e.getMessage()); bResultado = true; } return bResultado; } public static String getN38DominioComunCookie(Document xmlSesion) { Node n38DominioComunCookieNode; if (xmlSesion != null) logger.trace("XmlSesion is: "+xmlSesion.getTextContent()); if (xmlSesion == null) throw new IllegalArgumentException( "isXlnetSessionContainingErrors(): The Document input parameter can't be NULL."); try { n38DominioComunCookieNode = XmlManager.searchDomNode(xmlSesion, PATH_SUBTIPO_n38DOMINIOCOMUNCOOKIE); return n38DominioComunCookieNode.getFirstChild().getNodeValue(); } catch (TransformerException e) { logger.error("isXlnetSessionContainingErrors(): XML searching error: "+ StackTraceManager.getStackTrace(e)); return null; } } public static HashMap<String, String> getN38SubjectCert(Document xmlSesion) { String[] n38SubjectCert = new String[2]; String[] n38SubjectCertAux = new String[2]; String[] n38MultiSubjectCert; HashMap<String, String> certinfo = null; if (xmlSesion != null){ logger.trace("XmlSesion is: "+xmlSesion.getTextContent()); } else { throw new IllegalArgumentException( "isXlnetSessionContainingErrors(): The Document input parameter can't be NULL."); } try { n38MultiSubjectCert = (XmlManager.searchDomNode(xmlSesion, PATH_SUBTIPO_N38SUBJECTCERT)).getFirstChild().getNodeValue().split(", "); // Comprobamos si el certificado es un único String certinfo = new HashMap<String, String>(); if (n38MultiSubjectCert.length>1){ for(int i =0; i < n38MultiSubjectCert.length; i++){ n38SubjectCert = n38MultiSubjectCert[i].split("="); if (n38SubjectCert.length > 1){ n38SubjectCertAux = n38SubjectCert; certinfo.put(n38SubjectCert[0], n38SubjectCert[1]); } else { certinfo.put(n38SubjectCertAux[0], certinfo.get(n38SubjectCertAux[0]) + n38SubjectCert[0]); } } }else{ Node searchDomNode = XmlManager.searchDomNode(xmlSesion, XlnetCore.PATH_SUBTIPO_DNI); if (searchDomNode !=null){ String dni = searchDomNode.getFirstChild().getNodeValue(); certinfo.put("CN",dni); }else if (n38MultiSubjectCert.length == 1){ certinfo.put("CN", n38MultiSubjectCert[0]); } } return certinfo; } catch (TransformerException e) { logger.error("getN38SubjectCert(): XML searching error: "+ StackTraceManager.getStackTrace(e)); return null; } catch (Exception e) { logger.error("getN38SubjectCert(): XML Read and Parser error: "+ StackTraceManager.getStackTrace(e)); return null; } } public static Vector<String> searchParameterIntoXlnetSesion(Document xmlSesion, String searchUrl) { if (xmlSesion == null) throw new IllegalArgumentException( "isXlnetSessionContainingErrors(): The Document input parameter can't be NULL."); if (searchUrl == null || searchUrl.equals("")) throw new IllegalArgumentException( "isXlnetSessionContainingErrors(): The String searchUrl input parameter can't be NULL."); Vector<String> resultVector = null; try { resultVector = XmlManager.searchDomVector(xmlSesion, searchUrl); } catch (TransformerException e) { logger.error("Could not find ["+searchUrl+"] in Document ["+xmlSesion.getTextContent()+"]. Error is: "+ e.getMessage()); resultVector = null; } if (resultVector != null) logger.trace("Search ["+searchUrl+"] in Document ["+xmlSesion.getTextContent()+"] obtained results: ["+ resultVector.toString() + "]"); else logger.trace("Search ["+searchUrl+"] in Document ["+xmlSesion.getTextContent()+"] obtained NO results!"); return resultVector; } public static String getParameterSession(N38API n38Api, String param){ String[] result = null; if (n38Api == null) throw new IllegalArgumentException( "getN38ItemSeguridad(): The N38API input parameter can't be NULL."); try { result = n38Api.n38ItemSesion(param); } catch (N38ParameterException e) { logger.error(StackTraceManager.getStackTrace(e)); } catch (N38Excepcion e) { logger.error(StackTraceManager.getStackTrace(e)); } if(result!=null && result.length>0){ return result[0]; }else{ return null; } } public static HashMap<String, String> getUserDataInfo(N38API n38Api){ HashMap<String, String> result = new HashMap<String, String>(); String n38personauidString; Document xmlPersona; Document n38ItemSesion; if (n38Api == null) throw new IllegalArgumentException( "getN38ItemSeguridad(): The N38API input parameter can't be NULL."); n38ItemSesion = n38Api.n38ItemSesion(); try { n38personauidString = XmlManager.searchDomNode(n38ItemSesion, XlnetCore.PATH_SUBTIPO_N38PERSONAUID).getFirstChild().getNodeValue(); } catch (TransformerException e) { logger.error("isXlnetSessionContainingErrors(): XML searching error: "+ StackTraceManager.getStackTrace(e)); return null; } xmlPersona = n38Api.n38ItemObtenerPersonas(FILTRO_LDAP_UID+n38personauidString); try { result.put("name",XmlManager.searchDomNode(xmlPersona, PATH_PUESTOUID_SUBTIPO_GIVENNAME).getFirstChild().getNodeValue()); result.put("surname",XmlManager.searchDomNode(xmlPersona, PATH_PUESTOUID_SUBTIPO_SN).getFirstChild().getNodeValue()); result.put("fullName", XmlManager.searchDomNode(xmlPersona, PATH_PUESTOUID_SUBTIPO_CN).getFirstChild().getNodeValue()); } catch (TransformerException e) { logger.error("isXlnetSessionContainingErrors(): XML searching error: "+ StackTraceManager.getStackTrace(e)); return null; } return result; } @Deprecated public static String getUidSesion(N38API n38Api){ String[] uidSesions = null; try { uidSesions = n38Api.n38ItemSesion(N38API.NOMBRE_N38UIDSESION); } catch (N38ParameterException e) { logger.error(StackTraceManager.getStackTrace(e)); } catch (N38Excepcion e) { logger.error(StackTraceManager.getStackTrace(e)); } if(uidSesions!=null && uidSesions.length>0){ return uidSesions[0]; }else{ return null; } } @Deprecated public static String getLogin(N38API n38Api){ String[] personaUids = null; try { personaUids = n38Api.n38ItemSesion("n38personasuid"); } catch (N38ParameterException e) { logger.error(StackTraceManager.getStackTrace(e)); } catch (N38Excepcion e) { logger.error(StackTraceManager.getStackTrace(e)); } if(personaUids!=null && personaUids.length>0){ return personaUids[0]; }else{ return null; } } @Deprecated public static String getPuesto(N38API n38Api){ String[] personaPuestoUids = null; try { personaPuestoUids = n38Api.n38ItemSesion(N38API.NOMBRE_N38PUESTOUID); } catch (N38ParameterException e) { logger.error(StackTraceManager.getStackTrace(e)); } catch (N38Excepcion e) { logger.error(StackTraceManager.getStackTrace(e)); } if(personaPuestoUids!=null && personaPuestoUids.length>0){ return personaPuestoUids[0]; }else{ return null; } } }