On 2015-02-02 3:39 AM, Ondřej Surý wrote: > Daniel, > > since it seems you already have an updated package, could you please do > a full debdiff (debdiff old.dsc new.dsc) with all changes acumulated? > > It would be much easier to apply than cherry-picking the patches in N > different bug reports :).
Certainly - attached. I actually didn't know about this command and had to look up what package provided it. Regards, Daniel
diff -Nru cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/changelog cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/changelog --- cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/changelog 2015-01-07 07:30:44.000000000 -0500 +++ cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/changelog 2015-02-02 03:34:30.000000000 -0500 @@ -1,3 +1,9 @@ +cyrus-imapd-2.4 (2.4.17+caldav~beta10-17~dfd1) unstable; urgency=low + + * Fix users in virtual domains cannot access caldav/carddav + + -- Daniel Dickinson <[email protected]> Mon, 02 Feb 2015 03:23:22 -0500 + cyrus-imapd-2.4 (2.4.17+caldav~beta10-16) unstable; urgency=medium * Manually add dpkg (>= 1.17.14) to Pre-Depends to have correctly diff -Nru cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/patches/fix-caldav-virtdomain-users.patch cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/patches/fix-caldav-virtdomain-users.patch --- cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/patches/fix-caldav-virtdomain-users.patch 1969-12-31 19:00:00.000000000 -0500 +++ cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/patches/fix-caldav-virtdomain-users.patch 2015-02-02 03:34:44.000000000 -0500 @@ -0,0 +1,276 @@ +Description: Fix CalDAV/CardDAV with Virtual Domains + Fix CalDAV/CardDAV when user is in a virtual domain so that the virtual + domain gets used in the mailbox name. This fixes CalDAV failing + to create/open mailbox for calendars when user is not in default + or only domain. + There were three issues. The first was that if you specify a domain + in the calendar URI it is converted as if it it were a mailbox name + instead of cyrus domain part (e.g. with '.' separator '.' in domain + is converted to '^') of mailbox name. + This second was that in calendar lookups for scheduling the userid + part of the mailbox name got the domain part truncated due to + '@' being replaced by NUL (string terminator) in calendar lookup + function (caladdress_lookup). + The third was that in some cases mailboxname creation functions + didn't use the standard functions and failed correctly created + mailbox name when mailbox had a domain. + . +Author: Daniel Dickinson <[email protected]> + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: <vendor|upstream|other>, <url of original patch> +Bug: <url in upstream bugtracker> +Bug-Debian: https://bugs.debian.org/<bugnumber> +Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber> +Forwarded: <no|not-needed|url proving that it has been forwarded> +Reviewed-By: <name and email of someone who approved the patch> +Last-Update: <YYYY-MM-DD> + +Index: cyrus-imapd-2.4-2.4.17+caldav~beta10.test/imap/http_caldav.c +=================================================================== +--- cyrus-imapd-2.4-2.4.17+caldav~beta10.test.orig/imap/http_caldav.c ++++ cyrus-imapd-2.4-2.4.17+caldav~beta10.test/imap/http_caldav.c +@@ -631,8 +631,9 @@ static void my_caldav_auth(const char *u + + /* Auto-provision calendars for 'userid' */ + +- strlcpy(ident, userid, sizeof(ident)); ++ strlcpy(ident, userid, strcspn(userid, "@")); + mboxname_hiersep_toexternal(&httpd_namespace, ident, 0); ++ strlcpy(ident + strlen(ident), userid + strlen(ident), sizeof(ident) - strlen(ident)); + + /* calendar-home-set */ + r = mboxlist_lookup(mailboxname, &mbentry, NULL); +@@ -761,6 +762,10 @@ static int caldav_parse_path(const char + char *p; + size_t len, siz; + static const char *prefix = NULL; ++ char userid[MAX_MAILBOX_BUFFER]; ++ char userdomain[MAX_MAILBOX_BUFFER]; ++ char *domain_start; ++ int userlen, domainlen; + + /* Make a working copy of target path */ + strlcpy(tgt->path, path, sizeof(tgt->path)); +@@ -857,13 +862,20 @@ static int caldav_parse_path(const char + p = tgt->mboxname; + siz = MAX_MAILBOX_BUFFER; + if (tgt->user) { +- len = snprintf(p, siz, "user"); +- p += len; +- siz -= len; +- + if (tgt->userlen) { +- len = snprintf(p, siz, ".%.*s", (int) tgt->userlen, tgt->user); +- mboxname_hiersep_tointernal(&httpd_namespace, p+1, tgt->userlen); ++ domain_start = strchr(tgt->user, '@'); ++ if (domain_start != NULL) { ++ userlen = domain_start - tgt->user + 1; ++ domain_start++; ++ domainlen = tgt->userlen - userlen + 1; ++ strlcpy(userid, tgt->user, userlen); ++ mboxname_hiersep_tointernal(&httpd_namespace, userid, userlen); ++ strlcpy(userdomain, domain_start, domainlen); ++ len = snprintf(p, siz, "%.*s!user.%.*s", (int) domainlen, userdomain, (int) userlen, userid); ++ } else { ++ len = snprintf(p, siz, "user.%.*s", (int) tgt->userlen, tgt->user); ++ mboxname_hiersep_tointernal(&httpd_namespace, p+5, tgt->userlen); ++ } + p += len; + siz -= len; + } +@@ -1917,8 +1929,9 @@ static int caldav_post(struct transactio + if (organizer) { + if (!caladdress_lookup(organizer, &sparam) && + !(sparam.flags & SCHEDTYPE_REMOTE)) { +- strlcpy(orgid, sparam.userid, sizeof(orgid)); ++ strlcpy(orgid, sparam.userid, strcspn(sparam.userid, "@")); + mboxname_hiersep_toexternal(&httpd_namespace, orgid, 0); ++ strlcpy(orgid + strlen(orgid), sparam.userid + strlen(orgid), sizeof(orgid) - strlen(orgid)); + } + } + +@@ -2133,8 +2146,9 @@ static int caldav_put(struct transaction + /* CALDAV:unique-scheduling-object-resource */ + char ext_userid[MAX_MAILBOX_NAME+1]; + +- strlcpy(ext_userid, userid, sizeof(ext_userid)); ++ strlcpy(ext_userid, userid, strcspn(userid, "@")); + mboxname_hiersep_toexternal(&httpd_namespace, ext_userid, 0); ++ strlcpy(ext_userid + strlen(ext_userid), userid + strlen(ext_userid), sizeof(ext_userid) - strlen(ext_userid)); + + txn->error.precond = CALDAV_UNIQUE_OBJECT; + assert(!buf_len(&txn->buf)); +@@ -4096,9 +4110,12 @@ static int store_resource(struct transac + + int caladdress_lookup(const char *addr, struct sched_param *param) + { +- char *p; ++ char *p, *domain_start; + int islocal = 1, found = 1; + static char userid[MAX_MAILBOX_BUFFER]; ++ static char tmpuserid[MAX_MAILBOX_BUFFER]; ++ static char tmpuserdomain[MAX_MAILBOX_BUFFER]; ++ int userlen, domainlen, useridlen; + + memset(param, 0, sizeof(struct sched_param)); + +@@ -4110,7 +4127,8 @@ int caladdress_lookup(const char *addr, + /* XXX Do LDAP/DB/socket lookup to see if user is local */ + /* XXX Hack until real lookup stuff is written */ + strlcpy(userid, p, sizeof(userid)); +- if ((p = strchr(userid, '@')) && !(*p = '\0') && *++p) { ++ strlcpy(tmpuserid, p, sizeof(tmpuserid)); ++ if ((p = strchr(tmpuserid, '@')) && !(*p = '\0') && *++p) { + struct strlist *domains = cua_domains; + + for (; domains && strcmp(p, domains->s); domains = domains->next); +@@ -4132,9 +4150,20 @@ int caladdress_lookup(const char *addr, + calendarprefix = config_getstring(IMAPOPT_CALENDARPREFIX); + } + +- mboxname_hiersep_tointernal(&httpd_namespace, userid, 0); +- snprintf(mailboxname, sizeof(mailboxname), +- "user.%s.%s", param->userid, calendarprefix); ++ domain_start = strchr(userid, '@'); ++ if (domain_start != NULL) { ++ userlen = domain_start - userid + 1; ++ domain_start++; ++ useridlen = strcspn(userid, "/"); ++ domainlen = useridlen - userlen + 1; ++ strlcpy(tmpuserid, userid, userlen); ++ mboxname_hiersep_tointernal(&httpd_namespace, tmpuserid, 0); ++ strlcpy(tmpuserdomain, domain_start, domainlen); ++ snprintf(mailboxname, sizeof(mailboxname), "%.*s!user.%.*s.%s", (int) domainlen, tmpuserdomain, (int) userlen, tmpuserid, calendarprefix); ++ } else { ++ snprintf(mailboxname, sizeof(mailboxname), "user.%s.%s", userid, calendarprefix); ++ mboxname_hiersep_tointernal(&httpd_namespace, userid, 0); ++ } + + r = http_mlookup(mailboxname, ¶m->server, NULL, NULL); + if (!r) { +@@ -4441,6 +4470,10 @@ int sched_busytime_query(struct transact + static const char *calendarprefix = NULL; + icalcomponent *comp; + char mailboxname[MAX_MAILBOX_BUFFER]; ++ char tmpuserid[MAX_MAILBOX_BUFFER]; ++ char tmpuserdomain[MAX_MAILBOX_BUFFER]; ++ char *domain_start; ++ int userlen, domainlen, useridlen; + icalproperty *prop = NULL, *next; + const char *uid = NULL, *organizer = NULL; + struct sched_param sparam; +@@ -4583,9 +4616,19 @@ int sched_busytime_query(struct transact + + + /* Check ACL of ORGANIZER on attendee's Scheduling Inbox */ +- snprintf(mailboxname, sizeof(mailboxname), +- "user.%s.%s.Inbox", userid, calendarprefix); +- ++ domain_start = strchr(userid, '@'); ++ if (domain_start != NULL) { ++ userlen = domain_start - userid + 1; ++ domain_start++; ++ useridlen = strcspn(userid, "/"); ++ domainlen = useridlen - userlen + 1; ++ strlcpy(tmpuserid, userid, userlen); ++ strlcpy(tmpuserdomain, domain_start, domainlen); ++ snprintf(mailboxname, sizeof(mailboxname), "%.*s!user.%.*s.%s.Inbox", (int) domainlen, tmpuserdomain, (int) userlen, tmpuserid, calendarprefix); ++ } else { ++ snprintf(mailboxname, sizeof(mailboxname), "user.%s.%s.Inbox", userid, calendarprefix); ++ } ++ + if ((r = mboxlist_lookup(mailboxname, &mbentry, NULL))) { + syslog(LOG_INFO, "mboxlist_lookup(%s) failed: %s", + mailboxname, error_message(r)); +@@ -4602,8 +4645,18 @@ int sched_busytime_query(struct transact + + else { + /* Start query at attendee's calendar-home-set */ +- snprintf(mailboxname, sizeof(mailboxname), +- "user.%s.%s", userid, calendarprefix); ++ domain_start = strchr(userid, '@'); ++ if (domain_start != NULL) { ++ userlen = domain_start - userid + 1; ++ domain_start++; ++ useridlen = strcspn(userid, "/"); ++ domainlen = useridlen - userlen + 1; ++ strlcpy(tmpuserid, userid, userlen); ++ strlcpy(tmpuserdomain, domain_start, domainlen); ++ snprintf(mailboxname, sizeof(mailboxname), "%.*s!user.%.*s.%s.Inbox", (int) domainlen, tmpuserdomain, (int) userlen, tmpuserid, calendarprefix); ++ } else { ++ snprintf(mailboxname, sizeof(mailboxname), "user.%s.%s.Inbox", userid, calendarprefix); ++ } + + fctx.davdb = NULL; + fctx.req_tgt->collection = NULL; +Index: cyrus-imapd-2.4-2.4.17+caldav~beta10.test/imap/http_carddav.c +=================================================================== +--- cyrus-imapd-2.4-2.4.17+caldav~beta10.test.orig/imap/http_carddav.c ++++ cyrus-imapd-2.4-2.4.17+caldav~beta10.test/imap/http_carddav.c +@@ -368,8 +368,9 @@ static void my_carddav_auth(const char * + } + + /* Auto-provision an addressbook for 'userid' */ +- strlcpy(ident, userid, sizeof(ident)); ++ strlcpy(ident, userid, strcspn(userid, "@")); + mboxname_hiersep_toexternal(&httpd_namespace, ident, 0); ++ strlcpy(ident + strlen(ident), userid + strlen(ident), sizeof(ident) - strlen(ident)); + + /* addressbook-home-set */ + len += snprintf(mailboxname+len, MAX_MAILBOX_BUFFER - len, ".%s", +@@ -461,6 +462,10 @@ static int carddav_parse_path(const char + char *p; + size_t len, siz; + static const char *prefix = NULL; ++ char userid[MAX_MAILBOX_BUFFER]; ++ char userdomain[MAX_MAILBOX_BUFFER]; ++ char *domain_start; ++ int userlen, domainlen; + + /* Make a working copy of target path */ + strlcpy(tgt->path, path, sizeof(tgt->path)); +@@ -546,13 +551,20 @@ static int carddav_parse_path(const char + p = tgt->mboxname; + siz = MAX_MAILBOX_BUFFER; + if (tgt->user) { +- len = snprintf(p, siz, "user"); +- p += len; +- siz -= len; +- + if (tgt->userlen) { +- len = snprintf(p, siz, ".%.*s", (int) tgt->userlen, tgt->user); +- mboxname_hiersep_tointernal(&httpd_namespace, p+1, tgt->userlen); ++ domain_start = strchr(tgt->user, '@'); ++ if (domain_start != NULL) { ++ userlen = domain_start - tgt->user + 1; ++ domain_start++; ++ domainlen = tgt->userlen - userlen + 1; ++ strlcpy(userid, tgt->user, userlen); ++ mboxname_hiersep_tointernal(&httpd_namespace, userid, userlen); ++ strlcpy(userdomain, domain_start, domainlen); ++ len = snprintf(p, siz, "%.*s!user.%.*s", (int) domainlen, userdomain, (int) userlen, userid); ++ } else { ++ len = snprintf(p, siz, "user.%.*s", (int) tgt->userlen, tgt->user); ++ mboxname_hiersep_tointernal(&httpd_namespace, p+5, tgt->userlen); ++ } + p += len; + siz -= len; + } +Index: cyrus-imapd-2.4-2.4.17+caldav~beta10.test/imap/http_dav.c +=================================================================== +--- cyrus-imapd-2.4-2.4.17+caldav~beta10.test.orig/imap/http_dav.c ++++ cyrus-imapd-2.4-2.4.17+caldav~beta10.test/imap/http_dav.c +@@ -4716,7 +4716,7 @@ static int principal_search(char *mboxna + if (!(p = mboxname_isusermailbox(mboxname, 1))) return 0; + + strlcpy(userid, p, MAX_MAILBOX_NAME+1); +- mboxname_hiersep_toexternal(&httpd_namespace, userid, 0); ++ //mboxname_hiersep_toexternal(&httpd_namespace, userid, 0); + + for (search_crit = (struct search_crit *) fctx->filter_crit; + search_crit; search_crit = search_crit->next) { diff -Nru cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/patches/series cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/patches/series --- cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/patches/series 2015-01-07 07:30:44.000000000 -0500 +++ cyrus-imapd-2.4-2.4.17+caldav~beta10/debian/patches/series 2015-02-02 03:34:55.000000000 -0500 @@ -34,3 +34,4 @@ parse-GUID-for-binary-appends-as-well.patch use-system-unicodedata.patch TLS-configuration.patch +fix-caldav-virtdomain-users.patch

