[iCloud] PROPFIND: respond contains same property one time as 200 OK and one time 404 Not Found


  • developer

    For reference and transparency: We have created this report on Apple Bug Reporter on 17 Oct 2015 here: https://bugreport.apple.com/web/?problemID=23156564


    Summary:
    When querying resource properties with PROPFIND, iCloud returns the same property (in this example: <resourcetype/>) one time as 200 OK and one time as 404 Not Found. This doesn't make any sense and causes clients to ignore the property and thus to fail.

    Steps to Reproduce:
    curl --data @1.xml -vX PROPFIND -H 'Depth: 1' -u xxxxxx:XXXXXX https://p23-caldav.icloud.com/xxxxxxxx/calendars/

    Expected Results:
    Don't send <resourcetype/> with propstat status 404.
    
    Actual Results:
    The response for <href>/xxxx/calendars/home/</href> contains:
    
      <response>
        <href>/xxxxx/calendars/home/</href>
        <propstat>
          <prop>
            <resourcetype>
              <collection/>
              <calendar xmlns='urn:ietf:params:xml:ns:caldav'/>
            </resourcetype>
            ...
          </prop>
          <status>HTTP/1.1 200 OK</status>
        </propstat>
        <propstat>
          <prop>
            <resourcetype/>
          </prop>
          <status>HTTP/1.1 404 Not Found</status>
        </propstat>
      </response>
    

    Full response:

    <?xml version='1.0' encoding='UTF-8'?>
    <multistatus xmlns='DAV:'>
      <response>
        <href>/xxxxx/calendars/</href>
        <propstat>
          <prop>
            <supported-calendar-component-set xmlns='urn:ietf:params:xml:ns:caldav'>
              <comp name='VEVENT'/>
              <comp name='VTODO'/>
            </supported-calendar-component-set>
            <displayname>xxxxxxxxxx</displayname>
            <current-user-privilege-set>
              <privilege>
                <read/>
              </privilege>
              <privilege>
                <read-free-busy xmlns='urn:ietf:params:xml:ns:caldav'/>
              </privilege>
              <privilege>
                <read-current-user-privilege-set/>
              </privilege>
              <privilege>
                <write/>
              </privilege>
              <privilege>
                <write-properties/>
              </privilege>
              <privilege>
                <write-content/>
              </privilege>
              <privilege>
                <bind/>
              </privilege>
              <privilege>
                <unbind/>
              </privilege>
            </current-user-privilege-set>
            <resourcetype>
              <collection/>
            </resourcetype>
          </prop>
          <status>HTTP/1.1 200 OK</status>
        </propstat>
        <propstat>
          <prop>
            <calendar-color xmlns='http://apple.com/ns/ical/'/>
            <resourcetype/>
            <calendar-description xmlns='urn:ietf:params:xml:ns:caldav'/>
            <calendar-timezone xmlns='urn:ietf:params:xml:ns:caldav'/>
          </prop>
          <status>HTTP/1.1 404 Not Found</status>
        </propstat>
      </response>
      <response>
        <href>/xxxxx/calendars/home/</href>
        <propstat>
          <prop>
            <supported-calendar-component-set xmlns='urn:ietf:params:xml:ns:caldav'>
              <comp name='VEVENT'/>
            </supported-calendar-component-set>
            <displayname>xxxxxxxxxx</displayname>
            <current-user-privilege-set>
              <privilege>
                <read/>
              </privilege>
              <privilege>
                <read-free-busy xmlns='urn:ietf:params:xml:ns:caldav'/>
              </privilege>
              <privilege>
                <read-current-user-privilege-set/>
              </privilege>
              <privilege>
                <write/>
              </privilege>
              <privilege>
                <write-properties/>
              </privilege>
              <privilege>
                <write-content/>
              </privilege>
              <privilege>
                <bind/>
              </privilege>
              <privilege>
                <unbind/>
              </privilege>
            </current-user-privilege-set>
            <calendar-color symbolic-color='__custom__' xmlns='http://apple.com/ns/ical/'>#cca312FF</calendar-color>
            <calendar-description xmlns='urn:ietf:params:xml:ns:caldav'/>
            <calendar-timezone xmlns='urn:ietf:params:xml:ns:caldav'><![CDATA[BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//Apple Inc.//Mac OS X 10.9.4//EN
    CALSCALE:GREGORIAN
    BEGIN:VTIMEZONE
    TZID:America/Los_Angeles
    BEGIN:DAYLIGHT
    TZOFFSETFROM:-0800
    RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
    DTSTART:20070311T020000
    TZNAME:GMT-7
    TZOFFSETTO:-0700
    END:DAYLIGHT
    BEGIN:STANDARD
    TZOFFSETFROM:-0700
    RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
    DTSTART:20071104T020000
    TZNAME:GMT-8
    TZOFFSETTO:-0800
    END:STANDARD
    END:VTIMEZONE
    END:VCALENDAR
    ]] ></calendar-timezone>
            <resourcetype>
              <collection/>
              <calendar xmlns='urn:ietf:params:xml:ns:caldav'/>
            </resourcetype>
          </prop>
          <status>HTTP/1.1 200 OK</status>
        </propstat>
        <propstat>
          <prop>
            <resourcetype/>
            <calendar-description xmlns='urn:ietf:params:xml:ns:caldav'/>
            <calendar-timezone xmlns='urn:ietf:params:xml:ns:caldav'/>
          </prop>
          <status>HTTP/1.1 404 Not Found</status>
        </propstat>
      </response>
      <response>
        <href>/xxxxx/calendars/notification/</href>
        <propstat>
          <prop>
            <displayname>notification</displayname>
            <current-user-privilege-set>
              <privilege>
                <read/>
              </privilege>
              <privilege>
                <read-free-busy xmlns='urn:ietf:params:xml:ns:caldav'/>
              </privilege>
              <privilege>
                <unbind/>
              </privilege>
              <privilege>
                <read-current-user-privilege-set/>
              </privilege>
            </current-user-privilege-set>
            <resourcetype>
              <notification xmlns='http://calendarserver.org/ns/'/>
              <collection/>
            </resourcetype>
          </prop>
          <status>HTTP/1.1 200 OK</status>
        </propstat>
        <propstat>
          <prop>
            <supported-calendar-component-set xmlns='urn:ietf:params:xml:ns:caldav'/>
            <calendar-color xmlns='http://apple.com/ns/ical/'/>
            <resourcetype/>
            <calendar-description xmlns='urn:ietf:params:xml:ns:caldav'/>
            <calendar-timezone xmlns='urn:ietf:params:xml:ns:caldav'/>
          </prop>
          <status>HTTP/1.1 404 Not Found</status>
        </propstat>
      </response>
      <response>
        <href>/xxxxx/calendars/tasks/</href>
        <propstat>
          <prop>
            <supported-calendar-component-set xmlns='urn:ietf:params:xml:ns:caldav'>
              <comp name='VTODO'/>
            </supported-calendar-component-set>
            <displayname>DAVdroid</displayname>
            <current-user-privilege-set>
              <privilege>
                <read/>
              </privilege>
              <privilege>
                <read-free-busy xmlns='urn:ietf:params:xml:ns:caldav'/>
              </privilege>
              <privilege>
                <read-current-user-privilege-set/>
              </privilege>
              <privilege>
                <write/>
              </privilege>
              <privilege>
                <write-properties/>
              </privilege>
              <privilege>
                <write-content/>
              </privilege>
              <privilege>
                <bind/>
              </privilege>
              <privilege>
                <unbind/>
              </privilege>
            </current-user-privilege-set>
            <calendar-color symbolic-color='blue' xmlns='http://apple.com/ns/ical/'>#1badf8FF</calendar-color>
            <calendar-description xmlns='urn:ietf:params:xml:ns:caldav'/>
            <calendar-timezone xmlns='urn:ietf:params:xml:ns:caldav'><![CDATA[BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//Apple Inc.//Mac OS X 10.9.4//EN
    CALSCALE:GREGORIAN
    BEGIN:VTIMEZONE
    TZID:America/Los_Angeles
    BEGIN:DAYLIGHT
    TZOFFSETFROM:-0800
    RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
    DTSTART:20070311T020000
    TZNAME:GMT-7
    TZOFFSETTO:-0700
    END:DAYLIGHT
    BEGIN:STANDARD
    TZOFFSETFROM:-0700
    RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
    DTSTART:20071104T020000
    TZNAME:GMT-8
    TZOFFSETTO:-0800
    END:STANDARD
    END:VTIMEZONE
    END:VCALENDAR
    ]] ></calendar-timezone>
            <resourcetype>
              <collection/>
              <calendar xmlns='urn:ietf:params:xml:ns:caldav'/>
            </resourcetype>
          </prop>
          <status>HTTP/1.1 200 OK</status>
        </propstat>
        <propstat>
          <prop>
            <resourcetype/>
            <calendar-description xmlns='urn:ietf:params:xml:ns:caldav'/>
            <calendar-timezone xmlns='urn:ietf:params:xml:ns:caldav'/>
          </prop>
          <status>HTTP/1.1 404 Not Found</status>
        </propstat>
      </response>
      <response>
        <href>/509494181/calendars/inbox/</href>
        <propstat>
          <prop>
            <supported-calendar-component-set xmlns='urn:ietf:params:xml:ns:caldav'>
              <comp name='VEVENT'/>
              <comp name='VTODO'/>
              <comp name='VPOLL'/>
            </supported-calendar-component-set>
            <current-user-privilege-set>
              <privilege>
                <schedule-deliver xmlns='urn:ietf:params:xml:ns:caldav'/>
              </privilege>
              <privilege>
                <read/>
              </privilege>
              <privilege>
                <write-properties/>
              </privilege>
              <privilege>
                <write/>
              </privilege>
              <privilege>
                <write-content/>
              </privilege>
              <privilege>
                <bind/>
              </privilege>
              <privilege>
                <unbind/>
              </privilege>
              <privilege>
                <read-current-user-privilege-set/>
              </privilege>
              <privilege>
                <read-free-busy xmlns='urn:ietf:params:xml:ns:caldav'/>
              </privilege>
            </current-user-privilege-set>
            <resourcetype>
              <collection/>
              <schedule-inbox xmlns='urn:ietf:params:xml:ns:caldav'/>
            </resourcetype>
          </prop>
          <status>HTTP/1.1 200 OK</status>
        </propstat>
        <propstat>
          <prop>
            <displayname/>
            <calendar-color xmlns='http://apple.com/ns/ical/'/>
            <resourcetype/>
            <calendar-description xmlns='urn:ietf:params:xml:ns:caldav'/>
            <calendar-timezone xmlns='urn:ietf:params:xml:ns:caldav'/>
          </prop>
          <status>HTTP/1.1 404 Not Found</status>
        </propstat>
      </response>
      <response>
        <href>/xxxxx/calendars/outbox/</href>
        <propstat>
          <prop>
            <supported-calendar-component-set xmlns='urn:ietf:params:xml:ns:caldav'>
              <comp name='VEVENT'/>
              <comp name='VTODO'/>
            </supported-calendar-component-set>
            <resourcetype>
              <collection/>
              <schedule-outbox xmlns='urn:ietf:params:xml:ns:caldav'/>
            </resourcetype>
            <current-user-privilege-set>
              <privilege>
                <schedule-send xmlns='urn:ietf:params:xml:ns:caldav'/>
              </privilege>
              <privilege>
                <read-current-user-privilege-set/>
              </privilege>
              <privilege>
                <read/>
              </privilege>
            </current-user-privilege-set>
          </prop>
          <status>HTTP/1.1 200 OK</status>
        </propstat>
        <propstat>
          <prop>
            <calendar-description xmlns='urn:ietf:params:xml:ns:caldav'/>
            <calendar-timezone xmlns='urn:ietf:params:xml:ns:caldav'/>
          </prop>
          <status>HTTP/1.1 404 Not Found</status>
        </propstat>
      </response>
    

    Version:
    Tested on 2015/10/17

    Notes:
    This problem was discovered when developing DAVdroid (CalDAV/CardDAV client) and testing it with iCloud.