Events: Fire msg:fail:internal for a non-system filter "fail" command. Bug 2322
authorMatthias Kurz <m.kurz@irregular.at>
Fri, 28 Sep 2018 22:05:02 +0000 (23:05 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Fri, 28 Sep 2018 22:18:42 +0000 (23:18 +0100)
doc/doc-txt/ChangeLog
src/src/deliver.c
test/aux-fixed/5704.filter [new file with mode: 0644]
test/aux-fixed/5706.filter [new file with mode: 0644]
test/confs/5704 [new file with mode: 0644]
test/log/5704 [new file with mode: 0644]
test/scripts/5700-events/5704 [new file with mode: 0644]

index 0f50318..6f16fed 100644 (file)
@@ -134,6 +134,9 @@ JH/28 Bug 2314: Fire msg:fail:delivery event even when error is being ignored.
       move the existing event to fire before the normal logging of message
       failure so that custom logging is bracketed by normal logging.
 
+JH/29 Bug 2322: A "fail" command in a non-system filter (file) now fires the
+      msg:fail:internal event.  Developement by Matthias Kurz.
+
 
 Exim version 4.91
 -----------------
index bba343c..24c4048 100644 (file)
@@ -877,21 +877,33 @@ const uschar * save_host = deliver_host;
 const uschar * save_address = deliver_host_address;
 const int      save_port =   deliver_host_port;
 
-if (!addr->transport)
-  return;
-
 router_name =    addr->router ? addr->router->name : NULL;
-transport_name = addr->transport->name;
 deliver_domain = addr->domain;
 deliver_localpart = addr->local_part;
 deliver_host =   addr->host_used ? addr->host_used->name : NULL;
 
-(void) event_raise(addr->transport->event_action, event,
-         addr->host_used
-          || Ustrcmp(addr->transport->driver_name, "smtp") == 0
-         || Ustrcmp(addr->transport->driver_name, "lmtp") == 0
-         || Ustrcmp(addr->transport->driver_name, "autoreply") == 0
-        ? addr->message : NULL);
+if (!addr->transport)
+  {
+  if (Ustrcmp(event, "msg:fail:delivery") == 0)
+    {
+     /* An address failed with no transport involved. This happens when
+     a filter was used which triggered a fail command (in such a case
+     a transport isn't needed).  Convert it to an internal fail event. */
+
+    (void) event_raise(event_action, US"msg:fail:internal", addr->message);
+    }
+  }
+else
+  {
+  transport_name = addr->transport->name;
+
+  (void) event_raise(addr->transport->event_action, event,
+           addr->host_used
+           || Ustrcmp(addr->transport->driver_name, "smtp") == 0
+           || Ustrcmp(addr->transport->driver_name, "lmtp") == 0
+           || Ustrcmp(addr->transport->driver_name, "autoreply") == 0
+          ? addr->message : NULL);
+  }
 
 deliver_host_port =    save_port;
 deliver_host_address = save_address;
diff --git a/test/aux-fixed/5704.filter b/test/aux-fixed/5704.filter
new file mode 100644 (file)
index 0000000..7d01325
--- /dev/null
@@ -0,0 +1,4 @@
+# Exim filter
+
+if not error_message
+then fail text "failed in system filter file" endif
diff --git a/test/aux-fixed/5706.filter b/test/aux-fixed/5706.filter
new file mode 100644 (file)
index 0000000..b434b77
--- /dev/null
@@ -0,0 +1,3 @@
+# Exim filter
+
+fail "failed in filter file"
diff --git a/test/confs/5704 b/test/confs/5704
new file mode 100644 (file)
index 0000000..a174944
--- /dev/null
@@ -0,0 +1,28 @@
+# Exim test configuration 5704
+
+.include DIR/aux-var/std_conf_prefix
+
+# ----- Main settings -----
+
+system_filter = DIR/aux-fixed/TESTNUM.filter
+
+event_action = ${acl {logger}}
+
+# ----- ACL -----
+
+begin acl
+
+.include DIR/aux-fixed/event-logger-acl
+
+# ----- Routers -----
+
+begin routers
+
+dump_bounces:
+  driver = redirect
+  senders = :
+  data = :blackhole:
+
+# ----- Transports -----
+
+# End
diff --git a/test/log/5704 b/test/log/5704
new file mode 100644 (file)
index 0000000..ac2d365
--- /dev/null
@@ -0,0 +1,12 @@
+1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmaX-0005vi-00 cancelled by system filter: failed in system filter file
+1999-03-02 09:44:33 10HmaX-0005vi-00 event msg:fail:internal
+1999-03-02 09:44:33 10HmaX-0005vi-00 . local_part <userx> domain <domain1> reason <failed in system filter file>
+1999-03-02 09:44:33 10HmaY-0005vi-00 <= <> R=10HmaX-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmaY-0005vi-00 => :blackhole: <CALLER@the.local.host.name> R=dump_bounces
+1999-03-02 09:44:33 10HmaY-0005vi-00 Completed
+1999-03-02 09:44:33 10HmaY-0005vi-00 event msg:complete
+1999-03-02 09:44:33 10HmaY-0005vi-00 . finished: 10HmaY-0005vi-00
+1999-03-02 09:44:33 10HmaX-0005vi-00 Completed
+1999-03-02 09:44:33 10HmaX-0005vi-00 event msg:complete
+1999-03-02 09:44:33 10HmaX-0005vi-00 . finished: 10HmaX-0005vi-00
diff --git a/test/scripts/5700-events/5704 b/test/scripts/5700-events/5704
new file mode 100644 (file)
index 0000000..3ed25aa
--- /dev/null
@@ -0,0 +1,5 @@
+# System filter which triggers fail command results in event.
+#
+exim -odi userx@domain1
+Processed by a system filter which triggers fail command.
+****