/* * LinShare is an open source filesharing software, part of the LinPKI software * suite, developed by Linagora. * * Copyright (C) 2015 LINAGORA * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version, provided you comply with the Additional Terms applicable for * LinShare software by Linagora pursuant to Section 7 of the GNU Affero General * Public License, subsections (b), (c), and (e), pursuant to which you must * notably (i) retain the display of the “LinShare™” trademark/logo at the top * of the interface window, the display of the “You are using the Open Source * and free version of LinShare™, powered by Linagora © 2009–2015. Contribute to * Linshare R&D by subscribing to an Enterprise offer!” infobox and in the * e-mails sent with the Program, (ii) retain all hypertext links between * LinShare and linshare.org, between linagora.com and Linagora, and (iii) * refrain from infringing Linagora intellectual property rights over its * trademarks and commercial brands. Other Additional Terms apply, see * <http://www.linagora.com/licenses/> for more details. * * This program 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 Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License and * its applicable Additional Terms for LinShare along with this program. If not, * see <http://www.gnu.org/licenses/> for the GNU Affero General Public License * version 3 and <http://www.linagora.com/licenses/> for the Additional Terms * applicable to LinShare software. */ package org.linagora.linshare.core.service.impl; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Formatter; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.linagora.linshare.core.business.service.DomainBusinessService; import org.linagora.linshare.core.business.service.MailActivationBusinessService; import org.linagora.linshare.core.domain.constants.Language; import org.linagora.linshare.core.domain.constants.MailActivationType; import org.linagora.linshare.core.domain.constants.MailContentType; import org.linagora.linshare.core.domain.entities.AbstractDomain; import org.linagora.linshare.core.domain.entities.Account; import org.linagora.linshare.core.domain.entities.AnonymousShareEntry; import org.linagora.linshare.core.domain.entities.AnonymousUrl; import org.linagora.linshare.core.domain.entities.Contact; import org.linagora.linshare.core.domain.entities.DocumentEntry; import org.linagora.linshare.core.domain.entities.Entry; import org.linagora.linshare.core.domain.entities.Guest; import org.linagora.linshare.core.domain.entities.MailActivation; import org.linagora.linshare.core.domain.entities.MailConfig; import org.linagora.linshare.core.domain.entities.MailContent; import org.linagora.linshare.core.domain.entities.MailFooter; import org.linagora.linshare.core.domain.entities.ShareEntry; import org.linagora.linshare.core.domain.entities.ShareEntryGroup; import org.linagora.linshare.core.domain.entities.StringValueFunctionality; import org.linagora.linshare.core.domain.entities.UploadProposition; import org.linagora.linshare.core.domain.entities.UploadRequest; import org.linagora.linshare.core.domain.entities.UploadRequestEntry; import org.linagora.linshare.core.domain.entities.UploadRequestUrl; import org.linagora.linshare.core.domain.entities.User; import org.linagora.linshare.core.domain.objects.MailContainer; import org.linagora.linshare.core.domain.objects.MailContainerWithRecipient; import org.linagora.linshare.core.domain.objects.Recipient; import org.linagora.linshare.core.domain.objects.ShareContainer; import org.linagora.linshare.core.exception.BusinessException; import org.linagora.linshare.core.service.FunctionalityReadOnlyService; import org.linagora.linshare.core.service.MailBuildingService; import org.linagora.linshare.core.utils.DocumentUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Function; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; public class MailBuildingServiceImpl implements MailBuildingService { private final static Logger logger = LoggerFactory .getLogger(MailBuildingServiceImpl.class); private final boolean displayLogo; private final boolean insertLicenceTerm; private final DomainBusinessService domainBusinessService; private final FunctionalityReadOnlyService functionalityReadOnlyService; private final MailActivationBusinessService mailActivationBusinessService; private static final String LINSHARE_LOGO = "<img src='cid:image.part.1@linshare.org' /><br/><br/>"; private final Map<Language, String> downloaded = Maps.newHashMap(); private final Map<Language, String> notDownloaded = Maps.newHashMap(); private final Map<Language, String> shareWith = Maps.newHashMap(); private final Map<Language, String> anonymouslySharedWith = Maps.newHashMap(); private final String receivedSharesUrlSuffix; private final String documentsUrlSuffix; private class FileRepresentation { private String name; public FileRepresentation(UploadRequestEntry entry) { super(); this.name = entry.getName(); } @Override public String toString() { return name; } } private class ContactRepresentation { private String mail; private String firstName; private String lastName; @SuppressWarnings("unused") public ContactRepresentation(String mail, String firstName, String lastName) { super(); this.mail = StringUtils.trimToNull(mail); this.firstName = StringUtils.trimToNull(firstName); this.lastName = StringUtils.trimToNull(lastName); } public ContactRepresentation(String mail) { this.mail = StringUtils.trimToNull(mail); this.firstName = null; this.lastName = null; } public ContactRepresentation(User user) { this.mail = StringUtils.trimToNull(user.getMail()); this.firstName = StringUtils.trimToNull(user.getFirstName()); this.lastName = StringUtils.trimToNull(user.getLastName()); } @SuppressWarnings("unused") public ContactRepresentation(Account account) { this.mail = StringUtils .trimToNull(account.getAccountRepresentation()); if (account instanceof User) { User user = (User) account; this.firstName = StringUtils.trimToNull(user.getFirstName()); this.lastName = StringUtils.trimToNull(user.getLastName()); this.mail = StringUtils.trimToNull(user.getMail()); } } public String getContactRepresentation() { return getContactRepresentation(false); } public String getContactRepresentation(boolean includeMail) { if (this.firstName == null || this.lastName == null) return this.mail; StringBuilder res = new StringBuilder(); res.append(firstName); res.append(" "); res.append(lastName); if (includeMail) { res.append(" ("); res.append(mail); res.append(")"); } return res.toString(); } } /** * XXX HACK * * Helper using LinkedHashMap to chain the Key/Value substitution * in mail templates. * * @author nbertrand */ private class MailContainerBuilder { @SuppressWarnings("serial") private class KeyValueChain extends LinkedHashMap<String, String> { public KeyValueChain add(String key, String value) { logger.debug("Adding K/V pair: [" + key + ", " + value + "]"); super.put(key, StringUtils.defaultString(value)); return this; } public String build(String input) { logger.debug("Building mail template."); logger.debug("\tinput: " + input); String ret = input; for (Map.Entry<String, String> e : entrySet()) { ret = StringUtils.replace(ret, "${" + e.getKey() + "}", e.getValue()); } logger.debug("\tret: " + ret); return ret; } } private KeyValueChain subjectChain; private KeyValueChain greetingsChain; private KeyValueChain bodyChain; private KeyValueChain footerChain; private KeyValueChain layoutChain; public MailContainerBuilder() { super(); subjectChain = new KeyValueChain(); greetingsChain = new KeyValueChain(); bodyChain = new KeyValueChain(); footerChain = new KeyValueChain(); layoutChain = new KeyValueChain(); } public KeyValueChain getSubjectChain() { return subjectChain; } public KeyValueChain getGreetingsChain() { return greetingsChain; } public KeyValueChain getBodyChain() { return bodyChain; } public KeyValueChain getFooterChain() { return footerChain; } public KeyValueChain getLayoutChain() { return layoutChain; } } public MailBuildingServiceImpl(boolean displayLogo, final DomainBusinessService domainBusinessService, final FunctionalityReadOnlyService functionalityReadOnlyService, final MailActivationBusinessService mailActivationBusinessService, boolean insertLicenceTerm, String receivedSharesUrlSuffix, String documentsUrlSuffix ) throws BusinessException { this.displayLogo = displayLogo; this.domainBusinessService = domainBusinessService; this.insertLicenceTerm = insertLicenceTerm; this.functionalityReadOnlyService = functionalityReadOnlyService; this.mailActivationBusinessService = mailActivationBusinessService; this.downloaded.put(Language.ENGLISH, "DOWNLOADED"); this.notDownloaded.put(Language.ENGLISH, "NOT DOWNLOADED"); this.shareWith.put(Language.ENGLISH, "Shared with"); this.anonymouslySharedWith.put(Language.ENGLISH, "Anonymously shared with"); this.downloaded.put(Language.FRENCH, "TÉLÉCHARGÉ"); this.notDownloaded.put(Language.FRENCH, "NON TÉLÉCHARGÉ"); this.shareWith.put(Language.FRENCH, "Partagé avec"); this.anonymouslySharedWith.put(Language.FRENCH, "Partagé anonymement avec"); this.receivedSharesUrlSuffix = receivedSharesUrlSuffix; this.documentsUrlSuffix = documentsUrlSuffix; } private String formatCreationDate(Account account, Entry entry) { Locale locale = account.getJavaExternalMailLocale(); DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, locale); return formatter.format(entry.getCreationDate().getTime()); } private String formatDeletionDate(Account account) { Locale locale = account.getJavaExternalMailLocale(); DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, locale); return formatter.format(new Date()); } private String formatCreationDate(Account account, UploadRequest uploadRequest) { Locale locale = account.getJavaExternalMailLocale(); DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, locale); return formatter.format(uploadRequest.getCreationDate().getTime()); } private String formatActivationDate(Account account, UploadRequest uploadRequest) { Locale locale = account.getJavaExternalMailLocale(); DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, locale); return formatter.format(uploadRequest.getActivationDate().getTime()); } private String formatExpirationDate(Account account, UploadRequest uploadRequest) { if (uploadRequest.getExpiryDate() != null) { Locale locale = account.getJavaExternalMailLocale(); DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, locale); return formatter.format(uploadRequest.getExpiryDate().getTime()); } return ""; } @Override public MailContainerWithRecipient buildAnonymousDownload( AnonymousShareEntry shareEntry) throws BusinessException { User sender = (User) shareEntry.getEntryOwner(); if (isDisable(sender, MailActivationType.ANONYMOUS_DOWNLOAD)) { return null; } String documentName = shareEntry.getDocumentEntry().getName(); String email = shareEntry.getAnonymousUrl().getContact().getMail(); String actorRepresentation = new ContactRepresentation(email) .getContactRepresentation(); MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( sender.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", actorRepresentation); builder.getGreetingsChain() .add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()); builder.getBodyChain() .add("email", email) .add("documentNames", documentName); container.setRecipient(sender.getMail()); container.setFrom(getFromMailAddress(sender)); container.setReplyTo(email); return buildMailContainer(cfg, container, null, MailContentType.ANONYMOUS_DOWNLOAD, builder); } @Override public MailContainerWithRecipient buildRegisteredDownload( ShareEntry shareEntry) throws BusinessException { User sender = (User) shareEntry.getEntryOwner(); if (isDisable(sender, MailActivationType.REGISTERED_DOWNLOAD)) { return null; } String documentName = shareEntry.getDocumentEntry().getName(); String actorRepresentation = new ContactRepresentation(shareEntry.getRecipient()) .getContactRepresentation(); MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( sender.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", actorRepresentation); builder.getGreetingsChain() .add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()); builder.getBodyChain() .add("recipientFirstName", shareEntry.getRecipient().getFirstName()) .add("recipientLastName", shareEntry.getRecipient().getLastName()) .add("documentNames", documentName); container.setRecipient(sender); container.setFrom(getFromMailAddress(sender)); container.setReplyTo(shareEntry.getRecipient()); return buildMailContainer(cfg, container, null, MailContentType.REGISTERED_DOWNLOAD, builder); } @Override public MailContainerWithRecipient buildNewGuest(Account s, User recipient, String password) throws BusinessException { if (isDisable(recipient, MailActivationType.NEW_GUEST)) { return null; } User recipientUser = (User)recipient; User sender = (User) s; MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( recipientUser.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getGreetingsChain() .add("firstName", recipientUser.getFirstName()) .add("lastName", recipientUser.getLastName()); String linShareUrl = getLinShareUrlForAUserRecipient(recipientUser); builder.getBodyChain() .add("url", linShareUrl) .add("ownerFirstName", sender.getFirstName()) .add("ownerLastName", sender.getLastName()) .add("mail", recipientUser.getMail()) .add("password", linShareUrl + "#/external/reset/" + password); container.setRecipient(recipientUser); container.setReplyTo(sender); container.setFrom(getFromMailAddress(recipientUser)); return buildMailContainer(cfg, container, null, MailContentType.NEW_GUEST, builder); } @Override public MailContainerWithRecipient buildResetPassword(Guest recipient, String password) throws BusinessException { if (isDisable(recipient, MailActivationType.RESET_PASSWORD)) { return null; } MailConfig cfg = recipient.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( recipient.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getGreetingsChain() .add("firstName", recipient.getFirstName()) .add("lastName", recipient.getLastName()); String linShareUrl = getLinShareUrlForAUserRecipient(recipient); builder.getBodyChain() .add("url", linShareUrl) .add("mail", recipient.getMail()) .add("password", linShareUrl + "#/external/reset/" + password); container.setRecipient(recipient.getMail()); container.setFrom(getFromMailAddress(recipient)); return buildMailContainer(cfg, container, null, MailContentType.RESET_PASSWORD, builder); } @Override public MailContainerWithRecipient buildSharedDocUpdated( Entry shareEntry, String oldDocName, long size) throws BusinessException { /* * XXX ugly */ User sender = (User) shareEntry.getEntryOwner(); String actorRepresentation = new ContactRepresentation(sender) .getContactRepresentation(); String url, firstName, lastName, mimeType, fileName, recipient; // ugly Language locale; if (shareEntry instanceof AnonymousShareEntry) { AnonymousShareEntry e = (AnonymousShareEntry) shareEntry; if (isDisable(e.getAnonymousUrl().getContact(), sender, MailActivationType.SHARED_DOC_UPDATED)) { return null; } url = e.getAnonymousUrl() .getFullUrl(getLinShareUrlForAContactRecipient(sender)); recipient = e.getAnonymousUrl().getContact().getMail(); locale = sender.getExternalMailLocale(); firstName = ""; lastName = recipient; mimeType = e.getDocumentEntry().getType(); fileName = e.getDocumentEntry().getName(); } else { ShareEntry e = (ShareEntry) shareEntry; if (isDisable(e.getRecipient(), MailActivationType.SHARED_DOC_UPDATED)) { return null; } url = getLinShareUrlForAUserRecipient( e.getRecipient()); recipient = e.getRecipient().getMail(); locale = e.getRecipient().getExternalMailLocale(); firstName = e.getRecipient().getFirstName(); lastName = e.getRecipient().getLastName(); mimeType = e.getDocumentEntry().getType(); fileName = e.getDocumentEntry().getName(); } MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( locale); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", actorRepresentation); builder.getGreetingsChain() .add("firstName", firstName) .add("lastName", lastName); builder.getBodyChain() .add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()) .add("fileName", fileName) .add("fileSize", DocumentUtils.humanReadableByteCount(size, false, locale)) .add("fileOldName", oldDocName) .add("mimeType", mimeType) .add("url", url) .add("urlparam", ""); container.setRecipient(recipient); container.setFrom(getFromMailAddress(sender)); container.setReplyTo(sender.getMail()); return buildMailContainer(cfg, container, null, MailContentType.SHARED_DOC_UPDATED, builder); } @Override public MailContainerWithRecipient buildSharedDocDeleted(Account actor, Entry shareEntry) throws BusinessException { /* * XXX very very ugly */ User sender = (User) shareEntry.getEntryOwner(); String actorRepresentation = new ContactRepresentation(sender) .getContactRepresentation(); String firstName, lastName, fileName, recipient; // ugly Language locale; if (shareEntry instanceof AnonymousShareEntry) { AnonymousShareEntry e = (AnonymousShareEntry) shareEntry; recipient = e.getAnonymousUrl().getContact().getMail(); if (isDisable(e.getAnonymousUrl().getContact(), sender, MailActivationType.SHARED_DOC_DELETED)) { return null; } locale = sender.getExternalMailLocale(); firstName = ""; lastName = recipient; fileName = e.getDocumentEntry().getName(); } else { ShareEntry e = (ShareEntry) shareEntry; recipient = e.getRecipient().getMail(); if (isDisable(e.getRecipient(), MailActivationType.SHARED_DOC_DELETED)) { return null; } locale = e.getRecipient().getExternalMailLocale(); firstName = e.getRecipient().getFirstName(); lastName = e.getRecipient().getLastName(); fileName = e.getDocumentEntry().getName(); } MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( locale); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", actorRepresentation); builder.getGreetingsChain() .add("firstName", firstName) .add("lastName", lastName); builder.getBodyChain() .add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()) .add("documentName", fileName); container.setRecipient(recipient); container.setFrom(getFromMailAddress(sender)); container.setReplyTo(sender.getMail()); return buildMailContainer(cfg, container, null, MailContentType.SHARED_DOC_DELETED, builder); } @Override public MailContainerWithRecipient buildSharedDocUpcomingOutdated( Entry shareEntry, Integer days) throws BusinessException { /* * XXX very very ugly */ User sender = (User) shareEntry.getEntryOwner(); String actorRepresentation = new ContactRepresentation(sender) .getContactRepresentation(); String url, firstName, lastName, fileName, recipient; // ugly Language locale; if (shareEntry instanceof AnonymousShareEntry) { AnonymousShareEntry e = (AnonymousShareEntry) shareEntry; recipient = e.getAnonymousUrl().getContact().getMail(); if (isDisable(e.getAnonymousUrl().getContact(), sender, MailActivationType.SHARED_DOC_UPCOMING_OUTDATED)) { return null; } url = e.getAnonymousUrl() .getFullUrl(getLinShareUrlForAContactRecipient(sender)); locale = sender.getExternalMailLocale(); firstName = ""; lastName = recipient; fileName = e.getDocumentEntry().getName(); } else { ShareEntry e = (ShareEntry) shareEntry; if (isDisable(e.getRecipient(), MailActivationType.SHARED_DOC_UPCOMING_OUTDATED)) { return null; } url = getLinShareUrlForAUserRecipient( e.getRecipient()); recipient = e.getRecipient().getMail(); locale = e.getRecipient().getExternalMailLocale(); firstName = e.getRecipient().getFirstName(); lastName = e.getRecipient().getLastName(); fileName = e.getDocumentEntry().getName(); } MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( locale); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", actorRepresentation); builder.getGreetingsChain() .add("firstName", firstName) .add("lastName", lastName); builder.getBodyChain() .add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()) .add("documentName", fileName) .add("nbDays", days.toString()) .add("url", url) .add("urlparam", ""); container.setRecipient(recipient); container.setFrom(getFromMailAddress(sender)); container.setReplyTo(sender.getMail()); return buildMailContainer(cfg, container, null, MailContentType.SHARED_DOC_UPCOMING_OUTDATED, builder); } @Override public MailContainerWithRecipient buildDocUpcomingOutdated( DocumentEntry document, Integer days) throws BusinessException { User owner = (User) document.getEntryOwner(); if (isDisable(owner, MailActivationType.DOC_UPCOMING_OUTDATED)) { return null; } String actorRepresentation = new ContactRepresentation(owner) .getContactRepresentation(); String url = getLinShareUrlForAUserRecipient(owner); MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( owner.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", actorRepresentation); builder.getGreetingsChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()); builder.getBodyChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()) .add("documentName", document.getName()) .add("nbDays", days.toString()) .add("url", url) .add("urlparam", ""); container.setRecipient(owner.getMail()); container.setFrom(getFromMailAddress(owner)); return buildMailContainer(cfg, container, null, MailContentType.DOC_UPCOMING_OUTDATED, builder); } @Override public MailContainerWithRecipient buildNewSharing(User sender, MailContainer input, User recipient, Set<ShareEntry> shares) throws BusinessException { if (isDisable(recipient, MailActivationType.NEW_SHARING)) { return null; } String actorRepresentation = new ContactRepresentation(sender) .getContactRepresentation(); String url = getLinShareUrlForAUserRecipient(recipient); MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( recipient.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); StringBuffer names = new StringBuffer(); long shareSize = 0; for (ShareEntry share : shares) { if (recipient.getLsUuid().equals(share.getRecipient().getLsUuid())) { shareSize += 1; names.append("<li><a href='" + getReceivedSharedFileDownloadLink(recipient, share) + "'>" + share.getName() + "</a></li>"); } } builder.getSubjectChain() .add("actorSubject", input.getSubject()) .add("actorRepresentation", actorRepresentation); builder.getGreetingsChain() .add("firstName", recipient.getFirstName()) .add("lastName", recipient.getLastName()); builder.getBodyChain() .add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()) .add("number", "" + shareSize) .add("documentNames", names.toString()) .add("url", url) .add("urlparam", ""); container.setSubject(input.getSubject()); container.setRecipient(recipient); container.setFrom(getFromMailAddress(sender)); container.setReplyTo(sender.getMail()); return buildMailContainer(cfg, container, input.getPersonalMessage(), MailContentType.NEW_SHARING, builder); } @Override public MailContainerWithRecipient buildNoDocumentHasBeenDownloadedAcknowledgement( ShareEntryGroup shareEntryGroup) throws BusinessException { if (isDisable(shareEntryGroup.getOwner(), MailActivationType.UNDOWNLOADED_SHARED_DOCUMENTS_ALERT)) { return null; } User owner = (User) shareEntryGroup.getOwner(); MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( owner.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); Language userLocale = owner.getExternalMailLocale(); DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.forLanguageTag(userLocale.getTapestryLocale())); String creationDate = df.format(shareEntryGroup.getCreationDate()); String expirationDate = ""; if (shareEntryGroup.getExpirationDate() != null) { expirationDate = df.format(shareEntryGroup.getExpirationDate()); } StringBuffer shareInfoBuffer = new StringBuffer(); Map<DocumentEntry, List<Entry>> tmpDocuments = shareEntryGroup .getTmpDocuments(); for (Map.Entry<DocumentEntry, List<Entry>> tmpDocument : tmpDocuments .entrySet()) { DocumentEntry documentEntry = tmpDocument.getKey(); boolean oneShareWasDownloaded = oneShareWasDownloaded(documentEntry, shareEntryGroup); boolean allSharesWereDownloaded = allSharesWereDownloaded(documentEntry, shareEntryGroup); shareInfoBuffer .append("<tr style='height: 10px;' ></tr>") .append("<tr style='border-bottom: 1px solid black;'>") .append("<td style='margin-bottom: 5px; padding-bottom: 3px; padding-top: 10px;'>") .append("<a style='text-decoration: none; font-size: 13px;' href='") .append(getOwnerDocumentLink(owner, documentEntry)) .append("'>") .append(documentEntry.getName()) .append("</a> :") .append("</td>") .append("<td style='padding: 5px 0px; width: 130px;'>") .append(flagDocumentDownloadedOrNotForUSDA(userLocale, oneShareWasDownloaded, allSharesWereDownloaded, false)) .append("</td>") .append("</tr>"); for (Entry entry : tmpDocuments.get(documentEntry)) { shareInfoBuffer.append(flagShareRowOrNotForUSDA(entry, userLocale, oneShareWasDownloaded, allSharesWereDownloaded)); } shareInfoBuffer.append("<tr style='height: 5px;' ></tr>"); } builder.getSubjectChain().add("subject", shareEntryGroup.getSubject()) .add("date", creationDate); builder.getGreetingsChain().add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()); builder.getBodyChain().add("creationDate", creationDate) .add("expirationDate", expirationDate) .add("shareInfo", shareInfoBuffer.toString()); container.setSubject(shareEntryGroup.getSubject()); container.setRecipient(owner.getMail()); container.setFrom(getFromMailAddress((User) owner)); return buildMailContainer(cfg, container, "", MailContentType.UNDOWNLOADED_SHARED_DOCUMENT_ALERT, builder); } private boolean allSharesWereDownloaded(DocumentEntry documentEntry, ShareEntryGroup shareEntryGroup) { Map<DocumentEntry, Boolean> map = shareEntryGroup .getTmpAllSharesWereNotDownloaded(); boolean allSharesWereDownloaded = false; if (map.get(documentEntry) == null) { allSharesWereDownloaded = true; } return allSharesWereDownloaded; } private Boolean oneShareWasDownloaded(DocumentEntry documentEntry, ShareEntryGroup shareEntryGroup) { Boolean wasDownloaded = false; Map<DocumentEntry, Boolean> map = shareEntryGroup .getTmpDocumentsWereDownloaded(); if (map.size() > 0) { wasDownloaded = map.get(documentEntry); if (wasDownloaded == null) { wasDownloaded = false; } } return wasDownloaded; } private String flagShareRowOrNotForUSDA(Entry entry, Language userLocale, boolean oneShareWasDownloaded, boolean allSharesWereDownloaded) { StringBuffer sb = new StringBuffer(); sb.append("<tr>"); sb.append("<td style='padding: 5px 40px 5px 10px;'>"); if (entry instanceof ShareEntry) { ShareEntry share = (ShareEntry) entry; boolean shareDownloaded = share.getDownloaded() > 0; sb.append(shareWith.get(userLocale)) .append(" : <b>") .append(share.getRecipient().getFullName()) .append("</b> (") .append(share.getRecipient().getMail() + ")") .append("</td>") .append("<td>") .append(flagShareDownloadedOrNotForUSDA(oneShareWasDownloaded, shareDownloaded, userLocale, allSharesWereDownloaded)); } else { AnonymousShareEntry aShare = (AnonymousShareEntry) entry; boolean shareDownloaded = aShare.getDownloaded() > 0; sb.append(anonymouslySharedWith.get(userLocale)) .append(" : <b>") .append(aShare.getAnonymousUrl().getContact().getMail()) .append("</b>") .append("</td>") .append("<td>") .append(flagShareDownloadedOrNotForUSDA(oneShareWasDownloaded, shareDownloaded, userLocale, allSharesWereDownloaded)); } sb.append("</td>"); sb.append("</tr>"); return sb.toString(); } private String flagShareDownloadedOrNotForUSDA( boolean oneShareWasDownloaded, boolean shareDownloaded, Language userLocale, boolean allSharesWereDownloaded) { String res = ""; if (!allSharesWereDownloaded) { // check if there is at least one download if (oneShareWasDownloaded) { if (shareDownloaded) { res = downloadedFlag(userLocale); } else { res = unDownloadedFlag(userLocale, true); } } } return res; } private String flagDocumentDownloadedOrNotForUSDA(Language userLocale, boolean oneShareWasDownloaded, boolean allSharesWereDownloaded, boolean warning) { String res = ""; if (allSharesWereDownloaded) { res = downloadedFlag(userLocale); } else { if (!oneShareWasDownloaded) { // No download at all. res = unDownloadedFlag(userLocale, false); } } return res; } private String unDownloadedFlag(Language userLocale, boolean warning) { StringBuffer sb = new StringBuffer(); sb.append("<h5 ") .append("style='") .append(" display: inline-block; color: white;") .append(" padding: 3px 0px;") .append(" margin: 0px; width: 100%; text-align: center;"); if (warning) { // Orange sb.append(" background-color: #FF8C00;"); sb.append("' >"); sb.append(notDownloaded.get(userLocale)); } else { // Red sb.append(" background-color: #EE0037;"); sb.append("' >"); sb.append(notDownloaded.get(userLocale)); } sb.append("</h5>"); return sb.toString(); } private String downloadedFlag(Language userLocale) { StringBuffer sb = new StringBuffer(); sb.append("<h5 ") .append("style='") .append(" display: inline-block; color: white;") .append(" padding: 3px 0px;") .append(" background-color: #00A114;") .append(" margin: 0px; width: 100%; text-align: center;") .append("' >") .append(downloaded.get(userLocale)) .append("</h5>"); return sb.toString(); } private MailContainerWithRecipient buildNewAnonymousSharing(User sender, MailContainer input, AnonymousUrl anonUrl, MailContentType mailContentType) throws BusinessException { if (isDisable(anonUrl.getContact(), sender, MailActivationType.NEW_SHARING)) { return null; } String actorRepresentation = new ContactRepresentation(sender) .getContactRepresentation(); String url = anonUrl .getFullUrl(getLinShareUrlForAContactRecipient(sender)); MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( sender.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); StringBuffer names = new StringBuffer(); for (String n : anonUrl.getDocumentNames()) { names.append("<li>" + n + "</li>"); } builder.getSubjectChain() .add("actorSubject", input.getSubject()) .add("actorRepresentation", actorRepresentation); builder.getGreetingsChain() .add("firstName", "") .add("lastName", anonUrl.getContact().getMail()); builder.getBodyChain() .add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()) .add("number", "" + anonUrl.getDocumentNames().size()) .add("documentNames", names.toString()) .add("password", anonUrl.getTemporaryPlainTextPassword()) .add("jwsEncryptUrl", getJwsEncryptUrlString(getLinShareUrlForAContactRecipient(sender))) .add("url", url) .add("urlparam", ""); container.setSubject(input.getSubject()); container.setRecipient(anonUrl.getContact()); container.setFrom(getFromMailAddress(sender)); container.setReplyTo(sender.getMail()); return buildMailContainer(cfg, container, input.getPersonalMessage(), mailContentType, builder); } @Override public MailContainerWithRecipient buildNewSharing(User sender, MailContainer input, AnonymousUrl anonUrl) throws BusinessException { return buildNewAnonymousSharing(sender, input, anonUrl, MailContentType.NEW_SHARING); } @Override public MailContainerWithRecipient buildNewSharingProtected(User sender, MailContainer input, AnonymousUrl anonUrl) throws BusinessException { return buildNewAnonymousSharing(sender, input, anonUrl, MailContentType.NEW_SHARING_PROTECTED); } @Override public MailContainerWithRecipient buildNewSharingCyphered( User sender, MailContainer input, AnonymousUrl anonUrl) throws BusinessException { return buildNewAnonymousSharing(sender, input, anonUrl, MailContentType.NEW_SHARING_CYPHERED); } @Override public MailContainerWithRecipient buildNewSharingCypheredProtected( User sender, MailContainer input, AnonymousUrl anonUrl) throws BusinessException { return buildNewAnonymousSharing(sender, input, anonUrl, MailContentType.NEW_SHARING_CYPHERED_PROTECTED); } @Override public MailContainerWithRecipient buildNewSharingCyphered(User sender, MailContainer input, User recipient, Set<ShareEntry> shares) throws BusinessException { if (isDisable(recipient, MailActivationType.NEW_SHARING)) { return null; } String actorRepresentation = new ContactRepresentation(sender) .getContactRepresentation(); String url = getLinShareUrlForAUserRecipient(recipient); MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( recipient.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); StringBuffer names = new StringBuffer(); long shareSize = 0; for (ShareEntry share : shares) { if (recipient.getLsUuid().equals(share.getRecipient().getLsUuid())) { shareSize += 1; names.append("<li><a href='" + getReceivedSharedFileDownloadLink(recipient, share) + "'>" + share.getName() + "</a></li>"); } } builder.getSubjectChain() .add("actorSubject", input.getSubject()) .add("actorRepresentation", actorRepresentation); builder.getGreetingsChain() .add("firstName", recipient.getFirstName()) .add("lastName", recipient.getLastName()); builder.getBodyChain() .add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()) .add("number", "" + shareSize) .add("documentNames", names.toString()) .add("jwsEncryptUrl", getJwsEncryptUrlString(url)) .add("url", url) .add("urlparam", ""); container.setSubject(input.getSubject()); container.setRecipient(recipient); container.setFrom(getFromMailAddress(sender)); container.setReplyTo(sender.getMail()); return buildMailContainer(cfg, container, input.getPersonalMessage(), MailContentType.NEW_SHARING_CYPHERED, builder); } @Override public MailContainerWithRecipient buildCreateUploadProposition(User recipient, UploadProposition proposition) throws BusinessException { if (isDisable(recipient, MailActivationType.UPLOAD_PROPOSITION_CREATED)) { return null; } MailConfig cfg = recipient.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( recipient.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", proposition.getMail()) .add("subject", proposition.getSubject()); builder.getGreetingsChain() .add("firstName", recipient.getFirstName()) .add("lastName", recipient.getLastName()); builder.getBodyChain() .add("subject", proposition.getSubject()) .add("body", proposition.getBody()) .add("firstName", proposition.getFirstName()) .add("lastName", proposition.getLastName()) .add("mail", proposition.getMail()) .add("uploadPropositionUrl", getUploadPropositionUrl(recipient)); container.setRecipient(recipient.getMail()); container.setFrom(getFromMailAddress(recipient)); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_PROPOSITION_CREATED, builder); } @Override public MailContainerWithRecipient buildRejectUploadProposition(User sender, UploadProposition proposition) throws BusinessException { if (isDisable(sender, MailActivationType.UPLOAD_PROPOSITION_REJECTED)) { return null; } MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( sender.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", new ContactRepresentation(sender).getContactRepresentation()) .add("subject", proposition.getSubject()); builder.getGreetingsChain() .add("firstName", proposition.getFirstName()) .add("lastName", proposition.getLastName()); builder.getBodyChain() .add("subject", proposition.getSubject()) .add("body", proposition.getBody()) .add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()) .add("mail", proposition.getMail()); container.setRecipient(proposition.getMail()); container.setFrom(getFromMailAddress(sender)); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_PROPOSITION_REJECTED, builder); } // Update @Override public MailContainerWithRecipient buildUpdateUploadRequest(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(request.getContact(), owner, MailActivationType.UPLOAD_REQUEST_UPDATED)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", new ContactRepresentation(owner).getContactRepresentation()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", request.getContact().getMail()) .add("lastName", ""); builder.getBodyChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()); container.setRecipient(request.getContact()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_UPDATED, builder); } @Override public MailContainerWithRecipient buildActivateUploadRequest(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(request.getContact(), owner, MailActivationType.UPLOAD_REQUEST_ACTIVATED)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", new ContactRepresentation(owner).getContactRepresentation()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", request.getContact().getMail()) .add("lastName", ""); // Why first name and last name ? builder.getBodyChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()) .add("url", request.getFullUrl(getLinShareUploadRequestUrl(owner))) .add("expirationDate", formatExpirationDate(owner, request.getUploadRequest())) .add("ownerFirstName", owner.getFirstName()) .add("ownerLastName", owner.getLastName()) .add("ownerMail", owner.getMail()) .add("maxFileCount", request.getUploadRequest().getMaxFileCount().toString()) .add("password", request.getTemporaryPlainTextPassword()); container.setRecipient(request.getContact()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_ACTIVATED, builder); } private String getFromMailAddress(User owner) { String fromMail = functionalityReadOnlyService .getDomainMailFunctionality(owner.getDomain()).getValue(); return fromMail; } // TODO : to be used ? @Override public MailContainerWithRecipient buildFilterUploadRequest(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(request.getContact(), owner, MailActivationType.UPLOAD_REQUEST_AUTO_FILTER)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()); builder.getBodyChain() .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()); container.setRecipient(request.getContact()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_AUTO_FILTER, builder); } @Override public MailContainerWithRecipient buildCreateUploadRequest(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(request.getContact(), owner, MailActivationType.UPLOAD_REQUEST_CREATED)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", new ContactRepresentation(owner).getContactRepresentation()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", request.getContact().getMail()) .add("lastName", ""); builder.getBodyChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()) .add("expirationDate", formatExpirationDate(owner, request.getUploadRequest())) .add("ownerFirstName", owner.getFirstName()) .add("ownerLastName", owner.getLastName()) .add("ownerMail", owner.getMail()) .add("maxFileCount", request.getUploadRequest().getMaxFileCount().toString()) .add("activationDate", formatActivationDate(owner, request.getUploadRequest())); container.setRecipient(request.getContact()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_CREATED, builder); } @Override public MailContainerWithRecipient buildAckUploadRequest(User owner, UploadRequestUrl request, UploadRequestEntry entry) throws BusinessException { if (isDisable(owner, MailActivationType.UPLOAD_REQUEST_ACKNOWLEDGEMENT)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( owner.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); String contact = request.getContact().getMail(); builder.getSubjectChain() .add("actorRepresentation", contact) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()); builder.getBodyChain() .add("firstName", contact) .add("lastName", "") .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()) .add("fileSize", DocumentUtils.humanReadableByteCount(entry.getDocumentEntry().getSize(), false, owner.getExternalMailLocale())) .add("fileName", entry.getDocumentEntry().getName()) .add("depositDate", formatCreationDate(owner, entry)); container.setRecipient(owner.getMail()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(contact); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_ACKNOWLEDGMENT, builder); } @Override public MailContainerWithRecipient buildAckDeleteFileUploadRequest(User owner, UploadRequestUrl request, UploadRequestEntry entry) throws BusinessException { if (isDisable(owner, MailActivationType.UPLOAD_REQUEST_FILE_DELETED_BY_SENDER)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); String contact = request.getContact().getMail(); builder.getSubjectChain() .add("actorRepresentation", contact) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()); builder.getBodyChain() .add("firstName", contact) .add("lastName", "") .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()) .add("fileSize", DocumentUtils.humanReadableByteCount(entry.getSize(), false, owner.getExternalMailLocale())) .add("fileName", entry.getName()) .add("deleteDate", formatDeletionDate(owner)); container.setRecipient(owner.getMail()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(contact); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_FILE_DELETED_BY_SENDER, builder); } @Override public MailContainerWithRecipient buildRemindUploadRequest(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(request.getContact(), owner, MailActivationType.UPLOAD_REQUEST_REMINDER)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", new ContactRepresentation(owner).getContactRepresentation()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", request.getContact().getMail()) .add("lastName", ""); builder.getBodyChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()) .add("url", request.getFullUrl(getLinShareUploadRequestUrl(owner))) .add("password", request.getTemporaryPlainTextPassword()); container.setRecipient(request.getContact()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_REMINDER, builder); } @Override public MailContainerWithRecipient buildUploadRequestBeforeExpiryWarnOwner(User owner, UploadRequest request) throws BusinessException { if (isDisable(owner, MailActivationType.UPLOAD_REQUEST_WARN_OWNER_BEFORE_EXPIRY)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("subject", request.getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()); builder.getBodyChain() .add("subject", request.getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequestGroup().getBody()) .add("expirationDate", formatExpirationDate(owner, request)) .add("creationDate", formatCreationDate(owner, request)); for (UploadRequestUrl uru : request.getUploadRequestURLs()) { builder.getBodyChain().add( "recipientMail", uru.getContact().getMail() ) .add("files", getFileNames(uru)); } container.setRecipient(owner.getMail()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_WARN_OWNER_BEFORE_EXPIRY, builder); } @Override public MailContainerWithRecipient buildUploadRequestBeforeExpiryWarnRecipient(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(request.getContact(), owner, MailActivationType.UPLOAD_REQUEST_WARN_RECIPIENT_BEFORE_EXPIRY)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", request.getContact().getMail()) .add("lastName", ""); builder.getBodyChain() .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()) .add("files", getFileNames(request)) .add("ownerFirstName",owner.getFirstName()) .add("ownerLastName",owner.getLastName()) .add("ownerMail",owner.getMail()) .add("ownerRepresentation", new ContactRepresentation(owner).getContactRepresentation()) .add("expirationDate", formatExpirationDate(owner, request.getUploadRequest())) .add("creationDate", formatCreationDate(owner, request.getUploadRequest())) .add("url", request.getFullUrl(getLinShareUploadRequestUrl(owner))); container.setRecipient(request.getContact()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_WARN_RECIPIENT_BEFORE_EXPIRY, builder); } @Override public MailContainerWithRecipient buildUploadRequestExpiryWarnOwner(User owner, UploadRequest request) throws BusinessException { if (isDisable(owner, MailActivationType.UPLOAD_REQUEST_WARN_OWNER_EXPIRY)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("subject", request.getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()); builder.getBodyChain() .add("subject", request.getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequestGroup().getBody()) .add("expirationDate", formatExpirationDate(owner, request)) .add("creationDate", formatCreationDate(owner, request)); for (UploadRequestUrl uru : request.getUploadRequestURLs()) { builder.getBodyChain().add( "recipientMail", uru.getContact().getMail() ) .add("files", getFileNames(uru)); } container.setRecipient(owner.getMail()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_WARN_OWNER_EXPIRY, builder); } @Override public MailContainerWithRecipient buildUploadRequestExpiryWarnRecipient(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(request.getContact(), owner, MailActivationType.UPLOAD_REQUEST_WARN_RECIPIENT_EXPIRY)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", request.getContact().getMail()) .add("lastName", ""); builder.getBodyChain() .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()) .add("files", getFileNames(request)) .add("ownerFirstName",owner.getFirstName()) .add("ownerLastName",owner.getLastName()) .add("ownerMail",owner.getMail()) .add("ownerRepresentation", new ContactRepresentation(owner).getContactRepresentation()) .add("expirationDate", formatExpirationDate(owner, request.getUploadRequest())) .add("creationDate", formatCreationDate(owner, request.getUploadRequest())) .add("url", request.getFullUrl(getLinShareUploadRequestUrl(owner))); container.setRecipient(request.getContact()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_WARN_RECIPIENT_EXPIRY, builder); } @Override public MailContainerWithRecipient buildCloseUploadRequestByRecipient(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(owner, MailActivationType.UPLOAD_REQUEST_CLOSED_BY_RECIPIENT)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", request.getContact().getMail()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()); builder.getBodyChain() .add("firstName", request.getContact().getMail()) .add("lastName", "") .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()) .add("files", getFileNames(request)); container.setRecipient(owner); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(request.getContact()); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_CLOSED_BY_RECIPIENT, builder); } private String getFileNames( UploadRequestUrl requestUrl) { ImmutableSet<FileRepresentation> files = FluentIterable .from(requestUrl.getUploadRequestEntries()) .transform(new Function<UploadRequestEntry, FileRepresentation>() { @Override public FileRepresentation apply(UploadRequestEntry ure) { return new FileRepresentation(ure); }}) .toSet(); if (files.size() > 0) { return files.toString(); } return " - "; } // TODO : to be use. @Override public MailContainerWithRecipient buildCloseUploadRequestByOwner(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(request.getContact(), owner, MailActivationType.UPLOAD_REQUEST_CLOSED_BY_OWNER)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", new ContactRepresentation(owner).getContactRepresentation()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", request.getContact().getMail()) .add("lastName", ""); builder.getBodyChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()) .add("files", getFileNames(request)); container.setRecipient(request.getContact()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_CLOSED_BY_OWNER, builder); } @Override public MailContainerWithRecipient buildDeleteUploadRequestByOwner(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(request.getContact(), owner, MailActivationType.UPLOAD_REQUEST_DELETED_BY_OWNER)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", new ContactRepresentation(owner).getContactRepresentation()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", request.getContact().getMail()) .add("lastName", ""); builder.getBodyChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()); container.setRecipient(request.getContact()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(owner); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_DELETED_BY_OWNER, builder); } // TODO : to be use @Override public MailContainerWithRecipient buildErrorUploadRequestNoSpaceLeft(User owner, UploadRequestUrl request) throws BusinessException { if (isDisable(owner, MailActivationType.UPLOAD_REQUEST_NO_SPACE_LEFT)) { return null; } MailConfig cfg = owner.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient container = new MailContainerWithRecipient( request.getLocale()); MailContainerBuilder builder = new MailContainerBuilder(); builder.getSubjectChain() .add("actorRepresentation", request.getContact().getMail()) .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()); builder.getGreetingsChain() .add("firstName", owner.getFirstName()) .add("lastName", owner.getLastName()); builder.getBodyChain() .add("firstName", request.getContact().getMail()) .add("lastName", "") .add("subject", request.getUploadRequest().getUploadRequestGroup().getSubject()) .add("body", request.getUploadRequest().getUploadRequestGroup().getBody()); container.setRecipient(owner.getMail()); container.setFrom(getFromMailAddress(owner)); container.setReplyTo(request.getContact()); return buildMailContainer(cfg, container, null, MailContentType.UPLOAD_REQUEST_NO_SPACE_LEFT, builder); } /* * Helpers */ private String getLinShareUploadRequestUrl(Account sender) { return functionalityReadOnlyService .getUploadRequestFunctionality(sender.getDomain()) .getValue(); } private String getUploadPropositionUrl(Account recipient) { String baseUrl = getLinShareUrlForAUserRecipient(recipient); StringBuffer uploadPropositionUrl = new StringBuffer(); uploadPropositionUrl.append(baseUrl); if (!baseUrl.endsWith("/")) { uploadPropositionUrl.append('/'); } uploadPropositionUrl.append("uploadrequest/proposition"); return uploadPropositionUrl.toString(); } private String getLinShareUrlForAUserRecipient(Account recipient) { String value = functionalityReadOnlyService .getCustomNotificationUrlFunctionality(recipient.getDomain()) .getValue(); if (!value.endsWith("/")) { return value + "/"; } return value; } private String getLinShareUrlForAContactRecipient(Account sender) { StringValueFunctionality notificationUrl = functionalityReadOnlyService .getAnonymousURLNotificationUrl(sender.getDomain()); return notificationUrl.getValue(); } private String getReceivedSharedFileDownloadLink(User recipient, ShareEntry share) { StringBuilder sb = new StringBuilder(); sb.append(getLinShareUrlForAUserRecipient(recipient)); Formatter formatter = new Formatter(sb); formatter.format(receivedSharesUrlSuffix, share.getUuid()); formatter.close(); return sb.toString(); } private String getOwnerDocumentLink(User owner, DocumentEntry doc) { StringBuilder sb = new StringBuilder(); sb.append(getLinShareUrlForAUserRecipient(owner)); Formatter formatter = new Formatter(sb); formatter.format(documentsUrlSuffix, doc.getUuid()); formatter.close(); return sb.toString(); } private String getJwsEncryptUrlString(String rootUrl) { String jwsEncryptUrlString = ""; StringBuffer jwsEncryptUrl = new StringBuffer(); jwsEncryptUrl.append(rootUrl); if (!rootUrl.endsWith("/")) { jwsEncryptUrl.append('/'); } jwsEncryptUrl.append("localDecrypt"); jwsEncryptUrlString = jwsEncryptUrl.toString(); return jwsEncryptUrlString; } /* * MAIL CONTAINER BUILDER SECTION */ private String formatSubjectTemplate(String subject, MailContent mailContent) { if (StringUtils.isBlank(subject) || mailContent.isEnableAS() == false) return mailContent.getSubject(); return mailContent.getAlternativeSubject(); } private String formatPersonalMessage(String pm, Language lang) { if (StringUtils.isBlank(pm)) return ""; return "<p>" + pm.replace("\n", "<br/>") + "</p><hr/><br/>"; } private String formatFooter(String footer, Language lang) { if (insertLicenceTerm) { if (lang.equals(Language.FRENCH)) { footer += "<br/>Vous utilisez la version libre et gratuite de <a href=\"http://www.linshare.org/\" title=\"LinShare\"><strong>LinShare</strong></a>™, développée par Linagora © 2009–2015. Contribuez à la R&D du produit en souscrivant à une offre entreprise.<br/>"; } else { footer += "<br/>You are using the Open Source and free version of <a href=\"http://www.linshare.org/\" title=\"LinShare\"><strong>LinShare</strong></a>™, powered by Linagora © 2009–2015. Contribute to Linshare R&D by subscribing to an Enterprise offer.<br/>"; } } return footer; } private MailContainerWithRecipient buildMailContainer(MailConfig cfg, final MailContainerWithRecipient input, String pm, MailContentType type, MailContainerBuilder builder) throws BusinessException { Language lang = input.getLanguage(); MailContainerWithRecipient container = new MailContainerWithRecipient( input); MailContent mailContent = cfg.findContent(lang, type); String subjectTemplate = formatSubjectTemplate(input.getSubject(), mailContent); String greetings = mailContent.getGreetings(); String body = mailContent.getBody(); MailFooter f = cfg.findFooter(lang); String footer = formatFooter(f.getFooter(), lang); String layout = cfg.getMailLayoutHtml().getLayout(); logger.debug("Building mail content: " + type); pm = formatPersonalMessage(pm, lang); String subject = builder.getSubjectChain().build(subjectTemplate); greetings = builder.getGreetingsChain().build(greetings); body = builder.getBodyChain().build(body); footer = builder.getFooterChain().build(footer); layout = builder.getLayoutChain() .add("image", displayLogo ? LINSHARE_LOGO : "") .add("personalMessage", pm) .add("greetings", greetings) .add("body", body) .add("footer", footer) .add("mailSubject", subject) .build(layout); container.setSubject(subject); container.setContentHTML(layout); container.setContentTXT(container.getContentHTML()); // Message IDs from Web service API (ex Plugin Thunderbird) container.setInReplyTo(input.getInReplyTo()); container.setReferences(input.getReferences()); return container; } private boolean isDisable(Contact contact, Account sender, MailActivationType type) { AbstractDomain recipientDomain = domainBusinessService.findGuestDomain(sender.getDomain()); // guest domain could be inexistent into the database. if (recipientDomain == null) { recipientDomain = sender.getDomain(); } MailActivation mailActivation = mailActivationBusinessService .findForInternalUsage(recipientDomain, type); boolean enable = mailActivation.isEnable(); return !enable; } private boolean isDisable(Account recipient, MailActivationType type) { MailActivation mailActivation = mailActivationBusinessService .findForInternalUsage(recipient.getDomain(), type); boolean enable = mailActivation.isEnable(); return !enable; } @Override public MailContainerWithRecipient buildNewSharingAcknowledgement( User sender, ShareContainer container, Set<Entry> entries) throws BusinessException { if (isDisable(sender, MailActivationType.SHARE_CREATION_ACKNOWLEDGEMENT_FOR_OWNER)) { return null; } MailConfig cfg = sender.getDomain().getCurrentMailConfiguration(); MailContainerWithRecipient mailContainer = new MailContainerWithRecipient( sender.getExternalMailLocale()); MailContainerBuilder builder = new MailContainerBuilder(); SimpleDateFormat formater = new SimpleDateFormat("dd/MM/yyyy HH:mm"); String creationDate = formater.format(entries.iterator().next().getCreationDate().getTime()); Calendar tempExpirationDate = entries.iterator().next().getExpirationDate(); String expirationDate = "None"; if (tempExpirationDate != null) { expirationDate = formater.format(tempExpirationDate.getTime()); } long count = 0; StringBuffer docNames = new StringBuffer(); for (DocumentEntry entry : container.getDocuments()) { docNames.append("<li><a href='" + getOwnerDocumentLink(sender, entry) + "'>" + entry.getName() + "</a></li>"); count++; } StringBuffer recipientNames = new StringBuffer(); for (User rec : container.getShareRecipients()) { recipientNames.append("<li>" + rec.getFullName() + "</li>"); } for (Recipient recipient : container.getAnonymousShareRecipients()) { recipientNames.append("<li>" + recipient.getMail() + "</li>"); } builder.getSubjectChain().add("subject", container.getSubject()); builder.getSubjectChain().add("date", creationDate.toString()); builder.getGreetingsChain().add("firstName", sender.getFirstName()) .add("lastName", sender.getLastName()); builder.getBodyChain() .add("message", container.getMessage()) .add("sharingNote", container.getSharingNote()) .add("documentNames", docNames.toString()) .add("creationDate", creationDate.toString()) .add("expirationDate", expirationDate) // FIX: 1.9.0 .add("expirationdate", expirationDate) .add("fileNumber", "" + count) .add("recipientNames", recipientNames.toString()); mailContainer.setSubject(container.getSubject()); mailContainer.setRecipient(sender); mailContainer.setFrom(getFromMailAddress(sender)); mailContainer.setReplyTo(sender.getMail()); if (container.getMessage() == null) { return buildMailContainer(cfg, mailContainer, null, MailContentType.SHARE_CREATION_ACKNOWLEDGEMENT_FOR_OWNER, builder); } else { return buildMailContainer(cfg, mailContainer, null, MailContentType.SHARE_CREATION_ACKNOWLEDGEMENT_WITH_SPECIAL_MESSAGE_FOR_OWNER, builder); } } }