/* * Copyright 2008 Jeff Dwyer * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.apress.progwt.server.service.impl; import java.io.StringWriter; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.mail.internet.MimeMessage; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Required; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessagePreparator; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import com.apress.progwt.client.domain.User; import com.apress.progwt.client.exception.BusinessException; import com.apress.progwt.client.exception.InfrastructureException; import com.apress.progwt.server.dao.MailingListDAO; import com.apress.progwt.server.domain.MailingListEntry; import com.apress.progwt.server.service.InvitationService; import com.apress.progwt.server.service.UserService; import com.apress.progwt.server.util.CryptUtils; import com.apress.progwt.server.web.domain.MailingListCommand; import freemarker.template.Template; @Transactional public class InvitationServiceImpl implements InvitationService { private static final Logger log = Logger .getLogger(InvitationServiceImpl.class); private FreeMarkerConfigurer configurer = null; private String from; private String invitationTemplate; private MailingListDAO mailingListDAO; private JavaMailSender mailSender; private String masterkey; private String salt; private UserService userService; public MailingListEntry getEntryForKey(String randomkey) { return mailingListDAO.getEntryForKey(randomkey); } /** * PEND low SignupIfPossibleController.CHEAT should be a MD5(timestamp + * pass) that we check on our end, but... * */ public boolean isKeyValid(String randomkey) { if (randomkey == null) { return false; } return (getEntryForKey(randomkey) != null) || randomkey.equals(masterkey) || isValidTimestampKey(randomkey); } private boolean isValidTimestampKey(String randomkey) { Calendar c = Calendar.getInstance(); c.get(Calendar.DAY_OF_WEEK_IN_MONTH); String preCrypt = salt + c.get(Calendar.DAY_OF_WEEK_IN_MONTH); String crypt = CryptUtils.hashString(preCrypt); return crypt.equals(randomkey); } public void requestInvitation(MailingListCommand comm) { mailingListDAO.createEntry(comm); } public void saveSignedUpUser(String randomkey, User u) { // may be null for masterkey overrides of the system MailingListEntry entry = getEntryForKey(randomkey); if (entry != null) { entry.setSignedUpUser(u); mailingListDAO.save(entry); } } /** * See * http://opensource.atlassian.com/confluence/spring/display/DISC/Sending+FreeMarker-based+multipart+email+with+Spring */ public void createAndSendInvitation(final String email, final User inviter) throws BusinessException, InfrastructureException { if (inviter.getInvitations() < 1) { throw new BusinessException("No invites available for user."); } log.debug("before create entry"); final MailingListEntry invitation = mailingListDAO.createEntry( email, inviter); log.debug("subtract entry " + inviter.getInvitations()); userService.addInvitationsTo(inviter, -1); log.debug("send invite " + inviter.getInvitations()); sendInvite(invitation); log.debug("sent " + inviter.getInvitations()); } public void sendInvite(final MailingListEntry invitation) throws InfrastructureException { // send mail try { MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper message = new MimeMessageHelper( mimeMessage); message.setTo(invitation.getEmail()); message.setFrom(from); message.setSubject("ToCollege.net Invitation"); Map<String, Object> model = new HashMap<String, Object>(); model.put("inviter", invitation.getInviter()); model.put("randomkey", invitation.getRandomkey()); model.put("email", invitation.getEmail()); Template textTemplate = configurer.getConfiguration() .getTemplate(invitationTemplate); final StringWriter textWriter = new StringWriter(); textTemplate.process(model, textWriter); message.setText(textWriter.toString(), true); log.info("Inviting: " + invitation.getEmail()); log.debug("From: " + from); log.debug("Message: " + textWriter.toString()); } }; this.mailSender.send(preparator); invitation.setSentEmailOk(true); mailingListDAO.save(invitation); } catch (Exception e) { log.error(e); throw new InfrastructureException(e); } } @Required public void setConfigurer(FreeMarkerConfigurer configuration) { this.configurer = configuration; } @Required public void setFrom(String from) { this.from = from; } @Required public void setSalt(String salt) { this.salt = salt; } @Required public void setInvitationTemplate(String invitationTemplate) { this.invitationTemplate = invitationTemplate; } @Required public void setMailingListDAO(MailingListDAO mailingListDAO) { this.mailingListDAO = mailingListDAO; } @Required public void setMailSender(JavaMailSender mailSender) { this.mailSender = mailSender; } @Required public void setMasterkey(String masterkey) { this.masterkey = masterkey; } @Required public void setUserService(UserService userService) { this.userService = userService; } public MailingListEntry getEntryById(Long id) { return mailingListDAO.getEntryById(id); } public List<MailingListEntry> getMailingList() { return mailingListDAO.getMailingList(); } public String getSalt() { return salt; } }