This is an automated email from the git hooks/post-receive script. New commit to branch feature/7855 in repository faxtomail. See http://git.codelutin.com/faxtomail.git commit ddf286308a9c8110f54fb4c2f196c7af605256b1 Author: Kevin Morin <morin@codelutin.com> Date: Tue Dec 22 16:50:13 2015 +0100 à la réception des emails, remplacement des images dont l'url est incorrecte par l'image par défaut (configurable) (fixes #7855) --- .../faxtomail/FaxToMailConfiguration.java | 4 + .../faxtomail/FaxToMailConfigurationOption.java | 7 + .../i18n/faxtomail-persistence_fr_FR.properties | 1 + .../faxtomail/services/FaxToMailServiceUtils.java | 34 ++++- .../services/service/EmailServiceImpl.java | 3 +- .../services/service/EmailServiceTest.java | 141 ++++++++++++--------- .../faxtomail/ui/swing/util/FaxToMailUIUtil.java | 3 +- 7 files changed, 124 insertions(+), 69 deletions(-) diff --git a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java index f643814..2ce2e93 100644 --- a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java +++ b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java @@ -347,6 +347,10 @@ public class FaxToMailConfiguration extends ApplicationConfiguration { FaxToMailConfigurationOption.CSV_SEPARATOR.getKey()).charAt(0); } + public String getDefaultImageIfMalformedUrl() { + return applicationConfig.getOption(FaxToMailConfigurationOption.DEFAULT_IMAGE_IF_MALFORMED_URL.getKey()); + } + public boolean isFullLaunchMode() { return "full".equals(getFaxToMailLaunchMode()); } diff --git a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java index ab3515c..a99a486 100644 --- a/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java +++ b/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java @@ -193,12 +193,19 @@ public enum FaxToMailConfigurationOption implements ConfigOptionDef { true), // NOT TRANSIENT CONFIG + CSV_SEPARATOR( "faxtomail.csv.separator", n("faxtomail.config.option.csv.separator.description"), ";", char.class), + DEFAULT_IMAGE_IF_MALFORMED_URL( + "faxtomail.defaultImageIfMalformedUrl", + n("faxtomail.config.option.defaultImageIfMalformedUrl.description"), + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABNCAQAAAD6SAkhAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffDBYPJSU3laKFAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAMVJREFUaN7t1zEOgzAQRcHFh6amzoHTQoMQ2LSR8q3Z0trmycVqlm2vbtYa5/Py9l97bY6M6kNSM7qQ3IxHSHLGLSQ74wpJzzhD8jOq2hwZVct3nyGjxoOYmbGOIZkZw4+kZnQhuRmPkOSMW0h2xhWSnnGG5GdUtTkyqtocGa+XndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZndmZ/Td7B+isiSDikctVAAAAAElFTkSuQmCC", + String.class), + // UI FAXTOMAIL_LAUNCH_MODE( diff --git a/faxtomail-persistence/src/main/resources/i18n/faxtomail-persistence_fr_FR.properties b/faxtomail-persistence/src/main/resources/i18n/faxtomail-persistence_fr_FR.properties index e72d288..37424a8 100644 --- a/faxtomail-persistence/src/main/resources/i18n/faxtomail-persistence_fr_FR.properties +++ b/faxtomail-persistence/src/main/resources/i18n/faxtomail-persistence_fr_FR.properties @@ -2,6 +2,7 @@ faxToMail.config= faxtomail.config.option.basedir.description= faxtomail.config.option.csv.separator.description= faxtomail.config.option.data.directory.description= +faxtomail.config.option.defaultImageIfMalformedUrl.description= faxtomail.config.option.demo.directory.description= faxtomail.config.option.i18n.directory.description= faxtomail.config.option.i18n.locale.description= diff --git a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/FaxToMailServiceUtils.java b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/FaxToMailServiceUtils.java index b02bc12..2ec2616 100644 --- a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/FaxToMailServiceUtils.java +++ b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/FaxToMailServiceUtils.java @@ -28,10 +28,14 @@ import com.franciaflex.faxtomail.persistence.entities.MailFolder; import org.apache.commons.httpclient.URIException; import org.apache.commons.httpclient.util.URIUtil; import org.apache.commons.io.Charsets; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import javax.mail.MessagingException; import javax.mail.Part; import javax.mail.internet.ContentType; +import java.net.MalformedURLException; +import java.net.URL; import java.nio.charset.Charset; import java.nio.charset.UnsupportedCharsetException; import java.util.ArrayList; @@ -45,6 +49,11 @@ import java.util.regex.Pattern; */ public class FaxToMailServiceUtils { + /** + * Logger. + */ + private static final Log log = LogFactory.getLog(FaxToMailServiceUtils.class); + public static final Pattern IMG_SRC_PATTERN = Pattern.compile("src=([\"'])(.*?)([\"'])"); public static String addFaxDomainToFaxNumber(String faxNumber, MailFolder folder) { @@ -106,15 +115,16 @@ public class FaxToMailServiceUtils { } /** - * Sometimes, the urls of the images in an email contains spaces. - * But URI.parse(uri) does not accept spaces as a valid character. + * Sometimes, the urls of the images in an email contains spaces or an unknown protocol. + * But URI.parse(uri) does not accept spaces as a valid character nor unknown protocols.. * This method encode the url for them to be compatible with URI.parse + * or replace the url with the one of the error image if the protocol is wrong. * * @param emailContent the content of the email * @return the email content with the url of the images encoded to be parsed by URI * @throws URIException */ - public static String encodeImageSourcesInEmail(String emailContent) throws URIException { + public static String encodeImageSourcesInEmail(String emailContent, String defaultImage) throws URIException { List<String> imgSrcUrls = new ArrayList<>(); Matcher imgSrcMatcher = IMG_SRC_PATTERN.matcher(emailContent); @@ -123,7 +133,23 @@ public class FaxToMailServiceUtils { } for (String imgSrcUrl : imgSrcUrls) { - emailContent = emailContent.replace(imgSrcUrl, URIUtil.encodeQuery(imgSrcUrl)); + + String correctImgUrl; + try { + // test if the url is correct (cf #7855) + new URL(imgSrcUrl); + + correctImgUrl = URIUtil.encodeQuery(imgSrcUrl); + + } catch (MalformedURLException e) { + //if incorrect, replace it with the default image + if (log.isErrorEnabled()) { + log.error("the url of the image " + imgSrcUrl + " is not correct, replace it with the default image"); + } + correctImgUrl = defaultImage; + } + + emailContent = emailContent.replace(imgSrcUrl, correctImgUrl); } return emailContent; diff --git a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java index 5fc7b5a..42d1a73 100644 --- a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java +++ b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java @@ -2136,7 +2136,8 @@ public class EmailServiceImpl extends FaxToMailServiceSupport implements EmailSe // on reformate les urls pour supprimer les caractères qui vont pas (ex espaces) // cf #7740 - content = FaxToMailServiceUtils.encodeImageSourcesInEmail(content); + String defaultImageIfMalformedUrl = serviceContext.getApplicationConfig().getDefaultImageIfMalformedUrl(); + content = FaxToMailServiceUtils.encodeImageSourcesInEmail(content, defaultImageIfMalformedUrl); contents.add(content); } diff --git a/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java b/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java index 9719f39..782007c 100644 --- a/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java +++ b/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java @@ -24,7 +24,9 @@ package com.franciaflex.faxtomail.services.service; * #L% */ +import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; +import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; import com.franciaflex.faxtomail.persistence.entities.DemandStatus; import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.EmailFilter; @@ -35,8 +37,14 @@ import com.franciaflex.faxtomail.persistence.entities.MailFolder; import com.franciaflex.faxtomail.persistence.entities.MailFolderTopiaDao; import com.franciaflex.faxtomail.persistence.entities.Range; import com.franciaflex.faxtomail.persistence.entities.SearchFilter; +import com.franciaflex.faxtomail.services.FaxToMailServiceUtils; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; +import com.google.common.io.Files; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.mail.util.MimeMessageUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -44,14 +52,22 @@ import org.nuiton.topia.persistence.TopiaEntities; import org.nuiton.util.pagination.PaginationParameter; import org.nuiton.util.pagination.PaginationResult; +import javax.activation.DataHandler; +import javax.mail.Session; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeUtility; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Properties; import java.util.Set; /** @@ -279,69 +295,70 @@ public class EmailServiceTest extends AbstractFaxToMailServiceTest { } -// @Test -// public void testConvertHTMLToPdf() { -// -// try { + @Test + public void testConvertHTMLToPdf() { + + try { // File email = new File("src/test/resources/test.txt"); -// String emailContent = FileUtils.readFileToString(email); -// -// Properties properties = new Properties(); -// // set the mail.mime.address.strict to false to avoid -// // javax.mail.internet.AddressException: Domain contains illegal character errors when recipients contains [] -// properties.setProperty("mail.mime.address.strict", "false"); -// Session session = Session.getInstance(properties); -// -// MimeMessage message = MimeMessageUtils.createMimeMessage(session, emailContent); -// Charset charset = FaxToMailServiceUtils.getCharset(message); -// ArrayList<Attachment> attachments = new ArrayList<>(); -// -// if (message.isMimeType("multipart/*")) { -// -// List<String> htmlContent = service.decomposeMultipartEmail(attachments, message); -// -// Attachment attachment = service.convertHTMLToPdf(attachments, htmlContent, "test"); -// Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); -// -// } else if (message.isMimeType("text/*")) { -// // convertit le contenu texte en PDF -// String content = IOUtils.toString(message.getInputStream(), charset); -// if (StringUtils.isNotBlank(content)) { -// Attachment attachment = service.convertTextToPdf(content, "test"); -// Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); -// } -// } else { -// String fileName = message.getFileName(); -// try { -// fileName = MimeUtility.decodeText(fileName); -// -// } catch (UnsupportedEncodingException ex) { -// // don't care, use filename raw value -// } -// -// DataHandler dh = message.getDataHandler(); -// -// // create new attachment -// Attachment attachment = new AttachmentImpl(); -// attachment.setAddedByUser(false); -// AttachmentFile attachmentFile = service.getAttachmentFileFromStream(dh.getInputStream()); -// attachmentFile.setFilename(fileName); -// attachment.setOriginalFile(attachmentFile); -// -// // convert attachment if defined by admin -// service.convertIfNecessary(attachment); -// -// // save attachment -// attachments.add(attachment); -// Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); -// } -// -// -// } catch (Exception e) { -// e.printStackTrace(); -// } -// -// } + File email = new File("/home/kmorin/Téléchargements/test2.eml"); + String emailContent = FileUtils.readFileToString(email); + + Properties properties = new Properties(); + // set the mail.mime.address.strict to false to avoid + // javax.mail.internet.AddressException: Domain contains illegal character errors when recipients contains [] + properties.setProperty("mail.mime.address.strict", "false"); + Session session = Session.getInstance(properties); + + MimeMessage message = MimeMessageUtils.createMimeMessage(session, emailContent); + Charset charset = FaxToMailServiceUtils.getCharset(message); + ArrayList<Attachment> attachments = new ArrayList<>(); + + if (message.isMimeType("multipart/*")) { + + List<String> htmlContent = service.decomposeMultipartEmail(attachments, message); + + Attachment attachment = service.convertHTMLToPdf(attachments, htmlContent, "test"); + Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); + + } else if (message.isMimeType("text/*")) { + // convertit le contenu texte en PDF + String content = IOUtils.toString(message.getInputStream(), charset); + if (StringUtils.isNotBlank(content)) { + Attachment attachment = service.convertTextToPdf(content, "test"); + Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); + } + } else { + String fileName = message.getFileName(); + try { + fileName = MimeUtility.decodeText(fileName); + + } catch (UnsupportedEncodingException ex) { + // don't care, use filename raw value + } + + DataHandler dh = message.getDataHandler(); + + // create new attachment + Attachment attachment = new AttachmentImpl(); + attachment.setAddedByUser(false); + AttachmentFile attachmentFile = service.getAttachmentFileFromStream(dh.getInputStream()); + attachmentFile.setFilename(fileName); + attachment.setOriginalFile(attachmentFile); + + // convert attachment if defined by admin + service.convertIfNecessary(attachment); + + // save attachment + attachments.add(attachment); + Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); + } + + + } catch (Exception e) { + e.printStackTrace(); + } + + } // @Test // public void testSendEmail() { diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java index e81dfb4..42c1b24 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java @@ -80,7 +80,6 @@ import javax.swing.JTextPane; import javax.swing.JTree; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; -import javax.swing.text.StyledEditorKit; import javax.swing.text.html.HTMLEditorKit; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; @@ -847,7 +846,7 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { try { // on reformate les urls pour supprimer les caractères qui vont pas (ex espaces) // cf #7741 - content = FaxToMailServiceUtils.encodeImageSourcesInEmail(content); + content = FaxToMailServiceUtils.encodeImageSourcesInEmail(content, handler.getConfig().getDefaultImageIfMalformedUrl()); textPane.setText(content); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.