package gcom.gui.seguranca.acesso;
import gcom.fachada.Fachada;
import gcom.gui.ActionServletException;
import gcom.gui.GcomAction;
import gcom.gui.SessaoHttpListener;
import gcom.seguranca.acesso.FiltroGrupoFuncionalidadeOperacao;
import gcom.seguranca.acesso.Funcionalidade;
import gcom.seguranca.acesso.FuncionalidadeCategoria;
import gcom.seguranca.acesso.Grupo;
import gcom.seguranca.acesso.GrupoFuncionalidadeOperacao;
import gcom.seguranca.acesso.GrupoFuncionalidadeOperacaoPK;
import gcom.seguranca.acesso.usuario.FiltroUsuario;
import gcom.seguranca.acesso.usuario.FiltroUsuarioGrupoRestricao;
import gcom.seguranca.acesso.usuario.Usuario;
import gcom.seguranca.acesso.usuario.UsuarioFavorito;
import gcom.seguranca.acesso.usuario.UsuarioGrupoRestricao;
import gcom.seguranca.acesso.usuario.UsuarioSituacao;
import gcom.util.ConstantesSistema;
import gcom.util.Internacionalizador;
import gcom.util.Util;
import gcom.util.filtro.FiltroParametro;
import gcom.util.filtro.ParametroSimples;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
* Esse action valida o usu�rio e coloca as informa��es na sess�o, todo o acesso
* ter� que passar obrigatoriamente por aqui primeiro
*
* @author Pedro Alexandre
* @date 05/07/2006
*/
public class EfetuarLoginAction extends GcomAction {
/**
* [UC0287] - Efetuar Login
*
* @author Pedro Alexandre
* @date 04/07/2006
*
* @param actionMapping
* @param actionForm
* @param httpServletRequest
* @param httpServletResponse
* @return
*/
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
// Prepara o retorno da a��o para a tela principal
ActionForward retorno = actionMapping.findForward("telaPrincipal");
// Recupera o ActionForm
EfetuarLoginActionForm loginActionForm = (EfetuarLoginActionForm) actionForm;
String visualizacaoRAUrgencia = (String) httpServletRequest.getParameter("visualizacaoRAUrgencia");
if(visualizacaoRAUrgencia == null || !visualizacaoRAUrgencia.equals("sim")){
// Vari�vel que vai armazenar o usu�rio logado
Usuario usuarioLogado = null;
// Recupera o login e a senha do usu�rio
String login = loginActionForm.getLogin();
String senha = loginActionForm.getSenha();
// [FS0003] - Verificar preenchimento do login
if (login == null || login.trim().equals("")) {
this.reportarErros(httpServletRequest, "atencao.login.invalido");
retorno = actionMapping.findForward("telaLogin");
} else {
//Cria a vari�vel que vai armazenar a mensagem com a quantidade de
//dias que falta para expirar a validade da senha
String mensagemExpiracao = "";
// [FS0001] - Verificar exist�ncia do login
if (!this.verificarExistenciaLogin(login)) {
this.reportarErrosMensagem(httpServletRequest,"atencao.login.inexistente", login);
retorno = actionMapping.findForward("telaLogin");
} else {
// Cria uma instancia da sess�o
HttpSession sessao = httpServletRequest.getSession(true);
// [FS0004] - Validar senha do login
// Busca o usu�rio no sistema, o usu�rio ser� nulo se n�o
// existir
usuarioLogado = this.getFachada().validarUsuario(login, senha);
// [FS0005] - Verificar n�mero de tentativas.
Integer numeroTentativas = (Integer) sessao.getAttribute("numeroTentativas");
Short numeroTentativasPermitidas = this.getSistemaParametro().getNumeroMaximoLoginFalho();
if (numeroTentativas == null) {
numeroTentativas = new Integer(0);
sessao.setAttribute("numeroTentativas", numeroTentativas);
}
// Recupera o login do usu�rio da sess�o
String loginUsuarioSessao = (String) sessao.getAttribute("loginUsuarioSessao");
// Caso seja a primeira vez que o usu�rio esteja logando
// joga o login do usu�rio na sess�o
if (loginUsuarioSessao == null) {
loginUsuarioSessao = login;
sessao.setAttribute("loginUsuarioSessao",loginUsuarioSessao);
}
// Caso o usu�rio n�o esteja cadastrado, manda o erro para a
// p�gina de login
if (usuarioLogado == null) {
this.reportarErros(httpServletRequest,"atencao.usuario.inexistente");
retorno = actionMapping.findForward("telaLogin");
/*
* Caso o login informado seja igual ao que est� na sess�o
* incrementa o n� de tentativas e joga esse n� na sess�o
* verifica se o n� de tentativas � maior que a permitida se
* for bloqueia a senha do usu�rio e indica o erro na p�gina
* de login
*/
if (loginUsuarioSessao.equals(login)) {
numeroTentativas = numeroTentativas + 1;
sessao.setAttribute("numeroTentativas",numeroTentativas);
// [FS0005] - Verificar n�mero de tentativas de acesso
if (numeroTentativas.intValue() > numeroTentativasPermitidas.intValue()) {
this.bloquearSenha(login);
this.reportarErros(httpServletRequest,"atencao.usuario.senha.bloqueada");
retorno = actionMapping.findForward("telaLogin");
}
} else {
//Zera o n� de tentativas de acesso e joga o login do usu�rio na sess�o
numeroTentativas = 0;
sessao.setAttribute("loginUsuarioSessao", login);
}
} else {
// [FS0002] - Verificar situa��o do usu�rio
if (!this.verificarSituacaoUsuario(usuarioLogado)) {
if (usuarioLogado.getUsuarioSituacao().getId().equals(UsuarioSituacao.INATIVO)) {
throw new ActionServletException("atencao.usuario_invalido", null, usuarioLogado.getLogin());
} else {
this.reportarErrosMensagem( httpServletRequest, "atencao.usuario.situacao.invalida",login+ " est� com situa��o correspondente a "+ usuarioLogado.getUsuarioSituacao().getDescricaoAbreviada());
retorno = actionMapping.findForward("telaLogin");
}
}
//[SB0005] Efetuar Controle de Altera��o de Senha
boolean disponibilizarAlteracaoSenha = false;
Date dataExpiracaoAcesso = usuarioLogado.getDataExpiracaoAcesso();
UsuarioSituacao usuarioSituacao = usuarioLogado.getUsuarioSituacao();
//Caso a data de expira��o de acesso esteja preenchida e seja menor
//que a data atual disponibiliza a tela de altera��o de senha
if (dataExpiracaoAcesso != null) {
if (dataExpiracaoAcesso.before(new Date())) {
disponibilizarAlteracaoSenha = true;
}
}
//Caso a situa��o da senha do usu�rio seja igual a "pendente"
//disponibiliza a tela de altera��o de senha
if (usuarioSituacao.getId().equals(UsuarioSituacao.PENDENTE_SENHA)) {
disponibilizarAlteracaoSenha = true;
}
//Caso a flag de disponibilizar altera��o de senha esteja "true"
//seta o mapeamento para a tela de alterar senha
sessao.setAttribute("usuarioLogado", usuarioLogado);
if (disponibilizarAlteracaoSenha) {
retorno = actionMapping.findForward("alterarSenha");
}
Fachada.getInstancia().montarMenuUsuario(sessao, httpServletRequest.getRemoteAddr());
}
}
}
}else{
Usuario usuarioLogado = (Usuario) this.getSessao(httpServletRequest).getAttribute("usuarioLogado");
//C�digo para remover a mensagem de "Alerta de RA Urgente" quando usuario pressionar OK
this.getFachada().atualizarUsuarioVisualizacaoRaUrgencia(null,null, usuarioLogado.getId(),null,1);
this.getSessao(httpServletRequest).setAttribute("RAUrgencia", "false");
}
verificarLocaleInternacionalizacao(httpServletRequest);
return retorno;
}
private void verificarLocaleInternacionalizacao(HttpServletRequest httpServletRequest){
Locale localeStruts =
(Locale)httpServletRequest.getSession(false).getAttribute(Globals.LOCALE_KEY);
if(Internacionalizador.getLocale() == null ||
!Internacionalizador.getLocale().equals(localeStruts)){
Internacionalizador.setLocale(localeStruts);
}
}
/**
* Verifica se o login informado existe para algum usu�rio do sistema
* retorna true se existir caso contr�rio retorna false.
*
* [UC0287] - Verificar exist�ncia do login
*
* @author Pedro Alexandre
* @date 06/07/2006
*
* @param login
* @return
*/
private boolean verificarExistenciaLogin(String login) {
// Inicializa o retorno para falso(login n�o existe)
boolean retorno = false;
// Cria o filtro e pesquisa o usu�rio com o login informado
FiltroUsuario filtroUsuario = new FiltroUsuario();
filtroUsuario.adicionarParametro(new ParametroSimples(
FiltroUsuario.LOGIN, login));
Collection usuarios = Fachada.getInstancia().pesquisar(filtroUsuario,
Usuario.class.getName());
// Caso exista o usu�rio com o login informado
// seta o retorno para verdadeiro(login existe no sistema)
if (usuarios != null && !usuarios.isEmpty()) {
retorno = true;
}
// Retorna um indicador se o login informado existe ou n�o no sistema
return retorno;
}
/**
* Met�do que verifica se a situa��o do usu�rio � diferente de ativo ou se �
* igual a senha pendente.Caso seja uma ou outra situa��o levanta uma
* exce��o para o usu�rio indicando que o usu�rio n�o pode se logar ao
* sistema.
*
* [FS0002] - Verificar situa��o do usu�rio
*
* @author Pedro Alexandre
* @date 06/07/2006
*
* @param usuarioLogado
* @return
*/
private boolean verificarSituacaoUsuario(Usuario usuarioLogado) {
boolean retorno = true;
// Recupera a situa��o do usu�rio
UsuarioSituacao usuarioSituacao = usuarioLogado.getUsuarioSituacao();
/*
* Caso a situa��o do usu�rio n�o seja igual a ativo ou seja igual a
* pendente retorna uma flag indicando que o usu�rio n�o pode acessar o
* sistema
*/
if ((!usuarioSituacao.getId().equals(UsuarioSituacao.ATIVO))
&& (!usuarioSituacao.getId().equals(
UsuarioSituacao.PENDENTE_SENHA))) {
retorno = false;
}
// Retorna uma flag indicando se a situ��o do usu�rio permite o acesso
// ao sistema
return retorno;
}
/**
* Bloqueia a senha do usu�rio depois de o n�meros de tentativas de acesso
* exceder o n�mero m�ximo de tentativas permitidas
*
* [FS0005] - Verificar n�mero de tentativas de acesso
*
* @author Pedro Alexandre
* @date 06/07/2006
*
* @param usuarioLogado
*/
private void bloquearSenha(String login) {
// Pesquisa o us�rio que vai ser bloqueada sua senha
FiltroUsuario filtroUsuario = new FiltroUsuario();
filtroUsuario.adicionarParametro(new ParametroSimples(
FiltroUsuario.LOGIN, login));
Collection usuarios = Fachada.getInstancia().pesquisar(filtroUsuario,
Usuario.class.getName());
// Caso encontre o usu�rio com o login informado
if (usuarios != null && !usuarios.isEmpty()) {
// Recupera o usu�rio
Usuario usuarioLogado = (Usuario) usuarios.iterator().next();
// Atualiza a situa��o do usu�rio para bloqueada
UsuarioSituacao usuarioSituacao = new UsuarioSituacao();
usuarioSituacao.setId(UsuarioSituacao.SENHA_BLOQUEADA);
// Recupera o n� de vezes que o usu�rio foi bloqueado
Short bloqueioAcesso = usuarioLogado.getBloqueioAcesso();
/*
* Caso o usu�rio nunca tenha sido bloqueado seta o n� de bloqueios
* para 1(um) caso contr�rio incrementa o valor do n� de bloqueio do
* usu�rio
*/
if (bloqueioAcesso == null) {
usuarioLogado.setBloqueioAcesso(new Short("1"));
} else {
usuarioLogado.setBloqueioAcesso((new Integer(usuarioLogado
.getBloqueioAcesso() + 1)).shortValue());
}
// Atualiza os dados do usu�rio
usuarioLogado.setUsuarioSituacao(usuarioSituacao);
usuarioLogado.setUltimaAlteracao(new Date());
Fachada.getInstancia().atualizar(usuarioLogado);
}
}
}