Anything Is Possible In Australia!

CardDAV Server Information

IETF Server Requirements | SOGo: Open Source Groupware

IETF Server Requirements

The Internet Engineering Task Force (IETF) has produced 2 RFC documents that describe how CardDAV servers are expected to operate:

  1. RFC 6352 - CardDAV: vCard Extensions to Web Distributed Authoring and Versioning (WebDAV)
  2. RFC 6764 - Locating Services for Calendaring Extensions to WebDAV (CalDAV) and vCard Extensions to WebDAV (CardDAV)

According to RFC 6352 a CardDAV server has the following requirements:
It MUST:

  1. Support vCard v3 [RFC2426] as a media type for the address object resource format.
  2. Support WebDAV Class 3 [RFC4918].
  3. Support secure transport as defined in [RFC2818] using Transport Layer Security (TLS) [RFC5246] and using the certificate validation procedures described in [RFC5280].
  4. Support ETags [RFC2616] with additional requirements specified in Section 6.3.2.3 of [RFC6352].
  5. Support all address book reports defined in Section 8 of [RFC6352].
  6. Advertise support on all address book collections and address object resources for the address book reports in the DAV:supported-report-set property, as defined in Versioning Extensions to WebDAV [RFC3253].

It SHOULD:

  1. Support vCard v4 [RFC6350] as a media type for the address object resource format
  2. Support the extended MKCOL method [RFC5689] to create address book collections as defined in Section 6.3.1 of [RFC6352].
  3. Support the DAV:current-user-principal-URL property as defined in [RFC5397] to give clients a fast way to locate user principals.

SOGo: Open Source Groupware

From my investigations it appears that SOGo does not support all of the address book reports defined in Section 8 of [RFC6352] and so can not be considered to comply with the CardDAV standards as set out by the IETF.

Example Query and Response Received from SOGo server:

>> Request <<

REPORT /SOGo/dav/sogotest/Contacts/personal/ HTTP/1.1
Host: addressbook.example.com
Depth: 1
Content-Type: text/xml; charset="utf-8"
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<C:addressbook-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
  <D:prop>
    <D:getetag/>
    <C:address-data/>
  </D:prop>
  <C:filter>
    <C:prop-filter name="VERSION">
      <C:text-match match-type="equals">3.0</C:text-match>
    </C:prop-filter>
  </C:filter>
</C:addressbook-query>

>> Response <<

HTTP/1.1 400 Request Failed
Date: Sat, 12 Nov 2016 04:21:47 GMT
Content-Type: text/xml; charset="utf-8"
Content-Length: xxxx
<?xml version="1.0" encoding="ISO-8859-1"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <body>
    <h3>An error occurred during object publishing</h3>
    <p>XML entity expected for WebDAV REPORT.</p>
  </body>
</html>

Example From RFC 6352: Partial Retrieval of vCards Matching NICKNAME

>> Request <<

REPORT /home/bernard/addressbook/ HTTP/1.1
Host: addressbook.example.com
Depth: 1
Content-Type: text/xml; charset="utf-8"
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<C:addressbook-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
  <D:prop>
    <D:getetag/>
    <C:address-data>
      <C:prop name="VERSION"/>
      <C:prop name="UID"/>
      <C:prop name="NICKNAME"/>
      <C:prop name="EMAIL"/>
      <C:prop name="FN"/>
    </C:address-data>
  </D:prop>
  <C:filter>
    <C:prop-filter name="NICKNAME">
      <C:text-match collation="i;unicode-casemap" match-type="equals">me</C:text-match>
    </C:prop-filter>
  </C:filter>
</C:addressbook-query>


>> Response <<

HTTP/1.1 207 Multi-Status
Date: Sat, 11 Nov 2006 09:32:12 GMT
Content-Type: text/xml; charset="utf-8"
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
  <D:response>
    <D:href>/home/bernard/addressbook/v102.vcf</D:href>
    <D:propstat>
      <D:prop>
        <D:getetag>"23ba4d-ff11fb"</D:getetag>
        <C:address-data>BEGIN:VCARD
VERSION:3.0
NICKNAME:me
UID:34222-232@example.com
FN:Cyrus Daboo
EMAIL:daboo@example.com
END:VCARD
        </C:address-data>
      </D:prop>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
    </D:response>
</D:multistatus>