REV MUST NOT appear more than once in a VCARD component



  • Hello,
    i have a CardDAV Sync error on the combination of DAVdroid 1.3.4.1-ose, Nextcloud 11.0 beta and Contacts 1.5.2.

    My phone produces the following debug.txt. Some fields are anonymized.
    http://pastebin.com/KqNtMWg5

    Is this error a DAVdroid problem or a Nextcloud beta problem?

    Best regards,
    Cornelius


  • developer

    This post is deleted!

  • developer

    I wonder where

    REV;VALUE=timestamp:2016-11-19T17:44:22.057Z
    

    comes from and what it should mean. The REV value should be in timestamp format (e.g. 19961022T140000Z). So it seems that ez-vcard/vcard4android can't parse the original REV value in the VCard and thus preserves it as an unknown property (I'll check that again).

    This unknown property is then used again to build new VCard, while a correct REV value is added, too. So there are two REV values, which is not allowed.

    Proposed solution: Please change your VCards so that they use common REV value formats before downloading them with DAVdroid.


  • developer

    I have now added a test which checks whether invalid REV values as in your VCard are retained as unknown property and it seems that this is really the problem.

    I don't know whether 2016-11-19T17:44:22.057Z is really invalid. According to RFC 6350 4.3.5 TIMESTAMP, timestamps are "complete date and time of day combination as specified in [ISO.8601.2004], Section 4.3.2." ISO.8601.2004 references YY-MM-DDThh:mm:ssZ as such a format, but in your REV, there are not only integer seconds, but milliseconds.

    ISO.8601.2004 also says: "If necessary for a particular application a decimal fraction of hour, minute or second may be included.", so maybe this is a valid REV value and ez-vcard just can't parse it correctly.

    Do you know where the 2016-11-19T17:44:22.057Z value comes from?


  • developer



  • Thank you for the very fast reply.
    This is the last VCard, that produced a error:

    BEGIN:VCARD[CR][LF]
    VERSION:4.0[CR][LF]
    PRODID:+//IDN bitfire.at//DAVdroid/1.3.4.1-ose vcard4android ez-vcard/0.10.[CR][LF]
     0[CR][LF]
    REV;VALUE=timestamp:2016-11-19T17:44:22.057Z[CR][LF]
    UID:2e4f2d8d8a[CR][LF]
    FN:Name[CR][LF]
    N:Name;Name;;;[CR][LF]
    TEL;TYPE=fax:+497000000[CR][LF]
    TEL;TYPE=voice:+49000000[CR][LF]
    REV:20161127T153548Z[CR][LF]
    END:VCARD[CR][LF]
    

    The first timestamp 2016-11-19T17:44:22.057Z maybe is the last successful sync.
    The second timestamp 20161127T153548Z is the last time, i've called the person.

    If i open the nextcloud web interface, create a new contact for testing and download the VCard via the web interface, nextcloud 11 creates the following VCard:

    BEGIN:VCARD
    VERSION:3.0
    FN:Test
    UID:d24a1bde-70d8-48f3-995e-ea0860da51d2
    TEL;TYPE=HOME\,VOICE:+49123456
    EMAIL;TYPE=HOME:test@test.test
    REV:2016-11-27T15:49:53.762Z
    END:VCARD
    

    Best regards,
    Cornelius


  • developer

    Seems that Owncloud Contacts generates a REV value by using JavaScript: new Date().toISOString() since 2 Sep master or 1.5.2 (which was released 2 days ago).

    new Date().toISOString() generates timestamps in the format YYYY-MM-DDTHH:mm:ss.sssZ or ±YYYYYY-MM-DDTHH:mm:ss.sssZ.

    As shown above, ez-vcards doesn't recognize these values as REV timestamps.

    So, the question is now whether new Date().toISOString() generates a "A complete date and time of day combination as specified in [ISO.8601.2004], Section 4.3.2.", as required by RFC 6350. Especially interesting would be whether a complete date/time combination is allowed to have decimal fractions in the seconds part.

    The answer to this question is the key to know where the problem is:

    1. If decimal fractions in the seconds part are allowed, ez-vcard ("DAVdroid") should be able to parse the REV.
    2. If decimal fractions in the seconds part are not allowed, the REV values generated by Nextcloud Contacts 1.5.2 would be invalid.

    So, we need to answer this question before the problem can be solved.


  • developer

    In appendix B.2.3 of ISO.8601.2004, these examples of complete date and time combinations are shown:

    YYYYDDDThhmm / YYYY-DDDThh-mm
    YYYYMMDDhhmm,m / YYYY-MM-DDhh:mm,m
    YYYYWwwDThh,hhZ / YYYY-Www-DThh,hhZ

    So it seems that even ordinal dates (day of year), hour fractions etc. are valid values. So ez-vcard probably needs to import a special library to parse ISO.8601.2004 dates, in order to understand TIMESTAMP values …


  • developer



  • @rfc2822 here is a fix for the owncloud contacts app - https://github.com/owncloud/contacts/pull/536

    Please let me know if this work now for you - THX



  • No, its not working. I've commented already in the github issue.
    Thank you for your work!


  • developer

    @DeepDiver Thanks, that should fix the problem.


  • developer

    @dervomsee

    1. Please make sure that your server doesn't serve any VCard with the questionable REV time format.
    2. After that, synchronize all contacts again. You can delete the DAVdroid account and add it again (or de-select the address book, synchronize, select it again, synchronize).


  • Hello, I have also this issue. It begins with updating some contacts with profile pictures. The Pictures have the jpg file type.
    This is the error message at the nextcloud backend:

    Sabre\DAV\Exception\UnsupportedMediaType: HTTP/1.1 415 Validation error in vCard: REV MUST NOT appear more than once in a VCARD component.

    I have also reference this issue here: Github contacts issue media type


  • developer

    @Lars This is not related to profile pictures.

    1. Please make sure that your server doesn't serve any VCard with the questionable REV time format (i.e. apply the OwnCloud Contacts fix and then correct invalid VCards).
    2. After that, synchronize all contacts again. You can delete the DAVdroid account and add it again (or de-select the address book, synchronize, select it again, synchronize).


  • I think I found the issue myself. I added an gif :-/



  • Hello,

    I have the same issue. Since i have upgrade nextcloud server to 11.0 all modifications made on the phone failed on sync.
    Davdroid seems to add second REV value.
    Is this bug will be corrected to next release ?
    I can make tests if necessary.

    Best regards,



  • The same happened to me. I updated NextCloud from 10 to 11 (latest contacts app 1.5.2). Syncing worked fine for half an day and then suddenly I get this error while syncing contacts. It looks like Davdroid is sending invalid data to the server. Why does this happen and how can I correct this problem?

    Thank you!

    SYNCHRONIZATION INFO
    Synchronization phase: 4
    Account name: xxxxx@xxxx.de
    Authority: com.android.contacts

    HTTP REQUEST:
    PUT /oc/remote.php/dav/addressbooks/users/xxxxx/contacts/119F383B20BA45BFB3374CB03B7A6CD8.vcf
    If-Match: "8904941033fe86c4dd664f723bd63789"

    BEGIN:VCARD[CR][LF]
    VERSION:4.0[CR][LF]
    PRODID:+//IDN bitfire.at//DAVdroid/1.3.4.1-gplay vcard4android ez-vcard/0.1[CR][LF]
    0.0[CR][LF]
    X-GENDER:M[CR][LF]
    X-ABUID:119F383B20BA45BFB3374CB03B7A6CD8\:ABPerson[CR][LF]
    REV;VALUE=timestamp:2016-11-07T05:09:31.252Z[CR][LF]
    davdroid1.X-ABLabel:Home[CR][LF]
    UID:119F383B20BA45BFB3374CB03B7A6CD8[CR][LF]
    FN:xxxx/xxxx (xxxxx) xxxx[CR][LF]
    N:xxx;xxx/xxx;(xxx);;[CR][LF]
    TEL;TYPE=voice:+49 151 1111111111[CR][LF]
    davdroid1.EMAIL;TYPE=x-home:xxxxx@xxxx.de[CR][LF]
    REV:20161215T122225Z[CR][LF]
    END:VCARD[CR][LF]

    HTTP RESPONSE:
    http/1.1 415 Unsupported Media Type
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Content-Length: 286
    Content-Security-Policy: default-src 'none';
    Content-Type: application/xml; charset=utf-8
    Date: Thu, 15 Dec 2016 12:22:26 GMT
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Pragma: no-cache
    Server: Microsoft-IIS/8.5
    Set-Cookie: nc_username=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/oc; secure; httponly
    Set-Cookie: nc_token=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/oc; secure; httponly
    Set-Cookie: nc_session_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/oc; secure; httponly
    Set-Cookie: nc_username=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/oc/; secure; httponly
    Set-Cookie: nc_token=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/oc/; secure; httponly
    Set-Cookie: nc_session_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/oc/; secure; httponly
    Set-Cookie: ocac215dd5d7=1p3ktgp0sp4n7jl26q2qgb3fp5; path=/oc; secure; HttpOnly
    X-Powered-By: PHP/5.6.29
    X-Powered-By: ARR/2.5
    X-Powered-By: ASP.NET

    <?xml version="1.0" encoding="utf-8"?>[LF]
    <d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">[LF]
    <s:exception>Sabre\DAV\Exception\UnsupportedMediaType</s:exception>[LF]
    <s:message>Validation error in vCard: REV MUST NOT appear more than once in a VCARD component</s:message>[LF]
    </d:error>[LF]


  • developer

    Why does this happen

    Please read this thread.

    and how can I correct this problem?

    1. Please upgrade to a version of Nextcloud Contacts where the problem has been fixed.
    2. Make sure that your server doesn't serve any VCard with the questionable REV time format.
    3. Synchronize all contacts again. You can delete the DAVdroid account and add it again (or de-select the address book, synchronize, select it again, synchronize).


  • Thank you for your answer but i confused to say that Nextcloud patch don't solve issue.
    Here are the tests performed :

    1. Create contact on nextcloud
    2. Sync phone with davdroid

    2016-12-18 00:43:15 2 [HttpClient$1] Content-Type: text/vcard; version=4.0; charset=utf-8
    2016-12-18 00:43:15 2 [HttpClient$1]
    2016-12-18 00:43:15 2 [HttpClient$1] BEGIN:VCARD
    VERSION:4.0
    PRODID:-//Sabre//Sabre VObject 4.1.1//EN
    FN:AAA
    UID:5113db8d-c84b-41cd-9c76-57a742ccc595
    EMAIL;TYPE=HOME:0102030405
    REV:20161217T234249
    END:VCARD
    2016-12-18 00:43:15 2 [HttpClient$1] <-- END HTTP (178-byte body)

    1. Modify contact on the phone
    2. Sync with Davdroid (error 415 Unsupported Media Type)

    2016-12-18 00:59:05 1 [syncadapter.SyncAdapterService$SyncAdapter] Sync for com.android.contacts has been initiated
    2016-12-18 00:59:05 1 [AccountSettings] Account Vince has version 4, current version: 4
    2016-12-18 00:59:05 1 [AccountSettings] Account Vince has version 4, current version: 4
    2016-12-18 00:59:05 0 [cert4android.CustomCertManager$1] Connected to service
    2016-12-18 00:59:05 1 [syncadapter.SyncManager] Preparing synchronization
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering DAV property factories
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.AddressbookDescription$Factory for addressbook-description(urn:ietf:params:xml:ns:carddav)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.AddressbookHomeSet$Factory for addressbook-home-set(urn:ietf:params:xml:ns:carddav)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.AddressData$Factory for address-data(urn:ietf:params:xml:ns:carddav)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CalendarColor$Factory for calendar-color(http://apple.com/ns/ical/)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CalendarData$Factory for calendar-data(urn:ietf:params:xml:ns:caldav)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CalendarDescription$Factory for calendar-description(urn:ietf:params:xml:ns:caldav)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CalendarHomeSet$Factory for calendar-home-set(urn:ietf:params:xml:ns:caldav)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CalendarProxyReadFor$Factory for calendar-proxy-read-for(http://calendarserver.org/ns/)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CalendarProxyWriteFor$Factory for calendar-proxy-write-for(http://calendarserver.org/ns/)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CalendarTimezone$Factory for calendar-timezone(urn:ietf:params:xml:ns:caldav)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CalendarUserAddressSet$Factory for calendar-user-address-set(urn:ietf:params:xml:ns:caldav)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CurrentUserPrincipal$Factory for current-user-principal(DAV:)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.CurrentUserPrivilegeSet$Factory for current-user-privilege-set(DAV:)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.DisplayName$Factory for displayname(DAV:)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.GetContentType$Factory for getcontenttype(DAV:)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.GetCTag$Factory for getctag(http://calendarserver.org/ns/)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.GetETag$Factory for getetag(DAV:)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.GetLastModified$Factory for getlastmodified(DAV:)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.GroupMembership$Factory for group-membership(DAV:)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.ResourceType$Factory for resourcetype(DAV:)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.SupportedAddressData$Factory for supported-address-data(urn:ietf:params:xml:ns:carddav)
    2016-12-18 00:59:05 1 [dav4android.PropertyRegistry] Registering at.bitfire.dav4android.property.SupportedCalendarComponentSet$Factory for supported-calendar-component-set(urn:ietf:params:xml:ns:caldav)
    2016-12-18 00:59:05 1 [syncadapter.SyncManager] Querying capabilities
    2016-12-18 00:59:05 1 [HttpClient$1] --> PROPFIND https://xxxxxxxxxxxxxxx/remote.php/dav/addressbooks/users/vince/contacts/ http/1.1
    2016-12-18 00:59:05 1 [HttpClient$1] Content-Type: application/xml; charset=utf-8
    2016-12-18 00:59:05 1 [HttpClient$1] Content-Length: 258
    2016-12-18 00:59:05 1 [HttpClient$1] Depth: 0
    2016-12-18 00:59:05 1 [HttpClient$1]
    2016-12-18 00:59:05 1 [HttpClient$1] <?xml version='1.0' encoding='UTF-8' ?><propfind xmlns="DAV:" xmlns:CAL="urn:ietf:params:xml:ns:caldav" xmlns:CARD="urn:ietf:params:xml:ns:carddav"><prop><CARD:supported-address-data /><n0:getctag xmlns:n0="http://calendarserver.org/ns/" /></prop></propfind>
    2016-12-18 00:59:05 1 [HttpClient$1] --> END PROPFIND (258-byte body)
    2016-12-18 00:59:05 1 [cert4android.CustomCertManager$CustomHostnameVerifier] Verifying certificate for xxxxxxxxxxxxxxx
    2016-12-18 00:59:05 1 [dav4android.BasicDigestAuthHandler] Trying Basic auth preemptively
    2016-12-18 00:59:05 1 [dav4android.BasicDigestAuthHandler] Adding Basic authorization header for https://xxxxxxxxxxxxxxx/remote.php/dav/addressbooks/users/vince/contacts/
    2016-12-18 00:59:06 1 [HttpClient$1] <-- 207 Multi-Status https://xxxxxxxxxxxxxxx/remote.php/dav/addressbooks/users/vince/contacts/ (288ms)
    2016-12-18 00:59:06 1 [HttpClient$1] Date: Sat, 17 Dec 2016 23:59:21 GMT
    2016-12-18 00:59:06 1 [HttpClient$1] Server: Apache
    2016-12-18 00:59:06 1 [HttpClient$1] Strict-Transport-Security: max-age=15768000; includeSubDomains; preload
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: ocuki09hwg9i=sa42avn3moo7m7nf6diupd1nj0; path=/; HttpOnly
    2016-12-18 00:59:06 1 [HttpClient$1] Expires: Thu, 19 Nov 1981 08:52:00 GMT
    2016-12-18 00:59:06 1 [HttpClient$1] Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    2016-12-18 00:59:06 1 [HttpClient$1] Pragma: no-cache
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: oc_sessionPassphrase=Tz6evWIZG6R86x8JyrCLZJRluMmMOuGDje2pJ7ZxoZIbB%2BX4QYU%2FnTyn3TpyabkoONaR8XtW3ElWXLTn2r1s2X1KmRfuRFdPPsyPxMB%2Bl69Jmf77fMkFRlba7EA8aQYS; path=/; secure; httponly
    2016-12-18 00:59:06 1 [HttpClient$1] Content-Security-Policy: default-src 'none';
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: __Host-nc_sameSiteCookielax=true; path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=lax
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: __Host-nc_sameSiteCookiestrict=true; path=/; httponly;secure; expires=Fri, 31-Dec-2100 23:59:59 GMT; SameSite=strict
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: ocuki09hwg9i=5t5jp379l2gr3ncj8uc7ob5ce5; path=/; secure; HttpOnly
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: cookie_test=test; expires=Sun, 18-Dec-2016 00:59:22 GMT; Max-Age=3600
    2016-12-18 00:59:06 1 [HttpClient$1] Vary: Brief,Prefer
    2016-12-18 00:59:06 1 [HttpClient$1] DAV: 1, 3, extended-mkcol, access-control, calendarserver-principal-property-search, calendar-access, calendar-proxy, calendar-auto-schedule, calendar-availability, calendarserver-subscribed, oc-resource-sharing, oc-calendar-publishing, calendarserver-sharing, addressbook
    2016-12-18 00:59:06 1 [HttpClient$1] X-Content-Type-Options: nosniff
    2016-12-18 00:59:06 1 [HttpClient$1] X-XSS-Protection: 1; mode=block
    2016-12-18 00:59:06 1 [HttpClient$1] X-Robots-Tag: none
    2016-12-18 00:59:06 1 [HttpClient$1] X-Frame-Options: SAMEORIGIN
    2016-12-18 00:59:06 1 [HttpClient$1] X-Download-Options: noopen
    2016-12-18 00:59:06 1 [HttpClient$1] X-Permitted-Cross-Domain-Policies: none
    2016-12-18 00:59:06 1 [HttpClient$1] Content-Length: 821
    2016-12-18 00:59:06 1 [HttpClient$1] Content-Type: application/xml; charset=utf-8
    2016-12-18 00:59:06 1 [HttpClient$1]
    2016-12-18 00:59:06 1 [HttpClient$1] <?xml version="1.0"?>
    <d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">
    <d:response>
    <d:href>/remote.php/dav/addressbooks/users/vince/contacts/</d:href>
    <d:propstat>
    <d:prop>
    card:supported-address-data
    <card:address-data-type content-type="text/vcard" version="3.0"/>
    <card:address-data-type content-type="text/vcard" version="4.0"/>
    <card:address-data-type content-type="application/vcard+json" version="4.0"/>
    </card:supported-address-data>
    cs:getctag299</cs:getctag>
    </d:prop>
    <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
    </d:response>
    </d:multistatus>

    2016-12-18 00:59:06 1 [HttpClient$1] <-- END HTTP (821-byte body)
    2016-12-18 00:59:06 1 [dav4android.DavResource] Received <response> for https://xxxxxxxxxxxxxxx/remote.php/dav/addressbooks/users/vince/contacts/
    PARAMETER #1 = [getctag(http://calendarserver.org/ns/): GetCTag(cTag=299), supported-address-data(urn:ietf:params:xml:ns:carddav): at.bitfire.dav4android.property.SupportedAddressData@13a65f51]
    2016-12-18 00:59:06 1 [syncadapter.ContactsSyncManager] Server advertises VCard/4 support: true
    2016-12-18 00:59:06 1 [syncadapter.ContactsSyncManager] Contact group method: GROUP_VCARDS
    2016-12-18 00:59:06 1 [syncadapter.SyncManager] Processing locally deleted entries
    2016-12-18 00:59:06 1 [syncadapter.SyncManager] Locally preparing dirty entries
    2016-12-18 00:59:06 1 [syncadapter.SyncManager] Looking for contacts/groups without file name
    2016-12-18 00:59:06 1 [syncadapter.ContactsSyncManager] Looking for changed group memberships of contact 5113db8d-c84b-41cd-9c76-57a742ccc595.vcf
    2016-12-18 00:59:06 1 [syncadapter.SyncManager] Uploading dirty entries
    2016-12-18 00:59:06 1 [syncadapter.ContactsSyncManager] Preparing upload of VCard 5113db8d-c84b-41cd-9c76-57a742ccc595.vcf
    PARAMETER #1 = Contact(uid=5113db8d-c84b-41cd-9c76-57a742ccc595, displayName=AAA, givenName=AAA, familyName=null)
    2016-12-18 00:59:06 1 [syncadapter.SyncManager] Uploading locally modified record 5113db8d-c84b-41cd-9c76-57a742ccc595.vcf
    2016-12-18 00:59:06 1 [HttpClient$1] --> PUT https://xxxxxxxxxxxxxxx/remote.php/dav/addressbooks/users/vince/contacts/5113db8d-c84b-41cd-9c76-57a742ccc595.vcf http/1.1
    2016-12-18 00:59:06 1 [HttpClient$1] Content-Type: text/vcard;version=4.0
    2016-12-18 00:59:06 1 [HttpClient$1] Content-Length: 294
    2016-12-18 00:59:06 1 [HttpClient$1] If-Match: "ba8496e3babe191f2c3c93c6dde6a067"
    2016-12-18 00:59:06 1 [HttpClient$1]
    2016-12-18 00:59:06 1 [HttpClient$1] BEGIN:VCARD
    VERSION:4.0
    PRODID:+//IDN bitfire.at//DAVdroid/1.3.4.1-ose vcard4android ez-vcard/0.10.
    0
    REV;VALUE=timestamp:20161217T234249
    UID:5113db8d-c84b-41cd-9c76-57a742ccc595
    FN:AAA
    N:;AAA;;;
    EMAIL;TYPE=home:0102030405
    EMAIL;TYPE=work:aaa@bbb.cc
    REV:20161217T235906Z
    END:VCARD

    2016-12-18 00:59:06 1 [HttpClient$1] --> END PUT (294-byte body)
    2016-12-18 00:59:06 1 [dav4android.BasicDigestAuthHandler] Adding Basic authorization header for https://xxxxxxxxxxxxxxx/remote.php/dav/addressbooks/users/vince/contacts/5113db8d-c84b-41cd-9c76-57a742ccc595.vcf
    2016-12-18 00:59:06 1 [HttpClient$1] <-- 415 Unsupported Media Type https://xxxxxxxxxxxxxxx/remote.php/dav/addressbooks/users/vince/contacts/5113db8d-c84b-41cd-9c76-57a742ccc595.vcf (195ms)
    2016-12-18 00:59:06 1 [HttpClient$1] Date: Sat, 17 Dec 2016 23:59:22 GMT
    2016-12-18 00:59:06 1 [HttpClient$1] Server: Apache
    2016-12-18 00:59:06 1 [HttpClient$1] Strict-Transport-Security: max-age=15768000; includeSubDomains; preload
    2016-12-18 00:59:06 1 [HttpClient$1] Expires: Thu, 19 Nov 1981 08:52:00 GMT
    2016-12-18 00:59:06 1 [HttpClient$1] Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    2016-12-18 00:59:06 1 [HttpClient$1] Pragma: no-cache
    2016-12-18 00:59:06 1 [HttpClient$1] Content-Security-Policy: default-src 'none';
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: nc_username=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; secure; httponly
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: nc_token=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; secure; httponly
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: nc_session_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; secure; httponly
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: nc_username=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; httponly
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: nc_token=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; httponly
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: nc_session_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; httponly
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: ocuki09hwg9i=p250kmsp726hurc4r1kiuk2u34; path=/; secure; HttpOnly
    2016-12-18 00:59:06 1 [HttpClient$1] Set-Cookie: ocuki09hwg9i=ulqbeve49d12m1d5ipm3k3op05; path=/; secure; HttpOnly
    2016-12-18 00:59:06 1 [HttpClient$1] X-Content-Type-Options: nosniff
    2016-12-18 00:59:06 1 [HttpClient$1] X-XSS-Protection: 1; mode=block
    2016-12-18 00:59:06 1 [HttpClient$1] X-Robots-Tag: none
    2016-12-18 00:59:06 1 [HttpClient$1] X-Frame-Options: SAMEORIGIN
    2016-12-18 00:59:06 1 [HttpClient$1] X-Download-Options: noopen
    2016-12-18 00:59:06 1 [HttpClient$1] X-Permitted-Cross-Domain-Policies: none
    2016-12-18 00:59:06 1 [HttpClient$1] Content-Length: 286
    2016-12-18 00:59:06 1 [HttpClient$1] Content-Type: application/xml; charset=utf-8
    2016-12-18 00:59:06 1 [HttpClient$1]
    2016-12-18 00:59:06 1 [HttpClient$1] <?xml version="1.0" encoding="utf-8"?>
    <d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
    <s:exception>Sabre\DAV\Exception\UnsupportedMediaType</s:exception>
    <s:message>Validation error in vCard: REV MUST NOT appear more than once in a VCARD component</s:message>
    </d:error>

    2016-12-18 00:59:06 1 [HttpClient$1] <-- END HTTP (286-byte body)
    2016-12-18 00:59:06 1 [syncadapter.SyncManager] HTTP/DAV Exception during sync
    EXCEPTION at.bitfire.dav4android.exception.HttpException: 415 Unsupported Media Type
    at at.bitfire.dav4android.DavResource.checkStatus(DavResource.java:318)
    at at.bitfire.dav4android.DavResource.checkStatus(DavResource.java:291)
    at at.bitfire.dav4android.DavResource.put(DavResource.java:202)
    at at.bitfire.davdroid.syncadapter.SyncManager.uploadDirty(SyncManager.java:317)
    at at.bitfire.davdroid.syncadapter.SyncManager.performSync(SyncManager.java:147)
    at at.bitfire.davdroid.syncadapter.ContactsSyncAdapterService$ContactsSyncAdapter.onPerformSync(ContactsSyncAdapterService.java:66)
    at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:259)

    2016-12-18 00:59:06 1 [syncadapter.ContactsSyncAdapterService$ContactsSyncAdapter] Address book sync complete



Looks like your connection to Bitfire App Forums was lost, please wait while we try to reconnect.