diff options
author | Tobias Scherbaum <dertobi123@gentoo.org> | 2009-06-12 20:38:50 +0000 |
---|---|---|
committer | Tobias Scherbaum <dertobi123@gentoo.org> | 2009-06-12 20:38:50 +0000 |
commit | 91d5871c8537794a1b6577384424e5bcc19f377c (patch) | |
tree | 2cdeebe824ac78e45e371d153bff9617323711f0 /net-mail/cyrus-imapd | |
parent | Automated update of use.local.desc (diff) | |
download | gentoo-2-91d5871c8537794a1b6577384424e5bcc19f377c.tar.gz gentoo-2-91d5871c8537794a1b6577384424e5bcc19f377c.tar.bz2 gentoo-2-91d5871c8537794a1b6577384424e5bcc19f377c.zip |
Revbump, include kolab-patches
(Portage version: 2.2_rc33/cvs/Linux x86_64)
Diffstat (limited to 'net-mail/cyrus-imapd')
-rw-r--r-- | net-mail/cyrus-imapd/ChangeLog | 12 | ||||
-rw-r--r-- | net-mail/cyrus-imapd/cyrus-imapd-2.3.14-r1.ebuild | 266 | ||||
-rw-r--r-- | net-mail/cyrus-imapd/files/kolab/2.3.14/Annotations2.patch | 356 | ||||
-rw-r--r-- | net-mail/cyrus-imapd/files/kolab/2.3.14/Folder-names.patch | 17 | ||||
-rw-r--r-- | net-mail/cyrus-imapd/files/kolab/2.3.14/Groups2.patch | 232 | ||||
-rw-r--r-- | net-mail/cyrus-imapd/files/kolab/2.3.14/Logging.patch | 58 | ||||
-rw-r--r-- | net-mail/cyrus-imapd/files/kolab/2.3.14/UID.patch | 117 | ||||
-rw-r--r-- | net-mail/cyrus-imapd/files/kolab/2.3.14/timsieved_starttls-sendcaps.patch | 21 |
8 files changed, 1078 insertions, 1 deletions
diff --git a/net-mail/cyrus-imapd/ChangeLog b/net-mail/cyrus-imapd/ChangeLog index 006a8528c1d1..154b86851687 100644 --- a/net-mail/cyrus-imapd/ChangeLog +++ b/net-mail/cyrus-imapd/ChangeLog @@ -1,6 +1,16 @@ # ChangeLog for net-mail/cyrus-imapd # Copyright 1999-2009 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/net-mail/cyrus-imapd/ChangeLog,v 1.138 2009/06/08 03:33:33 jer Exp $ +# $Header: /var/cvsroot/gentoo-x86/net-mail/cyrus-imapd/ChangeLog,v 1.139 2009/06/12 20:38:50 dertobi123 Exp $ + +*cyrus-imapd-2.3.14-r1 (12 Jun 2009) + + 12 Jun 2009; Tobias Scherbaum <dertobi123@gentoo.org> + +files/kolab/2.3.14/Annotations2.patch, + +files/kolab/2.3.14/Folder-names.patch, +files/kolab/2.3.14/Groups2.patch, + +files/kolab/2.3.14/Logging.patch, +files/kolab/2.3.14/UID.patch, + +files/kolab/2.3.14/timsieved_starttls-sendcaps.patch, + +cyrus-imapd-2.3.14-r1.ebuild: + Revbump, include kolab-patches 08 Jun 2009; Jeroen Roovers <jer@gentoo.org> cyrus-imapd-2.3.14.ebuild: Stable for HPPA (bug #271800). diff --git a/net-mail/cyrus-imapd/cyrus-imapd-2.3.14-r1.ebuild b/net-mail/cyrus-imapd/cyrus-imapd-2.3.14-r1.ebuild new file mode 100644 index 000000000000..0203b4878ec0 --- /dev/null +++ b/net-mail/cyrus-imapd/cyrus-imapd-2.3.14-r1.ebuild @@ -0,0 +1,266 @@ +# Copyright 1999-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/net-mail/cyrus-imapd/cyrus-imapd-2.3.14-r1.ebuild,v 1.1 2009/06/12 20:38:50 dertobi123 Exp $ + +EAPI=1 + +inherit autotools eutils ssl-cert fixheadtails pam multilib + +MY_P=${P/_/} + +DESCRIPTION="The Cyrus IMAP Server." +HOMEPAGE="http://asg.web.cmu.edu/cyrus/imapd/" +SRC_URI="ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/${MY_P}.tar.gz" +LIBWRAP_PATCH_VER="2.2" + +LICENSE="as-is" +SLOT="0" +KEYWORDS="~amd64 ~hppa ~ppc ~ppc64 ~sparc ~x86" +IUSE="idled kerberos kolab nntp pam replication +sieve snmp ssl tcpd" + +PROVIDE="virtual/imapd" +RDEPEND=">=sys-libs/db-3.2 + >=dev-libs/cyrus-sasl-2.1.13 + pam? ( + virtual/pam + >=net-mail/mailbase-1 + ) + kerberos? ( virtual/krb5 ) + snmp? ( >=net-analyzer/net-snmp-5.2.2-r1 ) + ssl? ( >=dev-libs/openssl-0.9.6 ) + tcpd? ( >=sys-apps/tcp-wrappers-7.6 ) + kolab? ( net-nds/openldap ) + nntp? ( !net-nntp/leafnode )" + +DEPEND="$RDEPEND + sys-devel/libtool + >=sys-devel/autoconf-2.58 + sys-devel/automake" + +RDEPEND="$RDEPEND + !virtual/imapd" + +new_net-snmp_check() { + # tcpd USE flag check. Bug #68254. + if use tcpd ; then + if has_version net-analyzer/net-snmp && ! built_with_use net-analyzer/net-snmp tcpd ; then + eerror "You are emerging this package with USE=\"tcpd\"" + eerror "but \"net-analyzer/net-snmp\" has been emerged with USE=\"-tcpd\"" + fail_msg + fi + else + if has_version net-analyzer/net-snmp && built_with_use net-analyzer/net-snmp tcpd ; then + eerror "You are emerging this package with USE=\"-tcpd\"" + eerror "but \"net-analyzer/net-snmp\" has been emerged with USE=\"tcpd\"" + fail_msg + fi + fi + # DynaLoader check. Bug #67411 + + if [ -x "$(type -p net-snmp-config)" ]; then + einfo "$(type -p net-snmp-config) is found and executable." + NSC_AGENTLIBS="$(net-snmp-config --agent-libs)" + einfo "NSC_AGENTLIBS=\""${NSC_AGENTLIBS}"\"" + if [ -z "$NSC_AGENTLIBS" ]; then + eerror "NSC_AGENTLIBS is null" + einfo "please report this to bugs.gentoo.org" + fi + for i in ${NSC_AGENTLIBS}; do + # check for the DynaLoader path. + if [ "$(expr "$i" : '.*\(DynaLoader\)')" == "DynaLoader" ] ; then + DYNALOADER_PATH="$i" + einfo "DYNALOADER_PATH=\""${DYNALOADER_PATH}"\"" + if [[ ! -f "${DYNALOADER_PATH}" ]]; then + eerror "\""${DYNALOADER_PATH}"\" is not found." + einfo "Have you upgraded \"perl\" after" + einfo "you emerged \"net-snmp\". Please re-emerge" + einfo "\"net-snmp\" then try again. Bug #67411." + die "\""${DYNALOADER_PATH}"\" is not found." + fi + fi + done + else + eerror "\"net-snmp-config\" not found or not executable!" + die "You have \"net-snmp\" installed but \"net-snmp-config\" is not found or not executable. Please re-emerge \"net-snmp\" and try again!" + fi +} + +fail_msg() { + eerror "enable "snmp" USE flag for this package requires" + eerror "that net-analyzer/net-snmp and this package both build with" + eerror "\"tcpd\" or \"-tcpd\". Bug #68254" + die "sanity check failed." +} + +pkg_setup() { + use snmp && new_net-snmp_check + enewuser cyrus -1 -1 /usr/cyrus mail +} + +S=${WORKDIR}/${MY_P} + +src_unpack() { + unpack ${A} && cd "${S}" + + ht_fix_file "${S}"/imap/xversion.sh + + # Fix prestripped binaries + epatch "${FILESDIR}/${PN}-strip.patch" + + if use kolab ; then + EPATCH_SOURCE="${FILESDIR}/kolab/${PV}" EPATCH_SUFFIX="patch" \ + EPATCH_FORCE="yes" epatch + # These files are being created automatically and need to be updated + # # after the patches used above + rm -f lib/imapopts.h lib/imapopts.c + fi + + + # Add libwrap defines as we don't have a dynamicly linked library. + use tcpd && epatch "${FILESDIR}/${PN}-${LIBWRAP_PATCH_VER}-libwrap.patch" + + # Fix master(8)->cyrusmaster(8) manpage. + for i in `grep -rl -e 'master\.8' -e 'master(8)' "${S}"` ; do + sed -i -e 's:master\.8:cyrusmaster.8:g' \ + -e 's:master(8):cyrusmaster(8):g' \ + "${i}" || die "sed failed" || die "sed failed" + done + mv man/master.8 man/cyrusmaster.8 || die "mv failed" + sed -i -e "s:MASTER:CYRUSMASTER:g" \ + -e "s:Master:Cyrusmaster:g" \ + -e "s:master:cyrusmaster:g" \ + man/cyrusmaster.8 || die "sed failed" + + # Recreate configure. + WANT_AUTOCONF="2.5" + AT_M4DIR="cmulocal" eautoreconf + + # When linking with rpm, you need to link with more libraries. + sed -i -e "s:lrpm:lrpm -lrpmio -lrpmdb:" configure || die "sed failed" + + if use kolab ; then + sed -i -e "s/{LIB_SASL}/{LIB_SASL} -lldap -llber /" configure || die + "sed failed" + fi +} + +src_compile() { + local myconf + myconf="${myconf} $(use_with ssl openssl)" + myconf="${myconf} $(use_with snmp ucdsnmp)" + myconf="${myconf} $(use_with tcpd libwrap)" + myconf="${myconf} $(use_enable kerberos gssapi) $(use_enable kerberos krb5afspts)" + myconf="${myconf} $(use_enable idled)" + myconf="${myconf} $(use_enable nntp)" + myconf="${myconf} $(use_enable replication)" + + if use kerberos; then + myconf="${myconf} --with-krb=$(krb5-config --prefix) --with-krbdes=no" + else + myconf="${myconf} --with-krb=no" + fi + + econf \ + --enable-murder \ + --enable-listext \ + --enable-netscapehack \ + --with-service-path=/usr/$(get_libdir)/cyrus \ + --with-cyrus-user=cyrus \ + --with-cyrus-group=mail \ + --with-com_err=yes \ + --without-perl \ + ${myconf} || die "econf failed" + + # needed for parallel make. Bug #72352. + cd "${S}"/imap + emake xversion.h || die "emake xversion.h failed" + + # -j1 for #222529 + cd "${S}" + emake -j1 || die "compile problem" +} + +src_install() { + local SUBDIRS + + if use sieve; then + SUBDIRS="master imap imtest timsieved notifyd sieve" + else + SUBDIRS="master imap imtest" + fi + + dodir /usr/bin /usr/lib + for subdir in ${SUBDIRS}; do + make -C "${subdir}" DESTDIR="${D}" install || die "make install failed" + done + + # Link master to cyrusmaster (postfix has a master too) + dosym /usr/lib/cyrus/master /usr/lib/cyrus/cyrusmaster + + if ! use nntp ; then + rm man/fetchnews.8 man/syncnews.8 man/nntpd.8 man/nntptest.1 + rm "${D}"/usr/bin/nntptest + fi + + doman man/*.[0-8] + dodoc COPYRIGHT README* + dohtml doc/*.html doc/murder.png + cp doc/cyrusv2.mc "${D}/usr/share/doc/${PF}/html" + cp -r contrib tools "${D}/usr/share/doc/${PF}" + find "${D}/usr/share/doc" -name CVS -print0 | xargs -0 rm -rf + + insinto /etc + doins "${FILESDIR}/cyrus.conf" "${FILESDIR}/imapd.conf" + + newinitd "${FILESDIR}/cyrus.rc6" cyrus + newconfd "${FILESDIR}/cyrus.confd" cyrus + newpamd "${FILESDIR}/cyrus.pam-include" sieve + + for subdir in imap/{,db,log,msg,proc,socket,sieve} spool/imap/{,stage.} ; do + keepdir "/var/${subdir}" + fowners cyrus:mail "/var/${subdir}" + fperms 0750 "/var/${subdir}" + done + for subdir in imap/{user,quota,sieve} spool/imap ; do + for i in a b c d e f g h i j k l m n o p q r s t v u w x y z ; do + keepdir "/var/${subdir}/${i}" + fowners cyrus:mail "/var/${subdir}/${i}" + fperms 0750 "/var/${subdir}/${i}" + done + done +} + +pkg_postinst() { + # do not install server.{key,pem) if they are exist. + use ssl && { + if [ ! -f "${ROOT}"etc/ssl/cyrus/server.key ]; then + install_cert /etc/ssl/cyrus/server + chown cyrus:mail "${ROOT}"etc/ssl/cyrus/server.{key,pem} + fi + } + + if df -T /var/imap | grep -q ' ext2 ' ; then + ebegin "Making /var/imap/user/* and /var/imap/quota/* synchronous." + chattr +S /var/imap/{user,quota}{,/*} + eend $? + fi + + if df -T /var/spool/imap | grep -q ' ext2 ' ; then + ebegin "Making /var/spool/imap/* synchronous." + chattr +S /var/spool/imap{,/*} + eend $? + fi + + ewarn "If the queue directory of the mail daemon resides on an ext2" + ewarn "filesystem you need to set it manually to update" + ewarn "synchronously. E.g. 'chattr +S /var/spool/mqueue'." + echo + + elog "For correct logging add the following to /etc/syslog.conf:" + elog " local6.* /var/log/imapd.log" + elog " auth.debug /var/log/auth.log" + echo + + elog "You have to add user cyrus to the sasldb2. Do this with:" + elog " saslpasswd2 cyrus" +} diff --git a/net-mail/cyrus-imapd/files/kolab/2.3.14/Annotations2.patch b/net-mail/cyrus-imapd/files/kolab/2.3.14/Annotations2.patch new file mode 100644 index 000000000000..87fa920fc08f --- /dev/null +++ b/net-mail/cyrus-imapd/files/kolab/2.3.14/Annotations2.patch @@ -0,0 +1,356 @@ +Provides a new version of annotation support for the cyrus imapd server [Version: 2.3.9] + +diff -r 321cda1d6136 imap/annotate.c +--- a/imap/annotate.c Tue Apr 22 10:44:56 2008 +0200 ++++ b/imap/annotate.c Tue Apr 22 10:47:04 2008 +0200 +@@ -90,6 +90,8 @@ int (*proxy_fetch_func)(const char *serv + struct strlist *attribute_pat) = NULL; + int (*proxy_store_func)(const char *server, const char *mbox_pat, + struct entryattlist *entryatts) = NULL; ++ ++void init_annotation_definitions(); + + /* String List Management */ + /* +@@ -237,6 +239,8 @@ void annotatemore_init(int myflags, + if (store_func) { + proxy_store_func = store_func; + } ++ ++ init_annotation_definitions(); + } + + void annotatemore_open(char *fname) +@@ -1832,6 +1836,224 @@ const struct annotate_st_entry mailbox_r + { NULL, 0, ANNOTATION_PROXY_T_INVALID, 0, 0, NULL, NULL } + }; + ++struct annotate_st_entry_list *server_entries_list = NULL; ++struct annotate_st_entry_list *mailbox_rw_entries_list = NULL; ++ ++enum { ++ ANNOTATION_SCOPE_SERVER = 1, ++ ANNOTATION_SCOPE_MAILBOX = 2 ++}; ++ ++const struct annotate_attrib annotation_scope_names[] = ++{ ++ { "server", ANNOTATION_SCOPE_SERVER }, ++ { "mailbox", ANNOTATION_SCOPE_MAILBOX }, ++ { NULL, 0 } ++}; ++ ++const struct annotate_attrib annotation_proxy_type_names[] = ++{ ++ { "proxy", PROXY_ONLY }, ++ { "backend", BACKEND_ONLY }, ++ { "proxy_and_backend", PROXY_AND_BACKEND }, ++ { NULL, 0 } ++}; ++ ++const struct annotate_attrib attribute_type_names[] = ++{ ++ { "content-type", ATTRIB_TYPE_CONTENTTYPE }, ++ { "string", ATTRIB_TYPE_STRING }, ++ { "boolean", ATTRIB_TYPE_BOOLEAN }, ++ { "uint", ATTRIB_TYPE_UINT }, ++ { "int", ATTRIB_TYPE_INT }, ++ { NULL, 0 } ++}; ++ ++#define ANNOT_DEF_MAXLINELEN 1024 ++ ++int table_lookup(const struct annotate_attrib *table, ++ char* name, ++ size_t namelen, ++ char* errmsg) ++/* search in table for the value given by name and namelen (name is null-terminated, ++ but possibly more than just the key). errmsg is used to hint the user where we failed */ ++{ ++ char errbuf[ANNOT_DEF_MAXLINELEN*2]; ++ int entry; ++ ++ for (entry = 0; table[entry].name && ++ (strncasecmp(table[entry].name, name, namelen) ++ || table[entry].name[namelen] != '\0'); entry++); ++ ++ if (! table[entry].name) { ++ sprintf(errbuf, "invalid %s at '%s'", errmsg, name); ++ fatal(errbuf, EC_CONFIG); ++ } ++ return table[entry].entry; ++} ++ ++char *consume_comma(char* p) ++ /* advance beyond the next ',', skipping whitespace, fail if next non-space is no comma */ ++{ ++ char errbuf[ANNOT_DEF_MAXLINELEN*2]; ++ ++ for (; *p && isspace(*p); p++); ++ if (*p != ',') { ++ sprintf(errbuf, "',' expected, '%s' found parsing annotation definition", ++ p); ++ fatal(errbuf, EC_CONFIG); ++ } ++ p++; ++ for (; *p && isspace(*p); p++); ++ ++ return p; ++} ++ ++int parse_table_lookup_bitmask(const struct annotate_attrib *table, ++ char** s, ++ char* errmsg) ++ /* parses strings of the form value1 [ value2 [ ... ]] ++ value1 is mapped via table to ints and the result ored ++ whitespace is allowed between value names and punctuation ++ the field must end in '\0' or ',' ++ s is advanced to '\0' or ',' ++ on error errmsg is used to identify item to be parsed ++ */ ++{ ++ char errbuf[ANNOT_DEF_MAXLINELEN*2]; ++ int result = 0; ++ char *p, *p2; ++ ++ p = *s; ++ do { ++ p2 = p; ++ for (; *p && (isalnum(*p) || *p=='.' || *p=='-' || *p=='_' || *p=='/');p++); ++ result |= table_lookup(table, p2, p-p2, errmsg); ++ for (; *p && isspace(*p); p++); ++ } while (*p && *p != ','); ++ ++ *s = p; ++ return result; ++} ++ ++void init_annotation_definitions() ++{ ++ char *p, *p2, *tmp; ++ const char *filename; ++ char aline[ANNOT_DEF_MAXLINELEN]; ++ char errbuf[ANNOT_DEF_MAXLINELEN*2]; ++ struct annotate_st_entry_list *se, *me; ++ struct annotate_st_entry *ae; ++ int i; ++ FILE* f; ++ ++ /* NOTE: we assume # static entries > 0 */ ++ server_entries_list = xmalloc(sizeof(struct annotate_st_entry_list)); ++ mailbox_rw_entries_list = xmalloc(sizeof(struct annotate_st_entry_list)); ++ se = server_entries_list; ++ me = mailbox_rw_entries_list; ++ /* copy static entries into list */ ++ for (i = 0; server_entries[i].name;i++) { ++ se->entry = &server_entries[i]; ++ if (server_entries[i+1].name) { ++ se->next = xmalloc(sizeof(struct annotate_st_entry_list)); ++ se = se->next; ++ } ++ } ++ /* copy static entries into list */ ++ for (i = 0; mailbox_rw_entries[i].name;i++) { ++ me->entry = &mailbox_rw_entries[i]; ++ if (mailbox_rw_entries[i+1].name) { ++ me->next = xmalloc(sizeof(struct annotate_st_entry_list)); ++ me = me->next; ++ } ++ } ++ ++ /* parse config file */ ++ filename = config_getstring(IMAPOPT_ANNOTATION_DEFINITIONS); ++ ++ if (! filename) { ++ se->next = NULL; ++ me->next = NULL; ++ return; ++ } ++ ++ f = fopen(filename,"r"); ++ if (! f) { ++ sprintf(errbuf, "could not open annotation definiton %s", filename); ++ fatal(errbuf, EC_CONFIG); ++ } ++ ++ while (fgets(aline, sizeof(aline), f)) { ++ // remove leading space, skip blank lines and comments ++ for (p = aline; *p && isspace(*p); p++); ++ if (!*p || *p == '#') continue; ++ ++ // note, we only do the most basic validity checking and may ++ // be more restrictive than neccessary ++ ++ ae = xmalloc(sizeof(struct annotate_st_entry)); ++ ++ p2 = p; ++ for (; *p && (isalnum(*p) || *p=='.' || *p=='-' || *p=='_' || *p=='/');p++); ++ // TV-TODO: should test for empty ++ ae->name = xstrndup(p2, p-p2); ++ ++ p = consume_comma(p); ++ ++ p2 = p; ++ for (; *p && (isalnum(*p) || *p=='.' || *p=='-' || *p=='_' || *p=='/');p++); ++ ++ if (table_lookup(annotation_scope_names, p2, p-p2, ++ "annotation scope")==ANNOTATION_SCOPE_SERVER) { ++ se->next = xmalloc(sizeof(struct annotate_st_entry_list)); ++ se = se->next; ++ se->entry = ae; ++ } ++ else { ++ me->next = xmalloc(sizeof(struct annotate_st_entry_list)); ++ me = me->next; ++ me->entry = ae; ++ } ++ ++ p = consume_comma(p); ++ p2 = p; ++ for (; *p && (isalnum(*p) || *p=='.' || *p=='-' || *p=='_' || *p=='/');p++); ++ ae->type = table_lookup(attribute_type_names, p2, p-p2, ++ "attribute type"); ++ ++ p = consume_comma(p); ++ ae->proxytype = parse_table_lookup_bitmask(annotation_proxy_type_names, ++ &p, ++ "annotation proxy type"); ++ ++ p = consume_comma(p); ++ ae->attribs = parse_table_lookup_bitmask(annotation_attributes, ++ &p, ++ "annotation attributes"); ++ ++ p = consume_comma(p); ++ p2 = p; ++ for (; *p && (isalnum(*p) || *p=='.' || *p=='-' || *p=='_' || *p=='/');p++); ++ tmp = xstrndup(p2, p-p2); ++ ae->acl = cyrus_acl_strtomask(tmp); ++ free(tmp); ++ ++ for (; *p && isspace(*p); p++); ++ if (*p) { ++ sprintf(errbuf, "junk at end of line: '%s'", p); ++ fatal(errbuf, EC_CONFIG); ++ } ++ ++ ae->set = annotation_set_todb; ++ ae->rock = NULL; ++ } ++ ++ fclose(f); ++ se->next = NULL; ++ me->next = NULL; ++} ++ + int annotatemore_store(char *mailbox, + struct entryattlist *l, + struct namespace *namespace, +@@ -1843,7 +2065,7 @@ int annotatemore_store(char *mailbox, + struct entryattlist *e = l; + struct attvaluelist *av; + struct storedata sdata; +- const struct annotate_st_entry *entries; ++ const struct annotate_st_entry_list *entries, *currententry; + time_t now = time(0); + + memset(&sdata, 0, sizeof(struct storedata)); +@@ -1854,45 +2076,45 @@ int annotatemore_store(char *mailbox, + + if (!mailbox[0]) { + /* server annotations */ +- entries = server_entries; ++ entries = server_entries_list; + } + else { + /* mailbox annotation(s) */ +- entries = mailbox_rw_entries; ++ entries = mailbox_rw_entries_list; + } + + /* Build a list of callbacks for storing the annotations */ + while (e) { +- int entrycount, attribs; ++ int attribs; + struct annotate_st_entry_list *nentry = NULL; + + /* See if we support this entry */ +- for (entrycount = 0; +- entries[entrycount].name; +- entrycount++) { +- if (!strcmp(e->entry, entries[entrycount].name)) { ++ for (currententry = entries; ++ currententry; ++ currententry = currententry->next) { ++ if (!strcmp(e->entry, currententry->entry->name)) { + break; + } + } +- if (!entries[entrycount].name) { ++ if (!currententry) { + /* unknown annotation */ + return IMAP_PERMISSION_DENIED; + } + + /* Add this entry to our list only if it + applies to our particular server type */ +- if ((entries[entrycount].proxytype != PROXY_ONLY) ++ if ((currententry->entry->proxytype != PROXY_ONLY) + || proxy_store_func) { + nentry = xzmalloc(sizeof(struct annotate_st_entry_list)); + nentry->next = sdata.entry_list; +- nentry->entry = &(entries[entrycount]); ++ nentry->entry = currententry->entry; + nentry->shared.modifiedsince = now; + nentry->priv.modifiedsince = now; + sdata.entry_list = nentry; + } + + /* See if we are allowed to set the given attributes. */ +- attribs = entries[entrycount].attribs; ++ attribs = currententry->entry->attribs; + av = e->attvalues; + while (av) { + const char *value; +@@ -1902,7 +2124,7 @@ int annotatemore_store(char *mailbox, + goto cleanup; + } + value = annotate_canon_value(av->value, +- entries[entrycount].type); ++ currententry->entry->type); + if (!value) { + r = IMAP_ANNOTATION_BADVALUE; + goto cleanup; +@@ -1928,7 +2150,7 @@ int annotatemore_store(char *mailbox, + goto cleanup; + } + value = annotate_canon_value(av->value, +- entries[entrycount].type); ++ currententry->entry->type); + if (!value) { + r = IMAP_ANNOTATION_BADVALUE; + goto cleanup; +@@ -2110,3 +2332,10 @@ int annotatemore_delete(const char *mbox + + return annotatemore_rename(mboxname, NULL, NULL, NULL); + } ++ ++/* This file contains code Copyright (c) 2006 by Thomas Viehmann. ++ * You may distribute source code or binaries under the conditions ++ * conditions given in the CMU license, provided this note stays intact ++ * in the distributed source. If you want to distribute my code without ++ * this notice, do contact me at <tv@beamnet.de>. ++ */ +diff -r 321cda1d6136 lib/imapoptions +--- a/lib/imapoptions Tue Apr 22 10:44:56 2008 +0200 ++++ b/lib/imapoptions Tue Apr 22 10:47:04 2008 +0200 +@@ -172,6 +172,9 @@ are listed with ``<none>''. + /* Should non-admin users be allowed to set ACLs for the 'anyone' + user on their mailboxes? In a large organization this can cause + support problems, but it's enabled by default. */ ++ ++{ "annotation_definitions", NULL, STRING } ++/* File containing annotation definitions. */ + + { "auth_mech", "unix", STRINGLIST("unix", "pts", "krb", "krb5")} + /* The authorization mechanism to use. */ diff --git a/net-mail/cyrus-imapd/files/kolab/2.3.14/Folder-names.patch b/net-mail/cyrus-imapd/files/kolab/2.3.14/Folder-names.patch new file mode 100644 index 000000000000..2f8689ae4ed4 --- /dev/null +++ b/net-mail/cyrus-imapd/files/kolab/2.3.14/Folder-names.patch @@ -0,0 +1,17 @@ +Modifies the set of accepted characters in folder names for the cyrus imapd server [Version: 2.3.9] + +diff -r 17e54b46d7b6 imap/mboxname.c +--- a/imap/mboxname.c Mon Oct 27 18:44:56 2008 +0100 ++++ b/imap/mboxname.c Mon Oct 27 18:47:11 2008 +0100 +@@ -713,8 +713,10 @@ + /* + * Apply site policy restrictions on mailbox names. + * Restrictions are hardwired for now. ++ * original definition ++#define GOODCHARS " #$'+,-.0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~" + */ +-#define GOODCHARS " #$'+,-.0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~" ++#define GOODCHARS " #$%'()*+,-.0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~" + int mboxname_policycheck(char *name) + { + unsigned i; diff --git a/net-mail/cyrus-imapd/files/kolab/2.3.14/Groups2.patch b/net-mail/cyrus-imapd/files/kolab/2.3.14/Groups2.patch new file mode 100644 index 000000000000..36ba6b58d381 --- /dev/null +++ b/net-mail/cyrus-imapd/files/kolab/2.3.14/Groups2.patch @@ -0,0 +1,232 @@ +diff -r 0d5aacd84718 lib/auth_unix.c +--- a/lib/auth_unix.c Mon Oct 27 18:37:49 2008 +0100 ++++ b/lib/auth_unix.c Wed Apr 01 18:19:19 2009 +0200 +@@ -46,12 +46,133 @@ + #include <stdlib.h> + #include <pwd.h> + #include <grp.h> ++#include <stdio.h> + #include <ctype.h> + #include <string.h> + + #include "auth.h" + #include "libcyr_cfg.h" + #include "xmalloc.h" ++ ++#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) ++/* ++ * __getgrent.c - This file is part of the libc-8086/grp package for ELKS, ++ * Copyright (C) 1995, 1996 Nat Friedman <ndf@linux.mit.edu>. ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Library General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public ++ * License along with this library; if not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ */ ++ ++#include <unistd.h> ++#include <string.h> ++#include <errno.h> ++ ++static struct group *__getgrent(int grp_fd, char *line_buff, char **members) ++{ ++ short line_index; ++ short buff_size; ++ static struct group group; ++ register char *ptr; ++ char *field_begin; ++ short member_num; ++ char *endptr; ++ int line_len; ++ ++ /* We use the restart label to handle malformatted lines */ ++ restart: ++ line_index = 0; ++ buff_size = 256; ++ ++ line_buff = realloc(line_buff, buff_size); ++ while (1) { ++ if ((line_len = read(grp_fd, line_buff + line_index, ++ buff_size - line_index)) <= 0) { ++ return NULL; ++ } ++ field_begin = strchr(line_buff, '\n'); ++ if (field_begin != NULL) { ++ lseek(grp_fd, ++ (long) (1 + field_begin - ++ (line_len + line_index + line_buff)), SEEK_CUR); ++ *field_begin = '\0'; ++ if (*line_buff == '#' || *line_buff == ' ' ++ || *line_buff == '\n' || *line_buff == '\t') ++ goto restart; ++ break; ++ } else { ++ /* Allocate some more space */ ++ line_index = buff_size; ++ buff_size += 256; ++ line_buff = realloc(line_buff, buff_size); ++ } ++ } ++ ++ /* Now parse the line */ ++ group.gr_name = line_buff; ++ ptr = strchr(line_buff, ':'); ++ if (ptr == NULL) ++ goto restart; ++ *ptr++ = '\0'; ++ ++ group.gr_passwd = ptr; ++ ptr = strchr(ptr, ':'); ++ if (ptr == NULL) ++ goto restart; ++ *ptr++ = '\0'; ++ ++ field_begin = ptr; ++ ptr = strchr(ptr, ':'); ++ if (ptr == NULL) ++ goto restart; ++ *ptr++ = '\0'; ++ ++ group.gr_gid = (gid_t) strtoul(field_begin, &endptr, 10); ++ if (*endptr != '\0') ++ goto restart; ++ ++ member_num = 0; ++ field_begin = ptr; ++ ++ if (members != NULL) ++ free(members); ++ members = (char **) malloc((member_num + 1) * sizeof(char *)); ++ for ( ; field_begin && *field_begin != '\0'; field_begin = ptr) { ++ if ((ptr = strchr(field_begin, ',')) != NULL) ++ *ptr++ = '\0'; ++ members[member_num++] = field_begin; ++ members = (char **) realloc(members, ++ (member_num + 1) * sizeof(char *)); ++ } ++ members[member_num] = NULL; ++ ++ group.gr_mem = members; ++ return &group; ++} ++ ++static char *line_buff = NULL; ++static char **members = NULL; ++ ++struct group *fgetgrent(FILE *file) ++{ ++ if (file == NULL) { ++ errno = EINTR; ++ return NULL; ++ } ++ return __getgrent(fileno(file), line_buff, members); ++} ++#endif /* __FreeBSD__ */ + + struct auth_state { + char userid[81]; +@@ -140,6 +261,25 @@ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + ++static struct group* fgetgrnam(const char* name) ++{ ++ struct group *grp; ++ FILE *groupfile; ++ ++ groupfile = fopen("/etc/imapd.group", "r"); ++ if (!groupfile) groupfile = fopen("/etc/group", "r"); ++ if (groupfile) { ++ while ((grp = fgetgrent(groupfile))) { ++ if (strcmp(grp->gr_name, name) == 0) { ++ fclose(groupfile); ++ return grp; ++ } ++ } ++ } ++ if (groupfile) fclose(groupfile); ++ return NULL; ++} ++ + /* + * Convert 'identifier' into canonical form. + * Returns a pointer to a static buffer containing the canonical form +@@ -175,7 +315,7 @@ + */ + + if (!strncmp(retbuf, "group:", 6)) { +- grp = getgrnam(retbuf+6); ++ grp = fgetgrnam(retbuf+6); + if (!grp) return NULL; + if (strlen(grp->gr_name) >= sizeof(retbuf)-6) + return NULL; +@@ -223,11 +363,12 @@ + struct auth_state *newstate; + struct passwd *pwd; + struct group *grp; +-#if defined(HAVE_GETGROUPLIST) && defined(__GLIBC__) ++#if 0 && defined(HAVE_GETGROUPLIST) && defined(__GLIBC__) + gid_t gid, *groupids = NULL; + int ret, ngroups = 10; + #else + char **mem; ++ FILE *groupfile; + #endif + + identifier = mycanonifyid(identifier, 0); +@@ -245,7 +386,7 @@ + + pwd = getpwnam(identifier); + +-#if defined(HAVE_GETGROUPLIST) && defined(__GLIBC__) ++#if 0 && defined(HAVE_GETGROUPLIST) && defined(__GLIBC__) + gid = pwd ? pwd->pw_gid : (gid_t) -1; + + /* get the group ids */ +@@ -283,20 +424,23 @@ + if (groupids) free(groupids); + + #else /* !HAVE_GETGROUPLIST */ +- setgrent(); +- while ((grp = getgrent())) { +- for (mem = grp->gr_mem; *mem; mem++) { +- if (!strcmp(*mem, identifier)) break; +- } ++ groupfile = fopen("/etc/imapd.group", "r"); ++ if (!groupfile) groupfile = fopen("/etc/group", "r"); ++ if (groupfile) { ++ while ((grp = fgetgrent(groupfile))) { ++ for (mem = grp->gr_mem; *mem; mem++) { ++ if (!strcmp(*mem, identifier)) break; ++ } + +- if (*mem || (pwd && pwd->pw_gid == grp->gr_gid)) { +- newstate->ngroups++; +- newstate->group = (char **)xrealloc((char *)newstate->group, +- newstate->ngroups * sizeof(char *)); +- newstate->group[newstate->ngroups-1] = xstrdup(grp->gr_name); +- } +- } +- endgrent(); ++ if (*mem || (pwd && pwd->pw_gid == grp->gr_gid)) { ++ newstate->ngroups++; ++ newstate->group = (char **)xrealloc((char *)newstate->group, ++ newstate->ngroups * sizeof(char *)); ++ newstate->group[newstate->ngroups-1] = xstrdup(grp->gr_name); ++ } ++ } ++ fclose(groupfile); ++ } + #endif /* HAVE_GETGROUPLIST */ + + return newstate; diff --git a/net-mail/cyrus-imapd/files/kolab/2.3.14/Logging.patch b/net-mail/cyrus-imapd/files/kolab/2.3.14/Logging.patch new file mode 100644 index 000000000000..c0bd2faec033 --- /dev/null +++ b/net-mail/cyrus-imapd/files/kolab/2.3.14/Logging.patch @@ -0,0 +1,58 @@ +Provides improved logging for the cyrus imapd server [Version: 2.3.9] + +diff -r 6162fc947b22 imap/append.c +--- a/imap/append.c Tue Dec 11 11:22:03 2007 +0100 ++++ b/imap/append.c Tue Dec 11 11:22:13 2007 +0100 +@@ -648,6 +648,9 @@ int append_fromstage(struct appendstate + + /* ok, we've successfully added a message */ + as->quota_used += message_index.size; ++ ++ syslog(LOG_DEBUG, "append_fromstage: message %d added to %s", ++ message_index.uid, mailbox->name ); + + return 0; + } +diff -r 6162fc947b22 imap/imapd.c +--- a/imap/imapd.c Tue Dec 11 11:22:03 2007 +0100 ++++ b/imap/imapd.c Tue Dec 11 11:22:13 2007 +0100 +@@ -3509,17 +3509,19 @@ void cmd_close(char *tag) + if (!r) sync_log_mailbox(imapd_mailbox->name); + } + ++ if (r) { ++ prot_printf(imapd_out, "%s NO %s\r\n", tag, error_message(r)); ++ } ++ else { ++ prot_printf(imapd_out, "%s OK %s\r\n", tag, ++ error_message(IMAP_OK_COMPLETED)); ++ syslog(LOG_DEBUG, "cmd_expunge: user %s, mailbox %s, sequence %s", ++ imapd_userid, imapd_mailbox->name, "''"); ++ } ++ + index_closemailbox(imapd_mailbox); + mailbox_close(imapd_mailbox); + imapd_mailbox = 0; +- +- if (r) { +- prot_printf(imapd_out, "%s NO %s\r\n", tag, error_message(r)); +- } +- else { +- prot_printf(imapd_out, "%s OK %s\r\n", tag, +- error_message(IMAP_OK_COMPLETED)); +- } + } + + /* +diff -r 6162fc947b22 imap/mailbox.c +--- a/imap/mailbox.c Tue Dec 11 11:22:03 2007 +0100 ++++ b/imap/mailbox.c Tue Dec 11 11:22:13 2007 +0100 +@@ -2520,6 +2520,8 @@ int mailbox_expunge(struct mailbox *mail + *(fname->tail)++ = '/'; + fname->len++; + for (msgno = 0; msgno < numdeleted; msgno++) { ++ syslog(LOG_DEBUG, "mailbox_expunge: removing mail %s:%d", ++ mailbox->name, deleted[msgno]); + mailbox_message_get_fname(mailbox, deleted[msgno], + fname->tail, + sizeof(fname->buf) - fname->len); diff --git a/net-mail/cyrus-imapd/files/kolab/2.3.14/UID.patch b/net-mail/cyrus-imapd/files/kolab/2.3.14/UID.patch new file mode 100644 index 000000000000..ecc960d7bffe --- /dev/null +++ b/net-mail/cyrus-imapd/files/kolab/2.3.14/UID.patch @@ -0,0 +1,117 @@ +Allows login by uid rather than the mail address on the cyrus imapd server [Version: 2.3.9] + +diff -r 2ebe14b7db9d configure +--- a/configure Mon Oct 27 18:47:12 2008 +0100 ++++ b/configure Mon Oct 27 18:48:18 2008 +0100 +@@ -19667,7 +19667,7 @@ + done + + IMAP_COM_ERR_LIBS="${COM_ERR_LIBS}" +-IMAP_LIBS="${LIB_SASL} ${LIBS} ${SQL_LIBS}" ++IMAP_LIBS="${LIB_SASL} -lldap -llber ${LIBS} ${SQL_LIBS}" + + + +diff -r 2ebe14b7db9d imap/global.c +--- a/imap/global.c Mon Oct 27 18:47:12 2008 +0100 ++++ b/imap/global.c Mon Oct 27 18:48:18 2008 +0100 +@@ -52,6 +52,9 @@ + #include <sys/types.h> + #include <netinet/in.h> + #include <sys/stat.h> ++ ++#include <ldap.h> ++#include <lber.h> + + #if HAVE_UNISTD_H + # include <unistd.h> +@@ -378,6 +381,18 @@ + char *domain = NULL; + int len = strlen(user); + char buf[81]; ++ const char *uri; ++ const char *base; ++ const char *binddn; ++ const char *bindpw; ++ struct timeval timeout; ++ char filter[255]; ++ LDAP *handle; ++ LDAPMessage *res; ++ LDAPMessage *entry; ++ struct berval** vals; ++ ++ int rc; + + /* check for domain */ + if (config_virtdomains && +@@ -396,6 +411,49 @@ + } + + if (config_virtdomains) { ++ if (config_virtdomains == IMAP_ENUM_VIRTDOMAINS_LDAP) { ++ uri = config_getstring(IMAPOPT_LDAP_URI); ++ base = config_getstring(IMAPOPT_LDAP_BASE); ++ binddn = config_getstring(IMAPOPT_LDAP_BIND_DN); ++ bindpw = config_getstring(IMAPOPT_LDAP_PASSWORD); ++ timeout.tv_sec = config_getint(IMAPOPT_LDAP_TIME_LIMIT); ++ timeout.tv_usec = 0; ++ sprintf(filter, "(uid=%s)", user); ++ rc = ldap_initialize(&handle, uri); ++ if (rc != LDAP_SUCCESS) { ++ syslog(LOG_ERR, "ldap_initialize failed (%s)", uri); ++ } else { ++ rc = ldap_simple_bind_s(handle, binddn, bindpw); ++ if (rc != LDAP_SUCCESS) { ++ syslog(LOG_ERR, "ldap_simple_bind() failed %d (%s)", rc, ldap_err2string(rc)); ++ } else { ++ rc = ldap_search_st(handle, base, LDAP_SCOPE_SUBTREE, filter, NULL, 0, &timeout, &res); ++ if (rc != LDAP_SUCCESS) { ++ syslog(LOG_ERR, "ldap_search_st failed %d (%s)", rc, ldap_err2string(rc)); ++ } else { ++ if ( (entry = ldap_first_entry(handle, res)) != NULL ) { ++ // read mail attribute from entry ++ if ( (vals = ldap_get_values_len(handle, entry, "mail")) ) { ++ if (memchr(vals[0]->bv_val, '@', vals[0]->bv_len)) { ++ static char buf[81]; /* same size as in auth_canonifyid */ ++ int len = ((sizeof(buf) - 1) > vals[0]->bv_len ? vals[0]->bv_len : sizeof(buf) - 1); ++ strncpy( buf, vals[0]->bv_val, len); ++ buf[len] = '\0'; /* make sure it's null-terminated */ ++ ldap_value_free_len( vals ); ++ ldap_msgfree( res ); ++ ldap_unbind_s(handle); /* also frees handle */ ++ syslog(LOG_DEBUG, "canonify: '%s'\n", buf); ++ return auth_canonifyid( buf, 0) ; ++ } ++ ldap_value_free_len( vals ); ++ } ++ } ++ ldap_msgfree( res ); ++ } ++ } ++ ldap_unbind_s(handle); /* also frees handle */ ++ } ++ } + if (domain) { + if (config_defdomain && !strcasecmp(config_defdomain, domain+1)) { + *domain = '\0'; /* trim the default domain */ +@@ -408,7 +466,7 @@ + user = buf; + } + } +- else if (config_virtdomains != IMAP_ENUM_VIRTDOMAINS_USERID) { ++ else if (config_virtdomains != IMAP_ENUM_VIRTDOMAINS_USERID && config_virtdomains != IMAP_ENUM_VIRTDOMAINS_LDAP) { + socklen_t salen; + int error; + struct sockaddr_storage localaddr; +diff -r 2ebe14b7db9d lib/imapoptions +--- a/lib/imapoptions Mon Oct 27 18:47:12 2008 +0100 ++++ b/lib/imapoptions Mon Oct 27 18:48:18 2008 +0100 +@@ -1114,7 +1114,7 @@ + mailbox hierarchy. The default is to use the netnews separator + character '.'. */ + +-{ "virtdomains", "off", ENUM("off", "userid", "on") } ++{ "virtdomains", "off", ENUM("off", "userid", "ldap", "on") } + /* Enable virtual domain support. If enabled, the user's domain will + be determined by splitting a fully qualified userid at the last '@' + or '%' symbol. If the userid is unqualified, and the virtdomains diff --git a/net-mail/cyrus-imapd/files/kolab/2.3.14/timsieved_starttls-sendcaps.patch b/net-mail/cyrus-imapd/files/kolab/2.3.14/timsieved_starttls-sendcaps.patch new file mode 100644 index 000000000000..45088d86317e --- /dev/null +++ b/net-mail/cyrus-imapd/files/kolab/2.3.14/timsieved_starttls-sendcaps.patch @@ -0,0 +1,21 @@ +This patch was downloaded from https://bugzilla.andrew.cmu.edu/cgi-bin/cvsweb.cgi/src/cyrus/timsieved/parser.c.diff?r1=1.44;r2=1.45 +(minus the CVS keywords) + +It should be reverse-applied with patch -p2 -R to work around the kontact +behaviour described in kolab/issue2443 (kontact aborts sieve when imapd sends +capabilities after starttls) and can be dropped as soon as kontact has a way +to work with old and new cyrus imapd servers. + +diff -r 1688e25afb65 timsieved/parser.c +--- a/timsieved/parser.c Thu Apr 23 23:28:07 2009 +0200 ++++ b/timsieved/parser.c Thu Apr 23 23:28:54 2009 +0200 +@@ -908,8 +908,7 @@ + + starttls_done = 1; + +- return capabilities(sieved_out, sieved_saslconn, starttls_done, +- authenticated, sasl_ssf); ++ return result; + } + #else + static int cmd_starttls(struct protstream *sieved_out, struct protstream *sieved_in) |