package br.com.centralit.citsmart.rest.service;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import br.com.centralit.citcorpore.bean.EmpregadoDTO;
import br.com.centralit.citcorpore.bean.GrupoDTO;
import br.com.centralit.citcorpore.bean.LoginDTO;
import br.com.centralit.citcorpore.bean.PerfilAcessoUsuarioDTO;
import br.com.centralit.citcorpore.bean.UsuarioDTO;
import br.com.centralit.citcorpore.integracao.EmpregadoDao;
import br.com.centralit.citcorpore.integracao.ad.LDAPUtils;
import br.com.centralit.citcorpore.negocio.GrupoService;
import br.com.centralit.citcorpore.negocio.PerfilAcessoUsuarioService;
import br.com.centralit.citcorpore.negocio.UsuarioService;
import br.com.centralit.citcorpore.util.CriptoUtils;
import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.centralit.citcorpore.util.WebUtil;
import br.com.centralit.citsmart.rest.bean.RestSessionDTO;
import br.com.centralit.citsmart.rest.schema.CtLogin;
import br.com.citframework.dto.Usuario;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.PersistenceEngine;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.Reflexao;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.UtilI18N;
public class RestSessionServiceEjb implements RestSessionService {
private static final Map<String, RestSessionDTO> mapSessions = new HashMap<>();
@Override
public RestSessionDTO newSession(final HttpServletRequest httpRequest, final CtLogin login) throws Exception {
this.authentication(httpRequest, login);
final RestSessionDTO sessionDto = new RestSessionDTO();
sessionDto.setCreation(UtilDatas.getDataHoraAtual());
sessionDto.setHttpSession(httpRequest.getSession());
sessionDto.setMaxTime(1800);
mapSessions.put(sessionDto.getSessionID(), sessionDto);
return sessionDto;
}
@Override
public RestSessionDTO getSession(final String sessionID) {
RestSessionDTO result = mapSessions.get(sessionID);
if (result != null && !result.isValid()) {
mapSessions.remove(result.getSessionID());
result.setHttpSession(null);
result = null;
}
return result;
}
public CtLogin authentication(final HttpServletRequest httpRequest, final CtLogin login) throws Exception {
boolean isAdmin = false;
if (login != null) {
if (login.getPassword() == null || login.getPassword().trim().equalsIgnoreCase("")) {
throw new LogicException(UtilI18N.internacionaliza(httpRequest, "bi.painelControle.conexao.senhaNaoInformada"));
}
if (login.getUserName() == null || login.getUserName().trim().equalsIgnoreCase("")) {
throw new LogicException(UtilI18N.internacionaliza(httpRequest, "bi.painelControle.conexao.usuarioNaoInformado"));
}
} else {
throw new LogicException(UtilI18N.internacionaliza(httpRequest, "bi.painelControle.conexao.usuarioNaoInformado"));
}
final UsuarioDTO usrDto = new UsuarioDTO();
final String metodoAutenticacao = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.METODO_AUTENTICACAO_Pasta, "2");
isAdmin = "admin".equalsIgnoreCase(login.getUserName()) || "consultor".equalsIgnoreCase(login.getUserName());
if (metodoAutenticacao != null && metodoAutenticacao.trim().equalsIgnoreCase("2") && !isAdmin) {
final LoginDTO loginDto = new LoginDTO();
loginDto.setUser(login.getUserName());
loginDto.setSenha(login.getPassword());
this.getUsuarioService().sincronizaUsuarioAD(LDAPUtils.autenticacaoAD(login.getUserName(), login.getPassword()), loginDto, false);
}
final boolean veririficaVazio = this.getUsuarioService().listSeVazio();
String algoritmo = br.com.citframework.util.Constantes.getValue("ALGORITMO_CRIPTOGRAFIA_SENHA");
if (algoritmo == null || !algoritmo.trim().equalsIgnoreCase("")) {
algoritmo = "SHA-1";
}
login.setPassword(CriptoUtils.generateHash(login.getPassword(), algoritmo));
if (!veririficaVazio && "admin".equalsIgnoreCase(login.getUserName())) {
usrDto.setDataInicio(UtilDatas.getDataAtual());
usrDto.setLogin(login.getUserName());
usrDto.setSenha(login.getPassword());
usrDto.setNomeUsuario("Administrador");
usrDto.setStatus("A");
this.getUsuarioService().createFirs(usrDto);
}
final UsuarioDTO usuarioBean = this.getUsuarioService().restoreByLogin(login.getUserName(), login.getPassword());
if (usuarioBean == null) {
throw new LogicException(UtilI18N.internacionaliza(httpRequest, "bi.painelControle.conexao.usuarioSenhaInvalida"));
}
if (metodoAutenticacao == null || metodoAutenticacao.trim().equalsIgnoreCase("")) {
throw new LogicException(UtilI18N.internacionaliza(httpRequest, "bi.painelControle.conexao.MetodoNaoConfigurado"));
}
if (metodoAutenticacao != null) {
if (usuarioBean.getStatus().equalsIgnoreCase("A") && login.getPassword().equals(usuarioBean.getSenha())) {
if (usuarioBean.getIdEmpresa() == null) {
usuarioBean.setIdEmpresa(1);
}
final Usuario usuarioFramework = new Usuario();
final UsuarioDTO usr = new UsuarioDTO();
usr.setIdUsuario(usuarioBean.getIdUsuario());
usr.setNomeUsuario(usuarioBean.getNomeUsuario());
usr.setIdGrupo(usuarioBean.getIdGrupo());
usr.setIdEmpresa(usuarioBean.getIdEmpresa());
usr.setIdEmpregado(usuarioBean.getIdEmpregado());
usr.setLogin(usuarioBean.getLogin());
usr.setStatus(usuarioBean.getStatus());
usr.setIdPerfilAcessoUsuario(this.getProfile(usuarioBean.getIdUsuario()));
// utilizado para log
PersistenceEngine.setUsuarioSessao(usuarioBean);
Reflexao.copyPropertyValues(usr, usuarioFramework);
br.com.citframework.util.WebUtil.setUsuario(usuarioFramework, httpRequest);
final Collection<GrupoDTO> colGrupos = this.getGrupoService().getGruposByPessoa(usuarioBean.getIdEmpregado());
GrupoDTO grpSeg;
String[] grupos = null;
if (colGrupos != null) {
grupos = new String[colGrupos.size()];
for (int i = 0; i < colGrupos.size(); i++) {
grpSeg = (GrupoDTO) ((List) colGrupos).get(i);
grupos[i] = grpSeg.getSigla();
}
} else {
grupos = new String[1];
grupos[0] = "";
}
usr.setGrupos(grupos);
usr.setColGrupos(colGrupos);
usr.setLocale(WebUtil.getLanguage(httpRequest));
final EmpregadoDTO empregadoDto = new EmpregadoDao().restoreByIdEmpregado(usuarioBean.getIdEmpregado());
if (empregadoDto != null && empregadoDto.getIdUnidade() != null) {
usr.setIdUnidade(empregadoDto.getIdUnidade());
}
httpRequest.getSession().setAttribute("locale", usr.getLocale());
WebUtil.setUsuario(usr, httpRequest);
} else {
throw new LogicException(UtilI18N.internacionaliza(httpRequest, "bi.painelControle.conexao.MetodoNaoConfigurado"));
}
}
return login;
}
private Integer getProfile(final Integer idUsuario) throws ServiceException, Exception {
PerfilAcessoUsuarioDTO perfilAcessoDTO = new PerfilAcessoUsuarioDTO();
perfilAcessoDTO.setIdUsuario(idUsuario);
perfilAcessoDTO = this.getPerfilAcessoService().listByIdUsuario(perfilAcessoDTO);
if (perfilAcessoDTO == null) {
return null;
}
return perfilAcessoDTO.getIdPerfilAcesso();
}
private GrupoService grupoService;
private PerfilAcessoUsuarioService perfilAcessoService;
private UsuarioService usuarioService;
public GrupoService getGrupoService() throws ServiceException {
if (grupoService == null) {
grupoService = (GrupoService) ServiceLocator.getInstance().getService(GrupoService.class, null);
}
return grupoService;
}
private PerfilAcessoUsuarioService getPerfilAcessoService() throws ServiceException {
if (perfilAcessoService == null) {
perfilAcessoService = (PerfilAcessoUsuarioService) ServiceLocator.getInstance().getService(PerfilAcessoUsuarioService.class, null);
}
return perfilAcessoService;
}
public UsuarioService getUsuarioService() throws ServiceException {
if (usuarioService == null) {
usuarioService = (UsuarioService) ServiceLocator.getInstance().getService(UsuarioService.class, null);
}
return usuarioService;
}
}