/* * Sistema de Ouvidoria: um canal através do qual os usuários * podem encaminhar suas reclamações, elogios e sugestões. * * Copyright (C) 2011 SERPRO * * Este programa é software livre; você pode redistribuí-lo e/ou * modificá-lo sob os termos da Licença Pública Geral GNU, conforme * publicada pela Free Software Foundation; tanto a versão 2 da * Licença como (a seu critério) qualquer versão mais nova. * * Este programa é distribuído na expectativa de ser útil, mas SEM * QUALQUER GARANTIA; sem mesmo a garantia implícita de * COMERCIALIZAÇÃO ou de ADEQUAÇÃO A QUALQUER PROPÓSITO EM * PARTICULAR. Consulte a Licença Pública Geral GNU para obter mais * detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral GNU, * sob o título "LICENCA.txt", junto com esse programa. Se não, * acesse o Portal do Software Público Brasileiro no endereço * http://www.softwarepublico.gov.br/ ou escreva para a Fundação do * Software Livre (FSF) Inc., 51 Franklin St, Fifth Floor, Boston, * MA 02111-1301, USA. * * Contatos através do seguinte endereço internet: * http://www.serpro.gov.br/sistemaouvidoria/ */ package br.gov.serpro.ouvidoria.struts; import java.io.IOException; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; import org.apache.struts.action.Action; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.RequestProcessor; import org.quartz.SchedulerException; import br.gov.serpro.ouvidoria.agendador.OuvidoriaScheduler; import br.gov.serpro.ouvidoria.bean.LayoutBean; import br.gov.serpro.ouvidoria.bean.OrgaoDto; import br.gov.serpro.ouvidoria.controller.ControleAcessoCtrl; import br.gov.serpro.ouvidoria.controller.gerencial.administracao.FuncionarioCtrl; import br.gov.serpro.ouvidoria.controller.gerencial.administracao.OrgaoCtrl; import br.gov.serpro.ouvidoria.dao.DaoException; import br.gov.serpro.ouvidoria.dao.DaoFactory; import br.gov.serpro.ouvidoria.dao.hibernate.HibernateDaoFactory; import br.gov.serpro.ouvidoria.model.ConfiguracoesOrgao; import br.gov.serpro.ouvidoria.model.Funcionario; import br.gov.serpro.ouvidoria.model.Orgao; import br.gov.serpro.ouvidoria.util.Constants; /** * * @author SERPRO * @version $Revision: 1.1.2.4 $, $Date: 2011/10/20 15:30:34 $ * @version 0.1, Date: 11/11/2004 */ public class CustomRequestProcessor extends RequestProcessor { protected final DaoFactory daoFactory = new HibernateDaoFactory(); protected Logger log = null; public void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { Orgao orgao = null; OrgaoCtrl orgaoCtrl = new OrgaoCtrl(daoFactory); // Instancia a sessao HttpSession session = request.getSession(true); boolean flagPesquisa = false; // se houverem dados de pesquisa na sessao entao starta o flag if (session.getAttribute("possuiPesquisa") != null) { if (session.getAttribute("possuiPesquisa").equals("sim")) { flagPesquisa = true; } } if (flagPesquisa) { int caminho = 0; // qq um desses links preservam os dados da sessao if ((request.getServletPath() .equals("/andamento/ExibeMsgPorRespons.do")) || (request.getServletPath() .equals("/andamento/ConsultaSolucoes.do")) || (request.getServletPath() .equals("/andamento/ConsultarBancoScriptsMsg.do")) || (request.getServletPath() .equals("/andamento/RedirecionarMensagem.do")) || (request.getServletPath() .equals("/andamento/ReclassificarMensagem.do")) || (request.getServletPath() .equals("/andamento/ConfirmaResposta.do")) || (request.getServletPath() .equals("/andamento/RespondeAcionamento.do")) || (request.getServletPath() .equals("/andamento/ConsultaMsgPorRespons.do")) || (request.getServletPath() .equals("/andamento/SalvaRascunhoResp.do")) || (request.getServletPath() .equals("/andamento/ListaMsgPorRespons.do")) || (request.getServletPath() .equals("/andamento/ConfirmaRedirecionarMensagem.do")) ) { caminho = 1; } switch (caminho) { case 0: // caso saia da tela, então a sessao é limpa limpaSessao(request, session); break; case 1: break; } } // obter o ID da sessão String orgaoSessionId = request.getParameter(Constants.ID_SESSAO_ORGAO); if (orgaoSessionId == null) { // verificar se a sessão expirou if (request.getSession() == null) { doForward(Constants.LOGIN_EXPIRED_ACTION, request, response); return; } // tentar obter o ID do atributo correspondente na sessão orgaoSessionId = (String) request.getSession().getAttribute( Constants.ID_SESSAO_ORGAO); // se não achou o ID no atributo da sessão, procurar pelo cookie if (orgaoSessionId == null) { Cookie[] cookies = request.getCookies(); for (int i = 0; (cookies != null && i < cookies.length); i++) { Cookie cookie = cookies[i]; if (cookie.getName().equals(Constants.ID_SESSAO_ORGAO)) { orgaoSessionId = cookie.getValue(); } } } } // se não obteve o ID, redirecionar o usuário para página adequada if (orgaoSessionId == null) { doForward(Constants.NOT_FOUND_PAGE, request, response); return; } // obter o órgão orgao = orgaoCtrl.get(orgaoSessionId); if (orgao == null) { doForward(Constants.NOT_FOUND_PAGE, request, response); return; } /* adiciono o sessionId na sessão */ HttpSession ses = request.getSession(true); ses.setAttribute(Constants.ID_SESSAO_ORGAO, orgaoSessionId); ses.setAttribute("_ORGAO_", new OrgaoDto(orgao)); /* adiciono um cookie com o id do orgão */ if (orgaoSessionId != null) { Cookie cookie = new Cookie(Constants.ID_SESSAO_ORGAO, orgaoSessionId); cookie.setPath("/"); response.addCookie(cookie); } /* * adiciono um cookie com um identificador único para verificação do * timeout da sessão */ if (request.getSession().getAttribute(Constants.PA_FUNCIONARIO) != null) { Cookie cookie = new Cookie(Constants.PA_EXPIRE, String .valueOf(System.currentTimeMillis())); cookie.setPath("/"); response.addCookie(cookie); } /* adiciono o layout à sessão */ setOrgaoLayout(request, orgao); try { ConfiguracoesOrgao configuracaoes = orgao.getConfiguracoes(); request.setAttribute("configuracoes", configuracaoes); if (configuracaoes.getNotificacaoEmail() != null && configuracaoes.getNotificacaoEmail().equals("S")) { if ((OuvidoriaScheduler.sched == null) || (OuvidoriaScheduler.sched != null && !OuvidoriaScheduler.sched .isStarted())) { OuvidoriaScheduler.init(request); } } } catch (SchedulerException se) { se.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } super.process(request, response); } /** * @param request * @param orgao */ private void setOrgaoLayout(HttpServletRequest request, Orgao orgao) { LayoutBean layoutBean = (LayoutBean) request.getSession().getAttribute( Constants.SS_LAYOUT); if (layoutBean == null) { layoutBean = new LayoutBean(); } layoutBean.setDiretorioOrgao(orgao.getConfiguracoes() .getNomeDiretorioOrgao()); layoutBean.setEsquemaCores("estilos/".concat(orgao.getConfiguracoes() .getEsquemaCoresLayout())); layoutBean.setCorCabecalhoBanner(orgao.getConfiguracoes() .getCorCabecalhoBanner()); layoutBean.setCorCabecalhoLogo(orgao.getConfiguracoes() .getCorCabecalhoLogo()); layoutBean.setImagem3("/" + orgao.getConfiguracoes().getNomeDiretorioOrgao() + "/images/" + orgao.getConfiguracoes().getImagem3()); layoutBean.setImagem4("/" + orgao.getConfiguracoes().getNomeDiretorioOrgao() + "/images/" + orgao.getConfiguracoes().getImagem4()); layoutBean.setImagem5("/" + orgao.getConfiguracoes().getNomeDiretorioOrgao() + "/images/" + orgao.getConfiguracoes().getImagem5()); layoutBean.setImagemBanner("/" + orgao.getConfiguracoes().getNomeDiretorioOrgao() + "/images/" + orgao.getConfiguracoes().getImagemBanner()); layoutBean.setImagemLogo("/" + orgao.getConfiguracoes().getNomeDiretorioOrgao() + "/images/" + orgao.getConfiguracoes().getImagemLogo()); layoutBean.setDescricaoImagem3(orgao.getConfiguracoes() .getDescricaoImagem3()); layoutBean.setDescricaoImagem4(orgao.getConfiguracoes() .getDescricaoImagem4()); layoutBean.setDescricaoImagem5(orgao.getConfiguracoes() .getDescricaoImagem5()); layoutBean.setDescricaoImagemBanner(orgao.getConfiguracoes() .getDescricaoImagemBanner()); layoutBean.setDescricaoImagemLogo(orgao.getConfiguracoes() .getDescricaoImagemLogo()); layoutBean.setLinkImagem3(orgao.getConfiguracoes().getLinkImagem3()); layoutBean.setLinkImagem4(orgao.getConfiguracoes().getLinkImagem4()); layoutBean.setLinkImagem5(orgao.getConfiguracoes().getLinkImagem5()); layoutBean.setLinkImagemBanner(orgao.getConfiguracoes() .getLinkImagemBanner()); layoutBean.setLinkImagemLogo(orgao.getConfiguracoes() .getLinkImagemLogo()); layoutBean.setNomeExibicaoOrgao(orgao.getConfiguracoes() .getNomeExibicaoOrgao()); request.getSession().setAttribute(Constants.SS_LAYOUT, layoutBean); } /** * @param request * @param session */ private void limpaSessao(HttpServletRequest request, HttpSession session) { session.removeAttribute("chkpend"); session.removeAttribute("chkand"); session.removeAttribute("chkatraso"); session.removeAttribute("chkcritico"); session.removeAttribute("txtDatIni"); session.removeAttribute("txtDatFim"); session.removeAttribute("txtTipoMsg"); session.removeAttribute("txtAssunto"); session.removeAttribute("txtTitulo"); session.removeAttribute("ordenacao"); session.removeAttribute("txtProtocolo"); session.removeAttribute("possuiPesquisa"); } protected boolean processRoles(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws IOException, ServletException { String role = null; ArrayList regras = new ArrayList(); /* * Trecho responsável por pegar as regras de acesso definidas no Struts * Este tratamento foi feito para permitir/restringir acesso a mais de * uma opção por url. No caso Reclassificar Assunto e Mensagem através * da url reclassificar */ if (mapping.getRoles() != null) { String[] roles = mapping.getRoles().split(","); for (int cont = 0; cont < roles.length; cont++) { try { new Long(roles[cont]); } catch (Exception e) { e.printStackTrace(); throw new ServletException( "Código de regra de acesso inválido."); } regras.add(roles[cont]); role = (String) regras.get(0);// Pega a primeira regra(role) } } OrgaoCtrl orgaoCtrl = new OrgaoCtrl(daoFactory); /* Não existe bloqueio para esta acão */ if (role == null || role.trim().length() == 0) { return true; } request.setAttribute(Constants.SR_FUNCIONALIDADE, role); /*Coloca a funcionalidade na sessão para * ser recuperada na tela de ajuda */ request.getSession().setAttribute(Constants.SR_FUNCIONALIDADE, role); ControleAcessoCtrl controleAcessoCtrl = new ControleAcessoCtrl( daoFactory); Orgao orgao = orgaoCtrl.get((String) request.getSession().getAttribute( Constants.ID_SESSAO_ORGAO)); /* verifico a vigência do órgão para acionamento e consulta resposta */ String redirect = null; int vigenciaOrgao = controleAcessoCtrl.verificaVigenciaOrgao(orgao, role); switch (vigenciaOrgao) { case ControleAcessoCtrl.VG_FORA_PERIODO_ACIONAMENTO: redirect = Constants.CAD_ACNMNT_FORA_VIGENCIA_PAGE; break; case ControleAcessoCtrl.VG_FORA_PERIODO_CONSULTA_RESPOSTA: redirect = Constants.CON_RESPTA_FORA_VIGENCIA_PAGE; break; case ControleAcessoCtrl.VG_FORA_PERIODO_OPERACAO: redirect = Constants.CAD_OPERACAO_FORA_VIGENCIA_PAGE; break; default: // DO NOTHING } if (redirect != null) { controleAcessoCtrl = null; /* retiro o controle do struts */ doForward(redirect, request, response); return false; } /* verifico o acesso do funcionario ao sistema */ int possuiAcesso = ControleAcessoCtrl.CA_NECESSARIO_LOGIN; try { Long funcionarioId = (Long) request.getSession().getAttribute( Constants.PA_FUNCIONARIO); FuncionarioCtrl funcionarioCtrl = new FuncionarioCtrl(daoFactory); Funcionario funcionario = (Funcionario) funcionarioCtrl .get(funcionarioId); possuiAcesso = controleAcessoCtrl.permiteAcesso(orgao, funcionario, regras); } catch (DaoException e) { System.out.println(e.getMessage()); e.printStackTrace(); throw new ServletException(e); } redirect = Constants.LOGIN_ACTION; switch (possuiAcesso) { case ControleAcessoCtrl.CA_ACESSO_PERMITIDO: request.getSession().setAttribute(Constants.SR_FUNCIONALIDADES, regras); return true; case ControleAcessoCtrl.CA_ACESSO_NEGADO: redirect = Constants.DENIED_ACCESS_ACTION; break; case ControleAcessoCtrl.CA_NECESSARIO_LOGIN: redirect = Constants.LOGIN_ACTION; break; case ControleAcessoCtrl.VG_FORA_PERIODO_OPERACAO: redirect = Constants.CAD_OPERACAO_FORA_VIGENCIA_PAGE; break; default: redirect = Constants.LOGIN_ACTION; } controleAcessoCtrl = null; /* retiro o funcionario da sessão */ request.getSession().removeAttribute(Constants.PA_FUNCIONARIO); /* retiro o controle do struts */ doForward(redirect, request, response); return false; } protected Action processActionCreate(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws IOException { Action instance = super.processActionCreate(request, response, mapping); if (instance instanceof Support) { ((Support) instance).setDaoFactory(daoFactory); } return (instance); } protected Logger getLog() { if (this.log == null) { this.log = Logger .getLogger("<------ Processador de Requisições ------> "); } return this.log; } }