/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portlet.messageboards.messaging; import com.liferay.mail.kernel.model.Account; import com.liferay.message.boards.kernel.model.MBMessage; import com.liferay.message.boards.kernel.model.MBMessageConstants; import com.liferay.message.boards.kernel.service.MBMessageLocalServiceUtil; import com.liferay.message.boards.kernel.service.MBMessageServiceUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.messaging.BaseMessageListener; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.portlet.PortletProvider; import com.liferay.portal.kernel.portlet.PortletProviderUtil; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.UserLocalServiceUtil; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.ObjectValuePair; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.StreamUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.security.permission.PermissionCheckerUtil; import com.liferay.portlet.messageboards.util.MBMailMessage; import com.liferay.portlet.messageboards.util.MBUtil; import com.liferay.portlet.messageboards.util.MailingListThreadLocal; import com.liferay.util.mail.MailEngine; import java.io.InputStream; import java.util.List; import javax.mail.Address; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.URLName; import javax.mail.internet.InternetAddress; /** * @author Thiago Moreira */ public class MailingListMessageListener extends BaseMessageListener { @Override protected void doReceive( com.liferay.portal.kernel.messaging.Message message) throws Exception { MailingListRequest mailingListRequest = (MailingListRequest)message.getPayload(); Store store = null; Folder folder = null; Message[] messages = null; try { store = getStore(mailingListRequest); store.connect(); folder = getFolder(store); messages = folder.getMessages(); processMessages(mailingListRequest, messages); } finally { if ((folder != null) && folder.isOpen()) { try { folder.setFlags( messages, new Flags(Flags.Flag.DELETED), true); } catch (Exception e) { } try { folder.close(true); } catch (Exception e) { } } if ((store != null) && store.isConnected()) { try { store.close(); } catch (MessagingException me) { } } } } protected Folder getFolder(Store store) throws Exception { Folder folder = store.getFolder("INBOX"); if (!folder.exists()) { throw new MessagingException("Inbox not found"); } folder.open(Folder.READ_WRITE); return folder; } protected Store getStore(MailingListRequest mailingListRequest) throws Exception { String protocol = mailingListRequest.getInProtocol(); String host = mailingListRequest.getInServerName(); int port = mailingListRequest.getInServerPort(); String user = mailingListRequest.getInUserName(); String password = mailingListRequest.getInPassword(); Account account = Account.getInstance(protocol, port); account.setHost(host); account.setPort(port); account.setUser(user); account.setPassword(password); Session session = MailEngine.getSession(account); URLName urlName = new URLName( protocol, host, port, StringPool.BLANK, user, password); Store store = session.getStore(urlName); return store; } protected void processMessage( MailingListRequest mailingListRequest, Message mailMessage) throws Exception { if (MBUtil.hasMailIdHeader(mailMessage)) { return; } String from = null; Address[] addresses = mailMessage.getFrom(); if (ArrayUtil.isNotEmpty(addresses)) { Address address = addresses[0]; if (address instanceof InternetAddress) { from = ((InternetAddress)address).getAddress(); } else { from = address.toString(); } } long companyId = mailingListRequest.getCompanyId(); long groupId = mailingListRequest.getGroupId(); long categoryId = mailingListRequest.getCategoryId(); if (_log.isDebugEnabled()) { _log.debug("Category id " + categoryId); } boolean anonymous = false; User user = UserLocalServiceUtil.fetchUserByEmailAddress( companyId, from); if (user == null) { if (!mailingListRequest.isAllowAnonymous()) { return; } anonymous = true; user = UserLocalServiceUtil.getUserById( companyId, mailingListRequest.getUserId()); } long parentMessageId = MBUtil.getParentMessageId(mailMessage); if (_log.isDebugEnabled()) { _log.debug("Parent message id " + parentMessageId); } MBMessage parentMessage = null; if (parentMessageId > 0) { parentMessage = MBMessageLocalServiceUtil.fetchMBMessage( parentMessageId); } if (_log.isDebugEnabled()) { _log.debug("Parent message " + parentMessage); } MBMailMessage mbMailMessage = new MBMailMessage(); MBUtil.collectPartContent(mailMessage, mbMailMessage); PermissionCheckerUtil.setThreadValues(user); MailingListThreadLocal.setSourceMailingList(true); String subject = MBUtil.getSubjectWithoutMessageId(mailMessage); ServiceContext serviceContext = new ServiceContext(); serviceContext.setAddGroupPermissions(true); serviceContext.setAddGuestPermissions(true); String portletId = PortletProviderUtil.getPortletId( MBMessage.class.getName(), PortletProvider.Action.VIEW); serviceContext.setLayoutFullURL( PortalUtil.getLayoutFullURL(groupId, portletId)); serviceContext.setScopeGroupId(groupId); List<ObjectValuePair<String, InputStream>> inputStreamOVPs = mbMailMessage.getInputStreamOVPs(); try { if (parentMessage == null) { MBMessageServiceUtil.addMessage( groupId, categoryId, subject, mbMailMessage.getBody(), MBMessageConstants.DEFAULT_FORMAT, inputStreamOVPs, anonymous, 0.0, true, serviceContext); } else { MBMessageServiceUtil.addMessage( parentMessage.getMessageId(), subject, mbMailMessage.getBody(), MBMessageConstants.DEFAULT_FORMAT, inputStreamOVPs, anonymous, 0.0, true, serviceContext); } } finally { for (ObjectValuePair<String, InputStream> inputStreamOVP : inputStreamOVPs) { InputStream inputStream = inputStreamOVP.getValue(); StreamUtil.cleanUp(inputStream); } } } protected void processMessages( MailingListRequest mailingListRequest, Message[] messages) throws Exception { for (Message message : messages) { try { processMessage(mailingListRequest, message); } finally { PermissionCheckerUtil.setThreadValues(null); } } } private static final Log _log = LogFactoryUtil.getLog( MailingListMessageListener.class); }