- 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:
parent
cadb86d4d2
commit
9d65fa65ac
@ -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
|
|
@ -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.
|
|
@ -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
|
|
@ -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;
|
|
||||||
|
|
81
bsd2cyrus
81
bsd2cyrus
@ -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
26
cpmsg
@ -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;
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
@ -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 */
|
|
||||||
}
|
|
@ -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)
|
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
diff -Naur cyrus-imapd-2.3.12p2/README.autosievefolder cyrus-imapd-2.3.12p2-autosieve.uncompiled/README.autosievefolder
|
diff -Naur cyrus-imapd-2.3.16/README.autosievefolder cyrus-imapd-2.3.16-autosieve.uncompiled/README.autosievefolder
|
||||||
--- cyrus-imapd-2.3.12p2/README.autosievefolder 1970-01-01 02:00:00.000000000 +0200
|
--- cyrus-imapd-2.3.16/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
|
+++ cyrus-imapd-2.3.16-autosieve.uncompiled/README.autosievefolder 2009-12-23 01:08:09.000000000 +0200
|
||||||
@@ -0,0 +1,42 @@
|
@@ -0,0 +1,42 @@
|
||||||
+Cyrus IMAP autosievefolder patch
|
+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
|
+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
|
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.12p2/imap/lmtp_sieve.c 2008-03-24 19:09:17.000000000 +0200
|
--- cyrus-imapd-2.3.16/imap/lmtp_sieve.c 2009-03-31 07:11:18.000000000 +0300
|
||||||
+++ cyrus-imapd-2.3.12p2-autosieve.uncompiled/imap/lmtp_sieve.c 2008-05-06 15:16:21.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 @@
|
@@ -88,6 +88,9 @@
|
||||||
struct auth_state *authstate;
|
struct auth_state *authstate;
|
||||||
} script_data_t;
|
} 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;
|
+ return IMAP_MAILBOX_NONEXISTENT;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
diff -Naur cyrus-imapd-2.3.12p2/lib/imapoptions cyrus-imapd-2.3.12p2-autosieve.uncompiled/lib/imapoptions
|
diff -Naur cyrus-imapd-2.3.16/lib/imapoptions cyrus-imapd-2.3.16-autosieve.uncompiled/lib/imapoptions
|
||||||
--- cyrus-imapd-2.3.12p2/lib/imapoptions 2008-04-11 23:07:00.000000000 +0300
|
--- cyrus-imapd-2.3.16/lib/imapoptions 2009-12-21 13:25:22.000000000 +0200
|
||||||
+++ cyrus-imapd-2.3.12p2-autosieve.uncompiled/lib/imapoptions 2008-05-06 15:16:21.000000000 +0300
|
+++ cyrus-imapd-2.3.16-autosieve.uncompiled/lib/imapoptions 2009-12-23 01:08:09.000000000 +0200
|
||||||
@@ -942,6 +942,15 @@
|
@@ -1043,6 +1043,15 @@
|
||||||
/* If enabled, lmtpd will look for Sieve scripts in user's home
|
/* If enabled, lmtpd will look for Sieve scripts in user's home
|
||||||
directories: ~user/.sieve. */
|
directories: ~user/.sieve. */
|
||||||
|
|
@ -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 */
|
|
@ -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> <none></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 ’notify’ 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 ’notify’ 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_ */
|
|
@ -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 = "a;
|
|
||||||
+ 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("a, 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("a, NULL);
|
|
||||||
+ r = quota_delete("a, 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 = "a;
|
|
||||||
+ /* 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",
|
|
@ -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.
|
your box. Upgrading any Invoca rpm based installation should be fine.
|
||||||
3) Make sure you understand that this RPM installs in FHS compliant
|
3) Make sure you understand that this RPM installs in FHS compliant
|
||||||
directories, like /var/lib/imap and /var/spool/imap
|
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
|
5) Make sure saslauthd is running. If not, edit /etc/sysconfig/saslauthd as
|
||||||
needed and do 'chkconfig saslauthd on ; service saslauthd start'
|
needed and do 'chkconfig saslauthd on ; service saslauthd start'
|
||||||
6) Install the cyrus-imapd RPMs.
|
6) Install the cyrus-imapd RPMs.
|
||||||
|
@ -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
|
|
||||||
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
@ -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
|
|
@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# 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>
|
# v1.2.1, Jan 13 2006 Simon Matter <simon.matter@invoca.ch>
|
||||||
# - code cleanup
|
# - 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
|
PIDFILE=/var/run/cyrus-master${INSTANCE}.pid
|
||||||
echo "ERROR: cyrus-master is running, unable to convert mailboxes!"
|
|
||||||
exit 1
|
# 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
|
fi
|
||||||
|
|
||||||
if [ ! -f /etc/imapd.conf ]; then
|
if [ ! -f $IMAPDCONF ]; then
|
||||||
echo "ERROR: configuration file not found."
|
echo "ERROR: configuration file '${IMAPDCONF}' not found, exiting!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -119,7 +165,7 @@ fi
|
|||||||
|
|
||||||
# force cyrus user for security reasons
|
# force cyrus user for security reasons
|
||||||
if [ ! $(whoami) = "cyrus" ]; then
|
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
|
fi
|
||||||
|
|
||||||
# special function for migration
|
# special function for migration
|
||||||
@ -131,14 +177,33 @@ umask 166
|
|||||||
# show version info in log files
|
# show version info in log files
|
||||||
echo "cvt_cyrusdb_all version: $VERSION"
|
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
|
# extracts config option from config file
|
||||||
get_config() {
|
get_config() {
|
||||||
if config=$(grep "^$1" /etc/imapd.conf); then
|
searchstr=$1
|
||||||
echo $config | cut -d: -f2 | sed -e 's/^ *//' -e 's/-nosync//' -e 's/ *$//'
|
if config="$(expand_config $IMAPDCONF | egrep "^${searchstr}:")"; then
|
||||||
|
CFGVAL="$(printf "%s\n" "$config" | cut -d : -f 2- | sed -e 's/^[\t ]*//')"
|
||||||
else
|
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
|
fi
|
||||||
|
echo "get_config ${1}: $CFGVAL" 1>&2
|
||||||
|
echo "$CFGVAL"
|
||||||
}
|
}
|
||||||
|
|
||||||
# where to find files and directories
|
# where to find files and directories
|
||||||
@ -149,8 +214,8 @@ cyrus_magic=${data_dir}/magic
|
|||||||
cvt_cyrusdb=${lib_dir}/cvt_cyrusdb
|
cvt_cyrusdb=${lib_dir}/cvt_cyrusdb
|
||||||
sievec=${lib_dir}/sievec
|
sievec=${lib_dir}/sievec
|
||||||
masssievec=${lib_dir}/masssievec
|
masssievec=${lib_dir}/masssievec
|
||||||
imap_prefix=$(get_config configdirectory /var/lib/imap)
|
imap_prefix=$(get_config configdirectory) || exit 1
|
||||||
sieve_dir=$(get_config sievedir /var/lib/imap/sieve)
|
sieve_dir=$(get_config sievedir) || exit 1
|
||||||
db_cfg=${data_dir}/db.cfg
|
db_cfg=${data_dir}/db.cfg
|
||||||
db_current=${imap_prefix}/rpm/db.cfg.current
|
db_current=${imap_prefix}/rpm/db.cfg.current
|
||||||
db_cache=${imap_prefix}/rpm/db.cfg.cache
|
db_cache=${imap_prefix}/rpm/db.cfg.cache
|
||||||
@ -159,33 +224,37 @@ db_cache=${imap_prefix}/rpm/db.cfg.cache
|
|||||||
. $db_cfg
|
. $db_cfg
|
||||||
|
|
||||||
# get configured db backend config
|
# get configured db backend config
|
||||||
duplicate_db=$(get_config duplicate_db $duplicate_db)
|
duplicate_db=$(get_config duplicate_db $duplicate_db) || exit 1
|
||||||
mboxlist_db=$(get_config mboxlist_db $mboxlist_db)
|
mboxlist_db=$(get_config mboxlist_db $mboxlist_db) || exit 1
|
||||||
seenstate_db=$(get_config seenstate_db $seenstate_db)
|
seenstate_db=$(get_config seenstate_db $seenstate_db) || exit 1
|
||||||
subscription_db=$(get_config subscription_db $subscription_db)
|
subscription_db=$(get_config subscription_db $subscription_db) || exit 1
|
||||||
tlscache_db=$(get_config tlscache_db $tlscache_db)
|
tlscache_db=$(get_config tlscache_db $tlscache_db) || exit 1
|
||||||
annotation_db=$(get_config annotation_db $annotation_db)
|
annotation_db=$(get_config annotation_db $annotation_db) || exit 1
|
||||||
mboxkey_db=$(get_config mboxkey_db $mboxkey_db)
|
mboxkey_db=$(get_config mboxkey_db $mboxkey_db) || exit 1
|
||||||
ptscache_db=$(get_config ptscache_db $ptscache_db)
|
ptscache_db=$(get_config ptscache_db $ptscache_db) || exit 1
|
||||||
quota_db=$(get_config quota_db $quota_db)
|
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
|
# remember current db backend config
|
||||||
{
|
{
|
||||||
echo "duplicate_db=$duplicate_db"
|
echo "duplicate_db=${duplicate_db}"
|
||||||
echo "mboxlist_db=$mboxlist_db"
|
echo "mboxlist_db=${mboxlist_db}"
|
||||||
echo "seenstate_db=$seenstate_db"
|
echo "seenstate_db=${seenstate_db}"
|
||||||
echo "subscription_db=$subscription_db"
|
echo "subscription_db=${subscription_db}"
|
||||||
echo "tlscache_db=$tlscache_db"
|
echo "tlscache_db=${tlscache_db}"
|
||||||
echo "annotation_db=$annotation_db"
|
echo "annotation_db=${annotation_db}"
|
||||||
echo "mboxkey_db=$mboxkey_db"
|
echo "mboxkey_db=${mboxkey_db}"
|
||||||
echo "ptscache_db=$ptscache_db"
|
echo "ptscache_db=${ptscache_db}"
|
||||||
echo "quota_db=$quota_db"
|
echo "quota_db=${quota_db}"
|
||||||
echo "sieve_version=$sieve_version"
|
echo "statuscache_db=${statuscache_db}"
|
||||||
|
echo "userdeny_db=${userdeny_db}"
|
||||||
|
echo "sieve_version=${sieve_version}"
|
||||||
} | sort > $db_current
|
} | sort > $db_current
|
||||||
|
|
||||||
# file_type [file]
|
# file_type <file>
|
||||||
file_type() {
|
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
|
if echo "$this_type" | grep -qi skip > /dev/null 2>&1; then
|
||||||
echo skiplist
|
echo skiplist
|
||||||
elif echo "$this_type" | grep -qi text > /dev/null 2>&1; then
|
elif echo "$this_type" | grep -qi text > /dev/null 2>&1; then
|
||||||
@ -195,7 +264,7 @@ file_type() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# cvt_file [file] [db]
|
# cvt_file <file> <db>
|
||||||
cvt_file() {
|
cvt_file() {
|
||||||
target="$1"
|
target="$1"
|
||||||
new_db="$2"
|
new_db="$2"
|
||||||
@ -208,21 +277,21 @@ cvt_file() {
|
|||||||
if [ "$old_db" = "skiplist" ]; then
|
if [ "$old_db" = "skiplist" ]; then
|
||||||
cp -a "$target" "${target}.skiplist"
|
cp -a "$target" "${target}.skiplist"
|
||||||
else
|
else
|
||||||
$cvt_cyrusdb "$target" "$old_db" "${target}.skiplist" skiplist
|
$cvt_cyrusdb -C $IMAPDCONF "$target" "$old_db" "${target}.skiplist" skiplist
|
||||||
fi
|
fi
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
ERRVAL=$[ $ERRVAL + $RETVAL ]
|
ERRVAL=$(( $ERRVAL + $RETVAL ))
|
||||||
if [ $RETVAL -eq 0 ]; then
|
if [ $RETVAL -eq 0 ]; then
|
||||||
rm -f "$target"
|
rm -f "$target"
|
||||||
if [ -s "${target}.skiplist" ]; then
|
if [ -s "${target}.skiplist" ]; then
|
||||||
if [ "$new_db" = "skiplist" ]; then
|
if [ "$new_db" = "skiplist" ]; then
|
||||||
cp -a "${target}.skiplist" "$target"
|
cp -a "${target}.skiplist" "$target"
|
||||||
else
|
else
|
||||||
$cvt_cyrusdb "${target}.skiplist" skiplist "$target" "$new_db"
|
$cvt_cyrusdb -C $IMAPDCONF "${target}.skiplist" skiplist "$target" "$new_db"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
ERRVAL=$[ $ERRVAL + $RETVAL ]
|
ERRVAL=$(( $ERRVAL + $RETVAL ))
|
||||||
if [ $RETVAL -eq 0 ]; then
|
if [ $RETVAL -eq 0 ]; then
|
||||||
rm -f "${target}.skiplist"
|
rm -f "${target}.skiplist"
|
||||||
else
|
else
|
||||||
@ -235,18 +304,18 @@ cvt_file() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# cvt_to_utf8 [file]
|
# cvt_to_utf8 <file>
|
||||||
cvt_to_utf8() {
|
cvt_to_utf8() {
|
||||||
target="$1"
|
target="$1"
|
||||||
if [ -s "$target" ]; then
|
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"
|
iconv --from-code=ISO-8859-1 --to-code=UTF-8 --output="${target}.UTF-8" "$target"
|
||||||
if [ -s "${target}.UTF-8" ]; then
|
if [ -s "${target}.UTF-8" ]; then
|
||||||
# preserve timestamp
|
# preserve timestamp
|
||||||
touch --reference="$target" "${target}.UTF-8"
|
touch --reference="${target}" "${target}.UTF-8"
|
||||||
mv -f "${target}.UTF-8" "$target"
|
mv -f "${target}.UTF-8" "$target"
|
||||||
else
|
else
|
||||||
ERRVAL=$[ $ERRVAL + 1 ]
|
ERRVAL=$(( $ERRVAL + 1 ))
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
rm -f "${target}.sievec"
|
rm -f "${target}.sievec"
|
||||||
@ -257,7 +326,7 @@ ERRVAL=0
|
|||||||
|
|
||||||
# make sure our Berkeley databases are in a sane state
|
# make sure our Berkeley databases are in a sane state
|
||||||
# wait for db_checkpoint to end successfully or kill it after a timeout
|
# 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=$!
|
DB_CHECK_PID=$!
|
||||||
CNT=0
|
CNT=0
|
||||||
while [ $CNT -lt 60 ]; do
|
while [ $CNT -lt 60 ]; do
|
||||||
@ -275,43 +344,47 @@ if kill -0 $DB_CHECK_PID > /dev/null 2>&1; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# do a normal recovery
|
# do a normal recovery
|
||||||
db_recover -v -h $imap_prefix/db
|
db_recover -v -h ${imap_prefix}/db
|
||||||
RETVAL=$?
|
RETVAL=$?
|
||||||
if [ $RETVAL -ne 0 ]; then
|
if [ $RETVAL -ne 0 ]; then
|
||||||
# try a catastrophic recovery instead of normal recovery
|
# 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=$?
|
RETVAL=$?
|
||||||
ERRVAL=$[ $ERRVAL + $RETVAL ]
|
ERRVAL=$(( $ERRVAL + $RETVAL ))
|
||||||
if [ $RETVAL -ne 0 ]; then
|
if [ $RETVAL -ne 0 ]; then
|
||||||
echo "ERROR: catastrophic recovery of Berkeley databases failed"
|
echo "ERROR: catastrophic recovery of Berkeley databases failed"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$EXPORT" = "export" ]; then
|
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
|
# TODO: quota_db, we don't touch it for now
|
||||||
cvt_file $imap_prefix/deliver.db "skiplist"
|
cvt_file ${imap_prefix}/deliver.db "skiplist"
|
||||||
cvt_file $imap_prefix/mailboxes.db "skiplist"
|
cvt_file ${imap_prefix}/mailboxes.db "skiplist"
|
||||||
cvt_file $imap_prefix/tls_sessions.db "skiplist"
|
cvt_file ${imap_prefix}/tls_sessions.db "skiplist"
|
||||||
cvt_file $imap_prefix/annotations.db "skiplist"
|
cvt_file ${imap_prefix}/annotations.db "skiplist"
|
||||||
cvt_file $imap_prefix/ptclient/ptscache.db "skiplist"
|
cvt_file ${imap_prefix}/ptclient/ptscache.db "skiplist"
|
||||||
rm -vf $imap_prefix/db/log.*
|
cvt_file ${imap_prefix}/statuscache.db "skiplist"
|
||||||
rm -vf $imap_prefix/db/__db.*
|
cvt_file ${imap_prefix}/user_deny.db "flat"
|
||||||
|
rm -vf ${imap_prefix}/db/log.*
|
||||||
|
rm -vf ${imap_prefix}/db/__db.*
|
||||||
else
|
else
|
||||||
# always convert db files which have been converted to skiplist
|
# always convert db files which have been converted to skiplist
|
||||||
# TODO: quota_db, we don't touch it for now
|
# TODO: quota_db, we don't touch it for now
|
||||||
cvt_file $imap_prefix/deliver.db "$duplicate_db"
|
cvt_file ${imap_prefix}/deliver.db "$duplicate_db"
|
||||||
cvt_file $imap_prefix/mailboxes.db "$mboxlist_db"
|
cvt_file ${imap_prefix}/mailboxes.db "$mboxlist_db"
|
||||||
cvt_file $imap_prefix/tls_sessions.db "$tlscache_db"
|
cvt_file ${imap_prefix}/tls_sessions.db "$tlscache_db"
|
||||||
cvt_file $imap_prefix/annotations.db "$annotation_db"
|
cvt_file ${imap_prefix}/annotations.db "$annotation_db"
|
||||||
cvt_file $imap_prefix/ptclient/ptscache.db "$ptscache_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?
|
# do we have to convert all databases?
|
||||||
if ! cmp -s $db_current $db_cache; then
|
if ! cmp -s $db_current $db_cache; then
|
||||||
# we treat sieve scripts the same way like db files
|
# we treat sieve scripts the same way like db files
|
||||||
find ${sieve_dir}/ -name "*.script" -type f | while read db_file trash; do
|
find ${sieve_dir}/ -name "*.script" -type f | while read db_file trash; do
|
||||||
cvt_to_utf8 "$db_file"
|
cvt_to_utf8 "$db_file"
|
||||||
done
|
done
|
||||||
$masssievec $sievec
|
$masssievec $sievec $IMAPDCONF
|
||||||
# convert all db files left
|
# convert all db files left
|
||||||
find ${imap_prefix}/user/ -name "*.seen" -type f | while read db_file trash; do
|
find ${imap_prefix}/user/ -name "*.seen" -type f | while read db_file trash; do
|
||||||
cvt_file "$db_file" "$seenstate_db"
|
cvt_file "$db_file" "$seenstate_db"
|
||||||
|
@ -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
|
|
101
cyrus-imapd.spec
101
cyrus-imapd.spec
@ -1,11 +1,10 @@
|
|||||||
#TODO: merge all sub-packages (except -devel) into cyrus-imapd, they are all required
|
|
||||||
|
|
||||||
Name: cyrus-imapd
|
Name: cyrus-imapd
|
||||||
Version: 2.3.16
|
Version: 2.3.16
|
||||||
Release: 4%{?dist}
|
Release: 5%{?dist}
|
||||||
|
|
||||||
%define ssl_pem_file %{_sysconfdir}/pki/%{name}/%{name}.pem
|
%define ssl_pem_file %{_sysconfdir}/pki/%{name}/%{name}.pem
|
||||||
|
|
||||||
|
#uid/gid reserved, see setup:/usr/share/doc/setup*/uidgid
|
||||||
%define uid 76
|
%define uid 76
|
||||||
%define gid 76
|
%define gid 76
|
||||||
|
|
||||||
@ -18,43 +17,26 @@ License: BSD
|
|||||||
Group: System Environment/Daemons
|
Group: System Environment/Daemons
|
||||||
URL: http://cyrusimap.web.cmu.edu/
|
URL: http://cyrusimap.web.cmu.edu/
|
||||||
Source0: ftp://ftp.andrew.cmu.edu/pub/cyrus/%{name}-%{version}.tar.gz
|
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
|
Source5: cyrus-imapd.logrotate
|
||||||
Source6: cyrus-imapd.imap-2.3.x-conf
|
Source6: cyrus-imapd.imap-2.3.x-conf
|
||||||
Source7: cyrus-imapd.pam-config
|
Source7: cyrus-imapd.pam-config
|
||||||
Source8: http://email.uoa.gr/projects/cyrus/autocreate/README.autocreate-cyrus-2.3
|
Source8: http://email.uoa.gr/projects/cyrus/autocreate/README.autocreate-cyrus-2.3
|
||||||
Source9: http://email.uoa.gr/projects/cyrus/autosievefolder/README.autosievefolder
|
Source9: http://email.uoa.gr/projects/cyrus/autosievefolder/README.autosievefolder
|
||||||
Source10: http://oss.netfarm.it/download/skiplist.py
|
|
||||||
Source11: cyrus-imapd.init
|
Source11: cyrus-imapd.init
|
||||||
Source12: cyrus-imapd.sysconfig
|
Source12: cyrus-imapd.sysconfig
|
||||||
Source13: cyrus-imapd.cvt_cyrusdb_all
|
Source13: cyrus-imapd.cvt_cyrusdb_all
|
||||||
Source14: cyrus-imapd.magic
|
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
|
Source25: cyrus-imapd.cron-daily
|
||||||
Source26: cyrus-procmailrc
|
|
||||||
Source27: cyrus-imapd-procmail+cyrus.mc
|
Patch1: http://email.uoa.gr/download/cyrus/cyrus-imapd-2.3.16/cyrus-imapd-2.3.16-autocreate-0.10-0.diff
|
||||||
Source28: cyrus-imapd.rpm_set_permissions
|
|
||||||
Source29: cyrus-imapd-sendmail-8.12.9-cyrusv2.m4
|
Patch2: http://email.uoa.gr/download/cyrus/cyrus-imapd-2.3.16/cyrus-imapd-2.3.16-autosieve-0.6.0.diff
|
||||||
Source33: README.skiplist_recovery
|
|
||||||
Patch0: cyrus-imapd-2.2.12-no_transfig.patch
|
Patch4: http://www.oakton.edu/~jwade/cyrus/cyrus-imapd-2.1.3/cyrus-imapd-2.1.3-flock.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
|
|
||||||
Patch14: cyrus-imapd-2.3.1-authid_normalize.patch
|
Patch14: cyrus-imapd-2.3.1-authid_normalize.patch
|
||||||
|
|
||||||
Patch15: cyrus-imapd-2.3.1-make_md5_defaults.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
|
# https://bugzilla.redhat.com/show_bug.cgi?id=461875
|
||||||
Patch19: cyrus-imapd-2.3.12p2-current-db.patch
|
Patch19: cyrus-imapd-2.3.12p2-current-db.patch
|
||||||
@ -74,6 +56,7 @@ BuildRequires: flex, bison, groff, automake
|
|||||||
BuildRequires: openldap-devel
|
BuildRequires: openldap-devel
|
||||||
BuildRequires: krb5-devel
|
BuildRequires: krb5-devel
|
||||||
BuildRequires: net-snmp-devel
|
BuildRequires: net-snmp-devel
|
||||||
|
BuildRequires: transfig
|
||||||
|
|
||||||
Requires(post): e2fsprogs, chkconfig, initscripts, perl, grep, coreutils, findutils
|
Requires(post): e2fsprogs, chkconfig, initscripts, perl, grep, coreutils, findutils
|
||||||
Requires(preun): chkconfig, initscripts, coreutils
|
Requires(preun): chkconfig, initscripts, coreutils
|
||||||
@ -119,21 +102,13 @@ Summary: Cyrus IMAP server development files
|
|||||||
The %{name}-devel package contains header files and libraries
|
The %{name}-devel package contains header files and libraries
|
||||||
necessary for developing applications which use the imclient library.
|
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
|
%package utils
|
||||||
Group: Applications/System
|
Group: Applications/System
|
||||||
Summary: Cyrus IMAP server administration utilities
|
Summary: Cyrus IMAP server administration utilities
|
||||||
Requires(pre): shadow-utils
|
Requires(pre): shadow-utils
|
||||||
Requires(post): grep, coreutils, make, openssl
|
Requires(post): grep, coreutils, make, openssl
|
||||||
Requires(postun): shadow-utils
|
Requires(postun): shadow-utils
|
||||||
Requires: %{name}-perl = %{version}-%{release}
|
Obsoletes: %{name}-perl < 2.3.16-5
|
||||||
|
|
||||||
%description utils
|
%description utils
|
||||||
The %{name}-utils package contains administrative tools for the
|
The %{name}-utils package contains administrative tools for the
|
||||||
@ -142,27 +117,15 @@ one running the server.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch0 -p1 -b .no_transfig
|
|
||||||
%patch1 -p1 -b .autocreate
|
%patch1 -p1 -b .autocreate
|
||||||
%patch2 -p1 -b .autosieve
|
%patch2 -p1 -b .autosieve
|
||||||
%patch4 -p1 -b .flock
|
%patch4 -p1 -b .flock
|
||||||
%patch6 -p1 -b .getrlimit
|
|
||||||
%patch10 -p1 -b .acceptinvalidfrom
|
|
||||||
%patch12 -p1 -b .notify_sms
|
|
||||||
%patch14 -p1 -b .authid_normalize
|
%patch14 -p1 -b .authid_normalize
|
||||||
%patch15 -p1 -b .make_md5_defaults
|
%patch15 -p1 -b .make_md5_defaults
|
||||||
%patch18 -p1 -b .krb4
|
|
||||||
%patch19 -p1 -b .db4.7
|
%patch19 -p1 -b .db4.7
|
||||||
%patch20 -p1 -b .nodenny
|
%patch20 -p1 -b .nodenny
|
||||||
%patch21 -p1 -b .qos
|
%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
|
# only to update config.* files
|
||||||
automake -a -f -c || :
|
automake -a -f -c || :
|
||||||
aclocal -I cmulocal
|
aclocal -I cmulocal
|
||||||
@ -178,11 +141,13 @@ autoconf -f
|
|||||||
find . -type f -name "*.pl" | xargs %{__perl} -pi -e "s@/usr/local/bin/perl@%{__perl}@"
|
find . -type f -name "*.pl" | xargs %{__perl} -pi -e "s@/usr/local/bin/perl@%{__perl}@"
|
||||||
|
|
||||||
# modify lmtp socket path in .conf files
|
# 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
|
# enable idled in .conf files to prevent error messages
|
||||||
%{__perl} -pi -e "s/# idled/ idled/" master/conf/*.conf
|
%{__perl} -pi -e "s/# idled/ idled/" master/conf/*.conf
|
||||||
|
|
||||||
|
# Fix permissions on perl programs
|
||||||
|
find . -type f -name "*.pl" -exec %{__chmod} 755 {} \;
|
||||||
|
|
||||||
%build
|
%build
|
||||||
CPPFLAGS="$RPM_OPT_FLAGS -I%{_includedir}/et -I%{_includedir}/kerberosIV"; export CPPFLAGS
|
CPPFLAGS="$RPM_OPT_FLAGS -I%{_includedir}/et -I%{_includedir}/kerberosIV"; export CPPFLAGS
|
||||||
@ -218,9 +183,6 @@ LDFLAGS="$LDFLAGS -pie"; export LDFLAGS
|
|||||||
%install
|
%install
|
||||||
%{__rm} -rf %{buildroot}
|
%{__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
|
# This is needed to install the perl files correctly
|
||||||
pushd perl/imap
|
pushd perl/imap
|
||||||
%{__perl} Makefile.PL PREFIX=%{buildroot}%{_prefix} INSTALLDIRS=vendor
|
%{__perl} Makefile.PL PREFIX=%{buildroot}%{_prefix} INSTALLDIRS=vendor
|
||||||
@ -255,7 +217,6 @@ done
|
|||||||
|
|
||||||
# Install additional files
|
# Install additional files
|
||||||
%{__install} -m 755 %{SOURCE13} %{buildroot}%{_cyrexecdir}/cvt_cyrusdb_all
|
%{__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} -m 644 %{SOURCE14} %{buildroot}%{_datadir}/%{name}/rpm/magic
|
||||||
%{__install} -p -m 644 master/conf/prefork.conf %{buildroot}%{_sysconfdir}/cyrus.conf
|
%{__install} -p -m 644 master/conf/prefork.conf %{buildroot}%{_sysconfdir}/cyrus.conf
|
||||||
%{__install} -p -m 644 %{SOURCE6} %{buildroot}%{_sysconfdir}/imapd.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}
|
%{__install} -p -m 755 %{SOURCE25} %{buildroot}%{_sysconfdir}/cron.daily/%{name}
|
||||||
|
|
||||||
# Cleanup of doc dir
|
# Cleanup of doc dir
|
||||||
find doc perl -name CVS -type d | xargs -r %{__rm} -rf
|
find doc perl -name CVS -type d -prune -exec echo %{__rm} -rf {} \;
|
||||||
find doc perl -name .cvsignore -type f | xargs -r %{__rm} -f
|
find doc perl -name .cvsignore -type f -exec %{__rm} -rf {} \;
|
||||||
%{__rm} -f doc/Makefile.dist*
|
%{__rm} -f doc/Makefile.dist*
|
||||||
%{__rm} -f doc/text/htmlstrip.c
|
%{__rm} -f doc/text/htmlstrip.c
|
||||||
%{__rm} -f doc/text/Makefile
|
%{__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' \
|
%{__perl} -pi -e 's|fetchnews|cyrfetchnews|g;s|Fetchnews|Cyrfetchnews|g;s/FETCHNEWS/CYRFETCHNEWS/g' \
|
||||||
%{buildroot}%{_mandir}/man8/cyrfetchnews.8
|
%{buildroot}%{_mandir}/man8/cyrfetchnews.8
|
||||||
|
|
||||||
# compress manpages
|
|
||||||
[ -x /usr/lib/rpm/brp-compress ] && /usr/lib/rpm/brp-compress
|
|
||||||
|
|
||||||
#remove executable bit from docs
|
#remove executable bit from docs
|
||||||
for ddir in doc perl/imap/examples
|
for ddir in doc perl/imap/examples
|
||||||
do
|
do
|
||||||
@ -339,7 +297,7 @@ find %{buildroot}%{perl_vendorarch} -name "*.bs" -exec %{__rm} -f {} \;
|
|||||||
%post
|
%post
|
||||||
/sbin/chkconfig --add %{name}
|
/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 ||:
|
chattr -R +S $i %{_var}/lib/imap/{user,quota} %{_var}/spool/imap 2>/dev/null ||:
|
||||||
|
|
||||||
# Create SSL certificates
|
# Create SSL certificates
|
||||||
@ -374,14 +332,6 @@ if [ $1 != 0 ]; then
|
|||||||
/sbin/service %{name} condrestart >/dev/null 2>&1 || :
|
/sbin/service %{name} condrestart >/dev/null 2>&1 || :
|
||||||
fi
|
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
|
%files
|
||||||
%defattr(-,root,root,-)
|
%defattr(-,root,root,-)
|
||||||
%doc COPYRIGHT README
|
%doc COPYRIGHT README
|
||||||
@ -444,7 +394,6 @@ fi
|
|||||||
%{_cyrexecdir}/unexpunge
|
%{_cyrexecdir}/unexpunge
|
||||||
%{_cyrexecdir}/upgradesieve
|
%{_cyrexecdir}/upgradesieve
|
||||||
%{_cyrexecdir}/cvt_cyrusdb_all
|
%{_cyrexecdir}/cvt_cyrusdb_all
|
||||||
%{_cyrexecdir}/rpm_set_permissions
|
|
||||||
%{_cyrexecdir}/idled
|
%{_cyrexecdir}/idled
|
||||||
%{_cyrexecdir}/compile_sieve
|
%{_cyrexecdir}/compile_sieve
|
||||||
%{_cyrexecdir}/mupdate
|
%{_cyrexecdir}/mupdate
|
||||||
@ -489,11 +438,12 @@ fi
|
|||||||
%{_libdir}/lib*.a
|
%{_libdir}/lib*.a
|
||||||
%{_mandir}/man3/imclient.3*
|
%{_mandir}/man3/imclient.3*
|
||||||
|
|
||||||
%files perl
|
%files utils
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
%doc perl/imap/README
|
%doc perl/imap/README
|
||||||
%doc perl/imap/Changes
|
%doc perl/imap/Changes
|
||||||
%doc perl/imap/examples
|
%doc perl/imap/examples
|
||||||
|
%{_bindir}/*
|
||||||
%dir %{perl_vendorarch}/Cyrus
|
%dir %{perl_vendorarch}/Cyrus
|
||||||
%dir %{perl_vendorarch}/Cyrus/IMAP
|
%dir %{perl_vendorarch}/Cyrus/IMAP
|
||||||
%{perl_vendorarch}/Cyrus/IMAP/Admin.pm
|
%{perl_vendorarch}/Cyrus/IMAP/Admin.pm
|
||||||
@ -514,13 +464,16 @@ fi
|
|||||||
%{_mandir}/man3/Cyrus::IMAP.3pm.gz
|
%{_mandir}/man3/Cyrus::IMAP.3pm.gz
|
||||||
%{_mandir}/man3/Cyrus::IMAP::IMSP.3pm.gz
|
%{_mandir}/man3/Cyrus::IMAP::IMSP.3pm.gz
|
||||||
%{_mandir}/man3/Cyrus::SIEVE::managesieve.3pm.gz
|
%{_mandir}/man3/Cyrus::SIEVE::managesieve.3pm.gz
|
||||||
|
|
||||||
%files utils
|
|
||||||
%defattr(0644,root,root,0755)
|
|
||||||
%attr(0755,root,root) %{_bindir}/*
|
|
||||||
%{_mandir}/man1/*
|
%{_mandir}/man1/*
|
||||||
|
|
||||||
%changelog
|
%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
|
* Tue Jun 01 2010 Marcela Maslanova <mmaslano@redhat.com> - 2.3.16-4
|
||||||
- Mass rebuild with perl-5.12.0
|
- Mass rebuild with perl-5.12.0
|
||||||
|
|
||||||
|
@ -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
|
|
129
cyrus-procmailrc
129
cyrus-procmailrc
@ -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
|
|
||||||
##############################
|
|
@ -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
|
|
||||||
##############################
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
46
folderxfer
46
folderxfer
@ -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;
|
|
||||||
|
|
||||||
|
|
159
imapcreate.pl
159
imapcreate.pl
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
36
inboxfer
36
inboxfer
@ -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/$_");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
172
skiplist.py
172
skiplist.py
@ -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])
|
|
Loading…
Reference in New Issue
Block a user