Gitweb:
https://git.exim.org/exim.git/commitdiff/834dae55650eb31b893242b9d50b477f5a339bf5
Commit: 834dae55650eb31b893242b9d50b477f5a339bf5
Parent: 3f96c3e750eb4e4dc63f53d783106aa5cf2498cb
Author: Jeremy Harris <jgh146exb@???>
AuthorDate: Tue Sep 10 12:32:03 2024 +0100
Committer: Jeremy Harris <jgh146exb@???>
CommitDate: Tue Sep 10 12:34:23 2024 +0100
sieve dynamic module
---
doc/doc-txt/NewStuff | 6 ++-
src/OS/Makefile-Base | 3 +-
src/scripts/Configure-Makefile | 2 +-
src/scripts/MakeLinks | 3 +-
src/src/EDITME | 11 ++++
src/src/config.h.defaults | 2 +
src/src/drtables.c | 6 +++
src/src/exim.c | 13 ++++-
src/src/exim.h | 3 ++
src/src/filtertest.c | 18 +++++--
src/src/functions.h | 2 -
src/src/globals.h | 1 -
src/src/miscmods/Makefile | 21 ++++----
src/src/{sieve.c => miscmods/sieve_filter.c} | 62 +++++++++++++++-------
src/src/miscmods/sieve_filter_api.h | 15 ++++++
src/src/rda.c | 13 ++++-
test/aux-fixed/{0427.message => 4160.message} | 0
test/aux-fixed/{0427.message2 => 4160.message2} | 0
test/aux-fixed/{0427.message3 => 4160.message3} | 0
.../{0506.sieve-filter => 4162.sieve-filter} | 0
test/aux-fixed/{0950.sieve => 4163.sieve} | 0
test/confs/{0427 => 4160} | 2 +-
test/confs/{0428 => 4161} | 2 +-
test/confs/4162 | 32 +++++++++++
test/confs/{0950 => 4163} | 2 +-
test/log/0506 | 5 +-
test/log/{0428 => 4161} | 0
test/log/{0506 => 4162} | 5 +-
test/log/{0950 => 4163} | 0
test/mail/{0428.CALLER => 4161.CALLER} | 0
test/mail/{0428.inbox.JUNK => 4161.inbox.JUNK} | 0
.../{0428.inbox.changed => 4161.inbox.changed} | 0
test/mail/{0428.redirected => 4161.redirected} | 0
test/mail/{0428.someone => 4161.someone} | 0
test/mail/{0428.userx => 4161.userx} | 0
test/mail/{0428.userx-extra => 4161.userx-extra} | 0
.../{0428.userx-sawsuffix => 4161.userx-sawsuffix} | 0
test/mail/{0428.userx13 => 4161.userx13} | 0
test/mail/{0428.userx14 => 4161.userx14} | 0
test/mail/{0428.userx9 => 4161.userx9} | 0
test/mail/{0950.CALLER => 4163.CALLER} | 0
test/mail/{0950.myfolder => 4163.myfolder} | 0
test/scripts/0000-Basic/0506 | 10 ++--
.../{0000-Basic/0427 => 4160-sieve-filter/4160} | 0
.../{0000-Basic/0428 => 4160-sieve-filter/4161} | 0
test/scripts/4160-sieve-filter/4162 | 10 ++++
.../{0000-Basic/0950 => 4160-sieve-filter/4163} | 0
test/scripts/4160-sieve-filter/REQUIRES | 1 +
test/stdout/{0427 => 4160} | 0
test/stdout/{0950 => 4163} | 0
50 files changed, 188 insertions(+), 62 deletions(-)
diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff
index 01326b488..bca7d6f87 100644
--- a/doc/doc-txt/NewStuff
+++ b/doc/doc-txt/NewStuff
@@ -14,8 +14,10 @@ Version 4.98
3. Events smtp:fail:protocol and smtp:fail:syntax
- 4. JSON and LDAP lookup support, PAM, RADIUS, perl, SPF, DKIM, DMARC and ARC
- support, all the router and authenticator drivers, and all the transport
+ 4. Support for Sieve filters can be omitted at build time
+
+ 5. JSON and LDAP lookup support, Sieve, PAM, RADIUS, perl, SPF, DKIM, DMARC and
+ ARC support, all the router and authenticator drivers, and all the transport
drivers except smtp, can now be built as loadable modules
Version 4.98
diff --git a/src/OS/Makefile-Base b/src/OS/Makefile-Base
index d8df29672..7793e5da2 100644
--- a/src/OS/Makefile-Base
+++ b/src/OS/Makefile-Base
@@ -518,7 +518,7 @@ OBJ_EXIM = acl.o base64.o child.o crypt16.o daemon.o dbfn.o debug.o deliver.o \
header.o host.o host_address.o ip.o log.o lss.o match.o md5.o moan.o \
os.o parse.o priv.o proxy.o queue.o \
rda.o readconf.o receive.o retry.o rewrite.o rfc2047.o regex_cache.o \
- route.o search.o sieve.o smtp_in.o smtp_out.o spool_in.o spool_out.o \
+ route.o search.o smtp_in.o smtp_out.o spool_in.o spool_out.o \
std-crypto.o store.o string.o tls.o tod.o transport.o tree.o verify.o \
xtextencode.o environment.o macro.o \
$(OBJ_LOOKUPS) $(OBJ_ROUTERS) $(OBJ_AUTHS) \
@@ -866,7 +866,6 @@ regex_cache.o: $(HDRS) regex_cache.c
rfc2047.o: $(HDRS) rfc2047.c
route.o: $(HDRS) route.c
search.o: $(HDRS) search.c
-sieve.o: $(HDRS) sieve.c
smtp_in.o: $(HDRS) smtp_in.c
smtp_out.o: $(HDRS) smtp_out.c
spool_in.o: $(HDRS) spool_in.c
diff --git a/src/scripts/Configure-Makefile b/src/scripts/Configure-Makefile
index df6323f3b..fd5afaf10 100755
--- a/src/scripts/Configure-Makefile
+++ b/src/scripts/Configure-Makefile
@@ -315,7 +315,7 @@ done <<-END
routers ROUTER ACCEPT DNSLOOKUP IPLITERAL IPLOOKUP MANUALROUTE QUERYPROGRAM REDIRECT
transports TRANSPORT APPENDFILE AUTOREPLY LMTP PIPE QUEUEFILE SMTP
auths AUTH CRAM_MD5 CYRUS_SASL DOVECOT EXTERNAL GSASL HEIMDAL_GSSAPI PLAINTEXT SPA TLS
- miscmods SUPPORT ARC _DKIM DMARC PAM PERL RADIUS SPF
+ miscmods SUPPORT ARC _DKIM DMARC PAM PERL RADIUS _SIEVE_FILTER SPF
END
# See if there is a definition of EXIM_PERL in what we have built so far.
diff --git a/src/scripts/MakeLinks b/src/scripts/MakeLinks
index d7441ef0d..6327bc819 100755
--- a/src/scripts/MakeLinks
+++ b/src/scripts/MakeLinks
@@ -105,6 +105,7 @@ for f in dummy.c \
pam.c pam_api.h \
perl.c perl_api.h \
radius.c radius_api.h \
+ sieve_filter.c sieve_filter_api.h \
spf.c spf.h spf_api.h
do
ln -s ../../src/$d/$f `basename $f`
@@ -136,7 +137,7 @@ for f in blob.h dbfunctions.h exim.h functions.h globals.h \
globals.c hash.c header.c host.c host_address.c ip.c log.c lss.c match.c md5.c moan.c \
parse.c priv.c proxy.c queue.c rda.c readconf.c receive.c retry.c rewrite.c \
regex_cache.c rfc2047.c route.c search.c setenv.c environment.c \
- sieve.c smtp_in.c smtp_out.c spool_in.c spool_out.c std-crypto.c store.c \
+ smtp_in.c smtp_out.c spool_in.c spool_out.c std-crypto.c store.c \
string.c tls.c tlscert-gnu.c tlscert-openssl.c tls-cipher-stdname.c \
tls-gnu.c tls-openssl.c \
tod.c transport.c tree.c verify.c version.c xtextencode.c \
diff --git a/src/src/EDITME b/src/src/EDITME
index 757e94746..85effd13f 100644
--- a/src/src/EDITME
+++ b/src/src/EDITME
@@ -551,6 +551,17 @@ SUPPORT_DANE=yes
# EXIM_MONITOR=eximon.bin
+#------------------------------------------------------------------------------
+# Compiling with support for Sieve filters is the default. To disable this
+# uncomment the line below.
+
+# DISABLE_SIEVE_FILTER=yes
+
+# Alternatively, to build the support as a dynamically-loaded module uncomment
+# this line.
+
+# SUPPORT_SIEVE_FILTER=2
+
#------------------------------------------------------------------------------
# Compiling Exim with content scanning support: If you want to compile Exim
# with support for message body content scanning, set WITH_CONTENT_SCAN to
diff --git a/src/src/config.h.defaults b/src/src/config.h.defaults
index e6ded1e8f..404ac0c1c 100644
--- a/src/src/config.h.defaults
+++ b/src/src/config.h.defaults
@@ -57,6 +57,7 @@ Do not put spaces between # and the 'define'.
#define DISABLE_PIPE_CONNECT
#define DISABLE_PRDR
#define DISABLE_QUEUE_RAMP
+#define DISABLE_SIEVE_FILTER
#define DISABLE_TLS
#define DISABLE_TLS_RESUME
#define DISABLE_WELLKNOWN
@@ -171,6 +172,7 @@ Do not put spaces between # and the 'define'.
#define SUPPORT_ARC
#define SUPPORT_DKIM
#define SUPPORT_PERL
+#define SUPPORT_SIEVE_FILTER
#define SUPPORT_RADIUS
#define SYSLOG_LOG_PID
diff --git a/src/src/drtables.c b/src/src/drtables.c
index 8bde47666..49d3ae129 100644
--- a/src/src/drtables.c
+++ b/src/src/drtables.c
@@ -762,6 +762,9 @@ extern misc_module_info pam_module_info;
#if defined(EXIM_PERL) && (!defined(SUPPORT_PERL) || SUPPORT_PERL!=2)
extern misc_module_info perl_module_info;
#endif
+#if !defined(DISABLE_SIEVE_FILTER) && (!defined(SUPPORT_SIEVE_FILTER) || SUPPORT_SIEVE_FILTER!=2)
+extern misc_module_info sieve_filter_module_info;
+#endif
void
init_misc_mod_list(void)
@@ -792,6 +795,9 @@ onetime = TRUE;
#if defined(EXIM_PERL) && (!defined(SUPPORT_PERL) || SUPPORT_PERL!=2)
misc_mod_add(&perl_module_info);
#endif
+#if !defined(DISABLE_SIEVE_FILTER) && (!defined(SUPPORT_SIEVE_FILTER) || SUPPORT_SIEVE_FILTER!=2)
+ misc_mod_add(&sieve_filter_module_info);
+#endif
}
diff --git a/src/src/exim.c b/src/src/exim.c
index 3d1b7f1d9..274187cfc 100644
--- a/src/src/exim.c
+++ b/src/src/exim.c
@@ -1221,6 +1221,9 @@ g = string_cat(g, US"Support for:");
#ifdef WITH_CONTENT_SCAN
g = string_cat(g, US" Content_Scanning");
#endif
+#ifndef DISABLE_SIEVE_FILTER
+ g = string_cat(g, US" Sieve_filter");
+#endif
#ifdef SUPPORT_CRYPTEQ
g = string_cat(g, US" crypteq");
#endif
@@ -1475,8 +1478,14 @@ switch(request)
);
return;
case CMDINFO_SIEVE:
- for (const uschar ** pp = exim_sieve_extension_list; *pp; ++pp)
- fprintf(stream, "%s\n", *pp);
+ {
+ const misc_module_info * mi;
+ typedef void (*fn_t)(FILE *);
+ if ((mi = misc_mod_find(US"sieve_filter", NULL)))
+ (((fn_t *) mi->functions)[SIEVE_EXTENSIONS]) (stream);
+ else
+ fprintf(stream, "Sieve filtering not available\n");
+ }
return;
case CMDINFO_DSCP:
dscp_list_to_stream(stream);
diff --git a/src/src/exim.h b/src/src/exim.h
index 771c00df8..bae5ec390 100644
--- a/src/src/exim.h
+++ b/src/src/exim.h
@@ -567,6 +567,9 @@ config.h, mytypes.h, and store.h, so we don't need to mention them explicitly.
#ifdef EXIM_PERL
# include "miscmods/perl_api.h"
#endif
+#ifndef DISABLE_SIEVE
+# include "miscmods/sieve_filter_api.h"
+#endif
/* The following stuff must follow the inclusion of config.h because it
requires various things that are set therein. */
diff --git a/src/src/filtertest.c b/src/src/filtertest.c
index a58fe5e82..eb5f5e54b 100644
--- a/src/src/filtertest.c
+++ b/src/src/filtertest.c
@@ -270,12 +270,22 @@ if (is_system)
f.enable_dollar_recipients = FALSE;
f.system_filtering = FALSE;
}
-else
+else if (filter_type == FILTER_SIEVE)
{
- yield = filter_type == FILTER_SIEVE
- ? sieve_interpret(filebuf, RDO_REWRITE, NULL, &generated, &error)
- : filter_interpret(filebuf, RDO_REWRITE, &generated, &error);
+ const misc_module_info * mi;
+ uschar * errstr = NULL;
+ typedef int (*fn_t)(const uschar *, int, const sieve_block *,
+ address_item **, uschar **);
+ if (!(mi = misc_mod_find(US"sieve_filter", &errstr)))
+ {
+ printf("exim: Sieve filtering not available: %s\n", errstr ? errstr : US"?");
+ return FALSE;
+ }
+ yield = (((fn_t *) mi->functions)[SIEVE_INTERPRET])
+ (filebuf, RDO_REWRITE, NULL, &generated, &error);
}
+else
+ yield = filter_interpret(filebuf, RDO_REWRITE, &generated, &error);
return yield != FF_ERROR;
}
diff --git a/src/src/functions.h b/src/src/functions.h
index 9b645a85f..60b07d2d7 100644
--- a/src/src/functions.h
+++ b/src/src/functions.h
@@ -481,8 +481,6 @@ extern void set_process_info(const char *, ...) PRINTF_FUNCTION(1,2);
extern void sha1_end(hctx *, const uschar *, int, uschar *);
extern void sha1_mid(hctx *, const uschar *);
extern void sha1_start(hctx *);
-extern int sieve_interpret(const uschar *, int, const sieve_block *,
- address_item **, uschar **);
extern void sigalrm_handler(int);
extern void single_queue_run(qrunner *, const uschar *, const uschar *);
extern int smtp_boundsock(smtp_connect_args *);
diff --git a/src/src/globals.h b/src/src/globals.h
index a172d9abc..e9be97cd8 100644
--- a/src/src/globals.h
+++ b/src/src/globals.h
@@ -586,7 +586,6 @@ extern const uschar *event_name; /* event classification */
extern gid_t exim_gid; /* To be used with exim_uid */
extern BOOL exim_gid_set; /* TRUE if exim_gid set */
extern uschar *exim_path; /* Path to exec exim */
-extern const uschar *exim_sieve_extension_list[]; /* list of sieve extensions */
extern uid_t exim_uid; /* Non-root uid for exim */
extern BOOL exim_uid_set; /* TRUE if exim_uid set */
extern int expand_level; /* Nesting depth; indent for debug */
diff --git a/src/src/miscmods/Makefile b/src/src/miscmods/Makefile
index c1489d6e8..3c255dbb6 100644
--- a/src/src/miscmods/Makefile
+++ b/src/src/miscmods/Makefile
@@ -31,16 +31,17 @@ miscmods.a: $(OBJ)
# Note that the sources from pdkim/ are linked into the build.../miscmods/ dir
# by scripts/Makelinks.
-arc.o arc.so: $(HDRS) pdkim.h arc.c
-dkim.o dkim.so: $(HDRS) dkim.h dkim.c dkim_transport.c \
- crypt_ver.h pdkim.h pdkim_hash.h pdkim.c \
- signing.h signing.c
-dmarc.o dmarc.so: $(HDRS) pdkim.h dmarc.h dmarc.c
-dummy.o: dummy.c
-pam.o pam.so: $(HDRS) pam.c
-perl.o perl.so: $(HDRS) perl.c
-radius.o radius.so: $(HDRS) radius.c
-spf.o spf.so: $(HDRS) spf.h spf.c
+arc.o arc.so: $(HDRS) pdkim.h arc.c
+dkim.o dkim.so: $(HDRS) dkim.h dkim.c dkim_transport.c \
+ crypt_ver.h pdkim.h pdkim_hash.h pdkim.c \
+ signing.h signing.c
+dmarc.o dmarc.so: $(HDRS) pdkim.h dmarc.h dmarc.c
+dummy.o: dummy.c
+pam.o pam.so: $(HDRS) pam.c
+perl.o perl.so: $(HDRS) perl.c
+radius.o radius.so: $(HDRS) radius.c
+sieve_filter.o sieve_filter.so: $(HDRS) sieve_filter.c
+spf.o spf.so: $(HDRS) spf.h spf.c
dkim.o:
@echo "$(CC) dkim.c dkim_transport.c pdkim.c signing.c"
diff --git a/src/src/sieve.c b/src/src/miscmods/sieve_filter.c
similarity index 98%
rename from src/src/sieve.c
rename to src/src/miscmods/sieve_filter.c
index dbe64cffa..56f20bfd5 100644
--- a/src/src/sieve.c
+++ b/src/src/miscmods/sieve_filter.c
@@ -3,11 +3,11 @@
*************************************************/
/*
- * Copyright (c) The Exim Maintainers 2016 - 2023
- * Copyright (c) Michael Haardt 2003 - 2015
- * See the file NOTICE for conditions of use and distribution.
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
+Copyright (c) The Exim Maintainers 2016 - 2024
+Copyright (c) Michael Haardt 2003 - 2015
+See the file NOTICE for conditions of use and distribution.
+SPDX-License-Identifier: GPL-2.0-or-later
+*/
/* This code was contributed by Michael Haardt. */
@@ -20,7 +20,7 @@
#include <stdlib.h>
#include <string.h>
-#include "exim.h"
+#include "../exim.h"
#if HAVE_ICONV
# include <iconv.h>
@@ -113,7 +113,7 @@ that callers don't get surprised.
List *MUST* end with a NULL. Which at least makes ifdef-vs-comma easier. */
-const uschar *exim_sieve_extension_list[] = {
+static const uschar *exim_sieve_extension_list[] = {
CUS"comparator-i;ascii-numeric",
CUS"copy",
#ifdef ENCODED_CHARACTER
@@ -283,7 +283,7 @@ Returns
-1 syntax error
*/
-int
+static int
check_mail_address(struct Sieve * filter, const gstring * address)
{
int start, end, domain;
@@ -1883,20 +1883,11 @@ static int
parse_matchtype(struct Sieve *filter, enum MatchType *m)
{
if (parse_identifier(filter, CUS ":is") == 1)
-{
- *m = MATCH_IS;
- return 1;
-}
+ { *m = MATCH_IS; return 1; }
else if (parse_identifier(filter, CUS ":contains") == 1)
-{
- *m = MATCH_CONTAINS;
- return 1;
-}
+ { *m = MATCH_CONTAINS; return 1; }
else if (parse_identifier(filter, CUS ":matches") == 1)
-{
- *m = MATCH_MATCHES;
- return 1;
-}
+ { *m = MATCH_MATCHES; return 1; }
else return 0;
}
@@ -3615,3 +3606,34 @@ expand_level--;
DEBUG(D_route) debug_printf_indent("Sieve: end of processing\n");
return r;
}
+
+
+/* Module API: print list of supported sieve extensions to given stream */
+static void
+sieve_extensions(FILE * fp)
+{
+for (const uschar ** pp = exim_sieve_extension_list; *pp; ++pp)
+ fprintf(fp, "%s\n", *pp);
+}
+
+
+/******************************************************************************/
+/* Module API */
+
+static void * sieve_functions[] = {
+ [SIEVE_INTERPRET] = sieve_interpret,
+ [SIEVE_EXTENSIONS] = sieve_extensions,
+};
+
+misc_module_info sieve_filter_module_info =
+{
+ .name = US"sieve_filter",
+# ifdef DYNLOOKUP
+ .dyn_magic = MISC_MODULE_MAGIC,
+# endif
+
+ .functions = sieve_functions,
+ .functions_count = nelem(sieve_functions),
+};
+
+/* End of sieve_filter.c */
diff --git a/src/src/miscmods/sieve_filter_api.h b/src/src/miscmods/sieve_filter_api.h
new file mode 100644
index 000000000..42294c5ae
--- /dev/null
+++ b/src/src/miscmods/sieve_filter_api.h
@@ -0,0 +1,15 @@
+/*************************************************
+* Exim - an Internet mail transport agent *
+*************************************************/
+
+/* Copyright (c) The Exim Maintainers 2024 */
+/* See the file NOTICE for conditions of use and distribution. */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+/* API definitions for the sieve_filter module */
+
+
+/* Function table entry numbers */
+
+#define SIEVE_INTERPRET 0
+#define SIEVE_EXTENSIONS 1
diff --git a/src/src/rda.c b/src/src/rda.c
index 8289ab084..3e3a0cf83 100644
--- a/src/src/rda.c
+++ b/src/src/rda.c
@@ -388,16 +388,27 @@ if (*filtertype != FILTER_FORWARD)
*error = US"Exim filtering not enabled";
return FF_ERROR;
}
+/*XXX*/
frc = filter_interpret(data, options, generated, error);
}
else
{
+ const misc_module_info * mi;
+ typedef int (*fn_t)(const uschar *, int, const sieve_block *,
+ address_item **, uschar **);
+
if (options & RDO_SIEVE_FILTER)
{
*error = US"Sieve filtering not enabled";
return FF_ERROR;
}
- frc = sieve_interpret(data, options, sieve, generated, error);
+ if (!(mi = misc_mod_find(US"sieve_filter", NULL)))
+ {
+ *error = US"Sieve filtering not available";
+ return FF_ERROR;
+ }
+ frc = (((fn_t *) mi->functions)[SIEVE_INTERPRET])
+ (data, options, sieve, generated, error);
}
expand_forbid = old_expand_forbid;
diff --git a/test/aux-fixed/0427.message b/test/aux-fixed/4160.message
similarity index 100%
rename from test/aux-fixed/0427.message
rename to test/aux-fixed/4160.message
diff --git a/test/aux-fixed/0427.message2 b/test/aux-fixed/4160.message2
similarity index 100%
rename from test/aux-fixed/0427.message2
rename to test/aux-fixed/4160.message2
diff --git a/test/aux-fixed/0427.message3 b/test/aux-fixed/4160.message3
similarity index 100%
rename from test/aux-fixed/0427.message3
rename to test/aux-fixed/4160.message3
diff --git a/test/aux-fixed/0506.sieve-filter b/test/aux-fixed/4162.sieve-filter
similarity index 100%
rename from test/aux-fixed/0506.sieve-filter
rename to test/aux-fixed/4162.sieve-filter
diff --git a/test/aux-fixed/0950.sieve b/test/aux-fixed/4163.sieve
similarity index 100%
rename from test/aux-fixed/0950.sieve
rename to test/aux-fixed/4163.sieve
diff --git a/test/confs/0427 b/test/confs/4160
similarity index 87%
rename from test/confs/0427
rename to test/confs/4160
index cdbc8ae3e..019476a48 100644
--- a/test/confs/0427
+++ b/test/confs/4160
@@ -1,4 +1,4 @@
-# Exim test configuration 0427
+# Exim test configuration 4160
.include DIR/aux-var/std_conf_prefix
diff --git a/test/confs/0428 b/test/confs/4161
similarity index 99%
rename from test/confs/0428
rename to test/confs/4161
index 0f6614bcf..f24502a83 100644
--- a/test/confs/0428
+++ b/test/confs/4161
@@ -1,4 +1,4 @@
-# Exim test configuration 0428
+# Exim test configuration 4161
.include DIR/aux-var/std_conf_prefix
diff --git a/test/confs/4162 b/test/confs/4162
new file mode 100644
index 000000000..76045b7ca
--- /dev/null
+++ b/test/confs/4162
@@ -0,0 +1,32 @@
+# Exim test configuration 4162
+
+ALLOW=allow_filter
+FORBID=
+
+.include DIR/aux-var/std_conf_prefix
+
+primary_hostname = myhost.test.ex
+
+# ----- Main settings -----
+
+log_selector = +queue_time_overall
+
+# ----- Routers -----
+
+begin routers
+
+r1:
+ driver = redirect
+ user = EXIMUSER
+ ALLOW
+ FORBID
+ file = ${lookup {TESTNUM.$local_part} dsearch,ret=full {DIR/aux-fixed} {$value}fail}
+
+
+# ----- Retry -----
+
+begin retry
+
+* * F,1d,1h
+
+# End
diff --git a/test/confs/0950 b/test/confs/4163
similarity index 96%
rename from test/confs/0950
rename to test/confs/4163
index f75e2c4d4..3b4f6df79 100644
--- a/test/confs/0950
+++ b/test/confs/4163
@@ -1,4 +1,4 @@
-# Exim test configuration 0950
+# Exim test configuration 4163
SERVER=
diff --git a/test/log/0506 b/test/log/0506
index db961727b..1e94ac0f8 100644
--- a/test/log/0506
+++ b/test/log/0506
@@ -1,13 +1,10 @@
1999-03-02 09:44:33 10HmaX-000000005vi-0000 <= CALLER@??? U=CALLER P=local S=sss
1999-03-02 09:44:33 10HmaX-000000005vi-0000 => discarded <exim-filter@???> R=r1
-1999-03-02 09:44:33 10HmaX-000000005vi-0000 => discarded <sieve-filter@???> R=r1
1999-03-02 09:44:33 10HmaX-000000005vi-0000 Completed QT=qqs
1999-03-02 09:44:33 10HmaY-000000005vi-0000 <= CALLER@??? U=CALLER P=local S=sss
1999-03-02 09:44:33 10HmaY-000000005vi-0000 => discarded <exim-filter@???> R=r1
-1999-03-02 09:44:33 10HmaY-000000005vi-0000 == sieve-filter@??? R=r1 defer (-17): error in filter file: Sieve filtering not enabled
+1999-03-02 09:44:33 10HmaY-000000005vi-0000 Completed QT=qqs
1999-03-02 09:44:33 10HmaZ-000000005vi-0000 <= CALLER@??? U=CALLER P=local S=sss
1999-03-02 09:44:33 10HmaZ-000000005vi-0000 == exim-filter@??? R=r1 defer (-17): error in filter file: Exim filtering not enabled
-1999-03-02 09:44:33 10HmaZ-000000005vi-0000 => discarded <sieve-filter@???> R=r1
1999-03-02 09:44:33 10HmbA-000000005vi-0000 <= CALLER@??? U=CALLER P=local S=sss
1999-03-02 09:44:33 10HmbA-000000005vi-0000 == exim-filter@??? R=r1 defer (-17): error in filter file: filtering not enabled
-1999-03-02 09:44:33 10HmbA-000000005vi-0000 == sieve-filter@??? R=r1 defer (-17): error in filter file: filtering not enabled
diff --git a/test/log/0428 b/test/log/4161
similarity index 100%
rename from test/log/0428
rename to test/log/4161
diff --git a/test/log/0506 b/test/log/4162
similarity index 66%
copy from test/log/0506
copy to test/log/4162
index db961727b..5d11b2a8d 100644
--- a/test/log/0506
+++ b/test/log/4162
@@ -1,13 +1,10 @@
1999-03-02 09:44:33 10HmaX-000000005vi-0000 <= CALLER@??? U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmaX-000000005vi-0000 => discarded <exim-filter@???> R=r1
1999-03-02 09:44:33 10HmaX-000000005vi-0000 => discarded <sieve-filter@???> R=r1
1999-03-02 09:44:33 10HmaX-000000005vi-0000 Completed QT=qqs
1999-03-02 09:44:33 10HmaY-000000005vi-0000 <= CALLER@??? U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmaY-000000005vi-0000 => discarded <exim-filter@???> R=r1
1999-03-02 09:44:33 10HmaY-000000005vi-0000 == sieve-filter@??? R=r1 defer (-17): error in filter file: Sieve filtering not enabled
1999-03-02 09:44:33 10HmaZ-000000005vi-0000 <= CALLER@??? U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmaZ-000000005vi-0000 == exim-filter@??? R=r1 defer (-17): error in filter file: Exim filtering not enabled
1999-03-02 09:44:33 10HmaZ-000000005vi-0000 => discarded <sieve-filter@???> R=r1
+1999-03-02 09:44:33 10HmaZ-000000005vi-0000 Completed QT=qqs
1999-03-02 09:44:33 10HmbA-000000005vi-0000 <= CALLER@??? U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmbA-000000005vi-0000 == exim-filter@??? R=r1 defer (-17): error in filter file: filtering not enabled
1999-03-02 09:44:33 10HmbA-000000005vi-0000 == sieve-filter@??? R=r1 defer (-17): error in filter file: filtering not enabled
diff --git a/test/log/0950 b/test/log/4163
similarity index 100%
rename from test/log/0950
rename to test/log/4163
diff --git a/test/mail/0428.CALLER b/test/mail/4161.CALLER
similarity index 100%
rename from test/mail/0428.CALLER
rename to test/mail/4161.CALLER
diff --git a/test/mail/0428.inbox.JUNK b/test/mail/4161.inbox.JUNK
similarity index 100%
rename from test/mail/0428.inbox.JUNK
rename to test/mail/4161.inbox.JUNK
diff --git a/test/mail/0428.inbox.changed b/test/mail/4161.inbox.changed
similarity index 100%
rename from test/mail/0428.inbox.changed
rename to test/mail/4161.inbox.changed
diff --git a/test/mail/0428.redirected b/test/mail/4161.redirected
similarity index 100%
rename from test/mail/0428.redirected
rename to test/mail/4161.redirected
diff --git a/test/mail/0428.someone b/test/mail/4161.someone
similarity index 100%
rename from test/mail/0428.someone
rename to test/mail/4161.someone
diff --git a/test/mail/0428.userx b/test/mail/4161.userx
similarity index 100%
rename from test/mail/0428.userx
rename to test/mail/4161.userx
diff --git a/test/mail/0428.userx-extra b/test/mail/4161.userx-extra
similarity index 100%
rename from test/mail/0428.userx-extra
rename to test/mail/4161.userx-extra
diff --git a/test/mail/0428.userx-sawsuffix b/test/mail/4161.userx-sawsuffix
similarity index 100%
rename from test/mail/0428.userx-sawsuffix
rename to test/mail/4161.userx-sawsuffix
diff --git a/test/mail/0428.userx13 b/test/mail/4161.userx13
similarity index 100%
rename from test/mail/0428.userx13
rename to test/mail/4161.userx13
diff --git a/test/mail/0428.userx14 b/test/mail/4161.userx14
similarity index 100%
rename from test/mail/0428.userx14
rename to test/mail/4161.userx14
diff --git a/test/mail/0428.userx9 b/test/mail/4161.userx9
similarity index 100%
rename from test/mail/0428.userx9
rename to test/mail/4161.userx9
diff --git a/test/mail/0950.CALLER b/test/mail/4163.CALLER
similarity index 100%
rename from test/mail/0950.CALLER
rename to test/mail/4163.CALLER
diff --git a/test/mail/0950.myfolder b/test/mail/4163.myfolder
similarity index 100%
rename from test/mail/0950.myfolder
rename to test/mail/4163.myfolder
diff --git a/test/scripts/0000-Basic/0506 b/test/scripts/0000-Basic/0506
index ed1d7bdff..4f388bb8c 100644
--- a/test/scripts/0000-Basic/0506
+++ b/test/scripts/0000-Basic/0506
@@ -1,10 +1,10 @@
-# forbid_sieve_filter and forbid_exim_filter
-exim -odi sieve-filter@??? exim-filter@???
+# forbid_exim_filter
+exim -odi exim-filter@???
****
-exim -DFORBID=forbid_sieve_filter -odi sieve-filter@??? exim-filter@???
+exim -DFORBID=forbid_sieve_filter -odi exim-filter@???
****
-exim -DFORBID=forbid_exim_filter -odi sieve-filter@??? exim-filter@???
+exim -DFORBID=forbid_exim_filter -odi exim-filter@???
****
-exim -DALLOW= -odi sieve-filter@??? exim-filter@???
+exim -DALLOW= -odi exim-filter@???
****
no_msglog_check
diff --git a/test/scripts/0000-Basic/0427 b/test/scripts/4160-sieve-filter/4160
similarity index 100%
rename from test/scripts/0000-Basic/0427
rename to test/scripts/4160-sieve-filter/4160
diff --git a/test/scripts/0000-Basic/0428 b/test/scripts/4160-sieve-filter/4161
similarity index 100%
rename from test/scripts/0000-Basic/0428
rename to test/scripts/4160-sieve-filter/4161
diff --git a/test/scripts/4160-sieve-filter/4162 b/test/scripts/4160-sieve-filter/4162
new file mode 100644
index 000000000..156a73ba4
--- /dev/null
+++ b/test/scripts/4160-sieve-filter/4162
@@ -0,0 +1,10 @@
+# forbid_sieve_filter
+exim -odi sieve-filter@???
+****
+exim -DFORBID=forbid_sieve_filter -odi sieve-filter@???
+****
+exim -DFORBID=forbid_exim_filter -odi sieve-filter@???
+****
+exim -DALLOW= -odi sieve-filter@???
+****
+no_msglog_check
diff --git a/test/scripts/0000-Basic/0950 b/test/scripts/4160-sieve-filter/4163
similarity index 100%
rename from test/scripts/0000-Basic/0950
rename to test/scripts/4160-sieve-filter/4163
diff --git a/test/scripts/4160-sieve-filter/REQUIRES b/test/scripts/4160-sieve-filter/REQUIRES
new file mode 100644
index 000000000..dd2bec191
--- /dev/null
+++ b/test/scripts/4160-sieve-filter/REQUIRES
@@ -0,0 +1 @@
+support Sieve_filter
diff --git a/test/stdout/0427 b/test/stdout/4160
similarity index 100%
rename from test/stdout/0427
rename to test/stdout/4160
diff --git a/test/stdout/0950 b/test/stdout/4163
similarity index 100%
rename from test/stdout/0950
rename to test/stdout/4163
--
## subscription configuration (requires account):
##
https://lists.exim.org/mailman3/postorius/lists/exim-cvs.lists.exim.org/
## unsubscribe (doesn't require an account):
## exim-cvs-unsubscribe@???
## Exim details at
http://www.exim.org/
## Please use the Wiki with this list -
http://wiki.exim.org/