/** * 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.Date; import java.util.List; import javax.faces.context.FacesContext; import javax.mail.internet.InternetAddress; import javax.portlet.PortletRequest; import javax.portlet.PortletSession; import javax.portlet.PortletURL; import com.liferay.faces.portal.context.LiferayFacesContext; import br.gov.camara.edemocracia.util.ClassPathResourceUtil; import br.gov.camara.edemocracia.util.UrlRewriterUtil; import com.liferay.mail.service.MailServiceUtil; import com.liferay.portal.NoSuchLayoutException; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.mail.MailMessage; import com.liferay.portal.kernel.struts.LastPath; import com.liferay.portal.kernel.util.CharPool; 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.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.model.Company; import com.liferay.portal.model.Group; import com.liferay.portal.model.GroupConstants; import com.liferay.portal.model.Layout; import com.liferay.portal.model.LayoutConstants; import com.liferay.portal.model.PasswordPolicy; import com.liferay.portal.model.Ticket; import com.liferay.portal.model.TicketConstants; import com.liferay.portal.model.User; import com.liferay.portal.service.CompanyLocalServiceUtil; import com.liferay.portal.service.GroupLocalServiceUtil; import com.liferay.portal.service.LayoutLocalServiceUtil; import com.liferay.portal.service.ServiceContext; import com.liferay.portal.service.TicketLocalServiceUtil; import com.liferay.portal.theme.ThemeDisplay; import com.liferay.portal.util.PortalUtil; import com.liferay.portlet.PortletURLFactoryUtil; /** * @author p_7339 * */ public class LiferayCadastroUtil { private static final Log _log = LogFactoryUtil.getLog(LiferayCadastroUtil.class); private static final String _PRIVATE_GROUP_SERVLET_MAPPING = PropsUtil.get(PropsKeys.LAYOUT_FRIENDLY_URL_PRIVATE_GROUP_SERVLET_MAPPING); private static final String _PRIVATE_USER_SERVLET_MAPPING = PropsUtil.get(PropsKeys.LAYOUT_FRIENDLY_URL_PRIVATE_USER_SERVLET_MAPPING); private static final String _PUBLIC_GROUP_SERVLET_MAPPING = PropsUtil.get(PropsKeys.LAYOUT_FRIENDLY_URL_PUBLIC_SERVLET_MAPPING); private static final long EXPIRATION_TIME = 1000 * 60 * 24 * 30 * 3; //90 dias em milissegundos private static final String UNREGISTER_USER_PORTLET_ID = "cdunregisteruserportlet_WAR_cdregisteruserportlet"; private static String UNREGISTER_USER_PORTLET_NAME = "cdunregisteruserportlet_WAR_cdregisteruserportlet";//"cdunregisteruserportlet_WAR_cdregisteruserportlet_INSTANCE_5itvcJ5cWSoE"; //"cd-unregisteruser-portlet"; private static long getPlidFromFriendlyURL(long companyId, String friendlyURL) { if (Validator.isNull(friendlyURL)) { return LayoutConstants.DEFAULT_PLID; } String[] urlParts = friendlyURL.split("\\/", 4); if ((friendlyURL.charAt(0) != CharPool.SLASH) && (urlParts.length != 4)) { return LayoutConstants.DEFAULT_PLID; } boolean privateLayout = true; String urlPrefix = StringPool.SLASH + urlParts[1]; if (_PUBLIC_GROUP_SERVLET_MAPPING.equals(urlPrefix)) { privateLayout = false; } else if (_PRIVATE_GROUP_SERVLET_MAPPING.equals(urlPrefix) || _PRIVATE_USER_SERVLET_MAPPING.equals(urlPrefix)) { privateLayout = true; } else { return LayoutConstants.DEFAULT_PLID; } Group group = null; try { group = GroupLocalServiceUtil.getFriendlyURLGroup(companyId, StringPool.SLASH + urlParts[2]); } catch (Exception e) { } if (group != null) { Layout layout = null; try { String layoutFriendlyURL = null; if (urlParts.length == 4) { layoutFriendlyURL = StringPool.SLASH + urlParts[3]; layout = LayoutLocalServiceUtil.getFriendlyURLLayout(group.getGroupId(), privateLayout, layoutFriendlyURL); } else { List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(group.getGroupId(), privateLayout, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID); for (Layout cur : layouts) { if (!cur.isHidden()) { layout = cur; break; } } if (layout == null) return LayoutConstants.DEFAULT_PLID; } return layout.getPlid(); } catch (Exception e) { } } return LayoutConstants.DEFAULT_PLID; } /** * Obtem a última URL acessada pelo usuário, antes da página de cadastro * * @param req * @return * @throws SystemException * @throws PortalException */ public static long getUltimaPaginaVisitada() throws PortalException, SystemException { LiferayFacesContext facesContext = LiferayFacesContext.getInstance(); long companyId = facesContext.getCompanyId(); PortletRequest req = facesContext.getPortletRequest(); LastPath lp = (LastPath) req.getPortletSession().getAttribute(WebKeys.LAST_PATH, PortletSession.APPLICATION_SCOPE); // Plid da página para onde redirecionar de volta: ou para a // página de onde veio // ou para a página incial long plid = LayoutConstants.DEFAULT_PLID; if (lp != null) { plid = getPlidFromFriendlyURL(companyId, lp.getContextPath() + lp.getPath()); _log.info("PLID : " + plid + " lp " + lp.getContextPath() + lp.getPath()); } else { _log.info("LP NULL"); } // Página inicial if (plid == LayoutConstants.DEFAULT_PLID) { Group grupoGuest = GroupLocalServiceUtil.getGroup(companyId, GroupConstants.GUEST); try { Layout layout = LayoutLocalServiceUtil.getFriendlyURLLayout(grupoGuest.getGroupId(), false, "/principal"); plid = layout.getPlid(); } catch (NoSuchLayoutException e) { plid = LayoutLocalServiceUtil.getDefaultPlid(grupoGuest.getGroupId(), false); } } return plid; } /** * * @param user * @param companyId * @param plid * @param serviceContext * @throws SystemException * @throws PortalException * @throws IOException */ public static void enviaEmailMudancaSenha(User user, long companyId, long plid, ServiceContext serviceContext) { try { Company company = CompanyLocalServiceUtil.getCompany(companyId); // Cria o ticket para mudança de senha PasswordPolicy passwordPolicy = user.getPasswordPolicy(); Date expirationDate = new Date(System.currentTimeMillis() + (passwordPolicy.getResetTicketMaxAge() * 1000)); Ticket ticket = TicketLocalServiceUtil.addTicket(companyId, User.class.getName(), user.getUserId(), TicketConstants.TYPE_PASSWORD, null, expirationDate, serviceContext); String passwordResetURL = serviceContext.getPortalURL() + serviceContext.getPathMain() + "/portal/update_password?p_l_id=" + plid + "&ticketKey=" + ticket.getKey(); // Altera para a porta 80 if (passwordResetURL.startsWith("https")) passwordResetURL = UrlRewriterUtil.convertToHttp(passwordResetURL); String bodyText = ClassPathResourceUtil.loadResource("templates/admin/email_new_user_body.tmpl"); String subjectText = ClassPathResourceUtil.loadResource("templates/admin/email_new_user_subject.tmpl"); InternetAddress from; InternetAddress to; String toAddress = user.getEmailAddress(); String toName = user.getFullName(); String fromName = company.getAdminName(); String fromAddress = company.getEmailAddress(); // Constrói os endereços de email try { from = new InternetAddress(fromAddress, fromName); to = new InternetAddress(toAddress, toName); } catch (IOException e) { // Loga e retorna sem gerar o email _log.error("Erro ao gerar endereços", e); return; } bodyText = bodyText.replace("[$TO_NAME$]", toName); bodyText = bodyText.replace("[$PORTAL_URL$]", company.getVirtualHostname()); bodyText = bodyText.replace("[$CONFIRM_URL$]", passwordResetURL); bodyText = bodyText.replace("[$TO_ADDRESS$]", toAddress); bodyText = bodyText.replace("[$USER_ID$]", String.valueOf(user.getUserId())); bodyText = bodyText.replace("[$USER_SCREENNAME$]", user.getScreenName()); bodyText = bodyText.replace("[$FROM_NAME$]", fromName); bodyText = bodyText.replace("[$FROM_ADDRESS$]", fromAddress); subjectText = subjectText.replace("[$PORTAL_URL$]", company.getVirtualHostname()); subjectText = subjectText.replace("[$TO_NAME$]", toName); subjectText = subjectText.replace("[$CONFIRM_URL$]", passwordResetURL); subjectText = subjectText.replace("[$TO_ADDRESS$]", toAddress); subjectText = subjectText.replace("[$USER_ID$]", String.valueOf(user.getUserId())); subjectText = subjectText.replace("[$USER_SCREENNAME$]", user.getScreenName()); subjectText = subjectText.replace("[$FROM_NAME$]", fromName); subjectText = subjectText.replace("[$FROM_ADDRESS$]", fromAddress); MailMessage message = new MailMessage(from, to, subjectText, bodyText, true); MailServiceUtil.sendEmail(message); } catch (PortalException e) { _log.error("Erro ao enviar email de cadastro de usuário", e); } catch (SystemException e) { _log.error("Erro ao enviar email de cadastro de usuário", e); } } /** * * @param user * @param companyId * @param plid * @param serviceContext * @throws SystemException * @throws PortalException * @throws IOException */ public static void enviaEmailDescadastrar(User user, long companyId, String email, ServiceContext serviceContext) { try { Company company = CompanyLocalServiceUtil.getCompany(companyId); Date expirationDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME); Ticket ticket = TicketLocalServiceUtil.addTicket(companyId, User.class.getName(), user.getUserId(), TicketConstants.TYPE_EMAIL_ADDRESS, null, expirationDate, serviceContext); // LiferayFacesContext liferayFacesContext = LiferayFacesContext.getInstance(); String userUnregisterURLString = ""; try{ FacesContext facesContext = FacesContext.getCurrentInstance(); PortletRequest portletRequest = (PortletRequest) facesContext.getExternalContext().getRequest(); ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(WebKeys.THEME_DISPLAY); long groupId = themeDisplay.getLayout().getGroupId(); long plid = PortalUtil.getPlidFromPortletId(groupId, UNREGISTER_USER_PORTLET_ID); PortletURL userUnregisterURL = PortletURLFactoryUtil.create(portletRequest, UNREGISTER_USER_PORTLET_NAME, plid, PortletRequest.RENDER_PHASE); // PortletURL userUnregisterURL = liferayFacesContext.createRenderURL(); // userUnregisterURL.addProperty("email", email); // userUnregisterURL.addProperty("ticketKey", ticket.getKey()); // userUnregisterURL.addProperty("userId", Long.toString(user.getUserId())); userUnregisterURL.setParameter("ticketKey", ticket.getKey()); userUnregisterURL.setParameter("paramUserId", Long.toString(user.getUserId())); // System.out.println(userUnregisterURL); userUnregisterURLString = userUnregisterURL.toString(); } catch(Exception e) { System.out.println("Erro ao gerar link"); e.printStackTrace(); } String bodyText = ClassPathResourceUtil.loadResource("templates/admin/email_new_user_body.tmpl"); String subjectText = ClassPathResourceUtil.loadResource("templates/admin/email_new_user_subject.tmpl"); InternetAddress from; InternetAddress to; String toAddress = user.getEmailAddress(); String toName = user.getFullName(); String fromName = company.getAdminName(); String fromAddress = company.getEmailAddress(); // Constrói os endereços de email try { from = new InternetAddress(fromAddress, fromName); to = new InternetAddress(toAddress, toName); } catch (IOException e) { // Loga e retorna sem gerar o email _log.error("Erro ao gerar endereços", e); return; } bodyText = bodyText.replace("[$TO_NAME$]", toName); bodyText = bodyText.replace("[$PORTAL_URL$]", company.getVirtualHostname()); bodyText = bodyText.replace("[$CONFIRM_URL$]", userUnregisterURLString.toString()); bodyText = bodyText.replace("[$TO_ADDRESS$]", toAddress); bodyText = bodyText.replace("[$USER_ID$]", String.valueOf(user.getUserId())); bodyText = bodyText.replace("[$USER_SCREENNAME$]", user.getScreenName()); bodyText = bodyText.replace("[$FROM_NAME$]", fromName); bodyText = bodyText.replace("[$FROM_ADDRESS$]", fromAddress); subjectText = subjectText.replace("[$PORTAL_URL$]", company.getVirtualHostname()); subjectText = subjectText.replace("[$TO_NAME$]", toName); subjectText = subjectText.replace("[$CONFIRM_URL$]", userUnregisterURLString); subjectText = subjectText.replace("[$TO_ADDRESS$]", toAddress); subjectText = subjectText.replace("[$USER_ID$]", String.valueOf(user.getUserId())); subjectText = subjectText.replace("[$USER_SCREENNAME$]", user.getScreenName()); subjectText = subjectText.replace("[$FROM_NAME$]", fromName); subjectText = subjectText.replace("[$FROM_ADDRESS$]", fromAddress); MailMessage message = new MailMessage(from, to, subjectText, bodyText, true); MailServiceUtil.sendEmail(message); } catch (PortalException e) { _log.error("Erro ao enviar email de cadastro de usuário", e); } catch (SystemException e) { _log.error("Erro ao enviar email de cadastro de usuário", e); } } }