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, ¶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
More information about the Pkg-Cyrus-imapd-Debian-devel
mailing list