package com.fp.frontend.controller.security; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.faces.application.NavigationHandler; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletRequest; import org.primefaces.context.RequestContext; import org.primefaces.model.StreamedContent; import com.fp.dto.Request; import com.fp.dto.Response; import com.fp.dto.query.DtoQuery; import com.fp.frontend.controller.alfresco.AlfrescoController; import com.fp.frontend.controller.armas.parametros.CentroControlArmasController; import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController; import com.fp.frontend.controller.pgeneral.gene.ParametersController; import com.fp.frontend.controller.pgeneral.gene.TerminosCondicionesController; import com.fp.frontend.helper.CallerHelper; import com.fp.frontend.helper.MessageHelper; import com.fp.frontend.utility.EnumParametros; import com.fp.persistence.commondb.exception.CommondbException; import com.fp.persistence.parmas.param.TarmCentroControl; import com.fp.persistence.parmas.soli.TarmTerminos; import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail; import com.fp.persistence.pgeneral.safe.TsafeUserDetail; import com.fp.persistence.pgeneral.safe.TsafeUserProfile; /** * @author jorge * */ @ManagedBean @SessionScoped public class LoginController { private Request request; private MaiaMenu maiaMenu; /** * Informacion temporal a utilizar en cualquier controlador o pantalla del index, usuario password. */ private Map mdata = new HashMap(); /** * Datos de localizacion del usaurio, cia, suc, ofia, perfil, canal, area, etc. */ private final Map mlocation = new HashMap(); /** * Lista de companias. */ private List> lcompany; /** * Lista de perfiles asociados al usuario que hace login a la aplicacion. */ private List lprofile; /** * Bandera que indica si el usuario tiene que cambiar el password (Y) cambia el password . */ private String changepassword; /** * Indica que renderiza el campo para autorizar o negar una tarea de JBPM. */ private boolean renderBpmData = false; /** * Url logout del cas */ private String casLogoutUrl; /** * Codigo de perfil con el que se logea el usuario. */ private String profilecode; /** * Ruta del documento de los terminos y condiciones */ private String rutaTerminos; private StreamedContent content; // @ManagedProperty(value = "#{terminosCondicionesController}") // private TerminosCondicionesController terminos; // @ManagedProperty(value = "#{alfrescoController}") // private AlfrescoController alfrescoController; @PostConstruct private void postconstruct() { request = new Request(); request.setCompany(1); // Ip cliente HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); request.setTerminalCode(httpServletRequest.getRemoteAddr()); request.put("ip", httpServletRequest.getRemoteAddr()); request.put("host", httpServletRequest.getLocalAddr()); // this.request.put("jsessionid", // httpServletRequest.getSession().getId()); this.fillCompanies(); maiaMenu = new MaiaMenu(); } public void authenticate() throws Throwable { try { String user = mdata.get("a").toString(); String pass = mdata.get("b").toString(); request.put("login", user); CallerHelper ch = new CallerHelper(); Response resp = ch.login(request, user, pass); //validamos si aceptados los terminos y condiciones TarmTerminos terminos=TerminosCondicionesController.findxIdentificacion(user); if(resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0 && terminos==null){ System.out.println("terminos"); try { rutaTerminos=ParametersController.find("CODIGO.TERMINOS.COND", "1").getTextvalue(); content=AlfrescoController.downloadDocument(rutaTerminos); } catch (Exception e) { System.out.println("error al obtener el parametro CODIGO.TERMINOS.COND"); } //abre el dialogo que acepte RequestContext requestContext = RequestContext.getCurrentInstance(); requestContext.execute("PF('aceptaTerminosCond').show()"); }else if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) { TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) resp.get("TSAFEUSERDETAIL"); this.manageloginresponse(tsafeUserDetail); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("TSAFEUSERDETAIL", tsafeUserDetail); // Con esto pasa por el filtro de compresion. FacesContext ctx = FacesContext.getCurrentInstance(); ExternalContext externalContext = ctx.getExternalContext(); NavigationHandler handler = ctx.getApplication().getNavigationHandler(); handler.handleNavigation(ctx, null, "workspace"); // Fija en browser y SO request.setBrowser(this.obtainBrowserName(externalContext.getRequestHeaderMap().get("User-Agent"))); request.setOperativesystem(this.obtainSOName(externalContext.getRequestHeaderMap().get("User-Agent"))); // Obtiene y arma el menu del primer perfil. this.changeprofile(); } else { MessageHelper.setMessageError(resp); } } catch (Exception e) { MessageHelper.setMessageError(e); } } /** * Nuevo boton de terminos y condiciones */ public void aceptaTerminosCondicion(){ String user = mdata.get("a").toString(); String pass = mdata.get("b").toString(); CallerHelper ch; try { ch = new CallerHelper(); request.put("terminos","terminos"); request.put("aceptaterminos","SI"); request.put("identificacionterminos",user); request.put("documentoterminos",rutaTerminos); Response resp = ch.login(request, user, pass); TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) resp.get("TSAFEUSERDETAIL"); this.manageloginresponse(tsafeUserDetail); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("TSAFEUSERDETAIL", tsafeUserDetail); // Con esto pasa por el filtro de compresion. FacesContext ctx = FacesContext.getCurrentInstance(); ExternalContext externalContext = ctx.getExternalContext(); NavigationHandler handler = ctx.getApplication().getNavigationHandler(); handler.handleNavigation(ctx, null, "workspace"); // Fija en browser y SO request.setBrowser(this.obtainBrowserName(externalContext.getRequestHeaderMap().get("User-Agent"))); request.setOperativesystem(this.obtainSOName(externalContext.getRequestHeaderMap().get("User-Agent"))); // Obtiene y arma el menu del primer perfil. this.changeprofile(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void authenticateCas(String username, String urlCasLogout) throws Throwable { try { casLogoutUrl = urlCasLogout; request.put("login", username); CallerHelper ch = new CallerHelper(); Response resp = ch.loginCas(request, username, null); if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) { TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) resp.get("TSAFEUSERDETAIL"); this.manageloginresponse(tsafeUserDetail); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("TSAFEUSERDETAIL", tsafeUserDetail); // Con esto pasa por el filtro de compresion. //FacesContext ctx = FacesContext.getCurrentInstance(); // NavigationHandler handler = // ctx.getApplication().getNavigationHandler(); // handler.handleNavigation(ctx, null, "workspace"); // Obtiene y arma el menu del primer perfil. this.changeprofile(); } else { throw new Exception(resp.getResponseCode() + " " + resp.getResponseUserMessage()); } } catch (Exception e) { throw e; } } public void updateusesession() { System.out.println("logout::cerrando session"); try { CallerHelper ch = new CallerHelper(); ch.logout(request); } catch (Throwable e) { // no hacer nada } } public String logout() { System.out.println("logout::cerrando session bean"); this.updateusesession(); FacesContext fc = FacesContext.getCurrentInstance(); if(fc!=null){ fc.getExternalContext().invalidateSession(); } return "/login?faces-redirect=true"; } @SuppressWarnings("unchecked") private void manageloginresponse(TsafeUserDetail userdetail) { mlocation.put("cia", userdetail.get("cn")); mlocation.put("branch", userdetail.get("bn")); mlocation.put("office", userdetail.get("on")); mlocation.put("area", userdetail.get("an")); mlocation.put("channel", userdetail.get("chn")); mlocation.put("accodate", userdetail.get("ad")); mlocation.put("workdate", userdetail.get("wd")); mlocation.put("nickname", userdetail.getNickname()); mlocation.put("sbsemployee", userdetail.get("sbsemployee")); mlocation.put("sbsusercode", userdetail.get("sbsusercode")); obtenerCentroControl(userdetail); obtenerUnidadControl(userdetail); request.setUser(userdetail.getPk().getUsercode()); request.setCompany(userdetail.getCompanycode()); request.setBranchCode(userdetail.getBranchcode()); request.setOfficeCode(userdetail.getOfficecode()); request.setChannelCode(userdetail.getChannelcode()); request.setLanguage(userdetail.getLanguagecode()); request.setCentrocontrol(userdetail.getCcentrocontrol()); changepassword = userdetail.getChangepassword(); lprofile = (List) userdetail.get("lprofile"); request.setProfile(lprofile.get(0).getPk().getProfilecode()); } private void obtenerCentroControl(TsafeUserDetail userdetail) { TgeneCatalogDetail tcentrocontrol=null; try { TarmCentroControl centroControl = CentroControlArmasController.findPorCodigo(userdetail.getCcentrocontrol()); if (centroControl != null) { tcentrocontrol = CatalogDetailController.findCatalogo(centroControl.getInstituciontipo(), centroControl.getInstitucion()); } } catch (CommondbException e) { } catch (Exception e) { } if(tcentrocontrol != null){ userdetail.addAddtionalInfo("centrocontrol", tcentrocontrol.getDescription()); mlocation.put("centrocontrol", tcentrocontrol.getDescription()); }else{ userdetail.addAddtionalInfo("centrocontrol", ""); mlocation.put("centrocontrol", ""); } } private void obtenerUnidadControl(TsafeUserDetail userdetail) { TgeneCatalogDetail unidad=null; try { TarmCentroControl centroControl = CentroControlArmasController.findPorCodigo(userdetail.getCcentrocontrol()); if (centroControl != null) { unidad = CatalogDetailController.findCatalogo(centroControl.getNombreinstitucioncodigo(), centroControl.getNombreinstitucion()); } } catch (CommondbException e) { } catch (Exception e) { } if(unidad!=null){ userdetail.addAddtionalInfo("unidad", unidad.getDescription()); mlocation.put("unidad", unidad.getDescription()); }else{ userdetail.addAddtionalInfo("unidad", ""); mlocation.put("unidad", ""); } } @SuppressWarnings({ "unchecked" }) public void changeprofile() throws Exception { try { if (profilecode != null) { request.setProfile(profilecode); } CallerHelper ch = new CallerHelper(); Response resp = ch.menu(request); if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) { Map rootmenu = (Map) resp.get("rootmenu"); List> lmenu = (List>) rootmenu.get("items"); maiaMenu.buildMenu(lmenu); } else { MessageHelper.setMessageError(resp); } } catch (Throwable e) { MessageHelper.setMessageError(e); } } /** * Obtiene lista de compania. */ @SuppressWarnings("unchecked") private void fillCompanies() { try { CallerHelper ch = new CallerHelper(); Request request = new Request(); DtoQuery dto = new DtoQuery(null, null, null, true, null); HashMap mtables = new HashMap(); mtables.put("CIAS", dto); // permite adicionar mas de una tabla. request.setCompany(1); request.getModifiedData().put("queryalias", "COMPANY"); request.setQueryTables(mtables); Response resp = ch.executeQuery(request); if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) { lcompany = new ArrayList>(); MessageHelper.setMessageError(resp); } else { lcompany = (List>) resp.get("CIAS"); } } catch (Throwable e) { MessageHelper.setMessageError(e); } } public void fijaRequestData(Request request, String transactionmodule, Integer transactioncode, Integer transactionversion) throws Exception { request.setCompany(this.request.getCompany()); request.setCentrocontrol(this.request.getCentrocontrol()); request.setUnidad(this.request.getUnidad()); request.setBranchCode(this.request.getBranchCode()); request.setOfficeCode(this.request.getOfficeCode()); request.setUser(this.request.getUser()); request.setLanguage(this.request.getLanguage()); request.setChannelCode(this.request.getChannelCode()); request.setTerminalCode(this.request.getTerminalCode()); request.setProfile(this.request.getProfile()); request.setBrowser(this.request.getBrowser()); request.setOperativesystem(this.request.getOperativesystem()); // datos de la transaccion de ejecucion. request.setTransactionModule(transactionmodule); request.setTransactionCode(transactioncode); request.setTransactionVersion(transactionversion); } /** * Obtiene el nombre del browser * * @param userAgent * @return */ private String obtainBrowserName(String userAgent) { if (userAgent.contains("MSIE")) { return this.buildBrowser(userAgent, "MSIE"); } if (userAgent.contains("Firefox")) { return this.buildBrowser(userAgent, "Firefox"); } if (userAgent.contains("Chrome")) { return this.buildBrowser(userAgent, "Chrome"); } if (userAgent.contains("Opera")) { return this.buildBrowser(userAgent, "Opera"); } if (userAgent.contains("Safari")) { return this.buildBrowser(userAgent, "Safari"); } return "Unknown"; } /** * Obtiene el nombre del Sistema Operativo * * @param userAgent * @return */ private String obtainSOName(String userAgent) { String os = ""; if (userAgent.contains("Windows")) { os = this.buildOS(userAgent, "Windows"); } else if (userAgent.contains("Mac")) { os = this.buildOS(userAgent, "Mac"); } else if (userAgent.contains("Linux")) { os = this.buildOS(userAgent, "Linux"); } else if (userAgent.contains("android")) { os = this.buildOS(userAgent, "android"); } else if (userAgent.contains("iphone")) { os = this.buildOS(userAgent, "iphone"); } else { os = "UnKnown, More-Info: " + userAgent; } return os; } /** * Arma la respuesta del User-Agent * * @param userAgent * @param id * @return browser */ private String buildBrowser(String userAgent, String id) { String browser = ""; if (userAgent.contains("MSIE")) { String[] value = userAgent.substring(userAgent.indexOf(id), userAgent.length()).split(" "); browser = value[0] + " " + value[1]; } else { String[] value = userAgent.substring(userAgent.indexOf(id), userAgent.length()).split(" "); browser = value[0]; } return browser; } /** * Arma la respuesta del User-Agent * * @param userAgent * @param id * @return browser */ private String buildOS(String userAgent, String id) { String so = ""; if (userAgent.contains("Windows")) { String[] value = userAgent.substring(userAgent.indexOf(id), userAgent.length()).split(" "); so = value[0] + " " + value[1] + " " + value[2]; } else { String[] value = userAgent.substring(userAgent.indexOf(id), userAgent.length()).split(" "); so = value[0] + " " + value[1]; } return so; } /** * Entrega el valor de: lcompany * * @return List> */ public List> getLcompany() { return lcompany; } /** * Fija el valor de: lcompany * * @param Valor a fijar en el atributo. */ public void setLcompany(List> lcompany) { this.lcompany = lcompany; } /** * Entrega el valor de: lprofile * * @return List */ public List getLprofile() { return lprofile; } /** * Fija el valor de: lprofile * * @param Valor a fijar en el atributo. */ public void setLprofile(List lprofile) { this.lprofile = lprofile; } /** * Entrega el valor de: changepassword * * @return String */ public String getChangepassword() { return changepassword; } /** * Fija el valor de: changepassword * * @param Valor a fijar en el atributo. */ public void setChangepassword(String changepassword) { this.changepassword = changepassword; } /** * Entrega el valor de: mdata * * @return Map */ public Map getMdata() { return mdata; } /** * Fija el valor de: mdata * * @param Valor a fijar en el atributo. */ public void setMdata(Map mdata) { this.mdata = mdata; } /** * Entrega el valor de: request * * @return Request */ public Request getRequest() { return request; } /** * Fija el valor de: request * * @param Valor a fijar en el atributo. */ public void setRequest(Request request) { this.request = request; } /** * Entrega el valor de: maiaMenu * * @return MaiaMenu */ public MaiaMenu getMaiaMenu() { return maiaMenu; } /** * Fija el valor de: maiaMenu * * @param Valor a fijar en el atributo. */ public void setMaiaMenu(MaiaMenu maiaMenu) { this.maiaMenu = maiaMenu; } /** * Entrega el valor de: mlocation * * @return Map */ public Map getMlocation() { return mlocation; } /** * Entrega el valor de: renderBpmData * * @return boolean */ public boolean isRenderBpmData() { return renderBpmData; } /** * Fija el valor de: renderBpmData * * @param renderBpmData Valor a fijar en el atributo. */ public void setRenderBpmData(boolean renderBpmData) { this.renderBpmData = renderBpmData; } public String getCasLogoutUrl() { return casLogoutUrl; } public void setCasLogoutUrl(String casLogoutUrl) { this.casLogoutUrl = casLogoutUrl; } /** * Entrega el valor de: profilecode * * @return String */ public String getProfilecode() { return profilecode; } /** * Fija el valor de: profilecode * * @param profilecode */ public void setProfilecode(String profilecode) { this.profilecode = profilecode; } /** * Metodo para obtener el documento de ayuda */ public void help() throws Exception { String m = request.getTransactionModule(); String t = request.getTransactionCode().toString(); String v = request.getTransactionVersion().toString(); String p = ParametersController.find(EnumParametros.PATH_ALFRESCO_AYUDA.getCodigo(), request.getCompany().toString()).getTextvalue(); RequestContext.getCurrentInstance().execute("Maiaworkspace.loadHelp('" + m + "', '" + t + "', '" + v + "', '" + p + "')"); } @PreDestroy private void closeSessionMaia() { try { FacesContext fc = FacesContext.getCurrentInstance(); if(fc!=null){ this.logout(); } } catch (Exception e) { // no hacer nada. } } // public TerminosCondicionesController getTerminos() { // return terminos; // } // // public void setTerminos(TerminosCondicionesController terminos) { // this.terminos = terminos; // } // public AlfrescoController getAlfrescoController() { // return alfrescoController; // } // // public void setAlfrescoController(AlfrescoController alfrescoController) { // this.alfrescoController = alfrescoController; // } public String getRutaTerminos() { return rutaTerminos; } public void setRutaTerminos(String rutaTerminos) { this.rutaTerminos = rutaTerminos; } public StreamedContent getContent() { return content; } public void setContent(StreamedContent content) { this.content = content; } }