]>
Commit | Line | Data |
---|---|---|
e0859999 AM |
1 | commit 98b5e06d18f6a95695833afaa4b9bc1f256648df |
2 | Author: Johannes Berg <johannes@sipsolutions.net> | |
3 | Date: Mon Nov 7 11:00:25 2011 +0100 | |
4 | ||
5 | small whitespace fix | |
6 | ||
7 | diff --git a/antispam-storage-2.0.c b/antispam-storage-2.0.c | |
8 | index 5a089bc..3e67553 100644 | |
9 | --- a/antispam-storage-2.0.c | |
10 | +++ b/antispam-storage-2.0.c | |
11 | @@ -472,7 +472,7 @@ static void antispam_mailbox_allocated(struct mailbox *box) | |
12 | ||
13 | asbox->save_hack = FALSE; | |
14 | asbox->movetype = MMT_APPEND; | |
15 | - asbox->cfg = asuser->cfg; | |
16 | + asbox->cfg = asuser->cfg; | |
17 | ||
18 | v->free = antispam_mailbox_free; | |
19 | ||
20 | ||
21 | commit ecaa554d472002a001bc2b91526cecaf2f21a480 | |
22 | Author: Johannes Berg <johannes@sipsolutions.net> | |
23 | Date: Fri Feb 24 20:22:48 2012 +0100 | |
24 | ||
25 | allow multiple spam/not_spam arguments | |
26 | ||
27 | Some tools need multiple different arguments, | |
28 | so introduce configuration for that. | |
29 | ||
30 | diff --git a/antispam-plugin.h b/antispam-plugin.h | |
31 | index 280bb12..5bd3f06 100644 | |
32 | --- a/antispam-plugin.h | |
33 | +++ b/antispam-plugin.h | |
34 | @@ -98,8 +98,10 @@ struct antispam_config { | |
35 | int extra_env_num; | |
36 | } crm; | |
37 | struct { | |
38 | - const char *spam_arg; | |
39 | - const char *ham_arg; | |
40 | + char **spam_args; | |
41 | + int spam_args_num; | |
42 | + char **ham_args; | |
43 | + int ham_args_num; | |
44 | const char *pipe_binary;// = "/usr/sbin/sendmail"; | |
45 | const char *tmpdir;// = "/tmp"; | |
46 | char **extra_args; | |
47 | diff --git a/antispam.7 b/antispam.7 | |
48 | index 5e33e4c..d87db93 100644 | |
49 | --- a/antispam.7 | |
50 | +++ b/antispam.7 | |
51 | @@ -228,6 +228,14 @@ plugin { | |
52 | # "mailtrain" are still valid, these are, in the same order as | |
53 | # above: antispam_mail_sendmail, antispam_mail_sendmail_args, | |
54 | # antispam_mail_spam, antispam_mail_notspam and antispam_mail_tmpdir. | |
55 | + # | |
56 | + # Alternatively, if you need to give multiple options, you can use | |
57 | + # the spam_args/notspam_args parameters (which are used in preference | |
58 | + # of the singular form): | |
59 | + # antispam_pipe_program_spam_args = --spam;--my-other-param1 | |
60 | + # antispam_pipe_program_notspam_args = --ham;--my-other-param2 | |
61 | + # which will then call | |
62 | + # /path/to/mailtrain --for jberg --spam --my-other-param1 | |
63 | ||
64 | # temporary directory | |
65 | antispam_pipe_tmpdir = /tmp | |
66 | diff --git a/pipe.c b/pipe.c | |
67 | index 18c2233..a20b4aa 100644 | |
68 | --- a/pipe.c | |
69 | +++ b/pipe.c | |
70 | @@ -34,16 +34,19 @@ | |
71 | static int run_pipe(const struct antispam_config *cfg, | |
72 | int mailfd, enum classification wanted) | |
73 | { | |
74 | - const char *dest; | |
75 | + char **dest; | |
76 | + int dest_num; | |
77 | pid_t pid; | |
78 | int status; | |
79 | ||
80 | switch (wanted) { | |
81 | case CLASS_SPAM: | |
82 | - dest = cfg->pipe.spam_arg; | |
83 | + dest = cfg->pipe.spam_args; | |
84 | + dest_num = cfg->pipe.spam_args_num; | |
85 | break; | |
86 | case CLASS_NOTSPAM: | |
87 | - dest = cfg->pipe.ham_arg; | |
88 | + dest = cfg->pipe.ham_args; | |
89 | + dest_num = cfg->pipe.spam_args_num; | |
90 | break; | |
91 | } | |
92 | ||
93 | @@ -65,18 +68,23 @@ static int run_pipe(const struct antispam_config *cfg, | |
94 | return WEXITSTATUS(status); | |
95 | } else { | |
96 | char **argv; | |
97 | - int sz = sizeof(char *) * (2 + cfg->pipe.extra_args_num + 1); | |
98 | - int i, fd; | |
99 | + int sz = sizeof(char *) * (2 + cfg->pipe.extra_args_num + dest_num + 1); | |
100 | + int i, j, fd; | |
101 | ||
102 | argv = i_malloc(sz); | |
103 | memset(argv, 0, sz); | |
104 | ||
105 | argv[0] = (char *) cfg->pipe.pipe_binary; | |
106 | ||
107 | - for (i = 0; i < cfg->pipe.extra_args_num; i++) | |
108 | + for (i = 0; i < cfg->pipe.extra_args_num; i++) { | |
109 | argv[i + 1] = (char *) cfg->pipe.extra_args[i]; | |
110 | + debug(&cfg->dbgcfg, "running mailtrain backend program parameter %d %s", i + 1, argv[i + 1]); | |
111 | + } | |
112 | ||
113 | - argv[i + 1] = (char *) dest; | |
114 | + for (j = 0; j < dest_num; j++) { | |
115 | + argv[i + 1 + j] = (char *) dest[j]; | |
116 | + debug(&cfg->dbgcfg, "running mailtrain backend program parameter %d %s", i + 1 + j, argv[i + 1 + j]); | |
117 | + } | |
118 | ||
119 | dup2(mailfd, 0); | |
120 | fd = open("/dev/null", O_WRONLY); | |
121 | @@ -228,7 +236,7 @@ static int backend_handle_mail(const struct antispam_config *cfg, | |
122 | return -1; | |
123 | } | |
124 | ||
125 | - if (!cfg->pipe.ham_arg || !cfg->pipe.spam_arg) { | |
126 | + if (!cfg->pipe.ham_args || !cfg->pipe.spam_args) { | |
127 | mail_storage_set_error(t->box->storage, | |
128 | ME(NOTPOSSIBLE) | |
129 | "antispam plugin not configured"); | |
130 | @@ -316,20 +324,50 @@ static void backend_init(struct antispam_config *cfg, | |
131 | const char *tmp; | |
132 | int i; | |
133 | ||
134 | - tmp = getenv("PIPE_PROGRAM_SPAM_ARG", getenv_data); | |
135 | - if (!tmp) | |
136 | - tmp = getenv("MAIL_SPAM", getenv_data); | |
137 | + tmp = getenv("PIPE_PROGRAM_SPAM_ARGS", getenv_data); | |
138 | if (tmp) { | |
139 | - cfg->pipe.spam_arg = tmp; | |
140 | - debug(&cfg->dbgcfg, "pipe backend spam argument = %s\n", tmp); | |
141 | + cfg->pipe.spam_args = p_strsplit(cfg->mem_pool, tmp, ";"); | |
142 | + cfg->pipe.spam_args_num = str_array_length( | |
143 | + (const char *const *)cfg->pipe.spam_args); | |
144 | + for (i = 0; i < cfg->pipe.spam_args_num; i++) | |
145 | + debug(&cfg->dbgcfg, "pipe backend spam arg[%d] = %s\n", | |
146 | + i, cfg->pipe.spam_args[i]); | |
147 | + } else { | |
148 | + tmp = getenv("PIPE_PROGRAM_SPAM_ARG", getenv_data); | |
149 | + if (!tmp) | |
150 | + tmp = getenv("MAIL_SPAM", getenv_data); | |
151 | + if (tmp) { | |
152 | + /* bit of a hack */ | |
153 | + cfg->pipe.spam_args = | |
154 | + p_strsplit(cfg->mem_pool, tmp, "\x01"); | |
155 | + cfg->pipe.spam_args_num = 1; | |
156 | + debug(&cfg->dbgcfg, | |
157 | + "pipe backend spam argument = %s\n", tmp); | |
158 | + tmp = NULL; | |
159 | + } | |
160 | } | |
161 | ||
162 | - tmp = getenv("PIPE_PROGRAM_NOTSPAM_ARG", getenv_data); | |
163 | - if (!tmp) | |
164 | - tmp = getenv("MAIL_NOTSPAM", getenv_data); | |
165 | + tmp = getenv("PIPE_PROGRAM_NOTSPAM_ARGS", getenv_data); | |
166 | if (tmp) { | |
167 | - cfg->pipe.ham_arg = tmp; | |
168 | - debug(&cfg->dbgcfg, "pipe backend not-spam argument = %s\n", tmp); | |
169 | + cfg->pipe.ham_args = p_strsplit(cfg->mem_pool, tmp, ";"); | |
170 | + cfg->pipe.ham_args_num = str_array_length( | |
171 | + (const char *const *)cfg->pipe.ham_args); | |
172 | + for (i = 0; i < cfg->pipe.ham_args_num; i++) | |
173 | + debug(&cfg->dbgcfg, "pipe backend ham arg[%d] = %s\n", | |
174 | + i, cfg->pipe.ham_args[i]); | |
175 | + } else { | |
176 | + tmp = getenv("PIPE_PROGRAM_NOTSPAM_ARG", getenv_data); | |
177 | + if (!tmp) | |
178 | + tmp = getenv("MAIL_NOTSPAM", getenv_data); | |
179 | + if (tmp) { | |
180 | + /* bit of a hack */ | |
181 | + cfg->pipe.ham_args = | |
182 | + p_strsplit(cfg->mem_pool, tmp, "\x01"); | |
183 | + cfg->pipe.ham_args_num = 1; | |
184 | + debug(&cfg->dbgcfg, | |
185 | + "pipe backend not-spam argument = %s\n", tmp); | |
186 | + tmp = NULL; | |
187 | + } | |
188 | } | |
189 | ||
190 | tmp = getenv("PIPE_PROGRAM", getenv_data); | |
191 | ||
192 | commit d5f9b770ecc6cd6226d8d4806844eb615307e00e | |
193 | Author: Ron <ron@debian.org> | |
194 | Date: Sat Mar 24 22:12:45 2012 +1030 | |
195 | ||
196 | Fix dspam config example in antispam.7 | |
197 | ||
198 | Move some dspam configuration out of the crm114 section. | |
199 | Thanks to Benoît Knecht for catching this. Closes: #663721 | |
200 | ||
201 | diff --git a/antispam.7 b/antispam.7 | |
202 | index d87db93..5d077f0 100644 | |
203 | --- a/antispam.7 | |
204 | +++ b/antispam.7 | |
205 | @@ -1,4 +1,4 @@ | |
206 | -.TH ANTISPAM 7 "15 October 2007" "" "" | |
207 | +.TH ANTISPAM 7 "24 March 2012" "" "" | |
208 | .SH NAME | |
209 | antispam \- The dovecot antispam plugin. | |
210 | ||
211 | @@ -206,6 +206,11 @@ plugin { | |
212 | # semicolon-separated list of blacklisted results, case insensitive | |
213 | # antispam_dspam_result_blacklist = Virus | |
214 | ||
215 | + # semicolon-separated list of environment variables to set | |
216 | + # (default unset i.e. none) | |
217 | + # antispam_dspam_env = | |
218 | + # antispam_dspam_env = HOME=%h;USER=%u | |
219 | + | |
220 | #===================== | |
221 | # pipe plugin | |
222 | # | |
223 | @@ -255,7 +260,7 @@ plugin { | |
224 | antispam_crm_binary = /bin/false | |
225 | # antispam_crm_binary = /usr/share/crm114/mailreaver.crm | |
226 | ||
227 | - # semicolon-separated list of extra arguments to dspam | |
228 | + # semicolon-separated list of extra arguments to crm114 | |
229 | # (default unset i.e. none) | |
230 | # antispam_crm_args = | |
231 | # antispam_crm_args = --config=/path/to/config | |
232 | @@ -265,11 +270,6 @@ plugin { | |
233 | # antispam_crm_env = | |
234 | # antispam_crm_env = HOME=%h;USER=%u | |
235 | ||
236 | - # semicolon-separated list of environment variables to set | |
237 | - # (default unset i.e. none) | |
238 | - # antispam_dspam_env = | |
239 | - # antispam_dspam_env = HOME=%h;USER=%u | |
240 | - | |
241 | # NOTE: you need to set the signature for this backend | |
242 | antispam_signature = X-CRM114-CacheID | |
243 | ||
244 | ||
245 | commit 83b0b4b8a5e85f70025fbb874c30d3e28ad01f56 | |
246 | Author: Ron <ron@debian.org> | |
247 | Date: Thu Sep 27 11:27:20 2012 +0200 | |
248 | ||
249 | make it work for dovecot 2.1 | |
250 | ||
251 | This patch from me/Ron tweaks the code to use | |
252 | the same backends for dovecot 2.1 as for 2.0. | |
253 | ||
254 | diff --git a/antispam-plugin.h b/antispam-plugin.h | |
255 | index 5bd3f06..72b906d 100644 | |
256 | --- a/antispam-plugin.h | |
257 | +++ b/antispam-plugin.h | |
258 | @@ -262,7 +262,7 @@ o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED) | |
259 | { | |
260 | return o_stream_create_fd(fd, 0, TRUE); | |
261 | } | |
262 | -#elif DOVECOT_IS_EQ(2, 0) | |
263 | +#elif DOVECOT_IS_EQ(2, 0) || DOVECOT_IS_EQ(2, 1) | |
264 | #define mempool_unref pool_unref | |
265 | #define module_arg struct module * | |
266 | #define ME(err) MAIL_ERROR_ ##err, | |
267 | diff --git a/dovecot-version.c b/dovecot-version.c | |
268 | index cbcb35b..0026fbf 100644 | |
269 | --- a/dovecot-version.c | |
270 | +++ b/dovecot-version.c | |
271 | @@ -17,21 +17,24 @@ int main(int argc, char **argv) | |
272 | ||
273 | maj = strtol(v, &e, 10); | |
274 | if (v == e) | |
275 | - return 1; | |
276 | + return 2; | |
277 | ||
278 | v = e + 1; | |
279 | ||
280 | min = strtol(v, &e, 10); | |
281 | if (v == e) | |
282 | - return 1; | |
283 | + return 3; | |
284 | ||
285 | /* not end of string yet? */ | |
286 | if (*e) { | |
287 | v = e + 1; | |
288 | ||
289 | - patch = strtol(v, &e, 10); | |
290 | - if (v == e) | |
291 | - return 1; | |
292 | + if (isdigit(*v)) { | |
293 | + patch = strtol(v, &e, 10); | |
294 | + if (v == e) | |
295 | + return 4; | |
296 | + } else | |
297 | + patch = 255; | |
298 | } | |
299 | ||
300 | printf("/* Auto-generated file, do not edit */\n\n"); | |
301 | @@ -50,6 +53,11 @@ int main(int argc, char **argv) | |
302 | "DOVECOT_VCODE < DOVECOT_VERSION_CODE(maj, min, 0)\n"); | |
303 | printf("#define DOVECOT_IS_LE(maj, min) " | |
304 | "DOVECOT_VCODE <= DOVECOT_VERSION_CODE(maj, min, 0)\n"); | |
305 | + | |
306 | + /* Use the antispam-storage-2.0.c for dovecot 2.1 as well */ | |
307 | + if (maj == 2 && min == 1) | |
308 | + min = 0; | |
309 | + | |
310 | printf("#define ANTISPAM_STORAGE " | |
311 | "\"antispam-storage-%d.%d.c\"\n", maj, min); | |
312 | ||
313 | ||
314 | commit 8e2caa4c2ad42feb65a0693711f73f17f417fb87 | |
315 | Author: Johannes Berg <johannes@sipsolutions.net> | |
316 | Date: Wed Aug 21 22:33:37 2013 +0200 | |
317 | ||
318 | remove unnecessary dict code | |
319 | ||
320 | I long removed the signature-log backend, so the support code | |
321 | for it to use dovecot's dict API across multiple version is | |
322 | really no longer needed - kill it. | |
323 | ||
324 | This was reported to me (indirectly) by Micah Anderson, thanks. | |
325 | ||
326 | diff --git a/antispam-plugin.h b/antispam-plugin.h | |
327 | index 72b906d..0c3f18e 100644 | |
328 | --- a/antispam-plugin.h | |
329 | +++ b/antispam-plugin.h | |
330 | @@ -10,7 +10,6 @@ | |
331 | #include "client.h" | |
332 | #endif | |
333 | #include "ostream.h" | |
334 | -#include "dict.h" | |
335 | #include "imap-search.h" | |
336 | #include <stdlib.h> | |
337 | ||
338 | @@ -206,12 +205,6 @@ o_stream_create_from_fd(int fd, pool_t pool) | |
339 | return o_stream_create_file(fd, pool, 0, TRUE); | |
340 | } | |
341 | ||
342 | -static inline struct dict * | |
343 | -string_dict_init(const char *uri, const char *username) | |
344 | -{ | |
345 | - return dict_init(uri, username); | |
346 | -} | |
347 | - | |
348 | static inline int _mail_get_stream(struct mail *mail, | |
349 | struct message_size *hdr_size, | |
350 | struct message_size *body_size, | |
351 | @@ -281,12 +274,6 @@ o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED) | |
352 | { | |
353 | return o_stream_create_fd(fd, 0, TRUE); | |
354 | } | |
355 | - | |
356 | -static inline struct dict * | |
357 | -string_dict_init(const char *uri, const char *username) | |
358 | -{ | |
359 | - return dict_init(uri, DICT_DATA_TYPE_STRING, username, NULL); | |
360 | -} | |
361 | #else | |
362 | #error "Building against this dovecot version is not supported" | |
363 | #endif | |
364 | ||
365 | commit c2d97b386177d945581574e74690d773a6231338 | |
366 | Author: Micah Anderson <micah@riseup.net> | |
367 | Date: Wed Aug 21 21:25:41 2013 -0400 | |
368 | ||
369 | make things work for dovecot 2.2 | |
370 | ||
371 | diff --git a/antispam-plugin.h b/antispam-plugin.h | |
372 | index 0c3f18e..a06f7be 100644 | |
373 | --- a/antispam-plugin.h | |
374 | +++ b/antispam-plugin.h | |
375 | @@ -255,7 +255,7 @@ o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED) | |
376 | { | |
377 | return o_stream_create_fd(fd, 0, TRUE); | |
378 | } | |
379 | -#elif DOVECOT_IS_EQ(2, 0) || DOVECOT_IS_EQ(2, 1) | |
380 | +#elif DOVECOT_IS_EQ(2, 0) || DOVECOT_IS_EQ(2, 1) || DOVECOT_IS_EQ(2, 2) | |
381 | #define mempool_unref pool_unref | |
382 | #define module_arg struct module * | |
383 | #define ME(err) MAIL_ERROR_ ##err, | |
384 | ||
385 | commit abdad24e671da556682fb1bca2a076bc8686025a | |
386 | Author: Ron <ron@debian.org> | |
387 | Date: Thu Sep 12 18:49:34 2013 +0930 | |
388 | ||
389 | More tweaks for dovecot 2.2 | |
390 | ||
391 | Use antispam-storage-2.0.c for 2.2 as well. | |
392 | Dovecot 2.2 now checks for a real ABI version string rather than | |
393 | just the release version. | |
394 | ||
4c03318d | 395 | diff --git a/antispam-plugin.c b/antispam-plugin.c |
e0859999 AM |
396 | index 7756204..103b5fb 100644 |
397 | --- a/antispam-plugin.c | |
398 | +++ b/antispam-plugin.c | |
399 | @@ -392,4 +392,8 @@ void PLUGIN_FUNCTION(deinit)(void) | |
400 | } | |
401 | ||
402 | /* put dovecot version we built against into plugin for checking */ | |
403 | +#if DOVECOT_IS_GE(2,2) | |
404 | +const char *PLUGIN_FUNCTION(version) = DOVECOT_ABI_VERSION; | |
405 | +#else | |
406 | const char *PLUGIN_FUNCTION(version) = PACKAGE_VERSION; | |
407 | +#endif | |
408 | diff --git a/dovecot-version.c b/dovecot-version.c | |
409 | index 0026fbf..e7e7cf2 100644 | |
410 | --- a/dovecot-version.c | |
411 | +++ b/dovecot-version.c | |
412 | @@ -54,8 +54,8 @@ int main(int argc, char **argv) | |
413 | printf("#define DOVECOT_IS_LE(maj, min) " | |
414 | "DOVECOT_VCODE <= DOVECOT_VERSION_CODE(maj, min, 0)\n"); | |
415 | ||
416 | - /* Use the antispam-storage-2.0.c for dovecot 2.1 as well */ | |
417 | - if (maj == 2 && min == 1) | |
418 | + /* Use the antispam-storage-2.0.c for dovecot 2.1 and 2.2 as well */ | |
419 | + if (maj == 2 && min < 3) | |
420 | min = 0; | |
421 | ||
422 | printf("#define ANTISPAM_STORAGE " | |
423 | ||
424 | commit 446b62b634db89054073e0484626c5c4623d9903 | |
425 | Author: Johannes Berg <johannes@sipsolutions.net> | |
426 | Date: Fri Oct 24 17:33:21 2014 +0200 | |
427 | ||
428 | add version check macros to check for dovecot patchlevel | |
429 | ||
430 | Add a new set of version check macros that also take the patchlevel. | |
431 | ||
432 | diff --git a/dovecot-version.c b/dovecot-version.c | |
433 | index e7e7cf2..623461a 100644 | |
434 | --- a/dovecot-version.c | |
435 | +++ b/dovecot-version.c | |
436 | @@ -34,7 +34,7 @@ int main(int argc, char **argv) | |
437 | if (v == e) | |
438 | return 4; | |
439 | } else | |
440 | - patch = 255; | |
441 | + patch = 0; | |
442 | } | |
443 | ||
444 | printf("/* Auto-generated file, do not edit */\n\n"); | |
445 | @@ -43,6 +43,8 @@ int main(int argc, char **argv) | |
446 | ||
447 | printf("#define DOVECOT_VCODE " | |
448 | "0x%.2x%.2x%.2x\n", maj, min, 0); | |
449 | + printf("#define DOVECOT_VCODE_PATCH " | |
450 | + "0x%.2x%.2x%.2x\n", maj, min, patch); | |
451 | printf("#define DOVECOT_IS_EQ(maj, min) " | |
452 | "DOVECOT_VCODE == DOVECOT_VERSION_CODE(maj, min, 0)\n"); | |
453 | printf("#define DOVECOT_IS_GT(maj, min) " | |
454 | @@ -54,6 +56,17 @@ int main(int argc, char **argv) | |
455 | printf("#define DOVECOT_IS_LE(maj, min) " | |
456 | "DOVECOT_VCODE <= DOVECOT_VERSION_CODE(maj, min, 0)\n"); | |
457 | ||
458 | + printf("#define DOVECOT_P_IS_EQ(maj, min, patch) " | |
459 | + "DOVECOT_VCODE_PATCH == DOVECOT_VERSION_CODE(maj, min, patch)\n"); | |
460 | + printf("#define DOVECOT_P_IS_GT(maj, min, patch) " | |
461 | + "DOVECOT_VCODE_PATCH > DOVECOT_VERSION_CODE(maj, min, patch)\n"); | |
462 | + printf("#define DOVECOT_P_IS_GE(maj, min, patch) " | |
463 | + "DOVECOT_VCODE_PATCH >= DOVECOT_VERSION_CODE(maj, min, patch)\n"); | |
464 | + printf("#define DOVECOT_P_IS_LT(maj, min, patch) " | |
465 | + "DOVECOT_VCODE_PATCH < DOVECOT_VERSION_CODE(maj, min, patch)\n"); | |
466 | + printf("#define DOVECOT_P_IS_LE(maj, min, patch) " | |
467 | + "DOVECOT_VCODE_PATCH <= DOVECOT_VERSION_CODE(maj, min, patch)\n"); | |
468 | + | |
469 | /* Use the antispam-storage-2.0.c for dovecot 2.1 and 2.2 as well */ | |
470 | if (maj == 2 && min < 3) | |
471 | min = 0; | |
472 | ||
473 | commit eba2805c61c37cc006b9a90b43ba61f3256ee190 | |
474 | Author: Ron <ron@debian.org> | |
475 | Date: Sat Oct 25 00:47:21 2014 +1030 | |
476 | ||
477 | Add a compatibility macro for t_push() | |
478 | ||
479 | This should fix things for the API change in dovecot 2.2.14 reported in: | |
480 | https://bugs.debian.org/765943 | |
481 | ||
482 | diff --git a/antispam-plugin.h b/antispam-plugin.h | |
483 | index a06f7be..245393b 100644 | |
484 | --- a/antispam-plugin.h | |
485 | +++ b/antispam-plugin.h | |
486 | @@ -260,6 +260,10 @@ o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED) | |
487 | #define module_arg struct module * | |
488 | #define ME(err) MAIL_ERROR_ ##err, | |
489 | ||
490 | +#if DOVECOT_P_IS_GE(2,2,14) | |
491 | +#define t_push() t_push(__func__) | |
492 | +#endif | |
493 | + | |
494 | static inline const char *const * | |
495 | get_mail_headers(struct mail *mail, const char *hdr) | |
496 | { | |
497 | ||
498 | commit 31c81ae3faa205c245b0245c027a9a4e2f72e504 | |
499 | Author: Timo Sirainen <tss@iki.fi> | |
500 | Date: Mon Nov 10 11:57:28 2014 +0100 | |
501 | ||
502 | use T_BEGIN/T_END | |
503 | ||
504 | Johannes: Timo's patch, adjusted to fix compilation and carry | |
505 | a backport for dovecot 1.0 in case somebody still | |
506 | uses that | |
507 | ||
508 | For the original (although modified by somebody else to compile): | |
509 | Acked-by: Phil Carmody <phil@dovecot.fi> | |
510 | ||
511 | diff --git a/antispam-plugin.c b/antispam-plugin.c | |
512 | index 103b5fb..76ced7b 100644 | |
4c03318d JR |
513 | --- a/antispam-plugin.c |
514 | +++ b/antispam-plugin.c | |
515 | @@ -90,7 +90,7 @@ static bool mailbox_patternmatch(struct mailbox *box, | |
516 | return FALSE; | |
517 | #endif | |
518 | ||
519 | - t_push(); | |
520 | + T_BEGIN { | |
521 | ||
522 | boxname = mailbox_get_name(box); | |
523 | if (lowercase) { | |
524 | @@ -110,7 +110,7 @@ static bool mailbox_patternmatch(struct mailbox *box, | |
525 | ||
526 | rc = memcmp(name, boxname, len) == 0; | |
527 | ||
528 | - t_pop(); | |
529 | + } T_END; | |
530 | ||
531 | return rc; | |
532 | } | |
533 | @@ -257,7 +257,7 @@ static int parse_folder_setting(const struct antispam_config *cfg, | |
534 | int cnt = 0; | |
535 | enum match_type i; | |
536 | ||
537 | - t_push(); | |
538 | + T_BEGIN { | |
539 | ||
540 | for (i = 0; i < NUM_MT; ++i) { | |
541 | tmp = getenv(t_strconcat(setting, match_info[i].suffix, NULL), | |
542 | @@ -286,7 +286,7 @@ static int parse_folder_setting(const struct antispam_config *cfg, | |
543 | } | |
544 | } | |
545 | ||
546 | - t_pop(); | |
547 | + } T_END; | |
548 | ||
549 | if (!cnt) | |
550 | debug(&cfg->dbgcfg, "no %s folders\n", display_name); | |
33b8a89c | 551 | diff --git a/antispam-plugin.h b/antispam-plugin.h |
e0859999 | 552 | index 245393b..f813964 100644 |
33b8a89c JR |
553 | --- a/antispam-plugin.h |
554 | +++ b/antispam-plugin.h | |
e0859999 | 555 | @@ -217,6 +217,11 @@ static inline int _mail_get_stream(struct mail *mail, |
4c03318d JR |
556 | return 0; |
557 | } | |
558 | #define mail_get_stream _mail_get_stream | |
559 | + | |
560 | +#define T_BEGIN \ | |
561 | + STMT_START { t_push(); | |
562 | +#define T_END \ | |
563 | + t_pop(); } STMT_END | |
564 | #elif DOVECOT_IS_EQ(1, 1) | |
565 | #define mempool_unref pool_unref | |
566 | #define module_arg void | |
e0859999 | 567 | @@ -260,10 +265,6 @@ o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED) |
33b8a89c | 568 | #define module_arg struct module * |
e0859999 AM |
569 | #define ME(err) MAIL_ERROR_ ##err, |
570 | ||
571 | -#if DOVECOT_P_IS_GE(2,2,14) | |
572 | -#define t_push() t_push(__func__) | |
573 | -#endif | |
574 | - | |
575 | static inline const char *const * | |
576 | get_mail_headers(struct mail *mail, const char *hdr) | |
577 | { | |
4c03318d JR |
578 | diff --git a/antispam-storage-1.1.c b/antispam-storage-1.1.c |
579 | index f28a0cf..aab23d9 100644 | |
580 | --- a/antispam-storage-1.1.c | |
581 | +++ b/antispam-storage-1.1.c | |
582 | @@ -508,10 +508,10 @@ void antispam_mail_storage_created(struct mail_storage *storage) | |
583 | ||
584 | static const char *_getenv(const char *env, void *data ATTR_UNUSED) | |
585 | { | |
586 | - t_push(); | |
587 | + T_BEGIN { | |
588 | env = t_str_ucase(t_strconcat("antispam_", env, NULL)); | |
589 | env = getenv(env); | |
590 | - t_pop(); | |
591 | + } T_END; | |
592 | ||
593 | return env; | |
594 | } | |
595 | diff --git a/antispam-storage-1.2.c b/antispam-storage-1.2.c | |
596 | index 5e0cb97..269a373 100644 | |
597 | --- a/antispam-storage-1.2.c | |
598 | +++ b/antispam-storage-1.2.c | |
599 | @@ -498,10 +498,10 @@ void antispam_mail_storage_created(struct mail_storage *storage) | |
600 | ||
601 | static const char *_getenv(const char *env, void *data ATTR_UNUSED) | |
602 | { | |
603 | - t_push(); | |
604 | + T_BEGIN { | |
605 | env = t_str_ucase(t_strconcat("antispam_", env, NULL)); | |
606 | env = getenv(env); | |
607 | - t_pop(); | |
608 | + } T_END; | |
609 | ||
610 | return env; | |
611 | } | |
33b8a89c | 612 | diff --git a/antispam-storage-2.0.c b/antispam-storage-2.0.c |
e0859999 | 613 | index 3e67553..c3d6251 100644 |
33b8a89c JR |
614 | --- a/antispam-storage-2.0.c |
615 | +++ b/antispam-storage-2.0.c | |
e0859999 | 616 | @@ -494,11 +494,11 @@ static const char *_getenv(const char *name, void *data) |
4c03318d JR |
617 | struct mail_user *user = data; |
618 | const char *env; | |
619 | ||
620 | - t_push(); | |
621 | + T_BEGIN { | |
622 | env = t_strconcat("antispam_", t_str_lcase(name), NULL); | |
623 | ||
624 | env = mail_user_plugin_getenv(user, env); | |
625 | - t_pop(); | |
626 | + } T_END; | |
627 | ||
628 | return env; | |
629 | } | |
4c03318d JR |
630 | diff --git a/crm114-exec.c b/crm114-exec.c |
631 | index 5b39ca9..d786e04 100644 | |
632 | --- a/crm114-exec.c | |
633 | +++ b/crm114-exec.c | |
634 | @@ -113,7 +113,7 @@ static int call_reaver(const struct antispam_config *cfg, | |
635 | ||
636 | debugv(&cfg->dbgcfg, argv); | |
637 | ||
638 | - t_push(); | |
639 | + T_BEGIN { | |
640 | for (i = 0; i < cfg->crm.extra_env_num; i++) { | |
641 | char *name, *value; | |
642 | name = t_strdup_noconst(cfg->crm.extra_env[i]); | |
643 | @@ -124,7 +124,7 @@ static int call_reaver(const struct antispam_config *cfg, | |
644 | } | |
645 | setenv(name, value, 1); | |
646 | } | |
647 | - t_pop(); | |
648 | + } T_END; | |
649 | ||
650 | execv(cfg->crm.reaver_binary, argv); | |
651 | /* fall through if reaver can't be found */ | |
652 | diff --git a/debug.c b/debug.c | |
e0859999 | 653 | index d2683fa..7a2353a 100644 |
4c03318d JR |
654 | --- a/debug.c |
655 | +++ b/debug.c | |
e0859999 | 656 | @@ -14,7 +14,7 @@ static void _debug(const struct antispam_debug_config *cfg, |
4c03318d JR |
657 | if (cfg->target == ADT_NONE) |
658 | return; | |
659 | ||
660 | - t_push(); | |
661 | + T_BEGIN { | |
662 | ||
e0859999 | 663 | fmt = t_strconcat("antispam: ", format, NULL); |
4c03318d | 664 | |
e0859999 | 665 | @@ -30,7 +30,7 @@ static void _debug(const struct antispam_debug_config *cfg, |
4c03318d JR |
666 | break; |
667 | } | |
668 | ||
669 | - t_pop(); | |
670 | + } T_END; | |
671 | } | |
672 | ||
673 | void debug(const struct antispam_debug_config *cfg, const char *fmt, ...) | |
e0859999 | 674 | @@ -48,7 +48,7 @@ void debugv(const struct antispam_debug_config *cfg, char **args) |
4c03318d JR |
675 | char *buf; |
676 | const char *str; | |
677 | ||
678 | - t_push(); | |
679 | + T_BEGIN { | |
680 | buf = t_buffer_get(buflen); | |
681 | ||
682 | while (1) { | |
e0859999 | 683 | @@ -72,7 +72,7 @@ void debugv(const struct antispam_debug_config *cfg, char **args) |
4c03318d JR |
684 | t_buffer_alloc(pos); |
685 | ||
686 | debug(cfg, "%s", buf); | |
687 | - t_pop(); | |
688 | + } T_END; | |
689 | } | |
690 | ||
691 | void debugv_not_stderr(const struct antispam_debug_config *cfg, char **args) | |
4c03318d JR |
692 | diff --git a/dspam-exec.c b/dspam-exec.c |
693 | index 2e353ce..856babb 100644 | |
694 | --- a/dspam-exec.c | |
695 | +++ b/dspam-exec.c | |
696 | @@ -141,7 +141,7 @@ static int call_dspam(const struct antispam_config *cfg, | |
697 | */ | |
698 | debugv_not_stderr(&cfg->dbgcfg, argv); | |
699 | ||
700 | - t_push(); | |
701 | + T_BEGIN { | |
702 | for (i = 0; i < cfg->dspam.extra_env_num; i++) { | |
703 | char *name, *value; | |
704 | name = t_strdup_noconst(cfg->dspam.extra_env[i]); | |
705 | @@ -152,7 +152,7 @@ static int call_dspam(const struct antispam_config *cfg, | |
e0859999 AM |
706 | } |
707 | setenv(name, value, 1); | |
708 | } | |
709 | - t_pop(); | |
710 | + } T_END; | |
33b8a89c | 711 | |
e0859999 AM |
712 | execv(cfg->dspam.binary, argv); |
713 | debug(&cfg->dbgcfg, "executing %s failed: %d (uid=%d, gid=%d)", | |
714 | diff --git a/pipe.c b/pipe.c | |
715 | index a20b4aa..1fc1904 100644 | |
716 | --- a/pipe.c | |
717 | +++ b/pipe.c | |
718 | @@ -136,7 +136,7 @@ static int process_tmpdir(const struct antispam_config *cfg, | |
4c03318d JR |
719 | enum classification wanted; |
720 | int rc = 0; | |
721 | ||
722 | - t_push(); | |
723 | + T_BEGIN { | |
724 | ||
725 | buf = t_malloc(20 + ast->tmplen); | |
726 | ||
e0859999 | 727 | @@ -159,7 +159,7 @@ static int process_tmpdir(const struct antispam_config *cfg, |
4c03318d JR |
728 | close(fd); |
729 | } | |
730 | ||
731 | - t_pop(); | |
732 | + } T_END; | |
733 | ||
734 | return rc; | |
735 | } | |
e0859999 | 736 | @@ -168,7 +168,7 @@ static void clear_tmpdir(struct antispam_transaction_context *ast) |
4c03318d JR |
737 | { |
738 | char *buf; | |
739 | ||
740 | - t_push(); | |
741 | + T_BEGIN { | |
742 | ||
743 | buf = t_malloc(20 + ast->tmplen); | |
744 | ||
e0859999 | 745 | @@ -180,7 +180,7 @@ static void clear_tmpdir(struct antispam_transaction_context *ast) |
4c03318d JR |
746 | } |
747 | rmdir(ast->tmpdir); | |
748 | ||
749 | - t_pop(); | |
750 | + } T_END; | |
751 | } | |
752 | ||
753 | static void backend_rollback(const struct antispam_config *cfg ATTR_UNUSED, | |
e0859999 | 754 | @@ -250,7 +250,7 @@ static int backend_handle_mail(const struct antispam_config *cfg, |
4c03318d JR |
755 | return -1; |
756 | } | |
757 | ||
758 | - t_push(); | |
759 | + T_BEGIN { | |
760 | ||
761 | buf = t_malloc(20 + ast->tmplen); | |
762 | i_snprintf(buf, 20 + ast->tmplen - 1, "%s/%d", ast->tmpdir, ast->count); | |
e0859999 | 763 | @@ -311,8 +311,8 @@ static int backend_handle_mail(const struct antispam_config *cfg, |
4c03318d JR |
764 | o_stream_destroy(&outstream); |
765 | out_close: | |
766 | close(fd); | |
767 | - out: | |
768 | - t_pop(); | |
769 | + out: ; | |
770 | + } T_END; | |
771 | ||
772 | return ret; | |
773 | } | |
4c03318d JR |
774 | diff --git a/spool2dir.c b/spool2dir.c |
775 | index cbd1909..d304716 100644 | |
776 | --- a/spool2dir.c | |
777 | +++ b/spool2dir.c | |
778 | @@ -165,7 +165,7 @@ static int backend_handle_mail(const struct antispam_config *cfg, | |
779 | return -1; | |
780 | } | |
781 | ||
782 | - t_push(); | |
783 | + T_BEGIN { | |
784 | ||
785 | /* atomically create a _new_ file */ | |
786 | while (ast->count <= 9999) { | |
787 | @@ -174,9 +174,6 @@ static int backend_handle_mail(const struct antispam_config *cfg, | |
788 | if (fd >= 0 || errno != EEXIST) | |
789 | break; | |
790 | /* current filename in buf already exists, zap it */ | |
791 | - t_pop(); | |
792 | - t_push(); | |
793 | - /* buf is invalid now! */ | |
794 | } | |
795 | ||
796 | if (fd < 0) { | |
797 | @@ -225,8 +222,8 @@ static int backend_handle_mail(const struct antispam_config *cfg, | |
798 | close(fd); | |
799 | if (ret) | |
800 | unlink(buf); | |
801 | - out: | |
802 | - t_pop(); | |
803 | + out: ; | |
804 | + } T_END; | |
805 | ||
806 | return ret; | |
807 | } | |
e0859999 AM |
808 | |
809 | commit 963c046c19b5d7019c607a8b648cae7b53d93ce2 | |
810 | Author: Ron <ron@debian.org> | |
811 | Date: Sun Feb 22 08:58:23 2015 +1030 | |
812 | ||
813 | Use the correct argc for pipe.ham_args | |
814 | ||
815 | This fixes a typo bug, where if the number of arguments set for | |
816 | antispam_pipe_program_spam_arg is not the same as what was set | |
817 | for antispam_pipe_program_notspam_arg, then we'll either scribble | |
818 | past the end of the allocated argv array, or populate it with | |
819 | pointers to whatever followed the real ham_args. | |
820 | ||
821 | Thanks to Peter Colberg who reported this, including a correct | |
822 | patch to fix it, to the security team. The security implications | |
823 | of this seem somewhat limited, since you need to edit a config | |
824 | file as root to create the bad situation, and there is no path | |
825 | for remote injection of crafted data (whether it overflows or | |
826 | underflows) if you do, the argv array will just get some 'random' | |
827 | extra pointers to existing internal data. | |
828 | ||
829 | However it does pose a potential problem for a legitimate user | |
830 | who does legitimately need or want to pass a different number of | |
831 | arguments for the spam and ham cases, since that could crash | |
832 | dovecot, or confuse the hell out of their pipe program when it | |
833 | gets some random extra arguments. It's probably gone unnoticed | |
834 | for this long because most uses will pass the same number of | |
835 | arguments for both of them, but that's not a necessary condition | |
836 | in the general case. | |
837 | ||
838 | diff --git a/pipe.c b/pipe.c | |
839 | index 1fc1904..f9abef5 100644 | |
840 | --- a/pipe.c | |
841 | +++ b/pipe.c | |
842 | @@ -46,7 +46,7 @@ static int run_pipe(const struct antispam_config *cfg, | |
843 | break; | |
844 | case CLASS_NOTSPAM: | |
845 | dest = cfg->pipe.ham_args; | |
846 | - dest_num = cfg->pipe.spam_args_num; | |
847 | + dest_num = cfg->pipe.ham_args_num; | |
848 | break; | |
849 | } | |
850 | ||
851 | ||
852 | commit 1ad6a9cf0dbed6cd51d3435a39fc5bfbfa2c27fd | |
853 | Author: Johannes Berg <johannes@sipsolutions.net> | |
854 | Date: Mon Jan 2 11:51:56 2017 +0100 | |
855 | ||
856 | fix mail_get_headers() return value usage | |
857 | ||
858 | Dovecot 2.2.27 changed the mail_get_headers() return value | |
859 | to be positive (not zero) for success, breaking everything. | |
860 | ||
861 | Timo suggested to check for < 0, so do that. | |
862 | ||
863 | Reported-by: Tom Talpey <tom@talpey.com> | |
864 | ||
865 | diff --git a/antispam-plugin.h b/antispam-plugin.h | |
866 | index f813964..a3a5c8d 100644 | |
867 | --- a/antispam-plugin.h | |
868 | +++ b/antispam-plugin.h | |
869 | @@ -231,7 +231,7 @@ static inline const char *const * | |
870 | get_mail_headers(struct mail *mail, const char *hdr) | |
871 | { | |
872 | const char *const *ret; | |
873 | - if (mail_get_headers(mail, hdr, &ret)) | |
874 | + if (mail_get_headers(mail, hdr, &ret) < 0) | |
875 | return NULL; | |
876 | return ret; | |
877 | } | |
878 | @@ -250,7 +250,7 @@ static inline const char *const * | |
879 | get_mail_headers(struct mail *mail, const char *hdr) | |
880 | { | |
881 | const char *const *ret; | |
882 | - if (mail_get_headers(mail, hdr, &ret)) | |
883 | + if (mail_get_headers(mail, hdr, &ret) < 0) | |
884 | return NULL; | |
885 | return ret; | |
886 | } | |
887 | @@ -269,7 +269,7 @@ static inline const char *const * | |
888 | get_mail_headers(struct mail *mail, const char *hdr) | |
889 | { | |
890 | const char *const *ret; | |
891 | - if (mail_get_headers(mail, hdr, &ret)) | |
892 | + if (mail_get_headers(mail, hdr, &ret) < 0) | |
893 | return NULL; | |
894 | return ret; | |
895 | } | |
896 | ||
897 | commit 6b9003cb3a1b8f133ca70408b181109a48b10c57 | |
898 | Author: Johannes Berg <johannes@sipsolutions.net> | |
899 | Date: Mon Jan 9 11:55:27 2017 +0100 | |
900 | ||
901 | make debug prefix configurable | |
902 | ||
903 | The default remains "antispam: ", but you can now configure it | |
904 | to include, for example, the logged-in username. | |
905 | ||
906 | diff --git a/antispam-plugin.h b/antispam-plugin.h | |
907 | index a3a5c8d..62a3eb3 100644 | |
908 | --- a/antispam-plugin.h | |
909 | +++ b/antispam-plugin.h | |
910 | @@ -42,6 +42,7 @@ struct signature_config { | |
911 | }; | |
912 | ||
913 | struct antispam_debug_config { | |
914 | + const char *prefix; | |
915 | enum antispam_debug_target target; | |
916 | int verbose; | |
917 | }; | |
918 | diff --git a/antispam.7 b/antispam.7 | |
919 | index 5d077f0..497da58 100644 | |
920 | --- a/antispam.7 | |
921 | +++ b/antispam.7 | |
922 | @@ -120,6 +120,9 @@ plugin { | |
923 | # antispam_debug_target = syslog | |
924 | # antispam_debug_target = stderr | |
925 | # antispam_verbose_debug = 1 | |
926 | + # | |
927 | + # This can be used to get a prefix, e.g. by specifying %u in it | |
928 | + # antispam_debug_prefix = "antispam: " | |
929 | ||
930 | # backend selection, MUST be configured first, | |
931 | # there's no default so you need to set one of | |
932 | diff --git a/debug.c b/debug.c | |
933 | index 7a2353a..e1f45a8 100644 | |
934 | --- a/debug.c | |
935 | +++ b/debug.c | |
936 | @@ -16,7 +16,7 @@ static void _debug(const struct antispam_debug_config *cfg, | |
937 | ||
938 | T_BEGIN { | |
939 | ||
940 | - fmt = t_strconcat("antispam: ", format, NULL); | |
941 | + fmt = t_strconcat(cfg->prefix, format, NULL); | |
942 | ||
943 | switch (cfg->target) { | |
944 | case ADT_NONE: | |
945 | @@ -111,6 +111,10 @@ int debug_init(struct antispam_debug_config *cfg, | |
946 | return -1; | |
947 | } | |
948 | ||
949 | + cfg->prefix = getenv("DEBUG_PREFIX", getenv_data); | |
950 | + if (!cfg->prefix) | |
951 | + cfg->prefix = "antispam: "; | |
952 | + | |
953 | debug(cfg, "plugin initialising (%s)\n", ANTISPAM_VERSION); | |
954 | ||
955 | tmp = getenv("VERBOSE_DEBUG", getenv_data); | |
956 | ||
957 | commit cf96d8d46fb98d81cc664e3dcee596af2b19628a | |
958 | Author: Ron <ron@debian.org> | |
959 | Date: Fri Jan 6 02:31:13 2017 +1030 | |
960 | ||
961 | Include ctype.h for isdigit | |
962 | ||
963 | It's no longer pulled in implicitly with libc6 2.24 and gcc 6.3. | |
964 | ||
965 | diff --git a/dovecot-version.c b/dovecot-version.c | |
966 | index 623461a..fe9bc73 100644 | |
967 | --- a/dovecot-version.c | |
968 | +++ b/dovecot-version.c | |
969 | @@ -1,6 +1,7 @@ | |
970 | #include <stdio.h> | |
971 | #include <string.h> | |
972 | #include <stdlib.h> | |
973 | +#include <ctype.h> | |
974 | #include "config.h" | |
975 | ||
976 | int main(int argc, char **argv) | |
977 | ||
978 | commit 649963a047ebad59f62b7cd620d6fe4329f392b2 | |
979 | Author: Ron <ron@debian.org> | |
980 | Date: Fri Jan 6 02:49:19 2017 +1030 | |
981 | ||
982 | Drop the #define _BSD_SOURCE | |
983 | ||
984 | In theory, it is needed for vsyslog(3), but glibc 2.20 deprecated it in | |
985 | favour of _DEFAULT_SOURCE, and features.h in 2.24 now barks about it | |
986 | being defined without _DEFAULT_SOURCE. | |
987 | ||
988 | In practice, we don't need it at all here, since we aren't invoking the | |
989 | compiler in a way that disables the default modes, so the "BSD" guarded | |
990 | functions are already available to us by default anyway, and defining | |
991 | _DEFAULT_SOURCE would be a no-op. | |
992 | ||
993 | diff --git a/debug.c b/debug.c | |
994 | index e1f45a8..77f0167 100644 | |
995 | --- a/debug.c | |
996 | +++ b/debug.c | |
997 | @@ -1,4 +1,3 @@ | |
998 | -#define _BSD_SOURCE | |
999 | #include <syslog.h> | |
1000 | #include <stdarg.h> | |
1001 | #include <stdio.h> | |
1002 | ||
1003 | commit 0cab392a87b1d097fbd7a6cfcdfa29ad99ab78c9 | |
1004 | Author: Johannes Berg <johannes.berg@intel.com> | |
1005 | Date: Sun Dec 24 14:15:57 2017 +0100 | |
1006 | ||
1007 | storage 2.0: abort COPY properly when errors happen | |
1008 | ||
1009 | diff --git a/antispam-storage-2.0.c b/antispam-storage-2.0.c | |
1010 | index c3d6251..3298908 100644 | |
1011 | --- a/antispam-storage-2.0.c | |
1012 | +++ b/antispam-storage-2.0.c | |
1013 | @@ -108,6 +108,7 @@ antispam_copy(struct mail_save_context *ctx, struct mail *mail) | |
1014 | if (mailbox_is_unsure(asbox->cfg, t->box)) { | |
1015 | mail_storage_set_error(t->box->storage, MAIL_ERROR_NOTPOSSIBLE, | |
1016 | "Cannot copy to unsure folder"); | |
1017 | + mailbox_save_cancel(&ctx); | |
1018 | return -1; | |
1019 | } | |
1020 | ||
1021 | ||
1022 | commit 713e9e9ffd4adfcc58c6e12470e87c9fd1b8af44 | |
1023 | Author: Johannes Berg <johannes@sipsolutions.net> | |
1024 | Date: Thu Dec 28 18:51:12 2017 +0100 | |
1025 | ||
1026 | support dovecot 2.3 | |
1027 | ||
1028 | Tested by Björn Franke. | |
1029 | ||
1030 | diff --git a/antispam-plugin.h b/antispam-plugin.h | |
1031 | index 62a3eb3..c974129 100644 | |
1032 | --- a/antispam-plugin.h | |
1033 | +++ b/antispam-plugin.h | |
1034 | @@ -280,6 +280,27 @@ o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED) | |
1035 | { | |
1036 | return o_stream_create_fd(fd, 0, TRUE); | |
1037 | } | |
1038 | +#elif DOVECOT_IS_EQ(2, 3) | |
1039 | +#define mempool_unref pool_unref | |
1040 | +#define module_arg struct module * | |
1041 | +#define ME(err) MAIL_ERROR_ ##err, | |
1042 | + | |
1043 | +static inline const char *const * | |
1044 | +get_mail_headers(struct mail *mail, const char *hdr) | |
1045 | +{ | |
1046 | + const char *const *ret; | |
1047 | + if (mail_get_headers(mail, hdr, &ret) < 0) | |
1048 | + return NULL; | |
1049 | + return ret; | |
1050 | +} | |
1051 | + | |
1052 | +static inline struct ostream * | |
1053 | +o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED) | |
1054 | +{ | |
1055 | + return o_stream_create_fd_autoclose(&fd, 0); | |
1056 | +} | |
1057 | + | |
1058 | +#define t_malloc t_malloc0 | |
1059 | #else | |
1060 | #error "Building against this dovecot version is not supported" | |
1061 | #endif | |
1062 | diff --git a/antispam-storage-2.0.c b/antispam-storage-2.0.c | |
1063 | index 3298908..ce522b1 100644 | |
1064 | --- a/antispam-storage-2.0.c | |
1065 | +++ b/antispam-storage-2.0.c | |
1066 | @@ -379,14 +379,22 @@ antispam_mail_update_keywords(struct mail *mail, | |
1067 | ||
1068 | static struct mailbox_transaction_context * | |
1069 | antispam_mailbox_transaction_begin(struct mailbox *box, | |
1070 | - enum mailbox_transaction_flags flags) | |
1071 | + enum mailbox_transaction_flags flags | |
1072 | +#if DOVECOT_IS_GE(2, 3) | |
1073 | + , const char *reason | |
1074 | +#endif | |
1075 | + ) | |
1076 | { | |
1077 | struct antispam_mailbox *asbox = ANTISPAM_CONTEXT(box); | |
1078 | struct mailbox_transaction_context *t; | |
1079 | struct antispam_transaction_context *ast; | |
1080 | struct antispam_internal_context *aic; | |
1081 | ||
1082 | - t = asbox->module_ctx.super.transaction_begin(box, flags); | |
1083 | + t = asbox->module_ctx.super.transaction_begin(box, flags | |
1084 | +#if DOVECOT_IS_GE(2, 3) | |
1085 | + , reason | |
1086 | +#endif | |
1087 | + ); | |
1088 | aic = i_new(struct antispam_internal_context, 1); | |
1089 | ast = antispam_transaction_begin(box); | |
1090 | aic->backendctx = ast; | |
1091 | diff --git a/dovecot-version.c b/dovecot-version.c | |
1092 | index fe9bc73..d4744f0 100644 | |
1093 | --- a/dovecot-version.c | |
1094 | +++ b/dovecot-version.c | |
1095 | @@ -68,8 +68,8 @@ int main(int argc, char **argv) | |
1096 | printf("#define DOVECOT_P_IS_LE(maj, min, patch) " | |
1097 | "DOVECOT_VCODE_PATCH <= DOVECOT_VERSION_CODE(maj, min, patch)\n"); | |
1098 | ||
1099 | - /* Use the antispam-storage-2.0.c for dovecot 2.1 and 2.2 as well */ | |
1100 | - if (maj == 2 && min < 3) | |
1101 | + /* Use the antispam-storage-2.0.c for dovecot 2.1 - 2.3 as well */ | |
1102 | + if (maj == 2 && min < 4) | |
1103 | min = 0; | |
1104 | ||
1105 | printf("#define ANTISPAM_STORAGE " |