[calsify] Issues with overrides.

Michael Douglass <mikeadouglass@gmail.com> Thu, 24 September 2020 02:35 UTC

Return-Path: <mikeadouglass@gmail.com>
X-Original-To: calsify@ietfa.amsl.com
Delivered-To: calsify@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 4A09D3A0AB4 for <calsify@ietfa.amsl.com>; Wed, 23 Sep 2020 19:35:58 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.098
X-Spam-Level:
X-Spam-Status: No, score=-2.098 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1OYRKTFt_Jh5 for <calsify@ietfa.amsl.com>; Wed, 23 Sep 2020 19:35:56 -0700 (PDT)
Received: from mail-qt1-x82b.google.com (mail-qt1-x82b.google.com [IPv6:2607:f8b0:4864:20::82b]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 692F43A0AB3 for <calsify@ietf.org>; Wed, 23 Sep 2020 19:35:56 -0700 (PDT)
Received: by mail-qt1-x82b.google.com with SMTP id g3so1706263qtq.10 for <calsify@ietf.org>; Wed, 23 Sep 2020 19:35:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version :content-transfer-encoding:content-language; bh=3n0dXaJBL8MdD3jHINdKk3A6IvUjCusTjGVV92xGEUM=; b=GJdK7eyoJP/vE5vnSdKm+bRC9lkSGryiNzm5pr+Xdl8iv2O6uGw8oQ8u0L+RjYce5Q Q3xdLduYbuSeZpWatsuVnIeDLsVyMjXSP1fRDylGWVQWHFLExjJ5lwbgNokC7mjhp4Uo Dc2OYTa8uziRi4iZVNc9ZObSvYZvry600dTzBE58V7jZXa0wDeWmn5a2F73Yn/ZZDHwH RZNzsy41juGx6CqcleiRjy+5vhoTURLJalRXSOZhGgVsfTD61GvG5zV2Yw1d2DI24GbT ekpOvlgfQf9Q0J36IlNkGnsEyQrdVZ8yX8MlS/2abhzqNBu4r6X1J5yMN1IFjH2xg+b8 qLag==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-transfer-encoding:content-language; bh=3n0dXaJBL8MdD3jHINdKk3A6IvUjCusTjGVV92xGEUM=; b=atyfPKrC4f8RZXUNkYcE6ZrO7TAIA58c0v84oNVAnZfdIfzHjUa7OPvtymYvfPpCH5 DyreMdQ8llqA/7Yo/scUHyampBkx/HAcQ2eaI4r4qHFHYxuBClxcl0OM0Cr9nR6ELHPr L6peK371MEd4W562nQOtZvRKaanftnc3KDa2GqnTu9LfIOSMnDAWn1rmrfIEk5wFLzjs OKdgd5Al/An7o+Zh2wCAt9MvsHlyCmHDV8S+c/nkqjO38KYT3EAnifbR0DKgxFrrotWx a4Z/VzkcqSXiFBC5T99SCKaUivfg5sgbQ9aqWX3nEifBLqQAZJ46p/yEnvb8M8kc7kzQ JH5g==
X-Gm-Message-State: AOAM531GCerVlfQuniK/WQLa2R/kj8HvoqgOMgkryqTIStW028nwL/Ms 5Q53ex1pPfiHJ/99QB9q3GxX0zeieaVtOQ==
X-Google-Smtp-Source: ABdhPJwxpso0IxPfoia0t1r8BbvFH8wf91MF5jREXHp0o1VEz4yeDQwQdIruhX84MX2ffCp5ad4RrA==
X-Received: by 2002:ac8:5341:: with SMTP id d1mr3328694qto.176.1600914955055; Wed, 23 Sep 2020 19:35:55 -0700 (PDT)
Received: from MBP-2019.nycap.rr.com (cpe-74-70-80-66.nycap.res.rr.com. [74.70.80.66]) by smtp.googlemail.com with ESMTPSA id j16sm1310959qkg.26.2020.09.23.19.35.53 for <calsify@ietf.org> (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 23 Sep 2020 19:35:54 -0700 (PDT)
To: Calsify <calsify@ietf.org>
From: Michael Douglass <mikeadouglass@gmail.com>
Message-ID: <7867c58d-22f6-393f-1ff1-ec822c5bf4af@gmail.com>
Date: Wed, 23 Sep 2020 22:35:53 -0400
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:68.0) Gecko/20100101 Thunderbird/68.12.0
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"; format="flowed"
Content-Transfer-Encoding: 8bit
Content-Language: en-US
Archived-At: <https://mailarchive.ietf.org/arch/msg/calsify/edK00_RYwVJr4XmSHK28Z1K5Hhw>
Subject: [calsify] Issues with overrides.
X-BeenThere: calsify@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: <calsify.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/calsify>, <mailto:calsify-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/calsify/>
List-Post: <mailto:calsify@ietf.org>
List-Help: <mailto:calsify-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/calsify>, <mailto:calsify-request@ietf.org?subject=subscribe>
X-List-Received-Date: Thu, 24 Sep 2020 02:35:58 -0000

Earlier (8/23) I sent a message outlining an issue I felt we had with 
jscalendar and invites to specific instances of a recurring event.

The full text of a modified form of that is below.

Neil asserted at that time that recurrence ids are only ids and not 
dates. That's not true. CalDAV for one requires that any instance that 
appears or would have appeared in a date range must be returned. It's 
the recurrence id that provides the calculated start date.

The issue is that there's no way of knowing what the timezone of the 
master is if you don't have a master. In iCalendar the tzid is 
associated with the recurrence id - not so in jscalendar.

I ran into this trying to implement the conversion from jscalendar to 
iCalendar in bedework and at the moment have no idea how that can be 
achieved.

If we are going to have widespread adoption of jscalendar we can't be 
making it difficult to convert from one to the other and scheduling has 
to carry on working.

More worrying to me is that there has been no testing and I suspect we 
only have 2-3 implementations. It's quite possible to have a scenario in 
which one UA receives the invite as jscalendar (Thunderbird) passes it 
across to the calendar app (iCal) as iCalendar which then replies in 
iCalendar. In that scenario the recurrence ids would fail to match.


The event starts life inside a calendar system as a recurring event with 
2 overrides - each inviting people and one with timezones shifted. The 
scenario I had in mind is a recurring meeting in New York say, and one 
instance takes place in London and extra people are invited. It’s not 
far fetched and very easy to produce with iCal or thunderbird. For the 
purposes of the example I reduced it to a daily event but I could 
imagine this as a weekly/monthly meeting with the occasional meeting in 
London with extra attendees.

This is what it looks like - sort of.

BEGIN:VCALENDAR
CALSCALE:GREGORIAN
PRODID:-//Bedework//EN
VERSION:2.0
BEGIN:VEVENT
CREATED:20200902T024956Z
DURATION:PT1H
DTSTAMP:20200902T024957Z
DTSTART;TZID=America/New_York:20200522T120000
LAST-MODIFIED:20200902T024957Z
SUMMARY:recurring daily 8 times
UID:6252D6C40A8308BFE25CCDFiinvite-1
RRULE:FREQ=DAILY;COUNT=8
END:VEVENT
BEGIN:VEVENT
RECURRENCE-ID;TZID=America/New_York:20200524T120000
ATTENDEE;RSVP=TRUE:mailto:douglm@mysite.edu
ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=1.2:mailto:vbede@mysite.edu
CREATED:20200823T221135Z
DURATION:PT1H
DTSTAMP:20200902T024957Z
DTSTART;TZID=America/New_York:20200524T120000
LAST-MODIFIED:20200902T024957Z
ORGANIZER:mailto:douglm@mysite.edu
SUMMARY:Test rid + tzid
UID:6252D6C40A8308BFE25CCDFiinvite-1
END:VEVENT
BEGIN:VEVENT
RECURRENCE-ID;TZID=Europe/London:20200525T170000
ATTENDEE;RSVP=TRUE:mailto:douglm@mysite.edu
ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=1.2:mailto:vbede@mysite.edu
CREATED:20200823T221135Z
DURATION:PT1H
DTSTAMP:20200902T024957Z
DTSTART;TZID=Europe/London:20200525T100000
LAST-MODIFIED:20200902T024957Z
ORGANIZER:mailto:douglm@mysite.edu
SUMMARY:Test rid + tzid
UID:6252D6C40A8308BFE25CCDFiinvite-1
END:VEVENT
END:VCALENDAR

The 2 overrides are sent out to the attendees. Let’s assume the 
recipient “vbede” can accept jscalendar. I converted the iCalendar to 
jscalendar using bedework and came up with this:

{
   "@type": "jsgroup",
   "prodId": "//Bedework.org//BedeWork V3.13.2//EN",
   "entries": [
     {
       "@type": "jsevent",
       "created": "2020-09-02T02:49:58Z",
       "timeZone": "America/New_York",
       "duration": "PT1H",
       "uid": "6252D6C40A8308BFE25CCDFiinvite-1",
       "start": "2020-05-24T12:00:00",
       "recurrenceId": "2020-05-24T12:00:00",
       "participants": {
         "b1a9dca5-8a60-42e2-ba17-d983bdf3a68d": {
           "@type": "Participant",
           "sendTo": {
             "imip": "mailto:douglm@mysite.edu"
           },
           "expectReply": true,
           "roles": {
             "attendee": true,
             "owner": true
           }
         },
         "d946d07d-393f-46eb-8b49-9bbbef13f78a": {
           "@type": "Participant",
           "sendTo": {
             "imip": "mailto:vbede@mysite.edu"
           },
           "expectReply": true,
           "roles": {
             "attendee": true
           }
         }
       },
       "replyTo": {
         "imip": "mailto:douglm@mysite.edu"
       },
       "title": "Test rid + tzid",
       "freeBusyStatus": "free"
     },
     {
       "@type": "jsevent",
       "created": "2020-09-02T02:49:58Z",
       "duration": "PT1H",
       "uid": "6252D6C40A8308BFE25CCDFiinvite-1",
       "recurrenceId": "2020-05-25T12:00:00",
       "participants": {
         "9a4252d0-b1e5-4a37-bdf5-05e17d7898f9": {
           "@type": "Participant",
           "sendTo": {
             "imip": "mailto:douglm@mysite.edu"
           },
           "expectReply": true,
           "roles": {
             "attendee": true,
             "owner": true
           }
         },
         "184e6cf2-8288-4b46-812f-e111d773dd65": {
           "@type": "Participant",
           "sendTo": {
             "imip": "mailto:vbede@mysite.edu"
           },
           "expectReply": true,
           "roles": {
             "attendee": true
           }
         }
       },
       "start": "2020-05-25T10:00:00",
       "timeZone": "Europe/London",
       "replyTo": {
         "imip": "mailto:douglm@mysite.edu"
       },
       "title": "Test rid + tzid",
       "freeBusyStatus": "free"
     }
   ]
}

The problem here is there’s no tz to associate with the recurrence id so 
we can convert back to valid calendar

This is a problem because if I try to reply with an iCalendar object I 
can’t guarantee that the recurrence id is correct.

So where do I get the TZID from?

Suggesting we add these as vendor properties to deal with this is really 
not good enough. There are easier and more robust ways to fix this.

The easiest way to resolve all these problems is to reassociate the 
timezone with the start date and have a recurrence property of the same 
form. That would fix these issues without vendors being asked to jump 
through hoops just to achieve interoperability.

I think this is a more robust model anyway - the current jscalendar has 
this implicit relationship between the recurrence and the timezone of 
the master. Make it explicit and we’re done.

It’s also more in line with date/time libraries which associate the 
value and the timezone. It means I can manipulate the start date in a 
more natural manner - obtain the UTC time etc.

WIth this we would have the event looking like:

{
   "@type": "jsgroup",
   "prodId": "//Bedework.org//BedeWork V3.13.2//EN",
   "entries": [
     {
       "@type": "jsevent",
       "created": "2020-09-02T02:49:58Z",
      "duration": "PT1H",
       "uid": "6252D6C40A8308BFE25CCDFiinvite-1",
       "start": {
          “value” :“2020-05-24T12:00:00”,
          "timeZone": “America/New_York"
       },
       "recurrenceId": {
          “value” :"2020-05-24T12:00:00",
          "timeZone": “America/New_York"
       },
       "participants": {
         "b1a9dca5-8a60-42e2-ba17-d983bdf3a68d": {
           "@type": "Participant",
           "sendTo": {
             "imip": "mailto:douglm@mysite.edu"
           },
           "expectReply": true,
           "roles": {
             "attendee": true,
             "owner": true
           }
         },
         "d946d07d-393f-46eb-8b49-9bbbef13f78a": {
           "@type": "Participant",
           "sendTo": {
             "imip": "mailto:vbede@mysite.edu"
           },
           "expectReply": true,
           "roles": {
             "attendee": true
           }
         }
       },
       "replyTo": {
         "imip": "mailto:douglm@mysite.edu"
       },
       "title": "Test rid + tzid",
       "freeBusyStatus": "free"
     },
     {
       "@type": "jsevent",
       "created": "2020-09-02T02:49:58Z",
       "duration": "PT1H",
       "uid": "6252D6C40A8308BFE25CCDFiinvite-1",
       "recurrenceId": {
          “value” :"2020-05-25T12:00:00",
          "timeZone": “America/New_York"
       },
       "participants": {
         "9a4252d0-b1e5-4a37-bdf5-05e17d7898f9": {
           "@type": "Participant",
           "sendTo": {
             "imip": "mailto:douglm@mysite.edu"
           },
           "expectReply": true,
           "roles": {
             "attendee": true,
             "owner": true
           }
         },
         "184e6cf2-8288-4b46-812f-e111d773dd65": {
           "@type": "Participant",
           "sendTo": {
             "imip": "mailto:vbede@mysite.edu"
           },
           "expectReply": true,
           "roles": {
             "attendee": true
           }
         }
       },
       "start": {
          “value” :"2020-05-25T10:00:00",
          “timeZone": "Europe/London"
       },
       "replyTo": {
         "imip": "mailto:douglm@mysite.edu"
       },
       "title": "Test rid + tzid",
       "freeBusyStatus": "free"
     }
   ]
}

which I don’t think is so terrible.

We can argue that iCalendar should have had some different 
representation or should have dropped the timezone like jscalendar but 
it didn’t.

Now we have systems that process these values in an iCalendar centric 
manner and they aren’t going away soon.

We should also make a real effort to involve other vendors in this and 
do some real testing - particularly for scheduling. That testing MUST 
involve a mix of iCalendar and jscalendar otherwise it’s simply not a 
real world scenario.