Merge tag 'exim-4_82_1' exim-4_83_RC1
authorTodd Lyons <tlyons@exim.org>
Wed, 28 May 2014 12:12:00 +0000 (05:12 -0700)
committerTodd Lyons <tlyons@exim.org>
Wed, 28 May 2014 12:12:00 +0000 (05:12 -0700)
Fix Conflicts:
src/src/dmarc.c

549 files changed:
doc/doc-docbook/.gitignore
doc/doc-docbook/filter.xfpt
doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
doc/doc-txt/OptionLists.txt
doc/doc-txt/experimental-spec.txt
release-process/scripts/mk_exim_release.pl
release-process/scripts/quickrelease [new file with mode: 0755]
src/Makefile
src/OS/Makefile-Base
src/OS/os.c-Linux
src/README.DSN [new file with mode: 0644]
src/exim_monitor/em_globals.c
src/exim_monitor/em_log.c
src/scripts/Configure-Makefile
src/scripts/MakeLinks
src/scripts/lookups-Makefile
src/src/EDITME
src/src/acl.c
src/src/auths/dovecot.c
src/src/config.h.defaults
src/src/daemon.c
src/src/deliver.c
src/src/dkim.c
src/src/dmarc.c
src/src/dmarc.h
src/src/dns.c
src/src/drtables.c
src/src/exigrep.src
src/src/exim.c
src/src/exim.h
src/src/eximstats.src
src/src/exiqgrep.src
src/src/expand.c
src/src/functions.h
src/src/globals.c
src/src/globals.h
src/src/host.c
src/src/ip.c
src/src/local_scan.h
src/src/log.c
src/src/lookups/dnsdb.c
src/src/lookups/ldap.c
src/src/macros.h
src/src/malware.c
src/src/match.c
src/src/moan.c
src/src/readconf.c
src/src/receive.c
src/src/route.c
src/src/routers/dnslookup.c
src/src/routers/dnslookup.h
src/src/routers/rf_get_munge_headers.c
src/src/routers/rf_lookup_hostlist.c
src/src/smtp_in.c
src/src/spf.c
src/src/spool_in.c
src/src/spool_out.c
src/src/string.c
src/src/structs.h
src/src/tls-gnu.c
src/src/tls-openssl.c
src/src/tls.c
src/src/tlscert-gnu.c [new file with mode: 0644]
src/src/tlscert-openssl.c [new file with mode: 0644]
src/src/tod.c
src/src/transport.c
src/src/transports/lmtp.c
src/src/transports/pipe.c
src/src/transports/pipe.h
src/src/transports/smtp.c
src/src/transports/smtp.h
src/src/verify.c
src/util/proxy_protocol_client.pl [new file with mode: 0644]
test/Makefile.in
test/aux-fixed/exim-ca/README
test/aux-fixed/exim-ca/example.com/BLANK/CA.pem
test/aux-fixed/exim-ca/example.com/BLANK/Signer.pem
test/aux-fixed/exim-ca/example.com/BLANK/cert8.db
test/aux-fixed/exim-ca/example.com/BLANK/key3.db
test/aux-fixed/exim-ca/example.com/BLANK/secmod.db
test/aux-fixed/exim-ca/example.com/CA/CA.pem
test/aux-fixed/exim-ca/example.com/CA/OCSP.key
test/aux-fixed/exim-ca/example.com/CA/OCSP.p12
test/aux-fixed/exim-ca/example.com/CA/OCSP.pem
test/aux-fixed/exim-ca/example.com/CA/Signer.pem
test/aux-fixed/exim-ca/example.com/CA/ca.conf
test/aux-fixed/exim-ca/example.com/CA/cert8.db
test/aux-fixed/exim-ca/example.com/CA/crl.empty
test/aux-fixed/exim-ca/example.com/CA/crl.empty.in.txt
test/aux-fixed/exim-ca/example.com/CA/crl.empty.pem
test/aux-fixed/exim-ca/example.com/CA/crl.v2
test/aux-fixed/exim-ca/example.com/CA/crl.v2.in.txt
test/aux-fixed/exim-ca/example.com/CA/crl.v2.pem
test/aux-fixed/exim-ca/example.com/CA/key3.db
test/aux-fixed/exim-ca/example.com/CA/noise.file
test/aux-fixed/exim-ca/example.com/CA/secmod.db
test/aux-fixed/exim-ca/example.com/expired1.example.com/ca_chain.pem
test/aux-fixed/exim-ca/example.com/expired1.example.com/cert8.db
test/aux-fixed/exim-ca/example.com/expired1.example.com/expired1.example.com.chain.pem
test/aux-fixed/exim-ca/example.com/expired1.example.com/expired1.example.com.key
test/aux-fixed/exim-ca/example.com/expired1.example.com/expired1.example.com.ocsp.dated.resp
test/aux-fixed/exim-ca/example.com/expired1.example.com/expired1.example.com.ocsp.good.resp
test/aux-fixed/exim-ca/example.com/expired1.example.com/expired1.example.com.ocsp.req
test/aux-fixed/exim-ca/example.com/expired1.example.com/expired1.example.com.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.com/expired1.example.com/expired1.example.com.p12
test/aux-fixed/exim-ca/example.com/expired1.example.com/expired1.example.com.pem
test/aux-fixed/exim-ca/example.com/expired1.example.com/expired1.example.com.unlocked.key
test/aux-fixed/exim-ca/example.com/expired1.example.com/key3.db
test/aux-fixed/exim-ca/example.com/expired1.example.com/secmod.db
test/aux-fixed/exim-ca/example.com/expired2.example.com/ca_chain.pem
test/aux-fixed/exim-ca/example.com/expired2.example.com/cert8.db
test/aux-fixed/exim-ca/example.com/expired2.example.com/expired2.example.com.chain.pem
test/aux-fixed/exim-ca/example.com/expired2.example.com/expired2.example.com.key
test/aux-fixed/exim-ca/example.com/expired2.example.com/expired2.example.com.ocsp.dated.resp
test/aux-fixed/exim-ca/example.com/expired2.example.com/expired2.example.com.ocsp.good.resp
test/aux-fixed/exim-ca/example.com/expired2.example.com/expired2.example.com.ocsp.req
test/aux-fixed/exim-ca/example.com/expired2.example.com/expired2.example.com.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.com/expired2.example.com/expired2.example.com.p12
test/aux-fixed/exim-ca/example.com/expired2.example.com/expired2.example.com.pem
test/aux-fixed/exim-ca/example.com/expired2.example.com/expired2.example.com.unlocked.key
test/aux-fixed/exim-ca/example.com/expired2.example.com/key3.db
test/aux-fixed/exim-ca/example.com/expired2.example.com/secmod.db
test/aux-fixed/exim-ca/example.com/revoked1.example.com/ca_chain.pem
test/aux-fixed/exim-ca/example.com/revoked1.example.com/cert8.db
test/aux-fixed/exim-ca/example.com/revoked1.example.com/key3.db
test/aux-fixed/exim-ca/example.com/revoked1.example.com/revoked1.example.com.chain.pem
test/aux-fixed/exim-ca/example.com/revoked1.example.com/revoked1.example.com.key
test/aux-fixed/exim-ca/example.com/revoked1.example.com/revoked1.example.com.ocsp.dated.resp
test/aux-fixed/exim-ca/example.com/revoked1.example.com/revoked1.example.com.ocsp.good.resp
test/aux-fixed/exim-ca/example.com/revoked1.example.com/revoked1.example.com.ocsp.req
test/aux-fixed/exim-ca/example.com/revoked1.example.com/revoked1.example.com.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.com/revoked1.example.com/revoked1.example.com.p12
test/aux-fixed/exim-ca/example.com/revoked1.example.com/revoked1.example.com.pem
test/aux-fixed/exim-ca/example.com/revoked1.example.com/revoked1.example.com.unlocked.key
test/aux-fixed/exim-ca/example.com/revoked1.example.com/secmod.db
test/aux-fixed/exim-ca/example.com/revoked2.example.com/ca_chain.pem
test/aux-fixed/exim-ca/example.com/revoked2.example.com/cert8.db
test/aux-fixed/exim-ca/example.com/revoked2.example.com/key3.db
test/aux-fixed/exim-ca/example.com/revoked2.example.com/revoked2.example.com.chain.pem
test/aux-fixed/exim-ca/example.com/revoked2.example.com/revoked2.example.com.key
test/aux-fixed/exim-ca/example.com/revoked2.example.com/revoked2.example.com.ocsp.dated.resp
test/aux-fixed/exim-ca/example.com/revoked2.example.com/revoked2.example.com.ocsp.good.resp
test/aux-fixed/exim-ca/example.com/revoked2.example.com/revoked2.example.com.ocsp.req
test/aux-fixed/exim-ca/example.com/revoked2.example.com/revoked2.example.com.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.com/revoked2.example.com/revoked2.example.com.p12
test/aux-fixed/exim-ca/example.com/revoked2.example.com/revoked2.example.com.pem
test/aux-fixed/exim-ca/example.com/revoked2.example.com/revoked2.example.com.unlocked.key
test/aux-fixed/exim-ca/example.com/revoked2.example.com/secmod.db
test/aux-fixed/exim-ca/example.com/server1.example.com/ca_chain.pem
test/aux-fixed/exim-ca/example.com/server1.example.com/cert8.db
test/aux-fixed/exim-ca/example.com/server1.example.com/key3.db
test/aux-fixed/exim-ca/example.com/server1.example.com/secmod.db
test/aux-fixed/exim-ca/example.com/server1.example.com/server1.example.com.chain.pem
test/aux-fixed/exim-ca/example.com/server1.example.com/server1.example.com.key
test/aux-fixed/exim-ca/example.com/server1.example.com/server1.example.com.ocsp.dated.resp
test/aux-fixed/exim-ca/example.com/server1.example.com/server1.example.com.ocsp.good.resp
test/aux-fixed/exim-ca/example.com/server1.example.com/server1.example.com.ocsp.req
test/aux-fixed/exim-ca/example.com/server1.example.com/server1.example.com.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.com/server1.example.com/server1.example.com.p12
test/aux-fixed/exim-ca/example.com/server1.example.com/server1.example.com.pem
test/aux-fixed/exim-ca/example.com/server1.example.com/server1.example.com.unlocked.key
test/aux-fixed/exim-ca/example.com/server2.example.com/ca_chain.pem
test/aux-fixed/exim-ca/example.com/server2.example.com/cert8.db
test/aux-fixed/exim-ca/example.com/server2.example.com/key3.db
test/aux-fixed/exim-ca/example.com/server2.example.com/secmod.db
test/aux-fixed/exim-ca/example.com/server2.example.com/server2.example.com.chain.pem
test/aux-fixed/exim-ca/example.com/server2.example.com/server2.example.com.key
test/aux-fixed/exim-ca/example.com/server2.example.com/server2.example.com.ocsp.dated.resp
test/aux-fixed/exim-ca/example.com/server2.example.com/server2.example.com.ocsp.good.resp
test/aux-fixed/exim-ca/example.com/server2.example.com/server2.example.com.ocsp.req
test/aux-fixed/exim-ca/example.com/server2.example.com/server2.example.com.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.com/server2.example.com/server2.example.com.p12
test/aux-fixed/exim-ca/example.com/server2.example.com/server2.example.com.pem
test/aux-fixed/exim-ca/example.com/server2.example.com/server2.example.com.unlocked.key
test/aux-fixed/exim-ca/example.net/BLANK/CA.pem
test/aux-fixed/exim-ca/example.net/BLANK/Signer.pem
test/aux-fixed/exim-ca/example.net/BLANK/cert8.db
test/aux-fixed/exim-ca/example.net/BLANK/key3.db
test/aux-fixed/exim-ca/example.net/BLANK/secmod.db
test/aux-fixed/exim-ca/example.net/CA/CA.pem
test/aux-fixed/exim-ca/example.net/CA/OCSP.key
test/aux-fixed/exim-ca/example.net/CA/OCSP.p12
test/aux-fixed/exim-ca/example.net/CA/OCSP.pem
test/aux-fixed/exim-ca/example.net/CA/Signer.pem
test/aux-fixed/exim-ca/example.net/CA/ca.conf
test/aux-fixed/exim-ca/example.net/CA/cert8.db
test/aux-fixed/exim-ca/example.net/CA/crl.empty
test/aux-fixed/exim-ca/example.net/CA/crl.empty.in.txt
test/aux-fixed/exim-ca/example.net/CA/crl.empty.pem
test/aux-fixed/exim-ca/example.net/CA/crl.v2
test/aux-fixed/exim-ca/example.net/CA/crl.v2.in.txt
test/aux-fixed/exim-ca/example.net/CA/crl.v2.pem
test/aux-fixed/exim-ca/example.net/CA/key3.db
test/aux-fixed/exim-ca/example.net/CA/noise.file
test/aux-fixed/exim-ca/example.net/CA/secmod.db
test/aux-fixed/exim-ca/example.net/expired1.example.net/ca_chain.pem
test/aux-fixed/exim-ca/example.net/expired1.example.net/cert8.db
test/aux-fixed/exim-ca/example.net/expired1.example.net/expired1.example.net.chain.pem
test/aux-fixed/exim-ca/example.net/expired1.example.net/expired1.example.net.key
test/aux-fixed/exim-ca/example.net/expired1.example.net/expired1.example.net.ocsp.dated.resp
test/aux-fixed/exim-ca/example.net/expired1.example.net/expired1.example.net.ocsp.good.resp
test/aux-fixed/exim-ca/example.net/expired1.example.net/expired1.example.net.ocsp.req
test/aux-fixed/exim-ca/example.net/expired1.example.net/expired1.example.net.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.net/expired1.example.net/expired1.example.net.p12
test/aux-fixed/exim-ca/example.net/expired1.example.net/expired1.example.net.pem
test/aux-fixed/exim-ca/example.net/expired1.example.net/expired1.example.net.unlocked.key
test/aux-fixed/exim-ca/example.net/expired1.example.net/key3.db
test/aux-fixed/exim-ca/example.net/expired1.example.net/secmod.db
test/aux-fixed/exim-ca/example.net/expired2.example.net/ca_chain.pem
test/aux-fixed/exim-ca/example.net/expired2.example.net/cert8.db
test/aux-fixed/exim-ca/example.net/expired2.example.net/expired2.example.net.chain.pem
test/aux-fixed/exim-ca/example.net/expired2.example.net/expired2.example.net.key
test/aux-fixed/exim-ca/example.net/expired2.example.net/expired2.example.net.ocsp.dated.resp
test/aux-fixed/exim-ca/example.net/expired2.example.net/expired2.example.net.ocsp.good.resp
test/aux-fixed/exim-ca/example.net/expired2.example.net/expired2.example.net.ocsp.req
test/aux-fixed/exim-ca/example.net/expired2.example.net/expired2.example.net.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.net/expired2.example.net/expired2.example.net.p12
test/aux-fixed/exim-ca/example.net/expired2.example.net/expired2.example.net.pem
test/aux-fixed/exim-ca/example.net/expired2.example.net/expired2.example.net.unlocked.key
test/aux-fixed/exim-ca/example.net/expired2.example.net/key3.db
test/aux-fixed/exim-ca/example.net/expired2.example.net/secmod.db
test/aux-fixed/exim-ca/example.net/revoked1.example.net/ca_chain.pem
test/aux-fixed/exim-ca/example.net/revoked1.example.net/cert8.db
test/aux-fixed/exim-ca/example.net/revoked1.example.net/key3.db
test/aux-fixed/exim-ca/example.net/revoked1.example.net/revoked1.example.net.chain.pem
test/aux-fixed/exim-ca/example.net/revoked1.example.net/revoked1.example.net.key
test/aux-fixed/exim-ca/example.net/revoked1.example.net/revoked1.example.net.ocsp.dated.resp
test/aux-fixed/exim-ca/example.net/revoked1.example.net/revoked1.example.net.ocsp.good.resp
test/aux-fixed/exim-ca/example.net/revoked1.example.net/revoked1.example.net.ocsp.req
test/aux-fixed/exim-ca/example.net/revoked1.example.net/revoked1.example.net.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.net/revoked1.example.net/revoked1.example.net.p12
test/aux-fixed/exim-ca/example.net/revoked1.example.net/revoked1.example.net.pem
test/aux-fixed/exim-ca/example.net/revoked1.example.net/revoked1.example.net.unlocked.key
test/aux-fixed/exim-ca/example.net/revoked1.example.net/secmod.db
test/aux-fixed/exim-ca/example.net/revoked2.example.net/ca_chain.pem
test/aux-fixed/exim-ca/example.net/revoked2.example.net/cert8.db
test/aux-fixed/exim-ca/example.net/revoked2.example.net/key3.db
test/aux-fixed/exim-ca/example.net/revoked2.example.net/revoked2.example.net.chain.pem
test/aux-fixed/exim-ca/example.net/revoked2.example.net/revoked2.example.net.key
test/aux-fixed/exim-ca/example.net/revoked2.example.net/revoked2.example.net.ocsp.dated.resp
test/aux-fixed/exim-ca/example.net/revoked2.example.net/revoked2.example.net.ocsp.good.resp
test/aux-fixed/exim-ca/example.net/revoked2.example.net/revoked2.example.net.ocsp.req
test/aux-fixed/exim-ca/example.net/revoked2.example.net/revoked2.example.net.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.net/revoked2.example.net/revoked2.example.net.p12
test/aux-fixed/exim-ca/example.net/revoked2.example.net/revoked2.example.net.pem
test/aux-fixed/exim-ca/example.net/revoked2.example.net/revoked2.example.net.unlocked.key
test/aux-fixed/exim-ca/example.net/revoked2.example.net/secmod.db
test/aux-fixed/exim-ca/example.net/server1.example.net/ca_chain.pem
test/aux-fixed/exim-ca/example.net/server1.example.net/cert8.db
test/aux-fixed/exim-ca/example.net/server1.example.net/key3.db
test/aux-fixed/exim-ca/example.net/server1.example.net/secmod.db
test/aux-fixed/exim-ca/example.net/server1.example.net/server1.example.net.chain.pem
test/aux-fixed/exim-ca/example.net/server1.example.net/server1.example.net.key
test/aux-fixed/exim-ca/example.net/server1.example.net/server1.example.net.ocsp.dated.resp
test/aux-fixed/exim-ca/example.net/server1.example.net/server1.example.net.ocsp.good.resp
test/aux-fixed/exim-ca/example.net/server1.example.net/server1.example.net.ocsp.req
test/aux-fixed/exim-ca/example.net/server1.example.net/server1.example.net.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.net/server1.example.net/server1.example.net.p12
test/aux-fixed/exim-ca/example.net/server1.example.net/server1.example.net.pem
test/aux-fixed/exim-ca/example.net/server1.example.net/server1.example.net.unlocked.key
test/aux-fixed/exim-ca/example.net/server2.example.net/ca_chain.pem
test/aux-fixed/exim-ca/example.net/server2.example.net/cert8.db
test/aux-fixed/exim-ca/example.net/server2.example.net/key3.db
test/aux-fixed/exim-ca/example.net/server2.example.net/secmod.db
test/aux-fixed/exim-ca/example.net/server2.example.net/server2.example.net.chain.pem
test/aux-fixed/exim-ca/example.net/server2.example.net/server2.example.net.key
test/aux-fixed/exim-ca/example.net/server2.example.net/server2.example.net.ocsp.dated.resp
test/aux-fixed/exim-ca/example.net/server2.example.net/server2.example.net.ocsp.good.resp
test/aux-fixed/exim-ca/example.net/server2.example.net/server2.example.net.ocsp.req
test/aux-fixed/exim-ca/example.net/server2.example.net/server2.example.net.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.net/server2.example.net/server2.example.net.p12
test/aux-fixed/exim-ca/example.net/server2.example.net/server2.example.net.pem
test/aux-fixed/exim-ca/example.net/server2.example.net/server2.example.net.unlocked.key
test/aux-fixed/exim-ca/example.org/BLANK/CA.pem
test/aux-fixed/exim-ca/example.org/BLANK/Signer.pem
test/aux-fixed/exim-ca/example.org/BLANK/cert8.db
test/aux-fixed/exim-ca/example.org/BLANK/key3.db
test/aux-fixed/exim-ca/example.org/BLANK/secmod.db
test/aux-fixed/exim-ca/example.org/CA/CA.pem
test/aux-fixed/exim-ca/example.org/CA/OCSP.key
test/aux-fixed/exim-ca/example.org/CA/OCSP.p12
test/aux-fixed/exim-ca/example.org/CA/OCSP.pem
test/aux-fixed/exim-ca/example.org/CA/Signer.pem
test/aux-fixed/exim-ca/example.org/CA/ca.conf
test/aux-fixed/exim-ca/example.org/CA/cert8.db
test/aux-fixed/exim-ca/example.org/CA/crl.empty
test/aux-fixed/exim-ca/example.org/CA/crl.empty.in.txt
test/aux-fixed/exim-ca/example.org/CA/crl.empty.pem
test/aux-fixed/exim-ca/example.org/CA/crl.v2
test/aux-fixed/exim-ca/example.org/CA/crl.v2.in.txt
test/aux-fixed/exim-ca/example.org/CA/crl.v2.pem
test/aux-fixed/exim-ca/example.org/CA/key3.db
test/aux-fixed/exim-ca/example.org/CA/noise.file
test/aux-fixed/exim-ca/example.org/CA/secmod.db
test/aux-fixed/exim-ca/example.org/expired1.example.org/ca_chain.pem
test/aux-fixed/exim-ca/example.org/expired1.example.org/cert8.db
test/aux-fixed/exim-ca/example.org/expired1.example.org/expired1.example.org.chain.pem
test/aux-fixed/exim-ca/example.org/expired1.example.org/expired1.example.org.key
test/aux-fixed/exim-ca/example.org/expired1.example.org/expired1.example.org.ocsp.dated.resp
test/aux-fixed/exim-ca/example.org/expired1.example.org/expired1.example.org.ocsp.good.resp
test/aux-fixed/exim-ca/example.org/expired1.example.org/expired1.example.org.ocsp.req
test/aux-fixed/exim-ca/example.org/expired1.example.org/expired1.example.org.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.org/expired1.example.org/expired1.example.org.p12
test/aux-fixed/exim-ca/example.org/expired1.example.org/expired1.example.org.pem
test/aux-fixed/exim-ca/example.org/expired1.example.org/expired1.example.org.unlocked.key
test/aux-fixed/exim-ca/example.org/expired1.example.org/key3.db
test/aux-fixed/exim-ca/example.org/expired1.example.org/secmod.db
test/aux-fixed/exim-ca/example.org/expired2.example.org/ca_chain.pem
test/aux-fixed/exim-ca/example.org/expired2.example.org/cert8.db
test/aux-fixed/exim-ca/example.org/expired2.example.org/expired2.example.org.chain.pem
test/aux-fixed/exim-ca/example.org/expired2.example.org/expired2.example.org.key
test/aux-fixed/exim-ca/example.org/expired2.example.org/expired2.example.org.ocsp.dated.resp
test/aux-fixed/exim-ca/example.org/expired2.example.org/expired2.example.org.ocsp.good.resp
test/aux-fixed/exim-ca/example.org/expired2.example.org/expired2.example.org.ocsp.req
test/aux-fixed/exim-ca/example.org/expired2.example.org/expired2.example.org.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.org/expired2.example.org/expired2.example.org.p12
test/aux-fixed/exim-ca/example.org/expired2.example.org/expired2.example.org.pem
test/aux-fixed/exim-ca/example.org/expired2.example.org/expired2.example.org.unlocked.key
test/aux-fixed/exim-ca/example.org/expired2.example.org/key3.db
test/aux-fixed/exim-ca/example.org/expired2.example.org/secmod.db
test/aux-fixed/exim-ca/example.org/revoked1.example.org/ca_chain.pem
test/aux-fixed/exim-ca/example.org/revoked1.example.org/cert8.db
test/aux-fixed/exim-ca/example.org/revoked1.example.org/key3.db
test/aux-fixed/exim-ca/example.org/revoked1.example.org/revoked1.example.org.chain.pem
test/aux-fixed/exim-ca/example.org/revoked1.example.org/revoked1.example.org.key
test/aux-fixed/exim-ca/example.org/revoked1.example.org/revoked1.example.org.ocsp.dated.resp
test/aux-fixed/exim-ca/example.org/revoked1.example.org/revoked1.example.org.ocsp.good.resp
test/aux-fixed/exim-ca/example.org/revoked1.example.org/revoked1.example.org.ocsp.req
test/aux-fixed/exim-ca/example.org/revoked1.example.org/revoked1.example.org.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.org/revoked1.example.org/revoked1.example.org.p12
test/aux-fixed/exim-ca/example.org/revoked1.example.org/revoked1.example.org.pem
test/aux-fixed/exim-ca/example.org/revoked1.example.org/revoked1.example.org.unlocked.key
test/aux-fixed/exim-ca/example.org/revoked1.example.org/secmod.db
test/aux-fixed/exim-ca/example.org/revoked2.example.org/ca_chain.pem
test/aux-fixed/exim-ca/example.org/revoked2.example.org/cert8.db
test/aux-fixed/exim-ca/example.org/revoked2.example.org/key3.db
test/aux-fixed/exim-ca/example.org/revoked2.example.org/revoked2.example.org.chain.pem
test/aux-fixed/exim-ca/example.org/revoked2.example.org/revoked2.example.org.key
test/aux-fixed/exim-ca/example.org/revoked2.example.org/revoked2.example.org.ocsp.dated.resp
test/aux-fixed/exim-ca/example.org/revoked2.example.org/revoked2.example.org.ocsp.good.resp
test/aux-fixed/exim-ca/example.org/revoked2.example.org/revoked2.example.org.ocsp.req
test/aux-fixed/exim-ca/example.org/revoked2.example.org/revoked2.example.org.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.org/revoked2.example.org/revoked2.example.org.p12
test/aux-fixed/exim-ca/example.org/revoked2.example.org/revoked2.example.org.pem
test/aux-fixed/exim-ca/example.org/revoked2.example.org/revoked2.example.org.unlocked.key
test/aux-fixed/exim-ca/example.org/revoked2.example.org/secmod.db
test/aux-fixed/exim-ca/example.org/server1.example.org/ca_chain.pem
test/aux-fixed/exim-ca/example.org/server1.example.org/cert8.db
test/aux-fixed/exim-ca/example.org/server1.example.org/key3.db
test/aux-fixed/exim-ca/example.org/server1.example.org/secmod.db
test/aux-fixed/exim-ca/example.org/server1.example.org/server1.example.org.chain.pem
test/aux-fixed/exim-ca/example.org/server1.example.org/server1.example.org.key
test/aux-fixed/exim-ca/example.org/server1.example.org/server1.example.org.ocsp.dated.resp
test/aux-fixed/exim-ca/example.org/server1.example.org/server1.example.org.ocsp.good.resp
test/aux-fixed/exim-ca/example.org/server1.example.org/server1.example.org.ocsp.req
test/aux-fixed/exim-ca/example.org/server1.example.org/server1.example.org.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.org/server1.example.org/server1.example.org.p12
test/aux-fixed/exim-ca/example.org/server1.example.org/server1.example.org.pem
test/aux-fixed/exim-ca/example.org/server1.example.org/server1.example.org.unlocked.key
test/aux-fixed/exim-ca/example.org/server2.example.org/ca_chain.pem
test/aux-fixed/exim-ca/example.org/server2.example.org/cert8.db
test/aux-fixed/exim-ca/example.org/server2.example.org/key3.db
test/aux-fixed/exim-ca/example.org/server2.example.org/secmod.db
test/aux-fixed/exim-ca/example.org/server2.example.org/server2.example.org.chain.pem
test/aux-fixed/exim-ca/example.org/server2.example.org/server2.example.org.key
test/aux-fixed/exim-ca/example.org/server2.example.org/server2.example.org.ocsp.dated.resp
test/aux-fixed/exim-ca/example.org/server2.example.org/server2.example.org.ocsp.good.resp
test/aux-fixed/exim-ca/example.org/server2.example.org/server2.example.org.ocsp.req
test/aux-fixed/exim-ca/example.org/server2.example.org/server2.example.org.ocsp.revoked.resp
test/aux-fixed/exim-ca/example.org/server2.example.org/server2.example.org.p12
test/aux-fixed/exim-ca/example.org/server2.example.org/server2.example.org.pem
test/aux-fixed/exim-ca/example.org/server2.example.org/server2.example.org.unlocked.key
test/aux-fixed/exim-ca/genall
test/aux-fixed/ocsp_file.der [deleted file]
test/configure.ac
test/confs/0096
test/confs/0097
test/confs/0166
test/confs/0569 [new file with mode: 0644]
test/confs/0600 [new file with mode: 0644]
test/confs/2002
test/confs/2012
test/confs/2024
test/confs/2025
test/confs/2026
test/confs/2102
test/confs/2112
test/confs/3465
test/confs/5400
test/confs/5440 [new file with mode: 0644]
test/confs/5450 [new file with mode: 0644]
test/confs/5600
test/confs/5601
test/confs/5608 [new file with mode: 0644]
test/confs/5650 [new file with mode: 0644]
test/confs/5651 [new file with mode: 0644]
test/confs/5658 [new file with mode: 0644]
test/confs/5750 [new file with mode: 0644]
test/confs/5760 [new file with mode: 0644]
test/log/0023
test/log/0027
test/log/0600 [new file with mode: 0644]
test/log/2000
test/log/2001
test/log/2002
test/log/2003
test/log/2012
test/log/2014
test/log/2024
test/log/2025
test/log/2026
test/log/2027
test/log/2029
test/log/2102
test/log/2103
test/log/2112
test/log/2114
test/log/3454
test/log/5100
test/log/5101
test/log/5102
test/log/5400
test/log/5440 [new file with mode: 0644]
test/log/5450 [new file with mode: 0644]
test/log/5600
test/log/5601
test/log/5608 [new file with mode: 0644]
test/log/5650 [new file with mode: 0644]
test/log/5651 [new file with mode: 0644]
test/log/5658 [new file with mode: 0644]
test/log/5750 [new file with mode: 0644]
test/log/5760 [new file with mode: 0644]
test/mail/0023.cond--1 [new file with mode: 0644]
test/mail/0023.cond-rhubarb
test/mail/0023.okbatch
test/mail/0046.userx
test/mail/0166.userx
test/mail/0166.usery
test/mail/0351.userx
test/mail/0412.CALLER
test/mail/0600.CALLER [new file with mode: 0644]
test/mail/2002.CALLER
test/mail/2102.CALLER
test/rejectlog/0027
test/rejectlog/2003
test/rejectlog/2014
test/rejectlog/2103
test/rejectlog/2114
test/runtest
test/scripts/0000-Basic/0002
test/scripts/0000-Basic/0023
test/scripts/0000-Basic/0040
test/scripts/0000-Basic/0481
test/scripts/0000-Basic/0569 [new file with mode: 0644]
test/scripts/0000-Basic/0600 [new file with mode: 0644]
test/scripts/2000-GnuTLS/2002
test/scripts/2000-GnuTLS/2012
test/scripts/2000-GnuTLS/2026
test/scripts/2100-OpenSSL/2102
test/scripts/2100-OpenSSL/2112
test/scripts/5400-cutthrough/5400
test/scripts/5410-cutthrough-OpenSSL/5410
test/scripts/5440-certnames-GnuTLS/5440 [new file with mode: 0644]
test/scripts/5440-certnames-GnuTLS/REQUIRES [new file with mode: 0644]
test/scripts/5450-certnames-OpenSSL/5450 [new file with mode: 0644]
test/scripts/5450-certnames-OpenSSL/REQUIRES [new file with mode: 0644]
test/scripts/5500-PRDR/REQUIRES
test/scripts/5600-OCSP-OpenSSL/5600
test/scripts/5600-OCSP-OpenSSL/5601
test/scripts/5600-OCSP-OpenSSL/REQUIRES
test/scripts/5608-OCSP-OpenSSL-TPDA/5608 [new file with mode: 0644]
test/scripts/5608-OCSP-OpenSSL-TPDA/REQUIRES [new file with mode: 0644]
test/scripts/5650-OCSP-GnuTLS/5650 [new file with mode: 0644]
test/scripts/5650-OCSP-GnuTLS/5651 [new file with mode: 0644]
test/scripts/5650-OCSP-GnuTLS/REQUIRES [new file with mode: 0644]
test/scripts/5658-OCSP-GnuTLS-TPDA/5658 [new file with mode: 0644]
test/scripts/5658-OCSP-GnuTLS-TPDA/REQUIRES [new file with mode: 0644]
test/scripts/5750-GnuTLS-TPDA/5750 [new file with mode: 0644]
test/scripts/5750-GnuTLS-TPDA/REQUIRES [new file with mode: 0644]
test/scripts/5760-OpenSSL-TPDA/5760 [new file with mode: 0644]
test/scripts/5760-OpenSSL-TPDA/REQUIRES [new file with mode: 0644]
test/src/client.c
test/stderr/0002
test/stderr/0018
test/stderr/0021
test/stderr/0022
test/stderr/0023
test/stderr/0026
test/stderr/0038
test/stderr/0040 [new file with mode: 0644]
test/stderr/0043
test/stderr/0044
test/stderr/0057
test/stderr/0059
test/stderr/0060
test/stderr/0061
test/stderr/0062
test/stderr/0063
test/stderr/0064
test/stderr/0065
test/stderr/0066
test/stderr/0069
test/stderr/0070
test/stderr/0079
test/stderr/0080
test/stderr/0089
test/stderr/0092
test/stderr/0094
test/stderr/0124
test/stderr/0130
test/stderr/0138
test/stderr/0139
test/stderr/0157
test/stderr/0234
test/stderr/0243
test/stderr/0251
test/stderr/0281
test/stderr/0304
test/stderr/0325
test/stderr/0342
test/stderr/0386
test/stderr/0398
test/stderr/0422
test/stderr/0423
test/stderr/0513
test/stderr/0524
test/stderr/0569 [new file with mode: 0644]
test/stderr/1000
test/stderr/1002
test/stderr/2600
test/stderr/3400
test/stderr/3408
test/stderr/3410
test/stderr/3500
test/stderr/5400
test/stderr/5401
test/stderr/5410
test/stderr/5420
test/stdout/0002
test/stdout/0023
test/stdout/0569 [new file with mode: 0644]
test/stdout/0600 [new file with mode: 0644]
test/stdout/2002
test/stdout/2024
test/stdout/2102
test/stdout/5400
test/stdout/5650 [new file with mode: 0644]

