From 33b8a89c603ec85eecf2a9b2f64911d285732b37 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20R=C4=99korajski?= Date: Mon, 3 Dec 2012 14:02:28 +0100 Subject: [PATCH] - replace quick-fix for dovecot 2.1 with changes fro upstream git - rel 10 --- dovecot-2.1.patch | 34 ----- dovecot-antispam-git.patch | 268 +++++++++++++++++++++++++++++++++++++ dovecot-antispam.spec | 7 +- 3 files changed, 270 insertions(+), 39 deletions(-) delete mode 100644 dovecot-2.1.patch create mode 100644 dovecot-antispam-git.patch diff --git a/dovecot-2.1.patch b/dovecot-2.1.patch deleted file mode 100644 index dd52aaf..0000000 --- a/dovecot-2.1.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- dovecot-antispam-2.0/antispam-plugin.h~ 2011-11-07 10:49:47.000000000 +0100 -+++ dovecot-antispam-2.0/antispam-plugin.h 2012-05-09 11:50:32.432166565 +0200 -@@ -285,6 +285,31 @@ - { - return dict_init(uri, DICT_DATA_TYPE_STRING, username, NULL); - } -+#elif DOVECOT_IS_EQ(2, 1) -+#define mempool_unref pool_unref -+#define module_arg struct module * -+#define ME(err) MAIL_ERROR_ ##err, -+ -+static inline const char *const * -+get_mail_headers(struct mail *mail, const char *hdr) -+{ -+ const char *const *ret; -+ if (mail_get_headers(mail, hdr, &ret)) -+ return NULL; -+ return ret; -+} -+ -+static inline struct ostream * -+o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED) -+{ -+ return o_stream_create_fd(fd, 0, TRUE); -+} -+ -+static inline struct dict * -+string_dict_init(const char *uri, const char *username) -+{ -+ return dict_init(uri, DICT_DATA_TYPE_STRING, username, NULL); -+} - #else - #error "Building against this dovecot version is not supported" - #endif diff --git a/dovecot-antispam-git.patch b/dovecot-antispam-git.patch new file mode 100644 index 0000000..7f11fbd --- /dev/null +++ b/dovecot-antispam-git.patch @@ -0,0 +1,268 @@ +diff --git a/antispam-plugin.h b/antispam-plugin.h +index 280bb12..72b906d 100644 +--- a/antispam-plugin.h ++++ b/antispam-plugin.h +@@ -98,8 +98,10 @@ struct antispam_config { + int extra_env_num; + } crm; + struct { +- const char *spam_arg; +- const char *ham_arg; ++ char **spam_args; ++ int spam_args_num; ++ char **ham_args; ++ int ham_args_num; + const char *pipe_binary;// = "/usr/sbin/sendmail"; + const char *tmpdir;// = "/tmp"; + char **extra_args; +@@ -260,7 +262,7 @@ o_stream_create_from_fd(int fd, pool_t pool ATTR_UNUSED) + { + return o_stream_create_fd(fd, 0, TRUE); + } +-#elif DOVECOT_IS_EQ(2, 0) ++#elif DOVECOT_IS_EQ(2, 0) || DOVECOT_IS_EQ(2, 1) + #define mempool_unref pool_unref + #define module_arg struct module * + #define ME(err) MAIL_ERROR_ ##err, +diff --git a/antispam-storage-2.0.c b/antispam-storage-2.0.c +index 5a089bc..3e67553 100644 +--- a/antispam-storage-2.0.c ++++ b/antispam-storage-2.0.c +@@ -472,7 +472,7 @@ static void antispam_mailbox_allocated(struct mailbox *box) + + asbox->save_hack = FALSE; + asbox->movetype = MMT_APPEND; +- asbox->cfg = asuser->cfg; ++ asbox->cfg = asuser->cfg; + + v->free = antispam_mailbox_free; + +diff --git a/antispam.7 b/antispam.7 +index 5e33e4c..5d077f0 100644 +--- a/antispam.7 ++++ b/antispam.7 +@@ -1,4 +1,4 @@ +-.TH ANTISPAM 7 "15 October 2007" "" "" ++.TH ANTISPAM 7 "24 March 2012" "" "" + .SH NAME + antispam \- The dovecot antispam plugin. + +@@ -206,6 +206,11 @@ plugin { + # semicolon-separated list of blacklisted results, case insensitive + # antispam_dspam_result_blacklist = Virus + ++ # semicolon-separated list of environment variables to set ++ # (default unset i.e. none) ++ # antispam_dspam_env = ++ # antispam_dspam_env = HOME=%h;USER=%u ++ + #===================== + # pipe plugin + # +@@ -228,6 +233,14 @@ plugin { + # "mailtrain" are still valid, these are, in the same order as + # above: antispam_mail_sendmail, antispam_mail_sendmail_args, + # antispam_mail_spam, antispam_mail_notspam and antispam_mail_tmpdir. ++ # ++ # Alternatively, if you need to give multiple options, you can use ++ # the spam_args/notspam_args parameters (which are used in preference ++ # of the singular form): ++ # antispam_pipe_program_spam_args = --spam;--my-other-param1 ++ # antispam_pipe_program_notspam_args = --ham;--my-other-param2 ++ # which will then call ++ # /path/to/mailtrain --for jberg --spam --my-other-param1 + + # temporary directory + antispam_pipe_tmpdir = /tmp +@@ -247,7 +260,7 @@ plugin { + antispam_crm_binary = /bin/false + # antispam_crm_binary = /usr/share/crm114/mailreaver.crm + +- # semicolon-separated list of extra arguments to dspam ++ # semicolon-separated list of extra arguments to crm114 + # (default unset i.e. none) + # antispam_crm_args = + # antispam_crm_args = --config=/path/to/config +@@ -257,11 +270,6 @@ plugin { + # antispam_crm_env = + # antispam_crm_env = HOME=%h;USER=%u + +- # semicolon-separated list of environment variables to set +- # (default unset i.e. none) +- # antispam_dspam_env = +- # antispam_dspam_env = HOME=%h;USER=%u +- + # NOTE: you need to set the signature for this backend + antispam_signature = X-CRM114-CacheID + +diff --git a/dovecot-version.c b/dovecot-version.c +index cbcb35b..0026fbf 100644 +--- a/dovecot-version.c ++++ b/dovecot-version.c +@@ -17,21 +17,24 @@ int main(int argc, char **argv) + + maj = strtol(v, &e, 10); + if (v == e) +- return 1; ++ return 2; + + v = e + 1; + + min = strtol(v, &e, 10); + if (v == e) +- return 1; ++ return 3; + + /* not end of string yet? */ + if (*e) { + v = e + 1; + +- patch = strtol(v, &e, 10); +- if (v == e) +- return 1; ++ if (isdigit(*v)) { ++ patch = strtol(v, &e, 10); ++ if (v == e) ++ return 4; ++ } else ++ patch = 255; + } + + printf("/* Auto-generated file, do not edit */\n\n"); +@@ -50,6 +53,11 @@ int main(int argc, char **argv) + "DOVECOT_VCODE < DOVECOT_VERSION_CODE(maj, min, 0)\n"); + printf("#define DOVECOT_IS_LE(maj, min) " + "DOVECOT_VCODE <= DOVECOT_VERSION_CODE(maj, min, 0)\n"); ++ ++ /* Use the antispam-storage-2.0.c for dovecot 2.1 as well */ ++ if (maj == 2 && min == 1) ++ min = 0; ++ + printf("#define ANTISPAM_STORAGE " + "\"antispam-storage-%d.%d.c\"\n", maj, min); + +diff --git a/pipe.c b/pipe.c +index 18c2233..a20b4aa 100644 +--- a/pipe.c ++++ b/pipe.c +@@ -34,16 +34,19 @@ + static int run_pipe(const struct antispam_config *cfg, + int mailfd, enum classification wanted) + { +- const char *dest; ++ char **dest; ++ int dest_num; + pid_t pid; + int status; + + switch (wanted) { + case CLASS_SPAM: +- dest = cfg->pipe.spam_arg; ++ dest = cfg->pipe.spam_args; ++ dest_num = cfg->pipe.spam_args_num; + break; + case CLASS_NOTSPAM: +- dest = cfg->pipe.ham_arg; ++ dest = cfg->pipe.ham_args; ++ dest_num = cfg->pipe.spam_args_num; + break; + } + +@@ -65,18 +68,23 @@ static int run_pipe(const struct antispam_config *cfg, + return WEXITSTATUS(status); + } else { + char **argv; +- int sz = sizeof(char *) * (2 + cfg->pipe.extra_args_num + 1); +- int i, fd; ++ int sz = sizeof(char *) * (2 + cfg->pipe.extra_args_num + dest_num + 1); ++ int i, j, fd; + + argv = i_malloc(sz); + memset(argv, 0, sz); + + argv[0] = (char *) cfg->pipe.pipe_binary; + +- for (i = 0; i < cfg->pipe.extra_args_num; i++) ++ for (i = 0; i < cfg->pipe.extra_args_num; i++) { + argv[i + 1] = (char *) cfg->pipe.extra_args[i]; ++ debug(&cfg->dbgcfg, "running mailtrain backend program parameter %d %s", i + 1, argv[i + 1]); ++ } + +- argv[i + 1] = (char *) dest; ++ for (j = 0; j < dest_num; j++) { ++ argv[i + 1 + j] = (char *) dest[j]; ++ debug(&cfg->dbgcfg, "running mailtrain backend program parameter %d %s", i + 1 + j, argv[i + 1 + j]); ++ } + + dup2(mailfd, 0); + fd = open("/dev/null", O_WRONLY); +@@ -228,7 +236,7 @@ static int backend_handle_mail(const struct antispam_config *cfg, + return -1; + } + +- if (!cfg->pipe.ham_arg || !cfg->pipe.spam_arg) { ++ if (!cfg->pipe.ham_args || !cfg->pipe.spam_args) { + mail_storage_set_error(t->box->storage, + ME(NOTPOSSIBLE) + "antispam plugin not configured"); +@@ -316,20 +324,50 @@ static void backend_init(struct antispam_config *cfg, + const char *tmp; + int i; + +- tmp = getenv("PIPE_PROGRAM_SPAM_ARG", getenv_data); +- if (!tmp) +- tmp = getenv("MAIL_SPAM", getenv_data); ++ tmp = getenv("PIPE_PROGRAM_SPAM_ARGS", getenv_data); + if (tmp) { +- cfg->pipe.spam_arg = tmp; +- debug(&cfg->dbgcfg, "pipe backend spam argument = %s\n", tmp); ++ cfg->pipe.spam_args = p_strsplit(cfg->mem_pool, tmp, ";"); ++ cfg->pipe.spam_args_num = str_array_length( ++ (const char *const *)cfg->pipe.spam_args); ++ for (i = 0; i < cfg->pipe.spam_args_num; i++) ++ debug(&cfg->dbgcfg, "pipe backend spam arg[%d] = %s\n", ++ i, cfg->pipe.spam_args[i]); ++ } else { ++ tmp = getenv("PIPE_PROGRAM_SPAM_ARG", getenv_data); ++ if (!tmp) ++ tmp = getenv("MAIL_SPAM", getenv_data); ++ if (tmp) { ++ /* bit of a hack */ ++ cfg->pipe.spam_args = ++ p_strsplit(cfg->mem_pool, tmp, "\x01"); ++ cfg->pipe.spam_args_num = 1; ++ debug(&cfg->dbgcfg, ++ "pipe backend spam argument = %s\n", tmp); ++ tmp = NULL; ++ } + } + +- tmp = getenv("PIPE_PROGRAM_NOTSPAM_ARG", getenv_data); +- if (!tmp) +- tmp = getenv("MAIL_NOTSPAM", getenv_data); ++ tmp = getenv("PIPE_PROGRAM_NOTSPAM_ARGS", getenv_data); + if (tmp) { +- cfg->pipe.ham_arg = tmp; +- debug(&cfg->dbgcfg, "pipe backend not-spam argument = %s\n", tmp); ++ cfg->pipe.ham_args = p_strsplit(cfg->mem_pool, tmp, ";"); ++ cfg->pipe.ham_args_num = str_array_length( ++ (const char *const *)cfg->pipe.ham_args); ++ for (i = 0; i < cfg->pipe.ham_args_num; i++) ++ debug(&cfg->dbgcfg, "pipe backend ham arg[%d] = %s\n", ++ i, cfg->pipe.ham_args[i]); ++ } else { ++ tmp = getenv("PIPE_PROGRAM_NOTSPAM_ARG", getenv_data); ++ if (!tmp) ++ tmp = getenv("MAIL_NOTSPAM", getenv_data); ++ if (tmp) { ++ /* bit of a hack */ ++ cfg->pipe.ham_args = ++ p_strsplit(cfg->mem_pool, tmp, "\x01"); ++ cfg->pipe.ham_args_num = 1; ++ debug(&cfg->dbgcfg, ++ "pipe backend not-spam argument = %s\n", tmp); ++ tmp = NULL; ++ } + } + + tmp = getenv("PIPE_PROGRAM", getenv_data); diff --git a/dovecot-antispam.spec b/dovecot-antispam.spec index 5fa679b..80a18f2 100644 --- a/dovecot-antispam.spec +++ b/dovecot-antispam.spec @@ -2,12 +2,12 @@ Summary: The dovecot antispam plugin Summary(pl.UTF-8): Wtyczka antyspamowa dla dovecota Name: dovecot-antispam Version: 2.0 -Release: 9 +Release: 10 License: GPL v2 Group: Daemons Source0: http://johannes.sipsolutions.net/download/dovecot-antispam/%{name}-%{version}.tar.bz2 # Source0-md5: 14547898759fbd93f2b98304520decc6 -Patch0: dovecot-2.1.patch +Patch0: %{name}-git.patch URL: http://johannes.sipsolutions.net/Projects/dovecot-antispam BuildRequires: dovecot-devel >= 1:2.0 %requires_eq_to dovecot dovecot-devel @@ -19,12 +19,9 @@ SPAM folder and tells the spam classifier that it made an error and needs to re-classify the message (as spam/not spam depending on which way it was moved). -#%description -l pl.UTF-8 - %prep %setup -q %patch0 -p1 -cp -a antispam-storage-2.0.c antispam-storage-2.1.c %build %{__make} \ -- 2.43.0