package br.com.dextra.dextranet.seguranca;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import br.com.dextra.dextranet.persistencia.EntidadeNaoEncontradaException;
import br.com.dextra.dextranet.usuario.Usuario;
import br.com.dextra.dextranet.usuario.UsuarioRepository;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
public class AutenticacaoFilter implements Filter {
protected String excludePatterns = "";
private UsuarioRepository usuarioRepositorio = new UsuarioRepository();
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
UserService userService = UserServiceFactory.getUserService();
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpServletRequest httpRequest = (HttpServletRequest) request;
String thisURI = httpRequest.getRequestURI();
User usuarioLogado = userService.getCurrentUser();
Usuario usuario = null;
if (usuarioLogado != null) {
usuario = verificarAcessoNaPrimeiraPagina(thisURI, usuarioLogado);
redirecionaUsuario(httpRequest, httpResponse, filterChain, usuario);
} else if (urlDeveSerIgnorada(thisURI)) {
filterChain.doFilter(httpRequest, httpResponse);
} else {
String loginUrl = userService.createLoginURL(thisURI);
httpResponse.sendRedirect(loginUrl);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.excludePatterns = filterConfig.getInitParameter("excludePatterns");
}
@Override
public void destroy() {
}
protected boolean urlDeveSerIgnorada(String thisURI) {
String[] urlsIgnorar = excludePatterns.split(";");
for (String url : urlsIgnorar) {
if (thisURI.contains(url)) {
return true;
}
}
return false;
}
private Usuario verificaExistenciaDoUsuarioLogado(User usuarioLogado) {
String username = usuarioLogado.getNickname();
try {
return usuarioRepositorio.obtemPorUsername(username);
} catch (EntidadeNaoEncontradaException e) {
return usuarioRepositorio.persiste(new Usuario(username));
}
}
private void redirecionaUsuario(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain, Usuario usuario)
throws IOException, ServletException {
if (usuario.isAtivo() == null || usuario.isAtivo()) {
filterChain.doFilter(request, response);
} else {
response.sendRedirect("/403.html");
}
}
private Usuario verificarAcessoNaPrimeiraPagina(String thisURI, User usuarioLogado) {
Usuario usuario;
if (acessoNaPaginaPrincipal(thisURI)) {
usuario = this.verificaExistenciaDoUsuarioLogado(usuarioLogado);
} else {
usuario = usuarioRepositorio.obtemPorUsername(usuarioLogado.getNickname());
}
return usuario;
}
private boolean acessoNaPaginaPrincipal(String thisURI) {
return "/index.html".equals(thisURI) || "/".equals(thisURI);
}
}