index fdcaf8b..ae93d18 100644 (file)
@@ -6,4 +6,7 @@ spec.txt
 filter*.xml
 filter.ps
 filter.pdf
+filter-txt.html
+filter.txt
 local_params
+exim.8
index 370ed6e..8cac5d5 100644 (file)
@@ -48,7 +48,7 @@
 . Copyright year.  Update this (only) when changing content.
 
 .macro copyyear
-2010
+2014
 .endmacro
 
 . ===========================================================================
index c71dfda..990df62 100644 (file)
@@ -52,7 +52,7 @@
 .set I   "&nbsp;&nbsp;&nbsp;&nbsp;"
 
 .macro copyyear
-2013
+2014
 .endmacro
 
 . /////////////////////////////////////////////////////////////////////////////
@@ -553,11 +553,9 @@ key &'0x403043153903637F'&, although that key is expected to be replaced in 2013
 A trust path from Nigel's key to Phil's can be observed at
 &url(https://www.security.spodhuis.org/exim-trustpath).
 
-.new
 Releases have also been authorized to be performed by Todd Lyons who signs with
 key &'0xC4F4F94804D29EBA'&. A direct trust path exists between previous RE Phil
 Pennock and Todd Lyons through a common associate.
-.wen
 
 The signatures for the tar bundles are in:
 .display
@@ -871,14 +869,12 @@ SOFTWARE.
 .endblockquote
 
 .next
-.new
 .cindex "opendmarc" "acknowledgment"
 The DMARC implementation uses the OpenDMARC library which is Copyrighted by
 The Trusted Domain Project. Portions of Exim source which use OpenDMARC
 derived code are indicated in the respective source files. The full OpenDMARC
 license is provided in the LICENSE.opendmarc file contained in the distributed
 source code.
-.wen
 
 .next
 Many people have contributed code fragments, some large, some small, that were
@@ -1382,7 +1378,7 @@ Setting the &%verify%& option actually sets two options, &%verify_sender%& and
 &%verify_recipient%&, which independently control the use of the router for
 sender and recipient verification. You can set these options directly if
 you want a router to be used for only one type of verification.
-.new "Note that cutthrough delivery is classed as a recipient verification for this purpose."
+Note that cutthrough delivery is classed as a recipient verification for this purpose.
 .next
 If the &%address_test%& option is set false, the router is skipped when Exim is
 run with the &%-bt%& option to test an address routing. This can be helpful
@@ -1392,7 +1388,7 @@ having to simulate the effect of the scanner.
 .next
 Routers can be designated for use only when verifying an address, as
 opposed to routing it for delivery. The &%verify_only%& option controls this.
-.new "Again, cutthrough delivery counts as a verification."
+Again, cutthrough delivery counts as a verification.
 .next
 Individual routers can be explicitly skipped when running the routers to
 check an address given in the SMTP EXPN command (see the &%expn%& option).
@@ -2714,14 +2710,12 @@ no arguments.
 This option is an alias for &%-bV%& and causes version information to be
 displayed.
 
-.new
 .vitem &%-Ac%& &&&
        &%-Am%&
 .oindex "&%-Ac%&"
 .oindex "&%-Am%&"
 These options are used by Sendmail for selecting configuration files and are
 ignored by Exim.
-.wen
 
 .vitem &%-B%&<&'type'&>
 .oindex "&%-B%&"
@@ -2982,7 +2976,6 @@ use the &'exim_dbmbuild'& utility, or some other means, to rebuild alias files
 if this is required. If the &%bi_command%& option is not set, calling Exim with
 &%-bi%& is a no-op.
 
-.new
 . // Keep :help first, then the rest in alphabetical order
 .vitem &%-bI:help%&
 .oindex "&%-bI:help%&"
@@ -3008,7 +3001,6 @@ useful for ManageSieve (RFC 5804) implementations, in providing that protocol's
 &`SIEVE`& capability response line.  As the precise list may depend upon
 compile-time build options, which this option will adapt to, this is the only
 way to guarantee a correct response.
-.wen
 
 .vitem &%-bm%&
 .oindex "&%-bm%&"
@@ -3123,11 +3115,9 @@ configuration file is output.
 If a list of configuration files was supplied, the value that is output here
 is the name of the file that was actually used.
 
-.new
 .cindex "options" "hiding name of"
 If the &%-n%& flag is given, then for most modes of &%-bP%& operation the
 name will not be output.
-.wen
 
 .cindex "daemon" "process id (pid)"
 .cindex "pid (process id)" "of daemon"
@@ -3732,7 +3722,6 @@ if &%-f%& is also present, it overrides &"From&~"&.
 .vitem &%-G%&
 .oindex "&%-G%&"
 .cindex "submission fixups, suppressing (command-line)"
-.new
 This option is equivalent to an ACL applying:
 .code
 control = suppress_local_fixups
@@ -3743,7 +3732,6 @@ in future.
 
 As this affects audit information, the caller must be a trusted user to use
 this option.
-.wen
 
 .vitem &%-h%&&~<&'number'&>
 .oindex "&%-h%&"
@@ -3761,7 +3749,6 @@ line by itself should not terminate an incoming, non-SMTP message. I can find
 no documentation for this option in Solaris 2.4 Sendmail, but the &'mailx'&
 command in Solaris 2.4 uses it. See also &%-ti%&.
 
-.new
 .vitem &%-L%&&~<&'tag'&>
 .oindex "&%-L%&"
 .cindex "syslog" "process name; set with flag"
@@ -3772,7 +3759,6 @@ read and parsed, to determine access rights, before this is set and takes
 effect, so early configuration file errors will not honour this flag.
 
 The tag should not be longer than 32 characters.
-.wen
 
 .vitem &%-M%&&~<&'message&~id'&>&~<&'message&~id'&>&~...
 .oindex "&%-M%&"
@@ -4012,13 +3998,11 @@ routing problem. Once &%-N%& has been used for a delivery attempt, it sticks to
 the message, and applies to any subsequent delivery attempts that may happen
 for that message.
 
-.new
 .vitem &%-n%&
 .oindex "&%-n%&"
 This option is interpreted by Sendmail to mean &"no aliasing"&.
 For normal modes of operation, it is ignored by Exim.
 When combined with &%-bP%& it suppresses the name of an option from being output.
-.wen
 
 .vitem &%-O%&&~<&'data'&>
 .oindex "&%-O%&"
@@ -4237,6 +4221,20 @@ option sets the IP interface address value. A port number may be included,
 using the same syntax as for &%-oMa%&. The interface address is placed in
 &$received_ip_address$& and the port number, if present, in &$received_port$&.
 
+.vitem &%-oMm%&&~<&'message&~reference'&>
+.oindex "&%-oMm%&"
+.cindex "message reference" "message reference, specifying for local message"
+See &%-oMa%& above for general remarks about the &%-oM%& options. The &%-oMm%&
+option sets the message reference, e.g. message-id, and is logged during
+delivery. This is useful when some kind of audit trail is required to tie
+messages together. The format of the message reference is checked and will
+abort if the format is invalid. The option will only be accepted if exim is
+running in trusted mode, not as any regular user.
+
+The best example of a message reference is when Exim sends a bounce message.
+The message reference is the message-id of the original message for which Exim
+is sending the bounce.
+
 .vitem &%-oMr%&&~<&'protocol&~name'&>
 .oindex "&%-oMr%&"
 .cindex "protocol, specifying for local message"
@@ -4638,12 +4636,10 @@ National Language Support extended characters in the body of the mail item"&).
 It sets &%-x%& when calling the MTA from its &%mail%& command. Exim ignores
 this option.
 
-.new
 .vitem &%-X%&&~<&'logfile'&>
 .oindex "&%-X%&"
 This option is interpreted by Sendmail to cause debug information to be sent
 to the named file.  It is ignored by Exim.
-.wen
 .endlist
 
 .ecindex IIDclo1
@@ -5561,16 +5557,21 @@ unreachable.
 The next two lines are concerned with &'ident'& callbacks, as defined by RFC
 1413 (hence their names):
 .code
-rfc1413_hosts = *
-rfc1413_query_timeout = 5s
+rfc1413_query_hosts = *
+rfc1413_query_timeout = 0s
+.endd
+These settings cause Exim to avoid ident callbacks for all incoming SMTP calls.
+Few hosts offer RFC1413 service these days; calls have to be
+terminated by a timeout and this needlessly delays the startup
+of an incoming SMTP connection.
+If you have hosts for which you trust RFC1413 and need this
+information, you can change this.
+
+This line enables an efficiency SMTP option.  It is negociated by clients
+and not expected to cause problems but can be disabled if needed.
+.code
+prdr_enable = true
 .endd
-These settings cause Exim to make ident callbacks for all incoming SMTP calls.
-You can limit the hosts to which these calls are made, or change the timeout
-that is used. If you set the timeout to zero, all ident calls are disabled.
-Although they are cheap and can provide useful information for tracing problem
-messages, some hosts and firewalls have problems with ident calls. This can
-result in a timeout instead of an immediate refused connection, leading to
-delays on starting up an incoming SMTP session.
 
 When Exim receives messages over SMTP connections, it expects all addresses to
 be fully qualified with a domain, as required by the SMTP definition. However,
@@ -6006,9 +6007,14 @@ One remote transport and four local transports are defined.
 .code
 remote_smtp:
   driver = smtp
+  hosts_try_prdr = *
 .endd
-This transport is used for delivering messages over SMTP connections. All its
-options are defaulted. The list of remote hosts comes from the router.
+This transport is used for delivering messages over SMTP connections.
+The list of remote hosts comes from the router.
+The &%hosts_try_prdr%& option enables an efficiency SMTP option.
+It is negotiated between client and server
+and not expected to cause problems but can be disabled if needed.
+All other options are defaulted.
 .code
 local_delivery:
   driver = appendfile
@@ -6858,7 +6864,7 @@ is used on its own as the result. If the lookup does not succeed, the
 &`fail`& keyword causes a &'forced expansion failure'& &-- see section
 &<<SECTforexpfai>>& for an explanation of what this means.
 
-The supported DNS record types are A, CNAME, MX, NS, PTR, SPF, SRV, and TXT,
+The supported DNS record types are A, CNAME, MX, NS, PTR, SPF, SRV, TLSA and TXT,
 and, when Exim is compiled with IPv6 support, AAAA (and A6 if that is also
 configured). If no type is given, TXT is assumed. When the type is PTR,
 the data can be an IP address, written as normal; inversion and the addition of
@@ -6949,7 +6955,6 @@ has two space-separated fields: an authorization code and a target host name.
 The authorization code can be &"Y"& for yes, &"N"& for no, &"X"& for explicit
 authorization required but absent, or &"?"& for unknown.
 
-.new
 .cindex "A+" "in &(dnsdb)& lookup"
 The pseudo-type A+ performs an A6 lookup (if configured) followed by an AAAA
 and then an A lookup.  All results are returned; defer processing
@@ -6957,7 +6962,6 @@ and then an A lookup.  All results are returned; defer processing
 .code
 ${lookup dnsdb {>; a+=$sender_helo_name}}
 .endd
-.wen
 
 
 .section "Multiple dnsdb lookups" "SECID67"
@@ -6979,11 +6983,16 @@ The data from each lookup is concatenated, with newline separators by default,
 in the same way that multiple DNS records for a single item are handled. A
 different separator can be specified, as described above.
 
+Modifiers for &(dnsdb)& lookups are givien by optional keywords,
+each followed by a comma,
+that may appear before the record type.
+
 The &(dnsdb)& lookup fails only if all the DNS lookups fail. If there is a
 temporary DNS error for any of them, the behaviour is controlled by
-an optional keyword followed by a comma that may appear before the record
-type. The possible keywords are &"defer_strict"&, &"defer_never"&, and
-&"defer_lax"&. With &"strict"& behaviour, any temporary DNS error causes the
+a defer-option modifier.
+The possible keywords are
+&"defer_strict"&, &"defer_never"&, and &"defer_lax"&.
+With &"strict"& behaviour, any temporary DNS error causes the
 whole lookup to defer. With &"never"& behaviour, a temporary DNS error is
 ignored, and the behaviour is as if the DNS lookup failed to find anything.
 With &"lax"& behaviour, all the queries are attempted, but a temporary DNS
@@ -6996,6 +7005,21 @@ ${lookup dnsdb{a=one.host.com:two.host.com}}
 Thus, in the default case, as long as at least one of the DNS lookups
 yields some data, the lookup succeeds.
 
+.new
+.cindex "DNSSEC" "dns lookup"
+Use of &(DNSSEC)& is controlled by a dnssec modifier.
+The possible keywords are
+&"dnssec_strict"&, &"dnssec_lax"&, and &"dnssec_never"&.
+With &"strict"& or &"lax"& DNSSEC information is requested
+with the lookup.
+With &"strict"& a response from the DNS resolver that
+is not labelled as authenticated data
+is treated as equivalent to a temporary DNS error.
+The default is &"never"&.
+
+See also the &$lookup_dnssec_authenticated$& variable.
+.wen
+
 
 
 
@@ -7060,6 +7084,18 @@ With sufficiently modern LDAP libraries, Exim supports forcing TLS over regular
 LDAP connections, rather than the SSL-on-connect &`ldaps`&.
 See the &%ldap_start_tls%& option.
 
+.new
+Starting with Exim 4.83, the initialization of LDAP with TLS is more tightly
+controlled. Every part of the TLS configuration can be configured by settings in
+&_exim.conf_&. Depending on the version of the client libraries installed on
+your system, some of the initialization may have required setting options in
+&_/etc/ldap.conf_& or &_~/.ldaprc_& to get TLS working with self-signed
+certificates. This revealed a nuance where the current UID that exim was
+running as could affect which config files it read. With Exim 4.83, these
+methods become optional, only taking effect if not specifically set in
+&_exim.conf_&.
+.wen
+
 
 .section "LDAP quoting" "SECID68"
 .cindex "LDAP" "quoting"
@@ -7206,6 +7242,9 @@ them. The following names are recognized:
 &`USER       `&  set the DN, for authenticating the LDAP bind
 &`PASS       `&  set the password, likewise
 &`REFERRALS  `&  set the referrals parameter
+.new
+&`SERVERS    `&  set alternate server list for this query only
+.wen
 &`SIZE       `&  set the limit for the number of entries returned
 &`TIME       `&  set the maximum waiting time for a query
 .endd
@@ -7227,6 +7266,15 @@ Netscape SDK; for OpenLDAP no action is taken.
 The TIME parameter (also a number of seconds) is passed to the server to
 set a server-side limit on the time taken to complete a search.
 
+.new
+The SERVERS parameter allows you to specify an alternate list of ldap servers
+to use for an individual lookup.  The global ldap_servers option provides a
+default list of ldap servers, and a single lookup can specify a single ldap
+server to use.  But when you need to do a lookup with a list of servers that is
+different than the default list (maybe different order, maybe a completely
+different set of servers), the SERVERS parameter allows you to specify this
+alternate list.
+.wen
 
 Here is an example of an LDAP query in an Exim lookup that uses some of these
 values. This is a single line, folded to fit on the page:
@@ -8307,7 +8355,13 @@ list. The effect of each one lasts until the next, or until the end of the
 list.
 
 .new
-To explain the host/ip processing logic a different way for the same ACL:
+.section "Mixing wildcarded host names and addresses in host lists" &&&
+         "SECTmixwilhos"
+.cindex "host list" "mixing names and addresses in"
+
+This section explains the host/ip processing logic with the same concepts
+as the previous section, but specifically addresses what happens when a
+wildcarded hostname is one of the items in the hostlist.
 
 .ilist
 If you have name lookups or wildcarded host names and
@@ -8339,7 +8393,6 @@ this section.
 .wen
 
 
-
 .section "Temporary DNS errors when looking up host information" &&&
          "SECTtemdnserr"
 .cindex "host" "lookup failures, temporary"
@@ -8409,33 +8462,6 @@ See section &<<SECThoslispatsikey>>&.)
 
 
 
