- spec cleanup

- simplified packaging (merge -perl in -utils)
- remove obsoleted and/or unmaintained additional sources/patches
- remove long time not used files from the cvs/srpm
- update additional sources/patches from their upstream step 1
This commit is contained in:
Michal Hlavinka 2010-06-08 11:01:40 +00:00
parent cadb86d4d2
commit 9d65fa65ac
30 changed files with 783 additions and 2831 deletions

View File

@ -1,31 +0,0 @@
With this rpm, you should usually find backups of your mailboxes.db
in /var/lib/imap/backup/. If you don't have them, for any reason,
you can recreate it like this.
Note: The scripts doesn't care with different hashing schemes of
the mailspool. Adjust as needed!
And please, check the permissions mailboxes.db after creating it.
#!/bin/sh
#
# stop cyrus-imapd
service cyrus-imapd stop
# backup existing mailboxes.db
mv /var/lib/imap/mailboxes.db /var/lib/imap/mailboxes.db.$$
find /var/spool/imap/?/user -maxdepth 1 -mindepth 1 | \
while read i; do
echo $(basename $i)
echo "user.$i<\t>default<\t>$i<\t>lrswipcda<\t>cyrus<\t>lrswipcda" >> /tmp/newmboxlist.txt
done
# we have everyone's base directory in /tmp/newmboxlist.txt, now we
# import the new list
/usr/lib/cyrus-imapd/ctl_mboxlist -u </tmp/newmboxlist.txt
# and reconstruct to get subfolders into the list
find /var/spool/imap/?/user -maxdepth 1 -mindepth 1 | \
while read i; do
/usr/lib/cyrus-imapd/reconstruct -rf user.$i
done

View File

@ -1,21 +0,0 @@
From http://article.gmane.org/gmane.mail.imap.cyrus/18840
We have also seen skiplist corruption in seen databases. I don't have a
recovery tool, but I have been able to manually recover seen db's to the
point of corruption so that at least most of the users mails are in the
correct 'read' state. Typically, you will see errors like:
DBERROR: skiplist recovery /usr/local/imap/user/k/kdelaney.seen: 0D2C
should be ADD or DELETE
If you truncate the file at this point, it should fix the problem, and
the users mail read state will be valid upto the point of corruption.
To do this, convert the hex to decimal (above would be 1372) and use the
dd command:
dd if=kdelaney.seen of=kdelaney.seen.fixed bs=1 count=1372
replace the corrupted .seen file with the fixed one and have user log in
and should be ok.
Seems to work on the couple I have tried it on.

View File

@ -1,28 +0,0 @@
--- imap/imapd.c
+++ imap/imapd.c 2004/01/16 12:25:51
@@ -578,8 +578,11 @@
fatal("SASL failed initializing: sasl_server_new()", EC_TEMPFAIL);
}
- /* never allow plaintext, since IMAP has the LOGIN command */
- secprops = mysasl_secprops(SASL_SEC_NOPLAINTEXT);
+ if( (config_getswitch(IMAPOPT_ALLOWPLAINWITHOUTTLS) == 0) ) {
+ secprops = mysasl_secprops(SASL_SEC_NOPLAINTEXT);
+ } else {
+ secprops = mysasl_secprops(0);
+ }
sasl_setprop(imapd_saslconn, SASL_SEC_PROPS, secprops);
sasl_setprop(imapd_saslconn, SASL_SSF_EXTERNAL, &extprops_ssf);
--- lib/imapoptions
+++ lib/imapoptions 2004/01/16 12:27:52
@@ -684,6 +684,9 @@
to set this to yes, especially if OpenLDAP is used as authentication
source. */
+{ "allowplainwithouttls", 0, SWITCH }
+/* Allow plain login mechanism without an encrypted connection. */
+
/*
.SH SEE ALSO
.PP

View File

@ -1,32 +0,0 @@
#!/usr/bin/perl
#
# Usage: batchreconstruct inputfile
#
# Purpose: Runs the Cyrus reconstruct command on each newly-created
# Cyrus mailbox created by folderxfer
#
# Input: List of usernames, one per line
#
#$Id: batchreconstruct,v 1.1 2005/04/15 20:24:15 jdennis Exp $
#$whoami = "/usr/ucb/whoami"; # Solaris
$whoami = "/usr/bin/whoami";
$reconstruct = "/usr/lib/cyrus-imapd/reconstruct";
$cmd = "$reconstruct -r";
chop ($iam = `$whoami`);
if ($iam ne "cyrus" ) {
die "You must be cyrus to run this script!\n";
}
$users = "$ARGV[0]";
if (!$users) { die "Usage: $0 input_file\n"; }
open(MB,"$users") || die "can't open $users";
while (<MB>) {
chop;
system("$cmd user.$_");
}
close MB;

View File

@ -1,81 +0,0 @@
#!/usr/bin/perl
eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
if $running_under_some_shell;
#
# Usage: bsd2cyrus inputfile
#
# Purpose: Maps a user's Berkeley-format mail folder names into the
# Cyrus namespace
#
# Input: List of usernames, one per line
#
# Output: Lines of the format
# username:Cyrus-mailbox-name:BSD-mailbox-name
#
#$Id: bsd2cyrus,v 1.1 2004/02/04 12:59:42 karsten Exp $
require "find.pl";
# User's subdirectory where personal mail folders are stored
# (typically $HOME/mail)
$maildir = "mail";
$inputfile = "$ARGV[0]";
if (! $inputfile) { die "Usage: $0 inputfile\n"; }
open (DATA, $inputfile) || die "can't open $inputfile";
while (<DATA>) {
chop;
($user,$pw,$uid,$gid,$quota,$cmnt,$gcos,$home) = getpwnam $_;
next if $home eq "";
&find("$home/$maildir");
}
close DATA;
foreach (@folders) {
($user,$folder) = split(/:/,$_,2);
if (! rfc822($folder) ) { next; }
@tokens = split(/\//, $folder);
$mailbox = $tokens[$#tokens];
# Sanity checks - earlier tests should have caught these.
next if ($mailbox =~ /\.gz$/); # Skip gzipped files
next if ($mailbox =~ /\.Z$/); # Skip compressed files
next if ($mailbox =~ /^\./); # Skip hidden files
# Replace "bad" characters with an underscore followed by
# the ASCII representation of the "bad" character.
$mailbox = rm_badchars($mailbox);
print "$user:user.$user.$mailbox:$folder\n";
}
sub wanted {
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
-f _;
if ($_ ne '.') { push @folders, "$user:$dir/$_"; }
}
sub rfc822 {
my ($file) = @_;
my ($rc) = 1;
if (-d $file || -z $file || -B $file || -x $file) {
$rc = 0;
}
return $rc;
}
sub rm_badchars {
my ($mailbox) = @_;
$mailbox =~ s/ /_040/g;
$mailbox =~ s/\!/_041/g;
$mailbox =~ s/\"/_042/g;
$mailbox =~ s/\#/_043/g;
return $mailbox;
}

26
cpmsg
View File

@ -1,26 +0,0 @@
#!/usr/bin/perl
#
# Usage: cat mailbox.txt | formail -s cpmsg
#
# where 'cpmsg' is the name of this script
#
# Purpose: Called by formail once for each mail message in a Berkeley-
# format mailbox
#
#$Id: cpmsg,v 1.1 2005/04/15 20:24:15 jdennis Exp $
$maildir = "$ARGV[0]";
if (!$maildir) { die "Usage: $0 $maildir"; }
# Formail increments this number for each message. The
# leading "0"'s must be removed (e.g. 001 becomes 1)
$filenum = ($ENV{FILENO} - 0) + 1;
open (OUTFILE,">$maildir/$filenum.");
while (<STDIN>) {
chop;
print OUTFILE "$_\015\012"; # Add CRLF to each line!
}
close OUTFILE;

View File

@ -1,34 +0,0 @@
/*
* Wrapper for cyrus 'deliver' to allow anyone to run it -
* I hope this is secure! Should be setgid mail.
*/
#include <stdio.h>
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>
#include <sysexits.h>
#ifndef LIBEXECDIR
#define LIBEXECDIR "/usr/lib/cyrus-imapd"
#endif
int main(int argc, char *argv[])
{
char *const envp[] = { NULL };
struct passwd *ent = getpwuid(getuid());
const char *uname = (ent && ent->pw_name && ent->pw_name[0])
? ent->pw_name : "anonymous";
if (argc != 2) {
fprintf(stderr, "Usage: %s mailbox\n", argv[0]);
return EX_USAGE;
}
execle(LIBEXECDIR"/deliver", "deliver", "-e",
"-a", uname, "-m", argv[1],
NULL, envp);
perror("exec "LIBEXECDIR"/deliver");
return EX_OSERR;
}

View File

@ -1,23 +0,0 @@
--- cyrus-imapd-2.1.16/master/master.c.getrlimit 2003-12-28 17:32:46.000000000 +0100
+++ cyrus-imapd-2.1.16/master/master.c 2003-12-28 17:43:56.000000000 +0100
@@ -1208,12 +1208,10 @@
rl.rlim_cur = x;
rl.rlim_max = x;
if (setrlimit(RLIMIT_NUMFDS, &rl) < 0) {
- syslog(LOG_ERR, "setrlimit: Unable to set file descriptors limit to %ld: %m", x);
#ifdef HAVE_GETRLIMIT
if (!getrlimit(RLIMIT_NUMFDS, &rl)) {
- syslog(LOG_ERR, "retrying with %ld (current max)", rl.rlim_max);
rl.rlim_cur = rl.rlim_max;
if (setrlimit(RLIMIT_NUMFDS, &rl) < 0) {
syslog(LOG_ERR, "setrlimit: Unable to set file descriptors limit to %ld: %m", x);
@@ -1228,6 +1226,7 @@
rl.rlim_max);
}
#else
+ syslog(LOG_ERR, "setrlimit: Unable to set file descriptors limit to %ld: %m", x);
}
#endif /* HAVE_GETRLIMIT */
}

View File

@ -1,13 +0,0 @@
diff -Naur cyrus-imapd-2.2.12.orig/doc/Makefile.dist cyrus-imapd-2.2.12/doc/Makefile.dist
--- cyrus-imapd-2.2.12.orig/doc/Makefile.dist Wed Oct 22 20:50:04 2003
+++ cyrus-imapd-2.2.12/doc/Makefile.dist Wed Nov 9 13:23:58 2005
@@ -13,7 +13,7 @@
rm -f groff-html-*.png pod2htm*
- fig2dev -L png murder.fig murder.png
- fig2dev -L png netnews.fig netnews.png
+# fig2dev -L png murder.fig murder.png
+# fig2dev -L png netnews.fig netnews.png
(cd text; make)

View File

@ -1,6 +1,6 @@
diff -Naur cyrus-imapd-2.3.12p2/README.autosievefolder cyrus-imapd-2.3.12p2-autosieve.uncompiled/README.autosievefolder
--- cyrus-imapd-2.3.12p2/README.autosievefolder 1970-01-01 02:00:00.000000000 +0200
+++ cyrus-imapd-2.3.12p2-autosieve.uncompiled/README.autosievefolder 2008-05-06 15:16:21.000000000 +0300
diff -Naur cyrus-imapd-2.3.16/README.autosievefolder cyrus-imapd-2.3.16-autosieve.uncompiled/README.autosievefolder
--- cyrus-imapd-2.3.16/README.autosievefolder 1970-01-01 02:00:00.000000000 +0200
+++ cyrus-imapd-2.3.16-autosieve.uncompiled/README.autosievefolder 2009-12-23 01:08:09.000000000 +0200
@@ -0,0 +1,42 @@
+Cyrus IMAP autosievefolder patch
+----------------------------------
@ -44,9 +44,9 @@ diff -Naur cyrus-imapd-2.3.12p2/README.autosievefolder cyrus-imapd-2.3.12p2-auto
+
+For more information and updates please visit http://email.uoa.gr/projects/cyrus/autosievefolder
+
diff -Naur cyrus-imapd-2.3.12p2/imap/lmtp_sieve.c cyrus-imapd-2.3.12p2-autosieve.uncompiled/imap/lmtp_sieve.c
--- cyrus-imapd-2.3.12p2/imap/lmtp_sieve.c 2008-03-24 19:09:17.000000000 +0200
+++ cyrus-imapd-2.3.12p2-autosieve.uncompiled/imap/lmtp_sieve.c 2008-05-06 15:16:21.000000000 +0300
diff -Naur cyrus-imapd-2.3.16/imap/lmtp_sieve.c cyrus-imapd-2.3.16-autosieve.uncompiled/imap/lmtp_sieve.c
--- cyrus-imapd-2.3.16/imap/lmtp_sieve.c 2009-03-31 07:11:18.000000000 +0300
+++ cyrus-imapd-2.3.16-autosieve.uncompiled/imap/lmtp_sieve.c 2009-12-23 01:08:09.000000000 +0200
@@ -88,6 +88,9 @@
struct auth_state *authstate;
} script_data_t;
@ -160,10 +160,10 @@ diff -Naur cyrus-imapd-2.3.12p2/imap/lmtp_sieve.c cyrus-imapd-2.3.12p2-autosieve
+ return IMAP_MAILBOX_NONEXISTENT;
+}
+
diff -Naur cyrus-imapd-2.3.12p2/lib/imapoptions cyrus-imapd-2.3.12p2-autosieve.uncompiled/lib/imapoptions
--- cyrus-imapd-2.3.12p2/lib/imapoptions 2008-04-11 23:07:00.000000000 +0300
+++ cyrus-imapd-2.3.12p2-autosieve.uncompiled/lib/imapoptions 2008-05-06 15:16:21.000000000 +0300
@@ -942,6 +942,15 @@
diff -Naur cyrus-imapd-2.3.16/lib/imapoptions cyrus-imapd-2.3.16-autosieve.uncompiled/lib/imapoptions
--- cyrus-imapd-2.3.16/lib/imapoptions 2009-12-21 13:25:22.000000000 +0200
+++ cyrus-imapd-2.3.16-autosieve.uncompiled/lib/imapoptions 2009-12-23 01:08:09.000000000 +0200
@@ -1043,6 +1043,15 @@
/* If enabled, lmtpd will look for Sieve scripts in user's home
directories: ~user/.sieve. */

