Bug#774128: [PATCH] This time with the patch

Daniel Curran-Dickinson daniel at daniel.thecshore.com
Mon Feb 2 09:23:03 UTC 2015


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
-------------- next part --------------
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 <debian at daniel.thecshore.com>  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 <debian at daniel.thecshore.com>
+
+---
+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, &param->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


More information about the Pkg-Cyrus-imapd-Debian-devel mailing list