Taint: generate detainted $domain_data & $local_part_data from Rverify callout
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 30 Apr 2022 22:57:33 +0000 (23:57 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 30 Apr 2022 22:57:33 +0000 (23:57 +0100)
doc/doc-docbook/spec.xfpt
doc/doc-txt/NewStuff
src/src/verify.c
test/scripts/0000-Basic/0473
test/stdout/0473

index ef8fc683669c0fca71f5eedf524ebd1d605510dc..b6fd9e10f474dba3c366002e043b5bb704318aa3 100644 (file)
@@ -33620,6 +33620,15 @@ output before performing a callout in an ACL, to avoid unexpected timeouts in
 clients when the SMTP PIPELINING extension is in use. The flushing can be
 disabled by using a &%control%& modifier to set &%no_callout_flush%&.
 
+.new
+.cindex "tainted data" "de-tainting"
+.cindex "de-tainting" "using receipient verify"
+A recipient callout which gets a 2&'xx'& code
+will assign untainted values to the
+&$domain_data$& and &$local_part_data$& variables,
+corresponding to the domain and local parts of the recipient address.
+.wen
+
 
 
 
index 11004e33a59376c6d024e8c32420b69c6a66a81d..2986b2cdd9ccb7af902293067727eb74e6f99cad 100644 (file)
@@ -27,6 +27,9 @@ Version 4.96
     the expansion of the "true" result of the ${if}.  With a static list, this
     can be used for de-tainting.
 
+ 8. Recipient verify callouts now set $domain_data & $local_part_data, with
+    de-tainted values.
+
 Version 4.95
 ------------
 
index 82fae89c1632a6a73a1535092b580616d23bd20e..b4c2b9a8fbecb81f2e2fc8a90b8459d10a2db468 100644 (file)
@@ -445,6 +445,21 @@ return done;
 }
 
 
+
+
+/* A rcpt callout, or cached record of one, verified the address.
+Set $domain_data and $local_part_data to detainted versions.
+*/
+static void
+callout_verified_rcpt(const address_item * addr)
+{
+address_item a = {.address = addr->address};
+if (deliver_split_address(&a) != OK) return;
+deliver_localpart_data = string_copy_taint(a.local_part, GET_UNTAINTED);
+deliver_domain_data =    string_copy_taint(a.domain,     GET_UNTAINTED);
+}
+
+
 /*************************************************
 *      Do callout verification for an address    *
 *************************************************/
@@ -1952,6 +1967,12 @@ while (addr_new)
 #ifndef DISABLE_TLS
          deliver_set_expansions(NULL);
 #endif
+         if (  options & vopt_is_recipient
+            && rc == OK
+                        /* set to "random", with OK, for an accepted random */
+            && !recipient_verify_failure
+            )
+           callout_verified_rcpt(addr);
           }
         }
       else if (local_verify)
index df613c4b7ca53378be2f7e95b8de370fc5524a94..4392c7e33d247a75807cbf577198791614e88f25 100644 (file)
@@ -94,6 +94,7 @@ RCPT TO
 QUIT
 250 OK
 ****
+# A rcpt refusal
 exim -bs
 ehlo xxxx
 mail from:<x9@test.ex>
@@ -143,6 +144,7 @@ RCPT TO
 QUIT
 250 OK
 ****
+# an accepted random
 exim -DUSE_SENDER=,defer_ok,random,use_postmaster -bs
 ehlo xxxx
 mail from: x11@two.test.ex
@@ -150,6 +152,13 @@ rcpt to: r11@two.test.ex
 quit
 ****
 dump callout
+# repeat from cache
+exim -DUSE_SENDER=,defer_ok,random,use_postmaster -bs
+ehlo xxxx
+mail from: x11@two.test.ex
+rcpt to: r11@two.test.ex
+quit
+****
 #
 # callout target dumps after random-reject
 server PORT_S 2
index eda29bd92fd3c38ae9e10015d5d3d7c70c9aa368..7ac03f12a5f0e5f7b6c64006d8c70341e8c91ec8 100644 (file)
 250 OK\r
 250 Accepted\r
 221 the.local.host.name closing connection\r
+220 the.local.host.name ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
+250-the.local.host.name Hello CALLER at xxxx\r
+250-SIZE 52428800\r
+250-8BITMIME\r
+250-PIPELINING\r
+250 HELP\r
+250 OK\r
+250 Accepted\r
+221 the.local.host.name closing connection\r
 +++++++++++++++++++++++++++
 07-Mar-2000 12:21:52 other.ex callout=accept postmaster=unknown random=unknown
 07-Mar-2000 12:21:52 r12@three.test.ex callout=accept