View File

@ -1,23 +0,0 @@
--- cyrus-imapd-2.3.7/imap/version.c.krb4 2005-02-16 22:06:19.000000000 +0100
+++ cyrus-imapd-2.3.7/imap/version.c 2007-01-22 15:36:27.000000000 +0100
@@ -169,7 +169,7 @@
"; lock = %s", lock_method_desc);
snprintf(env_buf + strlen(env_buf), MAXIDVALUELEN - strlen(env_buf),
"; nonblock = %s", nonblock_method_desc);
-#ifdef HAVE_KRB
+#if 0
snprintf(env_buf + strlen(env_buf), MAXIDVALUELEN - strlen(env_buf),
" (%s)", krb4_version);
#endif
--- cyrus-imapd-2.3.7/imap/pop3d.c.krb4 2007-01-22 15:41:14.000000000 +0100
+++ cyrus-imapd-2.3.7/imap/pop3d.c 2007-01-22 15:41:15.000000000 +0100
@@ -88,8 +88,6 @@
#include "statuscache.h"
#ifdef HAVE_KRB
-/* kerberos des is purported to conflict with OpenSSL DES */
-#define DES_DEFS
#include <krb.h>
/* MIT's kpop authentication kludge */

View File

@ -1,308 +0,0 @@
diff -up cyrus-imapd-2.3.15/doc/man/imapd.conf.5.html.notify_sms cyrus-imapd-2.3.15/doc/man/imapd.conf.5.html
--- cyrus-imapd-2.3.15/doc/man/imapd.conf.5.html.notify_sms 2009-09-09 15:19:50.000000000 +0200
+++ cyrus-imapd-2.3.15/doc/man/imapd.conf.5.html 2009-09-18 11:49:42.207115959 +0200
@@ -3469,6 +3469,24 @@ proxying CREATE.</p>
<tr valign="top" align="left">
<td width="10%"></td>
<td width="89%">
+<p><b>sendsms:</b> /usr/bin/sendsms</p></td>
+</table></p>
+<!-- INDENTATION -->
+<table width="100%" border=0 rules="none" frame="void"
+ cols="2" cellspacing="0" cellpadding="0">
+<tr valign="top" align="left">
+<td width="19%"></td>
+<td width="80%">
+<p>The pathname of the sendsms executable. Sieve invokes
+sendsms for sending SMS notifications.</p>
+</td>
+</table>
+<!-- INDENTATION -->
+<p><table width="100%" border=0 rules="none" frame="void"
+ cols="2" cellspacing="0" cellpadding="0">
+<tr valign="top" align="left">
+<td width="10%"></td>
+<td width="89%">
<p><b>servername:</b> &lt;none&gt;</p></td>
</table>
<!-- INDENTATION -->
diff -up cyrus-imapd-2.3.15/doc/man/notifyd.8.html.notify_sms cyrus-imapd-2.3.15/doc/man/notifyd.8.html
--- cyrus-imapd-2.3.15/doc/man/notifyd.8.html.notify_sms 2009-09-09 15:19:51.000000000 +0200
+++ cyrus-imapd-2.3.15/doc/man/notifyd.8.html 2009-09-18 11:49:42.208116026 +0200
@@ -181,6 +181,18 @@ a Sieve &rsquo;notify&rsquo; action as i
<td width="11%"></td>
<td width="10%">
+<p><b>sms</b></p>
+</td>
+<td width="77%">
+
+<p>Send the notification as SMS. This method can ONLY be used in
+a Sieve &rsquo;notify&rsquo; action as it requires a
+<i>sms:</i> URL to be specified as an <i>:option</i>.</p>
+</td>
+<tr valign="top" align="left">
+<td width="11%"></td>
+<td width="10%">
+
<p><b>zephyr</b></p>
</td>
<td width="77%">
diff -up cyrus-imapd-2.3.15/lib/imapoptions.notify_sms cyrus-imapd-2.3.15/lib/imapoptions
--- cyrus-imapd-2.3.15/lib/imapoptions.notify_sms 2009-09-18 11:49:42.189116010 +0200
+++ cyrus-imapd-2.3.15/lib/imapoptions 2009-09-18 11:50:38.230115954 +0200
@@ -966,6 +966,10 @@ are listed with ``<none>''.
/* The pathname of the sendmail executable. Sieve invokes sendmail
for sending rejections, redirects and vacation responses. */
+{ "sendsms", "/usr/bin/sendsms", STRING }
+/* The pathname of the sendsms executable. Sieve invokes sendsms
+ for sending SMS notifications. */
+
{ "serverlist", NULL, STRING }
/* Whitespace separated list of backend server names. Used for
finding server with the most available free space for proxying
diff -up cyrus-imapd-2.3.15/man/imapd.conf.5.notify_sms cyrus-imapd-2.3.15/man/imapd.conf.5
--- cyrus-imapd-2.3.15/man/imapd.conf.5.notify_sms 2009-09-09 15:19:48.000000000 +0200
+++ cyrus-imapd-2.3.15/man/imapd.conf.5 2009-09-18 11:51:26.441839866 +0200
@@ -771,6 +771,9 @@ Allowed values: \fIflat\fR, \fIberkeley\
.IP "\fBsendmail:\fR /usr/lib/sendmail" 5
The pathname of the sendmail executable. Sieve invokes sendmail
for sending rejections, redirects and vacation responses.
+.IP "\fBsendsms:\fR /usr/bin/sendsms" 5
+The pathname of the sendsms executable. Sieve invokes sendsms
+for sending SMS notifications.
.IP "\fBserverlist:\fR <none>" 5
Whitespace separated list of backend server names. Used for
finding server with the most available free space for proxying
diff -up cyrus-imapd-2.3.15/man/notifyd.8.notify_sms cyrus-imapd-2.3.15/man/notifyd.8
--- cyrus-imapd-2.3.15/man/notifyd.8.notify_sms 2008-04-04 14:47:00.000000000 +0200
+++ cyrus-imapd-2.3.15/man/notifyd.8 2009-09-18 11:49:42.225115999 +0200
@@ -111,6 +111,11 @@ Email the notification. This method can
Sieve 'notify' action as it requires a \fImailto:\fR URL to be
specified as an \fI:option\fR.
.TP
+.B sms
+Send the notification as SMS. This method can ONLY be used in a
+Sieve 'notify' action as it requires a \fIsms:\fR URL to be
+specified as an \fI:option\fR.
+.TP
.B zephyr
Send the notification as a zephyrgram. If used in a Sieve 'notify'
action, additional recipients can be specified as \fI:options\fR.
diff -up cyrus-imapd-2.3.15/notifyd/Makefile.in.notify_sms cyrus-imapd-2.3.15/notifyd/Makefile.in
--- cyrus-imapd-2.3.15/notifyd/Makefile.in.notify_sms 2009-09-18 11:49:42.172115947 +0200
+++ cyrus-imapd-2.3.15/notifyd/Makefile.in 2009-09-18 11:49:42.225115999 +0200
@@ -85,7 +85,7 @@ all: notifyd
install:
$(INSTALL) -m 755 notifyd $(DESTDIR)$(service_path)
-OBJS= notifyd.o notify_null.o notify_log.o notify_mailto.o notify_zephyr.o
+OBJS= notifyd.o notify_null.o notify_log.o notify_mailto.o notify_sms.o notify_zephyr.o
notifytest: notifytest.o
$(CC) $(LDFLAGS) -o notifytest \
diff -up cyrus-imapd-2.3.15/notifyd/notifyd.h.notify_sms cyrus-imapd-2.3.15/notifyd/notifyd.h
--- cyrus-imapd-2.3.15/notifyd/notifyd.h.notify_sms 2008-03-24 20:59:32.000000000 +0100
+++ cyrus-imapd-2.3.15/notifyd/notifyd.h 2009-09-18 11:49:42.233116003 +0200
@@ -47,6 +47,7 @@
#include "notify_null.h"
#include "notify_log.h"
#include "notify_mailto.h"
+#include "notify_sms.h"
#include "notify_zephyr.h"
/* Notify method dispatch table definition */
@@ -63,6 +64,7 @@ notifymethod_t methods[] = {
{ "null", notify_null }, /* do nothing */
{ "log", notify_log }, /* use syslog (for testing) */
{ "mailto", notify_mailto }, /* send an email */
+ { "sms", notify_sms }, /* send an sms */
#ifdef HAVE_ZEPHYR
{ "zephyr", notify_zephyr }, /* send a zephyrgram */
#endif
diff -up /dev/null cyrus-imapd-2.3.15/notifyd/notify_sms.c
--- /dev/null 2009-09-11 15:21:01.808252010 +0200
+++ cyrus-imapd-2.3.15/notifyd/notify_sms.c 2009-09-18 11:49:42.233116003 +0200
@@ -0,0 +1,116 @@
+/* notify_sms.c -- SMS notification method
+ * Simon Matter
+ */
+/*
+ * Copyright (c) 1998-2003 Carnegie Mellon University. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The name "Carnegie Mellon University" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For permission or any other legal
+ * details, please contact
+ * Office of Technology Transfer
+ * Carnegie Mellon University
+ * 5000 Forbes Avenue
+ * Pittsburgh, PA 15213-3890
+ * (412) 268-4387, fax: (412) 268-7395
+ * tech-transfer@andrew.cmu.edu
+ *
+ * 4. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by Computing Services
+ * at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+ *
+ * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * notify_sms is based on code from notify_mailto by Ken Murchison.
+ * Copyright (c) 2005-2006 Simon Matter, Invoca Systems.
+ * Release 2006071300/2.3.7
+*/
+
+#include <config.h>
+
+#include "notify_sms.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "global.h"
+#include "libconfig.h"
+#include "sieve_interface.h"
+
+static int global_outgoing_count = 0;
+
+char* notify_sms(const char *class __attribute__((unused)),
+ const char *priority,
+ const char *user,
+ const char *mailbox __attribute__((unused)),
+ int nopt, char **options,
+ const char *message)
+{
+ FILE *sm;
+ const char *smbuf[10];
+ int sm_stat;
+ pid_t sm_pid;
+ int fds[2];
+
+ /* XXX check/parse options (sms URI) */
+ if (nopt < 1)
+ return strdup("NO sms URI not specified");
+
+ smbuf[0] = "sendsms";
+ smbuf[1] = "-u";
+ smbuf[2] = user;
+ smbuf[3] = "-p";
+ smbuf[4] = priority;
+ smbuf[5] = "-o";
+ smbuf[6] = options[0];
+ smbuf[7] = NULL;
+
+ pipe(fds);
+ if ((sm_pid = fork()) == 0) {
+ /* i'm the child! run sendsms! */
+ close(fds[1]);
+ /* make the pipe be stdin */
+ dup2(fds[0], 0);
+ execv(config_getstring(IMAPOPT_SENDSMS), (char **) smbuf);
+
+ /* if we're here we suck */
+ return strdup("NO sms couldn't exec");
+ }
+ /* i'm the parent */
+ close(fds[0]);
+ sm = fdopen(fds[1], "w");
+
+ if (!sm)
+ return strdup("NO sms could not spawn sendsms process");
+
+ fprintf(sm, message);
+
+ fclose(sm);
+ while (waitpid(sm_pid, &sm_stat, 0) < 0);
+
+ /* XXX check for sendsms exit code */
+
+ return strdup("OK sms notification successful");
+}
diff -up /dev/null cyrus-imapd-2.3.15/notifyd/notify_sms.h
--- /dev/null 2009-09-11 15:21:01.808252010 +0200
+++ cyrus-imapd-2.3.15/notifyd/notify_sms.h 2009-09-18 11:49:42.233116003 +0200
@@ -0,0 +1,61 @@
+/* notify_sms.h -- SMS notification method
+ * Simon Matter
+ */
+/*
+ * Copyright (c) 1998-2003 Carnegie Mellon University. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The name "Carnegie Mellon University" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For permission or any other legal
+ * details, please contact
+ * Office of Technology Transfer
+ * Carnegie Mellon University
+ * 5000 Forbes Avenue
+ * Pittsburgh, PA 15213-3890
+ * (412) 268-4387, fax: (412) 268-7395
+ * tech-transfer@andrew.cmu.edu
+ *
+ * 4. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by Computing Services
+ * at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+ *
+ * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * notify_sms is based on code from notify_mailto by Ken Murchison.
+ * Copyright (c) 2005-2006 Simon Matter, Invoca Systems.
+ * Release 2006071300/2.3.7
+ *
+ */
+
+#ifndef _NOTIFY_SMS_H_
+#define _NOTIFY_SMS_H_
+
+#include <config.h>
+
+char* notify_sms(const char *class __attribute__((unused)),
+ const char *priority,
+ const char *user,
+ const char *mailbox __attribute__((unused)),
+ int nopt, char **options,
+ const char *message);
+
+#endif /* _NOTIFY_SMS_H_ */

View File

@ -1,514 +0,0 @@
diff -Naur cyrus-imapd-2.3.9/imap/ctl_cyrusdb.c cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/ctl_cyrusdb.c
--- cyrus-imapd-2.3.9/imap/ctl_cyrusdb.c 2007-03-30 21:40:20.000000000 +0300
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/ctl_cyrusdb.c 2007-08-21 16:49:06.000000000 +0300
@@ -133,7 +133,7 @@
/* if it is MBTYPE_RESERVED, unset it & call mboxlist_delete */
if(!r && (mbtype & MBTYPE_RESERVE)) {
if(!r) {
- r = mboxlist_deletemailbox(name, 1, NULL, NULL, 0, 0, 1);
+ r = mboxlist_deletemailbox(name, 1, NULL, NULL, 0, 0, 1, 1);
if(r) {
/* log the error */
syslog(LOG_ERR,
diff -Naur cyrus-imapd-2.3.9/imap/ctl_mboxlist.c cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/ctl_mboxlist.c
--- cyrus-imapd-2.3.9/imap/ctl_mboxlist.c 2007-07-18 21:56:11.000000000 +0300
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/ctl_mboxlist.c 2007-08-21 16:49:06.000000000 +0300
@@ -484,7 +484,7 @@
wipe_head = wipe_head->next;
- ret = mboxlist_deletemailbox(me->mailbox, 1, "", NULL, 0, 1, 1);
+ ret = mboxlist_deletemailbox(me->mailbox, 1, "", NULL, 0, 1, 1, 1);
if(!ret) sync_log_mailbox(me->mailbox);
if(ret) {
fprintf(stderr, "couldn't delete defunct mailbox %s\n",
diff -Naur cyrus-imapd-2.3.9/imap/imapd.c cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/imapd.c
--- cyrus-imapd-2.3.9/imap/imapd.c 2007-08-02 17:18:51.000000000 +0300
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/imapd.c 2007-08-21 16:49:28.000000000 +0300
@@ -4994,7 +4994,7 @@
r = mboxlist_deletemailbox(name, imapd_userisadmin,
imapd_userid, imapd_authstate,
- 0, 0, 0);
+ 0, 0, 0, 1);
if (!r) sync_log_mailbox(name);
@@ -5018,6 +5018,12 @@
char *p;
int domainlen = 0;
int sync_lockfd = (-1);
+ int keepQuota = 1;
+
+ if(name && *name == '+') {
+ keepQuota = 0;
+ name++;
+ }
r = (*imapd_namespace.mboxname_tointernal)(&imapd_namespace, name,
imapd_userid, mailboxname);
@@ -5076,7 +5082,7 @@
r = mboxlist_deletemailbox(mailboxname, imapd_userisadmin,
imapd_userid, imapd_authstate, 1-force,
- localonly, 0);
+ localonly, 0, keepQuota);
}
/* was it a top-level user mailbox? */
@@ -6434,6 +6440,7 @@
{
int newquota = -1;
int badresource = 0;
+ int rmquota = 0;
int c;
int force = 0;
static struct buf arg;
@@ -6450,7 +6457,8 @@
if (c != ')' || arg.s[0] != '\0') {
for (;;) {
if (c != ' ') goto badlist;
- if (strcasecmp(arg.s, "storage") != 0) badresource = 1;
+ if (strcasecmp(arg.s, "remove") == 0) rmquota = 1;
+ else if (strcasecmp(arg.s, "storage") != 0) badresource = 1;
c = getword(imapd_in, &arg);
if (c != ' ' && c != ')') goto badlist;
if (arg.s[0] == '\0') goto badlist;
@@ -6519,7 +6527,10 @@
/* local mailbox */
if (!r || (r == IMAP_MAILBOX_NONEXISTENT)) {
- r = mboxlist_setquota(mailboxname, newquota, force);
+ if(!rmquota)
+ r = mboxlist_setquota(mailboxname, newquota, force);
+ else
+ r = mboxlist_unsetquota(mailboxname);
}
imapd_check(NULL, 0, 0);
@@ -8237,7 +8248,7 @@
/* note also that we need to remember to let proxyadmins do this */
r = mboxlist_deletemailbox(mailboxname,
imapd_userisadmin || imapd_userisproxyadmin,
- imapd_userid, imapd_authstate, 0, 1, 0);
+ imapd_userid, imapd_authstate, 0, 1, 0, 1);
if(r) syslog(LOG_ERR,
"Could not delete local mailbox during move of %s",
mailboxname);
diff -Naur cyrus-imapd-2.3.9/imap/mailbox.c cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/mailbox.c
--- cyrus-imapd-2.3.9/imap/mailbox.c 2007-07-20 17:21:57.000000000 +0300
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/mailbox.c 2007-08-21 16:49:06.000000000 +0300
@@ -2745,27 +2745,7 @@
seen_delete_mailbox(mailbox);
- if (delete_quota_root && !rquota) {
- quota_delete(&mailbox->quota, &tid);
- free(mailbox->quota.root);
- mailbox->quota.root = NULL;
- } else if (!rquota) {
- /* Free any quota being used by this mailbox */
- if (mailbox->quota.used >= mailbox->quota_mailbox_used) {
- mailbox->quota.used -= mailbox->quota_mailbox_used;
- }
- else {
- mailbox->quota.used = 0;
- }
- r = quota_write(&mailbox->quota, &tid);
- if (r) {
- syslog(LOG_ERR,
- "LOSTQUOTA: unable to record free of " UQUOTA_T_FMT " bytes in quota %s",
- mailbox->quota_mailbox_used, mailbox->quota.root);
- }
- else
- quota_commit(&tid);
- }
+ mailbox_updatequota(mailbox,NULL);
/* Flush data (message file) directory */
mailbox_delete_files(mailbox->path);
@@ -3394,3 +3374,48 @@
if (*p == '.') *p = '/';
}
}
+
+/* This function is used to update the quota. Can be used to replace
+ * identical parts of the code, and can be quite handy some times
+ * The tid is used in order to make possible to make the quota update
+ * being a part of a bigger transaction to the quota db */
+int mailbox_updatequota(struct mailbox *mailbox, struct txn **tid)
+{
+ int r = 0, havetid = 0;
+ struct txn **ltid = NULL;
+
+ if(tid) {
+ ltid = tid;
+ havetid = 1;
+ }
+ /* Ensure that we are locked */
+ if(!mailbox->header_lock_count) return IMAP_INTERNAL;
+
+
+ if(mailbox->quota.root) {
+ r = quota_read(&mailbox->quota, ltid, 1);
+ if( r == 0 ) {
+ if (mailbox->quota.used >= mailbox->quota_mailbox_used) {
+ mailbox->quota.used -= mailbox->quota_mailbox_used;
+ }
+ else {
+ mailbox->quota.used = 0;
+ }
+ r = quota_write(&mailbox->quota, ltid);
+ if (r) {
+ syslog(LOG_ERR,
+ "LOSTQUOTA: unable to record free of %lu bytes in quota %s",
+ mailbox->quota_mailbox_used, mailbox->quota.root);
+ }
+ else if(!havetid)
+ quota_commit(tid);
+ }
+ /* It is not a big mistake not to have quota .. just remove from the mailbox */
+ else if ( r == IMAP_QUOTAROOT_NONEXISTENT) {
+ free(mailbox->quota.root);
+ r = 0;
+ }
+ }
+ return r;
+}
+
diff -Naur cyrus-imapd-2.3.9/imap/mailbox.h cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/mailbox.h
--- cyrus-imapd-2.3.9/imap/mailbox.h 2006-11-30 19:11:19.000000000 +0200
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/mailbox.h 2007-08-21 16:49:06.000000000 +0300
@@ -364,6 +364,8 @@
struct mailbox *mailboxp);
extern int mailbox_delete(struct mailbox *mailbox, int delete_quota_root);
+extern int mailbox_updatequota(struct mailbox *mailbox, struct txn **tid);
+
extern int mailbox_rename_copy(struct mailbox *oldmailbox,
const char *newname, char *newpartition,
bit32 *olduidvalidityp, bit32 *newuidvalidityp,
diff -Naur cyrus-imapd-2.3.9/imap/mboxlist.c cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/mboxlist.c
--- cyrus-imapd-2.3.9/imap/mboxlist.c 2007-08-15 20:20:55.000000000 +0300
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/mboxlist.c 2007-08-21 16:49:06.000000000 +0300
@@ -95,6 +95,12 @@
static int mboxlist_opensubs();
static void mboxlist_closesubs();
+static int child_cb(char *name,
+ int matchlen __attribute__((unused)),
+ int maycreate __attribute__((unused)),
+ void *rock);
+
+
static int mboxlist_rmquota(const char *name, int matchlen, int maycreate,
void *rock);
static int mboxlist_changequota(const char *name, int matchlen, int maycreate,
@@ -102,6 +108,7 @@
struct change_rock {
struct quota *quota;
+ struct quota *oldquota;
struct txn **tid;
};
@@ -889,9 +896,9 @@
*/
int mboxlist_deletemailbox(const char *name, int isadmin, char *userid,
struct auth_state *auth_state, int checkacl,
- int local_only, int force)
+ int local_only, int force, int keepQuota)
{
- int r;
+ int r, has_children = 0;
char *acl;
long access;
struct mailbox mailbox;
@@ -902,6 +909,7 @@
int mbtype;
const char *p;
mupdate_handle *mupdate_h = NULL;
+ char *quotaroot = NULL;
if(!isadmin && force) return IMAP_PERMISSION_DENIED;
@@ -1014,15 +1022,47 @@
if ((r && !force) || isremote) goto done;
- if (!r || force) r = mailbox_delete(&mailbox, deletequotaroot);
+ if (!r || force) {
+ /* first we have to keep the previous quota root in order to delete it */
+ if(mailbox.quota.root)
+ quotaroot = xstrdup(mailbox.quota.root);
+ r = mailbox_delete(&mailbox, deletequotaroot);
+ }
+
/*
* See if we have to remove mailbox's quota root
*/
- if (!r && mailbox.quota.root != NULL) {
- /* xxx look for any other mailboxes in this quotaroot */
+ if (!r && quotaroot != NULL) {
+ /* xxx look for any other mailboxes in this quotaroot */
+ /* If we have not asked to remove the quota (default behaviour), we check
+ * whether there are any subfolders beneeth the quota root. If there aren't
+ * any subfolders the reasonable thing is to delete the quota */
+ if(keepQuota) {
+ char pattern[MAX_MAILBOX_PATH+1];
+ strlcpy(pattern, quotaroot, sizeof(pattern));
+ if (config_virtdomains && name[strlen(name)-1] == '!') {
+ strlcat(pattern, "*", sizeof(pattern));
+ }
+ else {
+ strlcat(pattern, ".*", sizeof(pattern));
+ }
+ /* find if there are subfolders. Then we want to
+ * keep the existing quota */
+ mboxlist_findall(NULL, pattern, isadmin, userid,
+ auth_state, child_cb, (void *) &has_children);
+
+ if(!has_children)
+ if(!mboxlist_mylookup(quotaroot, NULL, NULL, NULL, NULL, NULL, 0, 1))
+ has_children = 1;
+ }
+ /* If we want to remove the quota explicitely or the quota root folder has no subfolders
+ * we execute the rmquota patch */
+ if(!keepQuota || !has_children )
+ mboxlist_unsetquota(quotaroot);
+ free(quotaroot);
}
-
+
done:
if(r && tid && !force) {
/* Abort the transaction if it is still in progress */
@@ -2483,6 +2523,7 @@
if (r) return r;
crock.quota = &quota;
+ crock.oldquota = NULL;
crock.tid = &tid;
/* top level mailbox */
if(have_mailbox)
@@ -2501,15 +2542,19 @@
*/
int mboxlist_unsetquota(const char *root)
{
+ char newquota[MAX_MAILBOX_PATH+1];
char pattern[MAX_MAILBOX_PATH+1];
struct quota quota;
- int r=0;
+ struct change_rock crock;
+ int r=0, k=0;
if (!root[0] || root[0] == '.' || strchr(root, '/')
|| strchr(root, '*') || strchr(root, '%') || strchr(root, '?')) {
return IMAP_MAILBOX_BADNAME;
}
+ crock.tid=NULL;
+
quota.root = (char *) root;
r = quota_read(&quota, NULL, 0);
if (r == IMAP_QUOTAROOT_NONEXISTENT) {
@@ -2534,9 +2579,47 @@
/* submailboxes - we're using internal names here */
mboxlist_findall(NULL, pattern, 1, 0, 0, mboxlist_rmquota, (void *)root);
- r = quota_delete(&quota, NULL);
+ r = quota_delete(&quota, crock.tid);
+
+ /* If we cannot delete the quota then abort the operation */
+ if(!r) {
+ /* quota_findroot performs several checks that we can
+ * assume that are already done, and don't have to perform
+ * them again. One of them is that it returns 1 only if
+ * quotaroot exists.
+ */
+ if(quota_findroot(newquota, sizeof(newquota), root)) {
+ struct quota rootquota;
+ rootquota.root = newquota;
+ k = quota_read(&rootquota, crock.tid, 0);
+ if (!k) {
+ crock.quota = &rootquota;
+ crock.oldquota = &quota;
+ /* top level mailbox */
+ k = mboxlist_changequota(root, 0, 0, &crock);
+ }
+ /* submailboxes - we're using internal names here */
+ if (!k)
+ k = mboxlist_findall(NULL, pattern, 1, 0, 0, mboxlist_changequota, &crock);
+ if(!k)
+ k = quota_write(&rootquota, crock.tid);
+
+ }
+ else {
+ /* top level mailbox */
+ mboxlist_rmquota(root, 0, 0, (void *)root);
+ /* submailboxes - we're using internal names here */
+ mboxlist_findall(NULL, pattern, 1, 0, 0, mboxlist_rmquota, (void *)root);
+ }
+ }
+
+ if(!r && !k)
+ quota_commit(crock.tid);
+ else
+ quota_abort(crock.tid);
return r;
+
}
/*
@@ -2632,6 +2715,7 @@
struct mailbox mailbox;
struct change_rock *crock = (struct change_rock *) rock;
struct quota *mboxlist_newquota = crock->quota;
+ struct quota *mboxlist_oldquota = crock->oldquota;
struct txn **tid = crock->tid;
assert(rock != NULL);
@@ -2649,27 +2733,24 @@
if (r) goto error;
if (mailbox.quota.root) {
- if (strlen(mailbox.quota.root) >= strlen(mboxlist_newquota->root)) {
- /* Part of a child quota root */
- mailbox_close(&mailbox);
- return 0;
- }
-
- r = quota_read(&mailbox.quota, tid, 1);
- if (r) goto error;
- if (mailbox.quota.used >= mailbox.quota_mailbox_used) {
- mailbox.quota.used -= mailbox.quota_mailbox_used;
- }
- else {
- mailbox.quota.used = 0;
- }
- r = quota_write(&mailbox.quota, tid);
- if (r) {
- syslog(LOG_ERR,
- "LOSTQUOTA: unable to record free of " UQUOTA_T_FMT " bytes in quota %s",
- mailbox.quota_mailbox_used, mailbox.quota.root);
- }
- free(mailbox.quota.root);
+ if(mboxlist_oldquota) {
+ if (strlen(mailbox.quota.root) > strlen(mboxlist_oldquota->root)) {
+ /* Part of a child quota root */
+ mailbox_close(&mailbox);
+ return 0;
+ }
+ }
+ else {
+ if (strlen(mailbox.quota.root) >= strlen(mboxlist_newquota->root)) {
+ /* Part of a child quota root */
+ mailbox_close(&mailbox);
+ return 0;
+ }
+ }
+
+ r = mailbox_updatequota(&mailbox,tid);
+ if (r)
+ goto error;
}
mailbox.quota.root = xstrdup(mboxlist_newquota->root);
@@ -2682,6 +2763,11 @@
error:
mailbox_close(&mailbox);
+ syslog(LOG_ERR, "LOSTQUOTA: unable to change quota root for %s to %s: %s. \
+ Command aborted. Run reconstruct to make sure mailboxes \
+ are in consistent state",
+ name, mboxlist_newquota->root, error_message(r));
+ return 1;
error_noclose:
syslog(LOG_ERR, "LOSTQUOTA: unable to change quota root for %s to %s: %s",
name, mboxlist_newquota->root, error_message(r));
diff -Naur cyrus-imapd-2.3.9/imap/mboxlist.h cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/mboxlist.h
--- cyrus-imapd-2.3.9/imap/mboxlist.h 2006-11-30 19:11:19.000000000 +0200
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/mboxlist.h 2007-08-21 16:49:06.000000000 +0300
@@ -126,7 +126,7 @@
* the planet */
int mboxlist_deletemailbox(const char *name, int isadmin, char *userid,
struct auth_state *auth_state, int checkacl,
- int local_only, int force);
+ int local_only, int force, int keepQuota);
/* Rename/move a mailbox (hierarchical) */
int mboxlist_renamemailbox(char *oldname, char *newname, char *partition,
diff -Naur cyrus-imapd-2.3.9/imap/nntpd.c cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/nntpd.c
--- cyrus-imapd-2.3.9/imap/nntpd.c 2007-03-30 21:51:01.000000000 +0300
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/nntpd.c 2007-08-21 16:49:06.000000000 +0300
@@ -3358,7 +3358,7 @@
/* XXX should we delete right away, or wait until empty? */
r = mboxlist_deletemailbox(mailboxname, 0,
- newsmaster, newsmaster_authstate, 1, 0, 0);
+ newsmaster, newsmaster_authstate, 1, 0, 0, 1);
if (!r) sync_log_mailbox(mailboxname);
diff -Naur cyrus-imapd-2.3.9/imap/sync_reset.c cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/sync_reset.c
--- cyrus-imapd-2.3.9/imap/sync_reset.c 2007-03-30 21:40:21.000000000 +0300
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/sync_reset.c 2007-08-21 16:49:06.000000000 +0300
@@ -258,7 +258,7 @@
if (r) goto fail;
for (item = list->head ; item ; item = item->next) {
- r=mboxlist_deletemailbox(item->name, 1, NULL, sync_authstate, 1, 0, 0);
+ r=mboxlist_deletemailbox(item->name, 1, NULL, sync_authstate, 1, 0, 0, 1);
if (r) goto fail;
}
@@ -274,7 +274,7 @@
if (r) goto fail;
for (item = list->head ; item ; item = item->next) {
- r=mboxlist_deletemailbox(item->name, 1, NULL, sync_authstate, 1, 0, 0);
+ r=mboxlist_deletemailbox(item->name, 1, NULL, sync_authstate, 1, 0, 0, 1);
if (r) goto fail;
}
@@ -282,7 +282,7 @@
/* Nuke inbox (recursive nuke possible?) */
snprintf(buf, sizeof(buf)-1, "user.%s", user);
- r = mboxlist_deletemailbox(buf, 1, "cyrus", sync_authstate, 1, 0, 0);
+ r = mboxlist_deletemailbox(buf, 1, "cyrus", sync_authstate, 1, 0, 0, 1);
if (r && (r != IMAP_MAILBOX_NONEXISTENT)) goto fail;
if ((r=user_deletedata(user, sync_userid, sync_authstate, 1)))
diff -Naur cyrus-imapd-2.3.9/imap/sync_server.c cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/sync_server.c
--- cyrus-imapd-2.3.9/imap/sync_server.c 2007-08-01 22:19:03.000000000 +0300
+++ cyrus-imapd-2.3.9-rmquota+deletemailbox.uncompiled/imap/sync_server.c 2007-08-21 16:49:06.000000000 +0300
@@ -1590,7 +1590,7 @@
for (item = list->head ; item ; item = item->next) {
r=mboxlist_deletemailbox(item->name, sync_userisadmin, sync_userid,
- sync_authstate, 0, 0, 1);
+ sync_authstate, 0, 0, 1, 1);
if (r) goto fail;
}
@@ -1600,7 +1600,7 @@
(sync_namespacep->mboxname_tointernal)(sync_namespacep, "INBOX",
user, buf);
r = mboxlist_deletemailbox(buf, sync_userisadmin, sync_userid,
- sync_authstate, 0, 0, 1);
+ sync_authstate, 0, 0, 1, 1);
if (r && (r != IMAP_MAILBOX_NONEXISTENT)) goto fail;
if ((r=user_deletedata(user, sync_userid, sync_authstate, 1)))
@@ -2546,7 +2546,7 @@
/* Delete with admin priveleges */
r = mboxlist_deletemailbox(name, sync_userisadmin, sync_userid,
- sync_authstate, 0, 0, 1);
+ sync_authstate, 0, 0, 1, 1);
if (r)
prot_printf(sync_out, "NO Failed to delete %s: %s\r\n",

View File

@ -12,7 +12,7 @@ The following steps should lead you to a running Cyrus IMAP server:
your box. Upgrading any Invoca rpm based installation should be fine.
3) Make sure you understand that this RPM installs in FHS compliant
directories, like /var/lib/imap and /var/spool/imap
4) Make sure cyrus-sasl 2.x is installed.
4) Make sure cyrus-sasl is installed.
5) Make sure saslauthd is running. If not, edit /etc/sysconfig/saslauthd as
needed and do 'chkconfig saslauthd on ; service saslauthd start'
6) Install the cyrus-imapd RPMs.

