This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 6d9e7cfb9e [UPGRADE] ical4j 3.2.8 -> 3.2.9 (#1427)
6d9e7cfb9e is described below

commit 6d9e7cfb9e9ac5e746933bd8d4d9ff21bdcb7365
Author: Benoit TELLIER <btell...@linagora.com>
AuthorDate: Fri Feb 10 21:48:26 2023 +0700

    [UPGRADE] ical4j 3.2.8 -> 3.2.9 (#1427)
    
    Allows better parsing resilience
---
 mailet/icalendar/pom.xml                           |  2 +-
 .../james/transport/mailets/ICalendarParser.java   |  8 ++-
 .../transport/mailets/ICalendarParserTest.java     | 61 ++++++++++++++++++++++
 3 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/mailet/icalendar/pom.xml b/mailet/icalendar/pom.xml
index fe8d53bd51..e8e6f1553e 100644
--- a/mailet/icalendar/pom.xml
+++ b/mailet/icalendar/pom.xml
@@ -81,7 +81,7 @@
         <dependency>
             <groupId>org.mnode.ical4j</groupId>
             <artifactId>ical4j</artifactId>
-            <version>3.2.8</version>
+            <version>3.2.9</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
diff --git 
a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java
 
b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java
index 843ef862aa..2bc812c110 100644
--- 
a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java
+++ 
b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java
@@ -41,8 +41,11 @@ import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 
 import net.fortuna.ical4j.data.CalendarBuilder;
+import net.fortuna.ical4j.data.CalendarParserFactory;
+import net.fortuna.ical4j.data.ContentHandlerContext;
 import net.fortuna.ical4j.data.ParserException;
 import net.fortuna.ical4j.model.Calendar;
+import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
 
 /**
  * <p>
@@ -131,7 +134,10 @@ public class ICalendarParser extends GenericMailet {
     }
 
     private Stream<Pair<String, Calendar>> createCalendar(String key, byte[] 
icsContent) {
-        CalendarBuilder builder = new CalendarBuilder();
+        CalendarBuilder builder = new CalendarBuilder(
+            CalendarParserFactory.getInstance().get(),
+            new ContentHandlerContext().withSupressInvalidProperties(true),
+            TimeZoneRegistryFactory.getInstance().createRegistry());
         try {
             ByteArrayInputStream inputStream = new 
ByteArrayInputStream(icsContent);
             return Stream.of(Pair.of(key, builder.build(inputStream)));
diff --git 
a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICalendarParserTest.java
 
b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICalendarParserTest.java
index 88ea0f2ebf..11ced1038f 100644
--- 
a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICalendarParserTest.java
+++ 
b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICalendarParserTest.java
@@ -53,6 +53,39 @@ class ICalendarParserTest {
 
     static final String RIGHT_ICAL_VALUE = "BEGIN:VCALENDAR\n" +
         "END:VCALENDAR";
+    static final String FAULTY_ICAL_VALUE = "BEGIN:VCALENDAR\n" +
+        "BEGIN:VEVENT\n" +
+        "BEGIN:VALARM\n" +
+        "TRIGGER:P1800S\n" + // net.fortuna.ical4j.data.ParserException: Error 
at line 9:Text cannot be parsed to a Duration
+        "ACTION:display\n" +
+        "DESCRIPTION:XXXXXXXXXXXXX\n" +
+        "END:VALARM\n" +
+        "CREATED:20200903T145836Z\n" +
+        "LAST-MODIFIED:20200910T095359Z\n" +
+        "DTSTAMP:20200910T095359Z\n" +
+        "DTSTART:20200915T120000Z\n" +
+        "DURATION:PT2H30M\n" +
+        "TRANSP:OPAQUE\n" +
+        "SEQUENCE:2\n" +
+        "SUMMARY:XXXXXXXX\n" +
+        "DESCRIPTION:\n" +
+        "CLASS:PUBLIC\n" +
+        "PRIORITY:5\n" +
+        "ORGANIZER;X-OBM-ID=612;CN=XXXX:MAILTO:xxx...@linagora.com\n" +
+        "X-OBM-DOMAIN:linagora.com\n" +
+        "X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922\n" +
+        "LOCATION:SULLY-217R\n" +
+        "CATEGORIES:\n" +
+        "X-OBM-COLOR:\n" +
+        "X-OBM-ALERT;X-OBM-ID=612:1800\n" +
+        
"UID:f1514f44bf39311568d640729686167c77935c03dc972e2286e115e86cf5d7a6e047fe\n" +
+        " 
b2aab16e43439a608f28671ab7c10e754c29879684a2ba5b1e4ed3eea7211d629898482b3e\n" +
+        
"ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=XXXXXXX;PARTSTAT=ACCEPTED;X\n" +
+        " -OBM-ID=612:MAILTO:xx...@linagora.com\n" +
+        
"ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=YYYYYYYY;PARTSTAT=DECLINED;X-OB\n" +
+        " M-ID=1329:MAILTO:yyy...@linagora.com\n" +
+        "END:VEVENT\n" +
+        "END:VCALENDAR";
 
     static final String WRONG_ICAL_VALUE = "anyValue";
     @SuppressWarnings("unchecked")
@@ -238,6 +271,34 @@ class ICalendarParserTest {
                 .containsExactly(expectedCalendar));
     }
 
+    @Test
+    void parsingShouldRecoverFromInvalidProperties() throws Exception {
+        FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder()
+            .mailetName("ICalendarParser")
+            .setProperty(SOURCE_ATTRIBUTE, SOURCE_CUSTOM_ATTRIBUTE)
+            .setProperty(DESTINATION_ATTRIBUTE, DESTINATION_CUSTOM_ATTRIBUTE)
+            .build();
+
+        mailet.init(mailetConfiguration);
+
+        Map<String, AttributeValue<byte[]>> attachments = 
ImmutableMap.<String, AttributeValue<byte[]>>builder()
+            .put("key1", AttributeValue.of(FAULTY_ICAL_VALUE.getBytes()))
+            .build();
+        Mail mail = FakeMail.builder()
+            .name("mail")
+            .attribute(makeCustomSourceAttribute((Serializable) attachments))
+            .build();
+
+        mailet.service(mail);
+
+        Optional<Map<String, AttributeValue<Serializable>>> expectedCalendars 
= AttributeUtils.getValueAndCastFromMail(mail, 
DESTINATION_CUSTOM_ATTRIBUTE_NAME, MAP_STRING_CALENDAR_CLASS);
+
+        assertThat(expectedCalendars).hasValueSatisfying(calendars ->
+            assertThat(calendars)
+                .hasSize(1)
+                .hasFieldOrProperty("key1"));
+    }
+
     @Test
     void getMailetInfoShouldReturn() throws MessagingException {
         assertThat(mailet.getMailetInfo()).isEqualTo("Calendar Parser");


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to