kewisch / ical.js

Javascript parser for ics (rfc5545) and vcard (rfc6350) data
https://kewisch.github.io/ical.js/
Mozilla Public License 2.0
1.01k stars 138 forks source link

Iterator will generate events before the event starts #456

Open castaway opened 4 years ago

castaway commented 4 years ago

Admittedly I can also fix this in my calling code, so whether you'd like to accept it as a bug or not is entirely up to you:

https://github.com/mozilla-comm/ical.js/blob/master/lib/ical/event.js#L278-L283

This doesn't check whether the passed in startTime is before the dtstart, and happily generates events out of the original dtstart bounds, if asked to.

dilyanpalauzov commented 4 years ago

Can you please provide an (iCalendar) input, which is “interesting”?

castaway commented 4 years ago
VERSION:2.0
PRODID:-//www.contactoffice.com//NONSGML Calendar//EN
BEGIN:VTIMEZONE
TZID:Europe/London
X-TZINFO:Europe/London[2019c/Partial@9223372036854775807]
BEGIN:DAYLIGHT
TZOFFSETTO:+010000
TZOFFSETFROM:+000000
TZNAME:Europe/London(DST)
DTSTART:15320325T010000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETTO:+000000
TZOFFSETFROM:+010000
TZNAME:Europe/London(STD)
DTSTART:19971026T020000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP;VALUE=DATE-TIME:20201015T100822Z
LAST-MODIFIED:20201015T100519Z
DTSTART;TZID=Europe/London;VALUE=DATE-TIME:20201012T190000
DTEND;TZID=Europe/London;VALUE=DATE-TIME:20201012T230000
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,FR
EXDATE:20240412T180000Z
DESCRIPTION:In a pub or online
SUMMARY:Monday Board Games
LOCATION:Somewhere
UID:com_264201470
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
let component = new ICAL.Component(ICAL.parse(ical));
const vevents = component.getAllSubcomponents('vevent')
      .filter((c) => !c.hasProperty('recurrence-id'))
      .map((c) => new ICAL.Event(c, {'strictExceptions': true}));

// generate week starting october 5th
const start_date = Date(2020,9,5,19,0,0,0);
let iterator = vevents[0].iterator(ICAL.Time.fromJSDate(start_date));

Event (DTSTART) starts on Oct 12th, this generates one on Oct 5th

Zearin commented 2 years ago

Perhaps label this issue as a bug?

kewisch commented 5 months ago

This is still an issue and should be simple to fix. If a date is passed to iterator(), compare with this.startDate and take whatever is later in time. Double check if there can be cases where this.startDate is undefined.