-.section "Mixing wildcarded host names and addresses in host lists" &&&
-         "SECTmixwilhos"
-.cindex "host list" "mixing names and addresses in"
-If you have name lookups or wildcarded host names and IP addresses in the same
-host list, you should normally put the IP addresses first. For example, in an
-ACL you could have:
-.code
-accept hosts = 10.9.8.7 : *.friend.example
-.endd
-The reason for this lies in the left-to-right way that Exim processes lists.
-It can test IP addresses without doing any DNS lookups, but when it reaches an
-item that requires a host name, it fails if it cannot find a host name to
-compare with the pattern. If the above list is given in the opposite order, the
-&%accept%& statement fails for a host whose name cannot be found, even if its
-IP address is 10.9.8.7.
-
-If you really do want to do the name check first, and still recognize the IP
-address, you can rewrite the ACL like this:
-.code
-accept hosts = *.friend.example
-accept hosts = 10.9.8.7
-.endd
-If the first &%accept%& fails, Exim goes on to try the second one. See chapter
-&<<CHAPACL>>& for details of ACLs.
-
-
-
 
 
 .section "Address lists" "SECTaddresslist"
@@ -8843,7 +8869,6 @@ This item inserts &"basic"& header lines. It is described with the &%header%&
 expansion item below.
 
 
-.new
 .vitem "&*${acl{*&<&'name'&>&*}{*&<&'arg'&>&*}...}*&"
 .cindex "expansion" "calling an acl"
 .cindex "&%acl%&" "call from expansion"
@@ -8858,9 +8883,73 @@ the result of the expansion.
 If no message is set and the ACL returns accept or deny
 the expansion result is an empty string.
 If the ACL returns defer the result is a forced-fail.  Otherwise the expansion fails.
-.wen
 
 
+.new
+.vitem "&*${certextract{*&<&'field'&>&*}{*&<&'certificate'&>&*}&&&
+       {*&<&'string2'&>&*}{*&<&'string3'&>&*}}*&"
+.cindex "expansion" "extracting cerificate fields"
+.cindex "&%certextract%&" "certificate fields"
+.cindex "certificate" "extracting fields"
+The <&'certificate'&> must be a variable of type certificate.
+The field name is expanded and used to retrive the relevant field from
+the certificate.  Supported fields are:
+.display
+&`version        `&
+&`serial_number  `&
+&`subject        `& RFC4514 DN
+&`issuer         `& RFC4514 DN
+&`notbefore      `& time
+&`notafter       `& time
+&`sig_algorithm  `&
+&`signature      `&
+&`subj_altname   `& tagged list
+&`ocsp_uri       `& list
+&`crl_uri        `& list
+.endd
+If the field is found,
+<&'string2'&> is expanded, and replaces the whole item;
+otherwise <&'string3'&> is used. During the expansion of <&'string2'&> the
+variable &$value$& contains the value that has been extracted. Afterwards, it
+is restored to any previous value it might have had.
+
+If {<&'string3'&>} is omitted, the item is replaced by an empty string if the
+key is not found. If {<&'string2'&>} is also omitted, the value that was
+extracted is used.
+
+Some field names take optional modifiers, appended and separated by commas.
+
+The field selectors marked as "RFC4514" above
+output a Distinguished Name string which is
+not quite
+parseable by Exim as a comma-separated tagged list
+(the exceptions being elements containin commas).
+RDN elements of a single type may be selected by
+a modifier of the type label; if so the expansion
+result is a list (newline-separated by default).
+The separator may be changed by another modifer of
+a right angle-bracket followed immediately by the new separator.
+Recognised RDN type labels include "CN", "O", "OU" and "DC".
+
+The field selectors marked as "time" above
+may output a number of seconds since epoch
+if the modifier "int" is used.
+
+The field selectors marked as "list" above return a list,
+newline-separated by default,
+(embedded separator characters in elements are doubled).
+The separator may be changed by a modifier of
+a right angle-bracket followed immediately by the new separator.
+
+The field selectors marked as "tagged" above
+prefix each list element with a type string and an equals sign.
+Elements of only one type may be selected by a modifier
+which is one of "dns", "uri" or "mail";
+if so the elenment tags are omitted.
+
+If not otherwise noted field values are presented in human-readable form.
+.wen
+
 .vitem "&*${dlfunc{*&<&'file'&>&*}{*&<&'function'&>&*}{*&<&'arg'&>&*}&&&
        {*&<&'arg'&>&*}...}*&"
 .cindex &%dlfunc%&
@@ -9193,6 +9282,44 @@ of <&'string2'&>, whichever is the shorter. Do not confuse &%length%& with
 &%strlen%&, which gives the length of a string.
 
 
+.vitem "&*${listextract{*&<&'number'&>&*}&&&
+        {*&<&'string1'&>&*}{*&<&'string2'&>&*}{*&<&'string3'&>&*}}*&"
+.cindex "expansion" "extracting list elements by number"
+.cindex "&%listextract%&" "extract list elements by number"
+.cindex "list" "extracting elements by number"
+The <&'number'&> argument must consist entirely of decimal digits,
+apart from an optional leading minus,
+and leading and trailing white space (which is ignored).
+
+After expansion, <&'string1'&> is interpreted as a list, colon-separated by
+default, but the separator can be changed in the usual way.
+
+The first field of the list is numbered one.
+If the number is negative, the fields are
+counted from the end of the list, with the rightmost one numbered -1.
+The numbered element of the list is extracted and placed in &$value$&,
+then <&'string2'&> is expanded as the result.
+
+If the modulus of the
+number is zero or greater than the number of fields in the string,
+the result is the expansion of <&'string3'&>.
+
+For example:
+.code
+${listextract{2}{x:42:99}}
+.endd
+yields &"42"&, and
+.code
+${listextract{-3}{<, x,42,99,& Mailer,,/bin/bash}{result: $value}}
+.endd
+yields &"result: 99"&.
+
+If {<&'string3'&>} is omitted, an empty string is used for string3.
+If {<&'string2'&>} is also omitted, the value that was
+extracted is used.
+You can use &`fail`& instead of {<&'string3'&>} as in a string extract.
+
+
 .vitem "&*${lookup{*&<&'key'&>&*}&~*&<&'search&~type'&>&*&~&&&
         {*&<&'file'&>&*}&~{*&<&'string1'&>&*}&~{*&<&'string2'&>&*}}*&"
 This is the first of one of two different types of lookup item, which are both
@@ -9491,7 +9618,6 @@ can be the word &"fail"& (not in braces) to force expansion failure if the
 command does not succeed. If both strings are omitted, the result is contents
 of the standard output/error on success, and nothing on failure.
 
-.new
 .vindex "&$run_in_acl$&"
 The standard output/error of the command is put in the variable &$value$&.
 In this ACL example, the output of a command is logged for the admin to
@@ -9505,7 +9631,6 @@ shell must be invoked directly, such as with:
 .code
 ${run{/bin/bash -c "/usr/bin/id >/tmp/id"}{yes}{yes}}
 .endd
-.wen
 
 .vindex "&$runrc$&"
 The return code from the command is put in the variable &$runrc$&, and this
@@ -9667,7 +9792,6 @@ expansion item, which extracts the working address from a single RFC2822
 address. See the &*filter*&, &*map*&, and &*reduce*& items for ways of
 processing lists.
 
-.new
 To clarify "list of addresses in RFC 2822 format" mentioned above, Exim follows
 a strict interpretation of header line formatting.  Exim parses the bare,
 unquoted portion of an email address and if it finds a comma, treats it as an
@@ -9691,7 +9815,6 @@ Last:user@example.com
 # exim -be '${addresses:From: "Last, First" <user@example.com>}'
 user@example.com
 .endd
-.wen
 
 .vitem &*${base62:*&<&'digits'&>&*}*&
 .cindex "&%base62%& expansion item"
@@ -9847,7 +9970,6 @@ be useful for processing the output of the MD5 and SHA-1 hashing functions.
 
 
 
-.new
 .vitem &*${hexquote:*&<&'string'&>&*}*&
 .cindex "quoting" "hex-encoded unprintable characters"
 .cindex "&%hexquote%& expansion item"
@@ -9855,7 +9977,6 @@ This operator converts non-printable characters in a string into a hex
 escape form. Byte values between 33 (!) and 126 (~) inclusive are left
 as is, and other byte values are converted to &`\xNN`&, for example a
 byte value 127 is converted to &`\x7f`&.
-.wen
 
 
 .vitem &*${lc:*&<&'string'&>&*}*&
@@ -9883,7 +10004,6 @@ See the description of the general &%length%& item above for details. Note that
 when &%length%& is used as an operator.
 
 
-.new
 .vitem &*${listcount:*&<&'string'&>&*}*&
 .cindex "expansion" "list item count"
 .cindex "list" "item count"
@@ -9901,7 +10021,6 @@ If the optional type is given it must be one of "a", "d", "h" or "l"
 and selects address-, domain-, host- or localpart- lists to search among respectively.
 Otherwise all types are searched in an undefined order and the first
 matching list is returned.
-.wen
 
 
 .vitem &*${local_part:*&<&'string'&>&*}*&
@@ -9943,6 +10062,7 @@ Letters in IPv6 addresses are always output in lower case.
 .vitem &*${md5:*&<&'string'&>&*}*&
 .cindex "MD5 hash"
 .cindex "expansion" "MD5 hash"
+.cindex "certificate fingerprint"
 .cindex "&%md5%& expansion item"
 The &%md5%& operator computes the MD5 hash value of the string, and returns it
 as a 32-digit hexadecimal number, in which any letters are in lower case.
@@ -10080,11 +10200,24 @@ variables or headers inside regular expressions.
 .vitem &*${sha1:*&<&'string'&>&*}*&
 .cindex "SHA-1 hash"
 .cindex "expansion" "SHA-1 hashing"
+.cindex "certificate fingerprint"
 .cindex "&%sha2%& expansion item"
 The &%sha1%& operator computes the SHA-1 hash value of the string, and returns
 it as a 40-digit hexadecimal number, in which any letters are in upper case.
 
 
+.vitem &*${sha256:*&<&'certificate'&>&*}*&
+.cindex "SHA-256 hash"
+.cindex "certificate fingerprint"
+.cindex "expansion" "SHA-256 hashing"
+.cindex "&%sha256%& expansion item"
+The &%sha256%& operator computes the SHA-256 hash fingerprint of the
+certificate,
+and returns
+it as a 64-digit hexadecimal number, in which any letters are in upper case.
+Only arguments which are a single variable of certificate type are supported.
+
+
 .vitem &*${stat:*&<&'string'&>&*}*&
 .cindex "expansion" "statting a file"
 .cindex "file" "extracting characteristics"
@@ -10153,6 +10286,14 @@ number of larger units and output in Exim's normal time format, for example,
 .cindex "expansion" "case forcing"
 .cindex "&%uc%& expansion item"
 This forces the letters in the string into upper-case.
+
+.vitem &*${utf8clean:*&<&'string'&>&*}*&
+.cindex "correction of invalid utf-8 sequences in strings"
+.cindex "utf-8" "utf-8 sequences"
+.cindex "incorrect utf-8"
+.cindex "expansion" "utf-8 forcing"
+.cindex "&%utf8clean%& expansion item"
+This replaces any invalid utf-8 sequence in the string by the character &`?`&.
 .endlist
 
 
@@ -10201,7 +10342,6 @@ In all cases, a relative comparator OP is testing if <&'string1'&> OP
 10M, not if 10M is larger than &$message_size$&.
 
 
-.new
 .vitem &*acl&~{{*&<&'name'&>&*}{*&<&'arg1'&>&*}&&&
        {*&<&'arg2'&>&*}...}*&
 .cindex "expansion" "calling an acl"
@@ -10216,14 +10356,13 @@ a value using a "message =" modifier the variable $value becomes
 the result of the expansion, otherwise it is empty.
 If the ACL returns accept the condition is true; if deny, false.
 If the ACL returns defer the result is a forced-fail.
-.wen
 
 .vitem &*bool&~{*&<&'string'&>&*}*&
 .cindex "expansion" "boolean parsing"
 .cindex "&%bool%& expansion condition"
 This condition turns a string holding a true or false representation into
 a boolean state.  It parses &"true"&, &"false"&, &"yes"& and &"no"&
-(case-insensitively); also positive integer numbers map to true if non-zero,
+(case-insensitively); also integer numbers map to true if non-zero,
 false if zero.
 An empty string is treated as false.
 Leading and trailing whitespace is ignored;
@@ -10412,7 +10551,7 @@ ${if forany{<, $recipients}{match{$item}{^user3@}}{yes}{no}}
 The value of &$item$& is saved and restored while &*forany*& or &*forall*& is
 being processed, to enable these expansion items to be nested.
 
-.new "To scan a named list, expand it with the &*listnamed*& operator."
+To scan a named list, expand it with the &*listnamed*& operator.
 
 
 .vitem &*ge&~{*&<&'string1'&>&*}{*&<&'string2'&>&*}*& &&&
@@ -10957,7 +11096,6 @@ the value of &$authenticated_id$& is normally the login name of the calling
 process. However, a trusted user can override this by means of the &%-oMai%&
 command line option.
 
-.new
 .vitem &$authenticated_fail_id$&
 .cindex "authentication" "fail" "id"
 .vindex "&$authenticated_fail_id$&"
@@ -10968,7 +11106,6 @@ available for processing in the ACL's, generally the quit or notquit ACL.
 A message to a local recipient could still be accepted without requiring
 authentication, which means this variable could also be visible in all of
 the ACL's as well.
-.wen
 
 
 .vitem &$authenticated_sender$&
@@ -11181,13 +11318,11 @@ inserting the message header line with the given name. Note that the name must
 be terminated by colon or white space, because it may contain a wide variety of
 characters. Note also that braces must &'not'& be used.
 
-.new
 .vitem &$headers_added$&
 .vindex "&$headers_added$&"
 Within an ACL this variable contains the headers added so far by
 the ACL modifier add_header (section &<<SECTaddheadacl>>&).
 The headers are a newline-separated list.
-.wen
 
 .vitem &$home$&
 .vindex "&$home$&"
@@ -11421,6 +11556,16 @@ ability to find the amount of free space (only true for experimental systems),
 the space value is -1. See also the &%check_log_space%& option.
 
 
+.new
+.vitem &$lookup_dnssec_authenticated$&
+.vindex "&$lookup_dnssec_authenticated$&"
+This variable is set after a DNS lookup done by
+a dnsdb lookup expansion, dnslookup router or smtp transport.
+It will be empty if &(DNSSEC)& was not requested,
+&"no"& if the result was not labelled as authenticated data
+and &"yes"& if it was.
+.wen
+
 .vitem &$mailstore_basename$&
 .vindex "&$mailstore_basename$&"
 This variable is set only when doing deliveries in &"mailstore"& format in the
@@ -11859,13 +12004,11 @@ envelope sender.
 .vindex "&$return_size_limit$&"
 This is an obsolete name for &$bounce_return_size_limit$&.
 
-.new
 .vitem &$router_name$&
 .cindex "router" "name"
 .cindex "name" "of router"
 .vindex "&$router_name$&"
 During the running of a router this variable contains its name.
-.wen
 
 .vitem &$runrc$&
 .cindex "return code" "from &%run%& expansion"
@@ -11958,7 +12101,6 @@ driver that successfully authenticated the client from which the message was
 received. It is empty if there was no successful authentication. See also
 &$authenticated_id$&.
 
