/* * Copyright (c) JForum Team * All rights reserved. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided * that the following conditions are met: * * 1) Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * 2) Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or * other materials provided with the distribution. * 3) Neither the name of "Rafael Steil" nor * the names of its contributors may be used to endorse * or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * * This file creation date: 20/05/2004 - 21:05:45 * The JForum Project * http://www.jforum.net */ package net.jforum.view.forum; import java.util.List; import net.jforum.Command; import net.jforum.SessionFacade; import net.jforum.dao.DataAccessDriver; import net.jforum.dao.PrivateMessageDAO; import net.jforum.dao.UserDAO; import net.jforum.entities.Post; import net.jforum.entities.PrivateMessage; import net.jforum.entities.PrivateMessageType; import net.jforum.entities.User; import net.jforum.entities.UserSession; import net.jforum.repository.SmiliesRepository; import net.jforum.util.I18n; import net.jforum.util.concurrent.Executor; import net.jforum.util.mail.EmailSenderTask; import net.jforum.util.mail.PrivateMessageSpammer; import net.jforum.util.preferences.ConfigKeys; import net.jforum.util.preferences.SystemGlobals; import net.jforum.util.preferences.TemplateKeys; import net.jforum.view.forum.common.PostCommon; import net.jforum.view.forum.common.ViewCommon; /** * @author Rafael Steil * @version $Id: PrivateMessageAction.java,v 1.43 2007/08/17 15:53:28 rafaelsteil Exp $ */ public class PrivateMessageAction extends Command { public void inbox() { if (!SessionFacade.isLogged()) { this.setTemplateName(ViewCommon.contextToLogin()); return; } User user = new User(); user.setId(SessionFacade.getUserSession().getUserId()); List pmList = DataAccessDriver.getInstance().newPrivateMessageDAO().selectFromInbox(user); this.setTemplateName(TemplateKeys.PM_INBOX); this.context.put("inbox", true); this.context.put("pmList", pmList); this.context.put("pageTitle", I18n.getMessage("ForumBase.privateMessages")+" "+I18n.getMessage("PrivateMessage.inbox")); this.putTypes(); } public void sentbox() { if (!SessionFacade.isLogged()) { this.setTemplateName(ViewCommon.contextToLogin()); return; } User user = new User(); user.setId(SessionFacade.getUserSession().getUserId()); List pmList = DataAccessDriver.getInstance().newPrivateMessageDAO().selectFromSent(user); this.context.put("sentbox", true); this.context.put("pmList", pmList); this.setTemplateName(TemplateKeys.PM_SENTBOX); this.context.put("pageTitle", I18n.getMessage("ForumBase.privateMessages")+" "+I18n.getMessage("PrivateMessage.sentbox")); this.putTypes(); } private void putTypes() { this.context.put("NEW", new Integer(PrivateMessageType.NEW)); this.context.put("READ", new Integer(PrivateMessageType.READ)); this.context.put("UNREAD", new Integer(PrivateMessageType.UNREAD)); } public void send() { if (!SessionFacade.isLogged()) { this.setTemplateName(ViewCommon.contextToLogin()); return; } User user = DataAccessDriver.getInstance().newUserDAO().selectById( SessionFacade.getUserSession().getUserId()); ViewCommon.prepareUserSignature(user); this.sendFormCommon(user); } public void sendTo() { if (!SessionFacade.isLogged()) { this.setTemplateName(ViewCommon.contextToLogin()); return; } User user = DataAccessDriver.getInstance().newUserDAO().selectById( SessionFacade.getUserSession().getUserId()); int userId = this.request.getIntParameter("user_id"); if (userId > 0){ User recipient = DataAccessDriver.getInstance().newUserDAO().selectById(userId); this.context.put("pmRecipient", recipient); this.context.put("toUserId", new Integer(recipient.getId())); this.context.put("toUsername", recipient.getUsername()); this.context.put("pageTitle", I18n.getMessage("PrivateMessage.title") + " " + I18n.getMessage("PrivateMessage.to") + " " + recipient.getUsername()); } this.sendFormCommon(user); } private void sendFormCommon(User user) { this.setTemplateName(TemplateKeys.PM_SENDFORM); this.context.put("user", user); this.context.put("moduleName", "pm"); this.context.put("action", "sendSave"); this.context.put("htmlAllowed", true); this.context.put("attachmentsEnabled", false); this.context.put("maxAttachments", SystemGlobals.getValue(ConfigKeys.ATTACHMENTS_MAX_POST)); this.context.put("attachmentsEnabled", false); this.context.put("maxAttachmentsSize", new Integer(0)); this.context.put("moderationLoggingEnabled", false); this.context.put("smilies", SmiliesRepository.getSmilies()); } public void sendSave() { if (!SessionFacade.isLogged()) { this.setTemplateName(ViewCommon.contextToLogin()); return; } UserDAO userDao = DataAccessDriver.getInstance().newUserDAO(); String toUserIdStr = this.request.getParameter("toUserId"); String toUsername = this.request.getParameter("toUsername"); int toUserId = -1; // If we don't have an user id, then probably the user // inserted the username by hand in the form's field if (toUserIdStr == null || "".equals(toUserIdStr.trim())) { List l = userDao.findByName(toUsername, true); if (l.size() > 0) { User u = (User)l.get(0); toUserId = u.getId(); } } else { toUserId = Integer.parseInt(toUserIdStr); } // We failed to get the user id? if (toUserId == -1) { this.setTemplateName(TemplateKeys.PM_SENDSAVE_USER_NOTFOUND); this.context.put("message", I18n.getMessage("PrivateMessage.userIdNotFound")); return; } PrivateMessage pm = new PrivateMessage(); pm.setPost(PostCommon.fillPostFromRequest()); // Sender User fromUser = new User(); fromUser.setId(SessionFacade.getUserSession().getUserId()); pm.setFromUser(fromUser); // Recipient User toUser = userDao.selectById(toUserId); pm.setToUser(toUser); boolean preview = ("1".equals(this.request.getParameter("preview"))); if (!preview) { DataAccessDriver.getInstance().newPrivateMessageDAO().send(pm); this.setTemplateName(TemplateKeys.PM_SENDSAVE); this.context.put("message", I18n.getMessage("PrivateMessage.messageSent", new String[] { this.request.getContextPath() + "/pm/inbox" + SystemGlobals.getValue(ConfigKeys.SERVLET_EXTENSION)})); // If the target user if in the forum, then increments its // private messate count String sid = SessionFacade.isUserInSession(toUserId); if (sid != null) { UserSession us = SessionFacade.getUserSession(sid); us.setPrivateMessages(us.getPrivateMessages() + 1); } if (toUser.getEmail() != null && toUser.getEmail().trim().length() > 0 && SystemGlobals.getBoolValue(ConfigKeys.MAIL_NOTIFY_ANSWERS)) { Executor.execute(new EmailSenderTask(new PrivateMessageSpammer(toUser))); } } else { this.context.put("preview", true); this.context.put("post", pm.getPost()); Post postPreview = new Post(pm.getPost()); this.context.put("postPreview", PostCommon.preparePostForDisplay(postPreview)); this.context.put("pm", pm); this.send(); } } public void findUser() { boolean showResult = false; String username = this.request.getParameter("username"); if (username != null && !username.equals("")) { List namesList = DataAccessDriver.getInstance().newUserDAO().findByName(username, false); this.context.put("namesList", namesList); showResult = true; } this.setTemplateName(TemplateKeys.PM_FIND_USER); this.context.put("username", username); this.context.put("showResult", showResult); } public void read() { if (!SessionFacade.isLogged()) { this.setTemplateName(ViewCommon.contextToLogin()); return; } int id = this.request.getIntParameter("id"); PrivateMessage pm = new PrivateMessage(); pm.setId(id); pm = DataAccessDriver.getInstance().newPrivateMessageDAO().selectById(pm); // Don't allow the read of messages that don't belongs // to the current user UserSession us = SessionFacade.getUserSession(); int userId = us.getUserId(); if (pm.getToUser().getId() == userId || pm.getFromUser().getId() == userId) { pm.getPost().setText(PostCommon.preparePostForDisplay(pm.getPost()).getText()); // Update the message status, if needed if (pm.getType() == PrivateMessageType.NEW) { pm.setType(PrivateMessageType.READ); DataAccessDriver.getInstance().newPrivateMessageDAO().updateType(pm); int totalMessages = us.getPrivateMessages(); if (totalMessages > 0) { us.setPrivateMessages(totalMessages - 1); } } User u = pm.getFromUser(); ViewCommon.prepareUserSignature(u); this.context.put("pm", pm); this.setTemplateName(TemplateKeys.PM_READ); } else { this.setTemplateName(TemplateKeys.PM_READ_DENIED); this.context.put("message", I18n.getMessage("PrivateMessage.readDenied")); } } public void review() { this.read(); this.setTemplateName(TemplateKeys.PM_READ_REVIEW); } public void delete() { if (!SessionFacade.isLogged()) { this.setTemplateName(ViewCommon.contextToLogin()); return; } String ids[] = this.request.getParameterValues("id"); if (ids != null && ids.length > 0) { PrivateMessage[] deleteList = new PrivateMessage[ids.length]; int unreadCount = 0; PrivateMessageDAO dao = DataAccessDriver.getInstance().newPrivateMessageDAO(); for (int i = 0; i < ids.length; i++) { PrivateMessage pm = dao.selectById(new PrivateMessage(Integer.parseInt(ids[i]))); if (pm.getType() == PrivateMessageType.NEW) { unreadCount++; } deleteList[i] = pm; } UserSession userSession = SessionFacade.getUserSession(); dao.delete(deleteList, userSession.getUserId()); // Subtracts the number of delete messages int total = userSession.getPrivateMessages() - unreadCount; if (total < 0) { total = 0; } userSession.setPrivateMessages(total); } this.setTemplateName(TemplateKeys.PM_DELETE); this.context.put("message", I18n.getMessage("PrivateMessage.deleteDone", new String[] { this.request.getContextPath() + "/pm/inbox" + SystemGlobals.getValue(ConfigKeys.SERVLET_EXTENSION) })); } public void reply() { if (!SessionFacade.isLogged()) { this.setTemplateName(ViewCommon.contextToLogin()); return; } int id = this.request.getIntParameter("id"); PrivateMessage pm = new PrivateMessage(); pm.setId(id); pm = DataAccessDriver.getInstance().newPrivateMessageDAO().selectById(pm); int userId = SessionFacade.getUserSession().getUserId(); if (pm.getToUser().getId() != userId && pm.getFromUser().getId() != userId) { this.setTemplateName(TemplateKeys.PM_READ_DENIED); this.context.put("message", I18n.getMessage("PrivateMessage.readDenied")); return; } pm.getPost().setSubject(I18n.getMessage("PrivateMessage.replyPrefix") + pm.getPost().getSubject()); this.context.put("pm", pm); this.context.put("pmReply", true); this.sendFormCommon(DataAccessDriver.getInstance().newUserDAO().selectById( SessionFacade.getUserSession().getUserId())); } public void quote() { if (!SessionFacade.isLogged()) { this.setTemplateName(ViewCommon.contextToLogin()); return; } int id = this.request.getIntParameter("id"); PrivateMessage pm = new PrivateMessage(); pm.setId(id); pm = DataAccessDriver.getInstance().newPrivateMessageDAO().selectById(pm); int userId = SessionFacade.getUserSession().getUserId(); if (pm.getToUser().getId() != userId && pm.getFromUser().getId() != userId) { this.setTemplateName(TemplateKeys.PM_READ_DENIED); this.context.put("message", I18n.getMessage("PrivateMessage.readDenied")); return; } pm.getPost().setSubject(I18n.getMessage("PrivateMessage.replyPrefix") + pm.getPost().getSubject()); this.sendFormCommon(DataAccessDriver.getInstance().newUserDAO().selectById(userId)); this.context.put("quote", "true"); this.context.put("quoteUser", pm.getFromUser().getUsername()); this.context.put("post", pm.getPost()); this.context.put("pm", pm); } /** * @see net.jforum.Command#list() */ public void list() { this.inbox(); } }