pimutils / todoman

✅ Simple, standards-based, command line todo (aka: task) manager.
https://todoman.readthedocs.io
ISC License
495 stars 80 forks source link

Todoman produces non-RFC-compliant icalendar data for the COMPLETED attribute #310

Open wichmannpas opened 6 years ago

wichmannpas commented 6 years ago

todoman produces the COMPLETED attribute like this:

COMPLETED;VALUE=DATE-TIME:20180428T081233Z

However, the RFC defines the COMPLETED attribute to always be of type DATE-TIME, thus not allowing VALUE=DATE-TIME to be explicitly specified.

This causes issues when using other clients which do not parse RFC-incompliant COMPLETED attributes, such as DAVdroid (cf. this issue).

WhyNotHugo commented 6 years ago

Strictly looking at the spec, I get the impression that VALUE=DATETIME should be interpreted as the optional otherparam, which the spec says should be ignored by clients.

FWIW though, I do agree that it would be cleaner if we omitted that (since it's of no real value). I'll have to look at our serialisation library though, and see if that's possible.

Quite related though, it does seem evident that specifying a timezone is not okay (since the actual value must be UTC-time). I don't think we ever do that, but I'd really prefer to double check that as well.

wichmannpas commented 6 years ago

The format definition for the COMPLETED attribute is as follows:

   completed  = "COMPLETED" compparam ":" date-time CRLF

   compparam  = *(";" other-param)

Whereas for example the DTEND definition which allows to specify an alternative format is as follows:

   dtend      = "DTEND" dtendparam ":" dtendval CRLF

   dtendparam = *(
              ;
              ; The following are OPTIONAL,
              ; but MUST NOT occur more than once.
              ;
              (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
              (";" tzidparam) /
              ;
              ; The following is OPTIONAL,
              ; and MAY occur more than once.
              ;
              (";" other-param)
              ;
              )

   dtendval   = date-time / date
   ;Value MUST match value type