From 677be6030ab8a04dc7defcc8fd2394fea936fb38 Mon Sep 17 00:00:00 2001 From: Ben Fortuna Date: Tue, 25 Apr 2017 00:01:30 +1000 Subject: [PATCH] Ignore property lines with an empty name part --- .../ical4j/data/CalendarParserImpl.java | 3 +- .../ical4j/data/CalendarParserImplSpec.groovy | 59 ++++++++++++++++++- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/fortuna/ical4j/data/CalendarParserImpl.java b/src/main/java/net/fortuna/ical4j/data/CalendarParserImpl.java index 4eb71c7f9..746930a6d 100644 --- a/src/main/java/net/fortuna/ical4j/data/CalendarParserImpl.java +++ b/src/main/java/net/fortuna/ical4j/data/CalendarParserImpl.java @@ -33,7 +33,6 @@ import net.fortuna.ical4j.model.Calendar; import net.fortuna.ical4j.model.Component; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -206,7 +205,7 @@ public void parse(final StreamTokenizer tokeniser, Reader in, // check for timezones observances or vevent/vtodo alarms.. if (Component.BEGIN.equals(tokeniser.sval)) { componentParser.parse(tokeniser, in, handler); - } else { + } else if (tokeniser.sval != null) { propertyParser.parse(tokeniser, in, handler); } absorbWhitespace(tokeniser, in); diff --git a/src/test/groovy/net/fortuna/ical4j/data/CalendarParserImplSpec.groovy b/src/test/groovy/net/fortuna/ical4j/data/CalendarParserImplSpec.groovy index 6bb20839b..6607ed1d1 100644 --- a/src/test/groovy/net/fortuna/ical4j/data/CalendarParserImplSpec.groovy +++ b/src/test/groovy/net/fortuna/ical4j/data/CalendarParserImplSpec.groovy @@ -31,13 +31,14 @@ */ package net.fortuna.ical4j.data -import static net.fortuna.ical4j.util.CompatibilityHints.* - import net.fortuna.ical4j.model.Calendar import net.fortuna.ical4j.util.Calendars import net.fortuna.ical4j.util.CompatibilityHints import spock.lang.Specification +import static net.fortuna.ical4j.util.CompatibilityHints.KEY_RELAXED_PARSING +import static net.fortuna.ical4j.util.CompatibilityHints.KEY_RELAXED_UNFOLDING + class CalendarParserImplSpec extends Specification { CalendarBuilder builder = new CalendarBuilder() @@ -88,4 +89,58 @@ class CalendarParserImplSpec extends Specification { '/samples/valid/bhav23-1.ics' | [] '/samples/invalid/bhav23-2.ics' | [KEY_RELAXED_UNFOLDING, KEY_RELAXED_PARSING] } + + def 'verify parsing empty lines'() { + setup: + String input = "BEGIN:VCALENDAR\r\n$contentLines\r\nEND:VCALENDAR" + CompatibilityHints.setHintEnabled(KEY_RELAXED_UNFOLDING, true) + CompatibilityHints.setHintEnabled(KEY_RELAXED_PARSING, true) + + expect: + Calendar calendar = builder.build(new StringReader(input)) + assert calendar.components[0].properties.size() == 24 + + where: + contentLines << ['''BEGIN:VEVENT +CLASS: +CREATED:20121015T070600Z +DTSTART:20121018T020000Z +LAST-MODIFIED:20140815T175058Z +LOCATION:somewhere +ORGANIZER;CN=somesystem:mailto:foo@bar.com +PRIORITY:5 +DTSTAMP:20121015T070600Z +SEQUENCE:1 +STATUS:CONFIRMED +SUMMARY:Scrum Gathering +\tTest Automation +TRANSP:TRANSPARENT +UID:a5f13918-e1a8-4035-ac92-44a412315b00 +DTEND:20121018T040000Z +ATTENDEE;CN=foo@bar.com;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTI +\tCIPANT;RSVP=TRUE:mailto:foo@bar.com; +X-ALT-DESC;FMTTYPE=text/html:\\n\\n\\n\\n\\n\\n\\n\\n\\n

+: +: +: +X-MICROSOFT-CDO-BUSYSTATUS:FREE +X-MICROSOFT-CDO-INSTTYPE:0 +X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY +X-MICROSOFT-CDO-ALLDAYEVENT:FALSE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MS-OLK-CONFTYPE:0 +X-MICROSOFT-CDO-ATTENDEE-CRITICAL-CHANGE:20121015T070600Z +X-MICROSOFT-CDO-OWNER-CRITICAL-CHANGE:20121015T070600Z +BEGIN:VALARM +ACTION:DISPLAY +TRIGGER;VALUE=DURATION:-PT15M +DESCRIPTION:REMINDER +RELATED=START:-PT00H15M00S +END:VALARM +END:VEVENT'''] + } }