]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/cyrus-imapd-2.2.12-autosievefolder-0.6.diff
Pakfire laedt die Listen jetzt besser und hat eine veraenderte Oberflaeche bekommen.
[ipfire-2.x.git] / src / patches / cyrus-imapd-2.2.12-autosievefolder-0.6.diff
CommitLineData
b40388bb
MT
1diff -Naur cyrus-imapd-2.2.12/README.autosievefolder cyrus-imapd-2.2.12-autosieve.uncompiled/README.autosievefolder
2--- cyrus-imapd-2.2.12/README.autosievefolder 1970-01-01 02:00:00 +0200
3+++ cyrus-imapd-2.2.12-autosieve.uncompiled/README.autosievefolder 2005-02-15 13:59:51 +0200
4@@ -0,0 +1,42 @@
5+Cyrus IMAP autosievefolder patch
6+----------------------------------
7+
8+NOTE : This patch has been created at the University of Athens. For more info, as well
9+as more patches on Cyrus IMAPD server, please visit http://email.uoa.gr
10+
11+
12+ When the lmtpd daemon receives an email message prior to delivering it to the
13+INBOX folder of the user, checks if the user has specified sieve filters. If the
14+user has specified sieve filters the filters are evaluated. If the message matches
15+any of the filters the action that is specified in the filter is executed. If the action
16+is FileInto it is stored in the subfolder specified in the filter. If the
17+subfolder doesn't exist then the message is sent to the INBOX folder of the user.
18+
19+ With this patch if the folder doesn't exist AND the name of the subfolder is
20+specified in the autosievefolders option, OR the anysievefolder is set to
21+yes in the cyrus-imap configuration file then the subfolder is created and the mail
22+is stored there.
23+
24+
25+Check the following options of the imapd.conf file
26+==================================================
27+
28+* anysievefolder : It must be "yes" in order to permit the autocreation of any
29+INBOX subfolder requested by a sieve filter, through the "fileinto" action. (default = no)
30+* autosievefolders : It is a "|" separated list of subfolders of INBOX that will be
31+automatically created, if requested by a sieve filter, through the "fileinto"
32+action. (default = null)
33+ i.e. autosievefolders: Junk | Spam
34+
35+WARNING: anysievefolder, takes precedence over autosievefolders . Which means that if
36+anysievefolder is set to "yes", cyrus will create any INBOX subfolder requested, no-matter what the value of autosievefolders is.
37+
38+
39+Things to be done
40+=================
41+
42+1. Support cyrus wildcards in the autosievefolders option.
43+
44+
45+For more information and updates please visit http://email.uoa.gr/projects/cyrus/autosievefolder
46+
47diff -Naur cyrus-imapd-2.2.12/imap/lmtp_sieve.c cyrus-imapd-2.2.12-autosieve.uncompiled/imap/lmtp_sieve.c
48--- cyrus-imapd-2.2.12/imap/lmtp_sieve.c 2004-06-01 16:47:16 +0300
49+++ cyrus-imapd-2.2.12-autosieve.uncompiled/imap/lmtp_sieve.c 2005-02-15 13:59:51 +0200
50@@ -72,6 +72,8 @@
51 #include "util.h"
52 #include "version.h"
53 #include "xmalloc.h"
54+#include "imap_err.h"
55+
56
57 static int sieve_usehomedir = 0;
58 static const char *sieve_dir = NULL;
59@@ -98,6 +100,9 @@
60 int quotaoverride,
61 int acloverride);
62
63+static int autosieve_subfolder(char *userid, struct auth_state *auth_state,
64+ char *subfolder, struct namespace *namespace);
65+
66 static char *make_sieve_db(const char *user)
67 {
68 static char buf[MAX_MAILBOX_PATH+1];
69@@ -312,6 +317,7 @@
70 }
71
72
73+
74 static int sieve_redirect(void *ac,
75 void *ic __attribute__((unused)),
76 void *sc, void *mc, const char **errmsg)
77@@ -444,7 +450,18 @@
78 sd->username, mdata->notifyheader,
79 namebuf, quotaoverride, 0);
80 }
81-
82+ if (ret == IMAP_MAILBOX_NONEXISTENT) {
83+ /* if "plus" folder under INBOX, then try to create it */
84+ syslog(LOG_DEBUG, "calling autosieve folder for : %s", namebuf);
85+ ret = autosieve_subfolder((char *) sd->username, sd->authstate, namebuf, mdata->namespace);
86+
87+ if (!ret)
88+ ret = deliver_mailbox(md->data, mdata->stage, md->size,
89+ fc->imapflags->flag, fc->imapflags->nflags,
90+ (char *) sd->username, sd->authstate, md->id,
91+ sd->username, mdata->notifyheader,
92+ namebuf, quotaoverride, 0);
93+ }
94 if (!ret) {
95 snmp_increment(SIEVE_FILEINTO, 1);
96 return SIEVE_OK;
97@@ -882,3 +899,77 @@
98
99 return r;
100 }
101+
102+
103+#define SEP '|'
104+
105+static int autosieve_subfolder(char *userid, struct auth_state *auth_state,
106+ char *subfolder, struct namespace *namespace)
107+{
108+ char option_name_external[MAX_MAILBOX_NAME + 1];
109+ char option_name_internal[MAX_MAILBOX_NAME + 1];
110+ const char *subf ;
111+ char *p, *q, *next_subf;
112+ int len, r = 0;
113+ int createsievefolder = 0;
114+
115+ /* Check if subfolder or userid are NULL */
116+ if(subfolder == NULL || userid == NULL)
117+ return IMAP_MAILBOX_NONEXISTENT;
118+
119+ if (config_getswitch(IMAPOPT_ANYSIEVEFOLDER))
120+ createsievefolder = 1;
121+ else if ((subf = config_getstring(IMAPOPT_AUTOSIEVEFOLDERS)) != NULL) {
122+ /* Roll through subf */
123+ next_subf = (char *) subf;
124+ while (*next_subf) {
125+ for (p = next_subf ; isspace((int) *p) || *p == SEP ; p++);
126+ for (next_subf = p ; *next_subf && *next_subf != SEP ; next_subf++);
127+ for (q = next_subf ; q > p && (isspace((int) *q) || *q == SEP || !*q); q--);
128+
129+ if (!*p) continue;
130+
131+ len = q - p + 1;
132+ /*
133+ * This is a preliminary length check based on the assumption
134+ * that the *final* internal format will be something
135+ * like user.userid.subfolder(s).
136+ */
137+ if (len > sizeof(option_name_external) - strlen(userid) - 5)
138+ return IMAP_MAILBOX_BADNAME;
139+
140+ strlcpy(option_name_external, namespace->prefix[NAMESPACE_INBOX], sizeof(option_name_external));
141+ strncat(option_name_external, p, len);
142+
143+ /*
144+ * Transform the option folder name to internal namespace and compare it
145+ * with what must be created.
146+ */
147+ r = namespace->mboxname_tointernal(namespace, option_name_external, userid, option_name_internal);
148+ if (r) continue;
149+
150+ if (!strcmp(option_name_internal, subfolder)) {
151+ createsievefolder = 1;
152+ break;
153+ }
154+ }
155+ }
156+
157+ if (createsievefolder) {
158+ /* Folder is already in internal namespace format */
159+ r = mboxlist_createmailbox(subfolder, MAILBOX_FORMAT_NORMAL, NULL,
160+ 1, userid, auth_state, 0, 0, 0);
161+ if (!r) {
162+ mboxlist_changesub(subfolder, userid, auth_state, 1, 1);
163+ syslog(LOG_DEBUG, "autosievefolder: User %s, folder %s creation succeeded.",
164+ userid, subfolder);
165+ return 0;
166+ } else {
167+ syslog(LOG_ERR, "autosievefolder: User %s, folder %s creation failed. %s",
168+ userid, subfolder,error_message(r));
169+ return r;
170+ }
171+ } else
172+ return IMAP_MAILBOX_NONEXISTENT;
173+}
174+
175diff -Naur cyrus-imapd-2.2.12/lib/imapoptions cyrus-imapd-2.2.12-autosieve.uncompiled/lib/imapoptions
176--- cyrus-imapd-2.2.12/lib/imapoptions 2004-07-21 22:07:45 +0300
177+++ cyrus-imapd-2.2.12-autosieve.uncompiled/lib/imapoptions 2005-02-15 13:59:51 +0200
178@@ -752,6 +752,15 @@
179 /* If enabled, lmtpd will look for Sieve scripts in user's home
180 directories: ~user/.sieve. */
181
182+{ "anysievefolder", 0, SWITCH }
183+/* It must be "yes" in order to permit the autocreation of any INBOX subfolder
184+ requested by a sieve filter, through the "fileinto" action. (default = no) */
185+
186+{ "autosievefolders", NULL, STRING }
187+/* It is a "|" separated list of subfolders of INBOX that will be automatically created,
188+ if requested by a sieve filter, through the "fileinto" action. (default = null)
189+ i.e. autosievefolders: Junk | Spam */
190+
191 { "singleinstancestore", 1, SWITCH }
192 /* If enabled, lmtpd and nntpd attempt to only write one copy of a message per
193 partition and create hard links, resulting in a potentially large