View File

@ -1,30 +0,0 @@
If you have a lot of groups or very large groups, cyrus-imapd login can become
quite slow due to the way cyrus-imapd handles groups. This may become worse
when using nss_ldap or other slow nss backends to resolve groups.
Caching using nscd can increase speed dramatically but unfortunately not for
all functions cyrus-imapd uses. nscd helps speeding up getgrnam() calls but not
getgrent() calls, which are used by cyrus-imapd to get a complete list of all
groups available.
The groupfile patch implements a quick fix to the problem by using a separate
group.cache file to speed up those operations using getgrent() calls.
Calls to getgrnam() are not touched which means that the group.cache
file must be kept in sync with the group source you are using with nss
configured in /etc/nsswitch.conf. If group.cache doesn't exist,
the patch has no effect and cyrus-imapd handles groups through getgrent().
Quick HOWTO:
- configure group lookup in /etc/nsswitch.conf if not already done
- configure name service cache in /etc/nscd.conf (not mandatory)
- start nscd with "service nscd start" (not mandatory)
- configure a service which periodically updates the group.cache file using the
upd_groupcache script. Either set up a cronjob or use a event in the cyrus
configuration.
Sample /etc/cyrus.conf event to update the group cache every 10 minutes:
EVENTS {
# some events removed here ***
...........................***
# this is only necessary if using group cache feature
groupcache cmd="upd_groupcache" period=10
}

