Misbehavior cyrus caldav and evolution. Calendar is readonly.

Stephan skpub at asksoftware.de
Wed Jan 28 12:21:20 EST 2015


Hi,

I am aiming to run cyrus with caldav and carddav support. On the client 
side I am using evolution.

First step was compiling cyrus-imapd-2.4.14-caldav-beta10. After some 
configuration issues I managed to connect to my test calendar via 
browser/url and evolution. But I failed in doing some calendar entry 
because evolution tells me calendar is readonly.

I like your approach, so I tried to figure out whats going on. After 
verification of access rights with cryadm/lam I started with some 
wireshark-analysis. Which clarified for me that evolution obtains 
calendar access rights by doing an OPTION request.

This page showed me how it should look like :
http://lists.andrew.cmu.edu/pipermail/info-cyrus/2014-June/037418.html

I recognized that PUT (ALLOW_WRITE in cyrus code) is missing in my 
optionslist. While reviewing the code I found that

http_caldav.c/caldav_parse_path(...)

helps to determine values returned by the OPTION request. Path is 
splitted into
* collection
* resource

Where resource pointer is responsible for setting the ALLOW_WRITE option :

caldav_parse_path(...)
...
   done:
     /* Set proper Allow bits and flags based on path components */
     if (tgt->collection) {
...
     if (tgt->resource) {
         if (!tgt->flags) tgt->allow |= ALLOW_WRITE;
         tgt->allow |= ALLOW_DELETE;
         tgt->allow &= ~ALLOW_WRITECOL;
     }
...

When evolutions wants to determine calendar access rights it requests an 
collection but no resource. Because it wants to know about calendars 
access at all not some specific resource. But collection case doesn't 
set the ALLOW_WRITE flag. I guess that makes evolution mark calendar as 
readonly and prevents users from writing it.

I worked arround quickly by :

caldav_parse_path(...)
...
     tgt->collection = p;
     tgt->collen = len;

     p += len;
     if (!*p || !*++p) {
     /* Make sure collection is terminated with '/' */
     if (p[-1] != '/') *p++ = '/';
     if (!tgt->flags) tgt->allow |= ALLOW_WRITE;
...
     }

But evaluation of this is difficult to me. I am new to imap and your 
source. So I don't know if I missconfigured the build or misinterpret 
something. What do you say ?

Thank you in advance.

Stephan




More information about the Cyrus-devel mailing list