-.new
 .vitem &$sender_host_dnssec$&
 .vindex "&$sender_host_dnssec$&"
 If &$sender_host_name$& has been populated (by reference, &%hosts_lookup%& or
@@ -11969,7 +12111,7 @@ other times, this variable is false.
 It is likely that you will need to coerce DNSSEC support on in the resolver
 library, by setting:
 .code
-dns_use_dnssec = 1
+dns_dnssec_ok = 1
 .endd
 
 Exim does not perform DNSSEC validation itself, instead leaving that to a
@@ -11980,7 +12122,6 @@ with DNSSEC, only the reverse DNS.
 
 If you have changed &%host_lookup_order%& so that &`bydns`& is not the first
 mechanism in the list, then this variable will be false.
-.wen
 
 
 .vitem &$sender_host_name$&
@@ -12181,7 +12322,6 @@ command in a filter file. Its use is explained in the description of that
 command, which can be found in the separate document entitled &'Exim's
 interfaces to mail filtering'&.
 
-.new
 .vitem &$tls_in_bits$&
 .vindex "&$tls_in_bits$&"
 Contains an approximation of the TLS cipher's bit-strength
@@ -12202,6 +12342,44 @@ on an outbound SMTP connection; the meaning of
 this depends upon the TLS implementation used.
 If TLS has not been negotiated, the value will be 0.
 
+.new
+.vitem &$tls_in_ourcert$&
+.vindex "&$tls_in_ourcert$&"
+This variable refers to the certificate presented to the peer of an
+inbound connection when the message was received.
+It is only useful as the argument of a
+&%certextract%& expansion item, &%md5%& or &%sha1%& operator,
+or a &%def%& condition.
+.wen
+
+.new
+.vitem &$tls_in_peercert$&
+.vindex "&$tls_in_peercert$&"
+This variable refers to the certificate presented by the peer of an
+inbound connection when the message was received.
+It is only useful as the argument of a
+&%certextract%& expansion item, &%md5%& or &%sha1%& operator,
+or a &%def%& condition.
+.wen
+
+.new
+.vitem &$tls_out_ourcert$&
+.vindex "&$tls_out_ourcert$&"
+This variable refers to the certificate presented to the peer of an
+outbound connection.  It is only useful as the argument of a
+&%certextract%& expansion item, &%md5%& or &%sha1%& operator,
+or a &%def%& condition.
+.wen
+
+.new
+.vitem &$tls_out_peercert$&
+.vindex "&$tls_out_peercert$&"
+This variable refers to the certificate presented by the peer of an
+outbound connection.  It is only useful as the argument of a
+&%certextract%& expansion item, &%md5%& or &%sha1%& operator,
+or a &%def%& condition.
+.wen
+
 .vitem &$tls_in_certificate_verified$&
 .vindex "&$tls_in_certificate_verified$&"
 This variable is set to &"1"& if a TLS certificate was verified when the
@@ -12280,7 +12458,6 @@ the outbound.
 During outbound
 SMTP deliveries, this variable reflects the value of the &%tls_sni%& option on
 the transport.
-.wen
 
 .vitem &$tod_bsdinbox$&
 .vindex "&$tod_bsdinbox$&"
@@ -12323,13 +12500,11 @@ This variable contains the numerical value of the local timezone, for example:
 This variable contains the UTC date and time in &"Zulu"& format, as specified
 by ISO 8601, for example: 20030221154023Z.
 
-.new
 .vitem &$transport_name$&
 .cindex "transport" "name"
 .cindex "name" "of transport"
 .vindex "&$transport_name$&"
 During the running of a transport, this variable contains its name.
-.wen
 
 .vitem &$value$&
 .vindex "&$value$&"
@@ -12986,6 +13161,7 @@ listed in more than one group.
 .row &%acl_smtp_auth%&               "ACL for AUTH"
 .row &%acl_smtp_connect%&            "ACL for connection"
 .row &%acl_smtp_data%&               "ACL for DATA"
+.row &%acl_smtp_data_prdr%&          "ACL for DATA, per-recipient"
 .row &%acl_smtp_dkim%&               "ACL for DKIM verification"
 .row &%acl_smtp_etrn%&               "ACL for ETRN"
 .row &%acl_smtp_expn%&               "ACL for EXPN"
@@ -13046,6 +13222,7 @@ listed in more than one group.
 .row &%tls_crl%&                     "certificate revocation list"
 .row &%tls_dh_max_bits%&             "clamp D-H bit count suggestion"
 .row &%tls_dhparam%&                 "DH parameters for server"
+.row &%tls_ocsp_file%&               "location of server certificate status proof"
 .row &%tls_on_connect_ports%&        "specify SSMTP (SMTPS) ports"
 .row &%tls_privatekey%&              "location of server private key"
 .row &%tls_remember_esmtp%&          "don't reset after starting TLS"
@@ -13141,6 +13318,7 @@ See also the &'Policy controls'& section above.
 .row &%ignore_fromline_hosts%&       "allow &""From ""& from these hosts"
 .row &%ignore_fromline_local%&       "allow &""From ""& from local SMTP"
 .row &%pipelining_advertise_hosts%&  "advertise pipelining to these hosts"
+.row &%prdr_enable%&                 "advertise PRDR to all hosts"
 .row &%tls_advertise_hosts%&         "advertise TLS to these hosts"
 .endtable
 
@@ -13186,10 +13364,10 @@ See also the &'Policy controls'& section above.
 .row &%disable_ipv6%&                "do no IPv6 processing"
 .row &%dns_again_means_nonexist%&    "for broken domains"
 .row &%dns_check_names_pattern%&     "pre-DNS syntax check"
+.row &%dns_dnssec_ok%&               "parameter for resolver"
 .row &%dns_ipv4_lookup%&             "only v4 lookup for these domains"
 .row &%dns_retrans%&                 "parameter for resolver"
 .row &%dns_retry%&                   "parameter for resolver"
-.row &%dns_use_dnssec%&              "parameter for resolver"
 .row &%dns_use_edns0%&               "parameter for resolver"
 .row &%hold_domains%&                "hold delivery for these domains"
 .row &%local_interfaces%&            "for routing checks"
@@ -13252,12 +13430,10 @@ A more detailed analysis of the issues is provided by Dan Bernstein:
 &url(http://cr.yp.to/smtp/8bitmime.html)
 .endd
 
-.new
 To log received 8BITMIME status use
 .code
 log_selector = +8bitmime
 .endd
-.wen
 
 .option acl_not_smtp main string&!! unset
 .cindex "&ACL;" "for non-SMTP messages"
@@ -13294,6 +13470,16 @@ This option defines the ACL that is run after an SMTP DATA command has been
 processed and the message itself has been received, but before the final
 acknowledgment is sent. See chapter &<<CHAPACL>>& for further details.
 
+.option acl_smtp_data_prdr main string&!! unset
+.cindex "DATA" "ACL for"
+.cindex "&ACL;" "PRDR-related"
+.cindex "&ACL;" "per-user data processing"
+This option defines the ACL that,
+if the PRDR feature has been negotiated,
+is run for each recipient after an SMTP DATA command has been
+processed and the message itself has been received, but before the
+acknowledgment is sent. See chapter &<<CHAPACL>>& for further details.
+
 .option acl_smtp_etrn main string&!! unset
 .cindex "ETRN" "ACL for"
 This option defines the ACL that is run when an SMTP ETRN command is
@@ -13688,6 +13874,9 @@ a very large time at the end of the list. For example:
 .code
 delay_warning = 2h:12h:99d
 .endd
+Note that the option is only evaluated at the time a delivery attempt fails,
+which depends on retry and queue-runner configuration.
+Typically retries will be configured more frequently than warning messages.
 
 .option delay_warning_condition main string&!! "see below"
 .vindex "&$domain$&"
@@ -13809,6 +13998,17 @@ This option controls whether or not an IP address, given as a CSA domain, is
 reversed and looked up in the reverse DNS, as described in more detail in
 section &<<SECTverifyCSA>>&.
 
+
+.option dns_dnssec_ok main integer -1
+.cindex "DNS" "resolver options"
+.cindex "DNS" "DNSSEC"
+If this option is set to a non-negative number then Exim will initialise the
+DNS resolver library to either use or not use DNSSEC, overriding the system
+default. A value of 0 coerces DNSSEC off, a value of 1 coerces DNSSEC on.
+
+If the resolver library does not support DNSSEC then this option has no effect.
+
+
 .option dns_ipv4_lookup main "domain list&!!" unset
 .cindex "IPv6" "DNS lookup for AAAA records"
 .cindex "DNS" "IPv6 lookup for AAAA records"
@@ -13839,18 +14039,6 @@ to set in them.
 See &%dns_retrans%& above.
 
 
-.new
-.option dns_use_dnssec main integer -1
-.cindex "DNS" "resolver options"
-.cindex "DNS" "DNSSEC"
-If this option is set to a non-negative number then Exim will initialise the
-DNS resolver library to either use or not use DNSSEC, overriding the system
-default. A value of 0 coerces DNSSEC off, a value of 1 coerces DNSSEC on.
-
-If the resolver library does not support DNSSEC then this option has no effect.
-.wen
-
-
 .option dns_use_edns0 main integer -1
 .cindex "DNS" "resolver options"
 .cindex "DNS" "EDNS0"
@@ -14076,7 +14264,6 @@ server. This reduces security slightly, but improves interworking with older
 implementations of TLS.
 
 
-.new
 option gnutls_allow_auto_pkcs11 main boolean unset
 This option will let GnuTLS (2.12.0 or later) autoload PKCS11 modules with
 the p11-kit configuration files in &_/etc/pkcs11/modules/_&.
@@ -14084,7 +14271,6 @@ the p11-kit configuration files in &_/etc/pkcs11/modules/_&.
 See
 &url(http://www.gnutls.org/manual/gnutls.html#Smart-cards-and-HSMs)
 for documentation.
-.wen
 
 
 
@@ -14838,9 +15024,7 @@ Possible options may include:
 .next
 &`no_tlsv1_2`&
 .next
-.new
 &`safari_ecdhe_ecdsa_bug`&
-.wen
 .next
 &`single_dh_use`&
 .next
@@ -14857,14 +15041,12 @@ Possible options may include:
 &`tls_rollback_bug`&
 .endlist
 
-.new
 As an aside, the &`safari_ecdhe_ecdsa_bug`& item is a misnomer and affects
 all clients connecting using the MacOS SecureTransport TLS facility prior
 to MacOS 10.8.4, including email clients.  If you see old MacOS clients failing
 to negotiate TLS then this option value might help, provided that your OpenSSL
 release is new enough to contain this work-around.  This may be a situation
 where you have to upgrade OpenSSL to get buggy clients working.
-.wen
 
 
 .option oracle_servers main "string list" unset
@@ -14940,6 +15122,15 @@ that clients will use it; &"out of order"& commands that are &"expected"& do
 not count as protocol errors (see &%smtp_max_synprot_errors%&).
 
 
+.option prdr_enable main boolean false
+.cindex "PRDR" "enabling on server"
+This option can be used to enable the Per-Recipient Data Response extension
+to SMTP, defined by Eric Hall.
+If the option is set, PRDR is advertised by Exim when operating as a server.
+If the client requests PRDR, and more than one recipient, for a message 
+an additional ACL is called for each recipient after the message content
+is recieved.  See section &<<SECTPRDRACL>>&.
+
 .option preserve_message_logs main boolean false
 .cindex "message logs" "preserving"
 If this option is set, message log files are not deleted when messages are
@@ -16135,7 +16326,6 @@ The available primes are:
 Some of these will be too small to be accepted by clients.
 Some may be too large to be accepted by clients.
 
-.new
 The TLS protocol does not negotiate an acceptable size for this; clients tend
 to hard-drop connections if what is offered by the server is unacceptable,
 whether too large or too small, and there's no provision for the client to
@@ -16150,7 +16340,13 @@ used to set its &`DH_MAX_P_BITS`& upper-bound to 2236.  This affects many
 mail user agents (MUAs). The lower bound comes from Debian installs of Exim4
 prior to the 4.80 release, as Debian used to patch Exim to raise the minimum
 acceptable bound from 1024 to 2048.
-.wen
+
+
+.option tls_ocsp_file main string&!! unset
+This option
+must if set expand to the absolute path to a file which contains a current
+status proof for the server's certificate, as obtained from the
+Certificate Authority.
 
 
 .option tls_on_connect_ports main "string list" unset
@@ -16219,10 +16415,8 @@ use OpenSSL with a directory.
 
 See &<<SECTtlssni>>& for discussion of when this option might be re-expanded.
 
-.new
 A forced expansion failure or setting to an empty string is equivalent to
 being unset.
-.wen
 
 
 .option tls_verify_hosts main "host list&!!" unset
@@ -16745,11 +16939,12 @@ and the discussion in chapter &<<CHAPenvironment>>&.
 
 
 
-.option headers_add routers string&!! unset
+.option headers_add routers list&!! unset
 .cindex "header lines" "adding"
 .cindex "router" "adding header lines"
-This option specifies a string of text that is expanded at routing time, and
-associated with any addresses that are accepted by the router. However, this
+This option specifies a list of text headers, newline-separated,
+that is associated with any addresses that are accepted by the router.
+Each item is separately expanded, at routing time.  However, this
 option has no effect when an address is just being verified. The way in which
 the text is used to add header lines at transport time is described in section
 &<<SECTheadersaddrem>>&. New header lines are not actually added until the
@@ -16758,14 +16953,12 @@ header lines in string expansions in the transport's configuration do not
 &"see"& the added header lines.
 
 The &%headers_add%& option is expanded after &%errors_to%&, but before
-&%headers_remove%& and &%transport%&. If the expanded string is empty, or if
-the expansion is forced to fail, the option has no effect. Other expansion
+&%headers_remove%& and &%transport%&. If an item is empty, or if
+an item expansion is forced to fail, the item has no effect. Other expansion
 failures are treated as configuration errors.
 
-.new
 Unlike most options, &%headers_add%& can be specified multiple times
 for a router; all listed headers are added.
-.wen
 
 &*Warning 1*&: The &%headers_add%& option cannot be used for a &(redirect)&
 router that has the &%one_time%& option set.
@@ -16783,11 +16976,12 @@ avoided. The &%repeat_use%& option of the &%redirect%& router may be of help.
 
 
 
-.option headers_remove routers string&!! unset
+.option headers_remove routers list&!! unset
 .cindex "header lines" "removing"
 .cindex "router" "removing header lines"
-This option specifies a string of text that is expanded at routing time, and
-associated with any addresses that are accepted by the router. However, this
+This option specifies a list of text headers, colon-separated,
+that is associated with any addresses that are accepted by the router.
+Each item is separately expanded, at routing time.  However, this
 option has no effect when an address is just being verified. The way in which
 the text is used to remove header lines at transport time is described in
 section &<<SECTheadersaddrem>>&. Header lines are not actually removed until
@@ -16796,8 +16990,8 @@ to header lines in string expansions in the transport's configuration still
 &"see"& the original header lines.
 
 The &%headers_remove%& option is expanded after &%errors_to%& and
-&%headers_add%&, but before &%transport%&. If the expansion is forced to fail,
-the option has no effect. Other expansion failures are treated as configuration
+&%headers_add%&, but before &%transport%&. If an item expansion is forced to fail,
+the item has no effect. Other expansion failures are treated as configuration
 errors.
 
 Unlike most options, &%headers_remove%& can be specified multiple times
@@ -17440,7 +17634,7 @@ Setting this option has the effect of setting &%verify_sender%& and
 .oindex "&%-bv%&"
 .cindex "router" "used only when verifying"
 If this option is set, the router is used only when verifying an address,
-.new "delivering in cutthrough mode or"
+delivering in cutthrough mode or
 testing with the &%-bv%& option, not when actually doing a delivery, testing
 with the &%-bt%& option, or running the SMTP EXPN command. It can be further
 restricted to verifying only senders or recipients by means of
@@ -17640,6 +17834,33 @@ when there is a DNS lookup error.
 
 
 
+.new
+.option dnssec_request_domains dnslookup "domain list&!!" unset
+.cindex "MX record" "security"
+.cindex "DNSSEC" "MX lookup"
+.cindex "security" "MX lookup"
+.cindex "DNS" "DNSSEC"
+DNS lookups for domains matching &%dnssec_request_domains%& will be done with
+the dnssec request bit set.
+This applies to all of the SRV, MX A6, AAAA, A lookup sequence.
+.wen
+
+
+
+.new
+.option dnssec_require_domains dnslookup "domain list&!!" unset
+.cindex "MX record" "security"
+.cindex "DNSSEC" "MX lookup"
+.cindex "security" "MX lookup"
+.cindex "DNS" "DNSSEC"
+DNS lookups for domains matching &%dnssec_request_domains%& will be done with
+the dnssec request bit set.  Any returns not having the Authenticated Data bit
+(AD bit) set wil be ignored and logged as a host-lookup failure.
+This applies to all of the SRV, MX A6, AAAA, A lookup sequence.
+.wen
+
+
+
 .option mx_domains dnslookup "domain list&!!" unset
 .cindex "MX record" "required to exist"
 .cindex "SRV record" "required to exist"
@@ -18811,7 +19032,6 @@ quote just the command. An item such as
 .endd
 is interpreted as a pipe with a rather strange command name, and no arguments.
 
-.new
 Note that the above example assumes that the text comes from a lookup source
 of some sort, so that the quotes are part of the data.  If composing a
 redirect router with a &%data%& option directly specifying this command, the
@@ -18821,7 +19041,6 @@ are two main approaches to get around this: escape quotes to be part of the
 data itself, or avoid using this mechanism and instead create a custom
 transport with the &%command%& option set and reference that transport from
 an &%accept%& router.
-.wen
 
 .next
 .cindex "file" "in redirection list"
@@ -19763,10 +19982,8 @@ so on when debugging driver configurations. For example, if a &%headers_add%&
 option is not working properly, &%debug_print%& could be used to output the
 variables it references. A newline is added to the text if it does not end with
 one.
-.new
 The variables &$transport_name$& and &$router_name$& contain the name of the
 transport and the router that called it.
-.wen
 
 .option delivery_date_add transports boolean false
 .cindex "&'Delivery-date:'& header line"
@@ -19801,20 +20018,19 @@ value that the router supplies, and also overriding any value associated with
 &%user%& (see below).
 
 
-.option headers_add transports string&!! unset
+.option headers_add transports list&!! unset
 .cindex "header lines" "adding in transport"
 .cindex "transport" "header lines; adding"
-This option specifies a string of text that is expanded and added to the header
+This option specifies a list of text headers, newline-separated,
+which are (separately) expanded and added to the header
 portion of a message as it is transported, as described in section
 &<<SECTheadersaddrem>>&. Additional header lines can also be specified by
 routers. If the result of the expansion is an empty string, or if the expansion
 is forced to fail, no action is taken. Other expansion failures are treated as
 errors and cause the delivery to be deferred.
 
-.new
 Unlike most options, &%headers_add%& can be specified multiple times
 for a transport; all listed headers are added.
-.wen
 
 
 .option headers_only transports boolean false
@@ -19827,18 +20043,20 @@ transports, the settings of &%message_prefix%& and &%message_suffix%& should be
 checked, since this option does not automatically suppress them.
 
 
-.option headers_remove transports string&!! unset
+.option headers_remove transports list&!! unset
 .cindex "header lines" "removing"
 .cindex "transport" "header lines; removing"
-This option specifies a string that is expanded into a list of header names;
+This option specifies a list of header names, colon-separated;
 these headers are omitted from the message as it is transported, as described
 in section &<<SECTheadersaddrem>>&. Header removal can also be specified by
-routers. If the result of the expansion is an empty string, or if the expansion
+routers.
+Each list item is separately expanded.
+If the result of the expansion is an empty string, or if the expansion
 is forced to fail, no action is taken. Other expansion failures are treated as
 errors and cause the delivery to be deferred.
 
 Unlike most options, &%headers_remove%& can be specified multiple times
-for a router; all listed headers are added.
+for a router; all listed headers are removed.
 
 
 
@@ -21871,7 +22089,6 @@ inserted in the argument list at that point &'as a separate argument'&. This
 avoids any problems with spaces or shell metacharacters, and is of use when a
 &(pipe)& transport is handling groups of addresses in a batch.
 
-.new
 If &%force_command%& is enabled on the transport, Special handling takes place
 for an argument that consists of precisely the text &`$address_pipe`&.  It
 is handled similarly to &$pipe_addresses$& above.  It is expanded and each
@@ -21880,7 +22097,6 @@ argument is inserted in the argument list at that point
 the only item in the argument; in fact, if it were then &%force_command%&
 should behave as a no-op.  Rather, it should be used to adjust the command
 run while preserving the argument vector separation.
-.wen
 
 After splitting up into arguments and expansion, the resulting command is run
 in a subprocess directly from the transport, &'not'& under a shell. The
@@ -22034,7 +22250,6 @@ a bounce message is sent. If &%freeze_signal%& is set, the message will be
 frozen in Exim's queue instead.
 
 
-.new
 .option force_command pipe boolean false
 .cindex "force command"
 .cindex "&(pipe)& transport", "force command"
@@ -22051,7 +22266,6 @@ force_command
 Note that &$address_pipe$& is handled specially in &%command%& when
 &%force_command%& is set, expanding out to the original argument vector as
 separate items, similarly to a Unix shell &`"$@"`& construct.
-.wen
 
 .option ignore_status pipe boolean false
 If this option is true, the status returned by the subprocess that is set up to
@@ -22414,10 +22628,8 @@ appropriate values for the outgoing connection, and these are the values that
 are in force when any authenticators are run and when the
 &%authenticated_sender%& option is expanded.
 
-.new
 These variables are deprecated in favour of &$tls_in_cipher$& et. al.
 and will be removed in a future release.
-.wen
 
 
 .section "Private options for smtp" "SECID146"
@@ -22553,6 +22765,32 @@ details.
 
 
 .new
+.option dnssec_request_domains smtp "domain list&!!" unset
+.cindex "MX record" "security"
+.cindex "DNSSEC" "MX lookup"
+.cindex "security" "MX lookup"
+.cindex "DNS" "DNSSEC"
+DNS lookups for domains matching &%dnssec_request_domains%& will be done with
+the dnssec request bit set.
+This applies to all of the SRV, MX A6, AAAA, A lookup sequence.
+.wen
+
+
+
+.new
+.option dnssec_require_domains smtp "domain list&!!" unset
+.cindex "MX record" "security"
+.cindex "DNSSEC" "MX lookup"
+.cindex "security" "MX lookup"
+.cindex "DNS" "DNSSEC"
+DNS lookups for domains matching &%dnssec_request_domains%& will be done with
+the dnssec request bit set.  Any returns not having the Authenticated Data bit
+(AD bit) set wil be ignored and logged as a host-lookup failure.
+This applies to all of the SRV, MX A6, AAAA, A lookup sequence.
+.wen
+
+
+
 .option dscp smtp string&!! unset
 .cindex "DCSP" "outbound"
 This option causes the DSCP value associated with a socket to be set to one
@@ -22566,7 +22804,6 @@ The outbound packets from Exim will be marked with this value in the header
 that these values will have any effect, not be stripped by networking
 equipment, or do much of anything without cooperation with your Network
 Engineer and those of all network operators between the source and destination.
-.wen
 
 
 .option fallback_hosts smtp "string list" unset
@@ -22701,14 +22938,12 @@ that matches this list, even if the server host advertises PIPELINING support.
 Exim will not try to start a TLS session when delivering to any host that
 matches this list. See chapter &<<CHAPTLS>>& for details of TLS.
 
-.new
 .option hosts_verify_avoid_tls smtp "host list&!!" *
 .cindex "TLS" "avoiding for certain hosts"
 Exim will not try to start a TLS session for a verify callout,
 or when delivering in cutthrough mode,
 to any host that matches this list.
 Note that the default is to not use TLS.
-.wen
 
 
 .option hosts_max_try smtp integer 5
@@ -22778,6 +23013,18 @@ hard failure if required. See also &%hosts_try_auth%&, and chapter
 &<<CHAPSMTPAUTH>>& for details of authentication.
 
 
+.option hosts_request_ocsp smtp "host list&!!" *
+.cindex "TLS" "requiring for certain servers"
+Exim will request a Certificate Status on a
+TLS session for any host that matches this list.
+&%tls_verify_certificates%& should also be set for the transport.
+
+.option hosts_require_ocsp smtp "host list&!!" unset
+.cindex "TLS" "requiring for certain servers"
+Exim will request, and check for a valid Certificate Status being given, on a
+TLS session for any host that matches this list.
+&%tls_verify_certificates%& should also be set for the transport.
+
 .option hosts_require_tls smtp "host list&!!" unset
 .cindex "TLS" "requiring for certain servers"
 Exim will insist on using a TLS session when delivering to any host that
@@ -22793,6 +23040,12 @@ connects. If authentication fails, Exim will try to transfer the message
 unauthenticated. See also &%hosts_require_auth%&, and chapter
 &<<CHAPSMTPAUTH>>& for details of authentication.
 
+.option hosts_try_prdr smtp "host list&!!" unset
+.cindex "PRDR" "enabling, optional in client"
+This option provides a list of servers to which, provided they announce
+PRDR support, Exim will attempt to negotiate PRDR
+for multi-recipient messages.
+
 .option interface smtp "string list&!!" unset
 .cindex "bind IP address"
 .cindex "IP address" "binding"
@@ -22974,7 +23227,6 @@ This option specifies a certificate revocation list. The expanded value must
 be the name of a file that contains a CRL in PEM format.
 
 
-.new
 .option tls_dh_min_bits smtp integer 1024
 .cindex "TLS" "Diffie-Hellman minimum acceptable size"
 When establishing a TLS session, if a ciphersuite which uses Diffie-Hellman
@@ -22984,7 +23236,6 @@ If the parameter offered by the server is too small, then the TLS handshake
 will fail.
 
 Only supported when using GnuTLS.
-.wen
 
 
 .option tls_privatekey smtp string&!! unset
@@ -23045,6 +23296,19 @@ unknown state), opens a new one to the same host, and then tries the delivery
 in clear.
 
 
+.option tls_try_verify_hosts smtp "host list&!! unset
+.cindex "TLS" "server certificate verification"
+.cindex "certificate" "verification of server"
+This option gives a list of hosts for which, on encrypted connections,
+certificate verification will be tried but need not succeed.
+The &%tls_verify_certificates%& option must also be set.
+Note that unless the host is in this list
+TLS connections will be denied to hosts using self-signed certificates
+when &%tls_verify_certificates%& is set.
+The &$tls_out_certificate_verified$& variable is set when
+certificate verification succeeds.
+
+
 .option tls_verify_certificates smtp string&!! unset
 .cindex "TLS" "server certificate verification"
 .cindex "certificate" "verification of server"
@@ -23059,6 +23323,20 @@ single file if you are using GnuTLS. The values of &$host$& and
 &$host_address$& are set to the name and address of the server during the
 expansion of this option. See chapter &<<CHAPTLS>>& for details of TLS.
 
+For back-compatability,
+if neither tls_verify_hosts nor tls_try_verify_hosts are set
+and certificate verification fails the TLS connection is closed.
+
+
+.option tls_verify_hosts smtp "host list&!! unset
+.cindex "TLS" "server certificate verification"
+.cindex "certificate" "verification of server"
+This option gives a list of hosts for which. on encrypted connections,
+certificate verification must succeed.
+The &%tls_verify_certificates%& option must also be set.
+If both this option and &%tls_try_verify_hosts%& are unset
+operation is as if this option selected all hosts.
+
 
 
 
@@ -24295,12 +24573,10 @@ client_condition = ${if !eq{$tls_out_cipher}{}}
 .endd
 
 
-.new
 .option client_set_id authenticators string&!! unset
 When client authentication succeeds, this condition is expanded; the
 result is used in the log lines for outbound messasges.
 Typically it will be the user name used for authentication.
-.wen
 
 
 .option driver authenticators string unset
@@ -24671,7 +24947,6 @@ expansion is &"1"&, &"yes"&, or &"true"&, authentication succeeds and the
 generic &%server_set_id%& option is expanded and saved in &$authenticated_id$&.
 For any other result, a temporary error code is returned, with the expanded
 string as the error text
-.new ", and the failed id saved in &$authenticated_fail_id$&."
 
 &*Warning*&: If you use a lookup in the expansion to find the user's
 password, be sure to make the authentication fail if the user is unknown.
@@ -25118,7 +25393,7 @@ dovecot_plain:
   driver = dovecot
   public_name = PLAIN
   server_socket = /var/run/dovecot/auth-client
-  server_set_id = $auth2
+  server_set_id = $auth1
 
 dovecot_ntlm:
   driver = dovecot
@@ -25547,12 +25822,10 @@ option).
 The &%tls_require_ciphers%& options operate differently, as described in the
 sections &<<SECTreqciphssl>>& and &<<SECTreqciphgnu>>&.
 .next
-.new
 The &%tls_dh_min_bits%& SMTP transport option is only honoured by GnuTLS.
 When using OpenSSL, this option is ignored.
 (If an API is found to let OpenSSL be configured in this way,
 let the Exim Maintainers know and we'll likely use it).
-.wen
 .next
 Some other recently added features may only be available in one or the other.
 This should be documented with the feature.  If the documentation does not
@@ -25855,10 +26128,8 @@ example, OpenSSL uses the name DES-CBC3-SHA for the cipher suite which in other
 contexts is known as TLS_RSA_WITH_3DES_EDE_CBC_SHA. Check the OpenSSL or GnuTLS
 documentation for more details.
 
-.new
 For outgoing SMTP deliveries, &$tls_out_cipher$& is used and logged
 (again depending on the &%tls_cipher%& log selector).
-.wen
 
 
 .section "Requesting and verifying client certificates" "SECID183"
@@ -25913,12 +26184,79 @@ certificate is supplied, &$tls_in_peerdn$& is empty.
 .cindex "TLS" "revoked certificates"
 .cindex "revocation list"
 .cindex "certificate" "revocation list"
+.cindex "OCSP" "stapling"
 Certificate issuing authorities issue Certificate Revocation Lists (CRLs) when
 certificates are revoked. If you have such a list, you can pass it to an Exim
 server using the global option called &%tls_crl%& and to an Exim client using
 an identically named option for the &(smtp)& transport. In each case, the value
 of the option is expanded and must then be the name of a file that contains a
 CRL in PEM format.
+The downside is that clients have to periodically re-download a potentially huge
+file from every certificate authority the know of.
+
+The way with most moving parts at query time is Online Certificate
+Status Protocol (OCSP), where the client verifies the certificate
+against an OCSP server run by the CA.  This lets the CA track all
+usage of the certs.  It requires running software with access to the
+private key of the CA, to sign the responses to the OCSP queries.  OCSP
+is based on HTTP and can be proxied accordingly.
+
+The only widespread OCSP server implementation (known to this writer)
+comes as part of OpenSSL and aborts on an invalid request, such as
+connecting to the port and then disconnecting.  This requires
+re-entering the passphrase each time some random client does this.
+
+The third way is OCSP Stapling; in this, the server using a certificate
+issued by the CA periodically requests an OCSP proof of validity from
+the OCSP server, then serves it up inline as part of the TLS
+negotiation.   This approach adds no extra round trips, does not let the
+CA track users, scales well with number of certs issued by the CA and is
+resilient to temporary OCSP server failures, as long as the server
+starts retrying to fetch an OCSP proof some time before its current
+proof expires.  The downside is that it requires server support.
+
+Unless Exim is built with the support disabled,
+or with GnuTLS earlier than version 3.1.3,
+support for OCSP stapling is included.
+
+There is a global option called &%tls_ocsp_file%&.
+The file specified therein is expected to be in DER format, and contain
+an OCSP proof.  Exim will serve it as part of the TLS handshake.  This
+option will be re-expanded for SNI, if the &%tls_certificate%& option
+contains &`tls_in_sni`&, as per other TLS options.
+
+Exim does not at this time implement any support for fetching a new OCSP
+proof.  The burden is on the administrator to handle this, outside of
+Exim.  The file specified should be replaced atomically, so that the
+contents are always valid.  Exim will expand the &%tls_ocsp_file%& option
+on each connection, so a new file will be handled transparently on the
+next connection.
+
+When built with OpenSSL Exim will check for a valid next update timestamp
+in the OCSP proof; if not present, or if the proof has expired, it will be
+ignored.
+
+For the client to be able to verify the stapled OCSP the server must
+also supply, in its stapled information, any intermediate
+certificates for the chain leading to the OCSP proof from the signer
+of the server certificate.  There may be zero or one such. These
+intermediate certificates should be added to the server OCSP stapling
+file named by &%tls_ocsp_file%&.
+
+Note that the proof only covers the terminal server certificate,
+not any of the chain from CA to it.
+
+.code
+  A helper script "ocsp_fetch.pl" for fetching a proof from a CA
+  OCSP server is supplied.  The server URL may be included in the
+  server certificate, if the CA is helpful.
+
+  One failure mode seen was the OCSP Signer cert expiring before the end
+  of validity of the OCSP proof. The checking done by Exim/OpenSSL
+  noted this as invalid overall, but the re-fetch script did not.
+.endd
+
+
 
 
 .section "Configuring an Exim client to use TLS" "SECID185"
@@ -25967,6 +26305,25 @@ for OpenSSL only (not GnuTLS), a directory, that contains a collection of
 expected server certificates. The client verifies the server's certificate
 against this collection, taking into account any revoked certificates that are
 in the list defined by &%tls_crl%&.
+Failure to verify fails the TLS connection unless either of the
+&%tls_verify_hosts%& or &%tls_try_verify_hosts%& options are set.
+
+The &%tls_verify_hosts%& and &%tls_try_verify_hosts%& options restrict
+certificate verification to the listed servers.  Verification either must
+or need not succeed respectively.
+
+The &(smtp)& transport has two OCSP-related options:
+&%hosts_require_ocsp%&; a host-list for which a Certificate Status
+is requested and required for the connection to proceed.  The default
+value is empty.
+&%hosts_request_ocsp%&; a host-list for which (additionally)
+a Certificate Status is requested (but not necessarily verified).  The default
+value is "*" meaning that requests are made unless configured
+otherwise.
+
+The host(s) should also be in &%hosts_require_tls%&, and
+&%tls_verify_certificates%& configured for the transport,
+for OCSP to be relevant.
 
 If
 &%tls_require_ciphers%& is set on the &(smtp)& transport, it must contain a
@@ -26053,6 +26410,9 @@ during TLS session handshake, to permit alternative values to be chosen:
 .next
 .vindex "&%tls_verify_certificates%&"
 &%tls_verify_certificates%&
+.next
+.vindex "&%tls_ocsp_file%&"
+&%tls_verify_certificates%&
 .endlist
 
 Great care should be taken to deal with matters of case, various injection
@@ -26144,15 +26504,19 @@ validation to succeed, of course, but if it's not preinstalled, sending the
 root certificate along with the rest makes it available for the user to
 install if the receiving end is a client MUA that can interact with a user.
 
+Note that certificates using MD5 are unlikely to work on today's Internet;
+even if your libraries allow loading them for use in Exim when acting as a
+server, increasingly clients will not accept such certificates.  The error
+diagnostics in such a case can be frustratingly vague.
+
+
 
 .section "Self-signed certificates" "SECID187"
 .cindex "certificate" "self-signed"
 You can create a self-signed certificate using the &'req'& command provided
 with OpenSSL, like this:
-.new
 . ==== Do not shorten the duration here without reading and considering
 . ==== the text below.  Please leave it at 9999 days.
-.wen
 .code
 openssl req -x509 -newkey rsa:1024 -keyout file1 -out file2 \
             -days 9999 -nodes
@@ -26165,7 +26529,6 @@ that you are prompted for, and any use that is made of the key causes more
 prompting for the passphrase. This is not helpful if you are going to use
 this certificate and key in an MTA, where prompting is not possible.
 
-.new
 . ==== I expect to still be working 26 years from now.  The less technical
 . ==== debt I create, in terms of storing up trouble for my later years, the
 . ==== happier I will be then.  We really have reached the point where we
@@ -26181,7 +26544,6 @@ of the certificate or reconsider your platform deployment.  (At time of
 writing, reducing the duration is the most likely choice, but the inexorable
 progression of time takes us steadily towards an era where this will not
 be a sensible resolution).
-.wen
 
 A self-signed certificate made in this way is sufficient for testing, and
 may be adequate for all your requirements if you are mainly interested in
@@ -26259,6 +26621,7 @@ options in the main part of the configuration. These options are:
 .cindex "SMTP" "connection, ACL for"
 .cindex "non-SMTP messages" "ACLs for"
 .cindex "MIME content scanning" "ACL for"
+.cindex "PRDR" "ACL for"
 
 .table2 140pt
 .irow &%acl_not_smtp%&         "ACL for non-SMTP messages"
@@ -26267,6 +26630,7 @@ options in the main part of the configuration. These options are:
 .irow &%acl_smtp_auth%&        "ACL for AUTH"
 .irow &%acl_smtp_connect%&     "ACL for start of SMTP connection"
 .irow &%acl_smtp_data%&        "ACL after DATA is complete"
+.irow &%acl_smtp_data_prdr%&   "ACL for each recipient, after DATA is complete"
 .irow &%acl_smtp_etrn%&        "ACL for ETRN"
 .irow &%acl_smtp_expn%&        "ACL for EXPN"
 .irow &%acl_smtp_helo%&        "ACL for HELO or EHLO"
@@ -26381,10 +26745,10 @@ before or after the data) correctly &-- they keep the message on their queues
 and try again later, but that is their problem, though it does waste some of
 your resources.
 
-.new
-The &%acl_smtp_data%& ACL is run after both the &%acl_smtp_dkim%& and
-the &%acl_smtp_mime%& ACLs.
-.wen
+The &%acl_smtp_data%& ACL is run after
+the &%acl_smtp_data_prdr%&,
+the &%acl_smtp_dkim%&
+and the &%acl_smtp_mime%& ACLs.
 
 .section "The SMTP DKIM ACL" "SECTDKIMACL"
 The &%acl_smtp_dkim%& ACL is available only when Exim is compiled with DKIM support
@@ -26394,11 +26758,9 @@ The ACL test specified by &%acl_smtp_dkim%& happens after a message has been
 received, and is executed for each DKIM signature found in a message.  If not
 otherwise specified, the default action is to accept.
 
-.new
 This ACL is evaluated before &%acl_smtp_mime%& and &%acl_smtp_data%&.
 
 For details on the operation of DKIM, see chapter &<<CHAPdkim>>&.
-.wen
 
 
 .section "The SMTP MIME ACL" "SECID194"
@@ -26408,6 +26770,36 @@ content-scanning extension. For details, see chapter &<<CHAPexiscan>>&.
 This ACL is evaluated after &%acl_smtp_dkim%& but before &%acl_smtp_data%&.
 
 
+.section "The SMTP PRDR ACL" "SECTPRDRACL"
+.oindex "&%prdr_enable%&"
+The &%acl_smtp_data_prdr%& ACL is available only when Exim is compiled
+with PRDR support enabled (which is the default).
+It becomes active only when the PRDR feature is negotiated between
+client and server for a message, and more than one recipient
+has been accepted.
+
+The ACL test specfied by &%acl_smtp_data_prdr%& happens after a message
+has been recieved, and is executed for each recipient of the message.
+The test may accept or deny for inividual recipients.
+The &%acl_smtp_data%& will still be called after this ACL and
+can reject the message overall, even if this ACL has accepted it
+for some or all recipients.
+
+PRDR may be used to support per-user content filtering.  Without it
+one must defer any recipient after the first that has a different
+content-filter configuration.  With PRDR, the RCPT-time check
+for this can be disabled when the MAIL-time $smtp_command included
+"PRDR".  Any required difference in behaviour of the main DATA-time
+ACL should however depend on the PRDR-time ACL having run, as Exim
+will avoid doing so in some situations (eg.  single-recipient mails).
+
+See also the &%prdr_enable%& global option
+and the &%hosts_try_prdr%& smtp transport option.
+
+This ACL is evaluated after &%acl_smtp_dkim%& but before &%acl_smtp_data%&.
+If the ACL is not defined, processing completes as if
+the feature was not requested by the client.
+
 .section "The QUIT ACL" "SECTQUITACL"
 .cindex "QUIT, ACL for"
 The ACL for the SMTP QUIT command is anomalous, in that the outcome of the ACL
@@ -27234,12 +27626,10 @@ all the conditions are true, wherever it appears in an ACL command, whereas
 effect.
 
 
-.new
 .vitem &*remove_header*&&~=&~<&'text'&>
 This modifier specifies one or more header names in a colon-separated list
  that are to be removed from an incoming message, assuming, of course, that
 the message is ultimately accepted. For details, see section &<<SECTremoveheadacl>>&.
-.wen
 
 
 .vitem &*set*&&~<&'acl_name'&>&~=&~<&'value'&>
@@ -27248,7 +27638,6 @@ This modifier puts a value into one of the ACL variables (see section
 &<<SECTaclvariables>>&).
 
 
-.new
 .vitem &*udpsend*&&~=&~<&'parameters'&>
 This modifier sends a UDP packet, for purposes such as statistics
 collection or behaviour monitoring. The parameters are expanded, and
@@ -27262,7 +27651,6 @@ when:
 udpsend = <; 2001:dB8::dead:beef ; 1234 ;\
              $tod_zulu $sender_host_address
 .endd
-.wen
 .endlist
 
 
@@ -27324,7 +27712,6 @@ Notice that we put back the lower cased version afterwards, assuming that
 is what is wanted for subsequent tests.
 
 
-.new
 .vitem &*control&~=&~cutthrough_delivery*&
 .cindex "&ACL;" "cutthrough routing"
 .cindex "cutthrough" "requesting"
@@ -27333,7 +27720,16 @@ It is usable in the RCPT ACL and valid only for single-recipient mails forwarded
 from one SMTP connection to another.  If a recipient-verify callout connection is
 requested in the same ACL it is held open and used for the data, otherwise one is made
 after the ACL completes.
-.new "Note that routers are used in verify mode."
+
+Note that routers are used in verify mode,
+and cannot depend on content of received headers.
+Note also that headers cannot be
+modified by any of the post-data ACLs (DATA, MIME and DKIM).
+Headers may be modified by routers (subject to the above) and transports.
+
+Cutthrough delivery is not supported via transport-filters or when DKIM signing
+of outgoing messages is done, because it sends data to the ultimate destination
+before the entire message has been received from the source.
 
 Should the ultimate destination system positively accept or reject the mail,
 a corresponding indication is given to the source system and nothing is queued.
@@ -27344,10 +27740,8 @@ line.
 
 Delivery in this mode avoids the generation of a bounce mail to a (possibly faked)
 sender when the destination system is doing content-scan based rejection.
-.wen
 
 
-.new
 .vitem &*control&~=&~debug/*&<&'options'&>
 .cindex "&ACL;" "enabling debug logging"
 .cindex "debugging" "enabling from an ACL"
@@ -27364,7 +27758,6 @@ contexts):
       control = debug/opts=+expand+acl
       control = debug/tag=.$message_exim_id/opts=+expand
 .endd
-.wen
 
 
 .vitem &*control&~=&~dkim_disable_verify*&
@@ -27374,7 +27767,6 @@ This control turns off DKIM verification processing entirely.  For details on
 the operation and configuration of DKIM, see chapter &<<CHAPdkim>>&.
 
 
-.new
 .vitem &*control&~=&~dscp/*&<&'value'&>
 .cindex "&ACL;" "setting DSCP value"
 .cindex "DSCP" "inbound"
@@ -27390,7 +27782,6 @@ The outbound packets from Exim will be marked with this value in the header
 that these values will have any effect, not be stripped by networking
 equipment, or do much of anything without cooperation with your Network
 Engineer and those of all network operators between the source and destination.
-.wen
 
 
 .vitem &*control&~=&~enforce_sync*& &&&
@@ -27592,12 +27983,15 @@ warn dnslists = sbl.spamhaus.org : \
      add_header = X-blacklisted-at: $dnslist_domain
 .endd
 The &%add_header%& modifier is permitted in the MAIL, RCPT, PREDATA, DATA,
-MIME, and non-SMTP ACLs (in other words, those that are concerned with
+MIME, DKIM, and non-SMTP ACLs (in other words, those that are concerned with
 receiving a message). The message must ultimately be accepted for
 &%add_header%& to have any significant effect. You can use &%add_header%& with
 any ACL verb, including &%deny%& (though this is potentially useful only in a
 RCPT ACL).
 
+Headers will not be added to the message if the modifier is used in
+DATA, MIME or DKIM ACLs for messages delivered by cutthrough routing.
+
 Leading and trailing newlines are removed from
 the data for the &%add_header%& modifier; if it then
 contains one or more newlines that
@@ -27629,9 +28023,7 @@ passing data between (for example) the MAIL and RCPT ACLs. If you want to do
 this, you can use ACL variables, as described in section
 &<<SECTaclvariables>>&.
 
-.new
 The list of headers yet to be added is given by the &%$headers_added%& variable.
-.wen
 
 The &%add_header%& modifier acts immediately as it is encountered during the
 processing of an ACL. Notice the difference between these two cases:
@@ -27682,7 +28074,6 @@ system filter or in a router or transport.
 
 
 
-.new
 .section "Removing header lines in ACLs" "SECTremoveheadacl"
 .cindex "header lines" "removing in an ACL"
 .cindex "header lines" "position of removed lines"
@@ -27694,12 +28085,15 @@ warn   message        = Remove internal headers
        remove_header  = x-route-mail1 : x-route-mail2
 .endd
 The &%remove_header%& modifier is permitted in the MAIL, RCPT, PREDATA, DATA,
-MIME, and non-SMTP ACLs (in other words, those that are concerned with
+MIME, DKIM, and non-SMTP ACLs (in other words, those that are concerned with
 receiving a message). The message must ultimately be accepted for
 &%remove_header%& to have any significant effect. You can use &%remove_header%&
 with any ACL verb, including &%deny%&, though this is really not useful for
 any verb that doesn't result in a delivered message.
 
+Headers will not be removed to the message if the modifier is used in
+DATA, MIME or DKIM ACLs for messages delivered by cutthrough routing.
+
 More than one header can be removed at the same time by using a colon separated
 list of header names. The header matching is case insensitive. Wildcards are
 not permitted, nor is list expansion performed, so you cannot use hostlists to
@@ -27750,7 +28144,6 @@ are honoured.
 &*Warning*&: This facility currently applies only to header lines that are
 present during ACL processing. It does NOT remove header lines that are added
 in a system filter or in a router or transport.
-.wen
 
 
 
@@ -27785,13 +28178,11 @@ condition is on a &%warn%& verb. In that case, a &"defer"& return makes the
 condition false. This means that further processing of the &%warn%& verb
 ceases, but processing of the ACL continues.
 
-.new
 If the argument is a named ACL, up to nine space-separated optional values
 can be appended; they appear within the called ACL in $acl_arg1 to $acl_arg9,
 and $acl_narg is set to the count of values.
 Previous values of these variables are restored after the call returns.
 The name and values are expanded separately.
-.wen
 
 If the nested &%acl%& returns &"drop"& and the outer condition denies access,
 the connection is dropped. If it returns &"discard"&, the verb must be
@@ -28023,6 +28414,23 @@ This condition checks whether the sending host (the client) is authorized to
 send email. Details of how this works are given in section
 &<<SECTverifyCSA>>&.
 
+.new
+.vitem &*verify&~=&~header_names_ascii*&
+.cindex "&%verify%& ACL condition"
+.cindex "&ACL;" "verifying header names only ASCII"
+.cindex "header lines" "verifying header names only ASCII"
+.cindex "verifying" "header names only ASCII"
+This condition is relevant only in an ACL that is run after a message has been
+received, that is, in an ACL specified by &%acl_smtp_data%& or
+&%acl_not_smtp%&.  It checks all header names (not the content) to make sure
+there are no non-ASCII characters, also excluding control characters.  The
+allowable characters are decimal ASCII values 33 through 126.
+
+Exim itself will handle headers with non-ASCII characters, but it can cause
+problems for downstream applications, so this option will allow their
+detection and rejection in the DATA ACL's.
+.wen
+
 .vitem &*verify&~=&~header_sender/*&<&'options'&>
 .cindex "&%verify%& ACL condition"
 .cindex "&ACL;" "verifying sender in the header"
@@ -28634,6 +29042,13 @@ deny   condition = ${if isip4{$sender_host_address}}
        dnslists  = some.list.example
 .endd
 
+If an explicit key is being used for a DNS lookup and it may be an IPv6
+address you should specify alternate list separators for both the outer
+(DNS list name) list and inner (lookup keys) list:
+.code
+       dnslists = <; dnsbl.example.com/<|$acl_m_addrslist
+.endd
+
 .section "Rate limiting incoming messages" "SECTratelimiting"
 .cindex "rate limiting" "client sending"
 .cindex "limiting client sending rates"
@@ -29015,6 +29430,7 @@ router that does not set up hosts routes to an &(smtp)& transport with a
 &%hosts%& setting, the transport's hosts are used. If an &(smtp)& transport has
 &%hosts_override%& set, its hosts are always used, whether or not the router
 supplies a host list.
+Callouts are only supported on &(smtp)& transports.
 
 The port that is used is taken from the transport, if it is specified and is a
 remote transport. (For routers that do verification only, no transport need be
@@ -29036,10 +29452,8 @@ following SMTP commands are sent:
 LHLO is used instead of HELO if the transport's &%protocol%& option is
 set to &"lmtp"&.
 
-.new
 The callout may use EHLO, AUTH and/or STARTTLS given appropriate option
 settings.
-.wen
 
 A recipient callout check is similar. By default, it also uses an empty address
 for the sender. This default is chosen because most hosts do not make use of
@@ -29721,7 +30135,6 @@ Exim does not assume that there is a common filesystem with the remote host.
 There is an option WITH_OLD_CLAMAV_STREAM in &_src/EDITME_& available, should
 you be running a version of ClamAV prior to 0.95.
 
-.new
 The final example shows that multiple TCP targets can be specified.  Exim will
 randomly use one for each incoming email (i.e. it load balances them).  Note
 that only TCP targets may be used if specifying a list of scanners; a UNIX
@@ -29736,7 +30149,6 @@ email that the down scanner gets chosen first (message wrapped to be readable):
    clamd: connection to localhost, port 3310 failed
    (Connection refused)
 .endd
-.wen
 
 If the option is unset, the default is &_/tmp/clamd_&. Thanks to David Saez for
 contributing the code for this scanner.
@@ -29822,6 +30234,24 @@ av_scanner = mksd:2
 .endd
 You can safely omit this option (the default value is 1).
 
+.vitem &%sock%&
+.cindex "virus scanners" "simple socket-connected"
+This is a general-purpose way of talking to simple scanner daemons
+running on the local machine.
+There are four options:
+an address (which may be an IP addres and port, or the path of a Unix socket),
+a commandline to send (may include a single %s which will be replaced with
+the path to the mail file to be scanned),
+an RE to trigger on from the returned data,
+an RE to extract malware_name from the returned data.
+For example:
+.code
+av_scanner = sock:127.0.0.1 6001:%s:(SPAM|VIRUS):(.*)\$
+.endd
+Default for the socket specifier is &_/tmp/malware.sock_&.
+Default for the commandline is &_%s\n_&.
+Both regular-expressions are required.
+
 .vitem &%sophie%&
 .cindex "virus scanners" "Sophos and Sophie"
 Sophie is a daemon that uses Sophos' &%libsavi%& library to scan for viruses.
@@ -31944,7 +32374,7 @@ they do not affect the values of the variables that refer to header lines.
 the transport cannot refer to the modified header lines, because such
 expansions all occur before the message is actually transported.
 
-For both routers and transports, the result of expanding a &%headers_add%&
+For both routers and transports, the argument of a &%headers_add%&
 option must be in the form of one or more RFC 2822 header lines, separated by
 newlines (coded as &"\n"&). For example:
 .code
@@ -31953,13 +32383,11 @@ headers_add = X-added-header: added by $primary_hostname\n\
 .endd
 Exim does not check the syntax of these added header lines.
 
-.new
 Multiple &%headers_add%& options for a single router or transport can be
-specified; the values will be concatenated (with a separating newline
-added) before expansion.
-.wen
+specified; the values will append to a single list of header lines.
+Each header-line is separately expanded.
 
-The result of expanding &%headers_remove%& must consist of a colon-separated
+The argument of a &%headers_remove%& option must consist of a colon-separated
 list of header names. This is confusing, because header names themselves are
 often terminated by colons. In this case, the colons are the list separators,
 not part of the names. For example:
@@ -31968,11 +32396,12 @@ headers_remove = return-receipt-to:acknowledge-to
 .endd
 
 Multiple &%headers_remove%& options for a single router or transport can be
-specified; the values will be concatenated (with a separating colon
-added) before expansion.
+specified; the arguments will append to a single header-names list.
+Each item is separately expanded.
 
-When &%headers_add%& or &%headers_remove%& is specified on a router, its value
-is expanded at routing time, and then associated with all addresses that are
+When &%headers_add%& or &%headers_remove%& is specified on a router,
+items are expanded at routing time,
+and then associated with all addresses that are
 accepted by that router, and also with any new addresses that it generates. If
 an address passes through several routers as a result of aliasing or
 forwarding, the changes are cumulative.
@@ -33834,9 +34263,7 @@ timestamp. The flags are:
 &`<=`&     message arrival
 &`=>`&     normal message delivery
 &`->`&     additional address in same delivery
-.new
 &`>>`&     cutthrough message delivery
-.wen
 &`*>`&     delivery suppressed by &%-N%&
 &`**`&     delivery failed; address bounced
 &`==`&     delivery deferred; temporary problem
@@ -33936,12 +34363,10 @@ intermediate address(es) exist between the original and the final address, the
 last of these is given in parentheses after the final address. The R and T
 fields record the router and transport that were used to process the address.
 
-.new
 If SMTP AUTH was used for the delivery there is an additional item A=
 followed by the name of the authenticator that was used.
 If an authenticated identification was set up by the authenticator's &%client_set_id%&
 option, this is logged too, separated by a colon from the authenticator name.
-.wen
 
 If a shadow transport was run after a successful local delivery, the log line
 for the successful delivery has an item added on the end, of the form
@@ -33958,13 +34383,11 @@ flagged with &`->`& instead of &`=>`&. When two or more messages are delivered
 down a single SMTP connection, an asterisk follows the IP address in the log
 lines for the second and subsequent messages.
 
-.new
 .cindex "delivery" "cutthrough; logging"
 .cindex "cutthrough" "logging"
 When delivery is done in cutthrough mode it is flagged with &`>>`& and the log
 line precedes the reception line, since cutthrough waits for a possible
 rejection from the destination in case it can reject the sourced item.
-.wen
 
 The generation of a reply message by a filter file gets logged as a
 &"delivery"& to the addressee, preceded by &">"&.
@@ -34076,6 +34499,7 @@ the following table:
 &`R   `&        on &`<=`& lines: reference for local bounce
 &`    `&        on &`=>`&  &`**`& and &`==`& lines: router name
 &`S   `&        size of message
+&`SNI `&        server name indication from TLS client hello
 &`ST  `&        shadow transport name
 &`T   `&        on &`<=`& lines: message subject (topic)
 &`    `&        on &`=>`& &`**`& and &`==`& lines: transport name
@@ -34142,9 +34566,7 @@ log_selector = +arguments -retry_defer
 The list of optional log items is in the following table, with the default
 selection marked by asterisks:
 .display
-.new
 &` 8bitmime                   `&  received 8BITMIME status
-.wen
 &`*acl_warn_skipped           `&  skipped &%warn%& statement in ACL
 &` address_rewrite            `&  address rewriting
 &` all_parents                `&  all parents in => lines
@@ -34174,14 +34596,10 @@ selection marked by asterisks:
 &`*sender_verify_fail         `&  sender verification failures
 &`*size_reject                `&  rejection because too big
 &`*skip_delivery              `&  delivery skipped in a queue run
-.new
 &`*smtp_confirmation          `&  SMTP confirmation on => lines
-.wen
 &` smtp_connection            `&  SMTP connections
 &` smtp_incomplete_transaction`&  incomplete SMTP transactions
-.new
 &` smtp_mailauth              `&  AUTH argument to MAIL commands
-.wen
 &` smtp_no_mail               `&  session with no MAIL commands
 &` smtp_protocol_error        `&  SMTP protocol errors
 &` smtp_syntax_error          `&  SMTP syntax errors
@@ -34197,7 +34615,6 @@ selection marked by asterisks:
 More details on each of these items follows:
 
 .ilist
-.new
 .cindex "8BITMIME"
 .cindex "log" "8BITMIME"
 &%8bitmime%&: This causes Exim to log any 8BITMIME status of received messages,
@@ -34205,7 +34622,6 @@ which may help in tracking down interoperability issues with ancient MTAs
 that are not 8bit clean.  This is added to the &"<="& line, tagged with
 &`M8S=`& and a value of &`0`&, &`7`& or &`8`&, corresponding to "not given",
 &`7BIT`& and &`8BITMIME`& respectively.
-.wen
 .next
 .cindex "&%warn%& ACL verb" "log when skipping"
 &%acl_warn_skipped%&: When an ACL &%warn%& statement is skipped because one of
@@ -34393,7 +34809,8 @@ The message that is written is &"spool file is locked"&.
 .next
 .cindex "log" "smtp confirmation"
 .cindex "SMTP" "logging confirmation"
-&%smtp_confirmation%&: The response to the final &"."& in the SMTP dialogue for
+.cindex "LMTP" "logging confirmation"
+&%smtp_confirmation%&: The response to the final &"."& in the SMTP or LMTP dialogue for
 outgoing messages is added to delivery log lines in the form &`C=`&<&'text'&>.
 A number of MTAs (including Exim) return an identifying string in this
 response.
@@ -34452,12 +34869,10 @@ the last 20 are listed, preceded by &"..."&. However, with the default
 setting of 10 for &%smtp_accep_max_nonmail%&, the connection will in any case
 have been aborted before 20 non-mail commands are processed.
 .next
-.new
 &%smtp_mailauth%&: A third subfield with the authenticated sender,
 colon-separated, is appended to the A= item for a message arrival or delivery
 log line, if an AUTH argument to the SMTP MAIL command (see &<<SECTauthparamail>>&)
 was accepted or used.
-.wen
 .next
 .cindex "log" "SMTP protocol error"
 .cindex "SMTP" "logging protocol error"
@@ -34624,9 +35039,17 @@ This utility is a Perl script contributed by Matt Hubbard. It runs
 .code
 exim -bpu
 .endd
-to obtain a queue listing with undelivered recipients only, and then greps the
-output to select messages that match given criteria. The following selection
-options are available:
+or (in case &*-a*& switch is specified)
+.code
+exim -bp
+.endd
+.new
+The &*-C*& option is used to specify an alternate &_exim.conf_& which might
+contain alternate exim configuration the queue management might be using.
+.wen
+
+to obtain a queue listing, and then greps the output to select messages 
+that match given criteria. The following selection options are available:
 
 .vlist
 .vitem &*-f*&&~<&'regex'&>
@@ -34673,6 +35096,9 @@ Brief format &-- one line per message.
 
 .vitem &*-R*&
 Display messages in reverse order.
+
+.vitem &*-a*&
+Include delivered recipients in queue listing.
 .endlist
 
 There is one more option, &%-h%&, which outputs a list of options.
@@ -35861,7 +36287,6 @@ are given in chapter &<<CHAPappendfile>>&.
 
 
 
-.new
 .section "Running local commands" "SECTsecconslocalcmds"
 .cindex "security" "local commands"
 .cindex "security" "command injection attacks"
@@ -35905,12 +36330,10 @@ real-world security vulnerabilities caused by its use with untrustworthy data
 injected in, for SQL injection attacks.
 Consider the use of the &%inlisti%& expansion condition instead.
 .endlist
-.wen
 
 
 
 
-.new
 .section "Trust in configuration data" "SECTsecconfdata"
 .cindex "security" "data sources"
 .cindex "security" "regular expressions"
@@ -35939,7 +36362,6 @@ items to ensure that data is correctly constructed.
 Some lookups might return multiple results, even though normal usage is only
 expected to yield one result.
 .endlist
-.wen
 
 
 
@@ -36416,7 +36838,9 @@ disabled by setting DISABLE_DKIM=yes in Local/Makefile.
 Exim's DKIM implementation allows to
 .olist
 Sign outgoing messages: This function is implemented in the SMTP transport.
-It can co-exist with all other Exim features, including transport filters.
+It can co-exist with all other Exim features
+(including transport filters)
+except cutthrough delivery.
 .next
 Verify signatures in incoming messages: This is implemented by an additional
 ACL (acl_smtp_dkim), which can be called several times per message, with
@@ -36507,6 +36931,10 @@ used.
 Verification of DKIM signatures in incoming email is implemented via the
 &%acl_smtp_dkim%& ACL. By default, this ACL is called once for each
 syntactically(!) correct signature in the incoming message.
+A missing ACL definition defaults to accept.
+If any ACL call does not acccept, the message is not accepted.
+If a cutthrough delivery was in progress for the message it is
+summarily dropped (having wasted the transmission effort).
 
 To evaluate the signature in the ACL a large number of expansion variables
 containing the signature status and its details are set up during the
@@ -36698,13 +37126,11 @@ Add to &_src/config.h.defaults_& the line:
 Edit &_src/drtables.c_&, adding conditional code to pull in the private header
 and create a table entry as is done for all the other drivers and lookup types.
 .next
-.new
 Edit &_scripts/lookups-Makefile_& if this is a new lookup; there is a for-loop
 near the bottom, ranging the &`name_mod`& variable over a list of all lookups.
 Add your &`NEWDRIVER`& to that list.
 As long as the dynamic module would be named &_newdriver.so_&, you can use the
 simple form that most lookups have.
-.wen
 .next
 Edit &_Makefile_& in the appropriate sub-directory (&_src/routers_&,
 &_src/transports_&, &_src/auths_&, or &_src/lookups_&); add a line for the new
index 928f377..ee56623 100644 (file)
@@ -1,6 +1,129 @@
 Change log file for Exim from version 4.21
 -------------------------------------------
 
+
+Exim version 4.83
+-----------------
+
+TF/01 Correctly close the server side of TLS when forking for delivery.
+
+      When a message was received over SMTP with TLS, Exim failed to clear up
+      the incoming connection properly after forking off the child process to
+      deliver the message. In some situations the subsequent outgoing
+      delivery connection happened to have the same fd number as the incoming
+      connection previously had. Exim would try to use TLS and fail, logging
+      a "Bad file descriptor" error.
+
+TF/02 Portability fix for building lookup modules on Solaris when the xpg4
+      utilities have not been installed.
+
+JH/01 Fix memory-handling in use of acl as a conditional; avoid free of
+      temporary space as the ACL may create new global variables.
+
+TL/01 LDAP support uses per connection or global context settings, depending
+      upon the detected version of the libraries at build time.
+
+TL/02 Experimental Proxy Protocol support: allows a proxied SMTP connection
+      to extract and use the src ip:port in logging and expansions as if it
+      were a direct connection from the outside internet. PPv2 support was
+      updated based on HAProxy spec change in May 2014.
+
+JH/02 Add ${listextract {number}{list}{success}{fail}}.
+
+TL/03 Bugzilla 1433: Fix DMARC SEGV with specific From header contents.
+      Properly escape header and check for NULL return.
+
+PP/01 Continue incomplete 4.82 PP/19 by fixing docs too: use dns_dnssec_ok
+      not dns_use_dnssec.
+
+JH/03 Bugzilla 1157: support log_selector smtp_confirmation for lmtp.
+
+TL/04 Add verify = header_names_ascii check to reject email with non-ASCII
+      characters in header names, implemented as a verify condition.
+      Contributed by Michael Fischer v. Mollard.
+
+TL/05 Rename SPF condition results err_perm and err_temp to standardized
+      results permerror and temperror.  Previous values are deprecated but
+      still accepted.  In a future release, err_perm and err_temp will be
+      completely removed, which will be a backward incompatibility if the
+      ACL tests for either of these two old results. Patch contributed by
+      user bes-internal on the mailing list.
+
+JH/04 Add ${utf8clean:} operator. Contributed by Alex Rau.
+
+JH/05 Bugzilla 305: Log incoming-TLS details on rejects, subject to log
+      selectors, in both main and reject logs.
+
+JH/06 Log outbound-TLS and port details, subject to log selectors, for a
+      failed delivery.
+
+JH/07 Add malware type "sock" for talking to simple daemon.
+
+JH/08 Bugzilla 1371: Add tls_{,try_}verify_hosts to smtp transport.
+
+JH/09 Bugzilla 1431: Support (with limitations) headers_add/headers_remove in
+      routers/transports under cutthrough routing.
+
+JH/10 Bugzilla 1005: ACL "condition =" should accept values which are negative
+      numbers.  Touch up "bool" conditional to keep the same definition.
+
+TL/06 Remove duplicated language in spec file from 4.82 TL/16.
+
+JH/11 Add dnsdb tlsa lookup.  From Todd Lyons.
+
+JH/12 Expand items in router/transport headers_add or headers_remove lists
+      individually rather than the list as a whole.  Bug 1452.
+
+      Required for reasonable handling of multiple headers_ options when
+      they may be empty; requires that headers_remove items with embedded
+      colons must have them doubled (or the list-separator changed).
+
+TL/07 Add new dmarc expansion variable $dmarc_domain_policy to directly
+      view the policy declared in the DMARC record. Currently, $dmarc_status
+      is a combined value of both the record presence and the result of the
+      analysis.
+
+JH/13 Fix handling of $tls_cipher et.al. in (non-verify) transport.  Bug 1455.
+
+JH/14 New options dnssec_request_domains, dnssec_require_domains on the
+      dnslookup router and the smtp transport (applying to the forward
+      lookup).
+
+TL/08 Bugzilla 1453: New LDAP "SERVERS=" option allows admin to override list
+      of ldap servers used for a specific lookup.  Patch provided by Heiko
+      Schlichting.
+
+JH/18 New options dnssec_lax, dnssec_strict on dnsdb lookups.
+      New variable $lookup_dnssec_authenticated for observability.
+
+TL/09 Bugzilla 609: Add -C option to exiqgrep, specify which exim.conf to use.
+      Patch submitted by Lars Timman.
+
+JH/19 EXPERIMENTAL_OCSP support under GnuTLS.  Bug 1459.
+
+TL/10 Bugzilla 1454: New -oMm option to pass message reference to Exim.
+      Requires trusted mode and valid format message id, aborts otherwise.
+      Patch contributed by Heiko Schlichting.
+
+JH/20 New expansion variables tls_(in,out)_(our,peer)cert, and expansion item
+      certextract with support for various fields.  Bug 1358.
+
+JH/21 Observability of OCSP via variables tls_(in,out)_ocsp.  Stapling
+      is requested by default, modifiable by smtp transport option
+      hosts_request_ocsp.
+
+JH/22 Expansion operators ${md5:string} and ${sha1::string} can now
+      operate on certificate variables to give certificate fingerprints
+      Also new ${sha256:cert_variable}.
+
+JH/23 The PRDR feature is moved from being Experimental into the mainline.
+
+TL/11 Bug 1119: fix memory allocation in string_printing2().  Patch from
+      Christian Aistleitner.
+
+JH/24 The OCSP stapling feature is moved from Experimental into the mainline.
+
+
 Exim version 4.82
 -----------------
 
index d308f04..f3e2dc1 100644 (file)
@@ -6,6 +6,57 @@ Before a formal release, there may be quite a lot of detail so that people can
 test from the snapshots or the CVS before the documentation is updated. Once
 the documentation is updated, this file is reduced to a short list.
 
+Version 4.83
+------------
+
+ 1. If built with the EXPERIMENTAL_PROXY feature enabled, Exim can be
+    configured to expect an initial header from a proxy that will make the
+    actual external source IP:host be used in exim instead of the IP of the
+    proxy that is connecting to it.
+
+ 2. New verify option header_names_ascii, which will check to make sure
+    there are no non-ASCII characters in header names.  Exim itself handles
+    those non-ASCII characters, but downstream apps may not, so Exim can
+    detect and reject if those characters are present.
+
+ 3. New expansion operator ${utf8clean:string} to replace malformed UTF8
+    codepoints with valid ones.
+
+ 4. New malware type "sock".  Talks over a Unix or TCP socket, sending one
+    command line and matching a regex against the return data for trigger
+    and a second regex to extract malware_name.  The mail spoofile name can
+    be included in the command line.
+
+ 5. The smtp transport now supports options "tls_verify_hosts" and
+    "tls_try_verify_hosts".  If either is set the certificate verification
+    is split from the encryption operation. The default remains that a failed
+    verification cancels the encryption.
+
+ 6. New SERVERS override of default ldap server list.  In the ACLs, an ldap
+    lookup can now set a list of servers to use that is different from the
+    default list.
+
+ 7. New command-line option -C for exiqgrep to specify alternate exim.conf
+    file when searching the queue.
+
+ 8. OCSP now supports GnuTLS also, if you have version 3.1.3 or later of that.
+
+ 9. Support for DNSSEC on outbound connections.
+
+10. New variables "tls_(in,out)_(our,peer)cert" and expansion item
+    "certextract" to extract fields from them. Hash operators md5 and sha1
+    work over them for generating fingerprints, and a new sha256 operator
+    for them added.
+
+11. PRDR is now supported dy default.
+
+12. OCSP stapling is now supported by default.
+
+13. If built with the EXPERIMENTAL_DSN feature enabled, Exim will output
+    Delivery Status Notification messages in MIME format, and negociate
+    DSN features per RFC 3461.
+
+
 Version 4.82
 ------------
 
index 9c909f2..ef61956 100644 (file)
@@ -180,12 +180,12 @@ dns_again_means_nonexist             domain list     unset         main
 dns_check_names_pattern              string          +             main              2.11
 dns_csa_search_limit                 integer         5             main              4.60
 dns_csa_use_reverse                  boolean         true          main              4.60
+dns_dnssec_ok                        integer         -1            main              4.82
 dns_ipv4_lookup                      boolean         false         main              3.20
 dns_qualify_single                   boolean         true          smtp
 dns_retrans                          time            0s            main              1.60
 dns_retry                            integer         0             main              1.60
 dns_search_parents                   boolean         false         smtp
-dns_use_dnssec                       integer         -1            main              4.82
 dns_use_edns0                        integer         -1            main              4.76
 domains                              domain list     unset         routers           4.00
 driver                               string          unset         authenticators
@@ -714,6 +714,7 @@ provide compatibility with Sendmail.
 -oMai          # Supply authenticated id
 -oMas          # Supply authenticated sender
 -oMi           # Supply interface address
+-oMm           # Supply message reference
 -oMr           # Supply protocol name
 -oMs           # Supply host name
 -oMt           # Supply ident string
index b33612f..6657f63 100644 (file)
@@ -6,114 +6,6 @@ about experimental  features, all  of which  are unstable and
 liable to incompatible change.
 
 
-PRDR support
---------------------------------------------------------------
-
-Per-Recipient Data Reponse is an SMTP extension proposed by Eric Hall
-in a (now-expired) IETF draft from 2007.  It's not hit mainstream
-use, but has apparently been implemented in the META1 MTA.
-
-There is mention at http://mail.aegee.org/intern/sendmail.html
-of a patch to sendmail "to make it PRDR capable".
-
- ref: http://www.eric-a-hall.com/specs/draft-hall-prdr-00.txt
-
-If Exim is built with EXPERIMENTAL_PRDR there is a new config
-boolean "prdr_enable" which controls whether PRDR is advertised
-as part of an EHLO response, a new "acl_data_smtp_prdr" ACL
-(called for each recipient, after data arrives but before the
-data ACL), and a new smtp transport option "hosts_try_prdr".
-
-PRDR may be used to support per-user content filtering.  Without it
-one must defer any recipient after the first that has a different
-content-filter configuration.  With PRDR, the RCPT-time check
-for this can be disabled when the MAIL-time $smtp_command included
-"PRDR".  Any required difference in behaviour of the main DATA-time
-ACL should however depend on the PRDR-time ACL having run, as Exim
-will avoid doing so in some situations (eg.  single-recipient mails).
-
-
-
-OCSP Stapling support
---------------------------------------------------------------
-
-X.509 PKI certificates expire and can be revoked; to handle this, the
-clients need some way to determine if a particular certificate, from a
-particular Certificate Authority (CA), is still valid.  There are three
-main ways to do so.
-
-The simplest way is to serve up a Certificate Revocation List (CRL) with
-an ordinary web-server, regenerating the CRL before it expires.  The
-downside is that clients have to periodically re-download a potentially
-huge file from every certificate authority it knows of.
-
-The way with most moving parts at query time is Online Certificate
-Status Protocol (OCSP), where the client verifies the certificate
-against an OCSP server run by the CA.  This lets the CA track all
-usage of the certs.  This requires running software with access to the
-private key of the CA, to sign the responses to the OCSP queries.  OCSP
-is based on HTTP and can be proxied accordingly.
-
-The only widespread OCSP server implementation (known to this writer)
-comes as part of OpenSSL and aborts on an invalid request, such as
-connecting to the port and then disconnecting.  This requires
-re-entering the passphrase each time some random client does this.
-
-The third way is OCSP Stapling; in this, the server using a certificate
-issued by the CA periodically requests an OCSP proof of validity from
-the OCSP server, then serves it up inline as part of the TLS
-negotiation.   This approach adds no extra round trips, does not let the
-CA track users, scales well with number of certs issued by the CA and is
-resilient to temporary OCSP server failures, as long as the server
-starts retrying to fetch an OCSP proof some time before its current
-proof expires.  The downside is that it requires server support.
-
-If Exim is built with EXPERIMENTAL_OCSP and it was built with OpenSSL,
-then it gains a new global option: "tls_ocsp_file".
-
-The file specified therein is expected to be in DER format, and contain
-an OCSP proof.  Exim will serve it as part of the TLS handshake.  This
-option will be re-expanded for SNI, if the tls_certificate option
-contains $tls_sni, as per other TLS options.
-
-Exim does not at this time implement any support for fetching a new OCSP
-proof.  The burden is on the administrator to handle this, outside of
-Exim.  The file specified should be replaced atomically, so that the
-contents are always valid.  Exim will expand the "tls_ocsp_file" option
-on each connection, so a new file will be handled transparently on the
-next connection.
-
-Exim will check for a valid next update timestamp in the OCSP proof;
-if not present, or if the proof has expired, it will be ignored.
-
-Also, given EXPERIMENTAL_OCSP and OpenSSL, the smtp transport gains
-a "hosts_require_ocsp" option; a host-list for which an OCSP Stapling
-is requested and required for the connection to proceed.  The host(s)
-should also be in "hosts_require_tls", and "tls_verify_certificates"
-configured for the transport.
-
-For the client to be able to verify the stapled OCSP the server must
-also supply, in its stapled information, any intermediate
-certificates for the chain leading to the OCSP proof from the signer
-of the server certificate.  There may be zero or one such. These
-intermediate certificates should be added to the server OCSP stapling
-file (named by tls_ocsp_file).
-
-At this point in time, we're gathering feedback on use, to determine if
-it's worth adding complexity to the Exim daemon to periodically re-fetch
-OCSP files and somehow handling multiple files.
-
-  A helper script "ocsp_fetch.pl" for fetching a proof from a CA
-  OCSP server is supplied.  The server URL may be included in the
-  server certificate, if the CA is helpful.
-
-  One fail mode seen was the OCSP Signer cert expiring before the end
-  of vailidity of the OCSP proof. The checking done by Exim/OpenSSL
-  noted this as invalid overall, but the re-fetch script did not.
-
-
-
-
 Brightmail AntiSpam (BMI) suppport
 --------------------------------------------------------------
 
@@ -452,15 +344,21 @@ which the spf condition should succeed. Valid strings are:
               This means the queried domain has published
               a SPF record, but wants to allow outside
               servers to send mail under its domain as well.
-  o err_perm  This indicates a syntax error in the SPF
-              record of the queried domain. This should be
-              treated like "none".
-  o err_temp  This indicates a temporary error during all
+              This should be treated like "none".
+  o permerror This indicates a syntax error in the SPF
+              record of the queried domain. You may deny
+              messages when this occurs. (Changed in 4.83)
+  o temperror This indicates a temporary error during all
               processing, including Exim's SPF processing.
               You may defer messages when this occurs.
+              (Changed in 4.83)
+  o err_temp  Same as permerror, deprecated in 4.83, will be
+              removed in a future release.
+  o err_perm  Same as temperror, deprecated in 4.83, will be
+              removed in a future release.
 
 You can prefix each string with an exclamation mark to  invert
-is meaning,  for example  "!fail" will  match all  results but
+its meaning,  for example  "!fail" will  match all  results but
 "fail".  The  string  list is  evaluated  left-to-right,  in a
 short-circuit fashion.  When a  string matches  the outcome of
 the SPF check, the condition  succeeds. If none of the  listed
@@ -510,8 +408,8 @@ variables.
 
   $spf_result
   This contains the outcome of the SPF check in string form,
-  one of pass, fail, softfail, none, neutral, err_perm or
-  err_temp.
+  one of pass, fail, softfail, none, neutral, permerror or
+  temperror.
 
   $spf_smtp_comment
   This contains a string that can be used in a SMTP response
@@ -773,7 +671,7 @@ fails.
 
 Of course, you can also use any other lookup method that Exim
 supports, including LDAP, Postgres, MySQL, etc, as long as the
-result is a list of colon-separated strings;
+result is a list of colon-separated strings.
 
 Several expansion variables are set before the DATA ACL is
 processed, and you can use them in this ACL.  The following
@@ -781,7 +679,10 @@ expansion variables are available:
 
   o $dmarc_status
     This is a one word status indicating what the DMARC library
-    thinks of the email.
+    thinks of the email.  It is a combination of the results of
+    DMARC record lookup and the SPF/DKIM/DMARC processing results
+    (if a DMARC record was found).  The actual policy declared
+    in the DMARC record is in a separate expansion variable.
 
   o $dmarc_status_text
     This is a slightly longer, human readable status.
@@ -790,6 +691,11 @@ expansion variables are available:
     This is the domain which DMARC used to look up the DMARC
     policy record.
 
+  o $dmarc_domain_policy
+    This is the policy declared in the DMARC record.  Valid values
+    are "none", "reject" and "quarantine".  It is blank when there
+    is any error, including no DMARC record.
+
   o $dmarc_ar_header
     This is the entire Authentication-Results header which you can
     add using an add_header modifier.
@@ -825,6 +731,9 @@ b. Configure, somewhere before the DATA ACL, the control option to
   warn    !domains       = +screwed_up_dmarc_records
           control        = dmarc_enable_forensic
 
+  warn    condition      = (lookup if destined to mailing list)
+          set acl_m_mailing_list = 1
+
 (DATA ACL)
   warn    dmarc_status   = accept : none : off
           !authenticated = *
@@ -840,6 +749,10 @@ b. Configure, somewhere before the DATA ACL, the control option to
           set $acl_m_quarantine = 1
           # Do something in a transport with this flag variable
 
+  deny    condition      = ${if eq{$dmarc_domain_policy}{reject}}
+          condition      = ${if eq{$acl_m_mailing_list}{1}}
+          message        = Messages from $dmarc_used_domain break mailing lists
+
   deny    dmarc_status   = reject
           !authenticated = *
           message        = Message from $domain_used_domain failed sender's DMARC policy, REJECT
@@ -1015,6 +928,226 @@ Where SPAMMER_SET is a macro and it is defined as
 set acl_c_spam_host = ${lookup redis{GET...}}
 
 
+Proxy Protocol Support
+--------------------------------------------------------------
+
+Exim now has Experimental "Proxy Protocol" support.  It was built on
+specifications from:
+http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt
+Above URL revised May 2014 to change version 2 spec:
+http://git.1wt.eu/web?p=haproxy.git;a=commitdiff;h=afb768340c9d7e50d8e
+
+The purpose of this function is so that an application load balancer,
+such as HAProxy, can sit in front of several Exim servers and Exim
+will log the IP that is connecting to the proxy server instead of
+the IP of the proxy server when it connects to Exim.  It resets the
+$sender_address_host and $sender_address_port to the IP:port of the
+connection to the proxy.  It also re-queries the DNS information for
+this new IP address so that the original sender's hostname and IP
+get logged in the Exim logfile.  There is no logging if a host passes or
+fails Proxy Protocol negotiation, but it can easily be determined and
+recorded in an ACL (example is below).
+
+1. To compile Exim with Proxy Protocol support, put this in
+Local/Makefile:
+
+EXPERIMENTAL_PROXY=yes
+
+2. Global configuration settings:
+
+proxy_required_hosts = HOSTLIST
+
+The proxy_required_hosts option will require any IP in that hostlist
+to use Proxy Protocol. The specification of Proxy Protocol is very
+strict, and if proxy negotiation fails, Exim will not allow any SMTP
+command other than QUIT. (See end of this section for an example.)
+The option is expanded when used, so it can be a hostlist as well as
+string of IP addresses.  Since it is expanded, specifying an alternate
+separator is supported for ease of use with IPv6 addresses.
+
+To log the IP of the proxy in the incoming logline, add:
+  log_selector = +proxy
+
+A default incoming logline (wrapped for appearance) will look like this:
+
+  2013-11-04 09:25:06 1VdNti-0001OY-1V <= me@example.net
+  H=mail.example.net [1.2.3.4] P=esmtp S=433
+
+With the log selector enabled, an email that was proxied through a
+Proxy Protocol server at 192.168.1.2 will look like this:
+
+  2013-11-04 09:25:06 1VdNti-0001OY-1V <= me@example.net
+  H=mail.example.net [1.2.3.4] P=esmtp PRX=192.168.1.2 S=433
+
+3. In the ACL's the following expansion variables are available.
+
+proxy_host_address   The (internal) src IP of the proxy server
+                     making the connection to the Exim server.
+proxy_host_port      The (internal) src port the proxy server is
+                     using to connect to the Exim server.
+proxy_target_address The dest (public) IP of the remote host to
+                     the proxy server.
+proxy_target_port    The dest port the remote host is using to
+                     connect to the proxy server.
+proxy_session        Boolean, yes/no, the connected host is required
+                     to use Proxy Protocol.
+
+There is no expansion for a failed proxy session, however you can detect
+it by checking if $proxy_session is true but $proxy_host is empty.  As
+an example, in my connect ACL, I have:
+
+  warn    condition      = ${if and{ {bool{$proxy_session}} \
+                                     {eq{$proxy_host_address}{}} } }
+          log_message    = Failed required proxy protocol negotiation \
+                           from $sender_host_name [$sender_host_address]
+
+  warn    condition      = ${if and{ {bool{$proxy_session}} \
+                                     {!eq{$proxy_host_address}{}} } }
+          # But don't log health probes from the proxy itself
+          condition      = ${if eq{$proxy_host_address}{$sender_host_address} \
+                                {false}{true}}
+          log_message    = Successfully proxied from $sender_host_name \
+                           [$sender_host_address] through proxy protocol \
+                           host $proxy_host_address
+
+  # Possibly more clear
+  warn logwrite = Remote Source Address: $sender_host_address:$sender_host_port
+       logwrite = Proxy Target Address: $proxy_target_address:$proxy_target_port
+       logwrite = Proxy Internal Address: $proxy_host_address:$proxy_host_port
+       logwrite = Internal Server Address: $received_ip_address:$received_port
+
+
+4. Recommended ACL additions:
+   - Since the real connections are all coming from your proxy, and the
+     per host connection tracking is done before Proxy Protocol is
+     evaluated, smtp_accept_max_per_host must be set high enough to
+     handle all of the parallel volume you expect per inbound proxy.
+   - With the smtp_accept_max_per_host set so high, you lose the ability
+     to protect your server from massive numbers of inbound connections
+     from one IP.  In order to prevent your server from being DOS'd, you
+     need to add a per connection ratelimit to your connect ACL.  I
+     suggest something like this:
+
+  # Set max number of connections per host
+  LIMIT   = 5
+  # Or do some kind of IP lookup in a flat file or database
+  # LIMIT = ${lookup{$sender_host_address}iplsearch{/etc/exim/proxy_limits}}
+
+  defer   message        = Too many connections from this IP right now
+          ratelimit      = LIMIT / 5s / per_conn / strict
+
+
+5. Runtime issues to be aware of:
+   - The proxy has 3 seconds (hard-coded in the source code) to send the
+     required Proxy Protocol header after it connects.  If it does not,
+     the response to any commands will be:
+     "503 Command refused, required Proxy negotiation failed"
+   - If the incoming connection is configured in Exim to be a Proxy
+     Protocol host, but the proxy is not sending the header, the banner
+     does not get sent until the timeout occurs.  If the sending host
+     sent any input (before the banner), this causes a standard Exim
+     synchronization error (i.e. trying to pipeline before PIPELINING
+     was advertised).
+   - This is not advised, but is mentioned for completeness if you have
+     a specific internal configuration that you want this:  If the Exim
+     server only has an internal IP address and no other machines in your
+     organization will connect to it to try to send email, you may
+     simply set the hostlist to "*", however, this will prevent local
+     mail programs from working because that would require mail from
+     localhost to use Proxy Protocol.  Again, not advised!
+
+6. Example of a refused connection because the Proxy Protocol header was
+not sent from a host configured to use Proxy Protocol.  In the example,
+the 3 second timeout occurred (when a Proxy Protocol banner should have
+been sent), the banner was displayed to the user, but all commands are
+rejected except for QUIT:
+
+# nc mail.example.net 25
+220-mail.example.net, ESMTP Exim 4.82+proxy, Mon, 04 Nov 2013 10:45:59
+220 -0800 RFC's enforced
+EHLO localhost
+503 Command refused, required Proxy negotiation failed
+QUIT
+221 mail.example.net closing connection
+
+
+DSN Support
+--------------------------------------------------------------
+
+DSN Support tries to add RFC 3461 support to Exim. It adds support for
+*) the additional parameters for MAIL FROM and RCPT TO
+*) RFC complient MIME DSN messages for all of
+   success, failure and delay notifications
+*) dsn_advertise_hosts main option to select which hosts are able
+   to use the extension
+*) dsn_lasthop router switch to end DSN processing
+
+In case of failure reports this means that the last three parts, the message body
+intro, size info and final text, of the defined template are ignored since there is no
+logical place to put them in the MIME message.
+
+All the other changes are made without changing any defaults
+
+Building exim:
+--------------
+
+Define
+EXPERIMENTAL_DSN=YES
+in your Local/Makefile.
+
+Configuration:
+--------------
+All DSNs are sent in MIME format if you built exim with EXPERIMENTAL_DSN=YES
+No option needed to activate it, and no way to turn it off.
+
+Failure and delay DSNs are triggered as usual except a sender used NOTIFY=...
+to prevent them.
+
+Support for Success DSNs is added and activated by NOTIFY=SUCCESS by clients.
+
+Add
+dsn_advertise_hosts = *
+or a more restrictive host_list to announce DSN in EHLO answers
+
+Those hosts can then use NOTIFY,ENVID,RET,ORCPT options.
+
+If a message is relayed to a DSN aware host without changing the envelope
+recipient the options are passed along and no success DSN is generated.
+
+A redirect router will always trigger a success DSN if requested and the DSN
+options are not passed any further.
+
+A success DSN always contains the recipient address as submitted by the
+client as required by RFC. Rewritten addresses are never exposed.
+
+If you used DSN patch up to 1.3 before remove all "dsn_process" switches from
+your routers since you don't need them anymore. There is no way to "gag"
+success DSNs anymore. Announcing DSN means answering as requested.
+
+You can prevent Exim from passing DSN options along to other DSN aware hosts by defining
+dsn_lasthop
+in a router. Exim will then send the success DSN himself if requested as if
+the next hop does not support DSN.
+Adding it to a redirect router makes no difference.
+
+Certificate name checking
+--------------------------------------------------------------
+The X509 certificates used for TLS are supposed be verified
+that they are owned by the expected host.  The coding of TLS
+support to date has not made these checks.
+
+If built with EXPERIMENTAL_CERTNAMES defined, code is
+included to do so, and a new smtp transport option
+"tls_verify_cert_hostname" supported which takes a list of
+names for which the checks must be made.  The host must
+also be in "tls_verify_hosts".
+
+Both Subject and Subject-Alternate-Name certificate fields
+are supported, as are wildcard certificates (limited to
+a single wildcard being the initial component of a 3-or-more
+component FQDN).
+
+
 
 --------------------------------------------------------------
 End of file
index 81091fb..e3267fd 100755 (executable)
@@ -149,7 +149,8 @@ sub build_html_documentation {
     my @cmd = (
         $genpath,   '--spec',    $spec,                '--filter',
         $filter,    '--latest',  $context->{trelease}, '--tmpl',
-        $templates, '--docroot', $dir,                 '--localstatic'
+        $templates, '--docroot', $dir,                 '--localstatic',
+        (($verbose||$debug) ? '--verbose' : '')
     );
 
     print "Executing ", join( ' ', @cmd ), "\n";
diff --git a/release-process/scripts/quickrelease b/release-process/scripts/quickrelease
new file mode 100755 (executable)
index 0000000..dd16fa0
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# A really dumb script for making a quick tarball of Exim
+
+set -e
+
+OWD=$(pwd -P)
+
+GWD=$(git rev-parse --git-dir)
+
+TWD=$(mktemp -d -t exim) || exit 1
+echo $TWD
+cd $TWD
+
+git clone $GWD
+
+cd exim/src/src
+../scripts/reversion
+. version.sh
+EXIM=exim-${EXIM_RELEASE_VERSION}${EXIM_VARIANT_VERSION}
+
+cd ../..
+mv src $EXIM
+tar cfz $EXIM.tar.gz $EXIM
+mv $EXIM src
+
+cd $OWD
+mv $TWD/exim/$EXIM.tar.gz .
+rm -rf $EXIM
+echo $EXIM.tar.gz
index b4f04b2..99f4ab3 100644 (file)
@@ -2,7 +2,7 @@
 # appropriate links, and then creating and running the main makefile in that
 # directory.
 
-# Copyright (c) University of Cambridge, 1995 - 2007
+# Copyright (c) University of Cambridge, 1995 - 2014
 # See the file NOTICE for conditions of use and distribution.
 
 # IRIX make uses the shell that is in the SHELL variable, which often defaults
@@ -90,9 +90,11 @@ distclean:; $(RM_COMMAND) -rf build-* cscope*
 cscope.files: FRC
        echo "-q" > $@
        echo "-p3" >> $@
-       find src Local -name "*.[cshyl]" -print \
+       find src Local OS -name "*.[cshyl]" -print \
+                   -o -name "os.h*" -print \
                    -o -name "*akefile*" -print \
                    -o -name EDITME -print >> $@
+       ls OS/* >> $@
 
 FRC:
 
index 1500e85..0caf860 100644 (file)
@@ -106,8 +106,7 @@ allexim: config.h $(EXIM_MONITOR) exicyclog exinext exiwhat \
         transport-filter.pl convert4r3 convert4r4 \
         exim_checkaccess \
         exim_dbmbuild exim_dumpdb exim_fixdb exim_tidydb exim_lock \
-        buildlookups buildrouters buildtransports \
-        buildauths buildpdkim exim
+        exim
 
 
 # Targets for special-purpose configuration header builders
@@ -317,8 +316,8 @@ OBJ_EXIM = acl.o child.o crypt16.o daemon.o dbfn.o debug.o deliver.o \
         local_scan.o $(EXIM_PERL) $(OBJ_WITH_CONTENT_SCAN) \
         $(OBJ_WITH_OLD_DEMIME) $(OBJ_EXPERIMENTAL)
 
-exim:   lookups/lookups.a auths/auths.a pdkim/pdkim.a \
-        routers/routers.a transports/transports.a \
+exim:   buildlookups buildauths pdkim/pdkim.a \
+        buildrouters buildtransports \
         $(OBJ_EXIM) version.o
        @echo "$(LNCC) -o exim"
        $(FE)$(PURIFY) $(LNCC) -o exim $(LFLAGS) $(OBJ_EXIM) version.o \
@@ -355,7 +354,7 @@ exim_dumpdb: $(OBJ_DUMPDB)
 
 OBJ_FIXDB = exim_fixdb.o util-os.o util-store.o
 
-exim_fixdb:  $(OBJ_FIXDB) auths/auths.a
+exim_fixdb:  $(OBJ_FIXDB) buildauths
        @echo "$(LNCC) -o exim_fixdb"
        $(FE)$(LNCC) $(CFLAGS) $(INCLUDE) -o exim_fixdb $(LFLAGS) $(OBJ_FIXDB) \
          auths/auths.a $(LIBS) $(EXTRALIBS) $(DBMLIB)
@@ -578,7 +577,7 @@ spool_out.o:     $(HDRS) spool_out.c
 std-crypto.o:    $(HDRS) std-crypto.c
 store.o:         $(HDRS) store.c
 string.o:        $(HDRS) string.c
-tls.o:           $(HDRS) tls.c tls-gnu.c tls-openssl.c
+tls.o:           $(HDRS) tls.c tls-gnu.c tlscert-gnu.c tls-openssl.c tlscert-openssl.c
 tod.o:           $(HDRS) tod.c
 transport.o:     $(HDRS) transport.c
 tree.o:          $(HDRS) tree.c
@@ -621,7 +620,7 @@ drtables.o:      $(HDRS) drtables.c
 # When using parallel make, we don't have the dependency to force building
 # in the sub-directory unless we force that dependency:
 
-$(OBJ_LOOKUPS):  lookups/lookups.a
+$(OBJ_LOOKUPS):  buildlookups
 
 # The exim monitor's private modules - the sources live in a private
 # subdirectory. The final binary combines the private modules with some
@@ -649,7 +648,7 @@ $(MONBIN): $(HDRS)
 
 # The lookups library.
 
-buildlookups lookups/lookups.a: config.h version.h
+buildlookups:
         @cd lookups && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \
           CFLAGS_DYNAMIC="$(CFLAGS_DYNAMIC)" HDRS="../version.h $(PHDRS)" \
           FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" \
@@ -658,7 +657,7 @@ buildlookups lookups/lookups.a: config.h version.h
 
 # The routers library.
 
-buildrouters routers/routers.a: config.h
+buildrouters:
         @cd routers && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \
           FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \
           INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)"
@@ -666,7 +665,7 @@ buildrouters routers/routers.a: config.h
 
 # The transports library.
 
-buildtransports transports/transports.a: config.h
+buildtransports:
         @cd transports && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \
           FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \
           INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)"
@@ -674,7 +673,7 @@ buildtransports transports/transports.a: config.h
 
 # The library of authorization modules
 
-buildauths auths/auths.a: config.h
+buildauths:
         @cd auths && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \
           FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \
           INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)"
@@ -682,7 +681,8 @@ buildauths auths/auths.a: config.h
 
 # The PDKIM library
 
-buildpdkim pdkim/pdkim.a: config.h
+buildpdkim: pdkim/pdkim.a
+pdkim/pdkim.a: config.h
         @cd pdkim && $(MAKE) SHELL=$(SHELL) AR="$(AR)" $(MFLAGS) CC="$(CC)" CFLAGS="$(CFLAGS)" \
           FE="$(FE)" RANLIB="$(RANLIB)" RM_COMMAND="$(RM_COMMAND)" HDRS="$(PHDRS)" \
           INCLUDE="$(INCLUDE) $(IPV6_INCLUDE) $(TLS_INCLUDE)"
index 1e8a6f4..df0dff9 100644 (file)
@@ -94,7 +94,7 @@ ip_address_item *last = NULL;
 ip_address_item  *next;
 char addr6p[8][5];
 unsigned int plen, scope, dad_status, if_idx;
-char devname[20];
+char devname[20+1];
 FILE *f;
 #endif
 
diff --git a/src/README.DSN b/src/README.DSN
new file mode 100644 (file)
index 0000000..68d1641
--- /dev/null
@@ -0,0 +1,141 @@
+Exim DSN Patch (4.82)
+---------------------
+
+This patch is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This patch is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this patch; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+Installation & Usage
+--------------------
+See docs/experimental-spec.txt
+
+Credits
+-------
+
+The original work for the patch was done by Philip Hazel in Exim 3
+
+The extract was taken and re-applied to Exim 4 by the following :-
+Phil Bingham   (phil.bingham@cwipapps.net)
+Steve Falla    (steve.falla@cwipapps.net)
+Ray Edah       (ray.edah@cwipapps.net)
+Andrew Johnson (andrew.johnson@cwippaps.net)
+Adrian Hungate (adrian.hungate@cwipapps.net)
+
+Now Primarily maintained by :-
+Andrew Johnson (andrew.johnson@cwippaps.net)
+
+Updated for 4.82, improved and submitted to
+http://bugs.exim.org/show_bug.cgi?id=118
+by :-
+Wolfgang Breyha (wbreyha@gmx.net)
+
+Contributions
+-------------
+Andrey J. Melnikoff (TEMHOTA) (temnota@kmv.ru) 
+
+
+ChangeLog
+---------
+14-Apr-2006 : Changed subject to "Delivery Status Notification"
+
+17-May-2006 : debug_printf in spool-in.c were not wrapped with #ifndef COMPILE_UTILITY
+              thanks to Andrey J. Melnikoff for this information
+
+12-Sep-2006 : Now supports Exim 4.63
+
+12-Sep-2006 : src/EDITME did not include the #define SUPPORT_DSN as stated
+              in the documentation, this has now been corrected
+              thanks to Robert Kehl for this information
+
+28-Jul-2008 : New version for exim 4.69 released.
+
+02-Jul-2010 : New version for exim 4.72 released.
+
+25-Apr-2014 : Version 1.4
+              *) fix ENVID and ORCPT addition in SMTP transport
+                *) p was not moved to the end of the string. new content
+                   added afterwards overwrites ENVID and/or ORCPT
+              *) change spool file format to be compatible with the
+                 extensible format of exim 4 by prepending new values and
+                 setting the extended bitmask accordingly
+                *) use SUPPORT_DSN_LEGACY=yes in Makefile to be able to read
+                   the legacy format of older patches until all messages are out of queue.
+              *) change "dsn" boolean toggle to "dsn_advertise_hosts" to
+                 be able to select who actually can use the extension
+              *) Add all RFC 3461 MUST fields to delivery-status section
+              *) convert xtext in ENVID
+              *) add all successful rcpts to ONE message instead of sending several messages
+
+26-Apr-2014 : Version 1.5
+              fixes:
+                *) fixed wrong order for ENVID
+                *) fixed wrong Final-Recipient value
+                *) af_ignore_failure is ignored for success reports
+                *) fixed DSN_LEGACY switch
+              improvements:
+                *) added MIME "failure" reports
+                  *) bounce_return_message is ignored (required by RFC)
+                  *) in case RET= is defined we honor these values
+                     otherwise bounce_return_body is honored.
+                  *) bounce_return_size_limit is always honored.
+                  *) message body intro and final text is ignored
+                  *) do not send report if DSN flags say NO
+                *) added MIME "delay" reports
+                  *) do not send report if DSN flags say NO
+                *) changed from SUPPORT_DSN to EXPERIMENTAL_DSN
+                *) updated documentation
+
+01-May-2014 : Version 1.6
+              fixes:
+                *) code cleanup
+                *) use text/rfc822-headers were applicable
+                *) fix NOTIFY=FAILURE
+
+              improvements:
+                *) do not truncated MIME messages
+                  *) if bounce_return_size_limit is smaller then the actual message
+                     only the header is returned
+                *) if bounce_return_body or bounce_return_size_limit prevents Exim
+                   from returning the requested (RET=FULL) body this fact is added
+                   as X-Exim-DSN-Information Header
+                  *) this also means that all of the last three parts of the "failure"
+                     template are not used anymore
+
+                *) dsn_process switch removed
+                  *) every router "processes" DSN by default
+                  *) there is no possibilty to "gag" DSN anymore since this violates RFC
+                *) dsn_lasthop switch added for routers
+                  *) if dsn_lasthop is set by a router it is handled as relaying to a
+                     non DSN aware relay. success mails are sent if Exim successfully 
+                     delivers the message.
+                *) redirect routers always "act" as if dsn_lasthop is set
+
+                *) address_item.dsn_aware changed from uschar to int for easier handling.
+
+02-May-2014 : fixes:
+                *) Reporting-MTA: use smtp_active_hostname instead of qualify_domain from
+                   original patch.
+
+20-May-2014 : fixes:
+                *) removed support for EXPERIMENTAL_DSN_LEGACY for codebase inclusion
+                *) fixed build of exim_monitor tree
+                *) fixed late declaration of dsn_all_lasthop
+
+-----------------
+
+Support for this patch up to 1.3 (limited though it is) will only be provided through the SourceForge
+project page (http://sourceforge.net/projects/eximdsn/)
+
+From 1.4 onward feel free to ask on the exim-users mailinglist or add comments to
+http://bugs.exim.org/show_bug.cgi?id=118
+
index b0a912e..d5205d0 100644 (file)
@@ -145,6 +145,11 @@ BOOL    dkim_disable_verify      = FALSE;
 
 BOOL    dont_deliver           = FALSE;
 
+#ifdef EXPERIMENTAL_DSN
+int     dsn_ret                = 0;
+uschar *dsn_envid              = NULL;
+#endif
+
 #ifdef WITH_CONTENT_SCAN
 int     fake_response          = OK;
 #endif
index 0441edd..6efd9c0 100644 (file)
@@ -2,7 +2,7 @@
 *                 Exim Monitor                   *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2012 */
+/* Copyright (c) University of Cambridge 1995 - 2014 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* This module contains code for scanning the main log,
index 5e8a726..eeb26ee 100755 (executable)
@@ -142,6 +142,10 @@ then
         fi
         if [ ".$need_this" != "." ]; then
           tls_include=`pkg-config --cflags $pc_value`
+          if [ $? -ne 0 ]; then
+            echo >&2 "*** Missing pkg-config for package $pc_value (for Exim $var build option)"
+            exit 1
+          fi
           tls_libs=`pkg-config --libs $pc_value`
           echo "TLS_INCLUDE=$tls_include"
           echo "TLS_LIBS=$tls_libs"
@@ -161,6 +165,10 @@ then
         else
           # main binary
           cflags=`pkg-config --cflags $pc_value`
+          if [ $? -ne 0 ]; then
+            echo >&2 "*** Missing pkg-config for package $pc_value (for Exim $var build option)"
+            exit 1
+          fi
           libs=`pkg-config --libs $pc_value`
           if [ "$var" != "${var#LOOKUP_}" ]; then
             echo "LOOKUP_INCLUDE += $cflags"
@@ -178,6 +186,10 @@ then
         case $PCRE_CONFIG in
           yes|YES|y|Y)
             cflags=`pcre-config --cflags`
+            if [ $? -ne 0 ]; then
+              echo >&2 "*** Missing pcre-config for regular expression support"
+              exit 1
+            fi
             libs=`pcre-config --libs`
             if [ ".$cflags" != "." ]; then
               echo "INCLUDE += $cflags"
@@ -196,6 +208,10 @@ then
   echo "# End of pkg-config fixups"
   echo
   ) >> $mft
+  subexit=$?
+  if [ $subexit -ne 0 ]; then
+    exit $subexit
+  fi
 fi
 rm -f $mftt
 
index 2eb8a96..01cd21f 100755 (executable)
@@ -233,6 +233,8 @@ ln -s ../src/std-crypto.c      std-crypto.c
 ln -s ../src/store.c           store.c
 ln -s ../src/string.c          string.c
 ln -s ../src/tls.c             tls.c
+ln -s ../src/tlscert-gnu.c     tlscert-gnu.c
+ln -s ../src/tlscert-openssl.c tlscert-openssl.c
 ln -s ../src/tls-gnu.c         tls-gnu.c
 ln -s ../src/tls-openssl.c     tls-openssl.c
 ln -s ../src/tod.c             tod.c
index 51fbd94..61493c6 100755 (executable)
@@ -24,6 +24,22 @@ then
   _XPG=1
   export _XPG
 
+  # We need the _right_ tr, so must do that first; but if a shell which
+  # we're more confident is sane is available, let's try that.  Mostly,
+  # the problem is that "local" is not actually in "the" standard, it's
+  # just in every not-insane shell.  Though arguably, there are no shells
+  # with POSIX-ish syntax which qualify as "not insane".
+  for b in /bin/dash /bin/bash /usr/local/bin/bash
+  do
+    if [ -x "$b" ]
+    then
+      SHELL="$b"
+      break
+    fi
+  done
+  # if we get a report of a system with zsh but not bash, we can add that
+  # to the list, but be sure to enable sh_word_split in that case.
+
   exec "$SHELL" "$0" "$@"
 fi
 
@@ -41,6 +57,16 @@ tab='        '
 LC_ALL=C
 export LC_ALL
 
+if [ -f "$defs_source" ]
+then
+  :
+  # we are happy
+else
+  echo >&2 "$0: ERROR: MISSING FILE '${defs_source}'"
+  echo >&2 "$0: SHOULD HAVE BEEN CALLED FROM scripts/Configure-Makefile"
+  exit 1
+fi
+
 # nb: do not permit leading whitespace for this, as CFLAGS_DYNAMIC is exported
 # to the lookups subdir via a line with leading whitespace which otherwise
 # matches
@@ -95,7 +121,10 @@ emit_module_rule() {
   local mod_name pkgconf
   if [ "${lookup_name%:*}" = "$lookup_name" ]
   then
-    mod_name=$(echo $lookup_name | tr A-Z a-z)
+    # Square brackets are redundant but benign for POSIX compliant tr,
+    # however Solaris /usr/bin/tr requires them. Sometimes Solaris
+    # gets installed without a complete set of xpg4 tools, sigh.
+    mod_name=$(echo $lookup_name | tr [A-Z] [a-z])
   else
     mod_name="${lookup_name#*:}"
     lookup_name="${lookup_name%:*}"
index 3f818f3..d576fd7 100644 (file)
@@ -410,6 +410,17 @@ EXIM_MONITOR=eximon.bin
 
 # DISABLE_DKIM=yes
 
+#------------------------------------------------------------------------------
+# Uncomment the following line to remove Per-Recipient-Data-Response support.
+
+# DISABLE_PRDR=yes
+
+#------------------------------------------------------------------------------
+# Uncomment the following line to remove OCSP stapling support in TLS,
+# from Exim.  Note it can only be supported when built with
+# GnuTLS 3.1.3 or later, or OpenSSL
+
+# DISABLE_OCSP=yes
 
 #------------------------------------------------------------------------------
 # By default, Exim has support for checking the AD bit in a DNS response, to
@@ -455,19 +466,12 @@ EXIM_MONITOR=eximon.bin
 # CFLAGS  += -I/opt/brightmail/bsdk-6.0/include
 # LDFLAGS += -lxml2_single -lbmiclient_single -L/opt/brightmail/bsdk-6.0/lib
 
-# Uncomment the following line to add OCSP stapling support in TLS, if Exim
-# was built using OpenSSL.
-
-# EXPERIMENTAL_OCSP=yes
-
 # Uncomment the following line to add DMARC checking capability, implemented
 # using libopendmarc libraries.
 # EXPERIMENTAL_DMARC=yes
 # CFLAGS += -I/usr/local/include
 # LDFLAGS += -lopendmarc
 
-# Uncomment the following line to add Per-Recipient-Data-Response support.
-# EXPERIMENTAL_PRDR=yes
 
 # Uncomment the following line to support Transport post-delivery actions,
 # eg. for logging to a database.
@@ -480,6 +484,15 @@ EXIM_MONITOR=eximon.bin
 # CFLAGS += -I/usr/local/include
 # LDFLAGS += -lhiredis
 
+# Uncomment the following line to enable Experimental Proxy Protocol
+# EXPERIMENTAL_PROXY=yes
+
+# Uncomment the following line to enable support for checking certiticate
+# ownership
+# EXPERIMENTAL_CERTNAMES=yes
+
+# Uncomment the following line to add DSN support
+# EXPERIMENTAL_DSN=yes
 
 ###############################################################################
 #                 THESE ARE THINGS YOU MIGHT WANT TO SPECIFY                  #
index 520375a..6e635fb 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2012 */
+/* Copyright (c) University of Cambridge 1995 - 2014 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* Code for handling Access Control Lists (ACLs) */
@@ -397,7 +397,7 @@ static unsigned int cond_forbids[] = {
   (unsigned int)
   ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|       /* add_header */
     (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
   #endif
     (1<<ACL_WHERE_MIME)|(1<<ACL_WHERE_NOTSMTP)|
@@ -412,7 +412,7 @@ static unsigned int cond_forbids[] = {
   (1<<ACL_WHERE_AUTH)|                             /* bmi_optin */
     (1<<ACL_WHERE_CONNECT)|(1<<ACL_WHERE_HELO)|
     (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_MIME)|
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
   #endif
     (1<<ACL_WHERE_ETRN)|(1<<ACL_WHERE_EXPN)|
@@ -434,9 +434,9 @@ static unsigned int cond_forbids[] = {
   #ifdef EXPERIMENTAL_DCC
   (unsigned int)
   ~((1<<ACL_WHERE_DATA)|                           /* dcc */
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
-  #endif /* EXPERIMENTAL_PRDR */
+  #endif
     (1<<ACL_WHERE_NOTSMTP)),
   #endif
 
@@ -450,9 +450,9 @@ static unsigned int cond_forbids[] = {
   #ifdef WITH_OLD_DEMIME
   (unsigned int)
   ~((1<<ACL_WHERE_DATA)|                           /* demime */
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
-  #endif /* EXPERIMENTAL_PRDR */
+  #endif
     (1<<ACL_WHERE_NOTSMTP)),
   #endif
 
@@ -474,7 +474,7 @@ static unsigned int cond_forbids[] = {
 
   (unsigned int)
   ~((1<<ACL_WHERE_RCPT)                            /* domains */
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     |(1<<ACL_WHERE_PRDR)
   #endif
     ),
@@ -491,7 +491,7 @@ static unsigned int cond_forbids[] = {
 
   (unsigned int)
   ~((1<<ACL_WHERE_RCPT)                             /* local_parts */
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     |(1<<ACL_WHERE_PRDR)
   #endif
     ),
@@ -505,9 +505,9 @@ static unsigned int cond_forbids[] = {
   #ifdef WITH_CONTENT_SCAN
   (unsigned int)
   ~((1<<ACL_WHERE_DATA)|                           /* malware */
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
-  #endif /* EXPERIMENTAL_PRDR */
+  #endif
     (1<<ACL_WHERE_NOTSMTP)),
   #endif
 
@@ -526,9 +526,9 @@ static unsigned int cond_forbids[] = {
   #ifdef WITH_CONTENT_SCAN
   (unsigned int)
   ~((1<<ACL_WHERE_DATA)|                           /* regex */
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
-  #endif /* EXPERIMENTAL_PRDR */
+  #endif
     (1<<ACL_WHERE_NOTSMTP)|
     (1<<ACL_WHERE_MIME)),
   #endif
@@ -536,7 +536,7 @@ static unsigned int cond_forbids[] = {
   (unsigned int)
   ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|       /* remove_header */
     (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
   #endif
     (1<<ACL_WHERE_MIME)|(1<<ACL_WHERE_NOTSMTP)|
@@ -559,9 +559,9 @@ static unsigned int cond_forbids[] = {
   #ifdef WITH_CONTENT_SCAN
   (unsigned int)
   ~((1<<ACL_WHERE_DATA)|                           /* spam */
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
-  #endif /* EXPERIMENTAL_PRDR */
+  #endif
     (1<<ACL_WHERE_NOTSMTP)),
   #endif
 
@@ -608,9 +608,9 @@ static unsigned int control_forbids[] = {
 
   #ifndef DISABLE_DKIM
   (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP)|      /* dkim_disable_verify */
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
-  #endif /* EXPERIMENTAL_PRDR */
+  #endif
     (1<<ACL_WHERE_NOTSMTP_START),
   #endif
 
@@ -674,17 +674,17 @@ static unsigned int control_forbids[] = {
   (unsigned int)
   ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|       /* fakedefer */
     (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
-  #endif /* EXPERIMENTAL_PRDR */
+  #endif
     (1<<ACL_WHERE_MIME)),
 
   (unsigned int)
   ~((1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)|       /* fakereject */
     (1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
     (1<<ACL_WHERE_PRDR)|
-  #endif /* EXPERIMENTAL_PRDR */
+  #endif
     (1<<ACL_WHERE_MIME)),
 
   (1<<ACL_WHERE_NOTSMTP)|                          /* no_multiline */
@@ -1614,6 +1614,7 @@ else
 DNS_LOOKUP_AGAIN:
 #endif
 
+lookup_dnssec_authenticated = NULL;
 switch (dns_lookup(&dnsa, target, type, NULL))
   {
   /* If something bad happened (most commonly DNS_AGAIN), defer. */
@@ -1650,7 +1651,8 @@ switch (dns_lookup(&dnsa, target, type, NULL))
 *************************************************/
 
 enum { VERIFY_REV_HOST_LKUP, VERIFY_CERT, VERIFY_HELO, VERIFY_CSA, VERIFY_HDR_SYNTAX,
-  VERIFY_NOT_BLIND, VERIFY_HDR_SNDR, VERIFY_SNDR, VERIFY_RCPT
+       VERIFY_NOT_BLIND, VERIFY_HDR_SNDR, VERIFY_SNDR, VERIFY_RCPT,
+       VERIFY_HDR_NAMES_ASCII
   };
 typedef struct {
   uschar * name;
@@ -1670,7 +1672,8 @@ static verify_type_t verify_type_list[] = {
     { US"sender",              VERIFY_SNDR,            (1<<ACL_WHERE_MAIL)|(1<<ACL_WHERE_RCPT)
                        |(1<<ACL_WHERE_PREDATA)|(1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP),
                                                                                FALSE, 6 },
-    { US"recipient",           VERIFY_RCPT,            (1<<ACL_WHERE_RCPT),    FALSE, 0 }
+    { US"recipient",           VERIFY_RCPT,            (1<<ACL_WHERE_RCPT),    FALSE, 0 },
+    { US"header_names_ascii",  VERIFY_HDR_NAMES_ASCII, (1<<ACL_WHERE_DATA)|(1<<ACL_WHERE_NOTSMTP), TRUE, 0 }
   };
 
 
@@ -1820,6 +1823,15 @@ switch(vp->value)
       *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
     return rc;
 
+  case VERIFY_HDR_NAMES_ASCII:
+    /* Check that all header names are true 7 bit strings
+    See RFC 5322, 2.2. and RFC 6532, 3. */
+
+    rc = verify_check_header_names_ascii(log_msgptr);
+    if (rc != OK && smtp_return_error_details && *log_msgptr != NULL)
+      *user_msgptr = string_sprintf("Rejected after DATA: %s", *log_msgptr);
+    return rc;
+
   case VERIFY_NOT_BLIND:
     /* Check that no recipient of this message is "blind", that is, every envelope
     recipient must be mentioned in either To: or Cc:. */
@@ -2202,8 +2214,8 @@ return rc;
 
 BAD_VERIFY:
 *log_msgptr = string_sprintf("expected \"sender[=address]\", \"recipient\", "
-  "\"helo\", \"header_syntax\", \"header_sender\" or "
-  "\"reverse_host_lookup\" at start of ACL condition "
+  "\"helo\", \"header_syntax\", \"header_sender\", \"header_names_ascii\" "
+  "or \"reverse_host_lookup\" at start of ACL condition "
   "\"verify %s\"", arg);
 return ERROR;
 }
@@ -2846,9 +2858,9 @@ uschar *portstr;
 uschar *portend;
 host_item *h;
 int portnum;
-int host_af;
 int len;
 int r, s;
+uschar * errstr;
 
 hostname = string_nextinlist(&arg, &sep, NULL, 0);
 portstr = string_nextinlist(&arg, &sep, NULL, 0);
@@ -2895,14 +2907,18 @@ if (r == HOST_FIND_FAILED || r == HOST_FIND_AGAIN)
 HDEBUG(D_acl)
   debug_printf("udpsend [%s]:%d %s\n", h->address, portnum, arg);
 
-host_af = (Ustrchr(h->address, ':') == NULL)? AF_INET:AF_INET6;
-r = s = ip_socket(SOCK_DGRAM, host_af);
-if (r < 0) goto defer;
-r = ip_connect(s, host_af, h->address, portnum, 1);
+r = s = ip_connectedsocket(SOCK_DGRAM, h->address, portnum, portnum,
+               1, NULL, &errstr);
 if (r < 0) goto defer;
 len = Ustrlen(arg);
 r = send(s, arg, len, 0);
-if (r < 0) goto defer;
+if (r < 0)
+  {
+  errstr = US strerror(errno);
+  close(s);
+  goto defer;
+  }
+close(s);
 if (r < len)
   {
   *log_msgptr =
@@ -2916,7 +2932,7 @@ HDEBUG(D_acl)
 return OK;
 
 defer:
-*log_msgptr = string_sprintf("\"udpsend\" failed: %s", strerror(errno));
+*log_msgptr = string_sprintf("\"udpsend\" failed: %s", errstr);
 return DEFER;
 }
 
@@ -2976,12 +2992,14 @@ for (; cb != NULL; cb = cb->next)
 
   if (cb->type == ACLC_MESSAGE)
     {
+    HDEBUG(D_acl) debug_printf("  message: %s\n", cb->arg);
     user_message = cb->arg;
     continue;
     }
 
   if (cb->type == ACLC_LOG_MESSAGE)
     {
+    HDEBUG(D_acl) debug_printf("l_message: %s\n", cb->arg);
     log_message = cb->arg;
     continue;
     }
@@ -3088,7 +3106,9 @@ for (; cb != NULL; cb = cb->next)
     /* The true/false parsing here should be kept in sync with that used in
     expand.c when dealing with ECOND_BOOL so that we don't have too many
     different definitions of what can be a boolean. */
-    if (Ustrspn(arg, "0123456789") == Ustrlen(arg))     /* Digits, or empty */
+    if (*arg == '-'
+       ? Ustrspn(arg+1, "0123456789") == Ustrlen(arg+1)    /* Negative number */
+       : Ustrspn(arg,   "0123456789") == Ustrlen(arg))     /* Digits, or empty */
       rc = (Uatoi(arg) == 0)? FAIL : OK;
     else
       rc = (strcmpic(arg, US"no") == 0 ||
@@ -3228,8 +3248,9 @@ for (; cb != NULL; cb = cb->next)
       disable_callout_flush = TRUE;
       break;
 
-      case CONTROL_FAKEDEFER:
       case CONTROL_FAKEREJECT:
+      cancel_cutthrough_connection("fakereject");
+      case CONTROL_FAKEDEFER:
       fake_response = (control_type == CONTROL_FAKEDEFER) ? DEFER : FAIL;
       if (*p == '/')
         {
@@ -3259,10 +3280,12 @@ for (; cb != NULL; cb = cb->next)
         *log_msgptr = string_sprintf("syntax error in \"control=%s\"", arg);
         return ERROR;
         }
+      cancel_cutthrough_connection("item frozen");
       break;
 
       case CONTROL_QUEUE_ONLY:
       queue_only_policy = TRUE;
+      cancel_cutthrough_connection("queueing forced");
       break;
 
       case CONTROL_SUBMISSION:
@@ -3329,17 +3352,19 @@ for (; cb != NULL; cb = cb->next)
 
       case CONTROL_CUTTHROUGH_DELIVERY:
       if (deliver_freeze)
-        {
-        *log_msgptr = string_sprintf("\"control=%s\" on frozen item", arg);
-        return ERROR;
-        }
-       if (queue_only_policy)
-        {
-        *log_msgptr = string_sprintf("\"control=%s\" on queue-only item", arg);
-        return ERROR;
-        }
-      cutthrough_delivery = TRUE;
-      break;
+        *log_msgptr = US"frozen";
+      else if (queue_only_policy)
+        *log_msgptr = US"queue-only";
+      else if (fake_response == FAIL)
+        *log_msgptr = US"fakereject";
+      else
+       {
+       cutthrough_delivery = TRUE;
+       break;
+       }
+      *log_msgptr = string_sprintf("\"control=%s\" on %s item",
+                                   arg, *log_msgptr);
+      return ERROR;
       }
     break;
 
@@ -4294,7 +4319,7 @@ sender_verified_failed = NULL;
 ratelimiters_cmd = NULL;
 log_reject_target = LOG_MAIN|LOG_REJECT;
 
-#ifdef EXPERIMENTAL_PRDR
+#ifndef DISABLE_PRDR
 if (where == ACL_WHERE_RCPT || where == ACL_WHERE_PRDR )
 #else
 if (where == ACL_WHERE_RCPT )
@@ -4338,7 +4363,7 @@ If conn-failure, no action (and keep the spooled copy).
 switch (where)
 {
 case ACL_WHERE_RCPT:
-#ifdef EXPERIMENTAL_PRDR
+#ifndef DISABLE_PRDR
 case ACL_WHERE_PRDR:
 #endif
   if( rcpt_count > 1 )
@@ -4458,4 +4483,6 @@ FILE *f = (FILE *)ctx;
 fprintf(f, "-acl%c %s %d\n%s\n", name[0], name+1, Ustrlen(value), value);
 }
 
+/* vi: aw ai sw=2
+*/
 /* End of acl.c */
index 94b3152..1874f32 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004 Andrey Panin <pazke@donpac.ru>
+ * Copyright (c) 2006-2014 The Exim Maintainers
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published
index 8c1e799..ba4615c 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2012 */
+/* Copyright (c) University of Cambridge 1995 - 2014 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* The default settings for Exim configuration variables. A #define without
@@ -41,6 +41,8 @@ it's a default value. */
 #define DELIVER_IN_BUFFER_SIZE     8192
 #define DELIVER_OUT_BUFFER_SIZE    8192
 #define DISABLE_DKIM
+#define DISABLE_PRDR
+#define DISABLE_OCSP
 #define DISABLE_DNSSEC
 #define DISABLE_D_OPTION
 
@@ -165,10 +167,11 @@ it's a default value. */
 
 /* EXPERIMENTAL features */
 #define EXPERIMENTAL_BRIGHTMAIL
+#define EXPERIMENTAL_CERTNAMES
 #define EXPERIMENTAL_DCC
 #define EXPERIMENTAL_DMARC
-#define EXPERIMENTAL_OCSP
-#define EXPERIMENTAL_PRDR
+#define EXPERIMENTAL_DSN
+#define EXPERIMENTAL_PROXY
 #define EXPERIMENTAL_REDIS
 #define EXPERIMENTAL_SPF
 #define EXPERIMENTAL_SRS
index 3467f14..66ed224 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2012 */
+/* Copyright (c) University of Cambridge 1995 - 2014 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* Functions concerned with running Exim as a daemon */
@@ -639,7 +639,7 @@ if (pid == 0)
         the data structures if necessary. */
 
         #ifdef SUPPORT_TLS
-        tls_close(FALSE, FALSE);
+        tls_close(TRUE, FALSE);
         #endif
 
         /* Reset SIGHUP and SIGCHLD in the child in both cases. */
index 8e1d177..3f5800d 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2009 */
+/* Copyright (c) University of Cambridge 1995 - 2014 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* The main code for delivering a message. */
@@ -63,6 +63,10 @@ static address_item *addr_new = NULL;
 static address_item *addr_remote = NULL;
 static address_item *addr_route = NULL;
 static address_item *addr_succeed = NULL;
+#ifdef EXPERIMENTAL_DSN
+static address_item *addr_dsntmp = NULL;
+static address_item *addr_senddsn = NULL;
+#endif
 
 static FILE *message_log = NULL;
 static BOOL update_spool;
@@ -673,8 +677,36 @@ while (addr->parent != NULL)
 
 
 
+static uschar *
+d_hostlog(uschar * s, int * sizep, int * ptrp, address_item * addr)
+{
+  s = string_append(s, sizep, ptrp, 5, US" H=", addr->host_used->name,
+    US" [", addr->host_used->address, US"]");
+  if ((log_extra_selector & LX_outgoing_port) != 0)
+    s = string_append(s, sizep, ptrp, 2, US":", string_sprintf("%d",
+      addr->host_used->port));
+  return s;
+}
+
+#ifdef SUPPORT_TLS
+static uschar *
+d_tlslog(uschar * s, int * sizep, int * ptrp, address_item * addr)
+{
+  if ((log_extra_selector & LX_tls_cipher) != 0 && addr->cipher != NULL)
+    s = string_append(s, sizep, ptrp, 2, US" X=", addr->cipher);
+  if ((log_extra_selector & LX_tls_certificate_verified) != 0 &&
+       addr->cipher != NULL)
+    s = string_append(s, sizep, ptrp, 2, US" CV=",
+      testflag(addr, af_cert_verified)? "yes":"no");
+  if ((log_extra_selector & LX_tls_peerdn) != 0 && addr->peerdn != NULL)
+    s = string_append(s, sizep, ptrp, 3, US" DN=\"",
+      string_printing(addr->peerdn), US"\"");
+  return s;
+}
+#endif
+
 /* If msg is NULL this is a delivery log and logchar is used. Otherwise
-this is a nonstandard call; no two-characher delivery flag is written
+this is a nonstandard call; no two-character delivery flag is written
 but sender-host and sender are prefixed and "msg" is inserted in the log line.
 
 Arguments:
@@ -702,6 +734,7 @@ pointer to a single host item in their host list, for use by the transport. */
   tpda_delivery_local_part = NULL;
   tpda_delivery_domain = NULL;
   tpda_delivery_confirmation = NULL;
+  lookup_dnssec_authenticated = NULL;
 #endif
 
 s = reset_point = store_get(size);
@@ -765,13 +798,9 @@ if (addr->transport->info->local)
 
 else
   {
-  if (addr->host_used != NULL)
+  if (addr->host_used)
     {
-    s = string_append(s, &size, &ptr, 5, US" H=", addr->host_used->name,
-      US" [", addr->host_used->address, US"]");
-    if ((log_extra_selector & LX_outgoing_port) != 0)
-      s = string_append(s, &size, &ptr, 2, US":", string_sprintf("%d",
-        addr->host_used->port));
+    s = d_hostlog(s, &size, &ptr, addr);
     if (continue_sequence > 1)
       s = string_cat(s, &size, &ptr, US"*", 1);
 
@@ -782,19 +811,16 @@ else
     tpda_delivery_local_part =   addr->local_part;
     tpda_delivery_domain =       addr->domain;
     tpda_delivery_confirmation = addr->message;
+
+    /* DNS lookup status */
+    lookup_dnssec_authenticated = addr->host_used->dnssec==DS_YES ? US"yes"
+                             : addr->host_used->dnssec==DS_NO ? US"no"
+                             : NULL;
     #endif
     }
 
   #ifdef SUPPORT_TLS
-  if ((log_extra_selector & LX_tls_cipher) != 0 && addr->cipher != NULL)
-    s = string_append(s, &size, &ptr, 2, US" X=", addr->cipher);
-  if ((log_extra_selector & LX_tls_certificate_verified) != 0 &&
-       addr->cipher != NULL)
-    s = string_append(s, &size, &ptr, 2, US" CV=",
-      testflag(addr, af_cert_verified)? "yes":"no");
-  if ((log_extra_selector & LX_tls_peerdn) != 0 && addr->peerdn != NULL)
-    s = string_append(s, &size, &ptr, 3, US" DN=\"",
-      string_printing(addr->peerdn), US"\"");
+  s = d_tlslog(s, &size, &ptr, addr);
   #endif
 
   if (addr->authenticator)
@@ -808,27 +834,30 @@ else
       }
     }
 
-  #ifdef EXPERIMENTAL_PRDR
+  #ifndef DISABLE_PRDR
   if (addr->flags & af_prdr_used)
     s = string_append(s, &size, &ptr, 1, US" PRDR");
   #endif
+  }
 
-  if ((log_extra_selector & LX_smtp_confirmation) != 0 &&
-      addr->message != NULL)
-    {
-    int i;
-    uschar *p = big_buffer;
-    uschar *ss = addr->message;
-    *p++ = '\"';
-    for (i = 0; i < 100 && ss[i] != 0; i++)
-      {
-      if (ss[i] == '\"' || ss[i] == '\\') *p++ = '\\';
-      *p++ = ss[i];
-      }
-    *p++ = '\"';
-    *p = 0;
-    s = string_append(s, &size, &ptr, 2, US" C=", big_buffer);
-    }
+/* confirmation message (SMTP (host_used) and LMTP (driver_name)) */
+
+if (log_extra_selector & LX_smtp_confirmation &&
+    addr->message &&
+    (addr->host_used || Ustrcmp(addr->transport->driver_name, "lmtp") == 0))
+  {
+  int i;
+  uschar *p = big_buffer;
+  uschar *ss = addr->message;
+  *p++ = '\"';
+  for (i = 0; i < 256 && ss[i] != 0; i++)      /* limit logged amount */
+    {
+    if (ss[i] == '\"' || ss[i] == '\\') *p++ = '\\'; /* quote \ and " */
+    *p++ = ss[i];
+    }
+  *p++ = '\"';
+  *p = 0;
+  s = string_append(s, &size, &ptr, 2, US" C=", big_buffer);
   }
 
 /* Time on queue and actual time taken to deliver */
@@ -1038,7 +1067,7 @@ if (addr->return_file >= 0 && addr->return_filename != NULL)
   (void)close(addr->return_file);
   }
 
-/* The sucess case happens only after delivery by a transport. */
+/* The success case happens only after delivery by a transport. */
 
 if (result == OK)
   {
@@ -1054,10 +1083,8 @@ if (result == OK)
   DEBUG(D_deliver) debug_printf("%s delivered\n", addr->address);
 
   if (addr->parent == NULL)
-    {
     deliver_msglog("%s %s: %s%s succeeded\n", now, addr->address,
       driver_name, driver_kind);
-    }
   else
     {
     deliver_msglog("%s %s <%s>: %s%s succeeded\n", now, addr->address,
@@ -1065,7 +1092,35 @@ if (result == OK)
     child_done(addr, now);
     }
 
+  /* Certificates for logging (via TPDA) */
+  #ifdef SUPPORT_TLS
+  tls_out.ourcert = addr->ourcert;
+  addr->ourcert = NULL;
+  tls_out.peercert = addr->peercert;
+  addr->peercert = NULL;
+
+  tls_out.cipher = addr->cipher;
+  tls_out.peerdn = addr->peerdn;
+  tls_out.ocsp = addr->ocsp;
+  #endif
+
   delivery_log(LOG_MAIN, addr, logchar, NULL);
+
+  #ifdef SUPPORT_TLS
+  if (tls_out.ourcert)
+    {
+    tls_free_cert(tls_out.ourcert);
+    tls_out.ourcert = NULL;
+    }
+  if (tls_out.peercert)
+    {
+    tls_free_cert(tls_out.peercert);
+    tls_out.peercert = NULL;
+    }
+  tls_out.cipher = NULL;
+  tls_out.peerdn = NULL;
+  tls_out.ocsp = OCSP_NOT_REQ;
+  #endif
   }
 
 
@@ -1236,9 +1291,7 @@ else
 
   if (used_return_path != NULL &&
       (log_extra_selector & LX_return_path_on_delivery) != 0)
-    {
     s = string_append(s, &size, &ptr, 3, US" P=<", used_return_path, US">");
-    }