View File

@ -1,34 +0,0 @@
--- cyrus-imapd-2.2.6/imap/message.c.acceptinvalidfrom 2004-10-30 15:03:02.220642392 -0700
+++ cyrus-imapd-2.2.6/imap/message.c 2004-10-30 15:06:01.838336352 -0700
@@ -229,6 +229,8 @@
int reject8bit = config_getswitch(IMAPOPT_REJECT8BIT);
int munge8bit = config_getswitch(IMAPOPT_MUNGE8BIT);
int inheader = 1, blankline = 1;
+ char is_from;
+ static const char * from_header = "From ";
while (size) {
n = prot_read(from, buf, size > 4096 ? 4096 : size);
@@ -294,8 +296,20 @@
/* Check for valid header name */
if (sawnl && buf[0] != ' ' && buf[0] != '\t') {
if (buf[0] == ':') return IMAP_MESSAGE_BADHEADER;
- for (p = (unsigned char *)buf; *p != ':'; p++) {
- if (*p <= ' ') return IMAP_MESSAGE_BADHEADER;
+ p = (unsigned char *) buf;
+ if (*p == '>')
+ p++;
+ if (*p == from_header[0])
+ is_from = 0;
+ else
+ is_from = -1;
+ for (; *p != ':' && is_from < 5; p++) {
+ if (is_from > 0 && *p != from_header[is_from])
+ is_from = -1;
+ if (is_from >= 0)
+ is_from++;
+ else
+ if (*p <= ' ') return IMAP_MESSAGE_BADHEADER;
}
}

View File

@ -1,28 +0,0 @@
divert(-1)
include(`../m4/cf.m4')
define(`confDEF_USER_ID',``8:12'')
OSTYPE(`linux')
undefine(`UUCP_RELAY')
undefine(`BITNET_RELAY')
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
define(`CYRUS_MAILER_FLAGS',`Aw5:/|@o')
define(`confLOCAL_MAILER',`cyrus')
dnl # Note: CYUSER isn't needed, but must put $u in mailer args otherwise
dnl # it uses SMTP for delivery!
define(`CYRUS_MAILER_ARGS', `procmail -p /etc/procmailrc.cyrus CYUSER=$u')
define(`CYRUS_MAILER_PATH', `/usr/bin/procmail')
MAILER(cyrus)
MAILER(procmail)
MAILER(smtp)
HACK(check_mail3,`hash -a@JUNK /etc/mail/deny')
HACK(use_ip,`/etc/mail/ip_allow')
HACK(use_names,`/etc/mail/name_allow')
HACK(use_relayto,`/etc/mail/relay_allow')
HACK(check_rcpt4)
HACK(check_relay3)
dnl Not yet tested...
dnl LOCAL_RULE_0
dnl Rbb + $+ < @ $=w . > $#cyrusbb $: $1

View File

@ -1,29 +0,0 @@
PUSHDIVERT(-1)
#
# Copyright (c) 2002 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
# forth in the LICENSE file which can be found at the top level of
# the sendmail distribution.
#
# Contributed by Kenneth Murchison.
#
_DEFIFNOT(`_DEF_CYRUSV2_MAILER_FLAGS', `lsDFMnqXz')
_DEFIFNOT(`CYRUSV2_MAILER_FLAGS', `A@/:|m')
ifdef(`CYRUSV2_MAILER_ARGS',, `define(`CYRUSV2_MAILER_ARGS', `FILE /var/imap/socket/lmtp')')
define(`_CYRUSV2_QGRP', `ifelse(defn(`CYRUSV2_MAILER_QGRP'),`',`', ` Q=CYRUSV2_MAILER_QGRP,')')dnl
POPDIVERT
#########################################
### Cyrus V2 Mailer specification ###
#########################################
VERSIONID(`$Id: cyrus-imapd-sendmail-8.12.9-cyrusv2.m4,v 1.1 2004/02/04 12:59:42 karsten Exp $')
Mcyrusv2, P=[IPC], F=_MODMF_(CONCAT(_DEF_CYRUSV2_MAILER_FLAGS, CYRUSV2_MAILER_FLAGS), `CYRUSV2'),
S=EnvFromSMTP/HdrFromL, R=EnvToL/HdrToL, E=\r\n,
_OPTINS(`CYRUSV2_MAILER_MAXMSGS', `m=', `, ')_OPTINS(`CYRUSV2_MAILER_MAXRCPTS', `r=', `, ')_OPTINS(`CYRUSV2_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP,_CYRUSV2_QGRP
A=CYRUSV2_MAILER_ARGS

View File

@ -1,4 +1,4 @@
#!/bin/sh
#!/bin/bash
# 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
@ -97,16 +97,62 @@
#
# v1.2.1, Jan 13 2006 Simon Matter <simon.matter@invoca.ch>
# - code cleanup
#
# v1.2.2, Nov 29 2007 Simon Matter <simon.matter@invoca.ch>
# - add ability to handle "@include" options in imapd.conf, patch
# provided by Tim Bannister
#
# v1.2.3, Feb 07 2008 Simon Matter <simon.matter@invoca.ch>
# - add ability to handle tabs in imapd.conf, patch provided
# by Franz Knipp
# - disable default values for some config options like sievedir
#
# v1.2.4, Apr 23 2008 Simon Matter <simon.matter@invoca.ch>
# - add support for statuscache.db
#
# v1.3.0, Sep 29 2008 Simon Matter <simon.matter@invoca.ch>
# - add multi-instance support
#
# v1.3.1, Oct 09 2008 Simon Matter <simon.matter@invoca.ch>
# - improve variable handling
#
# v1.3.2, May 26 2009 Simon Matter <simon.matter@invoca.ch>
# - add some sanity checks to multi-instance support
#
# v1.3.3, May 27 2009 Simon Matter <simon.matter@invoca.ch>
# - make some cosmetic changes
#
# v1.3.4, Dec 22 2009 Simon Matter <simon.matter@invoca.ch>
# - add support for user_deny.db
VERSION=1.2.1
VERSION=1.3.4
if [ -n "$(/sbin/pidof cyrus-master)" ]; then
echo "ERROR: cyrus-master is running, unable to convert mailboxes!"
exit 1
PIDFILE=/var/run/cyrus-master${INSTANCE}.pid
# instance config
CYRUSCONF=/etc/cyrus${INSTANCE}.conf
IMAPDCONF=/etc/imapd${INSTANCE}.conf
# make sure what we have is a valid instance
# and that config files are present
if [ -n "$INSTANCE" ]; then
[ -L /etc/rc.d/init.d/${BASENAME} ] || exit 0
fi
[ -f $CYRUSCONF ] || exit 0
[ -f $IMAPDCONF ] || exit 0
if [ -f $PIDFILE ]; then
read CYRUS_PID < $PIDFILE
if [ -n "$CYRUS_PID" ]; then
if ps -p $CYRUS_PID > /dev/null 2>&1; then
echo "ERROR: cyrus-master is running, unable to convert mailboxes!"
exit 1
fi
fi
fi
if [ ! -f /etc/imapd.conf ]; then
echo "ERROR: configuration file not found."
if [ ! -f $IMAPDCONF ]; then
echo "ERROR: configuration file '${IMAPDCONF}' not found, exiting!"
exit 1
fi
@ -119,7 +165,7 @@ fi
# force cyrus user for security reasons
if [ ! $(whoami) = "cyrus" ]; then
exec $RUNUSER - cyrus -c "cd $PWD < /dev/null ; $0 $*"
exec $RUNUSER - cyrus -c "cd $PWD < /dev/null ; INSTANCE=$INSTANCE $0 $*"
fi
# special function for migration
@ -131,14 +177,33 @@ umask 166
# show version info in log files
echo "cvt_cyrusdb_all version: $VERSION"
# get_config [config default]
# expand_config <path>
# handle "@include" sections from imapd style config file
expand_config() {
while read line; do
if printf "%s\n" "${line}" | grep -q '^@include:'; then
expand_config "$( printf "%s\n" "${line}" | cut -d : -f 2- | sed -e 's/^[\t ]*//' )"
else
printf "%s\n" "${line}"
fi
done < $1
}
# get_config <config> [<default>]
# extracts config option from config file
get_config() {
if config=$(grep "^$1" /etc/imapd.conf); then
echo $config | cut -d: -f2 | sed -e 's/^ *//' -e 's/-nosync//' -e 's/ *$//'
searchstr=$1
if config="$(expand_config $IMAPDCONF | egrep "^${searchstr}:")"; then
CFGVAL="$(printf "%s\n" "$config" | cut -d : -f 2- | sed -e 's/^[\t ]*//')"
else
echo $2
if [ -z "$2" ]; then
echo "ERROR: config option '$1' not found in ${IMAPDCONF}, exiting!" 1>&2
return 1
fi
CFGVAL="$2"
fi
echo "get_config ${1}: $CFGVAL" 1>&2
echo "$CFGVAL"
}
# where to find files and directories
@ -149,8 +214,8 @@ cyrus_magic=${data_dir}/magic
cvt_cyrusdb=${lib_dir}/cvt_cyrusdb
sievec=${lib_dir}/sievec
masssievec=${lib_dir}/masssievec
imap_prefix=$(get_config configdirectory /var/lib/imap)
sieve_dir=$(get_config sievedir /var/lib/imap/sieve)
imap_prefix=$(get_config configdirectory) || exit 1
sieve_dir=$(get_config sievedir) || exit 1
db_cfg=${data_dir}/db.cfg
db_current=${imap_prefix}/rpm/db.cfg.current
db_cache=${imap_prefix}/rpm/db.cfg.cache
@ -159,33 +224,37 @@ db_cache=${imap_prefix}/rpm/db.cfg.cache
. $db_cfg
# get configured db backend config
duplicate_db=$(get_config duplicate_db $duplicate_db)
mboxlist_db=$(get_config mboxlist_db $mboxlist_db)
seenstate_db=$(get_config seenstate_db $seenstate_db)
subscription_db=$(get_config subscription_db $subscription_db)
tlscache_db=$(get_config tlscache_db $tlscache_db)
annotation_db=$(get_config annotation_db $annotation_db)
mboxkey_db=$(get_config mboxkey_db $mboxkey_db)
ptscache_db=$(get_config ptscache_db $ptscache_db)
quota_db=$(get_config quota_db $quota_db)
duplicate_db=$(get_config duplicate_db $duplicate_db) || exit 1
mboxlist_db=$(get_config mboxlist_db $mboxlist_db) || exit 1
seenstate_db=$(get_config seenstate_db $seenstate_db) || exit 1
subscription_db=$(get_config subscription_db $subscription_db) || exit 1
tlscache_db=$(get_config tlscache_db $tlscache_db) || exit 1
annotation_db=$(get_config annotation_db $annotation_db) || exit 1
mboxkey_db=$(get_config mboxkey_db $mboxkey_db) || exit 1
ptscache_db=$(get_config ptscache_db $ptscache_db) || exit 1
quota_db=$(get_config quota_db $quota_db) || exit 1
statuscache_db=$(get_config statuscache_db $statuscache_db) || exit 1
userdeny_db=$(get_config userdeny_db $userdeny_db) || exit 1
# remember current db backend config
{
echo "duplicate_db=$duplicate_db"
echo "mboxlist_db=$mboxlist_db"
echo "seenstate_db=$seenstate_db"
echo "subscription_db=$subscription_db"
echo "tlscache_db=$tlscache_db"
echo "annotation_db=$annotation_db"
echo "mboxkey_db=$mboxkey_db"
echo "ptscache_db=$ptscache_db"
echo "quota_db=$quota_db"
echo "sieve_version=$sieve_version"
echo "duplicate_db=${duplicate_db}"
echo "mboxlist_db=${mboxlist_db}"
echo "seenstate_db=${seenstate_db}"
echo "subscription_db=${subscription_db}"
echo "tlscache_db=${tlscache_db}"
echo "annotation_db=${annotation_db}"
echo "mboxkey_db=${mboxkey_db}"
echo "ptscache_db=${ptscache_db}"
echo "quota_db=${quota_db}"
echo "statuscache_db=${statuscache_db}"
echo "userdeny_db=${userdeny_db}"
echo "sieve_version=${sieve_version}"
} | sort > $db_current
# file_type [file]
# file_type <file>
file_type() {
this_type=$(file -b -m "$cyrus_magic:$system_magic" "$1" 2> /dev/null)
this_type=$(file -b -m "${cyrus_magic}:${system_magic}" "$1" 2> /dev/null)
if echo "$this_type" | grep -qi skip > /dev/null 2>&1; then
echo skiplist
elif echo "$this_type" | grep -qi text > /dev/null 2>&1; then
@ -195,7 +264,7 @@ file_type() {
fi
}
# cvt_file [file] [db]
# cvt_file <file> <db>
cvt_file() {
target="$1"
new_db="$2"
@ -208,21 +277,21 @@ cvt_file() {
if [ "$old_db" = "skiplist" ]; then
cp -a "$target" "${target}.skiplist"
else
$cvt_cyrusdb "$target" "$old_db" "${target}.skiplist" skiplist
$cvt_cyrusdb -C $IMAPDCONF "$target" "$old_db" "${target}.skiplist" skiplist
fi
RETVAL=$?
ERRVAL=$[ $ERRVAL + $RETVAL ]
ERRVAL=$(( $ERRVAL + $RETVAL ))
if [ $RETVAL -eq 0 ]; then
rm -f "$target"
if [ -s "${target}.skiplist" ]; then
if [ "$new_db" = "skiplist" ]; then
cp -a "${target}.skiplist" "$target"
else
$cvt_cyrusdb "${target}.skiplist" skiplist "$target" "$new_db"
$cvt_cyrusdb -C $IMAPDCONF "${target}.skiplist" skiplist "$target" "$new_db"
fi
fi
RETVAL=$?
ERRVAL=$[ $ERRVAL + $RETVAL ]
ERRVAL=$(( $ERRVAL + $RETVAL ))
if [ $RETVAL -eq 0 ]; then
rm -f "${target}.skiplist"
else
@ -235,18 +304,18 @@ cvt_file() {
fi
}
# cvt_to_utf8 [file]
# cvt_to_utf8 <file>
cvt_to_utf8() {
target="$1"
if [ -s "$target" ]; then
if ! $sievec "$target" "${target}.sievec"; then
if ! $sievec -C $IMAPDCONF "$target" "${target}.sievec"; then
iconv --from-code=ISO-8859-1 --to-code=UTF-8 --output="${target}.UTF-8" "$target"
if [ -s "${target}.UTF-8" ]; then
# preserve timestamp
touch --reference="$target" "${target}.UTF-8"
touch --reference="${target}" "${target}.UTF-8"
mv -f "${target}.UTF-8" "$target"
else
ERRVAL=$[ $ERRVAL + 1 ]
ERRVAL=$(( $ERRVAL + 1 ))
fi
fi
rm -f "${target}.sievec"
@ -257,7 +326,7 @@ ERRVAL=0
# make sure our Berkeley databases are in a sane state
# wait for db_checkpoint to end successfully or kill it after a timeout
db_checkpoint -v -1 -h $imap_prefix/db &
db_checkpoint -v -1 -h ${imap_prefix}/db &
DB_CHECK_PID=$!
CNT=0
while [ $CNT -lt 60 ]; do
@ -275,43 +344,47 @@ if kill -0 $DB_CHECK_PID > /dev/null 2>&1; then
fi
# do a normal recovery
db_recover -v -h $imap_prefix/db
db_recover -v -h ${imap_prefix}/db
RETVAL=$?
if [ $RETVAL -ne 0 ]; then
# try a catastrophic recovery instead of normal recovery
db_recover -v -c -h $imap_prefix/db
db_recover -v -c -h ${imap_prefix}/db
RETVAL=$?
ERRVAL=$[ $ERRVAL + $RETVAL ]
ERRVAL=$(( $ERRVAL + $RETVAL ))
if [ $RETVAL -ne 0 ]; then
echo "ERROR: catastrophic recovery of Berkeley databases failed"
fi
fi
if [ "$EXPORT" = "export" ]; then
# convert all db files to skiplist for migration
# convert all db files to portable format for migration
# TODO: quota_db, we don't touch it for now
cvt_file $imap_prefix/deliver.db "skiplist"
cvt_file $imap_prefix/mailboxes.db "skiplist"
cvt_file $imap_prefix/tls_sessions.db "skiplist"
cvt_file $imap_prefix/annotations.db "skiplist"
cvt_file $imap_prefix/ptclient/ptscache.db "skiplist"
rm -vf $imap_prefix/db/log.*
rm -vf $imap_prefix/db/__db.*
cvt_file ${imap_prefix}/deliver.db "skiplist"
cvt_file ${imap_prefix}/mailboxes.db "skiplist"
cvt_file ${imap_prefix}/tls_sessions.db "skiplist"
cvt_file ${imap_prefix}/annotations.db "skiplist"
cvt_file ${imap_prefix}/ptclient/ptscache.db "skiplist"
cvt_file ${imap_prefix}/statuscache.db "skiplist"
cvt_file ${imap_prefix}/user_deny.db "flat"
rm -vf ${imap_prefix}/db/log.*
rm -vf ${imap_prefix}/db/__db.*
else
# always convert db files which have been converted to skiplist
# TODO: quota_db, we don't touch it for now
cvt_file $imap_prefix/deliver.db "$duplicate_db"
cvt_file $imap_prefix/mailboxes.db "$mboxlist_db"
cvt_file $imap_prefix/tls_sessions.db "$tlscache_db"
cvt_file $imap_prefix/annotations.db "$annotation_db"
cvt_file $imap_prefix/ptclient/ptscache.db "$ptscache_db"
cvt_file ${imap_prefix}/deliver.db "$duplicate_db"
cvt_file ${imap_prefix}/mailboxes.db "$mboxlist_db"
cvt_file ${imap_prefix}/tls_sessions.db "$tlscache_db"
cvt_file ${imap_prefix}/annotations.db "$annotation_db"
cvt_file ${imap_prefix}/ptclient/ptscache.db "$ptscache_db"
cvt_file ${imap_prefix}/statuscache.db "$statuscache_db"
cvt_file ${imap_prefix}/user_deny.db "$userdeny_db"
# do we have to convert all databases?
if ! cmp -s $db_current $db_cache; then
# we treat sieve scripts the same way like db files
find ${sieve_dir}/ -name "*.script" -type f | while read db_file trash; do
cvt_to_utf8 "$db_file"
done
$masssievec $sievec
$masssievec $sievec $IMAPDCONF
# convert all db files left
find ${imap_prefix}/user/ -name "*.seen" -type f | while read db_file trash; do
cvt_file "$db_file" "$seenstate_db"

View File

@ -1,30 +0,0 @@
#!/bin/sh
IMAPCONF=/etc/imapd.conf
CONFDIR=$(grep -se "^configdirectory:" $IMAPCONF | cut -d":" -f2)
if [ "x$CONFDIR" = "x" ]; then
echo "$0 error: configdirectory not found in /etc/imapd.conf, exiting!"
exit 1
fi
find $CONFDIR -type d ! -name "lost+found" -exec chmod 700 {} \; -exec chown cyrus:mail {} \;
grep -sE "^(meta|)partition-.*:" $IMAPCONF | cut -d":" -f2 | while read SPOOLDIR; do
if [ "x$SPOOLDIR" = "x" ]; then
echo "$0 warning: invalid (meta)partition configuration in /etc/imapd.conf found!"
else
find $SPOOLDIR -type d ! -name "lost+found" -exec chmod 700 {} \; -exec chown cyrus:mail {} \;
fi
done
find $CONFDIR -type f ! -name "lost+found" -exec chmod 600 {} \; -exec chown cyrus:mail {} \;
grep -sE "^(meta|)partition-.*:" $IMAPCONF | cut -d":" -f2 | while read SPOOLDIR; do
if [ "x$SPOOLDIR" = "x" ]; then
echo "$0 warning: invalid (meta)partition configuration in /etc/imapd.conf found!"
else
find $SPOOLDIR -type f ! -name "lost+found" -exec chmod 600 {} \; -exec chown cyrus:mail {} \;
fi
done
# lmtp socket must be accessible by group mail
chmod 750 $CONFDIR
chmod 750 ${CONFDIR}/socket

View File

@ -1,11 +1,10 @@
#TODO: merge all sub-packages (except -devel) into cyrus-imapd, they are all required
Name: cyrus-imapd
Version: 2.3.16
Release: 4%{?dist}
Release: 5%{?dist}
%define ssl_pem_file %{_sysconfdir}/pki/%{name}/%{name}.pem
#uid/gid reserved, see setup:/usr/share/doc/setup*/uidgid
%define uid 76
%define gid 76
@ -18,43 +17,26 @@ License: BSD
Group: System Environment/Daemons
URL: http://cyrusimap.web.cmu.edu/
Source0: ftp://ftp.andrew.cmu.edu/pub/cyrus/%{name}-%{version}.tar.gz
Source3: cyrus-deliver-wrapper.c
Source4: cyrus-user-procmailrc.template
Source5: cyrus-imapd.logrotate
Source6: cyrus-imapd.imap-2.3.x-conf
Source7: cyrus-imapd.pam-config
Source8: http://email.uoa.gr/projects/cyrus/autocreate/README.autocreate-cyrus-2.3
Source9: http://email.uoa.gr/projects/cyrus/autosievefolder/README.autosievefolder
Source10: http://oss.netfarm.it/download/skiplist.py
Source11: cyrus-imapd.init
Source12: cyrus-imapd.sysconfig
Source13: cyrus-imapd.cvt_cyrusdb_all
Source14: cyrus-imapd.magic
Source15: http://clement.hermann.free.fr/scripts/Cyrus/imapcreate.pl
Source16: http://eu.dl.sourceforge.net/cyrus-utils/cyrus_ldap_quota.pl
Source17: ftp://kalamazoolinux.org/pub/projects/awilliam/cyrus/batchreconstruct
Source18: ftp://kalamazoolinux.org/pub/projects/awilliam/cyrus/bsd2cyrus
Source19: ftp://kalamazoolinux.org/pub/projects/awilliam/cyrus/cpmsg
Source20: ftp://kalamazoolinux.org/pub/projects/awilliam/cyrus/folderxfer
Source21: ftp://kalamazoolinux.org/pub/projects/awilliam/cyrus/inboxfer
Source22: http://email.uoa.gr/download/cyrus/cyrus_sharedbackup/cyrus_sharedbackup-0.1.tar.gz
Source24: README.HOWTO-recover-mailboxes.db
Source25: cyrus-imapd.cron-daily
Source26: cyrus-procmailrc
Source27: cyrus-imapd-procmail+cyrus.mc
Source28: cyrus-imapd.rpm_set_permissions
Source29: cyrus-imapd-sendmail-8.12.9-cyrusv2.m4
Source33: README.skiplist_recovery
Patch0: cyrus-imapd-2.2.12-no_transfig.patch
Patch1: http://email.uoa.gr/download/cyrus/cyrus-imapd-2.3.12/cyrus-imapd-2.3.12p2-autocreate-0.10-0.diff
Patch2: http://email.uoa.gr/download/cyrus/cyrus-imapd-2.3.12/cyrus-imapd-2.3.12p2-autosieve-0.6.0.diff
Patch4: http://servercc.oakton.edu/~jwade/cyrus/cyrus-imapd-2.1.3/cyrus-imapd-2.1.3-flock.patch
Patch6: cyrus-imapd-2.1.16-getrlimit.patch
Patch10: cyrus-imapd-acceptinvalidfrom.patch
Patch12: cyrus-imapd-2.3.7-notify_sms.patch
Patch1: http://email.uoa.gr/download/cyrus/cyrus-imapd-2.3.16/cyrus-imapd-2.3.16-autocreate-0.10-0.diff
Patch2: http://email.uoa.gr/download/cyrus/cyrus-imapd-2.3.16/cyrus-imapd-2.3.16-autosieve-0.6.0.diff
Patch4: http://www.oakton.edu/~jwade/cyrus/cyrus-imapd-2.1.3/cyrus-imapd-2.1.3-flock.patch
Patch14: cyrus-imapd-2.3.1-authid_normalize.patch
Patch15: cyrus-imapd-2.3.1-make_md5_defaults.patch
Patch18: cyrus-imapd-2.3.7-krb4.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=461875
Patch19: cyrus-imapd-2.3.12p2-current-db.patch
@ -74,6 +56,7 @@ BuildRequires: flex, bison, groff, automake
BuildRequires: openldap-devel
BuildRequires: krb5-devel
BuildRequires: net-snmp-devel
BuildRequires: transfig
Requires(post): e2fsprogs, chkconfig, initscripts, perl, grep, coreutils, findutils
Requires(preun): chkconfig, initscripts, coreutils
@ -119,21 +102,13 @@ Summary: Cyrus IMAP server development files
The %{name}-devel package contains header files and libraries
necessary for developing applications which use the imclient library.
%package perl
Group: System Environment/Libraries
Summary: Cyrus IMAP server utility Perl modules
%description perl
The %{name}-perl contains Perl modules necessary to use the
Cyrus IMAP server administration utilities.
%package utils
Group: Applications/System
Summary: Cyrus IMAP server administration utilities
Requires(pre): shadow-utils
Requires(post): grep, coreutils, make, openssl
Requires(postun): shadow-utils
Requires: %{name}-perl = %{version}-%{release}
Obsoletes: %{name}-perl < 2.3.16-5
%description utils
The %{name}-utils package contains administrative tools for the
@ -142,27 +117,15 @@ one running the server.
%prep
%setup -q
%patch0 -p1 -b .no_transfig
%patch1 -p1 -b .autocreate
%patch2 -p1 -b .autosieve
%patch4 -p1 -b .flock
%patch6 -p1 -b .getrlimit
%patch10 -p1 -b .acceptinvalidfrom
%patch12 -p1 -b .notify_sms
%patch14 -p1 -b .authid_normalize
%patch15 -p1 -b .make_md5_defaults
%patch18 -p1 -b .krb4
%patch19 -p1 -b .db4.7
%patch20 -p1 -b .nodenny
%patch21 -p1 -b .qos
# add additional sources
mkdir doc/{m4,contrib}
%{__install} -m 644 %{SOURCE10} %{SOURCE15} %{SOURCE16} %{SOURCE17} \
%{SOURCE18} %{SOURCE19} %{SOURCE20} %{SOURCE21} doc/contrib/
%{__install} -m 644 %{SOURCE24} %{SOURCE33} %{SOURCE8} %{SOURCE9} doc/
%{__install} -m 644 %{SOURCE26} %{SOURCE4} %{SOURCE27} %{SOURCE29} doc/m4/
# only to update config.* files
automake -a -f -c || :
aclocal -I cmulocal
@ -178,11 +141,13 @@ autoconf -f
find . -type f -name "*.pl" | xargs %{__perl} -pi -e "s@/usr/local/bin/perl@%{__perl}@"
# modify lmtp socket path in .conf files
%{__perl} -pi -e "s@/var/imap/@%{_var}/lib/imap/@" master/conf/*.conf doc/cyrusv2.mc doc/m4/%{name}-sendmail-8.12.9-cyrusv2.m4
%{__perl} -pi -e "s@/var/imap/@%{_var}/lib/imap/@" master/conf/*.conf doc/cyrusv2.mc #doc/m4/%{name}-sendmail-8.12.9-cyrusv2.m4
# enable idled in .conf files to prevent error messages
%{__perl} -pi -e "s/# idled/ idled/" master/conf/*.conf
# Fix permissions on perl programs
find . -type f -name "*.pl" -exec %{__chmod} 755 {} \;
%build
CPPFLAGS="$RPM_OPT_FLAGS -I%{_includedir}/et -I%{_includedir}/kerberosIV"; export CPPFLAGS
@ -218,9 +183,6 @@ LDFLAGS="$LDFLAGS -pie"; export LDFLAGS
%install
%{__rm} -rf %{buildroot}
# Fix permissions on perl programs
find . -type f -name "*.pl" -exec %{__chmod} 755 {} \;
# This is needed to install the perl files correctly
pushd perl/imap
%{__perl} Makefile.PL PREFIX=%{buildroot}%{_prefix} INSTALLDIRS=vendor
@ -255,7 +217,6 @@ done
# Install additional files
%{__install} -m 755 %{SOURCE13} %{buildroot}%{_cyrexecdir}/cvt_cyrusdb_all
%{__install} -m 755 %{SOURCE28} %{buildroot}%{_cyrexecdir}/rpm_set_permissions
%{__install} -m 644 %{SOURCE14} %{buildroot}%{_datadir}/%{name}/rpm/magic
%{__install} -p -m 644 master/conf/prefork.conf %{buildroot}%{_sysconfdir}/cyrus.conf
%{__install} -p -m 644 %{SOURCE6} %{buildroot}%{_sysconfdir}/imapd.conf
@ -272,8 +233,8 @@ done
%{__install} -p -m 755 %{SOURCE25} %{buildroot}%{_sysconfdir}/cron.daily/%{name}
# Cleanup of doc dir
find doc perl -name CVS -type d | xargs -r %{__rm} -rf
find doc perl -name .cvsignore -type f | xargs -r %{__rm} -f
find doc perl -name CVS -type d -prune -exec echo %{__rm} -rf {} \;
find doc perl -name .cvsignore -type f -exec %{__rm} -rf {} \;
%{__rm} -f doc/Makefile.dist*
%{__rm} -f doc/text/htmlstrip.c
%{__rm} -f doc/text/Makefile
@ -308,9 +269,6 @@ touch %{buildroot}%{ssl_pem_file}
%{__perl} -pi -e 's|fetchnews|cyrfetchnews|g;s|Fetchnews|Cyrfetchnews|g;s/FETCHNEWS/CYRFETCHNEWS/g' \
%{buildroot}%{_mandir}/man8/cyrfetchnews.8
# compress manpages
[ -x /usr/lib/rpm/brp-compress ] && /usr/lib/rpm/brp-compress
#remove executable bit from docs
for ddir in doc perl/imap/examples
do
@ -339,7 +297,7 @@ find %{buildroot}%{perl_vendorarch} -name "*.bs" -exec %{__rm} -f {} \;
%post
/sbin/chkconfig --add %{name}
# Force synchronous updates, usually only on ext2 filesystems
# Force synchronous updates, usually only on extX filesystems
chattr -R +S $i %{_var}/lib/imap/{user,quota} %{_var}/spool/imap 2>/dev/null ||:
# Create SSL certificates
@ -374,14 +332,6 @@ if [ $1 != 0 ]; then
/sbin/service %{name} condrestart >/dev/null 2>&1 || :
fi
%post utils
# FIXME: remove when setup > 2.8.10 is released
# Add service entries if necessary
if ! %{__grep} -q ^csync %{_sysconfdir}/services; then
echo -e 'csync\t\t2005/tcp\t\t\t# Cyrus IMAP Replication Daemon' >> %{_sysconfdir}/services
echo -e 'csync\t\t2005/udp\t\t\t# Cyrus IMAP Replication Daemon' >> %{_sysconfdir}/services
fi
%files
%defattr(-,root,root,-)
%doc COPYRIGHT README
@ -444,7 +394,6 @@ fi
%{_cyrexecdir}/unexpunge
%{_cyrexecdir}/upgradesieve
%{_cyrexecdir}/cvt_cyrusdb_all
%{_cyrexecdir}/rpm_set_permissions
%{_cyrexecdir}/idled
%{_cyrexecdir}/compile_sieve
%{_cyrexecdir}/mupdate
@ -489,11 +438,12 @@ fi
%{_libdir}/lib*.a
%{_mandir}/man3/imclient.3*
%files perl
%files utils
%defattr(-,root,root)
%doc perl/imap/README
%doc perl/imap/Changes
%doc perl/imap/examples
%{_bindir}/*
%dir %{perl_vendorarch}/Cyrus
%dir %{perl_vendorarch}/Cyrus/IMAP
%{perl_vendorarch}/Cyrus/IMAP/Admin.pm
@ -514,13 +464,16 @@ fi
%{_mandir}/man3/Cyrus::IMAP.3pm.gz
%{_mandir}/man3/Cyrus::IMAP::IMSP.3pm.gz
%{_mandir}/man3/Cyrus::SIEVE::managesieve.3pm.gz
%files utils
%defattr(0644,root,root,0755)
%attr(0755,root,root) %{_bindir}/*
%{_mandir}/man1/*
%changelog
* Mon Jun 07 2010 Michal Hlavinka <mhlavink@redhat.com> - 2.3.16-5
- spec cleanup
- simplified packaging (merge -perl in -utils)
- remove obsoleted and/or unmaintained additional sources/patches
- remove long time not used files from the cvs/srpm
- update additional sources/patches from their upstream
* Tue Jun 01 2010 Marcela Maslanova <mmaslano@redhat.com> - 2.3.16-4
- Mass rebuild with perl-5.12.0

View File

@ -1,66 +0,0 @@
#!/bin/sh
# 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# This script updates a cache of the unix group database. It's purpose is to
# speedup group authorization when using large groups with slow nss backends.
# For more info consult the README.groupcache file.
#
# This script can safely be run as root, it will reexec itself as user
# cyrus if needed.
#
# author: Simon Matter, Invoca Systems <simon.matter@invoca.ch>
# changelog
# v1.0.0, Dec 15 2004 Simon Matter <simon.matter@invoca.ch>
# - initial release
if [ ! -f /etc/imapd.conf ]; then
echo "ERROR: configuration file not found."
exit 1
fi
# fallback to su if runuser not available
if [ -x /sbin/runuser ]; then
RUNUSER=runuser
else
RUNUSER=su
fi
# force cyrus user for security reasons
if [ ! $(whoami) = "cyrus" ]; then
exec $RUNUSER - cyrus -c "cd $PWD < /dev/null ; $0"
fi
# files get mode 0600
umask 166
# get_config [config default]
# extracts config option from config file
get_config() {
if config=$(grep "^$1" /etc/imapd.conf); then
echo $config | cut -d: -f2
else
echo $2
fi
}
# where to find files and directories
imap_prefix=$(get_config configdirectory /var/lib/imap)
group_cache=${imap_prefix}/group.cache
TMPCACHE=$(mktemp ${group_cache}.XXXXXX) || exit 1
getent group >> $TMPCACHE
mv -f $TMPCACHE $group_cache

View File

@ -1,129 +0,0 @@
#################################################
# procmailrc
# This is the main procmail file with common SPAM recipes
# Based on the article at
# http://www.ncworldmag.com/ncw-05-1998/ncw-05-imap.html
#
#
# First we define some basics
PATH=/usr/bin:/bin
SHELL=/bin/sh
# We define DELIVERTO just to prevent a lot of extra
# typing later on. We define SPAMIT to prevent even more
# repetitive typing, as it's the same action for every user.
# This assumes we set up a SPAM folder right off the INBOX
# for every user on the system. If we neglect to do that, we'll
# get in a bit of trouble.
DELIVERTO=/usr/cyrus/bin/deliver-wrapper
SPAMIT="$DELIVERTO user.$LOGNAME.SPAM"
# This file includes the appropriate procmail.$LOGNAME
# file so that each user has his or her own recipe techniques
# for subscribed lists, e-mail alerts, etc.
# Before we begin any recipes, let's make a backup
# copy of any incoming mail.
#
# Remember to comment out the next recipe once
# you know everything is working fine, otherwise
# you'll fill up the backup directory very quickly.
# Some procmail tutorials demonstrate how you can
# set a quota on the backup directory so that you can
# leave it in force at all times.
:0 ic
| $DELIVERTO user.$LOGNAME.Backup
###############################
# If there used to be an existing system-wide procmailrc, you can
# include it here
#INCLUDERC=/etc/procmailrc
# We shouldn't be running as a privileged user, but just in case,
# make sure we drop any privileges we have
DROPPRIVS=1
###############################
# If users want to be able to define their own private recipes
# and put them in their home .procmailrc files, comment out
# the next definition.
#
# These recipes will be processed BEFORE the user-specific
# recipes that are kept in the /home/cyrus directory
#
# setup some variables, before we start
ALERTSBOX=user.$LOGNAME.Folders.Alerts
LISTSBOX=user.$LOGNAME.Folders.Lists
#
INCLUDERC=$HOME/.procmailrc
# If you want to define user-specific recipes that
# you manage centrally (perhaps because you don't want
# to allow your users to "roll their own," then
# uncomment the following line. In this case, you have
# to create a file for each user in the form:
# procmail.username -- for example, procmail.Joe
#
# INCLUDERC=/usr/cyrus/etc/procmail.$LOGNAME
#############################
# Now we begin our recipes
#############################
# Email-specific SPAM recipes
# Here's one example
#### NOTE: surely cyrus 'deliver' does its own locking? There should
#### thus be no need for :0:$LOGNAME.lock
:0
* ^To:.*anyplace@juno.com
| $SPAMIT
#############################
# General SPAM Recipes
# Here are a few examples
#
# The "To:" line doesn't exist
#:0
#* !^To:
#| $SPAMIT
# The "To:" line is empty
#:0
#* ^To: $
#| $SPAMIT
# The "From:" line is empty
#:0
#* ^From: $
#| $SPAMIT
#############################
# All the mail that falls
# through the above recipes
# will be put into the user's
# inbox. This is always the LAST
# recipe to appear in the file.
:0W
| $DELIVERTO user.$LOGNAME
# If that fails - maybe because the user is out of quota, or the mailbox
# hasn't been created - then force a bounce (otherwise the message would
# get silently appended to /var/spool/mail/$LOGNAME).
# This is EX_CANTCREAT (Can't create output)
EXITCODE=73
:0
/dev/null
#
# End of procmailrc file
##############################

View File

@ -1,58 +0,0 @@
##############################
# Begin procmailrc.joe file
#
# This is Joe's specific set of procmail
# recipes. It assumes that Joe has a
# number of specific folders created
# to which these recipes refer. Otherwise
# the mail cannot be sorted properly.
#
# First, let's define some high-level
# folder macros to save typing later on.
# The ALERTSBOX points to the
# folder where we'll sort out various
# incoming news alerts.
# The LISTSBOX will point to a
# folder where we'll sort out various
# list services to which we're subscribed.
#
# Both ALERTSBOX and LISTSBOX
# are subfolders of a generic folder called,
# duh, Folders, which is right off the
# user's INBOX.
#
# So if a Linux-kernel message comes in
# it gets deposited in the folder
# Folders/Lists/Linux_Kernel which is
# represented in Cyrus IMAP terms as
# user.Joe.Folders.Lists.Linux_kernel
#
############################
# Put anchordesk alerts in news alerts folder
:0:$LOGNAME.lock
* ^From:.*anchordesk
| $DELIVERTO $ALERTSBOX.News-Alerts
# Put NC World alerts in their own folder
:0:$LOGNAME.lock
* ^From:.*NCWorld@FDDS.com
| $DELIVERTO $ALERTSBOX.NCWorld-Alerts
#############################
# List processing & Misc Alerts
:0:$LOGNAME.lock
* (^Cc:|^CC:|^To:|^Sender:).*linux-kernel@vger.rutgers.edu
| $DELIVERTO $LISTSBOX.Linux_Kernel
:0:$LOGNAME.lock
* (^Cc:|^CC:|^To:|^Sender:).*linux-net@vger.rutgers.edu
| $DELIVERTO $LISTSBOX.Linux_Net
#
# End of procmailrc.joe file
##############################

View File

@ -1,127 +0,0 @@
#!/usr/bin/perl
use Cyrus::IMAP::Admin;
# This script was created by Kevin J. Menard, Jr. <kmenard@wpi.edu>.
# It requires root privileges to write to a file in /etc. Best use is
# to set this up as cron job. Works for me. Hope it does for you.
# Any questions/complaints/praise/whatever, send 'em to the address
# above. -- 08/16/2001
# These are the variables you might want to tweak.
my $quota_attr = "mailQuota";
my $mail_attr = "mailRoutingAddress";
my $user = "cyrus";
my $passwd = "blah";
# These are the ones that you shouldn't have to.
my @entries = ();
my $index = 0;
my $counter = 0;
my $old_timestamp = 0;
my $timestamp = "199412161032Z";
# Open the /etc/cyrus_ldap_quota_time file; it's a long name, but
# shouldn't interfere with existing files :) This file contains 1 line,
# the generalized time format of the last time the script ran. This is
# used for the search, so we only update quotas that have been modified
# since then.
{
if (-e "/etc/cyrus_ldap_quota_time")
{
open(TIME_FILE, "/etc/cyrus_ldap_quota_time") or die "could not
open the time file: $!\n";
while(<TIME_FILE>) { $old_timestamp = $_; }
close(TIME_FILE);
}
# Now we deal with the case where the file doesn't exist, that is to
# say the first time the script was run.
unless ($old_timestamp == 0) { $timestamp = $old_timestamp; }
# Now that we have that information, we can overwrite the file with
# the new timestamp. Maybe this overkill, but this is only a
# temporary solution anyway.
open(TIME_FILE, ">/etc/cyrus_ldap_quota_time") or die "could not
create file: $!\n";
my @time = (localtime)[0..5];
printf TIME_FILE $time[5] + 1900;
printf TIME_FILE "%02d", $time[4] + 1;
for (my $i = 3; $i >= 0; $i--) { printf TIME_FILE "%02d", $time[$i];}
print TIME_FILE 'Z';
close(TIME_FILE);
}
# This is where we do the search and then parse the results into a
# useable form. In this case, an arry of hash entries.
{
# Okay, this very ugly line sets up the LDAP search, and the strips
# away the meaningless stuff. This could be prettier, but I didn't
# want to add a dependency for an LDAP module, and everyone should
# have LDAP search. The greps are just to make things simpler.
(my $query = "ldapsearch -x '(&(modifyTimestamp>=$timestamp)($quota_attr=*))' $quota_attr $mail_attr
| grep -v ^# | grep -v ^dn | grep -v ^version | grep -v ^search | grep -v ^result | grep -v ^\$") =~ s!\n!!;
# Now actually do the commands in the above line.
my $result = `$query`;
# Split the output into an array, one entry per line.
my @output = split(/\n/, $result);
# Now go through each line . . .
foreach (@output)
{
# Split on the attribute:value boundary.
(my $key, my $value) = split(/: /);
# Handle mailRoutingAddress; strip away everything after '@'.
if ($value =~ m!@!)
{
($value, undef) = split (/@/, $value);
}
# Add each doctored up attribute:value pair to the entries array.
$entries[$index]{$key} = $value;
# A crude hack to make sure each of the two attributes makes it
# into one of the entries array element.
if ($counter % 2)
{
$index++;
}
$counter++;
}
}
# Now here's the actual interaction with Cyrus IMAPd. It's all pretty
# self-explanatory.
{
my $imap = Cyrus::IMAP::Admin->new('localhost') or die "imap:
cannot connect to server: $!\n";
$imap->send(undef, undef, "LOGIN %s %s", $user, $passwd) or die
"could not send user:pass to the server: $!\n";
for (my $i = 0; $i <= $#entries; $i++)
{
$imap->setquota("user." . $entries[$i]{$mail_attr}, "STORAGE",
$entries[$i]{$quota_attr})
or die "imap: could not set quota for
user.$entries[$i]{$mail_attr}: $!\n";
}
$imap=undef;
}

View File

@ -1,46 +0,0 @@
#!/usr/bin/perl
#
# Usage: folderxfer inputfile
#
# Purpose: Converts contents of Berkeley-format mail folders
# to Cyrus mailboxes
#
# Input: Output of 'bsd2cyrus'
# (username:Cyrus-folder-name:Berkeley-folder-path)
#
# Warnings: The root mailbox and empty Cyrus folder must
# exist before conversion takes place, and source folders
# should be checked for RFC 822 content before being processed
#
#$Id: folderxfer,v 1.1 2004/02/04 12:59:42 karsten Exp $
$pwd = "/usr/lib/cyrus-imapd";
$mailstore = "/var/spool/imap"; # Cyrus mailstore
$cat = "/bin/cat";
$cmd = "/usr/bin/formail -n 20 -s $pwd/cpmsg";
$folders = "$ARGV[0]";
if (!$folders) { die "Usage: $0 filename"; }
open (MB,"$folders") || die "can't open $folders";
while (<MB>) {
chop;
# Be careful with this split - the last token might have
# whitespace we want to preserve
($user,$cyrusfolder,$folder) = split(/:/,$_,3);
@fields = split(/\./,$cyrusfolder);
$cyrfol = $fields[$#fields];
$fcat = "$cat \"$folder\"";
print $fcat;
$prefix = substr($user,0,1);
system ("$fcat | $cmd '$mailstore/$prefix/user/$user/$cyrfol'");
#print "'$mailstore/$prefix/user/$user/$cyrfol";
}
close MB;

View File

@ -1,159 +0,0 @@
#!/usr/bin/perl -w
#
# imapcreate: create IMAP mailboxes with quotas
# Reads user names from standard input.
# launch without argument for a short help.
#
# originally found on http://cyrus-utils.sourceforge.net
# (could not find any copyright info, thought)
#
# enhanced by Clément "nodens" Hermann <clement.hermann@free.fr>
#
# I'd like to consider this as GPL'd (cf www.gnu.org), but won't add any copyright without the original author's consent.
#
use Getopt::Long;
use Cyrus::IMAP::Admin;
use strict;
my $debug;
my $user;
my $pass;
my $quota;
my @part;
my $useunixhierarchy;
my @mailboxes;
my $delete;
my $cyrus;
sub usage {
print <<EOU;
imapcreate - create IMAP mailboxes with quotas
usage:
imapcreate [-d] [-u user] [-p pass] [-m mailbox1[,mailbox2][,mailbox<n>]]
[-q quota] [-t partition:list] [-s] [-v] <server>
Options:
-t : the partition to use. Default to the \"default\" partition
-q ; the quota, if a quota is needed. It is normally in KiloBytes, but you can use m,M,g or G suffix to use MB or GB instead, e.g 10k, 2048M or 100g
-m : a comma-separated mailbox list
-u : your cyrus admin user (usually cyrus or cyradm)
-p : your cyrus admin password (if not provided, it will be asked for)
-s : use the unix hierarchy separator (see imapd.conf(1))
-d : delete mailboxes instead of creating them
-v : run in debug mode, and print information on stdout
If no password is submitted with -p, we'll prompt for one.
if no mailbox name is specified with -m, read user names from standard input
examples:
imapcreate -u cyradm -m foo,bar,joe -q 50000 -t p1:p2 mail.testing.umanitoba.ca
cat list.txt | imapcreate -u cyradm -p 'cyruspass' -q 50M mail.testing.umanitoba.ca
EOU
exit 1;
}
# Create a mailbox... usage : &CreateMailBox(user,partition[,quota]).
# You have to be authentified already. We use "$cyrus" as the connection name.
# partition can be 'default'
sub CreateMailBox {
my $mbuser = $_[0];
my $mbpart = $_[1];
my $mbquota = $_[2];
print "Creating $mbuser on $mbpart\n" if $debug;
if ($mbpart eq 'default') {
$cyrus->createmailbox($mbuser);
}
else {
$cyrus->createmailbox($mbuser, $mbpart);
}
warn $cyrus->error if $cyrus->error;
# Set the quota
if ($mbquota) {
print "Setting quota for $mbuser to $mbquota\n" if $debug;
$cyrus->setquota($mbuser, 'STORAGE', $mbquota);
warn $cyrus->error if $cyrus->error;
}
}
# Delete a mailbox. Usage: $DeleteMailBox($user)
# Assuming we use $user as the admin.
sub DeleteMailBox {
my $mbuser = $_[0];
my $delacl = "c";
print "Deleting $mbuser\n" if $debug;
$cyrus->setaclmailbox($mbuser, $user, $delacl);
$cyrus->deletemailbox($mbuser);
warn $cyrus->error if $cyrus->error;
}
GetOptions("d|delete" => \$delete, "u|user=s" => \$user, "p|pass=s" => \$pass, "m|mailboxes=s" => \@mailboxes, "q|quota=s" => \$quota,
"t|part=s" => \@part, "s|UnixHierarchy" => \$useunixhierarchy, "v|verbose" => \$debug );
@part = split(/:/, join(':', @part));
push @part, 'default' unless @part;
my $pn = 0;
@mailboxes = split(/,/, join(',', @mailboxes));
my $server = shift(@ARGV) if (@ARGV);
usage unless $server;
# quotas formatting:
if ($quota) {
if ($quota =~ /^(\d+)([mk]?)$/i) {
my $numb = $1;
my $letter = $2;
if ($letter =~ /^m$/i) {
$quota = $numb * 1024;
print "debug: quota=$quota\n" if $debug;
} elsif ($letter =~ /^k$/i) {
$quota = $numb;
print "debug: quota=$quota\n" if $debug;
} else {
die "malformed quota: $quota (must be at least one digit eventually followed by m, M, k or K\n";
# $quota = $numb;
# print "debug: quota=$quota\n" if $debug;
}
} else {
die "malformed quota: $quota (must be at least one digit eventually followed by m, M, k or K\n";
}
}
# Authenticate
$cyrus = Cyrus::IMAP::Admin->new($server);
$cyrus->authenticate(-mechanism => 'login', -user => $user,
-password => $pass);
die $cyrus->error if $cyrus->error;
# if there isn't any mailbox defined yet, get them from standard input
if (! (defined $mailboxes[0])) {
# For all users
while (<>) {
chomp;
my $mbox = $_;
push @mailboxes, $mbox;
}
}
# create/delete mailboxes for each user
foreach my $mailbox (@mailboxes) {
if ($useunixhierarchy) {
$mailbox = 'user/' . $mailbox;
} else {
$mailbox = 'user.' . $mailbox;
}
if ($delete) {
&DeleteMailBox($mailbox)
} else {
# Select the partition
my $pt = $part[$pn];
$pn += 1;
$pn = 0 unless $pn < @part;
&CreateMailBox($mailbox,$pt,$quota)
}
}

View File

@ -1,36 +0,0 @@
#!/usr/bin/perl
#
# Usage: inboxfer inputfile
#
# Purpose: Transfer messages from Berkeley-format inbox to Cyrus inbox
#
# Input: Text file containing one username per line
#
# Warning: Do not use this script to transfer messages into a Cyrus
# mailbox that already contain messages. Existing messages
# will be overwritten.
#
#$Id: inboxfer,v 1.1 2005/04/15 20:24:15 jdennis Exp $
$mailstore = "/var/spool/imap"; # Cyrus mailstore
$oldspool = "/var/spool/mail"; # Old mail spool
$cat = "/bin/cat"; # /usr/bin/cat on Solaris
$formail = "/usr/bin/formail";
$pwd = "/usr/lib/cyrus-imapd";
$cpmsg = "cpmsg";
$cmd = "$formail -n 20 -s $pwd/$cpmsg";
$users = "$ARGV[0]";
if (!$users) { die "Usage: $0 $users\n"; }
open(USERS,"$users") || die "can't open $users";
while (<USERS>) {
chop;
$inbox = "$oldspool/$_";
$prefix = substr($_,0,1);
system("$cat $inbox | $cmd $mailstore/$prefix/user/$_");
}

View File

@ -1,172 +0,0 @@
#!/usr/bin/env python
# -*- Mode: Python; tab-width: 4 -*-
#
# Cyrus Imapd Skiplist db recovery tool
#
# Copyright (C) 2004 Gianluigi Tiesi <sherpya@netfarm.it>
# Copyright (C) 2004 NetFarm S.r.l. [http://www.netfarm.it]
#
# 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 2, 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 MERCHANTIBILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
# ======================================================================
__version__= '0.1'
__doc__="""Cyrus skiplist db recover"""
from sys import argv,exit,stdout,stderr
from struct import unpack
from time import localtime, strftime
### User Conf
debug = 0
###
TIMEFMT ='%a, %d %b %Y %H:%M:%S %z'
PADDING = '\xff' * 4
INORDER = 1
ADD = 2
DELETE = 4
COMMIT = 255
DUMMY = 257
HEADER = -1
MAIN = -2
types = {
1: 'INORDER',
2: 'ADD',
4: 'DELETE',
255: 'COMMIT',
257: 'DUMMY',
-1: 'HEADER',
-2: '*'
}
def log(rtype, text):
global debug
if debug:
out = '[%s] %s\n' % (types[rtype], text)
stdout.write(out)
stdout.flush()
def roundto4(value):
if value % 4:
return ((value / 4) + 1) * 4
return value
def get_header(fp):
#### Magic ??
fp.seek(4)
sign = fp.read(16)
log(HEADER, sign[:-3])
version = unpack('>I', fp.read(4))[0]
version_minor = unpack('>I', fp.read(4))[0]
log(HEADER, 'Version %d,%d' % (version, version_minor))
maxlevel = unpack('>I', fp.read(4))[0]
curlevel = unpack('>I', fp.read(4))[0]
log(HEADER, 'Level %d/%d' % (curlevel, maxlevel))
listsize = unpack('>I', fp.read(4))[0]
log(HEADER, 'List size %d' % listsize)
logstart = unpack('>I', fp.read(4))[0]
log(HEADER, 'Offset %d' % logstart)
lastrecovery = localtime(unpack('>I', fp.read(4))[0])
lastrecovery = strftime(TIMEFMT, lastrecovery)
log(HEADER, 'Last Recovery %s' % lastrecovery)
return { 'version' : [version, version_minor],
'level' : [curlevel, maxlevel],
'listsize' : listsize,
'logstart' : logstart,
'lastrecover': lastrecovery
}
def getkeys(fp):
values = []
keys = {}
keystring = ''
datastring = ''
while 1:
log(MAIN, '-'*78)
stype = fp.read(4)
### EOF
if len(stype) != 4:
break
rtype = unpack('>I', stype)[0]
if not types.has_key(rtype):
log(MAIN, 'Invalid type %d' % rtype)
continue
log(rtype, 'Record type %s' % types[rtype])
if rtype == DELETE:
ptr = unpack('>I', fp.read(4))[0]
log(rtype, 'DELETE %d (0x%x)' % (ptr, ptr))
continue
if rtype == COMMIT:
continue
ksize = unpack('>I', fp.read(4))[0]
log(rtype, 'Key size %d (%d)' % (ksize, roundto4(ksize)))
if ksize:
keystring = fp.read(roundto4(ksize))[:ksize]
log(rtype, 'Key String %s' % keystring)
datasize = unpack('>I', fp.read(4))[0]
log(rtype, 'Data size %d (%d)' % (datasize, roundto4(datasize)))
if datasize:
datastring = fp.read(roundto4(datasize))[:datasize]
log(rtype, 'Data String %s' % datastring)
n = 0
while 1:
str_p = fp.read(4)
if str_p == PADDING:
break
spointer = unpack('>I', str_p)[0]
n = n +1
if spointer: log(rtype, 'Skip pointer %d' % spointer)
log(rtype, 'Total Skip pointers: %d' % n)
if rtype != DUMMY:
if keystring not in values:
values.append(keystring)
keys[keystring] = datastring
return values, keys
if __name__ == '__main__':
if len(argv) != 2:
print 'Usage: %s skiplist.file' % argv[0]
exit()
fp = open(argv[1], 'rb')
header = get_header(fp)
values, keys = getkeys(fp)
fp.close()
if debug: exit()
for v in values:
print '%s\t%s' % (v, keys[v])