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