From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter =?utf-8?q?M=C3=BCller?= To: development@lists.ipfire.org Subject: Re: [PATCH] cyrus-imapd: Drop package Date: Wed, 05 Feb 2020 17:00:00 +0000 Message-ID: <156308aa-201c-9c5b-0884-55646048b5aa@ipfire.org> In-Reply-To: <276CC9FB-41D4-41CD-83A6-DFA39939853C@ipfire.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7958751535962029379==" List-Id: --===============7958751535962029379== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Hello Tom, hello Michael, from my own experience, this package has been superseded by Dovecot quite a while ago. I cannot remember of any productive instances of this anymore and therefore agree on dropping it. Thanks, and best regards, Peter M=C3=BCller > Hi, >=20 > We do not keep the logs and we do not have access to log files on other mir= rors. >=20 > I am quite sure that nobody can use this package. It is outdated. We have r= emoved openmailadmin a long time ago. MySQL was used as a backend for user au= thentication which has been dropped as long time ago, too. >=20 > So I think we are safe with this one. >=20 > Best, > -Michael >=20 >> On 5 Feb 2020, at 15:27, Tom Rymes wrote: >> >> Would it be possible to push a version update (even if there are no change= s) and then monitor if there are any downloads? That way we could know if the= re are any users and how many (or at least out of those users that actually u= pdate from time to time). >> >> Tom >> >> On 02/05/2020 6:44 AM, Michael Tremer wrote: >>> This package is outdated and unmaintained for many many years. >>> I am not sure if this even works and if there are any users. >>> Signed-off-by: Michael Tremer >>> --- >>> config/backup/includes/cyrus-imapd | 4 - >>> config/cyrus-imapd/cyrus.conf | 38 - >>> config/cyrus-imapd/imapd.conf | 26 - >>> config/rootfiles/packages/cyrus-imapd | 215 -- >>> lfs/cyrus-imapd | 115 - >>> make.sh | 1 - >>> src/initscripts/packages/cyrus-imapd | 38 - >>> src/paks/cyrus-imapd/install.sh | 30 - >>> src/paks/cyrus-imapd/uninstall.sh | 29 - >>> src/paks/cyrus-imapd/update.sh | 26 - >>> .../cyrus-imapd-2.2.12-autocreate-0.9.4.diff | 2159 ----------------- >>> src/patches/cyrus-imapd-2.2.12-gcc4.patch | 48 - >>> 12 files changed, 2729 deletions(-) >>> delete mode 100644 config/backup/includes/cyrus-imapd >>> delete mode 100644 config/cyrus-imapd/cyrus.conf >>> delete mode 100644 config/cyrus-imapd/imapd.conf >>> delete mode 100644 config/rootfiles/packages/cyrus-imapd >>> delete mode 100644 lfs/cyrus-imapd >>> delete mode 100644 src/initscripts/packages/cyrus-imapd >>> delete mode 100644 src/paks/cyrus-imapd/install.sh >>> delete mode 100644 src/paks/cyrus-imapd/uninstall.sh >>> delete mode 100644 src/paks/cyrus-imapd/update.sh >>> delete mode 100644 src/patches/cyrus-imapd-2.2.12-autocreate-0.9.4.diff >>> delete mode 100644 src/patches/cyrus-imapd-2.2.12-gcc4.patch >>> diff --git a/config/backup/includes/cyrus-imapd b/config/backup/includes/= cyrus-imapd >>> deleted file mode 100644 >>> index bb1bb3b1c..000000000 >>> --- a/config/backup/includes/cyrus-imapd >>> +++ /dev/null >>> @@ -1,4 +0,0 @@ >>> -/usr/sieve >>> -/var/imap >>> -/var/ipfire/cyrusimap >>> -/var/log/imap >>> diff --git a/config/cyrus-imapd/cyrus.conf b/config/cyrus-imapd/cyrus.conf >>> deleted file mode 100644 >>> index df83bd00b..000000000 >>> --- a/config/cyrus-imapd/cyrus.conf >>> +++ /dev/null >>> @@ -1,38 +0,0 @@ >>> -START { >>> - # do not delete this entry! >>> - recover cmd=3D"ctl_cyrusdb -r" >>> - >>> - # this is only necessary if using idled for IMAP IDLE >>> - idled cmd=3D"idled" >>> -} >>> - >>> -# UNIX sockets start with a slash and are put into /var/imap/socket >>> -SERVICES { >>> - # add or remove based on preferences >>> - imap cmd=3D"imapd" listen=3D"imap" prefork=3D0 >>> - imaps cmd=3D"imapd -s" listen=3D"imaps" prefork=3D0 >>> - pop3 cmd=3D"pop3d" listen=3D"pop3" prefork=3D0 >>> - pop3s cmd=3D"pop3d -s" listen=3D"pop3s" prefork=3D0 >>> - #sieve cmd=3D"timsieved" listen=3D"127.0.0.1:2000" prefork=3D0 >>> - >>> - # at least one LMTP is required for delivery >>> - #lmtp cmd=3D"lmtpd" listen=3D"127.0.0.1:24" prefork=3D0 >>> - lmtpunix cmd=3D"lmtpd" listen=3D"/var/imap/socket/lmtp" prefork= =3D0 >>> - >>> - # this is only necessary if using notifications >>> - notify cmd=3D"notifyd" listen=3D"/var/imap/socket/notify" proto= =3D"udp" prefork=3D1 >>> -} >>> - >>> -EVENTS { >>> - # this is required >>> - checkpoint cmd=3D"ctl_cyrusdb -c" period=3D30 >>> - >>> - # this is only necessary if using duplicate delivery suppression >>> - delprune cmd=3D"ctl_deliver -E 3" period=3D1440 >>> - >>> - # this is only necessary if caching TLS sessions >>> - tlsprune cmd=3D"tls_prune" period=3D1440 >>> - >>> - # SQUAT failed, helps >>> - squatter cmd=3D"squatter -r user" period=3D1440 >>> -} >>> diff --git a/config/cyrus-imapd/imapd.conf b/config/cyrus-imapd/imapd.conf >>> deleted file mode 100644 >>> index 9c7397981..000000000 >>> --- a/config/cyrus-imapd/imapd.conf >>> +++ /dev/null >>> @@ -1,26 +0,0 @@ >>> -postmaster: postmaster >>> -configdirectory: /var/imap >>> -partition-default: /var/log/imap >>> -admins: cyrus >>> -allowanonymouslogin: no >>> -allowplaintext: yes >>> -sasl_mech_list: PLAIN >>> -servername: localhost >>> -autocreatequota: 20000 >>> -reject8bit: no >>> -quotawarn: 90 >>> -timeout: 30 >>> -poptimeout: 10 >>> -dracinterval: 0 >>> -drachost: localhost >>> -sasl_pwcheck_method: saslauthd >>> -sievedir: /usr/sieve >>> -sendmail: /usr/sbin/sendmail >>> -sieve_maxscriptsize: 32 >>> -sieve_maxscripts: 5 >>> -lmtpsocket: /var/imap/socket/lmtp >>> -unixhierarchysep: yes >>> -#echo tls_ca_file: /var/ipfire/cyrusimap/server.pem >>> -#echo tls_cert_file: /var/ipfire/cyrusimap/server.pem >>> -#echo tls_key_file: /var/ipfire/cyrusimap/server.pem >>> -#hashimapspool: yes >>> diff --git a/config/rootfiles/packages/cyrus-imapd b/config/rootfiles/pac= kages/cyrus-imapd >>> deleted file mode 100644 >>> index 54b9e917c..000000000 >>> --- a/config/rootfiles/packages/cyrus-imapd >>> +++ /dev/null >>> @@ -1,215 +0,0 @@ >>> -etc/rc.d/init.d/cyrus-imapd >>> -usr/bin/cyradm >>> -usr/bin/imtest >>> -usr/bin/installsieve >>> -usr/bin/lmtptest >>> -usr/bin/mkimap >>> -usr/bin/mupdatetest >>> -usr/bin/nntptest >>> -usr/bin/pop3test >>> -usr/bin/sieveshell >>> -usr/bin/sivtest >>> -usr/bin/smtptest >>> -usr/bin/synctest >>> -#usr/include/cyrus >>> -#usr/include/cyrus/acl.h >>> -#usr/include/cyrus/arrayu64.h >>> -#usr/include/cyrus/assert.h >>> -#usr/include/cyrus/auth.h >>> -#usr/include/cyrus/auth_pts.h >>> -#usr/include/cyrus/bitvector.h >>> -#usr/include/cyrus/bsearch.h >>> -#usr/include/cyrus/charset.h >>> -#usr/include/cyrus/chartable.h >>> -#usr/include/cyrus/command.h >>> -#usr/include/cyrus/crc32.h >>> -#usr/include/cyrus/cyr_lock.h >>> -#usr/include/cyrus/cyrusdb.h >>> -#usr/include/cyrus/exitcodes.h >>> -#usr/include/cyrus/glob.h >>> -#usr/include/cyrus/gmtoff.h >>> -#usr/include/cyrus/hash.h >>> -#usr/include/cyrus/hashu64.h >>> -#usr/include/cyrus/imapopts.h >>> -#usr/include/cyrus/imapurl.h >>> -#usr/include/cyrus/imclient.h >>> -#usr/include/cyrus/imparse.h >>> -#usr/include/cyrus/iostat.h >>> -#usr/include/cyrus/iptostring.h >>> -#usr/include/cyrus/libcyr_cfg.h >>> -#usr/include/cyrus/lsort.h >>> -#usr/include/cyrus/map.h >>> -#usr/include/cyrus/mappedfile.h >>> -#usr/include/cyrus/mkgmtime.h >>> -#usr/include/cyrus/mpool.h >>> -#usr/include/cyrus/nonblock.h >>> -#usr/include/cyrus/parseaddr.h >>> -#usr/include/cyrus/retry.h >>> -#usr/include/cyrus/rfc822tok.h >>> -#usr/include/cyrus/sieve >>> -#usr/include/cyrus/sieve/sieve_err.h >>> -#usr/include/cyrus/sieve/sieve_interface.h >>> -#usr/include/cyrus/signals.h >>> -#usr/include/cyrus/strarray.h >>> -#usr/include/cyrus/strhash.h >>> -#usr/include/cyrus/stristr.h >>> -#usr/include/cyrus/sysexits.h >>> -#usr/include/cyrus/times.h >>> -#usr/include/cyrus/tok.h >>> -#usr/include/cyrus/vparse.h >>> -#usr/include/cyrus/wildmat.h >>> -#usr/include/cyrus/xmalloc.h >>> -#usr/lib/cyrus >>> -usr/lib/cyrus/arbitron >>> -usr/lib/cyrus/chk_cyrus >>> -usr/lib/cyrus/ctl_cyrusdb >>> -usr/lib/cyrus/ctl_deliver >>> -usr/lib/cyrus/ctl_mboxlist >>> -usr/lib/cyrus/cvt_cyrusdb >>> -usr/lib/cyrus/cyr_dbtool >>> -usr/lib/cyrus/cyr_deny >>> -usr/lib/cyrus/cyr_df >>> -usr/lib/cyrus/cyr_expire >>> -usr/lib/cyrus/cyr_info >>> -usr/lib/cyrus/cyr_sequence >>> -usr/lib/cyrus/cyr_synclog >>> -usr/lib/cyrus/cyr_userseen >>> -usr/lib/cyrus/cyrdump >>> -usr/lib/cyrus/deliver >>> -usr/lib/cyrus/fud >>> -usr/lib/cyrus/idled >>> -usr/lib/cyrus/imapd >>> -usr/lib/cyrus/ipurge >>> -usr/lib/cyrus/lmtpd >>> -usr/lib/cyrus/lmtpproxyd >>> -usr/lib/cyrus/master >>> -usr/lib/cyrus/mbexamine >>> -usr/lib/cyrus/mbpath >>> -usr/lib/cyrus/mbtool >>> -usr/lib/cyrus/notifyd >>> -usr/lib/cyrus/pop3d >>> -usr/lib/cyrus/pop3proxyd >>> -usr/lib/cyrus/proxyd >>> -usr/lib/cyrus/quota >>> -usr/lib/cyrus/reconstruct >>> -usr/lib/cyrus/sievec >>> -usr/lib/cyrus/sieved >>> -usr/lib/cyrus/smmapd >>> -usr/lib/cyrus/squatter >>> -usr/lib/cyrus/timsieved >>> -usr/lib/cyrus/tls_prune >>> -usr/lib/cyrus/unexpunge >>> -#usr/lib/libcyrus.la >>> -#usr/lib/libcyrus.so >>> -usr/lib/libcyrus.so.0 >>> -usr/lib/libcyrus.so.0.0.0 >>> -#usr/lib/libcyrus_imap.la >>> -#usr/lib/libcyrus_imap.so >>> -usr/lib/libcyrus_imap.so.0 >>> -usr/lib/libcyrus_imap.so.0.0.0 >>> -#usr/lib/libcyrus_min.la >>> -#usr/lib/libcyrus_min.so >>> -usr/lib/libcyrus_min.so.0 >>> -usr/lib/libcyrus_min.so.0.0.0 >>> -#usr/lib/libcyrus_sieve.la >>> -#usr/lib/libcyrus_sieve.so >>> -usr/lib/libcyrus_sieve.so.0 >>> -usr/lib/libcyrus_sieve.so.0.0.0 >>> -#usr/lib/perl5/site_perl/5.30.0/Cyrus >>> -#usr/lib/perl5/site_perl/5.30.0/Cyrus/Annotator >>> -usr/lib/perl5/site_perl/5.30.0/Cyrus/Annotator/Daemon.pm >>> -usr/lib/perl5/site_perl/5.30.0/Cyrus/Annotator/Message.pm >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/Cyrus >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/Cyrus/IMAP >>> -usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/Cyrus/IMAP.pm >>> -usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/Cyrus/IMAP/Adm= in.pm >>> -usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/Cyrus/IMAP/IMS= P.pm >>> -usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/Cyrus/IMAP/She= ll.pm >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/Cyrus/SIEVE >>> -usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/Cyrus/SIEVE/ma= nagesieve.pm >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/An= notator >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/An= notator/Daemon >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/An= notator/Daemon/.packlist >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/IM= AP >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/IM= AP/.packlist >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/IM= AP/IMAP.bs >>> -usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/IMA= P/IMAP.so >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/SI= EVE >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/SI= EVE/managesieve >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/SI= EVE/managesieve/.packlist >>> -#usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/SI= EVE/managesieve/managesieve.bs >>> -usr/lib/perl5/site_perl/5.30.0/MACHINE-linux-thread-multi/auto/Cyrus/SIE= VE/managesieve/managesieve.so >>> -#usr/lib/pkgconfig/libcyrus.pc >>> -#usr/lib/pkgconfig/libcyrus_min.pc >>> -#usr/lib/pkgconfig/libcyrus_sieve.pc >>> -#usr/share/man/man1/cyradm.1 >>> -#usr/share/man/man1/imtest.1 >>> -#usr/share/man/man1/installsieve.1 >>> -#usr/share/man/man1/lmtptest.1 >>> -#usr/share/man/man1/mupdatetest.1 >>> -#usr/share/man/man1/nntptest.1 >>> -#usr/share/man/man1/pop3test.1 >>> -#usr/share/man/man1/sieveshell.1 >>> -#usr/share/man/man1/sivtest.1 >>> -#usr/share/man/man1/smtptest.1 >>> -#usr/share/man/man3/Cyrus::Annotator::Daemon.3 >>> -#usr/share/man/man3/Cyrus::Annotator::Message.3 >>> -#usr/share/man/man3/Cyrus::IMAP.3 >>> -#usr/share/man/man3/Cyrus::IMAP::Admin.3 >>> -#usr/share/man/man3/Cyrus::IMAP::IMSP.3 >>> -#usr/share/man/man3/Cyrus::IMAP::Shell.3 >>> -#usr/share/man/man3/Cyrus::SIEVE::managesieve.3 >>> -#usr/share/man/man3/imclient.3 >>> -#usr/share/man/man5/cyrus.conf.5 >>> -#usr/share/man/man5/imapd.conf.5 >>> -#usr/share/man/man5/krb.equiv.5 >>> -#usr/share/man/man8/arbitron.8 >>> -#usr/share/man/man8/chk_cyrus.8 >>> -#usr/share/man/man8/ctl_cyrusdb.8 >>> -#usr/share/man/man8/ctl_deliver.8 >>> -#usr/share/man/man8/ctl_mboxlist.8 >>> -#usr/share/man/man8/cvt_cyrusdb.8 >>> -#usr/share/man/man8/cyr_dbtool.8 >>> -#usr/share/man/man8/cyr_deny.8 >>> -#usr/share/man/man8/cyr_df.8 >>> -#usr/share/man/man8/cyr_expire.8 >>> -#usr/share/man/man8/cyr_info.8 >>> -#usr/share/man/man8/cyr_synclog.8 >>> -#usr/share/man/man8/deliver.8 >>> -#usr/share/man/man8/fud.8 >>> -#usr/share/man/man8/idled.8 >>> -#usr/share/man/man8/imapd.8 >>> -#usr/share/man/man8/ipurge.8 >>> -#usr/share/man/man8/lmtpd.8 >>> -#usr/share/man/man8/mbexamine.8 >>> -#usr/share/man/man8/mbpath.8 >>> -#usr/share/man/man8/notifyd.8 >>> -#usr/share/man/man8/pop3d.8 >>> -#usr/share/man/man8/quota.8 >>> -#usr/share/man/man8/reconstruct.8 >>> -#usr/share/man/man8/rmnews.8 >>> -#usr/share/man/man8/smmapd.8 >>> -#usr/share/man/man8/squatter.8 >>> -#usr/share/man/man8/sync_client.8 >>> -#usr/share/man/man8/sync_reset.8 >>> -#usr/share/man/man8/sync_server.8 >>> -#usr/share/man/man8/timsieved.8 >>> -#usr/share/man/man8/tls_prune.8 >>> -#usr/share/man/man8/unexpunge.8 >>> -usr/sieve >>> -var/imap >>> -var/imap/db >>> -var/imap/log >>> -var/imap/msg >>> -var/imap/proc >>> -var/imap/ptclient >>> -var/imap/socket >>> -var/imap/sync >>> -var/ipfire/backup/addons/includes/cyrus-imapd >>> -var/ipfire/cyrusimap >>> -var/ipfire/cyrusimap/cyrus.conf >>> -var/ipfire/cyrusimap/imapd.conf >>> -var/log/imap >>> -var/log/imap/stage. >>> -var/log/imap/sync. >>> diff --git a/lfs/cyrus-imapd b/lfs/cyrus-imapd >>> deleted file mode 100644 >>> index 18b41ac7d..000000000 >>> --- a/lfs/cyrus-imapd >>> +++ /dev/null >>> @@ -1,115 +0,0 @@ >>> -########################################################################= ####### >>> -# = # >>> -# IPFire.org - A linux based firewall = # >>> -# Copyright (C) 2007-2019 IPFire Team = # >>> -# = # >>> -# This program is free software: you can redistribute it and/or modify = # >>> -# it under the terms of the GNU General Public License as published by = # >>> -# the Free Software Foundation, either version 3 of the License, or = # >>> -# (at your option) any later version. = # >>> -# = # >>> -# This program 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 General Public License for more details. = # >>> -# = # >>> -# You should have received a copy of the GNU General Public License = # >>> -# along with this program. If not, see . = # >>> -# = # >>> -########################################################################= ####### >>> - >>> -########################################################################= ####### >>> -# Definitions >>> -########################################################################= ####### >>> - >>> -include Config >>> - >>> -VER =3D 2.5.11 >>> - >>> -THISAPP =3D cyrus-imapd-$(VER) >>> -DL_FILE =3D $(THISAPP).tar.gz >>> -DL_FROM =3D $(URL_IPFIRE) >>> -DIR_APP =3D $(DIR_SRC)/$(THISAPP) >>> -TARGET =3D $(DIR_INFO)/$(THISAPP) >>> -PROG =3D cyrus-imapd >>> -PAK_VER =3D 8 >>> - >>> -DEPS =3D "" >>> - >>> -########################################################################= ####### >>> -# Top-level Rules >>> -########################################################################= ####### >>> - >>> -objects =3D $(DL_FILE) >>> - >>> -$(DL_FILE) =3D $(DL_FROM)/$(DL_FILE) >>> - >>> -$(DL_FILE)_MD5 =3D 674083444c36a786d9431b6612969224 >>> - >>> -install : $(TARGET) >>> - >>> -check : $(patsubst %,$(DIR_CHK)/%,$(objects)) >>> - >>> -download :$(patsubst %,$(DIR_DL)/%,$(objects)) >>> - >>> -md5 : $(subst %,%_MD5,$(objects)) >>> - >>> -dist: >>> - @$(PAK) >>> - >>> -########################################################################= ####### >>> -# Downloading, checking, md5sum >>> -########################################################################= ####### >>> - >>> -$(patsubst %,$(DIR_CHK)/%,$(objects)) : >>> - @$(CHECK) >>> - >>> -$(patsubst %,$(DIR_DL)/%,$(objects)) : >>> - @$(LOAD) >>> - >>> -$(subst %,%_MD5,$(objects)) : >>> - @$(MD5) >>> - >>> -########################################################################= ####### >>> -# Installation Details >>> -########################################################################= ####### >>> - >>> -$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) >>> - @$(PREBUILD) >>> - @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE) >>> - cd $(DIR_APP) && ./configure \ >>> - --prefix=3D/usr \ >>> - --with-service-path=3D/usr/lib/cyrus \ >>> - --with-cyrus-prefix=3D/usr/lib/cyrus \ >>> - --sysconfdir=3D/var/ipfire/cyrusimap \ >>> - --with-perl \ >>> - --with-sasl \ >>> - --with-syslogfacility=3DMAIL \ >>> - --without-snmp \ >>> - --enable-autocreate \ >>> - --enable-idled >>> - >>> - cd $(DIR_APP) && make $(MAKETUNING) $(EXTRA_MAKE) >>> - cd $(DIR_APP) && make install >>> - -mkdir /var/imap >>> - chown cyrus:mail /var/imap >>> - chmod 755 /var/imap >>> - -mkdir /var/log/imap >>> - chown cyrus:mail /var/log/imap >>> - chmod 750 /var/log/imap >>> - -mkdir /usr/sieve >>> - chown cyrus:mail /usr/sieve >>> - chmod 750 /usr/sieve >>> - -mkdir /var/ipfire/cyrusimap >>> - cp -f $(DIR_SRC)/config/cyrus-imapd/* /var/ipfire/cyrusimap >>> - cp -f $(DIR_APP)/tools/mkimap /usr/bin >>> - sudo -u cyrus /usr/bin/mkimap /var/ipfire/cyrusimap/imapd.conf >>> - chown cyrus.mail /var/imap/socket >>> - install -v -m 644 $(DIR_SRC)/config/backup/includes/cyrus-imapd \ >>> - /var/ipfire/backup/addons/includes/cyrus-imapd >>> - >>> - #install initscripts >>> - $(call INSTALL_INITSCRIPT,cyrus-imapd) >>> - >>> - @rm -rf $(DIR_APP) /usr/include/com_err.h >>> - @$(POSTBUILD) >>> diff --git a/make.sh b/make.sh >>> index 02043cf69..6e3f4cfd9 100755 >>> --- a/make.sh >>> +++ b/make.sh >>> @@ -1401,7 +1401,6 @@ buildipfire() { >>> lfsmake2 chkconfig >>> lfsmake2 postfix >>> lfsmake2 fetchmail >>> - lfsmake2 cyrus-imapd >>> lfsmake2 clamav >>> lfsmake2 perl-NetAddr-IP >>> lfsmake2 spamassassin >>> diff --git a/src/initscripts/packages/cyrus-imapd b/src/initscripts/packa= ges/cyrus-imapd >>> deleted file mode 100644 >>> index 2f849c8a8..000000000 >>> --- a/src/initscripts/packages/cyrus-imapd >>> +++ /dev/null >>> @@ -1,38 +0,0 @@ >>> -#!/bin/sh >>> -# Begin $rc_base/init.d/cyrus-imapd >>> - >>> -# Based on sysklogd script from LFS-3.1 and earlier. >>> -# Rewritten by Gerard Beekmans - gerard(a)linuxfromscratch.org >>> - >>> -. /etc/sysconfig/rc >>> -. $rc_functions >>> - >>> -case "$1" in >>> - start) >>> - boot_mesg "Starting the Cyrus IMAP Server..." >>> - /usr/lib/cyrus/master & >>> - evaluate_retval >>> - ;; >>> - >>> - stop) >>> - boot_mesg "Stopping the Cyrus IMAP Server..." >>> - killproc /usr/lib/cyrus/master >>> - ;; >>> - >>> - restart) >>> - $0 stop >>> - sleep 1 >>> - $0 start >>> - ;; >>> - >>> - status) >>> - statusproc /usr/lib/cyrus/master >>> - ;; >>> - >>> - *) >>> - echo "Usage: $0 {start|stop|restart|status}" >>> - exit 1 >>> - ;; >>> -esac >>> - >>> -# End $rc_base/init.d/cyrus-imapd >>> diff --git a/src/paks/cyrus-imapd/install.sh b/src/paks/cyrus-imapd/insta= ll.sh >>> deleted file mode 100644 >>> index a23153b7d..000000000 >>> --- a/src/paks/cyrus-imapd/install.sh >>> +++ /dev/null >>> @@ -1,30 +0,0 @@ >>> -#!/bin/bash >>> -########################################################################= #### >>> -# = # >>> -# This file is part of the IPFire Firewall. = # >>> -# = # >>> -# IPFire is free software; you can redistribute it and/or modify = # >>> -# it under the terms of the GNU General Public License as published by = # >>> -# the Free Software Foundation; either version 2 of the License, or = # >>> -# (at your option) any later version. = # >>> -# = # >>> -# IPFire 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 General Public License for more details. = # >>> -# = # >>> -# You should have received a copy of the GNU General Public License = # >>> -# along with IPFire; if not, write to the Free Software = # >>> -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 U= SA # >>> -# = # >>> -# Copyright (C) 2007 IPFire-Team . = # >>> -# = # >>> -########################################################################= #### >>> -# >>> -. /opt/pakfire/lib/functions.sh >>> -extract_files >>> -restore_backup ${NAME} >>> -start_service ${NAME} >>> -ln -sf ../init.d/cyrus-imapd /etc/rc.d/rc0.d/K23cyrus-imapd >>> -ln -sf ../init.d/cyrus-imapd /etc/rc.d/rc3.d/S37cyrus-imapd >>> -ln -sf ../init.d/cyrus-imapd /etc/rc.d/rc6.d/K23cyrus-imapd >>> diff --git a/src/paks/cyrus-imapd/uninstall.sh b/src/paks/cyrus-imapd/uni= nstall.sh >>> deleted file mode 100644 >>> index e34fa5698..000000000 >>> --- a/src/paks/cyrus-imapd/uninstall.sh >>> +++ /dev/null >>> @@ -1,29 +0,0 @@ >>> -#!/bin/bash >>> -########################################################################= #### >>> -# = # >>> -# This file is part of the IPFire Firewall. = # >>> -# = # >>> -# IPFire is free software; you can redistribute it and/or modify = # >>> -# it under the terms of the GNU General Public License as published by = # >>> -# the Free Software Foundation; either version 2 of the License, or = # >>> -# (at your option) any later version. = # >>> -# = # >>> -# IPFire 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 General Public License for more details. = # >>> -# = # >>> -# You should have received a copy of the GNU General Public License = # >>> -# along with IPFire; if not, write to the Free Software = # >>> -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 U= SA # >>> -# = # >>> -# Copyright (C) 2007 IPFire-Team . = # >>> -# = # >>> -########################################################################= #### >>> -# >>> -. /opt/pakfire/lib/functions.sh >>> -extract_backup_includes >>> -stop_service ${NAME} >>> -make_backup ${NAME} >>> -remove_files >>> -rm -rfv /etc/rc.d/rc*.d/*cyrus-imapd >>> diff --git a/src/paks/cyrus-imapd/update.sh b/src/paks/cyrus-imapd/update= .sh >>> deleted file mode 100644 >>> index 89c40d0d7..000000000 >>> --- a/src/paks/cyrus-imapd/update.sh >>> +++ /dev/null >>> @@ -1,26 +0,0 @@ >>> -#!/bin/bash >>> -########################################################################= #### >>> -# = # >>> -# This file is part of the IPFire Firewall. = # >>> -# = # >>> -# IPFire is free software; you can redistribute it and/or modify = # >>> -# it under the terms of the GNU General Public License as published by = # >>> -# the Free Software Foundation; either version 2 of the License, or = # >>> -# (at your option) any later version. = # >>> -# = # >>> -# IPFire 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 General Public License for more details. = # >>> -# = # >>> -# You should have received a copy of the GNU General Public License = # >>> -# along with IPFire; if not, write to the Free Software = # >>> -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 U= SA # >>> -# = # >>> -# Copyright (C) 2007 IPFire-Team . = # >>> -# = # >>> -########################################################################= #### >>> -# >>> -. /opt/pakfire/lib/functions.sh >>> -./uninstall.sh >>> -./install.sh >>> diff --git a/src/patches/cyrus-imapd-2.2.12-autocreate-0.9.4.diff b/src/p= atches/cyrus-imapd-2.2.12-autocreate-0.9.4.diff >>> deleted file mode 100644 >>> index cb4c6c994..000000000 >>> --- a/src/patches/cyrus-imapd-2.2.12-autocreate-0.9.4.diff >>> +++ /dev/null >>> @@ -1,2159 +0,0 @@ >>> -diff -Naur cyrus-imapd-2.2.12/README.autocreate cyrus-imapd-2.2.12.autoc= reate2/README.autocreate >>> ---- cyrus-imapd-2.2.12/README.autocreate 1970-01-01 02:00:00.000000000 += 0200 >>> -+++ cyrus-imapd-2.2.12.autocreate2/README.autocreate 2005-10-19 14:48:57= .930991000 +0300 >>> -@@ -0,0 +1,181 @@ >>> -+Cyrus IMAP autocreate Inbox patch >>> -+---------------------------------- >>> -+ >>> -+NOTE : This patch has been created at the University of Athens. For mor= e info, as well >>> -+as more patches on Cyrus IMAPD server, please visit http://email.uoa.gr >>> -+ >>> -+The design of Cyrus IMAP server does not predict the automatic creation= of users' >>> -+INBOX folders. The creation of a user's INBOX is considered to be an ex= ternal task, >>> -+that has to be completed as part of the user e-mail account creation pr= ocedure. >>> -+Hence, to create a new e-mail account the site administrator has to >>> -+a) Include the new account in the user database for the authentication = procedure >>> -+ (e.g. sasldb, shadow, mysql, ldap). >>> -+b) Create the corresponding INBOX folder. >>> -+ >>> -+Alternatively, the user, if succesfully authenticated, may create his o= wn INBOX folder, >>> -+as long as the configuration of the site allows it (see "autocreatequot= a" in imapd.conf). >>> -+Unlike what uncareful readers may think, enabling the "autocreatequota"= option, doesn't >>> -+lead to the automatic INBOX folder creation by Cyrus IMAP server. >>> -+In fact, "autocreate" means that the IMAP clients are allowed to automa= tically create >>> -+the user INBOX. >>> -+ >>> -+This patch adds the functionality of automatic creation of the users' I= NBOX folders into >>> -+the Cyrus IMAP server. It is implemented as two features, namely the "= create on login" >>> -+and "create on post". >>> -+ >>> -+ >>> -+ >>> -+Create on login >>> -+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>> -+This feauture provides automatic creation of a user's INBOX folder when= all of the >>> -+following requirements are met: >>> -+ >>> -+i) The user has succesfully passed the authentication procedure. >>> -+ >>> -+ii) The user's authorization ID (typically the same as the user's >>> -+authentication ID) doesn't belong to the imap_admins or admins >>> -+accounts (see imapd.conf). >>> -+ >>> -+iii) The "autocreatequota" option in the imap configuration file >>> -+has been set to a non zero value. >>> -+ >>> -+iv) The corresponding to the user's authorizationID INBOX folder >>> -+does not exist. >>> -+ >>> -+The user's first login is the most typical case when all four requireme= nts are met. >>> -+Note that if the authenticatedID is allowed to proxy to another account= for which >>> -+all of the above requirements are met, the corresponding INBOX folder f= or that account >>> -+will be created. >>> -+ >>> -+ >>> -+ >>> -+Create on post >>> -+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>> -+This feauture provides automatic creation of a user's INBOX folder when= all of the >>> -+following requirements are met. >>> -+ >>> -+i) An e-mail message addressed to the user has been received. >>> -+ >>> -+ii) The recipient is not any of the imap_admins or admins accounts. >>> -+Note that passing e-mails to admins or imap_admins accounts from >>> -+the MTA to LMTP should be avoided in any case. >>> -+ >>> -+iii) The recipient's INBOX does not exist. >>> -+ >>> -+iv) The "autocreatequota" option in the imap configuration file >>> -+has been set to a non zero value. >>> -+ >>> -+v) The "createonpost" option in the imap configuration file >>> -+has been switched on. >>> -+ >>> -+ >>> -+Besides the automatic creation of INBOX folder, additional functionalit= ies are >>> -+provided: >>> -+ >>> -+A) Automatic creation of INBOX subfolders controlled by "autocreateinbo= xfolders" >>> -+configuration option. eg >>> -+ >>> -+autocreateinboxfolders: sent|drafts|spam|templates >>> -+ >>> -+B) Automatic subscription of INBOX subfolders controlled by "autosubscr= ibeinboxfolders" >>> -+configuration option. eg >>> -+ >>> -+autosubscribeinboxfolders: sent|spam >>> -+ >>> -+Obviously, only subscription to subfolders included in the "autocreatei= nboxfolder" >>> -+list is meaningfull. >>> -+ >>> -+C) Automatic subscription to shared folders (bulletin boards). The user= gets >>> -+automatically subscribed to the shared folders declared in the "autosub= scribesharedfolders" >>> -+configuration option in imapd.conf. >>> -+eg autosubscribesharedfolders: public_folder | public_folder.subfolder >>> -+ >>> -+In order the above action to succeed, the shared folder has to pre-exis= t the INBOX creation >>> -+and the user must have the apropriate permissions in order to be able t= o subscribe to the >>> -+shared folder. >>> -+ >>> -+* A new config option has been added. 'autosubscribe_all_sharedfolders'= is a yes/no >>> -+option. When set to yes, the user is automatically subscribed to all sh= ared folders one >>> -+has permission to subscribe to. Please, note that when this option is s= et to yes, then >>> -+'autosubscribesharedfolders' option is overriden. >>> -+ >>> -+D) Automatic creation of a predefined default sieve script. >>> -+ >>> -+This is very useful when a default sieve script is used for every user.= Usually, a >>> -+default anti-spam script may me be written in a file and copied to each= user >>> -+sieve scripts upon the INBOX creation. The imapd.conf options that have= been added >>> -+are 'autocreate_sieve_script', 'autocreate_sieve_compiledscript' and >>> -+'generate_compiled_sieve_script'. >>> -+ >>> -+autocreate_sieve_script configuration option refers to the full path of= the file >>> -+that contains the sieve script. The default value is null and if no fil= e is defined, >>> -+then no default script is created upon INBOX creation. (The feature is = disabled) >>> -+eg autocreate_sieve_script: /etc/default_sieve_script >>> -+ >>> -+autocreate_sieve_compiledscript configuration option refers to the full= path of the >>> -+file that contains the bytecode compiled sieve script. If this filename= is defined >>> -+in imapd.conf and the file exists, then it is automatically copied in t= he user's sieve >>> -+directory. If it is not defined, then a bytecode sieve script gets on t= he fly compiled >>> -+by the daemon. >>> -+eg autocreate_sieve_compiledscript: /etc/default_sieve_script.bc >>> -+ >>> -+generate_compiled_sieve_script is a boolean option that triggers the co= mpilation of the >>> -+source sieve script to bytecode sieve script. The file that the bytecod= e script will >>> -+be saved is pointed by autocreate_sieve_compiledscript. >>> -+ >>> -+Ways of compiling a sieve script : >>> -+1. Compile a sieve script using the standard sievec utility, distribute= d by CMU >>> -+2. Compile a sieve script using the compile_sieve utility, released by = UoA. This >>> -+ tool is almost identical to the sievec utility, with the difference = that it >>> -+ reads the input and output file from autocreate_sieve_script and >>> -+ autocreate_sieve_compiledscript options in imapd.conf >>> -+3. Let cyrus create a compiled sieve script using a source script. Cyru= s can be >>> -+ instructed to save the compiled script any time a compiled script do= es not exist. >>> -+ >>> -+NOTES : >>> -+1. In order this functionality to work, the following requirements must= have been met: >>> -+ - 'sieveusehomedir' option must be 'no' in the configuration (defaul= t). >>> -+ - 'sievedir' option must have a valid value. >>> -+2. Currently, this patch checks the validity of the source script while= generating a >>> -+ bytecode compiled script, but not the validity of the bytecode sieve= script file. >>> -+ The administrator should make sure that the provided files contain a= valid sieve >>> -+ script as well as the compiled script is updated every time the sour= ce script changes. >>> -+ >>> -+ >>> -+ >>> -+Issues to be considered >>> -+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>> -+ >>> -+I) In order to use the create on post feauture one should be absolutely= sure that: >>> -+a) The MTA checks the validity of the e-mail recipient before sending t= he e-mail to >>> -+LMTP. This is an RFC821 requirement. This usually expands to "the mta s= hould be >>> -+able to use the account database as user mailbox database". >>> -+b) Only authorized accounts/services can talk to LMTP. >>> -+ >>> -+II) Especially in the case of imap logins, the current patch implementa= tion checks >>> -+for the INBOX folder existence upon login, causing an extra mailbox loo= kup in most >>> -+of the cases. >>> -+A better approach would be to chase the "IMAP_MAILBOX_NONEXISTENT" erro= r code and >>> -+check if the error is associated with an INBOX folder. However, this wo= uld mess up >>> -+Cyrus code. The way it was implemented may not have been the most perfo= rmance >>> -+optimized, but it produces a much cleaner and simple patch. >>> -+ >>> -+ >>> -+ >>> -+Virtual Domains Support >>> -+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>> -+ >>> -+Virtual domains are supported by all versions of the patch for cyrus-im= apd-2.2.1-BETA and >>> -+later. However, it is not possible to declare different INBOX subfolder= s to be created or >>> -+shared folders to be subscribed to for every domain. >>> -+ >>> -+ >>> -+ >>> -+Things to be done >>> -+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>> -+ >>> -+1. Support MURDER architecture. >>> -+ >>> -+ >>> -+For more information and updates please visit http://email.uoa.gr/autoc= reate >>> -+ >>> -diff -Naur cyrus-imapd-2.2.12/imap/Makefile.in cyrus-imapd-2.2.12.autocr= eate2/imap/Makefile.in >>> ---- cyrus-imapd-2.2.12/imap/Makefile.in 2004-05-28 21:03:02.000000000 +0= 300 >>> -+++ cyrus-imapd-2.2.12.autocreate2/imap/Makefile.in 2005-10-19 14:48:57.= 935240000 +0300 >>> -@@ -104,7 +104,7 @@ >>> - convert_code.o duplicate.o saslclient.o saslserver.o signals.o \ >>> - annotate.o search_engines.o squat.o squat_internal.o mbdump.o \ >>> - imapparse.o telemetry.o user.o notify.o protocol.o quota_db.o \ >>> -- $(SEEN) $(IDLE) >>> -+ autosieve.o $(SEEN) $(IDLE) >>> - >>> - IMAPDOBJS=3Dpushstats.o backend.o imapd.o index.o tls.o version.o >>> - >>> -@@ -122,7 +122,7 @@ >>> - fud smmapd reconstruct quota mbpath ipurge \ >>> - cyrdump chk_cyrus cvt_cyrusdb deliver ctl_mboxlist \ >>> - ctl_deliver ctl_cyrusdb squatter mbexamine cyr_expire arbitron \ >>> -- @IMAP_PROGS@ >>> -+ compile_sieve @IMAP_PROGS@ >>> - >>> - BUILTSOURCES =3D imap_err.c imap_err.h pushstats.c pushstats.h \ >>> - lmtpstats.c lmtpstats.h xversion.h mupdate_err.c mupdate_err.h \ >>> -@@ -188,7 +188,7 @@ >>> - ### Services >>> - idled: idled.o mutex_fake.o libimap.a $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o idled \ >>> -- idled.o mutex_fake.o libimap.a $(DEPLIBS) $(LIBS) >>> -+ idled.o mutex_fake.o libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> - lmtpd: lmtpd.o $(LMTPOBJS) $(SIEVE_OBJS) mutex_fake.o libimap.a $(SIEVE= _LIBS) \ >>> - $(DEPLIBS) $(SERVICE) >>> -@@ -214,10 +214,10 @@ >>> - $(SERVICE) lmtpproxyd.o backend.o $(LMTPOBJS) mutex_fake.o \ >>> - libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> - >>> --imapd: xversion $(IMAPDOBJS) mutex_fake.o libimap.a $(DEPLIBS) $(SERVIC= E) >>> -+imapd: xversion $(IMAPDOBJS) mutex_fake.o libimap.a $(SIEVE_LIBS) $(DEP= LIBS) $(SERVICE) >>> - $(CC) $(LDFLAGS) -o imapd \ >>> - $(SERVICE) $(IMAPDOBJS) mutex_fake.o \ >>> -- libimap.a $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> - >>> - imapd.pure: $(IMAPDOBJS) mutex_fake.o libimap.a $(DEPLIBS) $(SERVICE) >>> - $(PURIFY) $(PUREOPT) $(CC) $(LDFLAGS) -o imapd.pure \ >>> -@@ -232,7 +232,7 @@ >>> - proxyd: $(PROXYDOBJS) mutex_fake.o libimap.a $(DEPLIBS) $(SERVICE) >>> - $(CC) $(LDFLAGS) -o proxyd \ >>> - $(SERVICE) $(PROXYDOBJS) mutex_fake.o libimap.a \ >>> -- $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> -+ $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> - >>> - proxyd.pure: $(PROXYDOBJS) mutex_fake.o libimap.a $(DEPLIBS) $(SERVICE) >>> - $(PURIFY) $(PUREOPT) $(CC) $(LDFLAGS) -o proxyd.pure \ >>> -@@ -244,7 +244,7 @@ >>> - $(CC) $(LDFLAGS) -o mupdate \ >>> - $(SERVICETHREAD) mupdate.o mupdate-slave.o mupdate-client.o \ >>> - mutex_pthread.o tls.o libimap.a \ >>> -- $(DEPLIBS) $(LIBS) $(LIB_WRAP) -lpthread >>> -+ $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) $(LIB_WRAP) -lpthread >>> - >>> - mupdate.pure: mupdate.o mupdate-slave.o mupdate-client.o mutex_pthread.= o \ >>> - libimap.a $(DEPLIBS) >>> -@@ -252,92 +252,96 @@ >>> - $(SERVICETHREAD) mupdate.o mupdate-slave.o mupdate-client.o \ >>> - mutex_pthread.o libimap.a $(DEPLIBS) $(LIBS) $(LIB_WRAP) -lpthread >>> - >>> --pop3d: pop3d.o backend.o tls.o mutex_fake.o libimap.a $(DEPLIBS) $(SERV= ICE) >>> -+pop3d: pop3d.o backend.o tls.o mutex_fake.o libimap.a $(SIEVE_LIBS) $(D= EPLIBS) $(SERVICE) >>> - $(CC) $(LDFLAGS) -o pop3d pop3d.o backend.o tls.o $(SERVICE) \ >>> -- mutex_fake.o libimap.a $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> -+ mutex_fake.o libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> - >>> - nntpd: nntpd.o backend.o index.o smtpclient.o spool.o tls.o \ >>> - mutex_fake.o nntp_err.o libimap.a $(DEPLIBS) $(SERVICE) >>> - $(CC) $(LDFLAGS) -o nntpd nntpd.o backend.o index.o spool.o \ >>> - smtpclient.o tls.o $(SERVICE) mutex_fake.o nntp_err.o \ >>> -- libimap.a $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> - >>> --fud: fud.o libimap.a mutex_fake.o $(DEPLIBS) $(SERVICE) >>> -+fud: fud.o libimap.a mutex_fake.o $(SIEVE_LIBS) $(DEPLIBS) $(SERVICE) >>> - $(CC) $(LDFLAGS) -o fud $(SERVICE) fud.o mutex_fake.o libimap.a \ >>> -- $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> -+ $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> - >>> --smmapd: smmapd.o libimap.a mutex_fake.o $(DEPLIBS) $(SERVICE) >>> -+smmapd: smmapd.o libimap.a mutex_fake.o $(SIEVE_LIBS) $(DEPLIBS) $(SERV= ICE) >>> - $(CC) $(LDFLAGS) -o smmapd $(SERVICE) smmapd.o mutex_fake.o libimap.a \ >>> -- $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> -+ $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) $(LIB_WRAP) >>> - >>> - ### Command Line Utilities >>> --arbitron: arbitron.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+arbitron: arbitron.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o arbitron arbitron.o $(CLIOBJS) \ >>> -- libimap.a $(DEPLIBS) $(LIBS) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> -+ >>> -+compile_sieve: compile_sieve.o libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> -+ $(CC) $(LDFLAGS) -o compile_sieve compile_sieve.o $(CLIOBJS) \ >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --cvt_cyrusdb: cvt_cyrusdb.o mutex_fake.o libimap.a $(DEPLIBS) >>> -+cvt_cyrusdb: cvt_cyrusdb.o mutex_fake.o libimap.a $(SIEVE_LIBS) $(DEPLI= BS) >>> - $(CC) $(LDFLAGS) -o cvt_cyrusdb cvt_cyrusdb.o $(CLIOBJS) \ >>> -- libimap.a $(DEPLIBS) $(LIBS) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --chk_cyrus: chk_cyrus.o mutex_fake.o libimap.a $(DEPLIBS) >>> -+chk_cyrus: chk_cyrus.o mutex_fake.o libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o chk_cyrus chk_cyrus.o $(CLIOBJS) \ >>> -- libimap.a $(DEPLIBS) $(LIBS) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --deliver: deliver.o backend.o $(LMTPOBJS) mutex_fake.o libimap.a $(DEPLI= BS) >>> -+deliver: deliver.o backend.o $(LMTPOBJS) mutex_fake.o libimap.a $(SIEVE= _LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o deliver deliver.o backend.o $(LMTPOBJS) \ >>> -- mutex_fake.o libimap.a $(DEPLIBS) $(LIBS) >>> -+ mutex_fake.o libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --ctl_deliver: ctl_deliver.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+ctl_deliver: ctl_deliver.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o \ >>> -- $@ ctl_deliver.o $(CLIOBJS) libimap.a $(DEPLIBS) $(LIBS) >>> -+ $@ ctl_deliver.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --ctl_mboxlist: ctl_mboxlist.o mupdate-client.o $(CLIOBJS) libimap.a $(DE= PLIBS) >>> -+ctl_mboxlist: ctl_mboxlist.o mupdate-client.o $(CLIOBJS) libimap.a $(SI= EVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o $@ ctl_mboxlist.o mupdate-client.o $(CLIOBJS) \ >>> -- libimap.a $(DEPLIBS) $(LIBS) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --ctl_cyrusdb: ctl_cyrusdb.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+ctl_cyrusdb: ctl_cyrusdb.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o \ >>> -- $@ ctl_cyrusdb.o $(CLIOBJS) libimap.a $(DEPLIBS) $(LIBS) >>> -+ $@ ctl_cyrusdb.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --cyr_expire: cyr_expire.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+cyr_expire: cyr_expire.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o $@ cyr_expire.o $(CLIOBJS) \ >>> -- libimap.a $(DEPLIBS) $(LIBS) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --fetchnews: fetchnews.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+fetchnews: fetchnews.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o \ >>> -- $@ fetchnews.o $(CLIOBJS) libimap.a $(DEPLIBS) $(LIBS) >>> -+ $@ fetchnews.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --squatter: squatter.o index.o squat_build.o $(CLIOBJS) libimap.a $(DEPLI= BS) >>> -+squatter: squatter.o index.o squat_build.o $(CLIOBJS) libimap.a $(SIEVE= _LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o squatter squatter.o index.o squat_build.o \ >>> -- $(CLIOBJS) libimap.a $(DEPLIBS) $(LIBS) >>> -+ $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --mbpath: mbpath.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+mbpath: mbpath.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o mbpath mbpath.o $(CLIOBJS) libimap.a \ >>> -- $(DEPLIBS) $(LIBS) >>> -+ $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --ipurge: ipurge.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+ipurge: ipurge.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o ipurge ipurge.o $(CLIOBJS) \ >>> -- libimap.a $(DEPLIBS) $(LIBS) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --cyrdump: cyrdump.o index.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+cyrdump: cyrdump.o index.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o cyrdump cyrdump.o index.o $(CLIOBJS) \ >>> -- libimap.a $(DEPLIBS) $(LIBS) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --mbexamine: mbexamine.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+mbexamine: mbexamine.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o \ >>> -- mbexamine mbexamine.o $(CLIOBJS) libimap.a $(DEPLIBS) $(LIBS) >>> -+ mbexamine mbexamine.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) $= (LIBS) >>> - >>> --reconstruct: reconstruct.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+reconstruct: reconstruct.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o \ >>> -- reconstruct reconstruct.o $(CLIOBJS) libimap.a $(DEPLIBS) $(LIBS) >>> -+ reconstruct reconstruct.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIB= S) $(LIBS) >>> - >>> --quota: quota.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+quota: quota.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) >>> - $(CC) $(LDFLAGS) -o quota quota.o $(CLIOBJS) \ >>> -- libimap.a $(DEPLIBS) $(LIBS) >>> -+ libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(LIBS) >>> - >>> --tls_prune: tls_prune.o tls.o $(CLIOBJS) libimap.a $(DEPLIBS) >>> -+tls_prune: tls_prune.o tls.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLI= BS) >>> - $(CC) $(LDFLAGS) -o \ >>> -- $@ tls_prune.o tls.o $(CLIOBJS) libimap.a $(DEPLIBS) $(LIBS) >>> -+ $@ tls_prune.o tls.o $(CLIOBJS) libimap.a $(SIEVE_LIBS) $(DEPLIBS) $(= LIBS) >>> - >>> - ### Other Misc Targets >>> - >>> -diff -Naur cyrus-imapd-2.2.12/imap/autosieve.c cyrus-imapd-2.2.12.autocr= eate2/imap/autosieve.c >>> ---- cyrus-imapd-2.2.12/imap/autosieve.c 1970-01-01 02:00:00.000000000 +0= 200 >>> -+++ cyrus-imapd-2.2.12.autocreate2/imap/autosieve.c 2005-10-19 14:48:57.= 940098000 +0300 >>> -@@ -0,0 +1,587 @@ >>> -+#include >>> -+#include >>> -+#include >>> -+ >>> -+#ifdef HAVE_UNISTD_H >>> -+#include >>> -+#endif >>> -+ >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+ >>> -+#include "global.h" >>> -+#include "util.h" >>> -+#include "mailbox.h" >>> -+#include "imap_err.h" >>> -+#include "sieve_interface.h" >>> -+#include "script.h" >>> -+ >>> -+#define TIMSIEVE_FAIL -1 >>> -+#define TIMSIEVE_OK 0 >>> -+#define MAX_FILENAME 1024 >>> -+ >>> -+static int get_script_name(char *sievename, size_t buflen, const char *= filename); >>> -+static int get_script_dir(char *sieve_script_dir, size_t buflen, char *= userid, const char *sieve_dir); >>> -+int autoadd_sieve(char *userid, const char *source_script); >>> -+ >>> -+static void fatal(const char *s, int code); >>> -+static void foo(void); >>> -+static int sieve_notify(void *ac __attribute__((unused)), >>> -+ void *interp_context __attribute__((unused)), >>> -+ void *script_context __attribute__((unused)), >>> -+ void *message_context __attribute__((unused)), >>> -+ const char **errmsg __attribute__((unused))); >>> -+static int mysieve_error(int lineno, const char *msg, >>> -+ void *i __attribute__((unused)), void *s); >>> -+static int is_script_parsable(FILE *stream, char **errstr, sieve_script= _t **ret); >>> -+ >>> -+ >>> -+sieve_vacation_t vacation2 =3D { >>> -+ 0, /* min response */ >>> -+ 0, /* max response */ >>> -+ (sieve_callback *) &foo, /* autorespond() */ >>> -+ (sieve_callback *) &foo /* send_response() */ >>> -+}; >>> -+ >>> -+ >>> -+/* >>> -+ * Find the name of the sieve script >>> -+ * given the source script and compiled script names >>> -+ */ >>> -+static int get_script_name(char *sievename, size_t buflen, const char *= filename) >>> -+{ >>> -+ char *p; >>> -+ int r; >>> -+ >>> -+ p =3D strrchr(filename, '/'); >>> -+ if (p =3D=3D NULL) >>> -+ p =3D (char *) filename; >>> -+ else >>> -+ p++; >>> -+ >>> -+ r =3D strlcpy(sievename, p, buflen) - buflen; >>> -+ return (r >=3D 0 || r =3D=3D -buflen ? 1 : 0); >>> -+} >>> -+ >>> -+ >>> -+/* >>> -+ * Find the directory where the sieve scripts of the user >>> -+ * reside >>> -+ */ >>> -+static int get_script_dir(char *sieve_script_dir, size_t buflen, char *= userid, const char *sieve_dir) >>> -+{ >>> -+ char *user =3D NULL, *domain =3D NULL; >>> -+ >>> -+ /* Setup the user and the domain */ >>> -+ if(config_virtdomains && (domain =3D strchr(userid, '@'))) { >>> -+ user =3D (char *) xmalloc((domain - userid +1) * sizeof(char)); >>> -+ strlcpy(user, userid, domain - userid + 1); >>> -+ domain++; >>> -+ } else >>> -+ user =3D userid; >>> -+ >>> -+ /* Find the dir path where the sieve scripts of the user will resi= de */ >>> -+ if (config_virtdomains && domain) { >>> -+ if(snprintf(sieve_script_dir, buflen, "%s%s%c/%s/%c/%s/", >>> -+ sieve_dir, FNAME_DOMAINDIR, dir_hash_c(domain), domain, d= ir_hash_c(user), user) >=3D buflen) { >>> -+ free(user); >>> -+ return 1; >>> -+ } >>> -+ } else { >>> -+ if(snprintf(sieve_script_dir, buflen, "%s/%c/%s/", >>> -+ sieve_dir, dir_hash_c(user), user) >=3D buflen) >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* Free the xmalloced user memory, reserved above */ >>> -+ if(user !=3D userid) >>> -+ free(user); >>> -+ >>> -+ return 0; >>> -+} >>> -+ >>> -+int autoadd_sieve(char *userid, const char *source_script) >>> -+{ >>> -+ sieve_script_t *s =3D NULL; >>> -+ bytecode_info_t *bc =3D NULL; >>> -+ char *err =3D NULL; >>> -+ FILE *in_stream, *out_fp; >>> -+ int out_fd, in_fd, r, k; >>> -+ int do_compile =3D 0; >>> -+ const char *sieve_dir =3D NULL; >>> -+ const char *compiled_source_script =3D NULL; >>> -+ char sievename[MAX_FILENAME]; >>> -+ char sieve_script_name[MAX_FILENAME]; >>> -+ char sieve_script_dir[MAX_FILENAME]; >>> -+ char sieve_bcscript_name[MAX_FILENAME]; >>> -+ char sieve_default[MAX_FILENAME]; >>> -+ char sieve_tmpname[MAX_FILENAME]; >>> -+ char sieve_bctmpname[MAX_FILENAME]; >>> -+ char sieve_bclink_name[MAX_FILENAME]; >>> -+ char buf[4096]; >>> -+ mode_t oldmask; >>> -+ struct stat statbuf; >>> -+ >>> -+ /* We don't support using the homedirectory, like timsieved */ >>> -+ if (config_getswitch(IMAPOPT_SIEVEUSEHOMEDIR)) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: autocreate_sieve does not= work with sieveusehomedir option in imapd.conf"); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* Check if sievedir is defined in imapd.conf */ >>> -+ if(!(sieve_dir =3D config_getstring(IMAPOPT_SIEVEDIR))) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: sievedir option is not d= efined. Check imapd.conf"); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* Check if autocreate_sieve_compiledscript is defined in imapd.con= f */ >>> -+ if(!(compiled_source_script =3D config_getstring(IMAPOPT_AUTOCREAT= E_SIEVE_COMPILEDSCRIPT))) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: autocreate_sieve_compile= dscript option is not defined. Compiling it"); >>> -+ do_compile =3D 1; >>> -+ } >>> -+ >>> -+ if(get_script_dir(sieve_script_dir, sizeof(sieve_script_dir), useri= d, sieve_dir)) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Cannot find sieve script= s directory"); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ if (get_script_name(sievename, sizeof(sievename), source_script)) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve script %s"= , source_script); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ if(snprintf(sieve_tmpname, sizeof(sieve_tmpname), "%s%s.script.NEW"= ,sieve_script_dir, sievename) >=3D sizeof(sieve_tmpname)) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %= s, %s", sieve_dir, sievename, userid); >>> -+ return 1; >>> -+ } >>> -+ if(snprintf(sieve_bctmpname, sizeof(sieve_bctmpname), "%s%s.bc.NEW"= ,sieve_script_dir, sievename) >=3D sizeof(sieve_bctmpname)) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %= s, %s", sieve_dir, sievename, userid); >>> -+ return 1; >>> -+ } >>> -+ if(snprintf(sieve_script_name, sizeof(sieve_script_name), "%s%s.scr= ipt",sieve_script_dir, sievename) >=3D sizeof(sieve_script_name)) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %= s, %s", sieve_dir, sievename, userid); >>> -+ return 1; >>> -+ } >>> -+ if(snprintf(sieve_bcscript_name, sizeof(sieve_bcscript_name), "%s%s= .bc",sieve_script_dir, sievename) >=3D sizeof(sieve_bcscript_name)) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %= s, %s", sieve_dir, sievename, userid); >>> -+ return 1; >>> -+ } >>> -+ if(snprintf(sieve_default, sizeof(sieve_default), "%s%s",sieve_scri= pt_dir,"defaultbc") >=3D sizeof(sieve_default)) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %= s, %s", sieve_dir, sievename, userid); >>> -+ return 1; >>> -+ } >>> -+ if(snprintf(sieve_bclink_name, sizeof(sieve_bclink_name), "%s.bc", = sievename) >=3D sizeof(sieve_bclink_name)) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Invalid sieve path %s, %= s, %s", sieve_dir, sievename, userid); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* Check if a default sieve filter alrady exists */ >>> -+ if(!stat(sieve_default,&statbuf)) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Default sieve script alre= ady exists"); >>> -+ fclose(in_stream); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* Open the source script. if there is a problem with that exit */ >>> -+ in_stream =3D fopen(source_script, "r"); >>> -+ if(!in_stream) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Unable to open sieve scri= pt %s. Check permissions",source_script); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ >>> -+ /* >>> -+ * At this point we start the modifications of the filesystem >>> -+ */ >>> -+ >>> -+ /* Create the directory where the sieve scripts will reside */ >>> -+ r =3D cyrus_mkdir(sieve_script_dir, 0755); >>> -+ if(r =3D=3D -1) { >>> -+ /* If this fails we just leave */ >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Unable to create director= y %s. Check permissions",sieve_script_name); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* >>> -+ * We open the file that will be used as the bc file. If this file = exists, overwrite it >>> -+ * since something bad has happened. We open the file here so that = this error checking is >>> -+ * done before we try to open the rest of the files to start copyin= g etc. >>> -+ */ >>> -+ out_fd =3D open(sieve_bctmpname, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|= S_IWUSR|S_IRGRP|S_IROTH); >>> -+ if(out_fd < 0) { >>> -+ if(errno =3D=3D EEXIST) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: File %s already exist= s. Probaly left over. Ignoring",sieve_bctmpname); >>> -+ } else if (errno =3D=3D EACCES) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: No access to create f= ile %s. Check permissions",sieve_bctmpname); >>> -+ fclose(in_stream); >>> -+ return 1; >>> -+ } else { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Unable to create %s. = Unknown error",sieve_bctmpname); >>> -+ fclose(in_stream); >>> -+ return 1; >>> -+ } >>> -+ } >>> -+ >>> -+ if(!do_compile && compiled_source_script && (in_fd =3D open(compile= d_source_script, O_RDONLY)) !=3D -1) { >>> -+ while((r =3D read(in_fd, buf, sizeof(buf))) > 0) { >>> -+ if((k=3Dwrite(out_fd, buf,r)) < 0) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Error writing to= file: %s, error: %d", sieve_bctmpname, errno); >>> -+ close(out_fd); >>> -+ close(in_fd); >>> -+ fclose(in_stream); >>> -+ unlink(sieve_bctmpname); >>> -+ return 1; >>> -+ } >>> -+ } >>> -+ >>> -+ if(r =3D=3D 0) { /* EOF */ >>> -+ close(out_fd); >>> -+ close(in_fd); >>> -+ } else if (r < 0) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Error reading compil= ed script file: %s. Will try to compile it", >>> -+ compiled_source_script); >>> -+ close(in_fd); >>> -+ do_compile =3D 1; >>> -+ if(lseek(out_fd, 0, SEEK_SET)) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Major IO problem= . Aborting"); >>> -+ return 1; >>> -+ } >>> -+ } >>> -+ close(in_fd); >>> -+ } else { >>> -+ if(compiled_source_script) >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Problem opening com= piled script file: %s. Compiling it", compiled_source_script); >>> -+ do_compile =3D 1; >>> -+ } >>> -+ >>> -+ >>> -+ /* Because we failed to open a precompiled bc sieve script, we comp= ile one */ >>> -+ if(do_compile) { >>> -+ if(is_script_parsable(in_stream,&err, &s) =3D=3D TIMSIEVE_FAIL) { >>> -+ if(err && *err) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Error while parsin= g script %s.",err); >>> -+ free(err); >>> -+ } else >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Error while parsi= ng script"); >>> -+ >>> -+ unlink(sieve_bctmpname); >>> -+ fclose(in_stream); >>> -+ close(out_fd); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* generate the bytecode */ >>> -+ if(sieve_generate_bytecode(&bc, s) =3D=3D TIMSIEVE_FAIL) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: problem compiling sie= ve script"); >>> -+ /* removing the copied script and cleaning up memory */ >>> -+ unlink(sieve_bctmpname); >>> -+ sieve_script_free(&s); >>> -+ fclose(in_stream); >>> -+ close(out_fd); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ if(sieve_emit_bytecode(out_fd, bc) =3D=3D TIMSIEVE_FAIL) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: problem emiting sieve= script"); >>> -+ /* removing the copied script and cleaning up memory */ >>> -+ unlink(sieve_bctmpname); >>> -+ sieve_free_bytecode(&bc); >>> -+ sieve_script_free(&s); >>> -+ fclose(in_stream); >>> -+ close(out_fd); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* clean up the memory */ >>> -+ sieve_free_bytecode(&bc); >>> -+ sieve_script_free(&s); >>> -+ } >>> -+ >>> -+ close(out_fd); >>> -+ rewind(in_stream); >>> -+ >>> -+ /* Copy the initial script */ >>> -+ oldmask =3D umask(077); >>> -+ if((out_fp =3D fopen(sieve_tmpname, "w")) =3D=3D NULL) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Unable to open %s destina= tion sieve script", sieve_tmpname); >>> -+ unlink(sieve_bctmpname); >>> -+ umask(oldmask); >>> -+ fclose(in_stream); >>> -+ return 1; >>> -+ } >>> -+ umask(oldmask); >>> -+ >>> -+ while((r =3D fread(buf,sizeof(char), sizeof(buf), in_stream))) { >>> -+ if( fwrite(buf,sizeof(char), r, out_fp) !=3D r) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Problem writing to si= eve script file: %s",sieve_tmpname); >>> -+ fclose(out_fp); >>> -+ unlink(sieve_tmpname); >>> -+ unlink(sieve_bctmpname); >>> -+ fclose(in_stream); >>> -+ return 1; >>> -+ } >>> -+ } >>> -+ >>> -+ if(feof(in_stream)) { >>> -+ fclose(out_fp); >>> -+ } else { /* ferror */ >>> -+ fclose(out_fp); >>> -+ unlink(sieve_tmpname); >>> -+ unlink(sieve_bctmpname); >>> -+ fclose(in_stream); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* Renaming the necessary stuff */ >>> -+ if(rename(sieve_tmpname, sieve_script_name)) { >>> -+ unlink(sieve_tmpname); >>> -+ unlink(sieve_bctmpname); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ if(rename(sieve_bctmpname, sieve_bcscript_name)) { >>> -+ unlink(sieve_bctmpname); >>> -+ unlink(sieve_bcscript_name); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* end now with the symlink */ >>> -+ if(symlink(sieve_bclink_name, sieve_default)) { >>> -+ if(errno !=3D EEXIST) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: problem making the d= efault link."); >>> -+ /* Lets delete the files */ >>> -+ unlink(sieve_script_name); >>> -+ unlink(sieve_bcscript_name); >>> -+ } >>> -+ } >>> -+ >>> -+ /* >>> -+ * If everything has succeeded AND we have compiled the script AND = we have requested >>> -+ * to generate the global script so that it is not compiled each ti= me then we create it. >>> -+ */ >>> -+ if(do_compile && >>> -+ config_getswitch(IMAPOPT_GENERATE_COMPILED_SIEVE_SCRIPT)) { >>> -+ >>> -+ if(!compiled_source_script) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: To save a compiled s= ieve script, autocreate_sieve_compiledscript must have been defined in imapd.= conf"); >>> -+ return 0; >>> -+ } >>> -+ >>> -+ if(snprintf(sieve_tmpname, sizeof(sieve_tmpname), "%s.NEW", com= piled_source_script) >=3D sizeof(sieve_tmpname)) >>> -+ return 0; >>> -+ >>> -+ /* >>> -+ * Copy everything from the newly created bc sieve sieve script. >>> -+ */ >>> -+ if((in_fd =3D open(sieve_bcscript_name, O_RDONLY))<0) { >>> -+ return 0; >>> -+ } >>> -+ >>> -+ if((out_fd =3D open(sieve_tmpname, O_CREAT|O_EXCL|O_WRONLY, S_I= RUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0) { >>> -+ if(errno =3D=3D EEXIST) { >>> -+ /* Someone is already doing this so just bail out. */ >>> -+ syslog(LOG_WARNING, "autocreate_sieve: %s already exists= . Some other instance processing it, or it is left over", sieve_tmpname); >>> -+ close(in_fd); >>> -+ return 0; >>> -+ } else if (errno =3D=3D EACCES) { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: No access to crea= te file %s. Check permissions",sieve_tmpname); >>> -+ close(in_fd); >>> -+ return 0; >>> -+ } else { >>> -+ syslog(LOG_WARNING,"autocreate_sieve: Unable to create = %s",sieve_tmpname); >>> -+ close(in_fd); >>> -+ return 0; >>> -+ } >>> -+ } >>> -+ >>> -+ while((r =3D read(in_fd, buf, sizeof(buf))) > 0) { >>> -+ if((k =3D write(out_fd,buf,r)) < 0) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Error writing to= file: %s, error: %d", sieve_tmpname, errno); >>> -+ close(out_fd); >>> -+ close(in_fd); >>> -+ unlink(sieve_tmpname); >>> -+ return 0; >>> -+ } >>> -+ } >>> -+ >>> -+ if(r =3D=3D 0 ) { /*EOF */ >>> -+ close(out_fd); >>> -+ close(in_fd); >>> -+ } else if (r < 0) { >>> -+ syslog(LOG_WARNING, "autocreate_sieve: Error writing to= file: %s, error: %d", sieve_tmpname, errno); >>> -+ close(out_fd); >>> -+ close(in_fd); >>> -+ unlink(sieve_tmpname); >>> -+ return 0; >>> -+ } >>> -+ >>> -+ /* Rename the temporary created sieve script to its final name.= */ >>> -+ if(rename(sieve_tmpname, compiled_source_script)) { >>> -+ if(errno !=3D EEXIST) { >>> -+ unlink(sieve_tmpname); >>> -+ unlink(compiled_source_script); >>> -+ } >>> -+ return 0; >>> -+ } >>> -+ >>> -+ syslog(LOG_NOTICE, "autocreate_sieve: Compiled sieve script was= successfully saved in %s", compiled_source_script); >>> -+ } >>> -+ >>> -+ return 0; >>> -+} >>> -+ >>> -+static void fatal(const char *s, int code) >>> -+{ >>> -+ printf("Fatal error: %s (%d)\r\n", s, code); >>> -+ exit(1); >>> -+} >>> -+ >>> -+/* to make larry's stupid functions happy :) */ >>> -+static void foo(void) >>> -+{ >>> -+ fatal("stub function called", 0); >>> -+} >>> -+ >>> -+static int sieve_notify(void *ac __attribute__((unused)), >>> -+ void *interp_context __attribute__((unused)), >>> -+ void *script_context __attribute__((unused)), >>> -+ void *message_context __attribute__((unused)), >>> -+ const char **errmsg __attribute__((unused))) >>> -+{ >>> -+ fatal("stub function called", 0); >>> -+ return SIEVE_FAIL; >>> -+} >>> -+ >>> -+static int mysieve_error(int lineno, const char *msg, >>> -+ void *i __attribute__((unused)), void *s) >>> -+{ >>> -+ char buf[1024]; >>> -+ char **errstr =3D (char **) s; >>> -+ >>> -+ snprintf(buf, 80, "line %d: %s\r\n", lineno, msg); >>> -+ *errstr =3D (char *) xrealloc(*errstr, strlen(*errstr) + strlen(buf= ) + 30); >>> -+ syslog(LOG_DEBUG, "%s", buf); >>> -+ strcat(*errstr, buf); >>> -+ >>> -+ return SIEVE_OK; >>> -+} >>> -+ >>> -+/* end the boilerplate */ >>> -+ >>> -+/* returns TRUE or FALSE */ >>> -+int is_script_parsable(FILE *stream, char **errstr, sieve_script_t **re= t) >>> -+{ >>> -+ sieve_interp_t *i; >>> -+ sieve_script_t *s; >>> -+ int res; >>> -+ >>> -+ res =3D sieve_interp_alloc(&i, NULL); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_interp_alloc() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_redirect(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_redirect() returns %d\n", r= es); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ res =3D sieve_register_discard(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_discard() returns %d\n", re= s); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ res =3D sieve_register_reject(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_reject() returns %d\n", res= ); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ res =3D sieve_register_fileinto(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_fileinto() returns %d\n", r= es); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ res =3D sieve_register_keep(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_keep() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_imapflags(i, NULL); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_imapflags() returns %d\n", = res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_size(i, (sieve_get_size *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_size() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_header(i, (sieve_get_header *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_header() returns %d\n", res= ); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_envelope(i, (sieve_get_envelope *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_envelope() returns %d\n", r= es); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_vacation(i, &vacation2); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_vacation() returns %d\n", r= es); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_notify(i, &sieve_notify); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_notify() returns %d\n", res= ); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_parse_error(i, &mysieve_error); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ syslog(LOG_WARNING, "sieve_register_parse_error() returns %d\n"= , res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ rewind(stream); >>> -+ >>> -+ *errstr =3D (char *) xmalloc(20 * sizeof(char)); >>> -+ strcpy(*errstr, "script errors:\r\n"); >>> -+ >>> -+ res =3D sieve_script_parse(i, stream, errstr, &s); >>> -+ >>> -+ if (res =3D=3D SIEVE_OK) { >>> -+ if(ret) { >>> -+ *ret =3D s; >>> -+ } else { >>> -+ sieve_script_free(&s); >>> -+ } >>> -+ free(*errstr); >>> -+ *errstr =3D NULL; >>> -+ } >>> -+ >>> -+ /* free interpreter */ >>> -+ sieve_interp_free(&i); >>> -+ >>> -+ return (res =3D=3D SIEVE_OK) ? TIMSIEVE_OK : TIMSIEVE_FAIL; >>> -+} >>> -+ >>> -+/* >>> -+ * Btw the initial date of this patch is Sep, 02 2004 which is the birt= hday of >>> -+ * Pavlos. Author of cyrusmaster. So consider this patch as his birthda= y present >>> -+ */ >>> -+ >>> -diff -Naur cyrus-imapd-2.2.12/imap/compile_sieve.c cyrus-imapd-2.2.12.au= tocreate2/imap/compile_sieve.c >>> ---- cyrus-imapd-2.2.12/imap/compile_sieve.c 1970-01-01 02:00:00.00000000= 0 +0200 >>> -+++ cyrus-imapd-2.2.12.autocreate2/imap/compile_sieve.c 2005-10-19 14:48= :57.943407000 +0300 >>> -@@ -0,0 +1,364 @@ >>> -+/* This tool compiles the sieve script from a command >>> -+line so that it can be used wby the autoadd patch */ >>> -+#include >>> -+#include >>> -+ >>> -+#include >>> -+#include >>> -+#ifdef HAVE_UNISTD_H >>> -+#include >>> -+#endif >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+#include >>> -+ >>> -+#include "global.h" >>> -+ >>> -+#include "util.h" >>> -+#include "mailbox.h" >>> -+#include "imap_err.h" >>> -+#include "sieve_interface.h" >>> -+#include "script.h" >>> -+ >>> -+#include >>> -+ >>> -+#define TIMSIEVE_FAIL -1 >>> -+#define TIMSIEVE_OK 0 >>> -+#define MAX_FILENAME_SIZE 100 >>> -+ >>> -+/* Needed by libconfig */ >>> -+const int config_need_data =3D 0; >>> -+ >>> -+static int is_script_parsable(FILE *stream, char **errstr, sieve_script= _t **ret); >>> -+ >>> -+static void fatal(const char *s, int code) >>> -+{ >>> -+ printf("Fatal error: %s (%d)\r\n", s, code); >>> -+ >>> -+ exit(1); >>> -+} >>> -+ >>> -+void usage(void) >>> -+{ >>> -+ fprintf(stderr, >>> -+ "Usage:\n\tcompile_sieve [-C ] [-i -o <= outfile>]\n"); >>> -+ exit(-1); >>> -+} >>> -+ >>> -+ >>> -+int main (int argc, char **argv) >>> -+{ >>> -+ >>> -+ sieve_script_t *s =3D NULL; >>> -+ bytecode_info_t *bc =3D NULL; >>> -+ char *err =3D NULL; >>> -+ FILE *in_stream; >>> -+ int out_fd,r, k, opt; >>> -+ char *source_script =3D NULL; >>> -+ char *compiled_source_script =3D NULL; >>> -+ mode_t oldmask; >>> -+ struct stat statbuf; >>> -+ char *alt_config =3D NULL; >>> -+ extern char *optarg; >>> -+ char sieve_tmpname[MAX_MAILBOX_NAME+1]; >>> -+ >>> -+ if (geteuid() =3D=3D 0) fatal("must run as the Cyrus user", EC_USAG= E); >>> -+ >>> -+ while((opt =3D getopt(argc, argv, "C:i:o:")) !=3D EOF) { >>> -+ switch (opt) { >>> -+ case 'C': /* alt config file */ >>> -+ alt_config =3D optarg; >>> -+ break; >>> -+ case 'i': /* input script file */ >>> -+ source_script =3D optarg; >>> -+ break; >>> -+ case 'o': /* output script file */ >>> -+ compiled_source_script =3D optarg; >>> -+ break; >>> -+ default: >>> -+ usage(); >>> -+ break; >>> -+ } >>> -+ } >>> -+ >>> -+ if(source_script && !compiled_source_script) { >>> -+ fprintf(stderr, "No output file was defined\n"); >>> -+ usage(); >>> -+ } else if (!source_script && compiled_source_script) { >>> -+ fprintf(stderr, "No input file was defined\n"); >>> -+ usage(); >>> -+ }=09 >>> -+ >>> -+ /* >>> -+ * If no has been defined, then read them from >>> -+ * the configuration file. >>> -+ */ >>> -+ if (!source_script && !compiled_source_script) { >>> -+ cyrus_init(alt_config, "compile_sieve", 0); >>> -+ >>> -+ /* Initially check if we want to have the sieve script created */ >>> -+ if(!(source_script =3D (char *) config_getstring(IMAPOPT_AUTOCREAT= E_SIEVE_SCRIPT))) { >>> -+ fprintf(stderr,"autocreate_sieve_script option not defined. Ch= eck imapd.conf\n"); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ /* Check if we have an already compiled sieve script*/ >>> -+ if(!(compiled_source_script =3D (char *) config_getstring(IMAPOPT_= AUTOCREATE_SIEVE_COMPILEDSCRIPT))) { >>> -+ fprintf(stderr, "autocreate_sieve_compiledscript option not de= fined. Check imapd.conf\n"); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ if(!strrchr(source_script,'/') || !strrchr(compiled_source_script,= '/')) { >>> -+ /* >>> -+ * At this point the only think that is inconsistent is the directory >>> -+ * that was created. But if the user will have any sieve scripts then >>> -+ * they will eventually go there, so no big deal >>> -+ */ >>> -+ fprintf(stderr, >>> -+ "In imapd.conf the full path of the filenames must be defined\n"); >>> -+ return 1; >>> -+ } >>> -+ } >>> -+ >>> -+ printf("input file : %s, output file : %s\n", source_script, compil= ed_source_script); >>> -+ >>> -+ >>> -+ if(strlen(compiled_source_script) + sizeof(".NEW") + 1 > sizeof(sie= ve_tmpname)) { >>> -+ fprintf(stderr, "Filename %s is too big\n", compiled_source_script= ); >>> -+ return 1; >>> -+ } >>> -+ =09 >>> -+ snprintf(sieve_tmpname, sizeof(sieve_tmpname), "%s.NEW", compiled_s= ource_script); >>> -+ >>> -+ in_stream =3D fopen(source_script,"r"); >>> -+ >>> -+ if(!in_stream) { >>> -+ fprintf(stderr,"Unable to open %s source sieve script\n",source= _script); >>> -+ return; >>> -+ } >>> -+ >>> -+ /* >>> -+ * We open the file that will be used as the bc file. If this file = exists, overwrite it >>> -+ * since something bad has happened. We open the file here so that = this error checking is >>> -+ * done before we try to open the rest of the files to start copyin= g etc. >>> -+ */ >>> -+ out_fd =3D open(sieve_tmpname, O_CREAT|O_EXCL|O_WRONLY, S_IRUSR|S_I= WUSR|S_IRGRP|S_IROTH); >>> -+ if(out_fd < 0) { >>> -+ if(errno =3D=3D EEXIST) { >>> -+ fprintf(stderr, "File %s already exists\n", sieve_tmpname); >>> -+ } else if (errno =3D=3D EACCES) { >>> -+ fprintf(stderr,"No access to create file %s. Please check t= hat you have the correct permissions\n", >>> -+ sieve_tmpname); >>> -+ } else { >>> -+ fprintf(stderr,"Unable to create %s. Please check that you = have the correct permissions\n", >>> -+ sieve_tmpname); >>> -+ } >>> -+=09 >>> -+ fclose(in_stream); >>> -+ return 1; >>> -+ } >>> -+ >>> -+ if(is_script_parsable(in_stream,&err, &s) =3D=3D TIMSIEVE_FAIL) { >>> -+ if(err && *err) { >>> -+ fprintf(stderr, "Error while parsing script %s\n",err); >>> -+ free(err); >>> -+ } >>> -+ else >>> -+ fprintf(stderr,"Error while parsing script\n"); >>> -+ unlink(sieve_tmpname); >>> -+ fclose(in_stream); >>> -+ close(out_fd); >>> -+ return; >>> -+ } >>> -+ >>> -+ >>> -+ /* generate the bytecode */ >>> -+ if(sieve_generate_bytecode(&bc,s) =3D=3D TIMSIEVE_FAIL) { >>> -+ fprintf(stderr,"Error occured while compiling sieve script\n"); >>> -+ /* removing the copied script and cleaning up memory */ >>> -+ unlink(sieve_tmpname); >>> -+ sieve_script_free(&s); >>> -+ fclose(in_stream); >>> -+ close(out_fd); >>> -+ return; >>> -+ } >>> -+ if(sieve_emit_bytecode(out_fd,bc) =3D=3D TIMSIEVE_FAIL) { >>> -+ fprintf(stderr, "Error occured while emitting sieve script\n"); >>> -+ unlink(sieve_tmpname); >>> -+ sieve_free_bytecode(&bc); >>> -+ sieve_script_free(&s); >>> -+ fclose(in_stream); >>> -+ close(out_fd); >>> -+ return; >>> -+ } >>> -+ >>> -+ /* clean up the memory */ >>> -+ sieve_free_bytecode(&bc); >>> -+ sieve_script_free(&s); >>> -+ >>> -+ close(out_fd); >>> -+ >>> -+ if(rename(sieve_tmpname, compiled_source_script)) { >>> -+ if(errno !=3D EEXIST) { >>> -+ unlink(sieve_tmpname); >>> -+ unlink(compiled_source_script); >>> -+ return 1; >>> -+ } >>> -+ } >>> -+ return 0; >>> -+} >>> -+ >>> -+ >>> -+/* to make larry's stupid functions happy :) */ >>> -+static void foo(void) >>> -+{ >>> -+ fatal("stub function called", 0); >>> -+} >>> -+ >>> -+extern sieve_vacation_t vacation2;/* =3D { >>> -+ 0, / min response / >>> -+ 0, / max response / >>> -+ (sieve_callback *) &foo, / autorespond() / >>> -+ (sieve_callback *) &foo / send_response() / >>> -+}; */ >>> -+ >>> -+static int sieve_notify(void *ac __attribute__((unused)), >>> -+ void *interp_context __attribute__((unused)), >>> -+ void *script_context __attribute__((unused)), >>> -+ void *message_context __attribute__((unused)), >>> -+ const char **errmsg __attribute__((unused))) >>> -+{ >>> -+ fatal("stub function called", 0); >>> -+ return SIEVE_FAIL; >>> -+} >>> -+ >>> -+static int mysieve_error(int lineno, const char *msg, >>> -+ void *i __attribute__((unused)), void *s) >>> -+{ >>> -+ char buf[1024]; >>> -+ char **errstr =3D (char **) s; >>> -+ >>> -+ snprintf(buf, 80, "line %d: %s\r\n", lineno, msg); >>> -+ *errstr =3D (char *) xrealloc(*errstr, strlen(*errstr) + strlen(buf= ) + 30); >>> -+ fprintf(stderr, "%s\n", buf); >>> -+ strcat(*errstr, buf); >>> -+ >>> -+ return SIEVE_OK; >>> -+} >>> -+ >>> -+/* end the boilerplate */ >>> -+ >>> -+/* returns TRUE or FALSE */ >>> -+int is_script_parsable(FILE *stream, char **errstr, sieve_script_t **re= t) >>> -+{ >>> -+ sieve_interp_t *i; >>> -+ sieve_script_t *s; >>> -+ int res; >>> -+ >>> -+ res =3D sieve_interp_alloc(&i, NULL); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_interp_alloc() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_redirect(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_redirect() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ res =3D sieve_register_discard(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_discard() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ res =3D sieve_register_reject(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_reject() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ res =3D sieve_register_fileinto(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_fileinto() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ res =3D sieve_register_keep(i, (sieve_callback *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_keep() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_imapflags(i, NULL); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_imapflags() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_size(i, (sieve_get_size *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_size() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_header(i, (sieve_get_header *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_header() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_envelope(i, (sieve_get_envelope *) &foo); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_envelope() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_vacation(i, &vacation2); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_vacation() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_notify(i, &sieve_notify); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_notify() returns %d\n", res); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ res =3D sieve_register_parse_error(i, &mysieve_error); >>> -+ if (res !=3D SIEVE_OK) { >>> -+ fprintf(stderr, "sieve_register_parse_error() returns %d\n", re= s); >>> -+ return TIMSIEVE_FAIL; >>> -+ } >>> -+ >>> -+ rewind(stream); >>> -+ >>> -+ *errstr =3D (char *) xmalloc(20 * sizeof(char)); >>> -+ strcpy(*errstr, "script errors:\r\n"); >>> -+ >>> -+ res =3D sieve_script_parse(i, stream, errstr, &s); >>> -+ >>> -+ if (res =3D=3D SIEVE_OK) { >>> -+ if(ret) { >>> -+ *ret =3D s; >>> -+ } else { >>> -+ sieve_script_free(&s); >>> -+ } >>> -+ free(*errstr); >>> -+ *errstr =3D NULL; >>> -+ } >>> -+ >>> -+ /* free interpreter */ >>> -+ sieve_interp_free(&i); >>> -+ >>> -+ return (res =3D=3D SIEVE_OK) ? TIMSIEVE_OK : TIMSIEVE_FAIL; >>> -+} >>> -+ >>> -+ >>> -+ >>> -+ >>> -+ >>> -+ >>> -diff -Naur cyrus-imapd-2.2.12/imap/imapd.c cyrus-imapd-2.2.12.autocreate= 2/imap/imapd.c >>> ---- cyrus-imapd-2.2.12/imap/imapd.c 2005-02-14 08:39:55.000000000 +0200 >>> -+++ cyrus-imapd-2.2.12.autocreate2/imap/imapd.c 2005-10-19 14:48:57.9667= 49000 +0300 >>> -@@ -158,6 +158,7 @@ >>> - void motd_file(int fd); >>> - void shut_down(int code); >>> - void fatal(const char *s, int code); >>> -+void autocreate_inbox(void); >>> - >>> - void cmdloop(void); >>> - void cmd_login(char *tag, char *user); >>> -@@ -1693,6 +1694,42 @@ >>> - } >>> - >>> - /* >>> -+ * Autocreate Inbox and subfolders upon login >>> -+ */ >>> -+void autocreate_inbox() >>> -+{ >>> -+ char inboxname[MAX_MAILBOX_NAME+1]; >>> -+ int autocreatequota; >>> -+ int r; >>> -+ >>> -+ /* >>> -+ * Exlude admin's accounts >>> -+ */ >>> -+ if (imapd_userisadmin || imapd_userisproxyadmin) >>> -+ return; >>> -+ >>> -+ /* >>> -+ * Exclude anonymous >>> -+ */ >>> -+ if (!strcmp(imapd_userid, "anonymous")) >>> -+ return; >>> -+ >>> -+ if ((autocreatequota =3D config_getint(IMAPOPT_AUTOCREATEQUOTA))) { >>> -+ /* This is actyally not required >>> -+ as long as the lenght of userid is ok */ >>> -+ r =3D (*imapd_namespace.mboxname_tointernal) (&imapd_namespa= ce, >>> -+ "INBOX", imapd_userid, inboxname); >>> -+ if (!r) >>> -+ r =3D mboxlist_lookup(inboxname, NULL, NULL, NULL); >>> -+ >>> -+ if (r =3D=3D IMAP_MAILBOX_NONEXISTENT) >>> -+ mboxlist_autocreateinbox(&imapd_namespace, imapd_userid, >>> -+ imapd_authstate, inboxname, autocreatequota); >>> -+ } >>> -+} >>> -+ >>> -+ >>> -+/* >>> - * Perform a LOGIN command >>> - */ >>> - void cmd_login(char *tag, char *user) >>> -@@ -1848,6 +1885,9 @@ >>> - strcspn(imapd_userid, "@") : 0); >>> - >>> - freebuf(&passwdbuf); >>> -+ >>> -+ autocreate_inbox(); >>> -+ >>> - return; >>> - } >>> - >>> -@@ -1993,6 +2033,8 @@ >>> - config_virtdomains ? >>> - strcspn(imapd_userid, "@") : 0); >>> - >>> -+ autocreate_inbox(); >>> -+ >>> - return; >>> - } >>> - >>> -diff -Naur cyrus-imapd-2.2.12/imap/lmtpd.c cyrus-imapd-2.2.12.autocreate= 2/imap/lmtpd.c >>> ---- cyrus-imapd-2.2.12/imap/lmtpd.c 2004-12-17 18:32:15.000000000 +0200 >>> -+++ cyrus-imapd-2.2.12.autocreate2/imap/lmtpd.c 2005-10-19 14:48:57.9711= 45000 +0300 >>> -@@ -106,6 +106,8 @@ >>> - static FILE *spoolfile(message_data_t *msgdata); >>> - static void removespool(message_data_t *msgdata); >>> - >>> -+static int autocreate_inbox(char *rcpt_userid); >>> -+ >>> - /* current namespace */ >>> - static struct namespace lmtpd_namespace; >>> - >>> -@@ -504,10 +506,55 @@ >>> - exit(code); >>> - } >>> - >>> -+/* >>> -+ * Autocreate Inbox and subfolders upon login >>> -+ */ >>> -+int autocreate_inbox(char *rcpt_userid) >>> -+{ >>> -+ struct auth_state *authstate; >>> -+ char inboxname[MAX_MAILBOX_NAME+1]; >>> -+ int rcptisadmin; >>> -+ int autocreatequota; >>> -+ int r; >>> -+ >>> -+ if(rcpt_userid =3D=3D NULL) >>> -+ return IMAP_MAILBOX_NONEXISTENT; >>> -+ >>> -+ /* >>> -+ * Exclude anonymous >>> -+ */ >>> -+ if (!strcmp(rcpt_userid, "anonymous")) >>> -+ return IMAP_MAILBOX_NONEXISTENT; >>> -+ >>> -+ /* >>> -+ * Check for autocreatequota and createonpost >>> -+ */ >>> -+ if (!(autocreatequota =3D config_getint(IMAPOPT_AUTOCREATEQUOTA)) || >>> -+ !(config_getswitch(IMAPOPT_CREATEONPOST))) >>> -+ return IMAP_MAILBOX_NONEXISTENT; >>> -+ >>> -+ /* >>> -+ * Exclude admin's accounts >>> -+ */ >>> -+ authstate =3D auth_newstate(rcpt_userid); >>> -+ rcptisadmin =3D global_authisa(authstate, IMAPOPT_ADMINS); >>> -+ if (rcptisadmin) >>> -+ return IMAP_MAILBOX_NONEXISTENT; >>> -+ >>> -+ r =3D (*lmtpd_namespace.mboxname_tointernal) (&lmtpd_namespace, >>> -+ "INBOX", rcpt_userid, inboxname); >>> -+ if (!r) >>> -+ r =3D mboxlist_autocreateinbox(&lmtpd_namespace, rcpt_userid, >>> -+ authstate, inboxname, autocreatequota); >>> -+ return r; >>> -+} >>> -+ >>> -+ >>> - static int verify_user(const char *user, const char *domain, const char= *mailbox, >>> - long quotacheck, struct auth_state *authstate) >>> - { >>> - char namebuf[MAX_MAILBOX_NAME+1] =3D ""; >>> -+ char *userinbox =3D NULL; >>> - int r =3D 0; >>> - >>> - if ((!user && !mailbox) || >>> -@@ -545,6 +592,28 @@ >>> - */ >>> - r =3D append_check(namebuf, MAILBOX_FORMAT_NORMAL, authstate, >>> - !user ? ACL_POST : 0, quotacheck > 0 ? 0 : quotacheck); >>> -+ if (r =3D=3D IMAP_MAILBOX_NONEXISTENT && user) { >>> -+ if(domain) { >>> -+ int k; >>> -+ userinbox =3D (char *)xmalloc((strlen(user)+strlen(domain)+2)*sizeof(= char)); >>> -+ k =3D strlcpy(userinbox, user, strlen(user)+1); >>> -+ *(userinbox + k) =3D '@'; >>> -+ strlcpy(userinbox+k+1, domain, strlen(domain)+1); >>> -+ } >>> -+ else userinbox =3D user; >>> -+ /* >>> -+ * Try to create automatically the mailbox, if >>> -+ * autocreate inbox option is enabled. >>> -+ */ >>> -+ r =3D autocreate_inbox(userinbox); >>> -+=09 >>> -+ if(userinbox !=3D user) >>> -+ free(userinbox); >>> -+ if (!r) >>> -+ r =3D append_check(namebuf, MAILBOX_FORMAT_NORMAL, auth= state, >>> -+ 0, quotacheck > 0 ? 0 : quotacheck); >>> -+ } >>> -+ >>> - } >>> - >>> - if (r) syslog(LOG_DEBUG, "verify_user(%s) failed: %s", namebuf, >>> -diff -Naur cyrus-imapd-2.2.12/imap/mboxlist.c cyrus-imapd-2.2.12.autocre= ate2/imap/mboxlist.c >>> ---- cyrus-imapd-2.2.12/imap/mboxlist.c 2004-07-26 21:08:03.000000000 +03= 00 >>> -+++ cyrus-imapd-2.2.12.autocreate2/imap/mboxlist.c 2005-10-19 14:49:25.9= 72032000 +0300 >>> -@@ -81,6 +81,12 @@ >>> - #include "mboxlist.h" >>> - #include "quota.h" >>> - >>> -+#ifdef USE_SIEVE >>> -+extern int autoadd_sieve(char *userid, >>> -+ const char *source_script); >>> -+#endif >>> -+ >>> -+ >>> - #define DB config_mboxlist_db >>> - #define SUBDB config_subscription_db >>> - >>> -@@ -98,11 +104,29 @@ >>> - static int mboxlist_changequota(const char *name, int matchlen, int may= create, >>> - void *rock); >>> - >>> -+static int mboxlist_autochangesub(char *name, int matchlen, int maycrea= te, >>> -+ void *rock); >>> -+ >>> -+static int mboxlist_autosubscribe_sharedfolders(struct namespace *names= pace, >>> -+ char *userid, char *auth_userid, >>> -+ struct auth_state *auth_state); >>> -+ >>> - struct change_rock { >>> - struct quota *quota; >>> - struct txn **tid; >>> - }; >>> - >>> -+/* >>> -+ * Struct needed to be passed as void *rock to >>> -+ * mboxlist_autochangesub(); >>> -+ */ >>> -+struct changesub_rock_st { >>> -+ char *userid; >>> -+ char *auth_userid; >>> -+ struct auth_state *auth_state; >>> -+}; >>> -+ >>> -+ >>> - #define FNAME_SUBSSUFFIX ".sub" >>> - >>> - /* >>> -@@ -3124,3 +3148,338 @@ >>> - >>> - return DB->abort(mbdb, tid); >>> - } >>> -+ >>> -+/* >>> -+ * Automatically subscribe user to *ALL* shared folders, >>> -+ * one has permissions to be subscribed to. >>> -+ * INBOX subfolders are excluded. >>> -+ */ >>> -+static int mboxlist_autochangesub(char *name, int matchlen, int maycrea= te, >>> -+ void *rock) { >>> -+ >>> -+ struct changesub_rock_st *changesub_rock =3D (struct changesub_rock_s= t *) rock; >>> -+ char *userid =3D changesub_rock->userid; >>> -+ char *auth_userid =3D changesub_rock->auth_userid; >>> -+ struct auth_state *auth_state =3D changesub_rock->auth_state; >>> -+ int r; >>> -+ >>> -+ >>> -+ if((strlen(name) =3D=3D 5 && !strncmp(name, "INBOX", 5)) || /* Exclud= e INBOX */ >>> -+ (strlen(name) > 5 && !strncmp(name, "INBOX.",6)) || /* Exclude IN= BOX subfolders */ >>> -+ (strlen(name) > 4 && !strncmp(name, "user.", 5))) /* Exclude ot= her users' folders */ >>> -+ return 0; >>> -+ >>> -+ >>> -+ r =3D mboxlist_changesub(name, userid, auth_state, 1, 0); >>> -+ >>> -+ if (r) { >>> -+ syslog(LOG_WARNING, >>> -+ "autosubscribe: User %s to folder %s, subscription failed:= %s", >>> -+ auth_userid, name, error_message(r)); >>> -+ } else { >>> -+ syslog(LOG_NOTICE, >>> -+ "autosubscribe: User %s to folder %s, subscription succeed= ed", >>> -+ auth_userid, name); >>> -+ } >>> -+ >>> -+ return 0; >>> -+} >>> -+ >>> -+#define SEP '|' >>> -+ >>> -+/* >>> -+ * Automatically subscribe user to a shared folder. >>> -+ * Subscription is done successfully, if the shared >>> -+ * folder exists and the user has the necessary >>> -+ * permissions. >>> -+ */ >>> -+static int mboxlist_autosubscribe_sharedfolders(struct namespace *names= pace, >>> -+ char *userid, char *auth_userid, >>> -+ struct auth_state *auth_state) { >>> -+ >>> -+ const char *sub ; >>> -+ char *p, *q, *next_sub; >>> -+ char folder[MAX_MAILBOX_NAME+1], name[MAX_MAILBOX_NAME+1], mailboxn= ame[MAX_MAILBOX_NAME+1]; >>> -+ int len; >>> -+ int r =3D 0; >>> -+ int subscribe_all_sharedfolders =3D 0; >>> -+ >>> -+ subscribe_all_sharedfolders =3D config_getswitch(IMAPOPT_AUTOSUBSCR= IBE_ALL_SHAREDFOLDERS); >>> -+ >>> -+ /* >>> -+ * If subscribeallsharedfolders is set to yes in imapd.conf, then >>> -+ * subscribe user to every shared folder one has the apropriate >>> -+ * permissions. >>> -+ */ >>> -+ if(subscribe_all_sharedfolders) { >>> -+ char pattern[MAX_MAILBOX_PATH+1]; >>> -+ struct changesub_rock_st changesub_rock; >>> -+ >>> -+ strcpy(pattern, "*"); >>> -+ changesub_rock.userid =3D userid; >>> -+ changesub_rock.auth_userid =3D auth_userid; >>> -+ changesub_rock.auth_state =3D auth_state; >>> -+ >>> -+ r =3D mboxlist_findall(namespace, pattern, 0, userid, >>> -+ auth_state, mboxlist_autochangesub, &change= sub_rock); >>> -+ >>> -+ return r; >>> -+ } >>> -+ >>> -+ if ((sub=3Dconfig_getstring(IMAPOPT_AUTOSUBSCRIBESHAREDFOLDERS)) = =3D=3D NULL) >>> -+ return r; >>> -+ >>> -+ next_sub =3D (char *) sub; >>> -+ while (*next_sub) { >>> -+ for (p =3D next_sub ; isspace((int) *p) || *p =3D=3D SEP ; p++); >>> -+ for (next_sub =3D p ; *next_sub && *next_sub !=3D SEP ; next_su= b++); >>> -+ for (q =3D next_sub ; q > p && (isspace((int) *q) || *q =3D=3D = SEP || !*q) ; q--); >>> -+ if (!*p ) continue; >>> -+ >>> -+ len =3D q - p + 1; >>> -+ /* Check for folder length */ >>> -+ if (len > sizeof(folder)-1) >>> -+ continue; >>> -+ >>> -+ if (!r) { >>> -+ strncpy(folder, p, len); >>> -+ folder[len] =3D '\0'; >>> -+ >>> -+ strlcpy(name, namespace->prefix[NAMESPACE_SHARED], sizeo= f(name)); >>> -+ len =3D strlcat(name, folder, sizeof(name)); >>> -+ >>> -+ r =3D (namespace->mboxname_tointernal) (namespace, name,= userid, >>> -+ mailb= oxname); >>> -+ } >>> -+ >>> -+ if (!r) >>> -+ r =3D mboxlist_changesub(mailboxname, userid, auth_state= , 1, 0); >>> -+ >>> -+ if (!r) { >>> -+ syslog(LOG_NOTICE, "autosubscribe: User %s to %s succee= ded", >>> -+ userid, folder); >>> -+ } else { >>> -+ syslog(LOG_WARNING, "autosubscribe: User %s to %s faile= d: %s", >>> -+ userid, folder, error_message(r)); >>> -+ r =3D 0; >>> -+ } >>> -+ } >>> -+ >>> -+ return r; >>> -+} >>> -+ >>> -+ >>> -+ >>> -+int mboxlist_autocreateinbox(struct namespace *namespace, >>> -+ char *userid, >>> -+ struct auth_state *auth_state, >>> -+ char *mailboxname, int autocreatequota) { >>> -+ char name [MAX_MAILBOX_NAME+1]; >>> -+ char folder [MAX_MAILBOX_NAME+1]; >>> -+ char *auth_userid =3D NULL; >>> -+ char *partition =3D NULL; >>> -+ const char *crt; >>> -+ const char *sub; >>> -+ char *p, *q, *next_crt, *next_sub; >>> -+ int len; >>> -+ int r =3D 0; >>> -+ int numcrt =3D 0; >>> -+ int numsub =3D 0; >>> -+#ifdef USE_SIEVE >>> -+ const char *source_script; >>> -+#endif >>> -+ >>> -+ /* >>> -+ * While this is not needed for admins >>> -+ * and imap_admins accounts, it would be >>> -+ * better to separate *all* admins and >>> -+ * proxyservers from normal accounts >>> -+ * (accounts that have mailboxes). >>> -+ * UOA Specific note(1): Even if we do not >>> -+ * exclude these servers-classes here, >>> -+ * UOA specific code, will neither return >>> -+ * role, nor create INBOX, because none of these >>> -+ * administrative accounts belong to the >>> -+ * mailRecipient objectclass, or have imapPartition. >>> -+ * UOA Specific note(2): Another good reason for doing >>> -+ * this, is to prevent the code, from getting into >>> -+ * cyrus_ldap.c because of the continues MSA logins to LMTPd. >>> -+ */ >>> -+ >>> -+ /* >>> -+ * admins and the coresponding imap >>> -+ * service, had already been excluded. >>> -+ */ >>> -+ >>> -+ /* >>> -+ * Do we really need group membership >>> -+ * for admins or service_admins? >>> -+ */ >>> -+ if (global_authisa(auth_state, IMAPOPT_ADMINS)) return 0; >>> -+ if (global_authisa(auth_state, IMAPOPT_ADMINS)) return 0; >>> -+ >>> -+ /* >>> -+ * Do we really need group membership >>> -+ * for proxyservers? >>> -+ */ >>> -+ if (global_authisa(auth_state, IMAPOPT_PROXYSERVERS)) return 0; >>> -+ if (global_authisa(auth_state, IMAPOPT_PROXYSERVERS)) return 0; >>> -+ >>> -+ auth_userid =3D auth_canonuser(auth_state); >>> -+ >>> -+ if (auth_userid =3D=3D NULL) { >>> -+ /* >>> -+ * Couldn't get cannon userid >>> -+ */ >>> -+ syslog(LOG_ERR, >>> -+ "Could not get cannon userid for user %s", userid); >>> -+ return IMAP_PARTITION_UNKNOWN; >>> -+ } >>> -+ >>> -+#if 0 >>> -+ /* >>> -+ * Get Partition info or return. >>> -+ * (Here you should propably use >>> -+ * you own "get_partition(char *userid)" >>> -+ * function. Otherwise all new INBOXes will be >>> -+ * created into whatever partition has been declared >>> -+ * as default in your imapd.conf) >>> -+ */ >>> -+ >>> -+ partition =3D get_partition(userid); >>> -+ >>> -+ if (partition =3D=3D NULL) { >>> -+ /* >>> -+ * Couldn't get partition info >>> -+ */ >>> -+ syslog(LOG_ERR, >>> -+ "Could not get imapPartition info for user %s", user= id); >>> -+ return IMAP_PARTITION_UNKNOWN; >>> -+ } >>> -+#endif >>> -+ >>> -+ r =3D mboxlist_createmailbox(mailboxname, MAILBOX_FORMAT_NORMAL, NU= LL, >>> -+ 1, userid, auth_state, 0, 0, 0); >>> -+ >>> -+ if (!r && autocreatequota > 0) >>> -+ r =3D mboxlist_setquota(mailboxname, autocreatequota, 0); >>> -+ >>> -+ if (!r) >>> -+ r =3D mboxlist_changesub(mailboxname, userid, >>> -+ auth_state, 1, 1); >>> -+ >>> -+ if (!r) { >>> -+ syslog(LOG_NOTICE, "autocreateinbox: User %s, INBOX was successf= ully created in partition %s", >>> -+ auth_userid, partition =3D=3D NULL ? "default" : partiti= on); >>> -+ } else { >>> -+ syslog(LOG_ERR, "autocreateinbox: User %s, INBOX failed. %s", >>> -+ auth_userid, error_message(r)); >>> -+ } >>> -+ >>> -+ >>> -+#if 0 >>> -+ /* Allocated from get_partition, and not needed any more */ >>> -+ free_partition(partition); >>> -+#endif >>> -+ >>> -+ if (r) return r; >>> -+ >>> -+ >>> -+ /* INBOX's subfolders */ >>> -+ if ((crt=3Dconfig_getstring(IMAPOPT_AUTOCREATEINBOXFOLDERS))) >>> -+ sub=3Dconfig_getstring(IMAPOPT_AUTOSUBSCRIBEINBOXFOLDERS); >>> -+ >>> -+ /* Roll through crt */ >>> -+ next_crt =3D (char *) crt; >>> -+ while (next_crt!=3DNULL && *next_crt) { >>> -+ for (p =3D next_crt ; isspace((int) *p) || *p =3D=3D SEP ; p+= +); >>> -+ for (next_crt =3D p ; *next_crt && *next_crt !=3D SEP ; next_= crt++); >>> -+ for (q =3D next_crt ; q > p && (isspace((int) *q) || *q =3D= =3D SEP || !*q); q--); >>> -+ >>> -+ if (!*p) continue; >>> -+ >>> -+ len =3D q - p + 1; >>> -+ >>> -+ /* First time we check for length */ >>> -+ if (len > sizeof(folder) - 5) >>> -+ r =3D IMAP_MAILBOX_BADNAME; >>> -+ >>> -+ if (!r) { >>> -+ strncpy(folder, p, len); >>> -+ folder[len] =3D '\0'; >>> -+ >>> -+ strlcpy(name, namespace->prefix[NAMESPACE_INBOX], siz= eof(name)); >>> -+ len =3D strlcat(name, folder, sizeof(name)); >>> -+ } >>> -+ >>> -+ if (!r) >>> -+ r =3D (namespace->mboxname_tointernal) (namespace, name, us= erid, >>> -+ mailboxname); >>> -+ if (!r) >>> -+ r =3D mboxlist_createmailbox(mailboxname, MAILBOX_FORMAT_N= ORMAL, NULL, >>> -+ 1, userid, auth_state, 0, 0= , 0); >>> -+ >>> -+ if (!r) { >>> -+ numcrt++; >>> -+ syslog(LOG_NOTICE, "autocreateinbox: User %s, subfolder %s = creation succeeded.", >>> -+ auth_userid, name); >>> -+ } else { >>> -+ syslog(LOG_WARNING, "autocreateinbox: User %s, subfolder %= s creation failed. %s", >>> -+ auth_userid, name, error_message(r)); >>> -+ r=3D0; >>> -+ continue; >>> -+ } >>> -+ >>> -+ /* Roll through sub */ >>> -+ next_sub =3D (char *) sub; >>> -+ while (next_sub!=3DNULL && *next_sub) { >>> -+ for (p =3D next_sub ; isspace((int) *p) || *p =3D=3D SE= P ; p++); >>> -+ for (next_sub =3D p ; *next_sub && *next_sub !=3D SEP ;= next_sub++); >>> -+ for (q =3D next_sub ; q > p && (isspace((int) *q) || *q= =3D=3D SEP || !*q) ; q--); >>> -+ if (!*p ) continue; >>> -+ >>> -+ len =3D q - p + 1; >>> -+ >>> -+ if (len !=3D strlen(folder) || strncmp(folder, p, len)) >>> -+ continue; >>> -+ >>> -+ r =3D mboxlist_changesub(mailboxname, userid, auth_stat= e, 1, 1); >>> -+ >>> -+ if (!r) { >>> -+ numsub++; >>> -+ syslog(LOG_NOTICE,"autocreateinbox: User %s, subscri= ption to %s succeeded", >>> -+ auth_userid, name); >>> -+ } else >>> -+ syslog(LOG_WARNING, "autocreateinbox: User %s, subs= cription to %s failed. %s", >>> -+ auth_userid, name, error_message(r)); >>> -+ >>> -+ break; >>> -+ } >>> -+ } >>> -+ >>> -+ if (crt!=3DNULL && *crt) >>> -+ syslog(LOG_INFO, "User %s, Inbox subfolders, created %d, subscri= bed %d", >>> -+ auth_userid, numcrt, numsub); >>> -+ >>> -+ /* >>> -+ * Check if shared folders are available for subscription. >>> -+ */ >>> -+ mboxlist_autosubscribe_sharedfolders(namespace, userid, auth_userid= , auth_state); >>> -+ >>> -+#ifdef USE_SIEVE >>> -+ /* >>> -+ * Here the autocreate sieve script feature is iniated from. >>> -+ */ >>> -+ source_script =3D config_getstring(IMAPOPT_AUTOCREATE_SIEVE_SCRIPT); >>> -+ >>> -+ if (source_script) { >>> -+ if (!autoadd_sieve(userid, source_script)) >>> -+ syslog(LOG_NOTICE, "autocreate_sieve: User %s, default siev= e script creation succeeded", auth_userid); >>> -+ else >>> -+ syslog(LOG_WARNING, "autocreate_sieve: User %s, default sie= ve script creation failed", auth_userid); >>> -+ } >>> -+#endif >>> -+ >>> -+ return r; >>> -+} >>> -+ >>> -diff -Naur cyrus-imapd-2.2.12/imap/mboxlist.h cyrus-imapd-2.2.12.autocre= ate2/imap/mboxlist.h >>> ---- cyrus-imapd-2.2.12/imap/mboxlist.h 2004-03-17 20:07:49.000000000 +02= 00 >>> -+++ cyrus-imapd-2.2.12.autocreate2/imap/mboxlist.h 2005-10-19 14:48:58.0= 27033000 +0300 >>> -@@ -197,4 +197,10 @@ >>> - int mboxlist_commit(struct txn *tid); >>> - int mboxlist_abort(struct txn *tid); >>> - >>> -+int mboxlist_autocreateinbox(struct namespace *namespace, >>> -+ char *userid, >>> -+ struct auth_state *auth_state, >>> -+ char *mailboxname, int autocreatequota); >>> -+ >>> -+ >>> - #endif >>> -diff -Naur cyrus-imapd-2.2.12/imap/pop3d.c cyrus-imapd-2.2.12.autocreate= 2/imap/pop3d.c >>> ---- cyrus-imapd-2.2.12/imap/pop3d.c 2005-01-04 17:06:13.000000000 +0200 >>> -+++ cyrus-imapd-2.2.12.autocreate2/imap/pop3d.c 2005-10-19 14:48:58.0333= 35000 +0300 >>> -@@ -152,6 +152,8 @@ >>> - static char popd_apop_chal[45 + MAXHOSTNAMELEN + 1]; /* */ >>> - static void cmd_apop(char *response); >>> - >>> -+static int autocreate_inbox(char *inboxname, char *userid); >>> -+ >>> - static void cmd_auth(char *arg); >>> - static void cmd_capa(void); >>> - static void cmd_pass(char *pass); >>> -@@ -1084,6 +1086,7 @@ >>> - popd_userid =3D xstrdup(p); >>> - prot_printf(popd_out, "+OK Name is a valid mailbox\r\n"); >>> - } >>> -+ >>> - } >>> - >>> - void cmd_pass(char *pass) >>> -@@ -1328,6 +1331,46 @@ >>> - } >>> - >>> - /* >>> -+ * Autocreate Inbox and subfolders upon login >>> -+ */ >>> -+int autocreate_inbox(char *inboxname, char *auth_userid) >>> -+{ >>> -+ struct auth_state *authstate; >>> -+ int userisadmin; >>> -+ int autocreatequota; >>> -+ int r; >>> -+ >>> -+ if(inboxname =3D=3D NULL || auth_userid =3D=3D NULL) >>> -+ return IMAP_MAILBOX_NONEXISTENT; >>> -+ >>> -+ /* >>> -+ * Exclude anonymous >>> -+ */ >>> -+ if (!strcmp(popd_userid, "anonymous")) >>> -+ return IMAP_MAILBOX_NONEXISTENT; >>> -+ >>> -+ /* >>> -+ * Check for autocreatequota >>> -+ */ >>> -+ if (!(autocreatequota =3D config_getint(IMAPOPT_AUTOCREATEQUOTA))) >>> -+ return IMAP_MAILBOX_NONEXISTENT; >>> -+ >>> -+ /* >>> -+ * Exclude admin's accounts >>> -+ */ >>> -+ >>> -+ authstate =3D auth_newstate(popd_userid); >>> -+ userisadmin =3D global_authisa(authstate, IMAPOPT_ADMINS); >>> -+ if (userisadmin) >>> -+ return IMAP_MAILBOX_NONEXISTENT; >>> -+ >>> -+ r =3D mboxlist_autocreateinbox(&popd_namespace, auth_userid, >>> -+ authstate, inboxname, autocreatequota); >>> -+ return r; >>> -+} >>> -+ >>> -+ >>> -+/* >>> - * Complete the login process by opening and locking the user's inbox >>> - */ >>> - int openinbox(void) >>> -@@ -1349,6 +1392,10 @@ >>> - userid, inboxname); >>> - >>> - if (!r) r =3D mboxlist_detail(inboxname, &type, NULL, &server, &acl= , NULL); >>> -+ /* Try once again after autocreate_inbox */ >>> -+ if (r =3D=3D IMAP_MAILBOX_NONEXISTENT && !(r =3D autocreate_inbox(i= nboxname, userid))) >>> -+ r =3D mboxlist_detail(inboxname, &type, NULL, &server, &acl, NU= LL); >>> -+ >>> - if (!r && (config_popuseacl =3D config_getswitch(IMAPOPT_POPUSEACL)= ) && >>> - (!acl || >>> - !((myrights =3D cyrus_acl_myrights(popd_authstate, acl)) & ACL_READ))= ) { >>> -diff -Naur cyrus-imapd-2.2.12/lib/auth.h cyrus-imapd-2.2.12.autocreate2/= lib/auth.h >>> ---- cyrus-imapd-2.2.12/lib/auth.h 2003-10-22 21:50:12.000000000 +0300 >>> -+++ cyrus-imapd-2.2.12.autocreate2/lib/auth.h 2005-10-19 14:48:58.035324= 000 +0300 >>> -@@ -60,4 +60,6 @@ >>> - extern struct auth_state *auth_newstate(const char *identifier); >>> - extern void auth_freestate(struct auth_state *auth_state); >>> - >>> -+extern char *auth_canonuser(struct auth_state *auth_state); >>> -+ >>> - #endif /* INCLUDED_AUTH_H */ >>> -diff -Naur cyrus-imapd-2.2.12/lib/auth_krb.c cyrus-imapd-2.2.12.autocrea= te2/lib/auth_krb.c >>> ---- cyrus-imapd-2.2.12/lib/auth_krb.c 2003-11-11 05:26:00.000000000 +0200 >>> -+++ cyrus-imapd-2.2.12.autocreate2/lib/auth_krb.c 2005-10-19 14:48:58.03= 8180000 +0300 >>> -@@ -338,3 +338,11 @@ >>> - free((char *)auth_state); >>> - } >>> - >>> -+char * >>> -+auth_canonuser(struct auth_state *auth_state) >>> -+{ >>> -+ if (auth_state) >>> -+ return auth_state->userid; >>> -+ return NULL; >>> -+} >>> -+ >>> -diff -Naur cyrus-imapd-2.2.12/lib/auth_krb5.c cyrus-imapd-2.2.12.autocre= ate2/lib/auth_krb5.c >>> ---- cyrus-imapd-2.2.12/lib/auth_krb5.c 2004-01-16 17:28:58.000000000 +02= 00 >>> -+++ cyrus-imapd-2.2.12.autocreate2/lib/auth_krb5.c 2005-10-19 14:48:58.0= 40108000 +0300 >>> -@@ -193,4 +193,11 @@ >>> - free(auth_state); >>> - } >>> - >>> -+char * >>> -+auth_canonuser(struct auth_state *auth_state) >>> -+{ >>> -+ if (auth_state) >>> -+ return auth_state->userid; >>> -+ return NULL; >>> -+} >>> - >>> -diff -Naur cyrus-imapd-2.2.12/lib/auth_pts.c cyrus-imapd-2.2.12.autocrea= te2/lib/auth_pts.c >>> ---- cyrus-imapd-2.2.12/lib/auth_pts.c 2004-02-25 01:11:37.000000000 +0200 >>> -+++ cyrus-imapd-2.2.12.autocreate2/lib/auth_pts.c 2005-10-19 14:48:58.04= 2343000 +0300 >>> -@@ -349,3 +349,11 @@ >>> - { >>> - free(auth_state); >>> - } >>> -+ >>> -+char *auth_canonuser(struct auth_state *auth_state) >>> -+{ >>> -+ if (auth_state) >>> -+ return auth_state->userid.id; >>> -+ return NULL; >>> -+} >>> -+ >>> -diff -Naur cyrus-imapd-2.2.12/lib/auth_unix.c cyrus-imapd-2.2.12.autocre= ate2/lib/auth_unix.c >>> ---- cyrus-imapd-2.2.12/lib/auth_unix.c 2004-09-14 01:49:29.000000000 +03= 00 >>> -+++ cyrus-imapd-2.2.12.autocreate2/lib/auth_unix.c 2005-10-19 14:48:58.0= 44431000 +0300 >>> -@@ -267,4 +267,11 @@ >>> - free((char *)auth_state); >>> - } >>> - >>> -+char *auth_canonuser(struct auth_state *auth_state) >>> -+{ >>> -+ if (auth_state) >>> -+ return auth_state->userid; >>> -+ >>> -+ return NULL; >>> -+} >>> - >>> -diff -Naur cyrus-imapd-2.2.12/lib/imapoptions cyrus-imapd-2.2.12.autocre= ate2/lib/imapoptions >>> ---- cyrus-imapd-2.2.12/lib/imapoptions 2004-07-21 22:07:45.000000000 +03= 00 >>> -+++ cyrus-imapd-2.2.12.autocreate2/lib/imapoptions 2005-10-19 14:48:58.0= 48748000 +0300 >>> -@@ -169,6 +169,51 @@ >>> - /* Number of seconds to wait before returning a timeout failure when >>> - performing a client connection (e.g. in a murder enviornment) */ >>> - >>> -+{ "createonpost", 0, SWITCH } >>> -+/* If yes, when lmtpd receives an incoming mail for an INBOX that does = not exist, >>> -+ then the INBOX is automatically created by lmtpd. */ >>> -+ >>> -+{ "autocreateinboxfolders", NULL, STRING } >>> -+/* If a user does not have an INBOX created then the INBOX as well as s= ome INBOX subfolders are >>> -+ created under two conditions. >>> -+ 1. The user logins via the IMAP or the POP3 protocol. (autocreateq= uota option must have a nonzero value) >>> -+ 2. A message arrives for the user through the LMTPD protocol.(crea= teonpost option must yes) >>> -+ autocreateinboxfolders is a list of INBOX's subfolders separated by = a "|", that are automatically created by the server >>> -+ under the previous two situations. */ >>> -+ >>> -+{ "autosubscribeinboxfolders", NULL, STRING } >>> -+/* A list of folder names, separated by "|" that the users get automati= cally subscribed to, when their INBOX >>> -+ is created. >>> -+ These folder names must have been included in the autocreateinboxfold= ers option of the imapd.conf. */ >>> -+ >>> -+{ "autosubscribesharedfolders", NULL, STRING } >>> -+/* A list of shared folders (bulletin boards), separated by "|" that th= e users get >>> -+ automatically subscribed to, after their INBOX >>> -+ is created. The shared folder must have been created and the user mu= st have the >>> -+ required permissions to get subscribed to the it. Otherwise the subs= cription fails. */ >>> -+ >>> -+{ "autosubscribe_all_sharedfolders", 0, SWITCH } >>> -+/* If set to yes then the user is automatically subscribed to all share= d folders, one has permission >>> -+ to subscribe to. */ >>> -+ >>> -+{ "autocreate_sieve_script", NULL, STRING } >>> -+/* The full path of a file that contains a sieve script. This script au= tomatically becomes a >>> -+ user's initial default sieve filter script. When this option is not = defined, no default >>> -+ sieve filter is created. The file must be readable by the cyrus daem= on. */ >>> -+ >>> -+{ "autocreate_sieve_compiledscript", NULL, STRING } >>> -+/* The full path of a file that contains a compiled in bytecode sieve s= cript. This script >>> -+ automatically becomes a user's initial default sieve filter script. >>> -+ If this option is not specified, or the filename doesn't exist then = the script defined >>> -+ by autocreate_sieve_script is compiled on the fly and installed as t= he user's default >>> -+ sieve script */ >>> -+ >>> -+{ "generate_compiled_sieve_script", 0, SWITCH } >>> -+/* If set to yes and no compiled sieve script file exists then the siev= e script that is >>> -+ compiled on the fly will be saved in the file name that autocreate_s= ieve_compiledscript >>> -+ option points. In order a compiled script to be generated, autocreat= e_sieve_script and >>> -+ autocreate_sieve_compiledscript must have valid values */ >>> -+ >>> - { "configdirectory", NULL, STRING } >>> - /* The pathname of the IMAP configuration directory. This field is >>> - required. */ >>> -diff -Naur cyrus-imapd-2.2.12/notifyd/Makefile.in cyrus-imapd-2.2.12.aut= ocreate2/notifyd/Makefile.in >>> ---- cyrus-imapd-2.2.12/notifyd/Makefile.in 2004-05-28 21:03:06.000000000= +0300 >>> -+++ cyrus-imapd-2.2.12.autocreate2/notifyd/Makefile.in 2005-10-19 14:48:= 58.050575000 +0300 >>> -@@ -69,10 +69,11 @@ >>> - SERVICE=3D../master/service.o >>> - >>> - IMAP_LIBS =3D @IMAP_LIBS@ @LIB_RT@ >>> -+SIEVE_LIBS =3D @SIEVE_LIBS@ >>> - IMAP_COM_ERR_LIBS =3D @IMAP_COM_ERR_LIBS@ >>> - LIB_WRAP =3D @LIB_WRAP@ >>> - LIBS =3D @ZEPHYR_LIBS@ @LIBS@ $(IMAP_COM_ERR_LIBS) >>> --DEPLIBS=3D../imap/mutex_fake.o ../imap/libimap.a ../lib/libcyrus.a ../l= ib/libcyrus_min.a @DEPLIBS@ >>> -+DEPLIBS=3D../imap/mutex_fake.o ../imap/libimap.a $(SIEVE_LIBS) ../lib/l= ibcyrus.a ../lib/libcyrus_min.a @DEPLIBS@ >>> - >>> - PURIFY=3D/usr/local/bin/purify >>> - PUREOPT=3D-best-effort >>> -diff -Naur cyrus-imapd-2.2.12/notifyd/notifyd.c cyrus-imapd-2.2.12.autoc= reate2/notifyd/notifyd.c >>> ---- cyrus-imapd-2.2.12/notifyd/notifyd.c 2004-12-17 18:32:25.000000000 += 0200 >>> -+++ cyrus-imapd-2.2.12.autocreate2/notifyd/notifyd.c 2005-10-19 14:48:58= .052220000 +0300 >>> -@@ -97,7 +97,7 @@ >>> - >>> - #define NOTIFY_MAXSIZE 8192 >>> - >>> --int do_notify() >>> -+static int do_notify() >>> - { >>> - struct sockaddr_un sun_data; >>> - socklen_t sunlen =3D sizeof(sun_data); >>> -diff -Naur cyrus-imapd-2.2.12/ptclient/Makefile.in cyrus-imapd-2.2.12.au= tocreate2/ptclient/Makefile.in >>> ---- cyrus-imapd-2.2.12/ptclient/Makefile.in 2004-05-28 21:03:08.00000000= 0 +0300 >>> -+++ cyrus-imapd-2.2.12.autocreate2/ptclient/Makefile.in 2005-10-19 14:48= :58.053762000 +0300 >>> -@@ -57,10 +57,11 @@ >>> - AFS_LDFLAGS =3D @AFS_LDFLAGS@ @COM_ERR_LDFLAGS@ >>> - AFS_LIBS =3D @AFS_LIBS@ >>> - IMAP_LIBS =3D @IMAP_LIBS@ @LIB_RT@ >>> -+SIEVE_LIBS =3D @SIEVE_LIBS@ >>> - LIBS =3D $(IMAP_LIBS) @COM_ERR_LIBS@ >>> - LIB_SASL =3D @LIB_SASL@ >>> - LIB_WRAP =3D @LIB_WRAP@ >>> --DEPLIBS =3D ../imap/libimap.a ../lib/libcyrus.a ../lib/libcyrus_min.a @= DEPLIBS@ >>> -+DEPLIBS =3D ../imap/libimap.a $(SIEVE_LIBS) ../lib/libcyrus.a ../lib/li= bcyrus_min.a @DEPLIBS@ >>> - UTIL_LIBS =3D ../imap/mutex_fake.o ../imap/cli_fatal.o >>> - >>> - LDAP_LIBS=3D@LDAP_LIBS@ >>> diff --git a/src/patches/cyrus-imapd-2.2.12-gcc4.patch b/src/patches/cyru= s-imapd-2.2.12-gcc4.patch >>> deleted file mode 100644 >>> index 3363beaba..000000000 >>> --- a/src/patches/cyrus-imapd-2.2.12-gcc4.patch >>> +++ /dev/null >>> @@ -1,48 +0,0 @@ >>> ---- tools/config2header 2005/04/13 08:56:16 1.1 >>> -+++ tools/config2header 2005/04/13 08:57:48 >>> -@@ -214,7 +214,6 @@ >>> - print HFILE <>> - IMAPOPT_LAST >>> - }; >>> --extern struct imapopt_s imapopts[]; >>> - >>> - enum enum_value { >>> - IMAP_ENUM_ZERO =3D 0, >>> -@@ -260,6 +259,9 @@ >>> - >>> - print HFILE <>> - }; >>> -+ >>> -+extern struct imapopt_s imapopts[]; >>> -+ >>> - #endif /* INCLUDED_IMAPOPTIONS_H */ >>> - EOF >>> - ; >>> ---- imap/fud.c 2005/04/13 09:19:05 1.1 >>> -+++ imap/fud.c 2005/04/13 09:20:02 >>> -@@ -202,6 +202,7 @@ >>> - r =3D begin_handling(); >>> - >>> - shut_down(r); >>> -+ return 0; >>> - } >>> - >>> - static void cyrus_timeout(int signo __attribute__((unused))) >>> ---- imap/smmapd.c 2005/04/13 09:19:12 1.1 >>> -+++ imap/smmapd.c 2005/04/13 09:19:50 >>> -@@ -199,6 +199,7 @@ >>> - r =3D begin_handling(); >>> - >>> - shut_down(r); >>> -+ return 0; >>> - } >>> - >>> - int verify_user(const char *key, long quotacheck, >>> ---- notifyd/notifyd.c 2005/04/13 09:19:23 1.1 >>> -+++ notifyd/notifyd.c 2005/04/13 09:19:39 >>> -@@ -266,4 +266,5 @@ >>> - r =3D do_notify(); >>> - >>> - shut_down(r); >>> -+ return 0; >>> - } >=20 --===============7958751535962029379==--