diff --git a/cyrus-imapd30/Makefile b/cyrus-imapd30/Makefile index 1e7fb60792..f989372ea8 100644 --- a/cyrus-imapd30/Makefile +++ b/cyrus-imapd30/Makefile @@ -1,7 +1,7 @@ # $NetBSD: $ DISTNAME= cyrus-imapd-3.0.13 -REVISION= 1 +REVISION= 2 CATEGORIES= mail MASTER_SITES= ${MASTER_SITE_GITHUB:=cyrusimap/} GITHUB_RELEASE= ${PKGNAME_NOREV} diff --git a/cyrus-imapd30/TODO b/cyrus-imapd30/TODO index 6ffd069447..70a8ec6490 100644 --- a/cyrus-imapd30/TODO +++ b/cyrus-imapd30/TODO @@ -23,15 +23,27 @@ Done: - Integrated documentation from source package into the package +- Possibly create further patches for cyrus-imap 3 (especially with + regard to the newly added functions CalDAV / CardDAV), if necessary + Next steps: - regenerate documentation at build time using Sphinx -- Possibly create further patches for cyrus-imap 3 (especially with - regard to the newly added functions CalDAV / CardDAV), if necessary - Bugs: +- The way how the Dav-Patch is integrated. It is not a security patch + nor a patch that would be necessary to ensure the build. + In principle, it eliminates a functional deficiency, which may + not be a deficiency at all, but simply an implementation gap. + pkgsrc is therefore not the right place to deal with this problem, + I'm almost sure of that. Without this patch, the CalDAV / CardDAV + functionality cannot be used meaningfully for me, and in my + experience it will also be for most other users who want to + maintain a shared calendar, for example. I will definitely keep + an eye on what is going on upstream. In the meantime, I would like + to keep the patch here if there are no important reasons why. + - Kerberos support, PostgreSQL and MySQL are currently not tested For questions, tips or offers of help you can contact me at mp@petermann-it.de diff --git a/cyrus-imapd30/distinfo b/cyrus-imapd30/distinfo index 0e2d1ace3f..5a34cf7fca 100644 --- a/cyrus-imapd30/distinfo +++ b/cyrus-imapd30/distinfo @@ -4,3 +4,4 @@ SHA1 (cyrus-imapd-3.0.13.tar.gz) = 69d29e09ae4e4f3c8ae0c49a1024b7ec4dffbf57 RMD160 (cyrus-imapd-3.0.13.tar.gz) = b789c903620e83160fce4de3e06bbe0c842f7957 SHA512 (cyrus-imapd-3.0.13.tar.gz) = 5cd066916797efb975cdb97720f65edc72d3fe82afbd78a26aa8369d95ae4ca09c0593dd4bec5521156c64ea38af7a13065f3b35447a76267dec93feb0ac6ac6 Size (cyrus-imapd-3.0.13.tar.gz) = 10840005 bytes +SHA1 (patch-imap_http__dav.c) = dfbac5c379dce8977b28376692b8de7621caeca3 diff --git a/cyrus-imapd30/patches/patch-imap_http__dav.c b/cyrus-imapd30/patches/patch-imap_http__dav.c new file mode 100644 index 0000000000..e77248cd3d --- /dev/null +++ b/cyrus-imapd30/patches/patch-imap_http__dav.c @@ -0,0 +1,82 @@ +$NetBSD$ + +The CalDAV / CardDAV functionality of Cyrus IMAP supports the +auto-discovery mechanism, which is used by many clients to find out +the calendars and address books available for the respective user. +At the moment this does not work for shared calendars and address +books from other users. + +There was a discussion on this topic on Github: + + https://github.com/cyrusimap/cyrus-imapd/issues/2373 + +As part of the discussion, Дилян Палаузов provided a patch that +solves this problem. Unfortunately, it has not yet been included +in an official release because it may not yet be the complete solution +that covers all scenarios. + +Anyway - the patch is included here because, in my opinion, sharing +calendars and address books is an essential functionality of a +groupware. Without this patch, this will not work on clients that only +offer auto-discovery - i.e. most mobile devices. + +--- imap/http_dav.c.orig 2020-03-18 20:29:25.102243914 +0000 ++++ imap/http_dav.c +@@ -5455,7 +5455,7 @@ int propfind_by_collection(const mbentry + + if (!fctx->req_tgt->resource) { + len = make_collection_url(&writebuf, fctx->req_tgt->namespace->prefix, +- mboxname, fctx->req_tgt->userid, NULL); ++ mboxname, mbname_userid(mbname_from_intname(mboxname)), NULL); + + /* copy it all back into place... in theory we should check against + * 'last' and make sure it doesn't change from the original request. +@@ -5483,6 +5483,12 @@ int propfind_by_collection(const mbentry + return r; + } + ++static int wrapper_propfind_by_collection(struct findall_data *data, void* rock) { ++ if (!data || !data->mbentry) return 0; ++ struct propfind_ctx *fctx = (struct propfind_ctx *) rock; ++ if ((httpd_myrights(httpd_authstate, data->mbentry) & DACL_READ != DACL_READ)) return 0; ++ return propfind_by_collection(data->mbentry, fctx); ++} + + /* Perform a PROPFIND request */ + EXPORTED int meth_propfind(struct transaction_t *txn, void *params) +@@ -5746,12 +5752,13 @@ EXPORTED int meth_propfind(struct transa + else if (txn->req_tgt.mbentry) { + /* Add responses for all contained collections */ + fctx.prefer &= ~PREFER_NOROOT; +- mboxlist_mboxtree(txn->req_tgt.mbentry->name, +- propfind_by_collection, &fctx, +- MBOXTREE_SKIP_ROOT); + + switch (txn->req_tgt.namespace->id) { + case URL_NS_DRIVE: ++ mboxlist_mboxtree(txn->req_tgt.mbentry->name, ++ propfind_by_collection, &fctx, ++ MBOXTREE_SKIP_ROOT); ++ + if (txn->req_tgt.flags == TGT_DRIVE_ROOT) { + /* Add a response for 'user' hierarchy */ + buf_setcstr(&fctx.buf, txn->req_tgt.namespace->prefix); +@@ -5772,11 +5779,16 @@ EXPORTED int meth_propfind(struct transa + /* Fall through */ + + case URL_NS_ADDRESSBOOK: ++ { + /* Add responses for shared collections */ +- mboxlist_usersubs(txn->req_tgt.userid, +- propfind_by_collection, &fctx, +- MBOXTREE_SKIP_PERSONAL); ++ const char *conf_str = txn->req_tgt.namespace->id == URL_NS_CALENDAR ? ++ config_getstring(IMAPOPT_CALENDARPREFIX) : config_getstring(IMAPOPT_ADDRESSBOOKPREFIX); ++ char *pat = malloc(5 + strlen(conf_str)); ++ sprintf(pat, "*%s%c*", conf_str, httpd_namespace.hier_sep); ++ mboxlist_findall(&httpd_namespace, pat, httpd_userisadmin, txn->req_tgt.userid, httpd_authstate, wrapper_propfind_by_collection, &fctx); ++ free(pat); + break; ++ } + } + }