/** * Copyright (c) 2009-2014 Câmara dos Deputados. Todos os direitos reservados. * * e-Democracia é um software livre; você pode redistribuí-lo e/ou modificá-lo dentro * dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do * Software Livre (FSF); na versão 2.1 da Licença, ou (na sua opinião) qualquer versão. * * Este programa é distribuído na esperança de que possa ser útil, mas SEM NENHUMA GARANTIA; * sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. * Veja a Licença Pública Geral Menor GNU para maiores detalhes. */ package br.gov.camara.edemocracia.portlets.cadastrousuarios.beans; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; import javax.faces.context.FacesContext; import javax.faces.model.SelectItem; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.PortletRequest; import javax.portlet.PortletSession; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import br.gov.camara.edemocracia.portlets.libs.Biblioteca; import br.gov.camara.edemocracia.portlets.libs.Validacao; import com.liferay.counter.service.CounterLocalServiceUtil; import com.liferay.faces.portal.context.LiferayFacesContext; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.servlet.SessionErrors; import com.liferay.portal.kernel.struts.LastPath; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.MethodKey; import com.liferay.portal.kernel.util.PortalClassInvoker; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.model.Address; import com.liferay.portal.model.CompanyConstants; import com.liferay.portal.model.Contact; import com.liferay.portal.model.Region; import com.liferay.portal.model.User; import com.liferay.portal.security.auth.AuthException; import com.liferay.portal.service.AddressLocalServiceUtil; import com.liferay.portal.service.CountryServiceUtil; import com.liferay.portal.service.RegionServiceUtil; import com.liferay.portal.service.ServiceContext; import com.liferay.portal.service.ServiceContextFactory; import com.liferay.portal.service.UserServiceUtil; import com.liferay.portal.service.persistence.AddressUtil; import com.liferay.portal.util.PortalUtil; import com.liferay.portlet.announcements.model.AnnouncementsDelivery; import com.liferay.portlet.announcements.service.AnnouncementsDeliveryLocalServiceUtil; import com.liferay.portlet.announcements.service.persistence.AnnouncementsDeliveryUtil; /** * @author p_7339 * */ @ManagedBean(name = "cadastro") @RequestScoped public class CadastroBean { private String nome; private String email; // Confirmação do e-mail private String email2; private String senha; // Confirmação da senha do usuário private String senha2; private Long uf; private boolean aceiteTermosUso; private String captchaText; private boolean cadastroCompleto; private static final Log _log = LogFactoryUtil.getLog(CadastroBean.class); private static final String tokenDadosDoForm = "DADOS_FORM_SUPPORT"; private static final String tokenCadastroCompleto = "C_C"; private static final String NAMESPACE_SERVLET_REQUEST_FQCN = "com.liferay.portal.servlet.NamespaceServletRequest"; @PostConstruct private void init() { carregarERemoverDadosDoFormDaSessao(); verificarSeCadastroCompleto(); } public void cadastrar() { LiferayFacesContext facesContext = LiferayFacesContext.getInstance(); long companyId = facesContext.getCompanyId(); Validacao validacao = Biblioteca.validarCampos(companyId, nome, email, email2, senha, senha2, aceiteTermosUso, uf, captchaText); boolean dadosValidos = validacao.getValidar(); boolean cadastradoComSucesso = false; if (dadosValidos) { cadastrarUsuario(); cadastradoComSucesso = true; } else { // Adicionando as mensagens de erro de validação for (String msg : validacao.getMensagem()) { adicionarMensagemDeErro(msg); } salvarDadosDoFormNaSessao(); } redirecionarParaURLDeOrigemViaHTTP(cadastradoComSucesso); } private void redirecionarParaURLDeOrigemViaHTTP(boolean cadastradoComSucesso) { try { LiferayFacesContext facesContext = LiferayFacesContext.getInstance(); String layoutURL = PortalUtil.getLayoutURL(facesContext.getThemeDisplay()); String portalURL = facesContext.getThemeDisplay().getPortalURL(); // Para ambiente local usar esse redirect... // final String defaultLocalRedirectURL = portalURL + layoutURL; // Para ambiente de produção usar este redirect... final String defaultProductionRedirectURL = layoutURL; String defaultRedirect = defaultProductionRedirectURL; String redirect = StringPool.BLANK; if (isLastPathEnabled() && cadastradoComSucesso) { String lastPath = getLastPath(); if (lastPath != null) { boolean autenticado = tentarAutenticar(); if (autenticado) { redirect = portalURL + lastPath; } else { redirect = defaultRedirect; } } else { redirect = defaultRedirect; } } else { redirect = defaultRedirect + "?saveLastPath=0"; } limparDadosDoBean(); facesContext.getExternalContext().redirect(redirect); } catch (SystemException e) { _log.error("Erro ao redirecionar para HTTP", e); adicionarMensagemDeErro("falha-redirecionamento"); } catch (IOException e) { _log.error("Erro ao redirecionar para HTTP", e); adicionarMensagemDeErro("falha-redirecionamento"); } catch (PortalException e) { _log.error("Erro ao redirecionar para HTTP", e); adicionarMensagemDeErro("falha-redirecionamento"); } } private boolean tentarAutenticar() { MethodKey method = new MethodKey("com.liferay.portlet.login.util.LoginUtil", "login", new Class[] { HttpServletRequest.class, HttpServletResponse.class, String.class, String.class, boolean.class, String.class }); ActionRequest request = (ActionRequest) LiferayFacesContext.getInstance().getPortletRequest(); ActionResponse response = (ActionResponse) LiferayFacesContext.getInstance().getPortletResponse(); HttpServletRequest httpServletRequest = getHttpServletRequest(request); try { PortalClassInvoker.invoke(false, method, httpServletRequest, PortalUtil.getHttpServletResponse(response), email, senha, false, CompanyConstants.AUTH_TYPE_EA); PortletSession session = request.getPortletSession(false); if (session != null) session.removeAttribute("email"); return true; } catch (Exception e) { if (e instanceof AuthException) { Throwable cause = e.getCause(); if (cause != null) SessionErrors.add(request, cause.getClass()); else SessionErrors.add(request, e.getClass()); } else { SessionErrors.add(request, e.getClass()); } return false; } } private String getLastPath() { PortletRequest request = LiferayFacesContext.getInstance().getPortletRequest(); LastPath lp = getLastPath(request); if (lp != null) { return lp.getContextPath() + lp.getPath(); } else { return null; } } private LastPath getLastPath(PortletRequest request) { HttpServletRequest httpServletRequest = getHttpServletRequest(request); return (LastPath) httpServletRequest.getSession().getAttribute("LAST_PATH"); } private boolean isLastPathEnabled() { String saveLastPath = PropsUtil.get(PropsKeys.AUTH_FORWARD_BY_LAST_PATH); return saveLastPath != null ? Boolean.parseBoolean(saveLastPath) : false; } public HttpServletRequest getHttpServletRequest(PortletRequest portletRequest) { HttpServletRequest httpServletRequest = PortalUtil.getHttpServletRequest(portletRequest); // If the request object is a wrapper that handles special namespacing considerations for portlet session // attributes, then get the inner-most wrapped request. This will ensure that the following call to // LoginUtil.login(...) will be able to work with a session that has an attribute map shared by the portal. if (httpServletRequest.getClass().getName().equals(NAMESPACE_SERVLET_REQUEST_FQCN)) { while (httpServletRequest instanceof HttpServletRequestWrapper) { HttpServletRequestWrapper httpServletRequestWrapper = (HttpServletRequestWrapper) httpServletRequest; httpServletRequest = (HttpServletRequest) httpServletRequestWrapper.getRequest(); } } return httpServletRequest; } private void cadastrarUsuario() { LiferayFacesContext facesContext = LiferayFacesContext.getInstance(); String primeiroNome = Biblioteca.retornaPrimeiro(nome); String meioNome = Biblioteca.retornaMeio(nome); String ultimoNome = Biblioteca.retornaUltima(nome); User user; long companyId = facesContext.getCompanyId(); try { ServiceContext serviceContext = ServiceContextFactory.getInstance(User.class.getName(), facesContext.getPortletRequest()); user = UserServiceUtil.addUser(companyId, false, senha, senha, true, null, email, 0, "", LocaleUtil.getDefault(), primeiroNome, meioNome, ultimoNome, 0, 0, true, 1, 1, 1970, "", null, null, null, null, false, serviceContext); criarEnderecoParaUsuario(companyId, user); // inclusão de email para anúncios e alertas. String[] listaAnuncios = PropsUtil.getArray(PropsKeys.ANNOUNCEMENTS_ENTRY_TYPES); List<String> lista = new ArrayList<String>(); for (String cont : listaAnuncios) { if (!lista.contains(cont)) lista.add(cont); } for (String anuncioValor : lista) { AnnouncementsDelivery announcementsDelivery = AnnouncementsDeliveryUtil.create(CounterLocalServiceUtil.increment(AnnouncementsDelivery.class .getName())); announcementsDelivery.setCompanyId(companyId); announcementsDelivery.setUserId(user.getUserId()); announcementsDelivery.setType(anuncioValor); announcementsDelivery.setEmail(true); AnnouncementsDeliveryLocalServiceUtil.addAnnouncementsDelivery(announcementsDelivery); } // Envia o e-mail para a mudança de senha LiferayCadastroUtil.enviaEmailDescadastrar(user, companyId, email, serviceContext); // limparDadosDoBean(); adicionarMensagemDeSucesso("cadastro-sucesso"); getSessionMap().put(tokenCadastroCompleto, true); } catch (PortalException e) { _log.error("Erro ao cadastrar usuário", e); adicionarMensagemDeErro("cadastro-falha"); } catch (SystemException e) { _log.error("Erro ao cadastrar usuário", e); adicionarMensagemDeErro("cadastro-falha"); } } private Address criarEnderecoParaUsuario(Long companyId, User usuario) throws SystemException { Address address = AddressUtil.create(CounterLocalServiceUtil.increment(Address.class.getName())); address.setCompanyId(companyId); address.setCity("-"); address.setStreet1("-"); address.setZip("-"); address.setPrimary(true); address.setMailing(false); address.setCountryId(48); address.setRegionId(uf); address.setUserId(usuario.getUserId()); address.setUserName(usuario.getFullName()); address.setCreateDate(new Date()); address.setModifiedDate(new Date()); address.setTypeId(11000); // Relacionamento com o contato address.setClassPK(usuario.getContactId()); address.setClassNameId(PortalUtil.getClassNameId(Contact.class.getName())); return AddressLocalServiceUtil.addAddress(address); } public List<SelectItem> getUfs() { ArrayList<SelectItem> retorno = new ArrayList<SelectItem>(); try { long brasilId = CountryServiceUtil.getCountryByA2("BR").getCountryId(); List<Region> regioes = RegionServiceUtil.getRegions(brasilId); for (Region regiao : regioes) { retorno.add(new SelectItem(regiao.getRegionId(), regiao.getName())); } } catch (PortalException e) { _log.error("Erro ao obter regiões", e); } catch (SystemException e) { throw new RuntimeException(e); } return retorno; } private void limparDadosDoBean() { nome = ""; email = ""; email2 = ""; senha = ""; senha2 = ""; captchaText = ""; aceiteTermosUso = false; uf = null; } /** * Este método foi necessário devido a perda dos dados preenchidos pelo * usuário ao fazer o redirect de volta para http */ private void salvarDadosDoFormNaSessao() { Map<String, String> dados = new HashMap<String, String>(); dados.put("nome", nome); dados.put("email", email); dados.put("email2", email2); dados.put("uf", uf != null ? uf.toString() : null); dados.put("termosDeUso", Boolean.toString(aceiteTermosUso)); getSessionMap().put(tokenDadosDoForm, dados); } private void carregarERemoverDadosDoFormDaSessao() { @SuppressWarnings("unchecked") Map<String, String> dados = (Map<String, String>) getSessionMap().remove(tokenDadosDoForm); if (dados != null && !dados.isEmpty()) { this.nome = dados.get("nome"); this.email = dados.get("email"); this.email2 = dados.get("email2"); this.aceiteTermosUso = Boolean.valueOf(dados.get("termosDeUso")); String uf = dados.get("uf"); if (uf != null) { this.uf = Long.parseLong(uf); } } } private void verificarSeCadastroCompleto() { Object object = getSessionMap().remove(tokenCadastroCompleto); if (object != null) { cadastroCompleto = Boolean.parseBoolean(object.toString()); } } private void adicionarMensagemDeErro(String key) { LiferayFacesContext facesContext = LiferayFacesContext.getInstance(); facesContext.addGlobalErrorMessage(LanguageUtil.get(facesContext.getPortletConfig(), facesContext.getLocale(), key)); } private void adicionarMensagemDeSucesso(String key) { LiferayFacesContext facesContext = LiferayFacesContext.getInstance(); facesContext.addGlobalInfoMessage(LanguageUtil.get(facesContext.getPortletConfig(), facesContext.getLocale(), key)); } private Map<String, Object> getSessionMap() { return FacesContext.getCurrentInstance().getExternalContext().getSessionMap(); } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getEmail2() { return email2; } public void setEmail2(String email2) { this.email2 = email2; } public String getSenha() { return senha; } public void setSenha(String senha) { this.senha = senha; } public String getSenha2() { return senha2; } public void setSenha2(String senha2) { this.senha2 = senha2; } public Long getUf() { return uf; } public void setUf(Long uf) { this.uf = uf; } public String getCaptchaText() { return captchaText; } public void setCaptchaText(String captchaText) { this.captchaText = captchaText; } public boolean isAceiteTermosUso() { return aceiteTermosUso; } public void setAceiteTermosUso(boolean aceiteTermosUso) { this.aceiteTermosUso = aceiteTermosUso; } public boolean isCadastroCompleto() { return cadastroCompleto; } }